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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...