在结构化文本中使用数组

时间:2016-03-02 14:28:06

标签: arrays plc

我在模拟PLC上使用B& R Automation Studio。我正在玩一些程序并遇到了一个问题。

我有一个系统警报列表。如果这些警报中的任何一个响起,我希望有一个警报标志。这很容易通过一个简单的OR语句做得更容易,因为我只有5个警报。

但是,如果我要发出100个警报,那么将需要很长时间才能完全输入这些警报。我的第一个想法是将所有警报放入一个数组中,这样我就可以轻松访问任何元素,但为了做到这一点,我还不需要将所有这些变量输入到系统中吗?所以我不会节省很多时间?是否有可以利用的方法或功能块,以便我可以跳过将100多个变量输入数组的手动过程?

由于

1 个答案:

答案 0 :(得分:1)

我认为没有办法输入100多个警报或变量。至少,您必须评估每个警报条件以设置警报。

我认为有用的一种方法是定义包含所有警报的枚举列表,然后使用它来设置警报数组中的各个警报位。如果您只想设置一个警报标志,则可以迭代完整的阵列。或者,如果您有多个标志,则可以对枚举进行分组并相应迭代。

VAR
  arrAlarm: ARRAY [0 .. ALARM_SIZE] OF BOOL;
  bFlag: BOOL;
  bFlag1, bFlag2: BOOL;
  i: INT;
END_VAR

(* Example code for setting alarmbits. This could mean 100+ lines... *)
arrAlarm[ALARM_CircuitBreaker1] := IO_a;
arrAlarm[ALARM_CircuitBreaker2] := IO_b;
arrAlarm[ALARM_CircuitBreaker3] := IO_c;
arrAlarm[ALARM_Temperature1] := IO_d > 100;
arrAlarm[ALARM_Temperature2] := IO_e > 100;
arrAlarm[ALARM_Temperature3] := IO_f > 100;
arrAlarm[ALARM_EmergencyStop] := NOT IO_g;

(* Example code for setting alarm flags. This could be even simpler if only one flag *)
bFlag := FALSE;
FOR i := 0 to ALARM_SIZE - 1 DO
  IF arrAlarm[i] THEN
    bFlag := TRUE;
  END_IF;
END_FOR;
bFlag1 := FALSE;
FOR i := ALARM_Temperature1 to ALARM_Temperature3 DO
  IF arrAlarm[i] THEN
    bFlag1 := TRUE;
  END_IF;
END_FOR;
bFlag2 := FALSE;
FOR i := ALARM_CircuitBreaker1 to ALARM_EmergencyStop DO
  IF arrAlarm[i] THEN
    bFlag2 := TRUE;
  END_IF;
END_FOR;

(* Definition of alarms. These could be an extract from a definition file *)
TYPE E_ALARM :
(
  ALARM_Temperature1,
  ALARM_Temperature2,
  ALARM_Temperature3,
  ALARM_CircuitBreaker1,
  ALARM_CircuitBreaker2,
  ALARM_CircuitBreaker3,
  ALARM_EmergencyStop,
  ALARM_SIZE,
);
END_TYPE