C#开发OPC UA客户端

news/2025/11/6 11:09:16/文章来源:https://www.cnblogs.com/t435hh18/p/19195883

使用C#开发OPC UA客户端能帮助你在工业自动化和物联网项目中与各种设备进行可靠的数据交换。提供两种主流的开发方式:使用官方OPC UA .NET Standard SDK和使用第三方库OpcUaHelper。这两种方式各有特点,适合不同的开发场景。先通过一个表格来快速了解它们的区别:

特性 OPC UA .NET Standard SDK (官方) OpcUaHelper (第三方)
来源 OPC基金会官方 开源社区(基于官方SDK封装)
复杂度 相对较低,提供更底层的控制和灵活性 更高,封装了底层细节,API更简洁
学习曲线 较陡峭,需理解OPC UA模型 平缓,上手快速
功能 全面,支持所有OPC UA特性 覆盖常用功能(读、写、订阅、浏览)
跨平台 支持(.NET Standard) 依赖底层SDK
适用场景 需要深度控制、自定义功能或学习底层机制 快速开发常规客户端应用

使用官方 OPC UA .NET Standard SDK 开发

这是OPC基金会提供的官方库,功能全面,支持最新的OPC UA标准,适合需要深度控制或学习底层机制的场景。

开发准备

  1. 安装NuGet包:在Visual Studio中,通过NuGet包管理器安装官方SDK:

    Install-Package OPCFoundation.NetStandard.Opc.Ua
    
  2. 引入命名空间

    using Opc.Ua;
    using Opc.Ua.Client;
    using System;
    using System.Threading.Tasks;
    

基础代码示例

1. 配置应用程序并连接服务器

连接OPC UA服务器是第一步,需要配置应用程序实例和连接参数。

class Program
{private static ApplicationConfiguration config;private static Session session;static async Task Main(string[] args){// 创建应用程序配置config = new ApplicationConfiguration(){ApplicationName = "My OPC UA Client",ApplicationUri = "urn:localhost:MyClient",ProductUri = "urn:MyProduct",SecurityConfiguration = new SecurityConfiguration{ApplicationCertificate = new CertificateIdentifier{StoreType = "Directory",StorePath = @"C:\Certificates\Client", // 证书存储路径SubjectName = "CN=MyClient"}},TransportConfigurations = new TransportConfigurationCollection(),ClientConfiguration = new ClientConfiguration()};config.Validate(ApplicationType.Client); // 验证配置// 连接到服务器try{await ConnectToServer("opc.tcp://localhost:4840");Console.WriteLine("成功连接到服务器!");// ... 在这里执行读写操作}catch (Exception ex){Console.WriteLine($"连接失败: {ex.Message}");}finally{session?.Close();}}private static async Task ConnectToServer(string serverUrl){// 创建端点描述EndpointDescription endpointDescription = EndpointDescription.Create(serverUrl);EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(config);ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);// 创建会话session = await Session.Create(config,endpoint,false,"My Client",60000,new UserIdentity(new AnonymousIdentityToken()), // 匿名身份null);}
}

2. 读取节点数据

读取数据需要知道节点的唯一标识符 NodeId

static async Task ReadData()
{// 假设要读取的节点IDNodeId nodeIdToRead = new NodeId("ns=2;s=DemoSensor.Temperature"); try{// 读取节点值DataValue dataValue = session.ReadValue(nodeIdToRead);Console.WriteLine($"节点值: {dataValue.Value}, 时间戳: {dataValue.SourceTimestamp}");}catch (Exception ex){Console.WriteLine($"读取失败: {ex.Message}");}
}

3. 写入节点数据

写入数据同样需要 NodeId 和要写入的值。

static async Task WriteData()
{// 假设要写入的节点IDNodeId nodeIdToWrite = new NodeId("ns=2;s=DemoActuator.SetPoint"); double newValue = 42.5;try{// 创建DataValue对象并写入DataValue dataToWrite = new DataValue(new Variant(newValue));session.WriteValue(nodeIdToWrite, dataToWrite);Console.WriteLine("写入成功!");}catch (Exception ex){Console.WriteLine($"写入失败: {ex.Message}");}
}

4. 订阅与监控数据变化

订阅允许你在数据变化时自动接收通知,而不是不断轮询。

static void SubscribeToDataChanges()
{// 创建订阅Subscription subscription = new Subscription(session.DefaultSubscription) {PublishingInterval = 1000 // 发布间隔1秒};// 创建监控项NodeId nodeToMonitor = new NodeId("ns=2;s=DemoSensor.Pressure");MonitoredItem monitoredItem = new MonitoredItem(subscription.DefaultItem){StartNodeId = nodeToMonitor,AttributeId = Attributes.Value,SamplingInterval = 1000, // 采样间隔1秒NotificationQueueSize = 10,DiscardOldest = true};// 添加通知事件处理程序monitoredItem.Notification += (MonitoredItem item, MonitoredItemNotificationEventArgs e) =>{foreach (var value in item.DequeueValues()){Console.WriteLine($"数据变化: {value.Value} at {value.SourceTimestamp}");}};// 将监控项添加到订阅中,并将订阅添加到会话subscription.AddItem(monitoredItem);session.AddSubscription(subscription);subscription.Create();
}

使用 OpcUaHelper 库开发

如果你希望快速上手,简化开发流程,OpcUaHelper是一个很好的选择。它对官方SDK进行了封装,提供了更简洁的API。

开发准备

