大家好!我是付工。
无论是学习上位机还是学习PLC,似乎都离不开一个话题——通信。
PLC通信更侧重于应用,只需要调用对应的功能块,填入正确的参数即可,无需关于底层实现原理。
上位机通信更侧重底层原理,不仅要了解各种通信报文,还要掌握如何封装通信库。
今天给大家分享一个现场通信故障排除的案例。
一、项目背景
前段时间承接了一个地磅的上位机项目,需要采集进出场两个地磅的数据,设计思路是使用两个串口服务器,将RS485转换成以太网,PLC通过ModbusTCP通信采集地磅。
那天跟PLC工程师一起到现场,发现他带了一根485的通信线缆,他说昨天测试发现PLC无法通过ModbusTCP采集到地磅数据,实在不行就改成ModbusRTU通信。
虽然这个与上位机无关,但是作为技术人员,我知道ModbusRTU肯定不是最优方案,因为会涉及到轮询或者掉站的问题。
所以我跟他说:我来帮你看看,实在解决不了再换ModbusRTU方案。
二、通信测试
1、首先对串口服务器进行配置。
串口服务器一般会有两种模式:
一种是透传模式,透传模式仍然是ModbusRTU报文,只不过使用TCP通信,这个就是ModbusRTUOverTCP通信。
另一种是Modbus协议转换,内部可以将ModbusRTU报文直接转换成ModbusTCP报文,这个就是ModbusTCP通信。
2、配置完成后,通过软件进行测试。
这里使用ModbusPoll软件,选择ModbusTCP,IP地址为,192.168.2.7,端口号为26,测试结果如下:
3、这里已经测试通过,说明串口服务器没有问题。
三、PLC测试
检查了一下PLC工程师写的PLC程序,似乎没有什么问题,但是就是读取不到数据。
PLC工程师说问题就在这里,没法解决。
我分析了一下,既然ModbusPoll测试没问题,而PLC通信不上,那么可能是PLC程序发出的报文与ModbusPoll软件发出的报文不一致,因此需要监听一下PLC发出的报文内容。
四、监听报文
1、首先我用本机开了一个Modbus Slave,IP地址填写本机的IP,端口也设置为26。
2、然后让PLC工程师把PLC程序里的IP改成192.168.2.78,这样我就可以通过Slave观察到PLC发出的报文了。
3、改完之后PLC工程师说可以读到数据了,同时我这边也看到了PLC发出的报文。
PLC发出的报文中单元标识符是255(0xFF),而地磅的站地址是0x01,因此地磅不会返回报文。
PLC之所以用255作为默认值,因为某些实现中,地址255被当做广播地址用,但并不是所有的硬件都支持广播地址。
为什么Slave软件会返回呢?因为我上面设置了Ignore Unit ID。
找到原因之后,我让PLC工程师把地磅的从站地址设置为255,通信测试正常。
五、问题分析
在S7-200Smart的帮助中,我们找到了关于MBUS_Client的相关说明:
对于ModbusTCP来说,我们可以通过IP地址去区分不同设备,因此Unit ID很多时候显得并不重要,但是对于有些情况,比如S7-200 SMART作为 Modbus TCP客户端, 服务器为网关模块,连接多个 Modbus RTU 设备时,这时候就需要区分 Modbus RTU 从站地址了。
因此上面的解决方案并不完美,如果串口服务器挂接多个RTU设备时,就不适用了。
MBUS_Client库中的mModbusUnitID默认值为255(16#FF),如果从站设备有多个,可以S7-200 SMART 和网关模块建立一个连接,在这个连接上通过修改UnitID的值进行UnitID的轮询。
我们打开Modbus_TCP Client的符号表,可以看到UnitID对应的地址是VB3739。
后面,我让PLC工程师把地磅站地址恢复为1,然后通过修改PLC程序,解决这个问题。