OPCUA探讨(五)——客户端代码解读:监控变量值与报警

news/2025/11/21 18:26:53/文章来源:https://www.cnblogs.com/gongzuoquan/p/19253396

本系列文章:
OPCUA 探讨(一)——测试与开发环境搭建
OPCUA 探讨(二)——服务器节点初探
OPCUA 探讨(三)——客户端代码解读:基本配置与会话连接
OPCUA 探讨(四)——客户端代码解读:浏览服务器节点树
OPCUA 探讨(五)——客户端代码解读:监控变量值与报警

前文中我们探讨了如何浏览OPCUA服务器上的节点以及如何获取节点详细信息。
OPCUA 探讨(四)——客户端代码解读2
该项目源码地址:https://gitee.com/zuoquangong/opcuaapi

本文我们将讨论如何实现服务器节点监控(monitor)功能。
这个功能可以实现变量值的定时自动刷新,不需要写循环和定时器。但是相比于读取功能,这个功能使用频率不高,因为其机制相对复杂,第三方开发的数据采集平台通常不会调用这个功能。

监控值

其刷新时间的最小值受OPCUA服务器端制约,对于Sinumerik828D而言,最小时间间隔为100ms(0.1秒),而且在该间隔下,最多能监控的变量数也有限制,通常为一百余个(和服务器版本有关),具体情况可以自行测试。

除了监控变量值,该功能还能用于监控数控系统的报警信息:

报警监控

一、关于“监控”功能的三层结构

在实现该功能之前,我们要意识到OPCUA内部存在如下的三层关系结构:

capture_251121_135531

客户端内可以建立多个会话(Session),每个会话可以创建多个订阅(Subscription),每个订阅里可以添加多个监控项目(MonitoredItem)。
以下是一个示例:
capture_251121_144149

二、订阅(Subscription)

2.1 创建订阅

实现监控的前提是在已有会话(Session)中创建订阅(Subscription)。主要是创建一个订阅类实例,然后调用会话类的成员方法AddSubscription进行添加。

/// <summary>
/// 创建一个订阅
/// </summary>
/// <param name="name">订阅名称</param>
/// <returns></returns>
public Opc.Ua.Client.Subscription CreateNewSubscription(string name="")
{if (current_session == null || Connected==false)return null;//new一个新的订阅subscriptionOpc.Ua.Client.Subscription new_subscription = new Opc.Ua.Client.Subscription();try{//current_subscription = new Opc.Ua.Client.Subscription(current_session.DefaultSubscription);//给订阅的基本参数赋值if(name==""){new_subscription.DisplayName = "Subscription" + DateTime.Now;}else{new_subscription.DisplayName = name;}new_subscription.PublishingEnabled = true;new_subscription.PublishingInterval = PublishingInterval;//把订阅加入当前会话sessioncurrent_session.AddSubscription(new_subscription);//在服务器端创建订阅new_subscription.Create();}catch( Exception ex ){return null;}return new_subscription;
}

2.2 删除订阅

获取到要删除的会话实例,调用会话类的成员方法RemoveSubscription进行删除。

/// <summary>
/// 删除某一订阅
/// </summary>
/// <param name="subscription">要删除的订阅实例</param>
public void DeleteSubscription(Opc.Ua.Client.Subscription subscription)
{current_session.RemoveSubscription(subscription);return;
}

三、监控与监控项(MonitoredItem)

3.1 创建变量值监控

创建好订阅之后,可以在其中建立监控项目(MonitoredItem),关键是确定监控目标节点的ID(NodeId),这个信息可以通过浏览功能获取。基本流程就是创建MonitoredItem实例,设置好其属性,然后调用已有订阅的成员方法AddItem把该监控项加入订阅,然后执行订阅的另一个成员方法ApplyChanges,完成变更。

