跳到主要内容

单点周期采集

最简单的入门案例: 用 while + Sleep + Read 循环, 每秒读一次服务器时间并打印. 用 C# 示例.

配套示例

完整代码

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 重试, 否则一次断网整个程序就死了.

相关链接