跳到主要内容

快速开始 (C#)

5 分钟从零开始用 Darra OPC UA Client SDK 连上 OPC UA Server, 跑通连接 / 浏览 / 读写 / 订阅 / 方法调用全流程. 本页用 C# 为示例, 其他语言用法见 六语言 SDK 文档.

进阶专题

一、准备工作

在开始第一个 Demo 之前, 准备好以下三样东西.

1. 环境

  • 操作系统 — Windows 10 / 11, Linux, macOS 任一
  • .NET.NET Framework 4.6.1+.NET 6 / 8 / 9
  • 端口 — OPC UA 默认 4840/tcp, 防火墙放通

2. 安装 SDK (NuGet)

在你的 .NET 项目目录执行:

dotnet add package Darra.OpcUa

NuGet 会自动把 DarraOpcUa.dll + 原生库 Darra.OpcUa.Core.dll 一起复制到输出目录, 无需额外操作.

其他语言: Python pip install darra-opcua · Java xyz.darra:darra-opcua-sdk:0.6.0 · C++ CMake · Rust cargo add darra-opcua · C cmake --install. 详见 六语言安装.

3. 对端 Server endpoint

准备一个可达的 OPC UA Server endpoint, 形如 opc.tcp://<host>:4840.

二、第一个完整程序

完整的 C# 控制台程序, 一次走完 创建会话 → 连接 → 浏览 → 读 → 写 → 订阅 → 方法调用 → 断开. 复制到任意 .NET 项目即可运行.

using DarraOpcUa_Client;
using System;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
// ========== 1. 创建会话 ==========
// 端点指向 PLC Service 所在工控机的 4840 端口; 本机调试时用 localhost
using var ua = new DarraOpcUa("opc.tcp://192.168.1.100:4840");
ua.Events.Connected += (s, e) => Console.WriteLine($"[OK] 已连接 {e.EndpointUrl}");
ua.Events.Disconnected += (s, e) => Console.WriteLine("[--] 已断开");

// ========== 2. 连接服务器 ==========
ua.Connect();
Console.WriteLine($"会话状态: {ua.State}");

// ========== 3. 浏览节点 ==========
// 从 Objects 文件夹 (i=85) 开始, Darra PLC Server 把 PLC 数据挂在 DarraPLC 文件夹下:
// DarraPLC / Tags / DataBlocks / GVL / Diagnostics
Console.WriteLine("\n--- Objects 文件夹下的子节点 ---");
foreach (var r in ua.Browse("i=85"))
Console.WriteLine($" {r.NodeId,-32} [{r.NodeClass}] {r.DisplayName}");

// ========== 4. 读单节点 ==========
using (var dv = ua.Read("i=2258")) // i=2258 = ServerStatus.CurrentTime (OPC UA 标准节点)
Console.WriteLine($"\n服务器时间 = {dv.Value.AsDateTime} [{dv.Status}]");

// ========== 5. 写单节点 ==========
// ns=2 = Darra PLC 命名空间; 这里写一个 GVL 全局变量 (假设项目里定义了 Speed)
var st = ua.Write("ns=2;s=GVL.Speed", new Variant(1500));
Console.WriteLine($"写入 GVL.Speed=1500, 返回状态 = {st}");

// ========== 6. 订阅数据变化 ==========
using var sub = ua.CreateSubscription(publishingIntervalMs: 500);
sub.DataChanged += (s, e) =>
Console.WriteLine($" [推送] {e.NodeId} = {e.ValueString} ({e.Status})");
sub.Add("i=2258"); // 服务器时间, 每秒会变
sub.Add("ns=2;s=GVL.Speed"); // PLC 全局变量, 值变化时推送

Console.WriteLine("\n收 5 秒订阅推送...");
await Task.Delay(5000);

// ========== 7. 方法调用 (可选) ==========
// 仅当对端 Server 提供 OPC UA Method 节点时使用 (PLC Server 是否有 Method 由项目配置决定)
try
{
var inputs = new Variant[] { new Variant(3), new Variant(5) };
var outputs = ua.Call("ns=2;s=Methods", "ns=2;s=Methods.Add", inputs);
foreach (var o in outputs)
using (o) Console.WriteLine($"\n调用 Add(3, 5) = {o.AsInt32}");
}
catch (OpcUaException ex)
{
Console.WriteLine($"\n方法调用跳过 (服务端未提供 Method 节点): {ex.StatusCode}");
}

// ========== 8. 断开 (using 自动释放) ==========
Console.WriteLine("\n程序结束, using 块结束时自动 Disconnect + Dispose.");
}
}

代码要点

  • using var ua = ... 退出作用域时自动 Disconnect + Dispose, 不用手工释放
  • Read 返回的 DataValue / Call 返回的 Variant 都持 native 句柄, 必须 using 否则泄漏
  • 默认匿名 + None 安全模式; 生产用 Sign / SignAndEncrypt, 见 启用加密
  • 订阅回调跑在非 UI 线程, WinForms / WPF 要 Invoke 切回主线程
  • 批量场景: ReadMany / WriteMany / BrowseMany / sub.AddMany 一次 RPC 顶 N 次

完整 API 与可选参数见 C# SDK 总览.

三、跑起来效果

把上面完整程序保存为 Program.cs 放进一个 dotnet new console 项目, 加 dotnet add package Darra.OpcUa, 确保对端 OPC UA Server 已运行 (例如 Darra Software PLC 的 Service 已启动并暴露 4840 端口), 然后 dotnet run. 连接 Darra PLC Server 时预期输出大致如下:

[OK] 已连接 opc.tcp://192.168.1.100:4840
会话状态: Connected

--- Objects 文件夹下的子节点 ---
i=2253 [Object] Server
ns=2;s=DarraPLC [Object] DarraPLC

服务器时间 = 2026-04-25T08:00:00Z [Good]
写入 GVL.Speed=1500, 返回状态 = Good

收 5 秒订阅推送...
[推送] i=2258 = 2026-04-25T08:00:00.500Z (Good)
[推送] ns=2;s=GVL.Speed = 1500 (Good)
[推送] i=2258 = 2026-04-25T08:00:01.000Z (Good)
...

方法调用跳过 (服务端未提供 Method 节点): BadNodeIdUnknown

程序结束, using 块结束时自动 Disconnect + Dispose.
[--] 已断开

节点结构: DarraPLC 下还有 Tags / DataBlocks / GVL / Diagnostics 四个子文件夹, 分别对应 PLC 项目的标签表 / 数据块 / 全局变量 / 诊断节点. 继续 Browse("ns=2;s=DarraPLC") 即可下钻。

四、下一步

想做的事看这里
加密连接 (Sign / SignAndEncrypt)拓展 — 启用加密
服务器发现 (GetEndpoints / FindServers)拓展 — Discovery 发现
历史数据 (HistoryRead 5 模式)拓展 — History 历史访问
报警与事件 (Alarms & Conditions)拓展 — Event 事件订阅
完整 C# API 参考C# SDK 总览
其他语言用法Java · Python · C++ · Rust · C
真实场景示例多点订阅采集 · 全流程到 CSV · Modbus 桥接 · 大规模监控

相关链接