在 .NET 中使用 OPC UA 协议
什么是 OPC UA
OPC UA(OPC Unified Architecture,开放平台通信统一架构)是 OPC 基金会应用在自动化技术的机器对机器网络传输协定。OPC UA 不依赖于特定的操作系统或平台,可以在 Windows、Mac、Linux 等多种系统上运行,而传统的 OPC(如 OPC DA)通常只能在 Windows 上使用。该协议提供了一个更为先进、安全和灵活的解决方案,适用于现代工业自动化和物联网环境中的设备间通信。

OPC UA 通过一个统一的信息模型来实现设备间的无缝数据交换,信息模型来源于面向对象编程,使用了对象作为过程系统表示数据和活动的基础。这个模型由节点组成,节点可以是对象、变量或方法,它们通过引用相互连接,构成了一个复杂的网络。每个节点都有一组属性和引用,用于描述数据和定义节点间的关系。OPC UA 的地址空间就是这样一个节点网络,它为客户端提供了一种标准化的方式来访问服务器上的对象。OPC UA 还提供了一系列服务,使客户端能够执行读取、写入和订阅等操作。安全性也是 OPC UA 设计的核心,内置了多种安全机制,包括认证、授权、加密和消息签名,以确保数据传输的安全性。

UaExpert 的使用
UaExpert 是一款 OPC UA 客户端软件,用于连接 OPC UA 服务器并与之交互。UaExpert 支持 OPC UA 的所有特性,包括数据视图、报警视图、历史趋势视图和诊断视图等功能。用户可以通过 UaExpert 访问服务器上的节点,如设备和传感器,以及它们的属性,例如温度、压力等数据。UaExpert 还提供了仿真、配置、历史功能测试和导出节点的功能,大多数功能都是免费使用的。
下载 UaExpert
访问 Unified Automation 的官网下载 UaExpert,未注册用户则需要先注册才能下载。

首次启动
安装完成后,首次运行 UaExpert 会提示创建一个应用程序证书,填写一些相关信息即可。

启动后的界面如下。

添加 OPC UA 服务器
依次单击菜单栏 Server - Add,或者直接单击工具栏的 图标,会弹出添加服务器对话框。双击 Custom Discovery 下面的文字,输入 OPC UA 服务器的地址和端口号。

完成后会看到新添加的 OPC UA 服务器信息,选中开锁状 图标,并单击 OK 按钮,即完成服务器添加的操作。

连接 OPC UA 服务器
服务器添加完成后,在左侧项目树的 Servers 会显示相关信息,此时服务器尚未连接。单击工具栏的插头 图标,或者右击服务器点击 Connect,即可连接服务器。

查看 PLC 数据
成功连接后,会在界面左下侧 Address Space 显示 PLC 中的相关数据。找到想要监控(订阅)的数据,将其直接拖放到界面中间的 Data Access View 就可以实时观察数据的变化。界面右侧 Attributes 可以显示选中节点的相关属性。

