服务端信息 (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 失效 → 整体返回
null或State = Unknown(具体看哪个字段先失败) - 业务侧建议
if (status == null || status.State == Unknown)判读
最佳实践
- 诊断面板 — 一次性
ReadServerStatus, 显示 6 字段 - 状态栏 — 用
ReadServerState(省带宽) - 关停预警 — 监听
SecondsTillShutdown > 0→ 弹出"服务端将在 N 秒后关闭" - 不要在订阅回调里调 — 避免回调线程做 RPC
跨语言对照
| C# | Python | Java | C++ | Rust | C |
|---|---|---|---|---|---|
| ReadServerStatus | read_server_status | readServerStatus | ReadServerStatus | read_server_status | DarraUa_Session_ReadServerStatus |
| ReadServerState | read_server_state | readServerState | ReadServerState | read_server_state | DarraUa_Session_ReadServerState |
| ReadCurrentTime | read_current_time | readCurrentTime | ReadCurrentTime | read_current_time | DarraUa_Session_ReadCurrentTime |