微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node-opcua 服务器变量在通过 setValueFromSource 方法更改后重置为初始值

如何解决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 举报,一经查实,本站将立刻删除。