smart PLC 做Modbus-TCP通讯遇到的问题与解决方法2021.8.9
一、问题现象:PLC做客户端进行Modbus TCP通讯时,无法获取数据--通讯异常。
二、通讯测试环境:
1. smart PLC --SR60(做客户端) 和 V2.5版本编程软件(Modbus TCP client 库 版本V1.4)
Modbus TCP测试工具软件 (做服务器)
三、通讯状态监视情况:
1. PLC编程软件的状态图中--监控--通讯错误代码--出现过173、174 。
173连接伙伴拒绝或主动断开连接(伙伴将断开与此 CPU 的连接)。
174 无法与连接伙伴建立连接(连接请求无应答)。
2. 在Modbus TCP服务器端始终无法收到任何数据。
四、问题排查处理过程:
根据以上情况,判断PLC与服务端没有正常建立连接。
1. 本人所使用V2.5 版本的编程软件中没有V1.0 版本的Modbus TCP client 库 文件,
不能使用原来含有V1.0的库文件的通讯程序。(这个相当重要)
更改程序,使用V2.5 版本的编程软件中V1.4 版本的Modbus TCP client 库。
2. 更新 PLC的固件版本 为 V2.5版本-最新版本(此步骤,可能不是必须的) 。
经过这个两个步骤后,状态图中--监控--通讯错误代码已经不再出现173、174 ,
但是,仍然没有数据。
使用两个通讯工具(客户端和服务器端)模拟的时候,通讯正常,
客户端 和 服务器 的站地址 默认都 1。
使用通讯测试工具记录--数据日志,进行对比,发现smart PLC通讯时,发送的数据里--站地址为FF ( 255),而 TCP server slave软件的站地址 默认 设置的为 1。
更改 服务器端(通讯模拟软件)的 站地址为 255,
PLC 可以 接收到数据了。(果然是站地址的问题)
站地址的问题
五、后续优化思考
思考1:编程软件 V2.5 无法正常使用--原来老的1.0版本的Modbus TCP client 库,
那就用新的V1.4 版本的Modbus TCP client 库就行,
要么,
估计就得把老的1.0版本的Modbus TCP client库 添加到库文件中。
思考2:PLC程序更改--站地址
监视状态--已经看到了,就是这个 mModbusUnitID -- 站地址
但是这个值被固定了,每个周期 被重新赋值为 255 。
已实测 ,
增加 传送指令给 这个 寄存器,
即可 更改这个 默认的站地址 。
具体步骤:
1. 在数据块 加入 赋值 为1 ;
2. 在 程序中加入传送指令,每个周期都送 1给这个 mModbusUnitID --对应的寄存器,
即可更改 这个 通讯的 站地址 。
关于通讯库的优化:
西门子这个 Modbus TCP库 ,还有待优化,
比如 字节交换的问题
假如:通讯读取原数据为16进制数的 16# 41F8CCCD(对应 31.1),
而在 PLC中是 16# CCCD41F8,
这就必须进行“字交换”,处理后--才是 正确的数据 。
假设,Modbus TCP库的子程序中 ,增加 设置项 ,
通过 一个寄存器设置 0-3 ,
对应 4种 字节排列组合 ,
这样, 使用 起来就更简单了。
直接配置 一个 寄存器值,
接收数据的寄存器 即可得到正确值,
这样,最方便。
希望,西门子的工程师不断的优化编程软件和库文件,谢谢。