多点订阅采集
同时监控温度 / 压力 / 流量 / 计数器多个节点, 服务端有变化才推送, 不浪费带宽. 用 C# 示例.
配套示例
- 自动发现节点 + 落 CSV → 全流程数据采集到 CSV
- 1000+ 节点 → 大规模监控
完整代码
using DarraOpcUa_Client;
using System;
using System.Threading;
class Program
{
static void Main()
{
// 替换成现场 PLC 工控机的 IP
const string endpoint = "opc.tcp://192.168.1.100:4840";
// 节点 ID 形如 ns=2;s=<DB或GVL路径>.<变量名>, 实际名以 PLC 项目里的标识符为准
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);
}
}
代码要点
publishingIntervalMs是服务端推送批次间隔, 不是采样间隔; 不变化不发 NotificationMessageDataChanged在 Publish 线程触发, WinForms 用Control.BeginInvoke/ WPF 用Dispatcher.BeginInvoke切回 UI 线程AddMany是 1 次 RPC, 循环Add100 个节点是 100 次 RPC, 差距约 50 倍sub必须using, 否则服务端会保留订阅直到sessionTimeoutMs超时
注意事项
- 订阅 Publish 是服务端推, 客户端只要 Session 不断就一直收, 不需要心跳保活 (SDK 内部 KeepAlive 已自动).
sub必须using, 否则服务端会保留订阅直到sessionTimeoutMs超时.- 大批量 (1000+) 监控请看 大规模监控案例.