2016-03-02 2 views
0

Я использую B & R Automation Studio на PLC моделирования. Я просто играю с некоторыми программами и сталкиваюсь с проблемой.Использование массивов в структурированном тексте

У меня есть список аварийных сигналов для моей системы. Если кто-нибудь из этих тревог погаснет, я хочу, чтобы там был флаг тревоги. Это достаточно просто, чтобы сделать простой оператор OR, сделанный еще проще, потому что у меня только 5 аварийных сигналов.

Однако, если бы у меня было 100 будильников, потребуется много времени, чтобы ввести их все в монах. Мои первые мысли состоят в том, чтобы поместить все тревоги в массив, чтобы затем я мог легко получить доступ к любому элементу, но для этого мне не нужно было вводить все эти переменные в систему в любом случае? так что я бы не спасал много времени? Есть ли способ или функциональный блок, который я могу использовать, чтобы я мог пропустить ручной процесс ввода более 100 переменных в массив?

Благодаря

+0

Имеет ли ваш список аварийных сигналов какую-либо цифровую консистенцию (т. Е. Alarm1, Alarm2 и т. Д.), Где вы можете проходить через них в цикле? – mrsargent

+0

Нет, они называются такими вещами, как «Circuit_Breaker_Alarm» «Emergency_Stop_Alarm». Кажется, я не думаю об этом, не ставя тревог в другой список –

ответ

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 
Смежные вопросы