问题描述
我已经阅读了关于如何直接在本地 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 (将#修改为@)