物联网之设备数据采集(一)

码农初次实践模拟采集设备数据,本次模拟采集蒸汽锅炉设备运行数据。

前置准备

硬件准备

设备 说明
USR-TCP232-306 Serial Device Server,实现串口转网络
UT-890A USB转RS-485/422转换器(+ 对 A,- 对 B)
网线 连接设备到局域网

软件准备

软件 版本 用途
Modbus Poll V4.3.4 Modbus 主站模拟器
Modbus Slave V4.3.1 Modbus 从站模拟器
USR-M0 V2.2.6.3 306设备配置工具
TCPCOM V3.0.6 TCP/串口调试助手

服务准备

  • MQTT服务器(如 EMQX)

文档准备

蒸汽锅炉通讯协议

基础参数

1
2
3
4
5
6
通讯参数设定:
- 波特率:9600
- 校验位:无
- 数据位:8
- 停止位:1
- 站号:在触摸屏上设定(设定后需断电重启)

采集点定义

模拟量数据

参数 地址 类型 换算规则
烟道温度 40502 整型 实际值 = 采集值 × 0.1
锅炉压力 40006 实数 实际值 = 采集值 × 0.01

状态量数据

参数 地址 类型 说明
小火 00007=1, 00008=0 开关量 燃烧状态
大火 00007=1, 00008=1 开关量 燃烧状态
无火 00007=0, 00008=0 开关量 燃烧状态
给水泵运行 00006=1 开关量 1=运行, 0=停止

水位状态 (40061)

状态
0 水位极低
1 水位低
2 水位正常
3 水位高
4 水位极高

压力状态 (40066)

状态
1 压力低
2 压力正常
3 压力高
4 压力极高

故障状态 (40571)

16位整型,按位解析:

故障类型
bit0 1 定时时间到关机(正常模式)
bit8 256 燃烧机故障
bit9 512 烟温传感器故障
bit10 1024 烟道超温故障
bit11 2048 炉水水位极低
bit12 4096 蒸汽压力极高故障
bit14 16384 炉水水位极高故障

配置 USR-TCP232-306

按照设备标签上的IP和账户信息进入管理页面。

网络参数

配置局域网固定IP,方便后期调试。

点表参数

按照通讯协议文档配置各个参数,建议先手动添加一个数据点,然后导出JSON配置进行批量编辑。

字段配置说明

字段 说明 示例
key 唯一序号,从1递增 1, 2, 3…
name 采集参数名称(英文标识) flue_temp
sadd 从机地址(站号) 1
rtype 功能码:1=读线圈,3=读保持寄存器 3
radd 协议地址 501
dtype 数据类型编码 2
magn 倍率 0.1
report 变化上报开关 0/1
ampl 变化上报幅值 0

地址转换规则

  • **线圈地址 (0xxxx)**:协议地址 = 点位地址 - 1
  • **保持寄存器 (4xxxx)**:协议地址 = 点位地址 - 40001

数据类型编码

dtype 类型 说明
0 布尔型 开关量/线圈
1 16位有符号 Signed
2 16位无符号 Unsigned
7 32位浮点数(ABCD) Float
8 32位浮点数(CDAB) Float inverse

完整配置JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
{
"datas": [
{
"key": 1,
"name": "flue_temp",
"sadd": 1,
"rtype": 3,
"radd": 501,
"dtype": 2,
"magn": "0.1",
"report": 0,
"ampl": "0"
},
{
"key": 2,
"name": "boiler_press",
"sadd": 1,
"rtype": 3,
"radd": 5,
"dtype": 7,
"magn": "0.01",
"report": 0,
"ampl": "0"
},
{
"key": 3,
"name": "pump_run_coil",
"sadd": 1,
"rtype": 1,
"radd": 5,
"dtype": 0,
"magn": "1",
"report": 0,
"ampl": "0"
},
{
"key": 4,
"name": "fire_coil_1",
"sadd": 1,
"rtype": 1,
"radd": 6,
"dtype": 0,
"magn": "1",
"report": 0,
"ampl": "0"
},
{
"key": 5,
"name": "fire_coil_2",
"sadd": 1,
"rtype": 1,
"radd": 7,
"dtype": 0,
"magn": "1",
"report": 0,
"ampl": "0"
},
{
"key": 6,
"name": "water_level",
"sadd": 1,
"rtype": 3,
"radd": 60,
"dtype": 2,
"magn": "1",
"report": 0,
"ampl": "0"
},
{
"key": 7,
"name": "press_state",
"sadd": 1,
"rtype": 3,
"radd": 65,
"dtype": 2,
"magn": "1",
"report": 0,
"ampl": "0"
},
{
"key": 8,
"name": "fault_reg",
"sadd": 1,
"rtype": 3,
"radd": 570,
"dtype": 2,
"magn": "1",
"report": 0,
"ampl": "0"
}
]
}

配置 Modbus Slave

连接设置

采集点配置

数据类型对照表

点位名称 Function Display Quantity dtype
烟道温度 03 Holding Register Unsigned 1 2
锅炉压力 03 Holding Register Float 2 7
给水泵状态 01 Coil Status Binary 1 0
燃烧状态线圈1 01 Coil Status Binary 1 0
燃烧状态线圈2 01 Coil Status Binary 1 0
水位状态 03 Holding Register Unsigned 1 2
压力状态 03 Holding Register Unsigned 1 2
故障寄存器 03 Holding Register Unsigned 1 2

采集点详细说明

1. 烟道温度

  • 地址:40502 → radd: 501
  • 类型:16位无符号整型
  • 换算:实际温度 = 采集值 × 0.1
  • 示例:采集值 125 → 实际温度 12.5℃

2. 锅炉压力

  • 地址:40006 → radd: 5
  • 类型:32位浮点数(注意:slave需配置Float inverse才能正确读取)
  • 换算:实际压力 = 采集值 × 0.01
  • 示例:采集值 800 → 实际压力 8.00 MPa

3-5. 燃烧状态

通过两个线圈组合判断:

线圈1 线圈2 状态
1 0 小火
1 1 大火
0 0 无火

6. 水位状态

采集值 状态
0 水位极低
1 水位低
2 水位正常
3 水位高
4 水位极高

7. 压力状态

采集值 状态
1 压力低
2 压力正常
3 压力高
4 压力极高

8. 故障寄存器

故障值按位解析,支持多故障同时上报:

示例:故障值 2817

1
2
2817 = 2048 + 512 + 256 + 1
= bit11 + bit9 + bit8 + bit0

对应故障:

  • 定时时间到关机(正常模式)
  • 燃烧机故障
  • 烟温传感器故障
  • 炉水水位极低

字段名称映射

1
2
3
4
5
6
7
8
9
10
enum SteamBoilerPoints {
flue_temp = '烟道温度',
boiler_press = '锅炉压力',
pump_run_coil = '给水泵状态',
fire_coil_1 = '燃烧状态线圈1',
fire_coil_2 = '燃烧状态线圈2',
water_level = '锅炉水位状态',
press_state = '锅炉压力状态',
fault_reg = '锅炉故障寄存器',
}

小结

本文介绍了如何通过 Modbus 协议采集蒸汽锅炉的运行数据,包括:

  1. 硬件设备连接配置
  2. Modbus 协议地址转换
  3. 数据类型和倍率配置
  4. 状态量和故障位的解析方法

下一篇文章将介绍如何将采集到的数据上报到 MQTT 服务器。


物联网之设备数据采集(一)
https://cszy.top/20260402-物联网之设备数据采集(一)/
作者
csorz
发布于
2026年4月2日
许可协议