跳到主要内容

多点订阅采集

同时监控温度 / 压力 / 流量 / 计数器多个节点, 服务端有变化才推送, 不浪费带宽. 用 C# 示例.

配套示例

完整代码

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+) 监控请看 大规模监控案例.

相关链接