跳到主要内容

服务端信息 (ReadServerStatus / BuildInfo / ServerState)

概述

OPC UA 标准节点 i=2256 (Server.ServerStatus) 暴露了服务端运行时信息: 启动时间 / 当前时间 / 运行状态 / 构建信息 / 关停倒计时 / 关停原因。SDK 把这 11 个子节点 (i=2257..i=2266 + i=2992 + i=2993) 一次装配为强类型 ServerStatus 对象。

对应规范段: Part 5 §6.3 (ServerStatusDataType)。

API

方法 / 属性类别读写说明
ua.ReadServerStatus()诊断返回完整 ServerStatus (一次性 11 节点 RPC)
ua.ReadServerState()诊断仅读 i=2259, 返回 ServerState 枚举
ua.ReadCurrentTime()诊断仅读 i=2258, 返回 DateTime? (UTC)

相关结构:

public class ServerStatus
{
public DateTime StartTime { get; } // 服务端启动 UTC
public DateTime CurrentTime { get; } // 服务端当前 UTC
public ServerState State { get; } // 当前状态
public BuildInfo BuildInfo { get; } // 产品/制造商/版本/构建号/构建日期
public uint SecondsTillShutdown { get; } // 距离关停的秒数 (Running 时通常为 0)
public string ShutdownReason { get; } // 关停原因 (LocalizedText.Text)
}

public class BuildInfo
{
public string ProductUri { get; } // i=2262 产品唯一标识 URI
public string ManufacturerName { get; } // i=2263 制造商
public string ProductName { get; } // i=2261 产品名
public string SoftwareVersion { get; } // i=2264 版本字符串
public string BuildNumber { get; } // i=2265 构建号
public DateTime BuildDate { get; } // i=2266 构建日期 (UTC)
}

public enum ServerState
{
Running = 0, // 正常
Failed = 1, // 致命故障
NoConfiguration = 2, // 缺配置
Suspended = 3, // 被运维挂起
Shutdown = 4, // 关停中
Test = 5, // 测试模式
CommunicationFault = 6, // 底层链路故障
Unknown = 7 // SDK 兜底 (读失败)
}

代码示例

using DarraOpcUa_Client;

using var ua = new DarraOpcUa("opc.tcp://localhost:4840");
ua.Connect();

// 1) 一次性拉所有
var status = ua.ReadServerStatus();
Console.WriteLine($"Start = {status.StartTime}");
Console.WriteLine($"Now = {status.CurrentTime}");
Console.WriteLine($"State = {status.State}");
Console.WriteLine($"Build = {status.BuildInfo}");
// → "DarraPLC 1.2.3.4 (build 20260420 @ 2026-04-20)"

if (status.State != ServerState.Running)
Console.WriteLine($"⚠ 服务端非 Running, 倒计时 {status.SecondsTillShutdown}s, 原因: {status.ShutdownReason}");

// 2) 轻量心跳 (省 RPC)
var st = ua.ReadServerState();
if (st == ServerState.Running) statusBar.Text = "在线";

// 3) 时钟漂移检查
var serverNow = ua.ReadCurrentTime();
if (serverNow.HasValue)
{
var drift = (DateTime.UtcNow - serverNow.Value).TotalMilliseconds;
Console.WriteLine($"客户端 - 服务端时钟差 = {drift:F1} ms");
}

错误处理

  • 读失败 (任一字段) 不抛异常, 字段用默认值并把整体 State = Unknown
  • 网络断 / Session 失效 → 整体返回 nullState = Unknown (具体看哪个字段先失败)
  • 业务侧建议 if (status == null || status.State == Unknown) 判读

最佳实践

  • 诊断面板 — 一次性 ReadServerStatus, 显示 6 字段
  • 状态栏 — 用 ReadServerState (省带宽)
  • 关停预警 — 监听 SecondsTillShutdown > 0 → 弹出"服务端将在 N 秒后关闭"
  • 不要在订阅回调里调 — 避免回调线程做 RPC

跨语言对照

C#PythonJavaC++RustC
ReadServerStatusread_server_statusreadServerStatusReadServerStatusread_server_statusDarraUa_Session_ReadServerStatus
ReadServerStateread_server_statereadServerStateReadServerStateread_server_stateDarraUa_Session_ReadServerState
ReadCurrentTimeread_current_timereadCurrentTimeReadCurrentTimeread_current_timeDarraUa_Session_ReadCurrentTime

下一步