服务端信息
概述
OPC UA 标准节点 i=2256 (Server.ServerStatus) 暴露服务端运行时信息。SDK 把 11 个子节点 (i=2257..i=2266 + i=2992 + i=2993) 一次装配为强类型 DarraUa_ServerStatus 结构体。
对应规范段: Part 5 §6.3。
API
| 函数 | 类别 | 读写 | 说明 |
|---|---|---|---|
| DarraUa_Session_ReadServerStatus(ua, &out_status) | 诊断 | 读 | 一次性 11 节点 RPC |
| DarraUa_Session_ReadServerState(ua, &out_state) | 诊断 | 读 | 仅读 i=2259 |
| DarraUa_Session_ReadCurrentTime(ua, &out_utc_ms) | 诊断 | 读 | 仅读 i=2258 (UTC ms epoch) |
| DarraUa_FreeServerStatus(status) | 释放 | — | 释放 ServerStatus |
相关结构:
typedef struct {
int64_t start_time; // UTC ms epoch
int64_t current_time; // UTC ms epoch
DarraUa_ServerState state;
DarraUa_BuildInfo* build_info; // 嵌套指针
uint32_t seconds_till_shutdown;
char* shutdown_reason; // UTF-8
} DarraUa_ServerStatus;
typedef struct {
char* product_uri;
char* manufacturer_name;
char* product_name;
char* software_version;
char* build_number;
int64_t build_date; // UTC ms epoch
} DarraUa_BuildInfo;
typedef enum {
SERVER_STATE_RUNNING = 0, // 正常
SERVER_STATE_FAILED = 1, // 致命故障
SERVER_STATE_NO_CONFIGURATION = 2, // 缺配置
SERVER_STATE_SUSPENDED = 3, // 被运维挂起
SERVER_STATE_SHUTDOWN = 4, // 关停中
SERVER_STATE_TEST = 5, // 测试模式
SERVER_STATE_COMMUNICATION_FAULT = 6, // 链路故障
SERVER_STATE_UNKNOWN = 7 // SDK 兜底
} DarraUa_ServerState;
代码示例
#include <opcua.h>
DarraUa_Session* ua;
DarraUa_Session_New("opc.tcp://localhost:4840", &ua);
DarraUa_Session_Connect(ua);
// 1) 一次性
DarraUa_ServerStatus* status = NULL;
DarraUa_StatusCode rc = DarraUa_Session_ReadServerStatus(ua, &status);
if (rc == UA_GOOD && status) {
printf("Start = %lld\n", (long long)status->start_time);
printf("State = %d\n", status->state);
printf("Build = %s %s\n",
status->build_info->product_name,
status->build_info->software_version);
if (status->state != SERVER_STATE_RUNNING)
printf("⚠ 倒计时 %u s\n", status->seconds_till_shutdown);
DarraUa_FreeServerStatus(status);
}
// 2) 轻量心跳
DarraUa_ServerState state;
if (DarraUa_Session_ReadServerState(ua, &state) == UA_GOOD &&
state == SERVER_STATE_RUNNING)
printf("在线\n");
// 3) 时钟漂移
int64_t server_now_ms;
if (DarraUa_Session_ReadCurrentTime(ua, &server_now_ms) == UA_GOOD) {
int64_t local_now_ms = /* time(NULL)*1000 */;
printf("时钟差 = %lld ms\n", (long long)(local_now_ms - server_now_ms));
}
跨语言对照
| 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 |