使用 C# 读写 OPC UA 数据
首先需要在项目中引用 NuGet 包 OPCFoundation.NetStandard.Opc.Ua。
连接到 OPC UA 服务器
- 创建一个应用配置对象,用于设置应用名称、唯一标识、类型、证书和安全策略;
// 创建一个应用配置对象,用于设置应用名称、唯一标识、类型、证书和安全策略
var config = new ApplicationConfiguration()
{
ApplicationName = "MyClient",
ApplicationUri = Utils.Format(@"urn:{0}:MyClient", System.Net.Dns.GetHostName()),
ApplicationType = ApplicationType.Client,
SecurityConfiguration = new SecurityConfiguration
{
ApplicationCertificate = new CertificateIdentifier { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\MachineDefault", SubjectName = "MyClientSubjectName" },
TrustedIssuerCertificates = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Certificate Authorities" },
TrustedPeerCertificates = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\UA Applications" },
RejectedCertificateStore = new CertificateTrustList { StoreType = @"Directory", StorePath = @"%CommonApplicationData%\OPC Foundation\CertificateStores\RejectedCertificates" },
AutoAcceptUntrustedCertificates = true,
RejectSHA1SignedCertificates = false,
MinimumCertificateKeySize = 1024,
NonceLength = 32,
},
TransportConfigurations = new TransportConfigurationCollection(),
TransportQuotas = new TransportQuotas { OperationTimeout = 15000 },
ClientConfiguration = new ClientConfiguration { DefaultSessionTimeout = 60000 },
TraceConfiguration = new TraceConfiguration()
}; // 验证应用配置对象
await config.Validate(ApplicationType.Client); // 设置证书验证事件,用于自动接受不受信任的证书
if (config.SecurityConfiguration.AutoAcceptUntrustedCertificates)
{
config.CertificateValidator.CertificateValidation += (s, e) => { e.Accept = (e.Error.StatusCode == StatusCodes.BadCertificateUntrusted); };
}
- 检查应用实例对象的证书;
// 创建一个应用实例对象,用于检查证书
var application = new ApplicationInstance(config); // 检查应用实例对象的证书
bool check = await application.CheckApplicationInstanceCertificate(false, 2048);
- 创建一个会话对象,用于连接到 OPC UA 服务器;
// 创建一个会话对象,用于连接到 OPC UA 服务器
EndpointDescription endpointDescription = CoreClientUtils.SelectEndpoint("opc.tcp://192.168.0.100:4840", true);
EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(config);
ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);
Session session = await Session.Create(config, endpoint, false, false, "DataCollector", 60000, new UserIdentity(), null);
获取节点的值
- 单次读取节点的值
DataValue value = session.ReadValue(nodeId: "ns=6;s=::MyNode");
Console.WriteLine("{0}, {1}, {2}", value.Value, value.SourceTimestamp, value.StatusCode);
- 订阅读取节点的值
// 创建一个订阅对象,用于订阅节点的值
var subscription = new Subscription(session.DefaultSubscription) { PublishingInterval = 1000 };
session.AddSubscription(subscription);
subscription.Create(); // 创建一个监视项对象,用于指定要订阅的节点
MonitoredItem monitoredItem = new MonitoredItem()
{
DisplayName = "MyNode",
StartNodeId = "ns=6;s=::MyNode"
}; // 添加一个通知事件,用于处理节点值的变化
monitoredItem.Notification += (item, e) =>
{
foreach (var value in item.DequeueValues())
{
Console.WriteLine("{0}: {1}, {2}, {3}", item.DisplayName, value.Value, value.SourceTimestamp, value.StatusCode);
}
}; // 将监视项对象添加到订阅对象中
subscription.AddItem(monitoredItem); // 应用订阅的变化
subscription.ApplyChanges();

