1. 10台电磁流量计,用于测量各生产环节的水流量,型号为LDCK-25,支持Modbus RTU协议,RS485接口,波特率9600bps,数据位8位,无校验位,停止位1位。
Modbus RTU寄存器信息如下:
流量计地址 寄存器地址 数据类型 读写属性 备注
1 0x0000 float 只读 瞬时流量
1 0x0002 float 只读 正累积流量
1 0x0004 float 只读 负累积流量
...
10 0x0000 float 只读 瞬时流量
10 0x0002 float 只读 正累积流量
10 0x0004 float 只读 负累积流量
2. 5台电能质量仪表,用于测量各车间的电能质量数据,型号为CSPEM-96,支持Modbus RTU协议,RS485接口,波特率19200bps,数据位8位,偶校验,停止位1位。
仪表地址 寄存器地址 数据类型 读写属性 备注
1 0x0000 float 只读 A相电压
1 0x0002 float 只读 B相电压
1 0x0004 float 只读 C相电压
1 0x0006 float 只读 A相电流
...
5 0x0000 float 只读 A相电压
5 0x0002 float 只读 B相电压
5 0x0004 float 只读 C相电压
5 0x0006 float 只读 A相电流
3. 1台天然气流量计,用于测量总进气量,型号为FLOWSIC600-XT,支持Modbus TCP协议,以太网接口,Modbus TCP端口502。
Modbus TCP寄存器信息如下:
寄存器地址 数据类型 读写属性 备注
0x0000 float 只读 瞬时流量
0x0002 float 只读 累积流量
0x0004 int 只读 工作状态字
数据中心使用的是MQTT协议,接入OneNET平台。要求每5分钟上传一次数据。
1. 将10台LDCK-25电磁流量计和5台CSPEM-96电能质量仪表的RS485接口,通过RS485总线全部连接到SG500的RS485接口。注意要接120欧姆终端电阻。将FLOWSIC600-XT天然气流量计的以太网口接到SG500的LAN口。
2. 在SG500上安装Modbus RTU主站程序mbrtu,用于轮询流量计和电表的数据。配置轮询周期为5分钟,从站等待响应超时时间1秒,重发3次。配置Modbus TCP主站程序mbtcp,用于轮询天然气流量计数据。
3. 编写数据解析程序parse_data,对轮询回来的Modbus数据进行解析,提取出各个测点的实际数值和单位。比如流量计的数据解析如下:
```python
def parse_flow_data(data):
flow = struct.unpack('>f', data[0:4])[0]
pos_total = struct.unpack('>f', data[4:8])[0]
neg_total = struct.unpack('>f', data[8:12])[0]
return {
'flow': round(flow, 2),
'flow_unit': 'm3/h',
'pos_total': round(pos_total, 2),
'neg_total': round(neg_total, 2),
'total_unit': 'm3'
}
```
4. 编写数据封装程序pack_data,将解析后的数据封装成统一的JSON格式。设备编号、时间戳、测点等信息都要包含在内。例如:
```json
{
"gateway_id": "SG500_1",
"timestamp": 1634227200,
"devices": [
{
"device_id": "LDCK-25-1",
"data": [
{"flow": 23.61, "flow_unit": "m3/h"},
{"pos_total": 1638.22, "total_unit": "m3"},
{"neg_total": 0.11, "total_unit": "m3"}
]
},
{
"device_id": "CSPEM-96-1",
"data": [
{"ua": 380.5, "ua_unit": "V"},
{"ub": 378.1, "ub_unit": "V"},
{"uc": 379.6, "uc_unit": "V"},
{"ia": 62.5, "ia_unit": "A"}
]
},
{
"device_id": "FLOWSIC600",
"data": [
{"flow": 899.32, "flow_unit": "m3/h"},
{"total": 123838.63, "total_unit": "m3"},
{"status": 1}
]
}
]
}
```
5. 在SG500上安装MQTT客户端程序mosquitto,使用4G网络连接到OneNET的MQTT服务器。按照OneNET的设备接入要求,配置MQTT参数:
- 服务器地址: iot-mqtts.heclouds.com
- 端口: 8883
- 证书文件: iot-mqtts-certificate.pem
- 用户名: 设备ID
- 密码: 鉴权信息
6. 编写MQTT发布程序pub_data,将封装好的JSON数据,以5分钟为周期,通过MQTT发布到OneNET平台的设备数据流主题。
7. 使用SG500的RS485 DTU功能,将Modbus RTU数据透明传输到数据中心,作为数据校验。配置RS485的TCP服务器模式,本地端口号为502。这样数据中心也可以直接通过Modbus TCP读取设备的原始数据。
8. 考虑到工业环境的复杂性,在SG500本地使用SQLite数据库,对采集到的数据进行本地存储,并记录上传状态。每次存储数据前,先检查磁盘使用率,超过90%时,删除最早的数据。MQTT发布失败时,存储发布失败的数据,等待网络恢复后补发。
9. 配置SG500的看门狗功能,监控Modbus采集程序mbrtu、mbtcp和MQTT发布程序pub_data。如果进程异常退出,看门狗会自动重启进程。同时通过MQTT发布一条异常告警信息到数据中心。
10. 对SG500的系统日志进行配置,将系统日志发送到数据中心的日志服务器。日志等级为INFO,采用rsyslog格式,通过TCP协议发送。
11. 将以上开发的程序打包成SG500的固件,通过网管平台进行批量升级。升级时先将新固件上传到SG500的TF卡中,再通过网管平台下发升级指令,SG500本地完成固件更新和程序替换,实现零宕机升级。
以上就是一个4G工业网关协议转换的详细案例,涉及了Modbus RTU/TCP协议解析、MQTT数据上云、SQLite本地存储、看门狗监控、日志管理、固件升级等方方面面的内容。充分利用了SG500网关强大的边缘计算和通信能力,可以高效地实现工业设备数据采集和上云。
1. 支持多种工业协议接入,可以采集各种设备的数据。
2. 具备边缘计算能力,可以在网关端进行数据解析、转换和存储,减轻网络传输压力。
3. 支持标准MQTT协议,可以无缝对接各种物联网平台。
4. 提供透明传输通道,便于数据校验和设备调试。
5. 内置SQLite数据库,具备断网数据缓存能力,保证数据的完整性。
6. 支持看门狗监控,保证程序的高可靠运行。
7. 支持远程日志,便于问题定位和系统维护。
8. 支持固件升级,可以实现远程批量升级,提高运维效率。