Цитата Сообщение от Viktor D Посмотреть сообщение
Спасибо за подсказки.
Собственно говоря я уже это читал, просто некотрые моменты не понятны (учился давно по другой специальности (ТМС) и тогда комп был редкость. Проги писали на Фортране на листочке и сдавали преподу, а он окидывал взглядом и выносил вердикт - будет работать или нет).

Цель моих действий сделать ФБ который будет осуществлять следующий алгоритм: вращение вперёд-пауза-вращение назад и всё это повторять в течении определённого времени.
Делаю это для общего развития. На стандартных ФБ из овенлоджика уже сделано, теперь хочу освоить хотя бы в общих чертах ST. Привязаться хочу к функции DT потому как делала в ОЛ на BLINK и CTN и столкнулся с тем, что на длительных выдержках время уходит от встроенных часов из за конечной скорости работы программы. Приходилось вводить коррекцию.
Предлагаю взять этот пример за основу и доработать под Ваши желания:
Owen.jpg

Код:
function_block FPRP

    var_input
       OnOff : bool;    // Управление блоком
    end_var

    var_output
       FW, RW : bool;   // Сигналы вперед и назад
    end_var

    var
       State : udint;   // Текущее состояние
       t : udint;       // Метка времени события в мс
    end_var

    if OnOff then
        case State of
            0:  // Пауза 1 сек перед пуском вперед
                if time_to_udint(get_time()) - t >= 1000 then
                    State := 1; FW := true; RW := false; t := time_to_udint(get_time());    // Пуск вперед
                end_if
            1:  // Вращение вперед 2 сек перед паузой
                if time_to_udint(get_time()) - t >= 2000 then
                    State := 2; FW := false; RW := false; t := time_to_udint(get_time());   // Пауза
                end_if
            2:  // Пауза 1 сек перед пуском назад
                if time_to_udint(get_time()) - t >= 1000 then
                    State := 3; FW := false; RW := true; t := time_to_udint(get_time());    // Пуск назад
                end_if
            3:  // Вращение назад 2 сек перед паузой
                if time_to_udint(get_time()) - t >= 2000 then
                    State := 0; FW := false; RW := false; t := time_to_udint(get_time());   // Пауза
                end_if
        end_case
    else
        FW := false; RW := false; State := 0; t := 0;
    end_if
end_function_block