2. ThingWorx平台核心概念
在ThingWorx中做设备接入,真正需要先想清楚的不是“怎么连”,而是“连上来的设备在平台里以什么形式存在、由谁定义、数据放在哪里、行为由谁触发”。这一节围绕七个核心概念展开:Thing、ThingTemplate、ThingShape、属性(Property)、服务(Service)、事件(Event)、订阅(Subscription)。它们不是并列的名词,而是一套从“模型定义”到“运行实例”再到“数据与行为驱动”的分层机制。理解这套机制,后续接入Modbus、OPC UA、MQTT设备时,才知道每一步配置落在哪一层。
一、Thing:设备在平台中的运行实例
Thing是ThingWorx中最基本的运行实体,可以理解为“一个具体对象在平台里的数字化代表”。一台具体的PLC、一个温度传感器、一条产线上的某台电机,接入后通常对应一个Thing。Thing有唯一名称,例如 CNC_01、Press_Machine_Line3。它承载三样东西:属性值(当前数据)、可调用的服务(行为)、可触发的事件(状态变化通知)。
设备接入时,Thing是最终被绑定到连接器(如Industrial Connection、MQTT Client)上的对象。也就是说,连接负责“通道”,Thing负责“对象”。同一台设备如果既走采集又走控制,仍然是一个Thing,只是它同时拥有读属性服务和写属性服务。
二、ThingTemplate:同类设备的模型模板
如果现场有50台同型号注塑机,不可能逐台重复定义属性、服务和事件。ThingTemplate就是用来解决这个问题的:它定义“一类设备长什么样”。模板中预先声明该型号设备应具备的属性(如injectionPressure、barrelTemperature)、服务(如startCycle、stopCycle)和事件(如cycleComplete)。
创建Thing时选择某个ThingTemplate,该Thing就继承模板中的全部定义。模板修改后,所有基于它创建的Thing会同步获得结构变化。这是设备接入规模化的关键:先建模板,再批量实例化,而不是一台一台手工建。
三、ThingShape:可复用的能力片段
ThingShape比ThingTemplate更细,它是一组属性、服务、事件的“能力集合”,可以被多个ThingTemplate或Thing复用。例如可以定义一个EnergyMeterShape,包含activePower、energyTotal属性和resetEnergy服务;再定义一个AlarmShape,包含alarmActive属性和acknowledgeAlarm服务。一台设备如果既需要计量又需要报警,就同时挂载这两个Shape。
三者的关系可以概括为:ThingShape是能力积木,ThingTemplate是用积木搭出的设备型号,Thing是按型号生产出的具体设备。设备接入时,如果现场设备种类多但能力交叉,优先用Shape组合;如果型号固定、批量大,优先用Template。
四、属性:设备数据的落脚点
属性是Thing上存储数据的字段。设备接入时,采集到的每一个测点最终都要映射到一个属性上。属性有明确的数据类型:NUMBER、STRING、BOOLEAN、DATETIME等。例如温度映射为NUMBER,运行状态映射为BOOLEAN,设备编号映射为STRING。
属性还有几个关键设置需要关注:读写权限决定该属性是只读(采集)还是可写(下发);持久化决定重启后值是否保留;日志记录决定是否写入Value Stream供历史查询。以一台注塑机为例,barrelTemperature设为NUMBER、只读、持久化、记录日志;targetTemperature设为NUMBER、可读写、持久化、记录日志。这样采集值与设定值分开管理,后续做报警和闭环控制时不会混淆。
五、服务:设备行为的封装
服务是Thing上可被调用的逻辑单元。它接收输入参数,执行一段脚本或调用外部接口,返回输出结果。设备接入中,服务承担两类职责:一是数据转换,例如把Modbus寄存器读到的原始整数按比例换算为工程值;二是控制下发,例如向PLC写入启动命令并返回执行结果。
一个典型的服务实现如下:
// 服务名:readAndScaleTemperature
// 输入:rawValue (NUMBER) — Modbus寄存器原始值
// 输出:scaledValue (NUMBER) — 工程值(℃)
var scaleFactor = 0.1; // 示例:原始值放大10倍存储
var offset = 0; // 示例:无偏移
var scaledValue = rawValue * scaleFactor + offset;
// 写入Thing属性
me.barrelTemperature = scaledValue;
// 返回结果
result = scaledValue;
这段代码中,me指当前Thing实例。服务执行后,barrelTemperature属性被更新,同时返回值可供调用方判断。实际项目中,比例因子和偏移量应根据设备手册标定,不能直接照搬示例值。
六、事件与订阅:从数据到响应的桥梁
事件表示Thing上发生的值得关注的状态变化。事件可以由服务主动触发,也可以由属性变化触发。例如当barrelTemperature超过设定阈值时触发overTemperature事件,事件数据中携带当前温度值和阈值。
订阅则是事件的消费者。它监听某个Thing的某个事件,一旦事件触发,就自动调用指定的服务。订阅把“设备发生了什么”和“系统应该做什么”连接起来。例如:
- 订阅
CNC_01的cycleComplete事件 → 调用ProductionService.recordOutput()累加产量; - 订阅
Press_Line3_01的overTemperature事件 → 调用AlarmService.raiseAlarm()生成报警记录; - 订阅
PowerMeter_01的energyThresholdReached事件 → 调用NotificationService.sendEmail()通知能源管理员。
订阅关系是设备接入从“能采到数”走向“能自动响应”的关键一步。没有订阅,事件只是记录;有了订阅,事件才驱动业务动作。
七、在设备接入中的协作关系
把七个概念串起来看:ThingShape定义可复用能力,ThingTemplate组合Shape形成设备型号,Thing按模板实例化并绑定连接器;属性承载采集数据,服务封装转换与控制逻辑,事件标记状态变化,订阅把事件转化为自动响应。设备接入的完整链路是:连接器读取原始数据 → 服务换算并写入属性 → 属性变化或服务触发事件 → 订阅调用目标服务 → 业务系统获得结果。
injection_pressure,避免后续在订阅和报表中产生歧义。