缘起

将open62541作为中间件使用代替自定义数据的RPC,client通过订阅valueChange来接收数据。使用时发现有一些问题:

  1. 前后两次产生的数据相同时,不会触发valueChange
  2. 如果数据更新较快,client会漏掉其中一些数据

探索

问题1:

  其实不是问题,这是opcua的属性,valueChange是根据采样(sample)来生成的,并不是server执行了writeValue就会触发事件。只能说这种模式不适合这种每次server产生结果都需要client响应的需求。(有一个小问题,是如何快速判断数值变化的?基本类型可以判断是否和原始数据不相等,对于复杂数据,如图片,逐字节比对?)

问题2:

  还是和采样模式相关,如果在两次采样之间数据多次变化是没办法感知的。那就修改采样频率:采样频率同时受server和client的影响,server决定范围,client在范围内决定最终结果。如果client设定为0,则采用server能实现的最快频率。

心生一计

  改进方式是将结果通过event发送,设置为report模式。数据内容自己填充,相同的数据也不会被过滤掉;主动report,脱离采样的限制(但响应时间还是受publish间隔的约束)。

  event一般是简单消息的通知,承载传递数据的用法不算主流,或许能说明opcua的灵活性吧,不知道这是否存在潜在缺陷。这种模式和pub-sub很类似,不同点在于pub-sub利用的是udp的多播,event还是在server-client的形态下。pub-sub就是为实时性的需求设计的(类似dds),如果只是发送数据,pub-sub会更适合。

  使用event基本能满足需求,但是响应的速度还是不够快。网络上查询说是opcua实时性只能到100ms左右,对于目前应用来说,时间上达不到要求。实际测试发现,publish间隔是关键因素,和sample一样,server决定范围,client决定最终结果。将publish间隔设置到1ms,从server发送event到client接收的延迟终于能达标。官方建议不能低于5ms,但测试设置到0也没什么副作用,一开始考虑可能会cpu空转高占用,但并没有。

小插曲

  在测试过程中发现在windows平台下,当publish间隔设置为1ms时,本地回环网络还是会有16ms左右的延迟,相同代码在ubuntu下延迟可以稳定在1ms以内。一度为此纠结了很久,一度想换pub-sub甚至dds。后来用asio进行单纯的tcp数据传输测试发现也会有相同的延迟,才确认这是平台的原因(电脑个体差异,待验证?)。Windows下的网络效率不如linux有耳闻,但差距有这么大吗?

补充

    在使用qtopcua作为client的过程中,设置相同的参数(publish间隔通过QOpcUaMonitoringParameters设置),还是会有50-60ms的延迟。网上遍寻无果,官方文档不够详细(qtopcua只包含在收费嵌入式的开发套件中,不知道交钱的文档有没有详细些)。最后无奈啃起qtopcua的源码,收获如下:opcua client执行迭代(UA_Client_run_iterate)才会响应event,qt是一个异步的库,qtopcua通过定时器来执行迭代,默认的超时时间就是50ms。通过QOpcUaProvider创建QOpcUaClient时,将超时时间设置放在backendProperties。正确的设置方式如下:

auto client = QOpcUaProvider::createClient("open62541",  QVariantMap({"clientIterateIntervalMs", 1}));

    server设置sample和publish的间隔范围方式如下:

auto config = UA_Server_getConfig(server);
config->publishingIntervalLimits = UA_DurationRange{1.0, 24 * 60 * 60 * 1000};
config->samplingIntervalLimits = UA_DurationRange{1.0, 24 * 60 * 60 * 1000};

    client设置publish间隔的方式如下:

auto request = UA_CreateSubscriptionRequest_default();
request.requestedPublishingInterval = 1.0;