/// <summary>向一个已有订阅中添加监控项</summary>
/// <param name="subscription">指定的订阅,将包含该监控项</param>
/// <param name="nodeIdString">监控目标节点的ID</param>
/// <param name="itemName">添加的项的名称</param>
/// <param name="samplingInterval">采样间隔</param>
/// <returns>被添加的项</returns>
/// <exception cref="Exception">Throws and forwards any exception with short error description.</exception>
public MonitoredItem AddMonitoredItem(Subscription subscription,string nodeIdString, string itemName, int samplingInterval, MonitoredItemNotificationEventHandler Notification_MonitoredItem)
{//创建一个监控项MonitoredItem monitoredItem = new MonitoredItem();//设置项目的名称,以便稍后分配项目和值;确保名称的不同monitoredItem.DisplayName = itemName;//设置监控项所监控节点的节点IDmonitoredItem.StartNodeId = nodeIdString;//设置所监控的节点属性(此处监控的是节点的值)monitoredItem.AttributeId = Attributes.Value;//设置报告模式(reporting mode)monitoredItem.MonitoringMode = MonitoringMode.Reporting;//设置采样间隔 (1 = 尽可能快)monitoredItem.SamplingInterval = samplingInterval;//设置队列长度monitoredItem.QueueSize = 1;//是否在接收到新项时抛弃最老的项monitoredItem.DiscardOldest = true;//设置通知时间处理函数monitoredItem.Notification += new MonitoredItemNotificationEventHandler(Notification_MonitoredItem);//以上,监控项内容设置完毕//将监控项加入指定订阅subscription.AddItem(monitoredItem);//应用变动subscription.ApplyChanges();return monitoredItem;
}

上述代码第 20 行有monitoredItem.AttributeId = Attributes.Value;,意味着这里监控的属性是变量值,其他诸如节点ID(NodeId)、节点类(NodeClass)、浏览名称(BrowseName)、展示名称(DisplayName)、描述(Description)等属性也可监控,但是很明显变量值才会实时变动,其他属性通常不会发生变化。

3.2 创建事件监控

除了变量值监控之外,另一个很重要的监控就是事件监控,它与我们数控系统的报警信息监控息息相关。在西门子Sinumerik数控系统里,报警信息可以通过事件监控的方式获取。

/// <summary>向一个已有订阅中添加事件监控项</summary>
/// <param name="subscription">指定的订阅,将包含该监控项</param>
/// <param name="nodeIdString">监控目标节点的ID</param>
/// <param name="itemName">添加的项的名称</param>
/// <param name="samplingInterval">采样间隔</param>
/// <returns>被添加的项</returns>
/// <exception cref="Exception">Throws and forwards any exception with short error description.</exception>
public MonitoredItem AddEventMonitoredItem(Subscription subscription, string nodeIdString, string itemName, int samplingInterval, MonitoredItemNotificationEventHandler Notification_MonitoredItem)
{//创建一个监控项MonitoredItem monitoredItem = new MonitoredItem();//设置项目的名称,以便稍后分配项目和值;确保名称的不同monitoredItem.DisplayName = itemName;//设置监控项所监控节点的节点IDmonitoredItem.StartNodeId = nodeIdString;//设置所监控的节点属性//注意,这里的属性是“事件通知器”monitoredItem.AttributeId = Attributes.EventNotifier;//设置报告模式(reporting mode)monitoredItem.MonitoringMode = MonitoringMode.Reporting;//设置采样间隔 (1 = 尽可能快)//monitoredItem.SamplingInterval = samplingInterval;//设置队列长度monitoredItem.QueueSize = 1000;//是否在接收到新项时抛弃最老的项monitoredItem.DiscardOldest = true;//设置通知时间处理函数monitoredItem.Notification += new MonitoredItemNotificationEventHandler(Notification_MonitoredItem);EventFilter filter = new EventFilter();//添加过滤子语,以筛选需要的事件内部信息,包含://"事件节点ID","事件类型","源节点", "事件源", "事件发生时间", "事件接收时间",//"信息", "严重程度", "保持状态", "激活状态"filter.AddSelectClause(ObjectTypeIds.ConditionType, string.Empty, Attributes.NodeId); //事件节点IDfilter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.EventType); //事件类型filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.SourceNode); //源节点filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.SourceName); //事件源filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.Time); //事件发生时间filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.ReceiveTime); //事件接收时间filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.Message); //事件信息filter.AddSelectClause(ObjectTypes.BaseEventType, BrowseNames.Severity); //严重程度filter.AddSelectClause(ObjectTypeIds.ConditionType, BrowseNames.Retain); //保持状态filter.AddSelectClause(ObjectTypeIds.AlarmConditionType, "0:ActiveState/Id", Attributes.Value); //激活状态monitoredItem.Filter = filter; //为监控项添加事件内容过滤器//以上,监控项内容设置完毕//将监控项加入指定订阅subscription.AddItem(monitoredItem);//应用变动subscription.ApplyChanges();return monitoredItem;
}

