如何在open62541的WriteCallback中读取结构体字段值
解决open62541读写回调中获取结构体多字段值的问题
你的问题核心是只解析了结构体的第一个成员,没有按完整结构体的内存布局读取后续字段。可以按以下步骤处理:
- 定义与XML匹配的本地结构体
在代码中创建和XML里XV结构体完全对应的C++结构体,保证字段顺序、类型严格一致:
// 必须和XML中XV的字段顺序、类型完全匹配 struct XV { double X; float V; };
- 在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
相关产品推荐
相关产品推荐

