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 开源库 GitHub :https://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。
相关推荐
刚入门的大一新生12 分钟前
Linux-线程互斥
java·开发语言
香芋芋圆32 分钟前
iD-editor 详解|OSM官方在线编辑器,基于D3.js的轻量地图编辑器
开发语言·javascript·编辑器
小熊恋旧1 小时前
Python 面向对象编程:方法、属性、继承与多态详解
开发语言·python
云边云科技_云网融合1 小时前
面向汽车零部件制造业场景的解决方案 | 70 秒:一台车下线的时间里,藏着五张网
开发语言·汽车·php
Evand J1 小时前
【PMSM滤波例程2】PMSM未知负载转矩观测EKF。MATLAB例程(负载增广EKF与实际仿真结果)。附下载链接
开发语言·matlab·电机
will_net2 小时前
apollo 站点部署&C#接入
开发语言·c#·apollo
晗夜未央2 小时前
任务队列反复失败,先分清重试、阻塞和结果待核对
开发语言·javascript
熊猫钓鱼>_>2 小时前
四种书签,一条时间线:一个读书 App 的记忆颗粒与它的边界案例【鸿蒙心迹】
开发语言·华为·ai编程·harmonyos·鸿蒙·openharmony·鸿蒙pc
努力努力再努力wz3 小时前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua
飞浪纪元[FWC–FE]4 小时前
从零到一键绿:Qt 5.14.2 + VS2019 开发环境搭建、Kit 套件配置与构建错误修复完全手册
开发语言·qt