js在node-opcua中使用动态变量进行设置

时间:2016-10-10 20:07:31

标签: javascript node.js node-opcua

node-opcua @ https://github.com/node-opcua/node-opcua上的示例说我需要为添加到OPC服务器的每个变量重写代码,这是通过调用'addressSpace.addVariable()来实现的......但是如果我有1000个变量这可能是一项艰巨的任务......最终每个自定义用户都需要重写代码,这可能很乏味......所以我试图动态地进行。

opc从另一个自定义服务器(不是OPC)读取“标签”。

使用这个'标签',opc服务器需要将它们添加到节点'device'。

当OPC服务器node-opcua找到来自网络的变量的get或set时,它会调用正确变量的get或set:

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);
    }

正如我所说,我尝试在获取和设置函数中使用'this'并运气不好,get有一个'this.browseName'(标记名称)属性,可以用来动态读取我的变量,它当前的工作原理。

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

您是否知道使用上述代码使用动态变量的解决方法?我需要一个for循环,一个get和一个set定义用于所有变量(标签),读取和写入一个多属性对象或一个对象数组,比如1个get和1个set定义,它们在一个中写入正确的变量记录数组。

PS:我在堆栈溢出时发现了这个:

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

但在我的情况下,node-opcua变量没有'this'就像示例一样。在'set'(如init)中:this.browseName(如a)和this.nodeId(如b)无法访问。

1 个答案:

答案 0 :(得分:1)

疑难杂症,

您需要将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;
    };
}

你将使用索引来获取和设置数组中的值,像这样的转换函数将提供索引,以便&#34;硬编码&#34;在那些获取和设置属性。