  1. 安装NuGet包

    Install-Package OpcUaHelper
    
  2. 引入命名空间

    using OpcUaHelper;
    using System;
    using System.Threading.Tasks;
    

基础代码示例

1. 连接服务器

private OpcUaClient opcUaClient = new OpcUaClient();private async Task ConnectToServerSimple()
{try{// 直接连接服务器await opcUaClient.ConnectServer("opc.tcp://localhost:4840");// 如果需要用户名密码认证// opcUaClient.UserIdentity = new Opc.Ua.UserIdentity("username", "password");// await opcUaClient.ConnectServer("opc.tcp://localhost:4840");Console.WriteLine("成功连接到服务器!");}catch (Exception ex){Console.WriteLine($"连接失败: {ex.Message}");}
}// 程序关闭时断开连接
private void FormClosingHandler(object sender, FormClosingEventArgs e)
{opcUaClient.Disconnect();
}

2. 读取节点数据

private void ReadDataSimple()
{try{// 读取已知类型的节点值string stringValue = opcUaClient.ReadNode<string>("ns=2;s=MyNodeID.StringValue");double doubleValue = opcUaClient.ReadNode<double>("ns=2;s=MyNodeID.DoubleValue");int intValue = opcUaClient.ReadNode<int>("ns=2;s=MyNodeID.IntValue");Console.WriteLine($"字符串值: {stringValue}");Console.WriteLine($"双精度值: {doubleValue}");Console.WriteLine($"整型值: {intValue}");// 批量读取多个节点string[] nodeArray = new string[] {"ns=2;s=MyNodeID.StringValue","ns=2;s=MyNodeID.DoubleValue","ns=2;s=MyNodeID.IntValue"};object[] values = opcUaClient.ReadNodes(nodeArray);foreach (var value in values){Console.WriteLine($"批量读取值: {value}");}}catch (Exception ex){Console.WriteLine($"读取失败: {ex.Message}");}
}

3. 写入节点数据

private void WriteDataSimple()
{try{// 写入单个节点opcUaClient.WriteNode("ns=2;s=MyNodeID.DoubleValue", 42.5);Console.WriteLine("写入成功!");// 批量写入多个节点string[] nodeArray = new string[] {"ns=2;s=MyNodeID.StringValue","ns=2;s=MyNodeID.DoubleValue","ns=2;s=MyNodeID.IntValue"};object[] valuesToWrite = { "Hello", 42.5, 42 };opcUaClient.WriteNodes(nodeArray, valuesToWrite);Console.WriteLine("批量写入成功!");}catch (Exception ex){Console.WriteLine($"写入失败: {ex.Message}");}
}

4. 订阅数据变化

private void SubscribeToDataChangesSimple()
{try{// 添加订阅,指定节点和回调函数opcUaClient.AddSubscription("ns=2;s=DemoSensor.Temperature", OnDataChanged);Console.WriteLine("订阅成功!");}catch (Exception ex){Console.WriteLine($"订阅失败: {ex.Message}");}
}// 数据变化时的回调函数
private void OnDataChanged(object value)
{Console.WriteLine($"数据发生变化: {value}");
}

参考代码 OPC UA 的客户端开发示例,采用C#编写 www.youwenfan.com/contentcnk/112035.html

开发注意事项

无论选择哪种方式,以下几点都需要注意:

  • 节点ID格式:OPC UA节点的标识符(NodeId)格式多样(字符串、数字、GUID等),使用时需确保与服务器定义的格式完全一致。通常格式为 ns=<namespaceindex>;<identifiertype>=<value>(如 ns=2;s=MySensor.Temperature)。在开发前,最好使用OPC UA浏览器(如UaExpert)或服务器提供的管理工具来浏览服务器地址空间,准确获取节点的ID和数据类型。
  • 异常处理:网络中断、权限不足、节点不存在等情况在工业环境中很常见。务必使用 try-catch 块封装你的OPC UA操作,并进行适当的错误处理和重试逻辑,以增强应用的稳定性。
  • 安全配置:OPC UA支持多种安全策略(Security Policies)和消息安全模式(Message Security Modes),从无安全到高强度的签名加密。生产环境不应使用无安全模式。同时,正确处理证书(应用程序实例证书和信任的服务器证书)是建立安全连接的关键,可能会比较繁琐。
  • 资源管理:OPC UA会话(Session)、订阅(Subscription)等对象可能占用服务器和网络资源。在应用程序关闭或不再需要时,记得调用 Close(), Disconnect()Dispose() 方法来及时释放这些资源,尤其是在长期运行的客户端应用中。
  • 异步操作:许多OPC UA操作,如连接、读取、写入,都有异步方法(如 Session.CreateAsync)。在UI应用程序中,使用异步编程可以避免阻塞用户界面,提升用户体验。

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

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

相关文章

当下中国GEO平台推荐榜单深度解析

摘要 GEO(AI搜索优化)行业在2025年迎来爆发式增长,AI驱动营销成为企业核心竞争力。本文基于行业权威数据和用户反馈,深度解析2025年11月中国GEO平台推荐榜单Top 5,重点介绍领先服务商的技术优势与服务成果,为企业…

2025年11月中国GEO平台推荐排行榜深度解析

摘要 随着AI搜索优化(GEO)技术的迅猛发展,2025年中国GEO行业竞争加剧,品牌集中度提升。本文基于权威数据源和行业调研,解析当前GEO平台排行,重点关注AI营销垂直大模型的应用与创新。榜单显示,摘星AI凭借技术领先…

Python - 100天从新手到大师:第四十九Cookie和Session - 实践

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

2025年11月中国GEO优质厂家排名前五

摘要 2025年,中国GEO(AI搜索优化)行业正迎来爆发式增长,随着AI技术的深度融合,企业营销方式从传统SEO向GEO+SEO全域搜索转型。行业数据显示,GEO服务商数量同比增长30%,企业需求聚焦于智能、高效和精准的营销解决…

【连续4届快速EI检索、高录用】第五届大数据、人工智能与风险管理国际学术会议 (ICBAR 2025)--冬季会场

【连续4年快速EI&Scopus检索丨稳检索】 第五届大数据、人工智能与风险管理国际学术会议 (ICBAR 2025)--冬季会场 2025 5th International Conference on Big Data, Artificial Intelligence and Risk Management …

【Linux dbus】问题解决 Failed to connect to socket /run/user/1000/bus: No such file or directory

出现错误“Failed to connect to socket /run/user/1000/bus: No such file or directory”通常是因为你的系统中的D-Bus(Desktop Bus)服务未能正确启动或配置,或者相关的socket文件丢失。D-Bus是一个消息总线系统,…

Windows系统真随机数生成器实现

Windows BCryptGenRandom 真随机数生成器 基于Windows Cryptography API: Next Generation (CNG) Windows CNG API _bcrypt = ctypes.WinDLL("bcrypt") BCryptGenRandom = _bcrypt.BCryptGenRandom BCryptGe…

2025年全自动丝印机批发厂家权威推荐:手动拉网机/半自动丝印机/片装抖粉机源头厂商精选

全自动丝印机作为现代工业印刷的核心设备,凭借其高效生产能力、稳定印刷质量和广泛适用性,在广告制作、数码印花、PCB电子、包装印刷等领域发挥着不可替代的作用。本文将基于行业发展趋势,为您深入分析全自动丝印机…

2025年11月沈阳注册公司推荐榜:五大优质机构实力排行

在沈阳这座工业重镇创业兴业,注册公司是创业者面临的首要环节。随着营商环境持续优化,市场主体数量稳步增长,选择专业可靠的注册服务机构成为创业者的普遍需求。本文基于国家市场监管总局公开数据、辽宁省中小企业服…

修改京东title

1.找到filters,点击,再勾选 use filters2.设置断点break points3.点击actions中的run filterset now 4.点击规则 — 自动断点—在返回后5.重新请求京东网页,如图所示483行点击第483行,在响应面板里找到title标签,…

2025年11月沈阳代理记账公司排行榜:专业顾问的深度推荐

作为企业在沈阳发展的重要合作伙伴,选择一家专业的代理记账公司是许多创业者和企业管理者的共同需求。无论是初创企业需要规范的财务基础,还是成长型企业寻求更专业的财税支持,代理记账服务都能帮助企业降低运营成本…

高端网站设计的分水岭:为什么同样是官网,有的能留住用户,有的秒关?

高端网站设计的分水岭:为什么同样是官网,有的能留住用户,有的秒关?在高端品牌数字化竞争中,官网早已不是 “可有可无的名片”,而是 “用户决策的关键触点”。但现实是,同样定位高端的网站,有的能让用户停留 5 …

zlog5

1.单变量线性回归这是回归算法的绝对起点。仅涉及一个自变量和一个因变量,核心是拟合出最优直线来描述两者关系。重点掌握最小二乘法的原理、均方误差等基础评估指标,同时初步理解“损失函数” 这一核心概念,建立对…

Chronic disease

How long did the years past? But when we focus on the basic principles more, even algorithms also can be easily to be reviewed. of course, AI barely can do this perfectly.

11.6 1.基础HTTPGET接口请求测试

1. 打开JMeter,新建测试计划,右键添加“线程组”(线程数1、循环次数1)。2. 线程组下添加“HTTP请求”,服务器名称/IP填写httpbin.org,端口80,请求方法选GET,路径填写/get。3. 添加“察看结果树”监听器,点击运…

ICPC2023杭州个人题解

M. V-Diagram 题意:给定一个长度为 \(n\) 的数组 a,满足数组的大小呈V字排列(即中间某个地方的值最小,往两边依次单调递增),求其满足还是V字排列的子数组的最大的平均值。 限制条件:\(3\le n \le 310^5,1\le a…

2025年11月学习机品牌推荐榜:清北双师与AI精准学排行盘点

临近学期中段,家长群里最热的议题从“报哪门网课”变成“该选哪台学习机”。十一月的期中成绩刚公布,不少家庭发现孩子知识漏洞集中、校内节奏加快,原来靠打印卷子的“土法”已跟不上新课改的进度;同时,教育部《2…

2025年11月学习机品牌推荐:护眼大屏榜多维对比排行

开学季刚过,家长群里的讨论却热度不减:新课标教材更新、期中成绩波动、线上课程时间被严格限制,一连串变化让“在家怎么学”成为高频痛点。教育部《2024全国中小学生学习负担监测报告》显示,近六成家庭每天额外学习…

Linux - 压缩解压篇

工具 核心定位 本质功能 默认生成格式 关键限制 压缩gzip 单文件快速压缩工具 仅压缩 / 解压单个文件(无归档能力) .gz 不支持目录、不支持多文件合并压缩压缩: gzip 保留源文件加 -k进度加 -v解压: gunzip/gzip -…

2025年11月学习机品牌权威榜:读书郎领衔五强对比评测

“孩子放学回家,作业不会写、错题没人讲、预习没方向”——这是不少家庭在2025年新课改全面落地后遇到的共同场景。新课标强调核心素养与探究式学习,教材更新节奏加快,家长普遍反映“辅导难度陡增”。教育部《2024全…