
Сообщение от
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