记录一下常见的工业协议数据读取方法
目录
- 前言
- Modbus协议说明
- Netty 读取测试
- 使用plc4x 读取测试
- 结束语
前言
Modbus 是一种通讯协议,用于在工业控制系统中进行数据通信和控制。Modbus 协议主要分为两种常用的变体:Modbus RTU 和 Modbus TCP/IP
- Modbus RTU:Modbus RTU 是一种基于串行通信的协议。
- Modbus TCP/IP:Modbus TCP/IP 是一种基于 TCP/IP 网络的协议。
本次使用TCP协议,一般常见使用这种协议。
Modbus 协议一般工业设备例如光电信号,各类传感器和执行器等。
一些电力设备(如变压器、开关设备、仪表等)
Modbus协议说明
如果要使用netty读取modbus协议数据必须了解一下协议报文格式。
参考: https://neugates.io/docs/zh/latest/appendix/protocol/modbus_tcp.html
如果设备数量< 30个可以尝试使用 Neuro 产品读取,里面包含配置监控SDK等。
Modbus=MBAP(报文头)+PDU(帧结构)
Netty 读取测试
假设有一个光电IO模块对接了8个激光设备,激光扫描到障碍物为1 没有扫到位0,先通过厂家自带的web端管理界面查看目前的实际信号情况:
这边测试的Netty代码如下:
光电IO设备模块IP地址为 192.168.50.41 端口使用 28899,上面代码是使用netty 向IO模块发送读取 8个光电的离散量信号报文,地址从32开始,然后获得modbus协议的结果报文,最终获得的结果报文解析成十六进制的字符串形式如下:
还是建议参考上面推荐的文档,这里截取主要信息:
根据上面的样例说明,我们其实想要得到的结果是最后2位16进制数据 DD
,占据1个字节,因为我们读取的是离散值(类似true或fase 一般是1或者0),因此我们将 CD转换为二进制数据:
1 1 0 1 1 1 0 1
从低位开始(从右 至 左
) 对应厂家web管理界面中的 DI-1 DI-2 …
绿色=1 灰色=0
可以发现netty读取到的信号和厂家web管理界面显示的数据一致。
使用plc4x 读取测试
apache旗下工业协议适配工具库,具体文档查看官网:
链接: https://plc4x.apache.org/users/protocols/modbus.html
pom.xml文件引入maven依赖包:
代码如下:
执行打印结果如下:
从第1行至第8行记录值 对应厂家web管理界面中的 DI-1 DI-2 …
绿色=true 灰色=fase
可以发现plc4x读取到的信号和厂家web管理界面显示的数据一致。
结束语
读取Modbus的开源库有很多,这里列举常见的使用库,尤其是 Plc4x 这个适配了主流的工业协议,值得我们去研究。
使用netty的话对基本功要求比较高,如果对modbus工业协议包括TCP/IP协议一知半解估计应该是写不出成功案例。