Переменная сервера node-opcua сбрасывается до начального значения после ее изменения методом setValueFromSource

Я прочитал это поток о том, как записать значение тега непосредственно на локальный сервер node-opcua. Я обнаружил, что метод setValueFromSource() работает не так, как ожидалось. Точнее, он изменяет значение переменной, но переменная через несколько секунд сбрасывается до исходного значения.

Другое решение, упомянутое в теме (с использованием метода writeValue()), сработало для меня, и значение переменной не сбрасывается до значения по умолчанию.

Мой сценарий заключается в том, что у меня есть сервер node-opcua, который определяет переменную следующим образом:

// NetWeight tag
let NetWeight = 3.14;

namespace.addVariable({

            componentOf: mettler,
            nodeId: "s=MettlerToledo.NetWeight", 
            browseName: "NetWeight",
            dataType: "Double",
            value: {
                get: function () {
                    return new opcua.Variant({
                        dataType: opcua.DataType.Double,
                        value: NetWeight
                    });
                },
                set: function (variant) {
                    NetWeight = variant.value;
                    return opcua.StatusCodes.Good;
                }
            }
        });

В том же файле у меня также инициализирован клиент node-opcua, который подключается к другому серверу OPC, подписывается и отслеживает тег, а при изменении копирует значение отслеживаемого тега в переменную локального сервера node-opcua. Итак, по сути, мы копируем значение тега удаленного сервера OPC на наш локальный сервер OPC.

the_sub.monitor(
            {
                nodeId: opcua.resolveNodeId("ns=5;i=20"),
                attributeId: opcua.AttributeIds.Value
            },
            {
                samplingInterval: 500,
                discardOldest: true,
                queueSize: 10
            },
            opcua.TimestampsToReturn.Both,
            (err, monitoredItem) => {
                monitoredItem.on("changed", function (dataValue) {
                    console.log("NetWeight changed: ", dataValue.value.value);

                    let nodeToChange = server.engine.addressSpace.findNode('s=MettlerToledo.NetWeight');
                    console.log("Current value: ", nodeToChange._dataValue.value.value);
                    nodeToChange.setValueFromSource(
                        new opcua.Variant({ dataType: "Double", value: dataValue.value.value }),
                        opcua.StatusCodes.Good, new Date()
                    );

                    /*nodeToChange.writeValue(
                        null, 
                        new opcua.DataValue({
                          value: new opcua.Variant({dataType: opcua.DataType.Double, value: dataValue.value.value})
                        }),
                        null, 
                        () => { }
                    );*/

                    console.log("Value after setValueFromSource: ", nodeToChange._dataValue.value.value);

                });
            }
        );

Вывод в консоли выглядит так, что ясно показывает, что значение всегда сбрасывается до 3.14:

NetWeight changed:  72
Current value:  3.14
Value after setValueFromSource:  72

NetWeight changed:  73
Current value:  3.14
Value after setValueFromSource:  73

NetWeight changed:  74
Current value:  3.14
Value after setValueFromSource:  74

NetWeight changed:  73
Current value:  3.14
Value after setValueFromSource:  73

NetWeight changed:  74
Current value:  3.14
Value after setValueFromSource:  74

Когда вместо этого я использую метод writeValue(), вывод соответствует ожидаемому, и уже установленное значение остается неизменным до тех пор, пока оно не будет записано при следующем изменении.

Является ли это ошибкой в ​​том, как вызов setValueFromSource() обрабатывается сервером node-opcua?


person mav3r1ck    schedule 01.03.2021    source источник