以下是一个使用ua-client-sdk库中的UA_Client_readValueAttribute_async函数读取数据的简单客户端案例:
#include <open62541/client_highlevel_async.h>
#include <open62541/plugin/log_stdout.h>
int main(void) {
UA_Client* client = UA_Client_new();
UA_ClientConfig_setDefault(UA_Client_getConfig(client));
// 连接到OPC UA服务器
UA_StatusCode status = UA_Client_connect(client, "opc.tcp://localhost:4840");
if(status != UA_STATUSCODE_GOOD) {
printf("无法连接到服务器\n");
return -1;
}
// 创建请求结构体
UA_ReadRequest request;
UA_ReadRequest_init(&request);
// 设置要读取的节点信息
request.nodesToRead = UA_ReadValueId_new();
request.nodesToReadSize = 1;
// 设置节点ID和属性ID(这里以Node ID为"ns=2;i=1234",属性为Value)
request.nodesToRead[0].nodeId = UA_NODEID_NUMERIC(2, 1234);
request.nodesToRead[0].attributeId = UA_ATTRIBUTEID_VALUE;
// 发送异步读取请求
UA_UInt32 requestId;
status = UA_Client_readValueAttributeAsync(client, &request, &requestId);
if (status != UA_STATUSCODE_GOOD) {
printf("异步读取请求发送失败\n");
return -1;
}
// 等待响应结果
UA_DataValue* value;
status = UA_Client_waitForResponse(client, requestId, &value);
if (status != UA_STATUSCODE_GOOD || !value) {
printf("未能获取响应结果\n");
return -1;
}
// 输出读取结果
if (value->hasValue) {
UA_String valueString = UA_STRING_NULL;
UA_Variant_toScalar(&value->value, &valueString);
printf("读取到的数据:%.*s\n", (int)valueString.length, valueString.data);
}
// 释放资源
UA_DataValue_deleteMembers(value);
UA_ReadRequest_deleteMembers(&request);
UA_Client_disconnect(client);
UA_Client_delete(client);
return 0;
}
请注意,这只是一个简单的示例代码,具体使用方法可能因实际情况而有所不同。在实际使用时,请根据OPC UA服务器的地址和节点信息进行适当修改。
内容由零声教学AI助手提供,问题来源于学员提问