为了识别使用freeopcua (Python)的OPC-UA实现可能存在的问题,我使用node-opcua和freeopcua同时创建了一个相同的最小示例。问题是我收到了订阅通知,尽管值没有更改,例如:值更改为10,10,10,10,1,1,1等。
最后,我发现这其实是PLC的软件问题。在我的本地测试PLC上,我无法重现此问题。通过将PLC更新为在生产环境中使用的固件,我也得到了这个错误行为。降级后,行为消失了。
我不明白的是node-opcua从来没有显示过这种行为。并行运行node-opcua可以正常工作,而freeopcua示例不能。
问题是: node-opcua是否具有某种内部机制,即使它从服务器接收到所有通知,它也不会将所有通知传递给客户端。但是因为值实际上没有改变,所以它会忽略它们吗?
这是我在我的示例中使用的代码,我在Github页面上修改了客户端示例。
var opcua = require("node-opcua");
var async = require("async");
var endpointUrl = "opc.tcp://<ip>:4840";
var client = new opcua.OPCUAClient({ endpoint_must_exist: false });
var the_session = null;
var sub_node = "ns=3;s=Path.To.Node"
async.series([
function(callback) {
client.connect(endpointUrl,function (err) {
if(err) {
console.log(" cannot connect to endpoint :" , endpointUrl );
} else {
console.log("connected !");
}
callback(err);
});
},
function(callback) {
client.createSession( function(err,session) {
if(!err) {
the_session = session;
}
callback(err);
});
},
function(callback) {
the_subscription=new opcua.ClientSubscription(the_session,{
requestedPublishingInterval: 1000,
requestedLifetimeCount: 10,
requestedMaxKeepAliveCount: 2,
maxNotificationsPerPublish: 10,
publishingEnabled: true,
priority: 10
});
the_subscription.on("started",function(){
console.log("started");
}).on("keepalive",function(){
console.log("keepalive");
}).on("terminated",function(){
callback();
});
setTimeout(function(){
the_subscription.terminate();
}, 1000000);
var monitoredItem = the_subscription.monitor({
nodeId: opcua.resolveNodeId(sub_node),
attributeId: opcua.AttributeIds.Value
}, {
samplingInterval: 100,
discardOldest: true,
queueSize: 10
});
monitoredItem.on("changed",function(value){
console.log(new Date(), "- Data Change -", value.value.value);
});
},
function(callback) {
console.log(" closing session");
the_session.close(function(err){
console.log(" session closed");
callback();
});
},
],
function(err) {
if (err) {
console.log(" failure ",err);
} else {
console.log("done!")
}
client.disconnect(function(){});
}) ;发布于 2020-05-27 08:41:36
这似乎是一个有趣的问题!我查看了client_subscription.ts文件的详细信息。
检查第100行:
# Monitoring a Value Change With a DataChange Filter然后检查第118-122行
filter: new DataChangeFilter({
trigger: DataChangeTrigger.StatusValue,
deadbandType: DeadbandType.Absolute,
deadbandValue: 0.1
}),DataChangeFilter class:此类用于设置对DataChange监视项目的筛选
DataChangeTrigger:这是枚举。
DataChangeTrigger.StatusValue表示:如果值的状态代码或值本身发生更改,则触发。否则,如果值保持不变,则不会发出通知。
我希望这能让我们深入了解node-opcua的内部工作原理。
https://stackoverflow.com/questions/60484604
复制相似问题