快速开始 (C#)
5 分钟从零开始用 Darra OPC UA Client SDK 连上 OPC UA Server, 跑通连接 / 浏览 / 读写 / 订阅 / 方法调用全流程. 本页用 C# 为示例, 其他语言用法见 六语言 SDK 文档.
- 启用加密 — Sign / SignAndEncrypt + PFX 证书
- Discovery 发现 — GetEndpoints / FindServers
- History 历史访问 — HistoryRead 5 模式
- Event 事件订阅 — Alarms & Conditions
一、准备工作
在开始第一个 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· Javaxyz.darra:darra-opcua-sdk:0.6.0· C++ CMake · Rustcargo add darra-opcua· Ccmake --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 桥接 · 大规模监控 |