OPC UA 完整介绍、官网、C# 简单使用

OPC UA 完整介绍、官网、C# 简单使用

OPC UA(Open Platform Communications Unified Architecture),开放平台通信统一架构,工业自动化主流跨厂商通信标准,IEC 62541 国际标准。 你的印花机‑烘干机一体化设备,可以用 OPC UA 实现:设备状态采集、工艺参数下发、报警推送、上位机 / MES 对接。

一、基础介绍

核心特点

  1. 跨平台:Windows、Linux、嵌入式设备都可运行,不再依赖老 OPC‑DA 的 DCOM(仅 Windows)OPC Founda...。
  2. 安全:证书加密、身份认证、权限控制,支持 UA‑TCP 二进制(高性能)、HTTP‑SOAP、WebSocket。
  3. 信息模型:不只是传数值,可定义设备对象、变量、方法、事件,支持复杂设备模型(机器模型、报警、历史数据)。
  4. 角色
    • OPC UA Server(服务端):设备 / PLC 侧,对外暴露变量节点(印花温度、烘干转速、故障码等)。
    • OPC UA Client(客户端) :上位机软件,连接 Server,读、写、订阅数据、调用方法
  5. 典型端口:4840(无加密)、4841(加密);连接地址格式:opc.tcp://127.0.0.1:4840

老 OPC‑DA:淘汰,仅限 Windows DCOM;新项目一律 OPC‑UA。

二、官方网站 & 资源

  1. OPC 基金会主站https://opcfoundation.org/
  2. 标准文档在线查阅(最重要)OPC UA Online Reference 全部规范免费在线看、下载OPC Connec...
  3. 官方.NET 开源库 GitHubhttps://github.com/OPCFoundation/UA‑.NETStandard (客户端 + 服务端源码,MIT 协议可商用)GitHub
  4. 官方示例仓库https://github.com/OPCFoundation/UA‑.NETStandard‑Samples 大量客户端、服务端 DemoGitHub

NuGet 官方包:OPCFoundation.NetStandard.Opc.Ua

三、C# .NET 简单可运行示例(OPC UA 客户端)

场景:连接 OPC UA 服务器,读取变量、写入变量、订阅实时变化(印花 / 烘干温度实时监控) 新建 .NET6/.NET8 控制台项目,NuGet 安装包: OPCFoundation.NetStandard.Opc.Ua

cs 复制代码
using Opc.Ua;
using Opc.Ua.Client;

namespace OpcUaDemo;

class Program
{
    static async Task Main(string[] args)
    {
        // OPC UA服务端地址,可使用Prosys/KEPServerEX模拟器测试
        string serverUrl = "opc.tcp://127.0.0.1:4840";

        // 配置:关闭证书校验(开发调试用;生产环境必须证书)
        var config = new ApplicationConfiguration
        {
            ApplicationName = "MyOpcUaClient",
            ApplicationUri = $"urn:{Environment.MachineName}:MyOpcUaClient",
            SecurityConfiguration = new SecurityConfiguration
            {
                AutoAcceptUntrustedCertificates = true //开发调试打开,生产关闭!
            },
            TransportConfigurations = new TransportConfigurationCollection(),
            TransportQuotas = TransportQuotas.Default,
            ClientConfiguration = new ClientConfiguration()
        };
        await config.ValidateAsync(ApplicationType.Client);

        Session? session = null;
        try
        {
            Console.WriteLine($"正在连接 {serverUrl}");
            // 创建会话连接
            session = await Session.CreateAsync(config, new ConfiguredEndpoint(null, new EndpointDescription(serverUrl), EndpointConfiguration.Create(config)));
            Console.WriteLine("连接成功!");

            // ==========1.读取节点值,示例节点 ns=2;s=DryingTemp 烘干温度==========
            NodeId readNodeId = new NodeId("DryingTemp", 2);
            DataValue readVal = await session.ReadAsync(readNodeId);
            Console.WriteLine($"读取烘干温度:{readVal.Value}");

            // ==========2.写入节点值:设置目标烘干温度==========
            NodeId writeNodeId = new NodeId("SetDryingTemp", 2);
            DataValue writeVal = new DataValue((double)85.5);
            await session.WriteAsync(writeNodeId, writeVal);
            Console.WriteLine("写入目标烘干温度=85.5成功");

            // ==========3.订阅(实时推送,工业最常用:监控印花机状态、报警)==========
            Subscription sub = new Subscription(session.DefaultSubscription);
            sub.PublishingInterval = 200; //200ms推送一次
            sub.KeepAliveCount = 10;

            // 添加监控节点
            MonitoredItem item = new MonitoredItem(sub.DefaultItem);
            item.StartNodeId = readNodeId;
            item.Notification += (sender, evt) =>
            {
                if (evt.NotificationValue is MonitoredItemNotification notify)
                {
                    Console.WriteLine($"【订阅实时】烘干温度={notify.Value.WrappedValue.Value}");
                }
            };
            sub.AddItem(item);
            await session.AddSubscriptionAsync(sub);
            await sub.CreateAsync();

            Console.WriteLine("订阅已开启,按回车退出");
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            Console.WriteLine($"异常:{ex.Message}");
        }
        finally
        {
            if(session != null && !session.Disposed)
            {
                await session.CloseAsync();
                session.Dispose();
            }
        }
    }
}

