我使用CODESYS制作了一个功能块来执行电能计量。功能块的输入是电流和电压,输出是能量。 现在,我们需要有1000个这个功能块的实例来运行1000米的代码。写这些实例(以及可能复制和粘贴)似乎并不是最有趣的工作。 想知道是否有人有更聪明的方法来做这么多的实例化。
例如,以下是2个实例的代码(在CODESYS中)的样子:
meter_instance1(CURRENT:=I1, VOTAGE:=V2);
Energy1:= meter_instance1.ENERGY;
meter_instance2(CURRENT:=I2, VOTAGE:=V2);
Energy2:= meter_instance2.ENERGY;
我们希望有1000个实例。 任何想法都受到高度赞赏。
答案 0 :(得分:4)
只需创建一个功能块数组:
aEnergyMeter : array [0..999] of FB_EnergyMeter;
同时制作电压和电流阵列:
aVoltage : array [0..999] of INT; //if you use INT as type
aCurrent : array [0..999] of INT;
然后你可以这样使用它:
aEnergyMeter[0](CURRENT:= aCurrent[0], VOLTAGE := aVoltage[0]);
当你使用相同大小的不同数组时,我宁愿定义一些全局常量:
VAR GLOBAL CONSTANT
firstDevice : UINT := 0;
lastDevice : UINT := 999;
END_VAR
然后你可以像这样定义数组:
aEnergyMeter : array [firstDevice..lastDevice] of FB_EnergyMeter;
答案 1 :(得分:2)
我同意Arndt
你应该使用一组功能块和一个电压和电流阵列。根据您的任务扫描率,您应该能够使用for
循环在几行代码中扫描所有function blocks
var
meterInstance : array[1..1000] of FB_EnergyMeter;
voltage : array[1..1000] of int;
current : array[1..1000] of int;
energy : array[1..1000] of int;
end_var
for i:=1 to 1000 by 1 do
meterInstance[i](Voltage := voltage[i],Current:= current[i]);
energy[i] := meterInstance.Energy;
end_for;
在那个for loop
中,您还可以在进行某些错误检查时将其结合起来
for i:=1 to 1000 by 1 do
meterInstance[i](Voltage := voltage[i],Current:= current[i]);
if meterInstance.Energy > MaxEnergy then
//sound alarm
end_if;
end_for;
这种方法唯一需要注意的是扫描时间对于您的任务来说太快了。由于任务会超限,您可能会收到watch dog
错误。但是,因为你只做了1000个元素而我假设你的function block
并不是非常复杂,所以你应该对这个方法没问题。如果您遇到问题,请尝试延长扫描时间或观察错误时间。