跳到主要内容

单点周期采集

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

配套示例

完整代码

using DarraOpcUa_Client;
using System;
using System.Threading;

class Program
{
static void Main()
{
// 替换成现场 PLC 工控机的 IP; 本机调试可用 localhost
const string endpoint = "opc.tcp://192.168.1.100:4840";
const string nodeId = "i=2258"; // ServerStatus.CurrentTime (OPC UA 标准节点)

// 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);
}
}
}

代码要点

  • DataValue 持有 native 内存句柄, 必须 using 否则会泄漏
  • 先判 Status.IsGood 再用 Value, 业务层失败通过 Status 返回不抛异常
  • OpcUaException 只代表通讯层失败 (断网/超时), 必须 catch + 重试, 否则一次断网整个程序就死

注意事项

  • 轮询是最简单但最浪费的方式 — 100 个节点就是 100 次 RPC. 实际项目超过 5 个节点建议用 订阅模式.
  • 周期不能小于网络 RTT, 否则 Read 还没回来下一次又发了. 局域网典型 1-50ms RTT, 周期 100ms 以下要谨慎.
  • 长期运行务必加 try/catch + Connect 重试, 否则一次断网整个程序就死了.

相关链接