Запись значения в тег PLC с помощью open62541 - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь записать значение bool в тег PLC (включить или выключить реле), используя OPC UA как Клиент запись на сервер OPC UA, работающий на Siemens S7-1512 PLC . Клиент должен быть реализован на c / c ++

Я пробовал несколько разных клиентов с графическим интерфейсом без проблем.

Также я пробовалPython SDK, включая freeopcua . У меня были небольшие проблемы, но я смог записать значение после установки атрибута в запросе на запись. Но с open62541 я не могу найти никакого решения для этого (код состояния хорош, но значение не изменено Я могу прочитать значения ):

Рабочий запрос Python:

node.set_attribute(ua.AttributeIds.Value, ua.DataValue(not node.get_value()))

C не работает Код запроса ниже:

    UA_WriteRequest request;
    UA_WriteRequest_init(&request);


    request.nodesToWrite = UA_WriteValue_new();
    request.nodesToWriteSize = 1;

    request.nodesToWrite[0].nodeId = UA_NODEID_STRING_ALLOC(3, "\"VALUE\"");
    request.nodesToWrite[0].attributeId = UA_ATTRIBUTEID_VALUE;
    request.nodesToWrite[0].value.hasValue = true;
    request.nodesToWrite[0].value.value.type = &UA_TYPES[UA_TYPES_BOOLEAN];
    request.nodesToWrite[0].value.value.storageType = UA_VARIANT_DATA_NODELETE;
    request.nodesToWrite[0].value.hasServerTimestamp = true;
    request.nodesToWrite[0].value.hasSourceTimestamp = true;
    request.nodesToWrite[0].value.sourceTimestamp = UA_DateTime_now();
    request.nodesToWrite[0].value.value.data = val;

    request.requestHeader.timestamp = UA_DateTime_now();
    request.requestHeader.authenticationToken = UA_NODEID_NUMERIC(0, UA_NS0ID_SESSIONAUTHENTICATIONTOKEN);

    //write to client service
    UA_WriteResponse wResp = UA_Client_Service_write(client, request);

Я ожидаю, что значение тега PLC будет изменено на противоположное значение, или предоставлю мне информацию о том, почему он выиграл 'т работа.

1 Ответ

0 голосов
/ 23 октября 2019

Лучше использовать клиентские API высокого уровня:

UA_NodeId nodeid = UA_NODEID_STRING_ALLOC(3, "\"VALUE\"");
UA_Boolean value = true;
UA_Variant *var= UA_Variant_new();
UA_Variant_setScalarCopy(var, &value, &UA_TYPES[UA_TYPES_BOOLEAN]);
UA_StatusCode ret = UA_Client_writeValueAttribute(client, nodeid, var);
....
UA_Variant_delete(var);

Причина, по которой он отклонен, заключается в том, что вы пытаетесь установить метку времени в своем запросе на запись. Большинство серверов отказываются от этого.

...