Чтобы определить возможную проблему с моей реализацией OP C UA с использованием freeopcua (Python), я создал одновременно идентичный минимальный пример с использованием node-opcua и freeopcua. Проблема в том, что я получаю уведомления для подписок, хотя значение не изменилось, например: изменение значения на 10, 10 10, 10, 1, 1, 1 и т. Д. c.
В конце концов я узнал что это на самом деле проблема программного обеспечения PL C. На моем локальном тестировании PL C я не смог воспроизвести проблему. Обновив PL C до микропрограммы, которая использовалась в производительной среде, я также получил это неисправное поведение. После понижения версии поведение исчезло.
Что я не понимаю, так это то, что node-opcua никогда не показывал этот bahvior. Работающий бок о бок узел-opcua работал правильно, а пример freeopcua - нет.
Вопрос: есть ли у узла-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(){});
}) ;