三菱FX5U玩Modbus TCP是真香,尤其是自带的以太网口直接支持协议栈。今天咱们直接上硬货,搞个PLC同时当服务器和客户端的骚操作,实测可用
三菱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里开搞:
- 参数->模块参数->以太网端口
- 协议选TCP,勾选Modbus服务器
- 设置IP比如192.168.1.88
- 固定端口号502(默认值别改)
重点来了!数据映射要对应Modbus功能码:
- 线圈状态对应M0~M1999
- 保持寄存器对应D0~D1999
实测发现地址偏移坑:当用04功能码读D100时,实际发过来的地址是十进制100,但有些上位机可能按十六进制处理,这时候要换算成0x64。
调试工具推荐用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通信玄学问题。











