node-opcua @ https://github.com/node-opcua/node-opcua上的示例说我需要为添加到 OPC 服务器的每个变量重写代码,这是通过调用 'addressSpace.addVariable()' 来实现的。 . 但是,如果我有 1000 个变量,这可能是一项艰巨的任务......最终每个自定义用户都想要重写代码,这可能很乏味......所以我试图动态地做到这一点。
opc 从另一个自定义服务器(不是 OPC)读取“标签”。
有了这个“标签”,opc 服务器需要将它们添加到节点“设备”。
当 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);
}
正如我所说,我尝试在 get 和 set 函数中使用“this”,但运气不佳,get 有一个“this.browseName”(标签名称)属性,可用于动态读取我的变量,并且它目前可以工作。
问题出在集合中,集合中的“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)不可访问。