下面是一个示例的C++接口封装,将UA_Client_readValueAttribute函数封装成一个类的成员函数:
#include <open62541/client.h>
class UaClient {
public:
UaClient();
~UaClient();
bool connect();
void disconnect();
bool readValueAttribute(const UA_NodeId& nodeId, UA_Variant* value);
private:
UA_Client* m_client;
};
UaClient::UaClient() {
m_client = UA_Client_new();
}
UaClient::~UaClient() {
UA_Client_delete(m_client);
}
bool UaClient::connect() {
UA_ClientConfig_setDefault(UA_Client_getConfig(m_client));
UA_StatusCode status = UA_Client_connect(m_client, "opc.tcp://localhost:4840");
if (status != UA_STATUSCODE_GOOD) {
return false;
}
return true;
}
void UaClient::disconnect() {
UA_Client_disconnect(m_client);
}
bool UaClient::readValueAttribute(const UA_NodeId& nodeId, UA_Variant* value) {
// 将UA_Client_readValueAttribute函数的调用代码放在这里
UA_ReadValueId readValueId;
readValueId.nodeId = nodeId;
readValueId.attributeId = UA_ATTRIBUTEID_VALUE;
UA_ReadRequest request;
request.nodesToRead = &readValueId;
request.nodesToReadSize = 1;
UA_ReadResponse response = UA_Client_Service_read(m_client, request);
if (response.responseHeader.serviceResult == UA_STATUSCODE_GOOD &&
response.resultsSize > 0 && response.results[0].hasValue) {
*value = response.results[0].value.value;
// 释放response内存
for (size_t i = 0; i < response.resultsSize; ++i) {
UA_Variant_deleteMembers(&response.results[i].value.value);
}
UA_ReadResponse_deleteMembers(&response);
return true;
}
// 释放response内存
for (size_t i = 0; i < response.resultsSize; ++i) {
UA_Variant_deleteMembers(&response.results[i].value.value);
}
UA_ReadResponse_deleteMembers(&response);
return false;
}
int main() {
UaClient client;
if (!client.connect()) {
// 连接失败处理逻辑
return -1;
}
// 调用readValueAttribute方法读取节点值
client.disconnect();
return 0;
}
请注意,这只是一个简单示例,并且仅包含了部分功能。根据具体情况,您可能需要进行进一步的封装和错误处理。
内容由零声教学AI助手提供,问题来源于学员提问