如何把工业通信协议转换成http websocket
1.现状
工业通信协议多数工作在边缘设备上,比如:PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发,当设备上用的是modbus从站时,采集设备数据需要开发modbus主站;当设备上用的是西门子PN协议时,采集设备数据需要开发PN客户端;当设备上用的时欧姆龙FINS协议时,采集设备数据需要开发FINS协议。前面只是举例了几种工业通信协议,还有很多其它工业协议,比如:Ethernet IP、Ethercat、cc-link等。业务系统开发厂商不但要做业务程序开发,还有对接这些工业协议,且还要保证开发的工业协议程序稳定性。对于大多数业务软件开发商是不具备这样的能力的,这增加了项目完成的不确定性因素。
2.当前方案
针对前面描述的现状,当前已有的解决方案是部署一套物联网平台,或者使用协议转换网关。这两种方式虽然都能解决实际需求,但是如果使用IOT平台会让整个系统感觉到杀鸡用牛刀,如果使用协议转换网关会增加项目成本。基于此很多项目都显得不是很完美。
3.创新方案
创新方案是在已有硬件资源的基础上部署一套程序,程序的原理如下图:
软件提供modbus、欧姆龙FINS、西门子PN设备的协议接入,对外提供http服务器,用户通过http客户端查询设备数据、控制设备;对外提供http客户端,把数据主动推送到用户配置的http服务器;对外提供websocket用户可以订阅设备数据;通过这样的方案,用户可以在web前端页面直接获取设备数据,大大缩短项目交付周期,节约项目成本。
软件下载地址:https://download.csdn.net/download/mawanbing/90964240
技术支持微信号:mwbnull
软件配置说明:
a.config/config.json配置文件说明
{ "UploadHttpNet": "127.0.0.1:6000", "UploadHttpInterface": "/data", "EnableUpload": 1, "ListenHttpAddr": "127.0.0.1:20080", "WsAddr": "127.0.0.1:15554", "LogParam":{ "LogModeDesc": "0-console,1-file", "LogMode": 0, "LogLevel": 7, "LogLevelDesc": "7-Debug,Warning,Error;4-Warning,Error;3-Error", "Addr": "log" } } UploadHttpNet:通过http post上传数据的服务器地址; UploadHttpInterface:通过http post上传的接口地址; EnableUpload:0-不启用http post上传数据,1-启用; ListenHttpAddr:开启http服务器监听的地址,其它平台可以通过此接口取数据; WsAddr:通过ws发布订阅的地址; LogParam:日志配置; |
b.config/device.json采集设备配置
{ "DeviceList": [ { "ProtocolType": 0, "DeviceId": "001", "DeviceConnectInfo": { "MbOffset": 0, "MbSlaveIP": "127.0.0.1", "MbSlavePort": 502, "MbSlaveId": 1, "ReconnectInterval": 20, "WriteRegMethod": 0, "MbScanInterval": 5000 }, "DeviceTags": [ { "Tag": "电池电压", "Addr": "40015|word#(?/10)" }, { "Tag": "电池电流", "Addr": "40015|word#(?/10)" }, { "Tag": "功率", "Addr": "40015|word#(?/10)" } ] }, { "ProtocolType": 1, "DeviceId": "002", "DeviceConnectInfo": { "Ip": "192.168.1.60", "Port": 9600, "SourceNodeNum": 105, "DstNodeNum": 60, "ScanInterval": 5000 }, "DeviceTags": [ { "Tag": "1号环境检测_温度", "Addr": "float.D2070" }, { "Tag": "1号环境检测_湿度", "Addr": "float.D2072" }, { "Tag": "1号空调_内风机传感器故障", "Addr": "bool.D2000.00" } ] }, { "ProtocolType": 2, "DeviceId": "003", "DeviceConnectInfo": { "Ip": "192.168.1.106", "Port": 102, "LocalTSAP": 1, "RemoteTSAP": 1, "Rack": 1, "Slot": 1, "ScanInterval": 5000 }, "DeviceTags": [ { "Tag": "布尔", "Addr": "bool.M3.2" }, { "Tag": "字节", "Addr": "byte.MB1" }, { "Tag": "浮点数", "Addr": "float.M3" }, { "Tag": "字符", "Addr": "char.FC10" }, { "Tag": "DB块", "Addr": "byte.OB32" }, { "Tag": "DB DBX", "Addr": "bool.DB4.DBX71.00" } ] } ] }
MbScanInterval:数据采集间隔; MbOffset:modbus地址偏移量; MbSlaveIP:modbus从站(服务器)IP; MbSlavePort:modbus从站(服务器)端口; MbSlaveId:modbus从站ID; ReconnectInterval:网络重连间隔,单位秒; WriteRegMethod:0-写寄存器时采用多寄存器,1-写寄存器时采用单寄存器; Tag:modbus地址取的别名; Addr:modbus地址,40015|word#(?/10)标识地址15寄存器,word数据类型,采集到的结果再除以10;40015.0|bool标识15寄存器地址的第一位数据类型为bool;
Ip:设备IP, Port: 设备端口, SourceNodeNum: 原节点号, DstNodeNum: 目标节点号, ScanInterval: 扫描间隔; Addr配置格式如下: 数据类型.内存区域.地址编号 或者 数据类型.H1 或者 数据类型.W50.02 或者 数据类型.D110 或者 数据类型.E2003 如: bool.CIO.486.06 1.内存区域 CIO:继电器区 DM:数据存储区 TIM:定时器 CNT:计数器 WR:内部辅助继电器区 HR:保持继电器区 AR:特殊辅助继电器区 TR:暂存区 IR:变址寄存器 DR:数据寄存器 H:保持继电器区 W:内部辅助继电器区 D:数据存储区 E:存储扩展数据 数据类型:bool byte word float string
Ip:设备IP; Port:设备端口 LocalTSAP:本地TSAP RemoteTSAP:远程TSAP Rack:CPU机架 Slot:CPU槽 ScanInterval:扫描周期 |
testscript/index.html是测试页面直接打开用
支持:windows_x64、linux_x64、linux_arm32、linux_arm64
试用版本只能采集一种协议的2个点位地址