1

シミュレーション PLC で B&R Automation Studio を使用しています。いくつかのプログラムをいじっているだけで、問題が発生しました。

システムのアラームのリストがあります。これらのアラームのいずれかが作動した場合、アラーム フラグが必要です。アラームが 5 つしかないので、これは単純な OR ステートメントで行うのがさらに簡単になります。

しかし、アラームが 100 個あるとしたら、すべて手動で入力するには時間がかかります。私の最初の考えは、すべてのアラームを配列に入れて、任意の要素に簡単にアクセスできるようにすることですが、これを行うために、これらすべての変数をシステムに入力する必要はありませんか? だから私は多くの時間を節約しないでしょうか?配列に 100 個以上の変数を手動で入力するプロセスをスキップできるように、利用できる方法または関数ブロックはありますか?

4

1 に答える 1

2

100 以上のアラームまたは変数を入力する必要があることを回避する方法はないと思います。少なくとも、アラームを設定するには、各アラーム条件を評価する必要があります。

私が便利だと思う方法の 1 つは、すべてのアラームを含む列挙型リストを定義し、これを使用してアラーム配列内の個々のアラーム ビットを設定することです。アラーム フラグを 1 つだけ設定する場合は、配列全体を反復処理できます。または、複数のフラグがある場合は、列挙型をグループ化し、それに応じて繰り返すことができます。

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 に答える