以下是一个简单的示例,演示如何使用UA_Client_readValueAttribute_async
函数进行异步读取节点值属性:
#include <open62541/client_config_default.h>
#include <open62541/client_highlevel.h>
void readValueCallback(
UA_Client *client, UA_UInt32 requestId, UA_DataValue *value,
void *userdata, UA_StatusCode statusCode)
{
if (statusCode == UA_STATUSCODE_GOOD && value != NULL)
{
// 处理读取到的节点值属性
printf("Read value: %f\n", *(UA_Double*)value->value.data);
}
else
{
printf("Failed to read value. StatusCode: %s\n", UA_StatusCode_name(statusCode));
}
// 可以在这里做进一步的处理或释放资源
}
int main()
{
// 创建客户端配置和客户端实例
UA_ClientConfig *config = UA_ClientConfig_standard;
UA_Client *client = UA_Client_new(config);
// 连接到OPC UA服务器(请确保OPC服务器地址正确)
const char* serverUrl = "opc.tcp://localhost:4840";
UA_StatusCode connectStatus = UA_Client_connect(client, serverUrl);
if (connectStatus == UA_STATUSCODE_GOOD)
{
// 节点ID表示要读取的节点
const char* nodeIdString = "ns=2;i=12345";
UA_NodeId nodeId = UA_NODEID_STRING(2, nodeIdString);
// 发起异步读取请求,并指定回调函数和用户数据
ua_uint32_t requestId;
ua_statuscode_t readStatus =
UA_Client_readValueAttribute_async(client, nodeId, readValueCallback, NULL, &requestId);
if (readStatus != UA_STATUSCODE_GOOD)
{
printf("Failed to initiate async read request. StatusCode: %s\n", UA_StatusCode_name(readStatus));
}
}
else
{
printf("Failed to connect to OPC UA server. StatusCode: %s\n", UA_StatusCode_name(connectStatus));
}
// 这里可以进行其他的操作或等待异步读取完成
// 清理并关闭客户端连接
UA_Client_disconnect(client);
UA_Client_delete(client);
return 0;
}
注意,这只是一个简化的示例,实际使用时可能需要根据具体情况进行适当的调整和错误处理。另外,请确保已正确安装和配置Open62541库以及所需的依赖项,并在编译时链接相应的库文件。
内容由零声教学AI助手提供,问题来源于学员提问