进阶07:C#与通用OPC UA通信范例

本节目标:

1)安装软件,搭建虚拟OPC UA服务器;

2)使用UaExpert,读取OPC UA服务器中的变量;

3)编写Winform程序,读写服务器中变量值,创建订阅触发事件;

下图是根据上面的要求最终的运行结果,可以读写PLC寄存器,OPC UA Simulation Server中的Trigger值变化会主动触发一个显示变化后值的弹窗。

1.1 环境配置

下载两个软件:OPC UA Simulation Server 和 UaExpert

Prosys OPC UA Simulation Server

OPC UA Clients - Unified Automation

1.1.1 OPC UA Simulation Server

1)安装完成后,打开软件OPC UA Simulation Server

选择专家模式

2)新建变量Trigger

3)设置匿名登录

设置完成后重启软件。

1.1.2 UaExpert使用

1)打开UaExpert,此为OPC客户端,用于测试服务器

点击加号

2)创建连接

输入URL,这个是根据前面的虚拟服务器定的。

选择匿名登录

3)连接

4)将变量拉入到显示界面处。

可以看到变量的值,同时也可以修改值。后面需要根据上面的Node Id来进行编程。

1.2 编程

新建Winform项目,OpcUaClient_example。

思维导图如下:

1.2.1 界面设计

4个TextBox(txtServerUrl、txtNode、txtReadData、txtWriteData);

3个按钮(btn_Connect、btn_Read、btn_Write);

5个Label(显示状态lblStatus);

1.2.2 程序设计

主界面的程序流程图如下所示:

1)添加依赖包

项目->管理NuGet程序包,输入OpcUaHelper,下载依赖包。

2)添加命名空间

using Opc.Ua; 
using Opc.Ua.Client; 
using OpcUaHelper;

3)变量

//实例化
OpcUaClient m_OpcUaClient = new OpcUaClient();

4)连接按钮事件

