Обновление / запись переменной в ObjectNode - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь создать OPC UA-сервер, который отслеживает REST API.Код для класса объекта создается из файла XML, как описано в документации open62541.

Я также пытался использовать родительский идентификатор, а также пытался найти ссылки на оба узла и использовать ихNodeIds в функции записи, но ничего не работает.Я всегда получаю сообщение об ошибке «Запрос на запись возвратил код состояния BadNodeClassInvalid», хотя возвращаемое значение внутри nodeIter () всегда равно 0.

#define COUNTER_NODE_ID

UA_Server *server;

static void stopHandler(int sign) {
    UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_SERVER, "received ctrl-c");
    running = false;
}


static UA_StatusCode
nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId referenceTypeId, 
         void *handle) {
    UA_NodeId *parent = (UA_NodeId *)handle;
    printf("%d, %d --- %d ---> NodeId %d, %d\n",
           parent->namespaceIndex, parent->identifier.numeric,
           referenceTypeId.identifier.numeric, childId.namespaceIndex,
           childId.identifier.numeric);
                ...
                get_variable_from_rest_api();
                ...
                //Update the OPC-UA node
                UA_Variant value;
                UA_Float newFloat = (UA_Float)current_element>valuedouble;
                UA_Variant_setScalarCopy(&value, &newFloat, 
                                         &UA_TYPES[UA_TYPES_FLOAT]);
                retval |= UA_Server_writeValue(server, childId, value);
                // retval is 0
    return retval;
}

//Function that the server will call each time that the information is updated
void *apiWatcher(void *ptr) {
    UA_NodeId *parent = UA_NodeId_new();
    *parent = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
    while (running == true) {
        UA_Server_forEachChildNodeCall(server, UA_NODEID_NUMERIC(0, COUNTER_NODE_ID), 
                                       nodeIter, (void *) parent);
        usleep(500);
    }
    UA_NodeId_delete(parent);
    return ptr;
}
int main(int argc, char **argv) {

    signal(SIGINT, stopHandler);
    signal(SIGTERM, stopHandler);

    pthread_t threadSensor;

    UA_ServerConfig *config = UA_ServerConfig_new_default();
    server = UA_Server_new(config);

    ....
    UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, 0),
                            UA_NODEID_NUMERIC(0,UA_NS0ID_OBJECTSFOLDER), 
                            UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 
                            UA_QUALIFIEDNAME(1, "FMU"), 
                            UA_NODEID_NUMERIC(2, COUNTER_NODE_ID), 
                            object_attr, NULL, &createdNodeId);

        if(pthread_create( &threadSensor, NULL, apiWatcher, server ))
        {
            fprintf(stderr,"Error - pthread_create(): %d\n",ret);
            exit(EXIT_FAILURE);
        }
        retval = UA_Server_run(server, &running);
    }
    UA_Server_delete(server);
    UA_ServerConfig_delete(config);
    return (int) retval;
}

...