Я прочитал это поток о том, как записать значение тега непосредственно на локальный сервер 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?