开发注意点

  1. AutoAcceptUntrustedCertificates = true开发调试;生产环境必须证书管理,禁止自动接受不信任证书。
  2. NodeId 格式ns=命名空间索引;s=节点字符串ID,例如ns=2;s=DryingTemp,需要和 OPC UA 服务端节点保持一致。
  3. 测试工具:Prosys OPC‑UA Simulator,免费模拟器,本机快速调试客户端代码。

四、OPC UA 服务端简单说明(如果你要给印花烘干机设备做 OPC UA 服务端)

官方库同样支持写 UA Server,可以把设备内部变量(印花速度、烘干温度、风机转速、故障代码)对外暴露成 OPC UA 节点。

  • 对外提供节点:
    • 读节点:实际温度、设备运行状态、故障码
    • 写节点:设定烘干温度、印花速度
    • 事件:设备报警事件推送

五、工业项目踩坑要点(印花烘干机设备场景)

  1. 网络断连:OPC UA 客户端要做重连机制,生产现场网络抖动很常见。
  2. 订阅不要设置过小 PublishingInterval,避免 CPU / 网络压力。
  3. 区分:读(Read)是主动一次性取;订阅(Subscription)服务端主动推送变化,实时监控优先用订阅
  4. 防火墙开放端口 4840/4841。
相关推荐
SomeB1oody2 小时前
【RustyML入门】7.2. 深入模型持久化
开发语言·后端·机器学习·rust·教程
yaoxin5211232 小时前
502. Java 反射 - 编写 MessageInterceptor 类
java·开发语言
wuyk5552 小时前
Python零基础入门第五章:元组Tuple(不可变容器详解、列表与元组区别)
开发语言·python
2601_965798472 小时前
Build a Fast, High-Ranking Restaurant Website with Rolanda Theme
开发语言·ios·swift
caimouse2 小时前
ReactOS 窗口系统分析(25):标题栏显示与系统按钮 — nonclient.c 标题栏专题
c语言·开发语言
诺伦2 小时前
Rust 错误处理实战:从 unwrap 到优雅 Result 的进阶之路
开发语言·后端·rust
caimouse3 小时前
ReactOS 窗口系统分析(14):计时器/属性/加速键/热键 — timer.c + prop.c + accelerator.c + hotkey.c
c语言·开发语言·reactos
circuitsosk3 小时前
Python 模块与包管理:import 机制、虚拟环境与 pip 完全指南
开发语言·python·pip·依赖管理·模块与包
就叫飞六吧3 小时前
两道门:X-Frame-Options 和 SameSite 到底谁管什么
开发语言·chrome·ai编程
fl1768313 小时前
基于C#WPF实现的内存加速球清理类似360加速球内存清理
开发语言·c#·wpf