1

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

我有我的系统的警报列表。如果这些警报中的任何一个响起,我希望有一个警报标志。这很简单,可以通过一个简单的 OR 语句来完成,因为我只有 5 个警报。

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

4

1 回答 1

2

我认为没有任何方法可以输入 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
于 2016-03-02T19:25:30.123 回答