Не претендуя на оригинальность предложу решение к вашему ТЗ:
Owen.jpg
Код:function_block Rotate4 //Блок ротации 4 насосов var_input E1, E2, E3, E4 : bool; // Разрешение на запуск двигателя W1, W2, W3, W4 : bool; // Насосы в работе L1, L2, L3, L4 : bool; // Определяет число запрашиваемых насосов end_var var_output Q1, Q2, Q3, Q4 : bool; // Насосы в пуске A1, A2, A3, A4 : bool; // Насосы в аварии end_var var NextStart : udint; // Указатель на следующий насос для запуска NextStop : udint; // Указатель на следующий насос для останова T1, T2, T3, T4 : SYS.TON; // Таймеры для определения исправности насосов CountWork : udint; // Количество насосов в работе CountQuery : udint; // Требуемое кол-во end_var // Определяем кол-во в работе CountWork := 0; if Q1 then CountWork := CountWork + 1; end_if if Q2 then CountWork := CountWork + 1; end_if if Q3 then CountWork := CountWork + 1; end_if if Q4 then CountWork := CountWork + 1; end_if // Требуемое кол-во CountQuery := 0; if L1 then CountQuery := CountQuery + 1; end_if if L2 then CountQuery := CountQuery + 1; end_if if L3 then CountQuery := CountQuery + 1; end_if if L4 then CountQuery := CountQuery + 1; end_if // Если нужно больше - запускаем следующий if CountQuery > CountWork then // Нужно запустить следующий case NextStart of // Запускаем при условии, что работа разрешена и нет аварии 0: Q1 := E1 and NOT A1; 1: Q2 := E2 and NOT A2; 2: Q3 := E3 and NOT A3; 3: Q4 := E4 and NOT A4; end_case NextStart := NextStart + 1; if NextStart > 3 then NextStart := 0; end_if end_if // Если нужно меньше - останавливаем следующий if CountWork > CountQuery then // Нужно выключить следующий case NextStop of 0: Q1 := false; 1: Q2 := false; 2: Q3 := false; 3: Q4 := false; end_case NextStop := NextStop + 1; if NextStop > 3 then NextStop := 0; end_if end_if // Сбросим аварию при запрете запуска и остановим насос if not E1 then A1 := false; Q1:=false; end_if if not E2 then A2 := false; Q2:=false; end_if if not E3 then A3 := false; Q3:=false; end_if if not E4 then A4 := false; Q4:=false; end_if // Следим за таймером и фиксируем аварию с остановкой насоса T1(I:=Q1, T:=T#1s); if T1.Q and not W1 then A1 := true; Q1:=false; end_if T2(I:=Q2, T:=T#1s); if T2.Q and not W2 then A2 := true; Q2:=false; end_if T3(I:=Q3, T:=T#1s); if T3.Q and not W3 then A3 := true; Q3:=false; end_if T4(I:=Q4, T:=T#1s); if T4.Q and not W4 then A4 := true; Q4:=false; end_if end_function_block




Ответить с цитированием
