如何解决node-opcua 服务器变量在通过 setValueFromSource 方法更改后重置为初始值
我已经阅读了关于如何直接在本地 node-opcua 服务器上写入标签值的 thread。我的发现是方法 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()
方法时,输出符合预期,并且已经设置的值保持不变,直到写入下一次更改。
这是 node-opcua 服务器如何处理 setValueFromSource()
调用的错误吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。