Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点opcua中使用动态变量设置js get_Javascript_Node.js_Node Opcua - Fatal编程技术网

Javascript 在节点opcua中使用动态变量设置js get

Javascript 在节点opcua中使用动态变量设置js get,javascript,node.js,node-opcua,Javascript,Node.js,Node Opcua,节点opcua@上的示例说明,我需要为添加到OPC服务器的每个变量重写代码,这是通过调用“addressSpace.addVariable()”实现的。。。但如果我有1000个变量,这可能是一项艰巨的任务。。。最终,每个自定义用户都需要重新编写代码,这可能会很乏味。。。所以我试着动态地做 opc从另一个自定义服务器(非opc)读取“标签” 使用此“标签”,opc服务器需要将其添加到节点“设备”中 当OPC服务器节点opcua找到来自网络的变量的get或集合时,它调用正确变量的get或集合: fo

节点opcua@上的示例说明,我需要为添加到OPC服务器的每个变量重写代码,这是通过调用“addressSpace.addVariable()”实现的。。。但如果我有1000个变量,这可能是一项艰巨的任务。。。最终,每个自定义用户都需要重新编写代码,这可能会很乏味。。。所以我试着动态地做

opc从另一个自定义服务器(非opc)读取“标签”

使用此“标签”,opc服务器需要将其添加到节点“设备”中

当OPC服务器节点opcua找到来自网络的变量的get或集合时,它调用正确变量的get或集合:

for (var i = 0; i < tags.GetTags.length; i++)
    {
        variables[tags.GetTags[i].Tag] = {"value" : 0.0, "is_set" : false};

        addressSpace.addVariable({
            componentOf: device, // Parent node
            browseName: tags.GetTags[i].Tag, // Variable name
            dataType: "Double", // Type
            value: {
                get: function () {
                    //console.log(Object.getOwnPropertyNames(this));
                    return new opcua.Variant({dataType: opcua.DataType.Double, value: variables[this["browseName"]].value }); // WORKS
                },
                set: function (variant) {
                    //console.log(Object.getOwnPropertyNames(this));
                    variables[this["browseName"]].value = parseFloat(variant.value); // this["browseName"] = UNDEFINED!!!
                    variables[this["browseName"]].is_set = true;
                    return opcua.StatusCodes.Good;
                }
            }
        });

        console.log(tags.GetTags[i].Tag);
    }
for(var i=0;i
正如我所说,我尝试在get和set函数中使用'this'时运气不好,get有一个'this.browseName'(标记名)属性,可以用来动态读取我的变量,它目前可以工作

问题在于集合中的集合“this.browseName”和“this.nodeId”不存在!所以它给出了“未定义”错误。它也不存在于变量中

您知道如何在上述代码中使用动态变量吗?我需要一个for循环,所有变量(标记)都有一个get和一个set定义,这些变量可以读取和写入多属性对象或对象数组,比如在n记录数组中写入正确变量的1个get和1个set定义

PS:我在堆栈溢出上发现:

var foo={
a:5,
b:6,
init:function(){
this.c=this.a+this.b;
归还这个;
}
}

但在我的例子中,node opcua变量没有像示例中那样的“this”。在“set”(比如init)中:this.browseName(比如a)和this.nodeId(比如b)是不可访问的。

Gotcha

您需要将get和set属性转换为如下函数:

addressSpace.addVariable({
            componentOf: device,
            browseName: _vars[i].Tag,
            dataType: "Double",
            value: {
                get: CastGetter(i),
                set: CastSetter(i)
            }
        });

您将使用索引来获取和设置数组中的值,像这样的强制转换函数将在这些获取和设置属性中提供要“硬编码”的索引

function CastGetter(index) {
    return function() {
        return new opcua.Variant({dataType: opcua.DataType.Double, value: opc_vars[index].Value });
    };
}

function CastSetter(index) {
    return function (variant) {
        opc_vars[index].Value = parseFloat(variant.value);
        opc_vars[index].IsSet = true;
        return opcua.StatusCodes.Good;
    };
}