4. 连接工业数据源

告警系统能否及时、准确地触发,取决于底层数据是否被稳定采集并正确映射。ThingWorx 本身不直接“读”PLC 寄存器,它通过工业连接器(Industrial Connectivity,基于 Kepware 技术)把 OPC UA、Modbus、MQTT 等异构协议统一转换为 ThingWorx 可识别的数据模型。本节围绕“采集—建模—映射—触发”这条主线,说明如何把设备数据变成告警可用的属性与事件。

一、先分清四类数据源的角色

在动手配置前,需要明确每种协议在架构中的位置,否则容易出现“用错工具”的问题。

  • OPC UA:面向语义化、带类型和地址空间的工业标准协议,适合连接支持 OPC UA Server 的 PLC、DCS、SCADA。它自带节点 ID、数据类型、时间戳和质量码(Quality),是告警判断中最“干净”的数据源。
  • Modbus TCP/RTU:轻量、寄存器导向。数据本身没有语义,只有地址(如 40001)和寄存器类型(线圈、输入寄存器、保持寄存器)。需要人工定义缩放、字节序和工程单位。
  • MQTT:发布/订阅消息协议,适合网关、边缘设备、传感器上报。数据以主题(Topic)和 JSON/字符串载荷形式到达,天然是“事件流”,适合直接映射为 ThingWorx 事件。
  • ThingWorx 工业连接器:作为统一接入层,把上述协议(以及 Siemens、Allen-Bradley 等原生驱动)汇聚为 OPC UA 或 REST 接口,再通过 Industrial Thing 暴露给平台。

二、采集链路与映射关系

下图展示从现场设备到告警触发条件的完整数据流:设备经协议进入工业连接器,被组织为标签(Tag),再通过 Industrial Thing 映射为 ThingWorx 的属性和事件,最终由告警规则消费。

① 现场设备 / 数据源 PLC / DCS OPC UA Server 电表 / 变频器 Modbus TCP 边缘网关 / 传感器 MQTT Broker ② 工业连接器(Industrial Connectivity) 通道 Channel 设备 Device 标签组 Tag Group 标签 Tag 数据类型 / 缩放 / 字节序 扫描速率 Scan Rate 质量码 Quality ③ ThingWorx 平台 Industrial Thing 属性 Property 事件 Event 服务 Service RemoteThing / ThingShape 数据变更订阅 时间戳 / 质量码透传 OPC UA / REST ④ 告警触发 告警规则 阈值条件 持续时间 死区 Deadband 优先级 Priority 状态 State 通知 Notification 映射示例:设备标签 → ThingWorx 属性 → 告警条件 OPC UA 标签 ns=2;s=Boiler1.Temp 类型: Double, 单位: °C 质量码: Good → 属性 BoilerTemp Modbus 寄存器 40001, 保持寄存器 原始值 0–65535 缩放 ×0.1 → 0–6553.5 → 属性 MotorCurrent MQTT 主题 factory/line1/vibration 载荷: {"rms":4.8,"ts":...} JSON 解析 → 数值 → 属性 VibrationRMS

三、从标签到属性的映射要点

映射不是简单“改个名字”,而是要把现场数据的物理含义完整传递到平台。以 OPC UA 为例,在工业连接器的 Channel 下建立 Device,再建立 Tag,每个 Tag 需要确认四项:

  1. 地址与数据类型:OPC UA 直接引用节点 ID,如 ns=2;s=Boiler1.Temp;Modbus 则填写寄存器地址与类型(如 40001 保持寄存器、Float 或 Word)。类型不匹配会导致属性值异常或写入失败。
  2. 缩放与工程单位:Modbus 原始值常为整数,需设置缩放系数。例如电流寄存器原始值 0–65535,缩放 ×0.1 后得到 0–6553.5 A,属性单位标注为 A。
  3. 扫描速率:决定数据刷新频率。温度这类慢变量可设 5000 ms,振动、电流等快变量可设 500–1000 ms。扫描过快会增加连接器与网络负担,过慢则告警滞后。
  4. 质量码处理:OPC UA 的 Quality 为 Bad 时,属性值不可信。告警规则应结合质量码判断,避免因通信中断产生误报。

在 ThingWorx 侧,Industrial Thing 通过 RemoteThing 或 ThingShape 绑定这些标签,形成属性。属性名建议与业务语义一致,例如 BoilerTemp、MotorCurrent、VibrationRMS,而不是沿用 Tag001 这类无意义名称。

四、MQTT 数据的特殊处理

MQTT 到达的是消息而非持续变量,因此更适合映射为事件。典型做法是:在 ThingWorx 中订阅主题 factory/line1/vibration,收到 JSON 载荷后解析出 rms 字段,写入属性 VibrationRMS,同时触发一个自定义事件 VibrationReported。告警规则既可以监听属性变化,也可以直接监听事件,后者更适合“每次上报都判断一次”的场景。

MQTT 载荷建议统一为 JSON,并在连接器或 ThingWorx 服务中做字段校验。若载荷为纯字符串,需先解析再映射,否则属性会变成字符串类型,导致数值比较失败。

五、告警触发所需的属性与事件设计

映射完成后,需要为告警准备两类数据:

  • 数值属性:用于阈值比较,如 BoilerTemp > 95、MotorCurrent > 12.5。属性应带单位、时间戳和质量码。
  • 状态/事件:用于表达离散变化,如设备启停、通信中断、MQTT 上报异常。事件可携带上下文参数,便于告警消息中直接引用。

一个常见的告警条件可以写成:当 BoilerTemp 连续 3 次采样超过 95 °C,且质量码为 Good,且持续时间超过 10 秒,则触发“锅炉超温”告警。这里的“连续 3 次”“10 秒”就是告警规则中的持续时间与去抖参数,它们依赖采集侧的扫描速率和映射稳定性。

六、配置检查清单

检查项判断依据常见问题
连接器通道状态Channel/Device 显示 ConnectedIP、端口、认证错误
标签值刷新Tag 值随时间变化,质量码 Good地址错误、扫描速率过低
属性映射ThingWorx 属性值与标签一致类型不匹配、缩放未设置
事件触发MQTT 上报后事件日志出现记录主题未订阅、JSON 解析失败
告警条件模拟超限后告警状态变为 Active阈值单位不一致、死区过大
不要用“能读到数”作为映射成功的唯一标准。必须验证数值单位、缩放、时间戳和质量码是否与告警规则假设一致,否则会出现“数据正常但告警不触发”或“频繁误报”的问题。

完成本节配置后,设备数据已经具备被告警规则消费的条件。下一步的关键是让告警规则正确理解这些属性的语义、时间特性和质量状态,从而在真实工况下稳定触发。