跳到主要内容

服务端信息

概述

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#PythonJavaC++RustC
ReadServerStatusread_server_statusreadServerStatusReadServerStatusread_server_statusDarraUa_Session_ReadServerStatus
ReadServerStateread_server_statereadServerStateReadServerStateread_server_stateDarraUa_Session_ReadServerState
ReadCurrentTimeread_current_timereadCurrentTimeReadCurrentTimeread_current_timeDarraUa_Session_ReadCurrentTime

下一步