open62541(opcua)传输延迟探索小记的更多相关文章

  1. JS原型探索小记(一)

    最近,我学习了jquery的源码,有个很深的认识就是——当对js的基本语法和面向对象思维了解比较熟悉之后,js真正的精髓在通过阅读一些优秀的框架源码也显现出来,我个人总结为对原型(原型链)和闭包两个基 ...

  2. 【转】实习小记-python 内置函数__eq__函数引发的探索

    [转]实习小记-python 内置函数__eq__函数引发的探索 乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, othe ...

  3. 实习小记-python 内置函数__eq__函数引发的探索

    乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, other): # 不论发生什么,只要有==做比较,就返回True ... ...

  4. 基于open62541的opc ua 服务器开发实现(1)

    关于opcua的介绍这里就不多说了,相信大家大都有了一些了解,open62541是一个开源C(C99)的opc-ua实现,开源代码可在官网或github上下载. 话不多说,首先搭建一个opcua服务器 ...

  5. python工业互联网监控项目实战5—Collector到opcua服务

    本小节演示项目是如何从连接器到获取Tank4C9服务上的设备对象的值,并通过Connector服务的url返回给UI端请求的.另外,实际项目中考虑websocket中间可能因为网络通信等原因出现中断情 ...

  6. 【探索】机器指令翻译成 JavaScript

    前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...

  7. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  8. 探索C#之6.0语法糖剖析

    阅读目录: 自动属性默认初始化 自动只读属性默认初始化 表达式为主体的函数 表达式为主体的属性(赋值) 静态类导入 Null条件运算符 字符串格式化 索引初始化 异常过滤器when catch和fin ...

  9. Mysql事务探索及其在Django中的实践(二)

    继上一篇<Mysql事务探索及其在Django中的实践(一)>交代完问题的背景和Mysql事务基础后,这一篇主要想介绍一下事务在Django中的使用以及实际应用给我们带来的效率提升. 首先 ...

随机推荐

  1. Outlook配置163邮箱

    一.在163邮箱设置处设置POP3/SMTP/IMAP 二.开启客户端授权码 三.打开Outlook,选择手动设置 选择POP/IMAP 密码是上文中的授权码 点击其它设置,勾选以下选项 点击完成即可

  2. 案例分享:Qt+Arm基于RV1126平台的内窥镜软硬整套解决方案(实时影像、冻结、拍照、录像、背光调整、硬件光源调整,其他产品也可使用该平台,如视频监控,物联网产品等等)

    自研产品系列方案   1. 基于瑞芯微的 RV1126 芯片平台:  2. 外接 USB 摄像头(OV9734. OV6946.OV2740 等 UVC 模块)作为图像输入源:  3. 可通过 LED ...

  3. 一文读懂k8s rbac 权限验证

    自我认为的k8s三大难点:权限验证,覆盖网络,各种证书. 今天就说一下我所理解的权限验证rbac. 咱不说rbac0,rbac1,rbac2,rbac3.咱就说怎么控制权限就行. 一.前言 1,反正R ...

  4. 排列组合的实现(js描述)

    组合的实现 排列组合描述和公式 犹记得高中数学,组合表示C(m, n),意思为从集合m,选出n个数生成一项,总共有多少个项的可能?组合是无序的,排列是有序的.所以排列的项数量多于组合 排列A(n,m) ...

  5. linux下系统时间和时钟时间

    linux中有关系统时间.时钟时间的命令: 1显示系统时间的命令 ># date 2显示时钟时间的命令 ># clock或hwclock 3系统时间与互联网同步的命令 ># ntpd ...

  6. 上手Coc.nvim 完全指南

    上手Coc.nvim 完全指南 介绍 Coc.nvim 是一个基于NodeJS 的适用于Vim8, Neovim 的Vim 智能补全插件. 拥有完整的LSP 支持.配置.使用方式及插件系统的整体风格类 ...

  7. 微信小程序创建第一个项目

    一.打开微信开发者工具,扫码登录 二.点击右侧的加号,添加小程序 第三步:创建成功后,报错 VM82:1 cloud init error: Error: invalid scope 没有权限,请先开 ...

  8. 微信小程序账号注册

    想要开发微信小程序,先注册账号申请APPID. 第一步:百度搜索"微信公众平台" 第二步:立即注册 进入注册页面 区别: 订阅号: 订阅号在文件夹里,订阅号消息 一天只能推送一次, ...

  9. Flask 之linux部署

    1.装python > `[root ~]# yum install gcc [root ~]# wget https://www.python.org/ftp/python/3.6.5/Pyt ...

  10. 「GM_脚本」获取 GitHub 项目文件的 jsDelivr CDN 地址「好像没啥用系列」

    基本信息: name:「 GitHub 」获取文件的 jsDelivr 地址 desc:获取项目文件的 CDN 地址 url: https://github.com/wdssmq/userscript ...