服务端信息
概述
OPC UA 标准节点 i=2256 (Server.ServerStatus) 暴露服务端运行时信息。SDK 把 11 个子节点 (i=2257..i=2266 + i=2992 + i=2993) 一次装配为强类型 ServerStatus。
对应规范段: Part 5 §6.3。
API
| 方法 | 类别 | 读写 | 说明 |
|---|---|---|---|
| ua.read_server_status() | 诊断 | 读 | 返回 Result<ServerStatus, OpcUaError> |
| ua.read_server_state() | 诊断 | 读 | 返回 Result<ServerState, OpcUaError> |
| ua.read_current_time() | 诊断 | 读 | 返回 Result<Option<DateTime<Utc>>, OpcUaError> |
相关结构:
pub struct ServerStatus {
pub start_time: DateTime<Utc>, // 启动 UTC
pub current_time: DateTime<Utc>, // 当前 UTC
pub state: ServerState, // 当前状态
pub build_info: BuildInfo, // 产品/版本
pub seconds_till_shutdown: u32, // 距关停秒数
pub shutdown_reason: String, // 关停原因
}
pub enum ServerState {
Running = 0, // 正常
Failed = 1, // 致命故障
NoConfiguration = 2, // 缺配置
Suspended = 3, // 被运维挂起
Shutdown = 4, // 关停中
Test = 5, // 测试模式
CommunicationFault = 6, // 链路故障
Unknown = 7, // SDK 兜底
}
代码示例
use opcua::{DarraOpcUa, ServerState};
use chrono::Utc;
let ua = DarraOpcUa::new("opc.tcp://localhost:4840")?;
ua.connect()?;
// 1) 一次性
let status = ua.read_server_status()?;
println!("Start = {}", status.start_time);
println!("Now = {}", status.current_time);
println!("State = {:?}", status.state);
println!("Build = {} {}",
status.build_info.product_name,
status.build_info.software_version);
if status.state != ServerState::Running {
println!("⚠ 非 Running, 倒计时 {}s", status.seconds_till_shutdown);
}
// 2) 轻量心跳
if matches!(ua.read_server_state()?, ServerState::Running) {
println!("在线");
}
// 3) 时钟漂移
if let Some(server_now) = ua.read_current_time()? {
let drift = (Utc::now() - server_now).num_milliseconds();
println!("时钟差 = {} ms", drift);
}
跨语言对照
| 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 |