IEC61499/ OPCUA 融合(1)功能块通信的PUB/SUB协议

news2025/1/20 1:48:22

        OpenDACS  是基于OPCUA 信息模型的IEC61499 分布式自动控制系统。用于研究OPCUA 与IEC61499 相互融合。本文介绍它如何采用Opcua Pub/Sub 实现分布式系统中IEC61499功能块之间的通信。在IEC61499 中并没有明确地确定采取哪一种协议,在具体实现中可能采取TCP/IP,UDP ,MQTT ,WebSocket 等多种协议。数据负载的格式也没有具体规定,在4diac Forte 中使用ISO 的ASN.1 格式。其它机构采取哪一种协议不得而知。这严重影响了IEC61499 系统的互联互通。

OPCUA pub/sub 机制

        OPCUA 主要的通信协议是Cliet/Server 方式。它基于TCP/IP 协议,是一种点对点通信方式。OPC UA 在2018年2月份发布了发布/订阅(pub/sub )模式。pub/sub 适合点对多点方式,一个节点发布的消息,可以被多个设备订阅。pub/sub 通信分为代理模式和非代理模式。典型的代理模式是MQTT 协议。发布者发布的消息通过一个代理服务器(Broker)转发给多个订阅者。

     代理服务器方式的PUB/SUB 使用存储转发的方式交换消息,显然不符合实时通信的要求。集中交换方式也不利于带宽均衡利于和可靠性。

     非代理方式Pub/Sub利用IP 网络的组播方式实现点对多点通信。通信协议为UDP 协议(在OPCUA中称为UADP)。适合实时通信的要求。目前在tsn网络上实现的OPC UA pub/sub 是非代理方式的 协议。

OPCUA Pub/Sub 机制 

 OPC UA Pub/Sub 与MQTT 的区别

        OPCUA Pub /Sub 机制主要是为分享数据而设计的。它的机制与MQTT 协议有区别。在MQTT中,应用程序需要发布消息时就发布一个消息。而OPCUA 的Pub/Sub机制则不同,它是由应用程序预先指定哪些变量需要发布,然后由pub/sub 机制自动地周期性发布数据。而且与视频通信类似,它分为关键帧和数据变化帧两种,关键帧是每一个变量都发布,而非数据变化帧只发送数据变化的变量。这种方式对应数据流传输无疑提高了可靠性。但是变量的重复发送,可能会使订阅的数据是重复的。这对于状态和事件变量可能会引发多次触发。在IEC61499 功能块网络的通信中,我们将事件变量和数据变量同时发送,由SUBSCRIBE 功能块判断事件是否发生变化。避免功能块重复执行。

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

  OPCUA Pub/Sub 可以发送多个数据源,它们是通过一组标识符(ID)来标注数据的。

发布一个消息 涉及下面几个组件:

  • connection
  • WriteGroup
  • DataSetWriter
  • DataSet

每个组件都有一个ID,订阅者要使用发布者的三个ID 来确定接收哪一种数据源,它们是:

  • PublisherID
  • WriteGroupID
  • DataSetWriterID

 所有PUBLISH 功能块ID定义:

ID=PublisherID.WriteGroupID.DataSetWriterID

SUBSCRIBE 功能块的ID定义为:

ID=PublisherID.WriteGroupID.DataSetWriterID

        订阅数据组读入器(DatReader)的PublisherID,WriteGroupID,DataSetWriterID要与发布者一致。

        一个Server 中可以定义多个WriterGroup,一个WriterGroup 中可以有多个DataSetWriter,

由于Pub/Sub 是基于UDP 组播方式的。所以SUBSCRIBER 可以接收:

  • 不同PublisherID 的消息
  • 相同PublisherID ,不同WriterGroupID 的消息
  • 相同WriterGroupID ,不同DataSetWriterID的消息

    如果考虑一个设备可以发送多个组播,情况更加复杂。目前我们没有考虑多个组播IP的情形。

在系统设计时,要规划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。 

关于pub/sub 的publish周期

OPCUA 的Pub/Sub 是一种周期发送的方法,它会在数据的生命周期中重复发送,这里有两个参数:

publishingInterval;
keepAliveTime;

        网络上多数人讲Interval 时间最小是1 ms ,其实不然,它是一个Double ,可以设为小数,我修改到0.25 发送的时间快了。

