OpenDACS 是基于OPCUA 信息模型的IEC61499 分布式自动控制系统。本文介绍它如何采用Opcua Pub/Sub 实现分布式设备中功能块之间的通信。
4diac 构建IEC61499 系统和应用
系统结构
试验系统共有三台设备,为了实验方便,我们让它们在一台Linux PC 上运行,它们具有不同的端口,使用OPCUA Pub/sub 的UDAP协议,这是一种组播通信方式。使用4diac 定义系统。
应用
OpenDACS中,我们实现了几种OpcUa 的IEC61499功能块:
- WriteOPCUA
- ReadOPCUA
- PUBLISH_1
- SUBSCRIBE_1
应用包含了总体的控制逻辑,分别映射到三台设备中。
映射
在总体应用中并没有包含Publish和Subscribe 功能块。要在device 资源中手动添加PUBLISH和SUBSCRIBE 功能块,为了测试更全面,我们在Forte_PC 设备中,添加了两个PUBLISH 功能块,分别向其它两台设备发布数据。
FortePC 应用
Forte_PC_1
添加一个SUBSCRIBE
Forte_PC_2
添加一个SUBSCRIBE
注意:在上面的架构中,两个PUBLISH 发送的是同一个数据源,所有也可以简化系统的结构,采取Forte_PC 添加一个发布(PUBLISH ),其它两个设备订阅(SUBSCRIBE )
pub/sub 中的ID 结构
OPC UA pub/sub 的架构如下:
Publisher 和Subscriber 的ID
发布一个消息 涉及下面几个组件
- connection
- WriteGroup
- DataSetWriter
- DataSet
每个组件都有一个ID,订阅者要使用发布者的三个ID 来确定接收哪一种数据源,它们是:
- WriteGroupID
- DataSetWriterID
- DataSetID
所有PUBLISH 功能块ID定义:
ID=WriteGroupID.DataSetID.DataSetID
SUBSCRIBE 功能块的ID定义为:
ID=WriteGroupID.DataSetID.DataSetID
这里的WriteGroupID,DataSetID,DataSetID 要与发布者一致。
一个Server 中可以定义多个WriterGroup,一个WriterGroup 中可以有多个DataSetWriter,一个DataSetWriter可以对应多个DataSet。
由于Pub/Sub 是基于UDP 组播方式的。所以SUBSCRIBER 可以接收
- 不同WriterGroupID ,不同DataSetWriterID的不同DateSetID 的消息
- 相同WriterGroupID ,不同DataSetWriterID的不同DateSetID 的消息
- 相同WriterGroupID ,相同DataSetWriterID的不同DateSetID 的消息
在系统设计时,要规划ID 方案。
设计流程
Step1 使用4diac IDE 设计上面的系统,保存了Blinky.sys 文件。将自定义的功能块放在功能块库的user 子目录中。
Step2 使用Converter2023 工具转换成为OPCUA 的Design Model XML 文档,它们按Device 分解为:
- Forte_PC.xml
- Forte_PC_1.xml
- Forte_PC_2.xml
Step3 使用UpcUaModelCompiler 工具将上面三个文件转换成为NodeSet2.xml 文档,装入三个目录(Publisher,Subscribe1,Subscribe2)
Step4 运行,它们的顺序为
- Subscribe1 的ForteA
- Subscribe2的ForteA
- Publish 的ForteA
Step5 使用uaExpert监控
由于在同一台电脑中运行,所以IP 地址是一致的,因此在Subscribe2 运行后 启动uaExpert 可以看见Subscribe 的OpcUa Server 中的模型,最后运行Publisher 的ForteA。
结论
人世间的任何事物一旦深入细节,就会发现一堆问题。但是不深入细节,什么都不是。