我正在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()

推荐答案

您需要设置nodesToReadSize:

    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.nodesToReadSize = nodeCount;
    request.nodesToRead = ids;

C++相关问答推荐

使用SWI—Prolog的qsave_program生成二进制文件有什么好处?'

核心转储文件中出现奇怪的大小变化

识别和处理c中整数溢出的最佳方法?

在 struct 中强制转换空指针

使用错误的命令执行程序

GDB输出ARM助记符

为什么我从CSV文件中进行排序和搜索的代码没有显示数据的所有结果?

关于";*(++p)->;t";、&++p->;t";和&q;++*p->;t";的问题

如何在C-函数中混合使用C代码和ASM?

在C中创建任意类型的只读指针参数

链表删除 node 错误

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

从整型转换为浮点型可能会改变其值.

当用C打印过多的';\n';时输出不正确

区分MySQL C界面中的文本和BLOB字段

函数的typedef是标准 C 语法吗?它与函数指针的typedef有何不同?

如何用用户输入的多个字符串填充数组?

SSE 向量与 Epsilon 的比较

如何正确探测平台设备?