上述代码中原本的Attributes.ValueAttributes.EventNotifier代替,即监控的属性不再是变量值,而是所谓“事件通知器”。
在Sinumerik系统中,如果想要监控到数控系统报警事件,需要对Object节点下的Sinumerik节点进行事件监控。

capture_251121_164205
在我们的实例中可以实现简单的报警信息监控:

capture_251121_180956

总结

本文介绍了如何实现服务器节点监控(monitor)功能,包括变量值监控、事件监控。
下一步将介绍OPCUA的文件操作功能,即利用OPCUA对西门子Sinumerik数控系统中的加工文件进行传输、读写等操作。

*附言

由于作者水平有限,可能在文章中出现错误或不当描述,如有发现此类情况希望您能及时提供反馈,非常感谢!
如果感觉本文对您有所帮助,希望为文章点个推荐,谢谢。
作者联系方式,163邮箱:zuoquangong@163.com;微信:gongzq1414213

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

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

相关文章

2025 年度中国截止阀十大品牌推荐:绿色智造 + 特种工况突破,引领行业高质量发展

2025 年,随着 “双碳” 战略深入推进与高端制造业升级,截止阀作为流体系统的 “控制中枢”,其应用场景正加速向大口径、高压力、超低温、耐腐蚀等苛刻工况延伸,同时绿色智造、数字化运维与全生命周期质量管控成为行…

修改DTS适配遥控用户码

在将该DTS文件提交到Kernel后,若需适配遥控用户码,需修改 红外遥控(remote-controller)相关节点配置,具体对应DTS中的 pwm@ff420030 节点(RK3399常见红外遥控驱动节点),以下是具体修改位置及步骤: 一、定位需…

nginx性能优化之tcp调优

本文分享自天翼云开发者社区《nginx性能优化之tcp调优》.作者:江****禄 nginx在tcp连接上有2个如下配置:tcp_nodelay on , tcp_nopush off。这两个配置在tcp连接中的具体原理如何呢?在网络拥塞控制领域,我们知道有…

2025年11月安徽聚乙烯瓶、高阻隔瓶、聚酯瓶、农药瓶供应商排行榜:安徽金汇龙包装领跑行业

摘要 2025年农药包装行业迎来技术升级浪潮,随着环保政策收紧和智能制造的推进,农药瓶供应商面临新的机遇与挑战。本文基于市场调研数据和技术参数分析,为您呈现2025年11月农药瓶供应商综合排名,并提供详细对比表单…

2025年11月中国/安徽/聚乙烯瓶、高阻隔瓶、聚酯瓶、农药瓶厂家TOP10推荐:安徽金汇龙包装强势登顶

摘要 随着农药包装行业标准化进程加速,2025年聚乙烯瓶市场需求持续增长,行业技术门槛显著提升。本文基于生产工艺、质量控制、研发能力等维度,对全国聚乙烯瓶生产企业进行综合评估,为农药生产企业提供供应商选择参…

rich dataset 3D人体场景数据集

https://rich.is.tue.mpg.de/download.php

