单点周期采集
最简单的入门案例: 用 while + Sleep + Read 循环, 每秒读一次服务器时间并打印. 用 C# 示例.
配套示例
- 多个节点 → 多点订阅采集 (推荐, 比轮询高效得多)
- 完整流程 → 全流程数据采集到 CSV
完整代码
using DarraOpcUa_Client;
using System;
using System.Threading;
class Program
{
static void Main()
{
const string endpoint = "opc.tcp://localhost:4840";
const string nodeId = "i=2258"; // ServerStatus.CurrentTime
// 1. 创建会话并连接
using var ua = new DarraOpcUa(endpoint);
ua.Connect();
Console.WriteLine($"[OK] 已连接 {endpoint}");
// 2. 周期读取
Console.WriteLine("按 Ctrl+C 停止...\n");
while (true)
{
try
{
using var dv = ua.Read(nodeId);
if (dv.Status.IsGood)
Console.WriteLine($"{DateTime.Now:HH:mm:ss} {nodeId} = {dv.Value.AsDateTime:O}");
else
Console.WriteLine($"{DateTime.Now:HH:mm:ss} {nodeId} 读取失败: {dv.Status}");
}
catch (OpcUaException ex)
{
Console.WriteLine($"通讯异常: {ex.StatusCode}, 1 秒后重试");
}
Thread.Sleep(1000);
}
}
}
分段说明
第 1 步: 连接
using var ua = new DarraOpcUa(endpoint);
ua.Connect();
using 保证退出时自动 Disconnect + Dispose, 释放 native Session 句柄.
第 2 步: 周期 Read
using var dv = ua.Read(nodeId);
if (dv.Status.IsGood) { ... }
每次 Read 都返回 DataValue. 必须 using — 它持有 native 内存句柄, 不释放会泄漏.
判断 Status.IsGood 后再用 Value, 否则可能拿到无效数据.
第 3 步: 异常处理
catch (OpcUaException ex) { ... }
通讯层失败 (断网 / 超时) 抛 OpcUaException. 业务层失败 (节点不可读) 通过 Status 返回, 不抛异常.
注意事项
- 轮询是最简单但最浪费的方式 — 100 个节点就是 100 次 RPC. 实际项目超过 5 个节点建议用 订阅模式.
- 周期不能小于网络 RTT, 否则 Read 还没回来下一次又发了. 局域网典型 1-50ms RTT, 周期 100ms 以下要谨慎.
- 长期运行务必加
try/catch + Connect 重试, 否则一次断网整个程序就死了.
相关链接
- 多点订阅采集 — 推荐方式
- 全流程数据采集到 CSV
- 快速开始
- C# SDK Read API