多点订阅采集
同时监控温度 / 压力 / 流量 / 计数器多个节点, 服务端有变化才推送, 不浪费带宽. 用 C# 示例.
配套示例
- 自动发现节点 + 落 CSV → 全流程数据采集到 CSV
- 1000+ 节点 → 大规模监控
完整代码
using DarraOpcUa_Client;
using System;
using System.Threading;
class Program
{
static void Main()
{
const string endpoint = "opc.tcp://localhost:4840";
var nodes = new[]
{
"ns=2;s=Boiler1.Temperature",
"ns=2;s=Boiler1.Pressure",
"ns=2;s=Boiler1.FlowRate",
"ns=2;s=Line1.Counter",
};
// 1. 连接
using var ua = new DarraOpcUa(endpoint);
ua.Connect();
Console.WriteLine($"[OK] 已连接 {endpoint}");
// 2. 创建订阅 + 挂回调
using var sub = ua.CreateSubscription(publishingIntervalMs: 500);
sub.DataChanged += (s, e) =>
Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff} {e.NodeId,-32} = {e.ValueString,-12} [{e.Status}]");
// 3. 批量添加监控项
var results = sub.AddMany(nodes);
for (int i = 0; i < nodes.Length; i++)
Console.WriteLine($" add {nodes[i]} -> {results[i].status}");
// 4. 收推送, 直到 Ctrl+C
Console.WriteLine("\n等待数据推送, 按 Ctrl+C 停止...\n");
Thread.Sleep(Timeout.Infinite);
}
}
分段说明
第 1 步: 创建订阅
using var sub = ua.CreateSubscription(publishingIntervalMs: 500);
publishingIntervalMs 是服务端最快多久推一批 (单位 ms), 不是采样间隔. 服务端 ≤ 500ms 才会发一次 NotificationMessage.
第 2 步: DataChanged 是 Push 模式
sub.DataChanged += (s, e) => { ... };
订阅与轮询的本质区别: 数据变化时才触发回调, 不变化不消耗 RPC. e.ValueString 是 SDK 在 C 层 Publish 线程预抽取的字符串, 跨线程安全.
回调在非 UI 线程触发. WinForms 用
Control.BeginInvoke, WPF 用Dispatcher.BeginInvoke切回 UI 线程.
第 3 步: AddMany 一次 RPC
var results = sub.AddMany(nodes);
100 个节点用 AddMany 是 1 次 RPC (~10ms), 用循环 Add 是 100 次 RPC (~500ms+).
注意事项
- 订阅 Publish 是服务端推, 客户端只要 Session 不断就一直收, 不需要心跳保活 (SDK 内部 KeepAlive 已自动).
sub必须using, 否则服务端会保留订阅直到sessionTimeoutMs超时.- 大批量 (1000+) 监控请看 大规模监控案例.