Есть ли встроенный механизм игнорирования уведомлений, хотя значение не изменилось? - PullRequest
0 голосов
/ 02 марта 2020

Чтобы определить возможную проблему с моей реализацией 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(){});
    }) ;
...