UA_NodeId
addWriterGroup(UA_Server *server,UA_NodeId connectionId,UA_UInt16 Id) {
	/* Now we create a new WriterGroupConfig and add the group to the existing
	* PubSubConnection. */
	UA_WriterGroupConfig writerGroupConfig;
	memset(&writerGroupConfig, 0, sizeof(UA_WriterGroupConfig));
	writerGroupConfig.name = UA_STRING((char*)"WriterGroup1");
	writerGroupConfig.publishingInterval =0.25;
	writerGroupConfig.keepAliveTime=4;
	writerGroupConfig.enabled = UA_TRUE;
	writerGroupConfig.writerGroupId = Id;
	writerGroupConfig.encodingMimeType = UA_PUBSUB_ENCODING_UADP;
	writerGroupConfig.messageSettings.encoding = UA_EXTENSIONOBJECT_DECODED;
	writerGroupConfig.messageSettings.content.decoded.type = &UA_TYPES[UA_TYPES_UADPWRITERGROUPMESSAGEDATATYPE];
		UA_UadpWriterGroupMessageDataType *writerGroupMessage = UA_UadpWriterGroupMessageDataType_new();
	writerGroupMessage->networkMessageContentMask = (UA_UadpNetworkMessageContentMask)(UA_UADPNETWORKMESSAGECONTENTMASK_PUBLISHERID |
		(UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_GROUPHEADER |
		(UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_WRITERGROUPID |
		(UA_UadpNetworkMessageContentMask)UA_UADPNETWORKMESSAGECONTENTMASK_PAYLOADHEADER);
	writerGroupConfig.messageSettings.content.decoded.data = writerGroupMessage;
	UA_NodeId writerGroupId;
	UA_Server_addWriterGroup(server, connectionId, &writerGroupConfig, &writerGroupId);
	UA_Server_setWriterGroupOperational(server, writerGroupId);
	UA_UadpWriterGroupMessageDataType_delete(writerGroupMessage);
return writerGroupId;
}

pub/sub 的这种机制会重复收到数据。在有些场合是不允许的。比如事件触发,不允许多次。可以通过功能块检测数据是否改变。

结论

人世间的任何事物一旦深入细节,就会发现一堆问题。但是不深入细节,什么都不是。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/925730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVE-2016-3088漏洞复现

1.背景介绍。 ActiveMQ的web控制台分三个应用,admin、api和fileserver,其中admin是管理员页面,api是接口,fileserver是储存文件的接口;admin和api都需要登录后才能使用,fileserver无需登录。 fileserver是…

解析跨境电商环境下的撸卡、撸货等业务运作模式

随着亚马逊在国内用户中的流行,越来越多的人做亚马逊测评自养号,作为一个传统的跨境电商平台,亚马逊上有许多进口商品可供购买,在购物过程中,有的是用信用卡下单,有的是用礼品卡下单,也会有一些…

CS144 计算机网络 Lab3:TCP Sender

前言 在 Lab2 中我们实现了 TCP Receiver,负责在收到报文段之后将数据写入重组器中,并回复给发送方确认应答号。在 Lab3 中,我们将实现 TCP 连接的另一个端点——发送方,负责读取 ByteStream(由发送方上层应用程序创建…

2023-08-25 LeetCode每日一题(统计二叉树中好节点的数目)

2023-08-25每日一题 一、题目编号 1448. 统计二叉树中好节点的数目二、题目链接 点击跳转到题目位置 三、题目描述 给你一棵根为 root 的二叉树,请你返回二叉树中好节点的数目。 「好节点」X 定义为:从根到该节点 X 所经过的节点中,没有…

低调大佬造车,扒一扒极石01

作者 | 普通一涛 编辑 | 德新 又一个汽车新品牌诞生了。 极石,是的,很多人没有听过。它不是传统汽车品牌,也不是传统主机厂成立的新品牌,而是一家新势力。 乍听名字,极字辈都是高端品牌家族——极狐、极星、极氪、极越…

广场小记

(1) 广场上有人唱卡拉ok: 女声唱的是:嫁人就要嫁给你 男声唱的是:我爱我的祖国 非常的50年代。 那一代人就是这么真挚、直接、热烈。 那一代人经历60大饥荒、66wg、68上山下乡、80回城个体户、90大下岗。16岁时的他们&…

正确进行自动化测试

前言: 📕作者简介:热爱编程的小七,致力于C、Java、Python等多编程语言,热爱编程和长板的运动少年! 📘相关专栏Java基础语法,JavaEE初阶,数据库,数据结构和算法…

惊!同事做汇报都开始卷大屏了,问了一嘴,这个工具小白最好上手

老陈最近出差,去上海的一个公司考察学习,在人家会议室听别人分享的时候,发现大家现在是真的卷,连个普通的汇报都搞了张可视化大屏,直接把公司的核心数据展现得明明白白,鼠标点哪亮哪,真的特别炫…

Effective C++条款16——成对使用new和delete时要采取相同形式(资源管理)

以下动作有什么错? std::string* stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序。使用了new,也搭配了对应的 delete。但还是有某样东西完全错误:你的程序行为不明确(未有定义)。最低限度&#xff…

水利部推荐的数字孪生水利建设典型案例介绍

2022年以来,水利部先后出台《数字孪生流域建设技术大纲(试行)》《数字孪生水网建设技术导则(试行)》《数字孪生水利工程建设技术导则(试行)》《水利业务“四预”基本技术要求(试行&a…

C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密

C# 实现 国密SM4/ECB/PKCS7Padding对称加密解密,为了演示方便本问使用的是Visual Studio 2022 来构建代码的 1、新建项目,之后选择 项目 鼠标右键选择 管理NuGet程序包管理,输入 BouncyCastle 回车 添加BouncyCastle程序包 2、代码如下&am…

iphone手机铃声怎么设置,4个步骤包您学会!

iPhone手机的铃声设置包括很多种,比如来电铃声、短信铃声、语音提醒铃声等等。设置一个动听的铃声也能使人心情愉悦,那么iPhone手机铃声怎么设置呢?还有,有些朋友喜欢将喜欢的音乐设置为铃声,那又该怎么做呢&#xff1…

百度AI智障到AI智能体验之旅

目录 前言一、百度PLATO1.抬杠第一名2.听Ta瞎扯淡3.TA当场去世了4.智障与网友的高光时刻 二、文心一言1.设计测试用例2.随意发问3.手机端约会神器 三、体验总结:四、千帆大模型 前言 最近收到了文心一言3.5大模型的内测资格,正巧之前也体验过它的前身&q…

yolov8实战之torchserve服务化:使用yolov8x来预打标

前言 最近在做一个目标检测的任务,部署在边缘侧,对于模型的速度要求比较严格(yolov8n这种),所以模型的大小不能弄太大,所以原模型的性能受限,更多的重点放在增加数据上。实测yolov8x在数据集上…

旺店通·企业版对接打通金蝶云星空订单查询接口与销售出库新增接口

旺店通企业版对接打通金蝶云星空订单查询接口与销售出库新增接口 数据源平台:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化智…

聚水潭与金蝶云星空对接集成库存盘点查询打通其他出库单新增V2

聚水潭与金蝶云星空对接集成库存盘点查询打通其他出库单新增V2 来源系统:聚水潭 聚水潭是SaaS协同平台、电商ERP软件。聚水潭成立于2014年,创始人兼CEO骆海东拥有近三十年传统及电商ERP的研发和实施部署经验。聚水潭创建之初,以电商SaaSERP切入市场&…

机器学习算法示例的收集;MetaAI编码工具Code Llama;“天工AI搜索”首发实测

🦉 AI新闻 🚀 Meta推出新一代AI编码工具Code Llama,助力程序员提高开发效率 摘要:Meta推出Code Llama,这是一个基于Llama 2语言模型打造的AI编码工具,能够生成新的代码并调试人类编写的工作。Code Llama可…

【Go Web 篇】Go 语言进行 Web 开发:构建高性能网络应用

随着互联网的快速发展,Web 开发已经成为了软件开发领域中不可或缺的一部分。随之而来的是对于更高性能、更高效的网络应用的需求。在这个领域,Go 语言因其并发性能、简洁的语法以及丰富的标准库而备受关注。本篇博客将深入探讨如何使用 Go 语言进行 Web …

linux入门详解

文章目录 一、引言1.1 开发环境1.2 生产环境1.3 测试环境1.4 操作系统的选择 二、Linux介绍2.1 Linux介绍2.2 Linux的版本2.3 Linux和Windows区别 三、Linux安装3.1 安装VMware3.2 安装Xterm3.3 在VMware中安装Linux3.3.1 选择安装方式3.3.2 指定镜像方式3.3.3 选择操作系统类型…

springboot设置文件上传大小,默认是1mb

问题排查和解决过程 之前做了个项目,需要用到文件上传,启动项目正常,正常上传图片也正常,但这里图片刚好都小于1M,在代码配置文件里面也写了配置,限制大小为500M,想着就没问题(测试…