跳到主要内容

Method 方法 (C)

OPC UA Method 节点是服务端暴露的 RPC 接口. 通过 DarraUa_Session_Call(...) 调用.

子页跳转
  • 调用方法的完整签名 / 内存所有权 / 找方法 NodeId 请参考 Call.
  • 报警 Acknowledge 也通过 Call 调用, 见 事件订阅.

一分钟示例

#include <darra_opcua/darra_opcua.h>

DarraUa_NodeId obj, mtd;
/* 解析 "ns=2;s=Calculator" / "ns=2;s=Calculator.Add" 到 NodeId 结构 (DarraUa_NodeId_ParseString) */

DarraUa_Variant* args[2];
args[0] = DarraUa_Variant_New(); DarraUa_Variant_SetInt32(args[0], 3);
args[1] = DarraUa_Variant_New(); DarraUa_Variant_SetInt32(args[1], 4);

DarraUa_Variant* outs = NULL;
uint32_t out_n = 0;
DarraUa_Status method_status = 0;

DarraUa_Status st = DarraUa_Session_Call(
h, &obj, &mtd,
(const DarraUa_Variant* const*)args, 2,
&outs, &out_n, &method_status);

/* 释放入参 */
DarraUa_Variant_Delete(args[0]);
DarraUa_Variant_Delete(args[1]);

/* 用出参 */
if (DARRA_UA_STATUS_IS_GOOD(st) && DARRA_UA_STATUS_IS_GOOD(method_status)) {
for (uint32_t i = 0; i < out_n; ++i) {
int32_t r = 0;
DarraUa_Variant_GetInt32(&outs[i], &r);
printf("out[%u] = %d\n", i, (int)r);
}
}

/* 释放出参 (一次性) */
DarraUa_VariantArray_Delete(&outs, out_n);

下一步