Javascript 是否有一种内置机制可以忽略通知,尽管值没有更改?

Javascript 是否有一种内置机制可以忽略通知,尽管值没有更改?,javascript,node.js,subscription,node-opcua,Javascript,Node.js,Subscription,Node Opcua,为了确定使用freeopcua(Python)的OPC-UA实现可能存在的问题,我同时创建了一个使用节点opcua和freeopcua的相同最小示例。问题是我收到了订阅通知,尽管值没有改变,例如。g、 :值更改为10、10、10、1、1、1等 最后,我发现这实际上是一个PLC软件问题。在我的本地测试PLC上,我无法重现此问题。通过将PLC更新为生产环境中使用的固件,我也得到了这种错误行为。降级后,这种行为就消失了 我不明白的是,node opcua从未显示过这种行为。并行运行节点opcua工作正

为了确定使用freeopcua(Python)的OPC-UA实现可能存在的问题,我同时创建了一个使用节点opcua和freeopcua的相同最小示例。问题是我收到了订阅通知,尽管值没有改变,例如。g、 :值更改为10、10、10、1、1、1等

最后,我发现这实际上是一个PLC软件问题。在我的本地测试PLC上,我无法重现此问题。通过将PLC更新为生产环境中使用的固件,我也得到了这种错误行为。降级后,这种行为就消失了

我不明白的是,node opcua从未显示过这种行为。并行运行节点opcua工作正常,而freeopcua示例工作不正常

问题是:node opcua是否具有某种内部机制,尽管它从服务器接收到通知,但不会将所有通知传递给我的客户端。但是因为值实际上没有改变,所以忽略了它们

这是我在示例中使用的代码,我从Github页面上的客户机示例中修改了该代码

var opcua=require(“节点opcua”);
var async=require(“异步”);
var endpointUrl=“opc.tcp://:4840”;
var client=new opcua.OPCUAClient({endpoint\ u必须\ u exist:false});
var_session=null;
var sub_node=“ns=3;s=Path.To.node”
异步系列([
函数(回调){
client.connect(端点URL,函数(err){
如果(错误){
log(“无法连接到端点:,端点URL”);
}否则{
console.log(“已连接!”);
}
回调(err);
});
},
函数(回调){
createSession(函数(err,session){
如果(!err){
_session=session;
}
回调(err);
});
},
函数(回调){
_subscription=new opcua.ClientSubscription(_会话{
请求发布时间间隔:1000,
请求的生存时间计数:10,
请求的MaxKeepAliveCount:2,
maxNotificationsPerPublish:10,
可出版:是的,
优先事项:10
});
_subscription.on(“started”,function()){
console.log(“启动”);
}).on(“keepalive”,函数(){
console.log(“keepalive”);
}).on(“终止”,函数(){
回调();
});
setTimeout(函数(){
_订阅。终止();
}, 1000000);
var monitoredItem=_subscription.monitor({
nodeId:opcua.resolveNodeId(子节点),
attributeId:opcua.attributeId.Value
}, {
采样间隔:100,
对,,
排队人数:10
});
monitoredItem.on(“已更改”,函数(值){
log(新日期(),“-数据更改-”,value.value.value);
});
},
函数(回调){
控制台日志(“结束会话”);
_会话。关闭(函数(err){
console.log(“会话已关闭”);
回调();
});
},
],
功能(err){
如果(错误){
控制台日志(“失败”,错误);
}否则{
log(“完成!”)
}
client.disconnect(函数(){});
}) ;

这似乎是一个有趣的问题!我调查了文件的细节

检查第100行:

# Monitoring a Value Change With a DataChange  Filter
然后检查第118-122行

filter: new DataChangeFilter({
              trigger: DataChangeTrigger.StatusValue,
              deadbandType: DeadbandType.Absolute,
              deadbandValue: 0.1
         }),
:此类用于为DataChange监视的项目设置筛选

:这是枚举

DataChangeTrigger.StatusValue表示:如果值的状态代码或值本身发生更改,则触发。否则,如果值保持不变,则不会发出通知


我希望这能深入了解节点opcua的内部工作。

这似乎是一个有趣的问题!我调查了文件的细节

检查第100行:

# Monitoring a Value Change With a DataChange  Filter
然后检查第118-122行

filter: new DataChangeFilter({
              trigger: DataChangeTrigger.StatusValue,
              deadbandType: DeadbandType.Absolute,
              deadbandValue: 0.1
         }),
:此类用于为DataChange监视的项目设置筛选

:这是枚举

DataChangeTrigger.StatusValue表示:如果值的状态代码或值本身发生更改,则触发。否则,如果值保持不变,则不会发出通知

我希望这能深入了解node opcua的内部工作