Не претендуя на оригинальность предложу решение к вашему ТЗ:
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