Цитата Сообщение от Cs-Cs Посмотреть сообщение
In_Da_Cher_A ..
Как его заставить учиться?..
Научить читать документацию.
Но это не поможет, ибо даже в чат гпт нет сил закинуть задание.

Вот пример программы на языке ST (Structured Text), которая реализует описанную вами логику. Программа будет использовать переменные для отслеживания состояния и выполнения поочередного движения по датчикам. Мы также будем использовать таймер для реализации задержки в одну секунду на каждом этапе:
Код:
PROGRAM Main
VAR
    i1 : BOOL;   // Кнопка старта
    i2 : BOOL;   // Кнопка стопа
    i3 : BOOL;   // Инфракрасный датчик
    i4 : BOOL;   // Датчик 1
    i5 : BOOL;   // Датчик 2
    i6 : BOOL;   // Датчик 3
    Q1 : BOOL;   // Лампа для датчика 1
    Q2 : BOOL;   // Лампа для датчика 2
    Q3 : BOOL;   // Лампа для датчика 3
    
    cycleCount : INT := 0;  // Счетчик циклов
    currentSensor : INT := 0; // Текущий датчик
    timer : TON;            // Таймер на 1 секунду
    movementActive : BOOL := FALSE;  // Активность движения
END_VAR

// Обработчик нажатия кнопки i1
IF i1 AND NOT movementActive THEN
    movementActive := TRUE;          // Старт движения 
    cycleCount := 0;                 // Сброс счетчика циклов
    currentSensor := 0;              // Начинаем с первого датчика
END_IF

// Логика движения
IF movementActive THEN
    // Проверка на умолчание остановки
    IF i2 OR i3 OR (cycleCount >= 7) THEN
        movementActive := FALSE;       // Остановка движения
        Q1 := FALSE;
        Q2 := FALSE;
        Q3 := FALSE;
        currentSensor := 0;            // Возврат на i4
    ELSE
        // Управление рядом датчиков
        CASE currentSensor OF
            0: // Датчик 1 (i4)
                Q1 := TRUE;
                Q2 := FALSE;
                Q3 := FALSE;
                timer(IN:= TRUE, PT:= T#1s);
                IF timer.Q THEN
                    currentSensor := 1; // Переход ко второму датчику
                    timer(IN:= FALSE);   // Сброс таймера
                    cycleCount := cycleCount + 1; // Увеличиваем счетчик
                END_IF;
            1: // Датчик 2 (i5)
                Q1 := FALSE;
                Q2 := TRUE;
                Q3 := FALSE;
                timer(IN:= TRUE, PT:= T#1s);
                IF timer.Q THEN
                    currentSensor := 2; // Переход к третьему датчику
                    timer(IN:= FALSE);   // Сброс таймера
                END_IF;
            2: // Датчик 3 (i6)
                Q1 := FALSE;
                Q2 := FALSE;
                Q3 := TRUE;
                timer(IN:= TRUE, PT:= T#1s);
                IF timer.Q THEN
                    currentSensor := 0; // Возврат к первому датчику
                    timer(IN:= FALSE);   // Сброс таймера
                END_IF;
        END_CASE;
    END_IF;
ELSE
    // Если движение не активно, выключаем лампы
    Q1 := FALSE;
    Q2 := FALSE;
    Q3 := FALSE;
END_IF;
Но следующий вопрос будет, почему не работаем программа main и выдает ошибку.