2

我使用 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 个实例。任何想法都受到高度赞赏。

4

2 回答 2

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;
于 2017-07-29T07:24:05.343 回答
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不是非常复杂,因此您应该可以接受这种方法。如果您遇到问题,请尝试延长扫描时间或查看错误时间。

于 2017-07-30T20:19:53.660 回答