写入节点的值
// 写入数据到节点
WriteValue value = new WriteValue()
{
NodeId = "ns=6;s=::MyNode",
Value = new DataValue(new Variant(123))
};
ResponseHeader response = session.Write(null, new WriteValueCollection { value }, out StatusCodeCollection statuses, out DiagnosticInfoCollection diagnostics);
在 .NET 中使用 OPC UA 协议的更多相关文章
- OPC协议解析-OPC UA OPC统一架构
1 什么是OPC UA 为了应对标准化和跨平台的趋势,为了更好的推广OPC,OPC基金会近些年在之前OPC成功应用的基础上推出了一个新的OPC标准-OPC UA.OPC UA接口协议包含了之前的 ...
- 转:OPC协议解析-OPC UA OPC统一架构
1 什么是OPC UA 为了应对标准化和跨平台的趋势,为了更好的推广OPC,OPC基金会近些年在之前OPC成功应用的基础上推出了一个新的OPC标准-OPC UA.OPC UA接口协议包含了之前的 ...
- OPC UA分布式IO模块
OPC UA IO模块对工业物联网的影响 OPC UA IO模块是指IO模块支持OPC UA协议,可以直接与OPC Client进行通信,这样就可以从OPC Client上直接远程通过以太网对IO口进 ...
- 关于OPC UA Helper 命名空间中的OpcUaClient 类中的订阅函数的更改
原函数是opcUaClient.MonitorValue("ns=4;s=MAIN.d", new Action<double, Action>(MonitorTest ...
- SharpNodeSettings项目,可配置的数据采集,统一的工业数据网关,OPC UA服务器开发,PLC数据发布到自身内存,redis,opc ua,以及数据可视化开发
本项目隶属于 HslCommunication 项目的SDK套件,如果不清楚HslCommunication组件的话,可以先了解那个项目,源代码地址:https://github.com/dathli ...
- C# OPC UA服务器 OPC UA网关 三菱 西门子 欧姆龙 Modbus转OPC UA 服务器 可配置的OPC UA服务器网关 HslSharp软件文档
前言 本文将使用一个基于开源项目HslCommunication创建的OPC UA网关,方便通过配置创建一个OPC UA的网关中心.具体的操作及支持的设备信息项目参照下面: 开源项目HslCommun ...
- C# 读写opc ua服务器,浏览所有节点,读写节点,读历史数据,调用方法,订阅,批量订阅操作
OPC UA简介 OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术难以满足日益复杂的环境,在可扩展性,安全性,跨平台性方面的不足日益明显,所以OPC基金会在几年前提出了面 ...
- OPC UA (统一架构)的优势
OPC UA OPC统一架构(OPC Unified Architecture)是OPC基金会(OPC Foundation)创建的新技术,更加安全.可靠.中性(与供应商无关),为制造现场到生产计划或 ...
- C# 实现opc ua服务器的远程连接(转)
原文转自:https://www.cnblogs.com/dathlin/p/7724834.html OPC UA简介 OPC是应用于工业通信的,在windows环境的下一种通讯技术,原有的通信技术 ...
- PLC转OPC UA的协议转换网关需要多少钱呢?
嵌入式OPC UA网关BL102简化了OPC UA程序的开发与IIOT工业物联网应用 在制造业数字化升级过程中,我们碰到最多的工作便是针对每一款PLC去开发一套OPC UA程序,然后通过这套程序去读取 ...
随机推荐
- NC16886 [NOI2001]炮兵阵地
题目链接 题目 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&qu ...
- phpBB3在Nginx反向代理中的X-Forwarded-For IP检查
记录一下phpBB3对反向代理中的IP处理机制 处理几个phpBB3项目迁移, 部分运行场景转移到内网, 需要外网通过nginx/openresty之类的网关反向代理进行访问. 在网关处已经正确配置了 ...
- Spring和Spring Boot的区别
spring Spring 是一个开源轻量级框架,它允许 Java EE 7 开发人员构建简单.可靠和可扩展的企业应用程序.该框架主要侧重于提供各种方法来帮助您管理业务对象.与 Java 数据库连接 ...
- ORACLE cannot fetch plan for SQL_ID
今天做SQL执行计划测试的时候,发现sqlplus无法正常打印执行计划,根据网上资料整理如下: ..... SYS@orcl> select * 2 from table( 3 ...
- Redhat6更改yum源
最近虚拟机中安装了redhat6.3企业版,自带的yum用不起来,软件都找不到. 网上搜了一下说是没付钱...,需要改下yum源.操作步骤如下: 1.切换到yum源存放目录 [root@rhel6 ~ ...
- 修改mysql默认字符集和排序规则
1.查看当前数据库字符集和排序规则 命令如下: mysql> SHOW VARIABLES LIKE 'collation_%'; mysql> SHOW VARIABLES LIKE ' ...
- 【手写信息搜集工具】ThunderSearch 闪电搜索器
ThunderSearch 闪电搜索器 项目地址:github Windows打包版 利用ZoomEye的官方api,结合开发文档,做了这么一个GUI界面的搜索器.目前支持查询host_search ...
- python开发接口时,使用jsonschema模块对数据进行校验
import jsonschema schema = { "type": "object", # 先声明每个键都是对象 "properties&quo ...
- 第120篇: DOM编程(常用操作、动态脚本、样式及动态表格)
好家伙,我回来了, 本篇为<JS高级程序设计>第十四章"DOM编程"学习笔记 1.DOM编程 我们知道DOM是HTML文档的编程接口, 我们可以通过HTML代码实现 ...
- 扣子(coze.cn)| 由浅入深,手把手带你实现Java转型学习助手
扣子(coze.cn)是一款用来开发新一代 AI Chat Bot 的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的 Chat Bot,并将其发布到各类社交平台和通讯软件上 ...