private async void btnConnect_Click(object sender, EventArgs e)
{if (btn_Connect.Text == "Connect"){m_OpcUaClient.UserIdentity = new UserIdentity(new AnonymousIdentityToken());//匿名链接try{await m_OpcUaClient.ConnectServer(txtServerUrl.Text.ToString());//链接服务器m_OpcUaClient.AddSubscription("AA", "ns=3;s=Trigger", SubCallback);//订阅节点,值变化即触发事件lblStatus.Text = "连接成功!";}catch (Exception ex){ClientUtils.HandleException("Connected Failed", ex);}btn_Connect.Text = "Disconnect";}else{m_OpcUaClient.RemoveSubscription("AA");//取消订阅m_OpcUaClient.Disconnect();//断开连接lblStatus.Text = "断开连接!";btn_Connect.Text = "Connect";}}

5)订阅回调函数

private void SubCallback(string key, MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs args)
{if (InvokeRequired){Invoke(new Action<string, MonitoredItem, MonitoredItemNotificationEventArgs>(SubCallback), key, monitoredItem, args);return;}if (key == "AA"){// 如果有多个的订阅值都关联了当前的方法,可以通过key和monitoredItem来区分MonitoredItemNotification notification = args.NotificationValue as MonitoredItemNotification;if (notification != null){MessageBox.Show("Trigger变量值变化:"+notification.Value.WrappedValue.Value.ToString()); //获取变化的值}}
}

6)读取按钮事件

private void btnRead_Click(object sender, EventArgs e)
{try{double value = m_OpcUaClient.ReadNode<double>(txtNode.Text);//读取单个节点值txtReadData.Text = value.ToString();}catch (Exception ex){ClientUtils.HandleException(this.Text, ex);}
}

7)写入按钮事件

private void btnWrite_Click(object sender, EventArgs e)
{try{m_OpcUaClient.WriteNode(txtNode.Text, Convert.ToDouble(txtWriteData.Text));//写入单个节点值}catch (Exception ex){ClientUtils.HandleException(this.Text, ex);}
}

1.3 运行

编译完成后,运行程序。点击Connect按钮,连接OPC UA服务器完成。

分别点击写入和读取按钮,可以看到OPC UA Simulation Server的Random值在变化。

在OPC UA Simulation Server修改Trigger的值,winform程序会弹窗,显示修改后的值。

该节展现的内容是通用OPC UA的连接、读写、事件订阅等功能的展示,可以作为需要OPC通讯集成项目的参考。

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

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

相关文章

大模型微调学习笔记(基于讯飞星辰MaaS速学版)

文章目录参考资料说明大模型微调入门微调简介微调步骤数据准备模型选择训练方式效果评估模型部署大模型微调&#xff08;基于讯飞星辰Maas&#xff09;构建数据集方法1&#xff1a;预置数据集方法2&#xff1a;创建数据集数据辅助工具数据集划分模型微调数据配置参数配置模型部…

[CSS]让overflow不用按shift可以滚轮水平滚动(纯CSS)

前言 我不爽前端无法直接滚轮横向滚动很久了 明明浏览器可以直接判断 x滚动且y不滚动的时候滚轮事件可以直接操作横向滚动 这个是我探究出来的方法,尤其适合这种很多很多小tag的情况解析 原理是将竖向排列的overflow旋转成横向,实际操作的还是竖向overflow.继而实现鼠标滚轮不用…

截稿倒计时 TrustCom‘25大会即将召开

会议资讯IEEE TrustCom-2025&#xff08;第24届IEEE计算与通信领域信任、安全与隐私国际会议&#xff09;是一个展示可信计算、通信、网络和机器学习领域前沿成果的学术平台。会议聚焦计算机系统、网络及人工智能在信任、安全、隐私、可靠性、可依赖性、生存性、可用性和容错性…

Day4.AndroidAudio初始化

1.AudioServer初始化 AudioServer 是 Android 音频系统的核心服务&#xff0c;负责管理音频硬件资源、音频策略调度、跨进程音频通信等核心功能。它由 Init 进程启动&#xff0c;是系统核心服务之一&#xff0c;直接影响音频播放、录音、音效处理等功能的正常运行。 1.1AudioSe…

OSPF 协议(多区域)

1. OSPF 单区域存在的问题① LSDB庞大&#xff0c;占用内存大&#xff0c;SPF计算开销大&#xff1b;② LSA洪泛范围大&#xff0c;拓扑变化影响范围大&#xff1b;③ 路由不能被汇总&#xff0c;路由表庞大&#xff0c;查找路由开销大。2. OSPF 多区域优点① 每个区域独立存储…

R 语言绘制六种精美热图:转录组数据可视化实践(基于 pheatmap 包)

在转录组 Bulk 测序数据分析中&#xff0c;热图是展示基因表达模式、样本聚类关系的核心可视化工具。一张高质量的热图不仅能清晰呈现数据特征&#xff0c;更能提升研究成果的展示效果。本文基于 R 语言的pheatmap包&#xff0c;整理了六种适用于不同场景的热图绘制方法&#x…

图片PDF识别工具:扫描PDF文件批量OCR区域图识别改名,识别大量PDF区域内容一次性改名

以下是使用“咕嘎批量OCR识别图片PDF多区域内容重命名导出表格系统”进行操作的具体步骤&#xff1a;1. 打开工具并获取区域坐标打开软件后&#xff0c;选择“PDF识别模式”。导入一个PDF文件作为样本&#xff0c;框选需要提取文字的区域&#xff0c;并保存区域坐标。如果有多个…

中国汽车能源消耗量(2010-2024年)

1419中国汽车能源消耗量&#xff08;2010-2024年&#xff09;发文主题分布数据来源中华人民共和国工业和信息化部-中国汽车能源消耗量查询中国汽车能源消耗量查询 (miit.gov.cn)时间跨度2010-2024年数据范围全国汽车企业数据指标本数据集包含包含传统汽车能源消耗量数据以及新能…

Python 实现服务器自动故障处理工具:从监控到自愈的完整方案

在服务器运维过程中,80% 的故障都是重复性的简单问题(如磁盘空间不足、内存泄漏、服务进程挂掉等)。本文将介绍如何使用 Python 开发一款轻量级自动故障处理工具,通过状态监控、异常诊断、自动修复三个核心模块,实现服务器常见故障的无人值守处理。 核心依赖库 psutil:跨…

图片上传 el+node后端+数据库

模版部分&#xff1a;鼠标悬浮到头像的部分就出现下拉框显示可以修改头像&#xff0c;el-upload是隐藏的&#xff0c;可能只是为了实现on-change函数和before-upload函数吧这块做的确实有点马虎了。<div class"r-content"><el-dropdown><span class&q…

[java 常用类API] 新手小白的编程字典

目录 1.API 1.1定义: 2.Object类 2.1 toString() 方法 2.2 equals() 方法 3. Arrays 类 3.1 equals() 方法 3.2 sort() 方法 3.2.1排序 3.2.2 自定义对象排序 3.3 binarySearch() 方法 3.4 copyOf() 方法 3.5 fill() 方法 3.6 toString() 方法 4.基本数据类型包装类 4.…

去除视频字幕 2, 使用 PaddleOCR 选取图片中的字幕区域, 根据像素大小 + 形状轮廓

有人问我在搞什么&#xff1a;就是做这里的第2步。问题描述这里误导&#xff0c;误判&#xff0c;太严重了。如果我把这个区域当做是 mask ,那么真正的目标会被去除掉还有什么建议吗&#xff1f;比如我能否根据这个mask 的大致形状来判断它是不是字幕&#xff0c; 如果不是细长…

Ubuntu 连接Visual SVN

Windows服务器上的svn仓库为&#xff1a; https://ldw_online:8443/svn/OnlineRepository/LVC IP地址为192.168.8.8 4. 从 Ubuntu 测试连通性 在 Ubuntu 上可以用&#xff1a; bash 复制编辑 curl -vk https://192.168.8.8:8443/ 如果返回 HTTP 头或 SSL 握手成功&#xff…

JAVA:Spring Boot 集成 Protobuf 的技术指南

🚀 1、简述 在分布式服务通信中,数据序列化与反序列化的效率对系统性能影响极大。Protocol Buffers(Protobuf) 是由 Google 提出的一种高效的结构化数据序列化协议,具有: 🔥 高性能(远优于 JSON/XML) 📦 跨语言支持 📉 较小的体积 本篇将带你了解如何在 Spring…

SQLServer内存释放工具介绍:一款实用的数据库性能优化助手

SQLServer内存释放工具介绍&#xff1a;一款实用的数据库性能优化助手 去发现同类优质开源项目:https://gitcode.com/ 在数据库管理中&#xff0c;内存释放是优化服务器性能的重要环节。本文将为您详细介绍一款名为SQLServer内存释放工具的开源项目&#xff0c;帮助您轻松管理…

《蓝耘容器全栈技术指南:企业级云原生与异构计算实战大全》

&#x1f31f; 嗨&#xff0c;我是Lethehong&#xff01;&#x1f31f; &#x1f30d; 立志在坚不欲说&#xff0c;成功在久不在速&#x1f30d; &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞⬆️留言收藏&#x1f680; &#x1f340;欢迎使用&#xff1a;小智初学计…

计算器3.0:实现用户自定义组件

前言&#xff1a; 马总给我提出计算器3.0新需求&#xff1a;可以在页面上输入一个组件&#xff0c;用户的组件库里面就多一个组件&#xff0c;用户就可以使用 一、解决方法&#xff1a; 1. 新增成员变量和初始化 // 新增的输入框 private InputBox newInputBox; // 新增的组…

PIG AI 全新升级:全新 MCP 能力加持,让企业级 AI 开发效率翻倍!

你是否曾为 AI 应用的开发门槛而头疼?调试代码耗费数小时、集成外部工具需要复杂配置、想要快速构建智能系统却不知从何下手…别担心!PIG AI 最新版本带来的 MCP(Model Context Protocol)能力,正为这些问题提供一站式解决方案。本文将带你深入浅出地了解这一重磅升级,手把…

Springboot+vue超市管理系统的设计与实现

文章目录前言详细视频演示具体实现截图后端框架SpringBoot前端框架Vue持久层框架MyBaits成功系统案例&#xff1a;代码参考数据库源码获取前言 博主介绍:CSDN特邀作者、985高校计算机专业毕业、现任某互联网大厂高级全栈开发工程师、Gitee/掘金/华为云/阿里云/GitHub等平台持续…

一文快速了解Docker和命令详解

本文让你快速了解Docker是什么的东西&#xff0c;在我们程序开发的时候到底有什么作用&#xff0c;为什么需要去学习它。本文章只是做一个简单的概述配套黑马课程让你快速了解、使用Docker。 一、什么是Docker&#xff1f; Docker是一个开源的容器化平台&#xff0c;允许开发者…