三菱FX5U modbus tcp协议 plc做服务器和客户端案例程序,提供调试工具,程序注解,通讯协议功能的配置。

先甩个客户端程序片段:

//读取服务器数据
MOV K1 D100      //从站站号
MOV H0000 D101   //起始地址
MOV K10 D102     //读取数量
ADPRW K1 K0 D100 K4 D200

ADPRW指令这里用了4号模式(Modbus TCP),D200是接收缓存区。重点看K0这个参数——它对应缓冲存储器地址SD21800,用来存通讯状态码。调试时直接监控SD21800的值,0x0000才是正常,出现0x1234之类的赶紧查手册找错误代码。

服务器端配置更简单,直接在GX Works2里开搞:

  1. 参数->模块参数->以太网端口
  2. 协议选TCP,勾选Modbus服务器
  3. 设置IP比如192.168.1.88
  4. 固定端口号502(默认值别改)

重点来了!数据映射要对应Modbus功能码:

  • 线圈状态对应M0~M1999
  • 保持寄存器对应D0~D1999

实测发现地址偏移坑:当用04功能码读D100时,实际发过来的地址是十进制100,但有些上位机可能按十六进制处理,这时候要换算成0x64。

三菱FX5U modbus tcp协议 plc做服务器和客户端案例程序,提供调试工具,程序注解,通讯协议功能的配置。

调试工具推荐用Modbus Poll,连接时注意:

  • 连接类型选TCP
  • Slave ID填PLC的站号(默认是255)
  • 地址格式选PLC地址(不是Modbus地址)

遇到过最蛋疼的问题——字节顺序。PLC默认是高字节在前,但有些上位机用低字节在前。这时候在ADPRW指令后加个字节交换指令:

BSWAP D200 D300

或者直接改PLC的通信参数,在SD21801设置0x0002启用字节交换。

客户端发送超时处理必须加!在ADPRW后面跟个定时器,超时3秒没响应就重试。实测网络不稳定时这招能救命:

ADPRW K1 K0 D100 K4 D200
OUT T0 K3000
LDP T0
INC D500    //记录超时次数

最后说个骚操作——让PLC同时做客户端和服务器。需要开两个TCP连接,在以太网端口设置里勾选"允许同时通信",实测最多支持16个连接。但注意别把客户端和服务器的端口号设成一样的,建议客户端用5020之类的非标准端口。

完整案例程序和参数截图已经打包,需要的兄弟直接评论区喊666。下期预告:用Python写个Modbus TCP暴力测试工具,专治各种PLC通信玄学问题。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