我同意 Arndt 你应该使用一组功能块和一个电压和电流阵列。根据您的任务扫描率,您应该能够使用 for 循环扫描所有你的 function blocks 在几行代码中
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 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 用这种方法你应该没问题,这并不是非常复杂。如果您遇到问题,请尝试延长扫描时间或观察错误时间。
watch dog
function block
只需创建一个功能块的数组:
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;