首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有内置的机制可以忽略通知,即使值没有改变?

有没有内置的机制可以忽略通知,即使值没有改变?
EN

Stack Overflow用户
提问于 2020-03-02 15:58:36
回答 1查看 167关注 0票数 1

为了识别使用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页面上修改了客户端示例。

代码语言:javascript
复制
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(){});
    }) ;
EN

回答 1

Stack Overflow用户

发布于 2020-05-27 08:41:36

这似乎是一个有趣的问题!我查看了client_subscription.ts文件的详细信息。

检查第100行:

代码语言:javascript
复制
# Monitoring a Value Change With a DataChange  Filter

然后检查第118-122行

代码语言:javascript
复制
filter: new DataChangeFilter({
              trigger: DataChangeTrigger.StatusValue,
              deadbandType: DeadbandType.Absolute,
              deadbandValue: 0.1
         }),

DataChangeFilter class:此类用于设置对DataChange监视项目的筛选

DataChangeTrigger:这是枚举。

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

我希望这能让我们深入了解node-opcua的内部工作原理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60484604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档