以下是将UA_Client_readValueAttribute_async封装到类中的示例代码:
#include <open62541/client_config_default.h>
#include <open62541/client_highlevel_async.h>
class MyClient {
public:
MyClient() {
client = UA_Client_new();
config = UA_Client_getDefaultConfig();
UA_ClientConfig_setDefault(&config);
}
~MyClient() {
UA_Client_delete(client);
}
bool connect(const std::string& url) {
UA_StatusCode status = UA_Client_connect(client, url.c_str());
return status == UA_STATUSCODE_GOOD;
}
void disconnect() {
UA_Client_disconnect(client);
}
void readValueAsync(const std::string& nodeId, UA_HighLevelCallback callback, void* context) {
// 构建节点 ID
const char* nodeIdStr = nodeId.c_str();
UA_NodeId node = UA_NODEID_STRING(1, nodeIdStr);
// 读取属性
const int attributeId = UA_ATTRIBUTEID_VALUE;
// 异步读取值属性
const int requestId = 1; // 可以根据需要自行设置请求 ID
UA_ReadRequest request;
UA_ReadRequest_init(&request);
request.nodesToReadSize = 1;
request.nodesToRead = (UA_ReadValueId*)UA_Array_new(request.nodesToReadSize, &UA_TYPES[UA_TYPES_READVALUEID]);
UA_ReadValueId_init(&request.nodesToRead[0]);
request.nodesToRead[0].nodeId = node;
request.nodesToRead[0].attributeId = attributeId;
UA_AsyncOperation asyncOperation;
asyncOperation.type = UA_ASYNCOPERATIONTYPE_READ;
asyncOperation.asyncCallback.readCallback.callback = callback;
asyncOperation.asyncCallback.readCallback.context = context;
UA_Client_ServiceAsync(client, &request, requestId, &asyncOperation);
}
private:
UA_Client* client;
UA_ClientConfig config;
};
// 示例回调函数
void readValueCallback(UA_Client* client, UA_UInt32 requestId, UA_DataValue* response, void* context) {
// 处理异步读取结果
}
int main() {
MyClient client;
// 连接到 OPC UA 服务器
std::string serverUrl = "opc.tcp://localhost:4840";
if (client.connect(serverUrl)) {
// 异步读取节点值属性
std::string nodeId = "ns=2;s=MyNode";
client.readValueAsync(nodeId, readValueCallback, nullptr);
// 执行其他操作
// 断开连接
client.disconnect();
}
return 0;
}
这是一个简单的封装示例,你可以根据自己的需要进行修改和扩展。请确保已安装 Open62541 库并链接相关库文件。
内容由零声教学AI助手提供,问题来源于学员提问