ICPC2025沈阳打铁日志

11.14坐飞机出发了,到沈阳挺晚了还尝了大油边。 11.15下午他们在打省赛,所以热身赛调到晚上了,午饭吃的餐票(味道一般,重点是菜的种类太少了,就十多个),衣服是绿马甲,我和y都不太合身,投壶好难,队长中5个,后…

UModel 数据治理:运维世界模型构建实践

阿里云推出 UModel 统一建模框架,将实体、关系、数据、知识、行动融为一体,为大模型提供可推理、可交互的运维世界模型,推动可观测从‘被动响应’迈向‘主动优化’的新阶段。作者:元乙 点击此处,观看视频解读! 从…

【springboot】 WebMvcConfigurer的使用

org.springframework.web.servlet.config.annotation.WebMvcConfigurer 的使用 一、基本概念 WebMvcConfigurer 接口提供了一组回调方法,用于配置 Spring MVC 的各种方面,如视图解析器、拦截器、跨域请求、消息转换器…

2025年11月21日

2025年11月21日class Solution { public:int singleNumber(vector<int>& nums) {int ans=0;for(int i:nums){ans=ans^i;}return ans;} };

实用指南:一文搞懂 DeepSeek API:兼容 OpenAI 接口的智能对话模型调用指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

形容词Test

1.Stamp-collecting can be enjoyed by the rich ad the poor alike. stamp n.邮票 can be enjoyed:can 情态动词,后接原型。is enjoyed 一般现在时的被动语态。alike:同样地(deepseek说alike在这里是副词,修饰by…

James Watsons

the high IQ happens when an East Asian but knows English. its just some B just knows 26 English.

2025年11月江苏/徐州vr设备、vr体验馆、5d影院、9d影院、拓普互动厂家推荐榜:拓普互动强势登顶

摘要 2025年9D影院行业迎来爆发式增长,技术革新和市场需求双重驱动下,品牌竞争日趋激烈。本文基于市场调研数据、技术参数对比和用户反馈,为您呈现2025年11月最具竞争力的9D影院品牌排行榜。本榜单旨在为投资者、采…

计算机网络:物理层 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月中国/江苏/徐州vr设备、vr体验馆、5d影院、9d影院、拓普互动厂家TOP10:拓普互动领跑榜单

摘要 2025年9D影院行业迎来爆发式增长,技术创新与市场需求双重驱动下,行业竞争格局逐渐清晰。本文基于市场调研数据、用户反馈和专业技术评测,为您呈现2025年11月最具实力的9D影院品牌排行榜,为投资决策提供参考依…

MongoDB 平替新方案:金仓多模数据库驱动电子证照国产化落地 - 详解

MongoDB 平替新方案:金仓多模数据库驱动电子证照国产化落地 - 详解2025-11-21 18:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !…

高考数学如何有效提分?一位家长关于分阶段选择数学老师的心得体会

作为一名曾为孩子数学成绩发愁的高三家长,我深知在冲刺阶段找到一位好老师的重要性。我的孩子就是从70分以下起步,在有道领世几位老师的接力指导下,成绩稳步提升。下面我将结合我们的亲身经历,为你介绍三位风格迥异…

最佳加密货币钱包选择指南:企业级安全与功能全解析

本文详细介绍了五种顶级加密货币钱包的特点和优势,包括NOWPayments、Coinbase、Ledger Nano X等,深入分析冷钱包与热钱包的安全差异,帮助企业根据安全需求和易用性选择最适合的数字资产管理方案。最佳加密货币钱包:…

让 Maven 能找到本地 JAR 而无需把它上传到公共仓库:

让 Maven 能找到本地 JAR 而无需把它上传到公共仓库:可以这样处理,让 Maven 能找到本地 JAR 而无需把它上传到公共仓库: 安装到本地仓库(推荐)先确认 JAR 在项目根 lib/aspose-words-16.4.0-jdk16.jar。执行命令(…