我正在try 用C语言创建一个小程序,它将使用Open62541库通过OPC/UA连接轮询一帧数据,并将其转发到Kafka服务器.
当分别从 node 获取值时,一切工作正常,但我想使用UA_ReadRequest键.问题是,我只收到了空洞的回应.
OPC/UA服务器是使用freopc包在Python中编写的.
下面的函数try 使用UA_ReadResponse来获取指定 node ID的几个值:
void retrieveOPCData(void)
{
UA_ReadRequest request;
UA_ReadRequest_init(&request);
UA_ReadValueId ids[nodeCount];
for (int i = 0; i < nodeCount; i++)
{
UA_ReadValueId_init(&ids[i]);
ids[i].attributeId = UA_ATTRIBUTEID_VALUE;
ids[i].nodeId = nodesToRead[i];
}
request.nodesToRead = ids;
for (int i = 0; i < nodeCount; i++)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "ID%i: %s, %i", i,
request.nodesToRead[i].nodeId.identifier.string.data,
request.nodesToRead[i].nodeId.namespaceIndex);
}
UA_ReadResponse response = UA_Client_Service_read(client, request);
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Status: %i",
response.responseHeader.serviceResult);
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Responses: %li", response.resultsSize);
}
结果值为UA_STATUSCODE_GOOD,但响应数量为0.在一个接一个地获取值时,它可以很好地工作,如下所示:
void readNodeAtIndex(int index)
{
if (index >= nodeCount)
{
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Index out of Range");
return;
}
UA_Variant variant;
UA_Variant_init(&variant);
const UA_NodeId nodeId = nodesToRead[index];
UA_StatusCode retval = UA_Client_readValueAttribute(client, nodeId, &variant);
if (retval == UA_STATUSCODE_GOOD && UA_Variant_hasScalarType(&variant,
&UA_TYPES[UA_TYPES_DOUBLE]))
{
UA_Double value = *(UA_Double*)variant.data;
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Double-Value: %f", value);
}
else if (retval == UA_STATUSCODE_GOOD && UA_Variant_hasScalarType(&variant,
&UA_TYPES[UA_TYPES_BOOLEAN]))
{
UA_Boolean value = *(UA_Boolean*)variant.data;
UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Boolean-Value: %i", value);
}
UA_Variant_clear(&variant);
}
OPC/UA服务器设置如下:
server = Server()
space_url = "opc.tcp://localhost:61032"
server.set_endpoint(space_url)
server.set_security_policy([ua.SecurityPolicyType.NoSecurity])
node = server.get_objects_node()