4. 设备联网与数据采集工程实施
实验设备联网的本质,是把设备内部的状态量、参数量、报警量从“本地可见”变成“系统可读”。这一过程通常要跨越四层:物理接口层(RS232/RS485)、协议层(Modbus RTU/ASCII/TCP)、网络传输层(TCP/IP)以及语义建模层(OPC UA)。工程实施的关键不是把四层堆在一起,而是让每一层都明确“传什么、怎么传、传成什么样”。
一、物理接口与链路选择
RS232 是点对点、全双工、短距离接口,典型用于一台设备与一台采集网关或工控机直连,常见参数为 9600/19200 bps、8 数据位、无校验、1 停止位。RS485 是差分半双工总线,支持多点挂接,适合一台网关轮询多台实验设备。工程上先确认三件事:设备端接口类型、是否需要转换器、总线拓扑与终端电阻。
以一台带 RS232 接口的恒温箱为例,若采集端只有 RS485 总线,则需使用 RS232/RS485 转换器,并注意转换方向控制(自动收发或 RTS 控制)。RS485 总线建议采用手拉手拓扑,避免星形分支;总线两端各接 120 Ω 终端电阻,屏蔽层单端接地。设备地址、波特率、校验方式必须与设备手册一致,否则表现为“无响应”或“乱码”。
二、Modbus 数据采集实现
Modbus 是实验设备中最常见的应用层协议。RTU 帧由地址、功能码、数据、CRC 校验组成;TCP 帧则用 MBAP 头替代 CRC,端口默认 502。采集前先建立“点表”,把设备手册中的寄存器地址、数据类型、量纲、读写属性映射为系统变量。
例如某温控器手册给出:保持寄存器 40001 为当前温度(单位 0.1 ℃,有符号 16 位),40002 为设定温度,40003 为运行状态(0 停止、1 运行、2 报警)。注意 Modbus 地址存在“协议地址”与“文档地址”偏移:文档 40001 对应协议地址 0。读取时功能码 03,起始地址 0,数量 3。若返回字节为 00 FA 01 2C 00 01,则当前温度 0x00FA=250,即 25.0 ℃;设定温度 0x012C=300,即 30.0 ℃;状态 1 表示运行。
# 示例:用 pymodbus 读取 3 个保持寄存器(示例参数,非实测)
from pymodbus.client import ModbusSerialClient
c = ModbusSerialClient(port="COM3", baudrate=9600,
parity="N", stopbits=1, bytesize=8, timeout=1)
c.connect()
r = c.read_holding_registers(address=0, count=3, slave=1)
print(r.registers) # 期望 [250, 300, 1]
c.close()
轮询周期要结合设备响应时间和总线负载。RS485 半双工总线上,若单帧往返约 30 ms,挂接 8 台设备,则一轮约 240 ms;把轮询周期设为 500 ms~1 s 较为稳妥。对报警状态可提高优先级或采用变化上报,避免高频轮询拖垮总线。
三、TCP/IP 与 OPC UA 接入
当设备自带网口或通过串口服务器接入时,数据进入 TCP/IP 通道。串口服务器把 RS232/485 数据封装为 TCP 流,采集端以“透明传输”或“Modbus TCP 网关”方式访问。此时要区分设备是 Modbus RTU over TCP 还是标准 Modbus TCP:前者仍需 CRC,后者用 MBAP。端口、IP、单元标识(Unit ID)要与网关配置一致。
OPC UA 解决的是语义与互操作问题。它不只传数值,还传节点、类型、工程单位、时间戳和质量码。典型做法是在采集网关或边缘服务中建立地址空间:把 Modbus 点表映射为 OPC UA 变量节点,如 ns=2;s=Device1.Temperature,并附带 EngineeringUnits=℃。上层系统通过订阅(Subscription)获取变化通知,而不是反复轮询。这样,同一台设备的数据既能被 SCADA 读取,也能被 MES 或数据平台按统一语义消费。
四、采集工程实施要点
实施时建议按“先通链路、再通协议、后建语义”的顺序推进。第一步用串口调试助手或 Modbus Poll 验证单台设备能否正确读写;第二步接入网关,确认轮询周期、超时与重试;第三步在 OPC UA 服务中建立节点并核对单位、量纲、时间戳。常见故障中,“无响应”多因地址、波特率或接线错误;“数据跳变”多因字节序或寄存器偏移;“时断时续”多因总线终端电阻、屏蔽或电源干扰。
数据采集不是一次性接线,而是持续可维护的工程。把物理层、协议层、语义层的边界划清,把点表作为唯一数据字典,才能让实验设备的状态与参数稳定、可解释地进入上层系统。