在CODESYS(IEC61131)中实例化多个功能块

时间:2017-07-28 18:55:16

标签: real-time instantiation plc codesys iec61131-3

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

2 个答案:

答案 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并不是非常复杂,所以你应该对这个方法没问题。如果您遇到问题,请尝试延长扫描时间或观察错误时间。