在C#中通过三菱的MX Component(如MX Component 4.0)写入小数(浮点数)到PLC,需注意以下关键步骤:
1. 准备工作
安装MX Component:确保已安装MX Component(如
ActUtlType
或ActFxDriver
控件)。添加引用:在C#项目中引用
ActUtlType.dll
(通常位于C:\Program Files (x86)\MELSFX\MX Component
)。PLC配置:确认PLC支持浮点数存储(如
D
寄存器存储32位浮点数)。
2. 关键步骤
(1) 初始化MX Component
csharp
using ActUtlTypeLib; // 引用MX Component库
ActUtlType plc = new ActUtlType(); plc.ActLogicalStationNumber = 1; // 设置逻辑站号(与PLC配置一致) int result = plc.Open(); // 连接PLC if (result != 0) { Console.WriteLine("连接失败,错误代码: " + result); return; }
(2) 写入浮点数
三菱PLC的浮点数(如REAL
类型)通常占用2个连续的16位寄存器(共32位),需按大端序(Big-Endian)或小端序(Little-Endian)格式写入。MX Component默认按字节数组处理数据。
方法1:直接写入字节数组
csharp
float value = 123.456f; // 待写入的浮点数 byte[] bytes = BitConverter.GetBytes(value); // 转换为字节数组
// 三菱PLC通常使用大端序,需调整字节顺序(如果系统是小端序) if (BitConverter.IsLittleEndian) { Array.Reverse(bytes); // 反转字节顺序 }
// 将字节数组写入PLC的连续寄存器(例如D100和D101) int startRegister = 100; // 起始寄存器地址 int[] registerValues = new int[2]; // 2个寄存器
// 将字节数组拆分为两个16位整数(每个寄存器16位) registerValues[0] = (bytes[0] << 8) | bytes[1]; // 高字节在前(大端序) registerValues[1] = (bytes[2] << 8) | bytes[3];
// 写入寄存器 result = plc.WriteDeviceBlock("D" + startRegister, 2, ref registerValues[0]); if (result != 0) { Console.WriteLine("写入失败,错误代码: " + result); }
方法2:使用SetDevice
逐个写入
csharp
// 将浮点数拆分为两个16位整数(大端序) int highWord = (int)((bytes[0] << 8) | bytes[1]); int lowWord = (int)((bytes[2] << 8) | bytes[3]);
// 分别写入D100和D101 plc.SetDevice("D100", highWord); plc.SetDevice("D101", lowWord);
3. 注意事项
字节序(Endianness)
三菱PLC默认使用大端序(高位在前),而x86/x64系统为小端序,需通过
Array.Reverse
或手动调整字节顺序。测试时建议先用PLC监控工具(如GX Works2)验证写入的值是否正确。
寄存器地址
确保目标寄存器是连续的(如
D100
和D101
),且未被其他程序占用。错误处理
检查
Open()
、WriteDeviceBlock
的返回值,非零表示错误(参考MX Component手册的错误代码)。浮点数精度
PLC中的浮点数可能存在精度损失(如
123.456
可能存储为123.456001
),需在HMI或程序中处理显示格式。
4. 完整示例代码
csharp
using System; using ActUtlTypeLib;
class Program { static void Main() { ActUtlType plc = new ActUtlType(); plc.ActLogicalStationNumber = 1;
try { // 连接PLC if (plc.Open() != 0) throw new Exception("PLC连接失败");
// 写入浮点数 float value = 123.456f; byte[] bytes = BitConverter.GetBytes(value);
if (BitConverter.IsLittleEndian) Array.Reverse(bytes); // 转换为大端序
int[] registers = new int[2]; registers[0] = (bytes[0] << 8) | bytes[1]; registers[1] = (bytes[2] << 8) | bytes[3];
// 写入D100和D101 if (plc.WriteDeviceBlock("D100", 2, ref registers[0]) != 0) throw new Exception("写入寄存器失败");
Console.WriteLine("浮点数写入成功!"); } catch (Exception ex) { Console.WriteLine("错误: " + ex.Message); } finally { plc.Close(); // 断开连接 } } }
5. 替代方案
如果MX Component操作复杂,可考虑:
使用OPC UA:通过OPC服务器(如MX OPC UA)与PLC通信。
三菱EZSocket:通过以太网协议(如MC协议)直接通信(需自行实现协议)。
通过以上方法,可以准确地将C#中的浮点数写入三菱PLC的寄存器。务必在测试阶段验证字节序和寄存器地址的正确性!