2. ThingWorx平台核心概念
在ThingWorx中做工业数据与MES集成,真正决定“能不能连、连上之后怎么动”的,不是页面上的按钮,而是模型层的几个核心概念:Thing、ThingTemplate、ThingShape、属性、服务、事件与订阅。它们共同构成一个“可复用的设备/系统数字模型”,集成工作本质上就是把这些模型对象与外部系统的数据点、接口和业务动作对应起来。理解它们的分工,比记住菜单路径更重要。
一、从“模板—形状—实例”理解建模层次
Thing是ThingWorx中最基本的运行实体,可以理解为某个具体对象的数字化实例,例如“CNC-01”“注塑机A3”“MES订单接口”。每个Thing拥有自己的属性值、可调用的服务、可触发的事件,以及订阅关系。集成时,我们通常为每一台设备、每一条产线或每一个外部系统建立一个Thing,作为数据与动作的落点。
ThingTemplate是Thing的“类型模板”,用于定义一类对象共有的属性、服务、事件和订阅。例如可以建立“CNC设备模板”,在其中统一定义主轴转速、运行状态、报警代码等属性,以及启动采集、下发工单等服务。当现场有20台同型号CNC时,只需基于该模板创建20个Thing,公共逻辑只维护一份。模板是集成规模化的关键:设备类型越多、数量越大,模板的价值越明显。
ThingShape是可复用的能力片段,用来把一组属性、服务、事件“打包”,再被多个ThingTemplate或Thing引用。它解决的是“跨类型复用”问题。例如“OPC UA连接能力”可以做成一个ThingShape,包含连接参数属性、连接/断开服务、连接状态事件;“MES工单交互能力”可以做成另一个ThingShape,包含工单查询服务、报工服务、工单变更事件。一个ThingTemplate可以同时实现多个ThingShape,从而组合出完整能力。模板偏向“这一类设备是什么”,形状偏向“它具备哪些可插拔能力”,两者配合才能既统一又灵活。
二、属性:集成的数据落点
属性(Property)是Thing上承载数据的字段,是外部数据进入ThingWorx后的“落脚点”。属性有明确的数据类型,如NUMBER、STRING、BOOLEAN、DATETIME、JSON等,集成时必须让外部数据点的类型与属性类型匹配,否则会出现写入失败或精度丢失。例如PLC中的主轴转速是整数,就应定义为NUMBER;设备状态是枚举字符串,就定义为STRING。
属性还区分“可读”“可写”“持久化”等行为。来自PLC的实时数据通常设为可读、非持久化,避免高频写入拖累数据库;MES下发的工单号、计划数量等需要保留,可设为持久化。属性值的变化可以触发事件,这是后面“订阅”机制的基础。集成中常见的做法是:用OPC UA或MQTT的采集服务把外部值写入属性,再由属性变化驱动后续逻辑。
三、服务:集成的动作出口
服务(Service)是Thing上可被调用的逻辑单元,用JavaScript编写,可以读取/写入属性、调用其他Thing的服务、访问数据库或调用REST接口。在集成中,服务承担两类角色:一是“向内”,把外部系统的数据加工后写入属性;二是“向外”,把ThingWorx中的状态或业务结果推送给MES、ERP或数据库。
例如在“MES订单接口”Thing上可以定义GetWorkOrder()服务,通过REST调用MES的工单查询接口,把返回的工单号、物料编码、计划数量解析后写入属性;再定义ReportCompletion()服务,把设备完成的实际数量、完成时间组装成JSON,POST回MES的报工接口。服务是集成逻辑真正执行的地方,也是排障时最需要关注的对象。
四、事件与订阅:让集成“自动发生”
事件(Event)是Thing上可被声明的“通知点”,本身不包含逻辑,只表示“某件事发生了”。常见事件包括属性变化事件、定时事件、自定义事件。例如当“运行状态”属性从Running变为Alarm时,可以触发一个StatusChanged事件;当报警代码被写入时,触发AlarmTriggered事件。
订阅(Subscription)是事件与响应之间的绑定关系:当某个事件被触发时,自动调用指定的服务或执行指定动作。订阅让集成从“轮询”变成“事件驱动”。例如订阅AlarmTriggered事件,触发SendAlarmToMES()服务,把报警信息实时推送到MES;订阅定时事件,每5秒调用一次采集服务,把PLC数据刷新到属性。相比定时轮询,事件驱动能显著降低无效请求,也能让报警、停机等关键状态更快到达MES。
五、在集成中的协同关系
把这几个概念串起来看:ThingShape提供可复用的连接与业务能力,ThingTemplate把能力组合成设备类型,Thing是现场具体设备或接口的实例;属性是数据落点,服务是动作出口,事件是状态变化的信号,订阅是信号到动作的自动连线。一个典型的集成链路是:外部PLC数据 → 采集服务 → 写入属性 → 属性变化触发事件 → 订阅调用推送服务 → MES收到数据;反向则是:MES下发工单 → 调用Thing服务 → 写入属性 → 设备侧读取执行。
实际项目中,建议先按“设备类型”梳理ThingTemplate,再按“能力”拆分ThingShape,最后为每台设备创建Thing并绑定数据点。属性命名、服务命名和事件命名要统一规范,例如属性用P_前缀、服务用动词开头、事件用过去式,这样在几十上百个Thing之间排查集成问题时,能快速定位到具体对象和具体环节。
| 概念 | 本质 | 集成中的典型角色 |
|---|---|---|
| Thing | 运行实例 | 对应一台设备或一个外部系统接口 |
| ThingTemplate | 类型模板 | 批量定义同类设备的公共属性与服务 |
| ThingShape | 能力片段 | 跨类型复用连接、工单、报警等能力 |
| 属性 | 数据字段 | 承载PLC/MES数据,是集成的数据落点 |
| 服务 | 可调用逻辑 | 执行采集、解析、推送、回写等动作 |
| 事件 | 状态通知点 | 标识属性变化、报警、定时等触发时机 |
| 订阅 | 事件-响应绑定 | 让集成自动执行,减少轮询与人工干预 |
需要特别注意的是,ThingTemplate和ThingShape的修改会影响所有引用它们的Thing。在集成上线后,如果直接修改模板中的属性类型或服务逻辑,可能同时影响几十台设备。稳妥的做法是先在测试Thing上验证,再通过版本化或新建模板的方式逐步替换,避免一次改动引发大面积集成中断。