如何把工业通信协议转换成http websocket

发布于:2025-06-10 ⋅ 阅读:(27) ⋅ 点赞:(0)

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"

                }

            ]

        }

    ]

}

  1. ProtocolType:协议类型,0-modbus tcp,1-欧姆龙Fins,2-西门子s7;
  1. Modbus tcp配置参数:

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;

  1. 欧姆龙Fins配置参数:

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

  1. 西门子s7配置参数:

Ip:设备IP;

Port:设备端口

LocalTSAP:本地TSAP

RemoteTSAP:远程TSAP

Rack:CPU机架

Slot:CPU槽

ScanInterval:扫描周期

testscript/index.html是测试页面直接打开用

支持:windows_x64、linux_x64、linux_arm32、linux_arm64

试用版本只能采集一种协议的2个点位地址