gpt4 book ai didi

javascript - Node.js 在 node-opcua 中设置动态变量

转载 作者:行者123 更新时间:2023-12-03 05:55:09 27 4
gpt4 key购买 nike

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

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

有了这个“标签”,opc 服务器需要将它们添加到 Node “设备”。

当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 定义,在 n 中写入正确的变量记录数组。

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

var foo = {
答:5,
乙:6,
初始化:函数(){
这个.c = 这个.a + 这个.b;
返回这个;
}
}

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

最佳答案

问题,

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

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

关于javascript - Node.js 在 node-opcua 中设置动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39965968/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com