C#与三菱FX5U以太网通讯程序:可读X/Y/M/S/D数据,可写Y/M/S/D及M寄存器,带...

张开发
2026/4/8 11:10:08 15 分钟阅读

分享文章

C#与三菱FX5U以太网通讯程序:可读X/Y/M/S/D数据,可写Y/M/S/D及M寄存器,带...
C#与三菱FX5U以态网通讯程序可读X/Y/M/S/D,可写Y/M/S/D带源码有部分备注PLC通讯参数直接设置三菱FX5U的以太网通讯算是工业自动化里挺常见的需求最近刚用C#撸了个驱动库直接上干货。这玩意儿底层走的是MC协议的三帧格式别慌代码里已经封装好了咱们重点看怎么用。C#与三菱FX5U以态网通讯程序可读X/Y/M/S/D,可写Y/M/S/D带源码有部分备注PLC通讯参数直接设置先甩个连接PLC的代码块var plc new FX5U_ETHERNET(); bool isConnected plc.Connect(192.168.3.18, 6000); if (!isConnected) { Console.WriteLine(网线插了没IP对不对); return; }这里端口号6000是MC协议默认端口实际用的时候记得在GX Works3里把PLC的通讯参数打开。重点来了——寄存器读取看这段位元件读取// 读取X0~X17的状态 byte[] xStatus plc.ReadDevice(X, 0, 16); BitArray bits new BitArray(xStatus); Console.WriteLine($X12状态: {bits[12]}); // 读取D100开始的10个寄存器 short[] dValues plc.ReadDevice(D, 100, 10); Console.WriteLine($D100的值: {dValues[0]});这里有个坑要注意ReadDevice返回的字节数组需要按三菱的字节序处理。比如读D寄存器时两个字节要组合成short类型代码里用了Buffer.BlockCopy直接转// 处理D寄存器读取的代码片段 short[] result new short[length / 2]; Buffer.BlockCopy(responseData, 0, result, 0, length);写入操作更刺激特别是批量写Y点的时候。比如要把Y10-Y17设置为Truebool[] yValues new bool[8]; Array.Fill(yValues, true); plc.WriteDevice(Y, 10, yValues);底层协议处理部分得注意位组合代码里用了位掩码处理// 位写入的协议构造 byte[] CreateWriteCommand(string deviceType, int startAddress, bool[] values) { //...省略协议头 for(int i0; ivalues.Length; i8) { byte data 0; for(int j0; j8; j){ if(values[ij]) data | (byte)(1 j); } payload.Add(data); } //...校验码生成 }源码里特别处理了不同寄存器的地址映射比如M寄存器实际对应的是0x90类型码S寄存器是0x98。这点在协议文档里容易看走眼测试时记得用监视器抓包验证。最后提醒下PLC参数设置固定IP设置和电脑同网段通讯协议选TCP打开MC协议允许访问别忘设站号默认0xFF项目里实测过200ms轮询周期稳定运行源码里带了XML注释用VS直接能生成API文档。需要源码的老铁评论区喊话这玩意儿比OPC UA轻量多了就是得注意网络稳定性——丢包重连机制建议自己加个心跳包检测。

更多文章