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