3、数据采集基础:传感器类型与通信协议
大家好,我是老张。今天咱们聊聊数据采集这块。
说实话,风机数字孪生能不能玩得转,数据采集是地基。地基不牢,后面全白搭。我在项目里见过太多因为传感器选型不对、协议没搞明白,最后数据乱七八糟的案例。嗯,今天就把这些坑给大家捋一遍。
3.1 传感器类型:风机上的“五官”
风机本身是个大家伙,但它的“感觉器官”其实就那几样。我个人习惯把传感器分成四大类:振动、温度、转速、风速。你想想看,风机运行状态好不好,无非就是看这几个指标。
3.1.1 振动传感器
振动是风机的“心电图”。齿轮箱、轴承、发电机,哪个坏了都会先抖起来。
- 加速度传感器:最常用。我一般选 IEPE 类型的,信号稳定,抗干扰强。
- 速度传感器:适合低频振动,比如塔筒晃动。
- 位移传感器:主轴、齿轮箱大轴用得多。
3.1.2 温度传感器
温度高了,说明摩擦大了,或者散热不行了。
- PT100 铂电阻:齿轮箱油温、轴承温度,精度高,线性好。
- 热电偶:发电机绕组温度,量程大,响应快。
- 红外测温:非接触式,适合测塔筒表面温度,但精度一般。
3.1.3 转速传感器
转速是风机的“脉搏”。
- 磁电式:靠齿轮盘感应,简单可靠,但低速时信号弱。
- 霍尔式:需要供电,但低速性能好,适合变桨系统。
- 编码器:精度最高,能测角度和方向,但贵,娇气。
我个人习惯在主轴和发电机端各装一个转速传感器。为什么?因为可以算传动比,判断齿轮箱有没有打滑。这个细节,很多新手会忽略。
3.1.4 风速传感器
风速决定了风机能发多少电,也决定了载荷有多大。
- 超声波风速仪:无机械部件,免维护,但贵。我推荐用这个。
- 机械式风速杯:便宜,但容易结冰、磨损。北方项目慎用。
- 激光雷达:能测前方 200 米的风,用于前馈控制。但成本高,目前只有大机组在用。
3.2 数据采集系统架构
传感器选好了,怎么把数据收回来?这就涉及到系统架构了。说白了,就是一条数据从传感器到数字孪生平台的“高速公路”。
我画了一张图,大家可以看看典型的架构长什么样。
这张图很直观。从传感器到平台,一共四层。每一层都有讲究。
3.2.1 传感器层
就是咱们刚才说的那些传感器。注意,传感器出来的信号有两种:模拟量(4-20mA、0-10V)和数字量(脉冲、RS485)。模拟量需要 AD 转换,数字量可以直接读。
3.2.2 数据采集层
这一层负责把传感器的信号变成数字。常见设备有:
- PLC:工业现场最稳,但编程麻烦。
- 数据采集卡:适合实验室,现场用容易坏。
- 边缘网关:现在流行,能直接上云,还能做简单处理。
3.2.3 通信层
数据采集上来,怎么传到平台?这就靠通信协议了。下面重点讲。
3.3 Modbus 协议简介
Modbus 是工业界的“普通话”。老设备基本都支持。说白了,它就是一个主从协议,一个主站问,多个从站答。
3.3.1 Modbus 的两种形式
| 类型 | 物理层 | 速度 | 距离 | 典型场景 |
|---|---|---|---|---|
| Modbus RTU | RS485 | 9.6kbps - 115.2kbps | 1200米 | 机舱内传感器 |
| Modbus TCP | 以太网 | 100Mbps | 100米(交换机可扩展) | 塔基到中控室 |
嗯,这里要注意。Modbus RTU 是串口通信,抗干扰强,但速度慢。Modbus TCP 速度快,但布线要求高。我一般机舱内用 RTU,塔基到中控用 TCP。
3.3.2 数据模型
Modbus 把数据分成四张表:
- 线圈(Coil):1 位,可读写。比如启动、停止信号。
- 离散输入(Discrete Input):1 位,只读。比如急停状态。
- 输入寄存器(Input Register):16 位,只读。比如风速、温度。
- 保持寄存器(Holding Register):16 位,可读写。比如设定功率、PID 参数。
3.3.3 代码示例:读取风速
下面是一个用 Python 读取 Modbus TCP 风速数据的例子。很简单,但很实用。
from pymodbus.client import ModbusTcpClient
# 连接风机 PLC
client = ModbusTcpClient('192.168.1.100', port=502)
client.connect()
# 读取输入寄存器,地址 0,长度 2(32 位浮点数)
result = client.read_input_registers(0, 2)
if result.isError():
print("读取失败")
else:
# 将两个 16 位寄存器合并为 32 位浮点数
import struct
raw = struct.pack('>HH', result.registers[0], result.registers[1])
wind_speed = struct.unpack('>f', raw)[0]
print(f"当前风速:{wind_speed:.2f} m/s")
client.close()
这个代码我用了很多年。注意,风速数据通常是 32 位浮点数,占用两个寄存器。顺序是高位在前(大端模式),别搞反了。
3.4 OPC UA 协议简介
Modbus 虽然好用,但有个问题:它只传数值,不传语义。比如寄存器 0 是风速还是温度?你得查手册。OPC UA 就不一样了,它自带信息模型,数据是什么、单位是什么、量程是多少,都写在里面。
说白了,OPC UA 是工业界的“高级语言”,而 Modbus 是“汇编语言”。
3.4.1 OPC UA 的核心概念
- 节点(Node):每个数据点都是一个节点,有唯一的 NodeId。
- 对象(Object):节点可以组织成对象,比如“齿轮箱”对象下面有“温度”、“转速”等子节点。
- 变量(Variable):具体的数据值,比如温度 65.3°C。
- 方法(Method):可以远程调用的函数,比如“复位报警”。
3.4.2 为什么用 OPC UA?
我举个例子。你用 Modbus 读到寄存器 0 的值是 65.3,你得自己知道这是齿轮箱油温。但用 OPC UA,节点路径是 ns=2;s=Gearbox.OilTemperature,一看就明白。而且它还自带时间戳、质量戳,数据好不好用一目了然。
3.4.3 OPC UA 与 Modbus 对比
| 特性 | Modbus | OPC UA |
|---|---|---|
| 语义信息 | 无 | 有(信息模型) |
| 安全性 | 无 | 加密、认证 |
| 跨平台 | 好 | 好 |
| 配置复杂度 | 低 | 中 |
| 实时性 | 高 | 中 |
| 典型应用 | 老设备、简单采集 | 新系统、数字孪生 |
3.5 本章小结
数据采集是数字孪生的第一步,也是最重要的一步。传感器选型要准,安装要稳,协议要通。我个人觉得,新手最容易犯的错就是:传感器装好了,数据也采上来了,但没验证数据对不对。记住,数据质量比数据量更重要。
嗯,今天就聊到这儿。下一章咱们讲讲数据清洗和预处理,那又是另一番天地了。
公众号:蓝海资料掘金营,微信deep3321