You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在open62541的WriteCallback中读取结构体字段值

解决open62541读写回调中获取结构体多字段值的问题

你的问题核心是只解析了结构体的第一个成员,没有按完整结构体的内存布局读取后续字段。可以按以下步骤处理:

  1. 定义与XML匹配的本地结构体
    在代码中创建和XML里XV结构体完全对应的C++结构体,保证字段顺序、类型严格一致:
// 必须和XML中XV的字段顺序、类型完全匹配
struct XV {
    double X;
    float V;
};
  1. 在WriteCallback中解析完整结构体
    不要单独转换第一个字段的指针,而是把data->value.data转换成整个结构体的指针,直接访问两个字段:
void WriteCallback(UA_Server* server,
                   const UA_NodeId* sessionId, void* sessionContext,
                   const UA_NodeId* nodeId, void* nodeContext,
                   const UA_NumericRange* range, const UA_DataValue* data) {
    // 先校验数据类型,避免非法转换
    if(data->value.type == &UA_TYPES[UA_TYPES_XV]) {
        // 将数据指针转换为自定义结构体指针
        XV* xvStruct = static_cast<XV*>(data->value.data);
        // 直接访问两个字段
        cout << "X字段值: " << xvStruct->X << endl;
        cout << "V字段值: " << xvStruct->V << endl;
    }
}

关键说明

  • OPC UA的结构体数据在内存中按字段顺序连续存储,你之前只取了第一个double类型成员,后续的float类型V紧跟在X的内存地址之后,必须通过完整结构体才能正确偏移读取。
  • 务必保证本地结构体和XML定义的XV字段顺序、类型完全一致,否则会出现内存偏移错误,读取到无效值。

内容的提问来源于stack exchange,提问作者Aravinth Kalai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 06:35:26