C#与三菱FX5U以态网通讯程序,可读X/Y/M/S/D,可写Y/M/S/D,带源码,有部分备注,PLC通讯参数直接设置

三菱FX5U的以太网通讯算是工业自动化里挺常见的需求,最近刚用C#撸了个驱动库,直接上干货。这玩意儿底层走的是MC协议的三帧格式,别慌,代码里已经封装好了,咱们重点看怎么用。

先甩个连接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设置为True:

bool[] yValues = new bool[8];
Array.Fill(yValues, true);
plc.WriteDevice("Y", 10, yValues);

底层协议处理部分得注意位组合,代码里用了位掩码处理:

// 位写入的协议构造
byte[] CreateWriteCommand(string deviceType, int startAddress, bool[] values)
{
    //...省略协议头
    for(int i=0; i<values.Length; i+=8)
    {
        byte data = 0;
        for(int j=0; j<8; j++){
            if(values[i+j]) data |= (byte)(1 << j);
        }
        payload.Add(data);
    }
    //...校验码生成
}

源码里特别处理了不同寄存器的地址映射,比如M寄存器实际对应的是0x90类型码,S寄存器是0x98。这点在协议文档里容易看走眼,测试时记得用监视器抓包验证。

最后提醒下PLC参数设置:

  1. 固定IP设置(和电脑同网段)
  2. 通讯协议选TCP
  3. 打开MC协议允许访问
  4. 别忘设站号(默认0xFF)

项目里实测过200ms轮询周期稳定运行,源码里带了XML注释,用VS直接能生成API文档。需要源码的老铁评论区喊话,这玩意儿比OPC UA轻量多了,就是得注意网络稳定性——丢包重连机制建议自己加个心跳包检测。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