Обсудим программирование конечных автоматов на FLProg.
Я уже поднимал эту тему
http://forum.flprog.ru/viewtopic.php?f= ... SFC#p22648
и наверное не был понят.
С тех пор появились условные платы (почему-то всегда хочется назвать их картами)
и командоаппарат. Может они нам помогут.
Предлагаю решить учебную задачу. Условия задачи следующие:
Имеется автомат. Автомат состоит из двух механизмов прямолинейного движения - М1 и М2. В начале и в конце каждого механизма имеются концевые датчики (начало/конец) - Н1, К1, Н2, К2. Также имеются кнопка ПУСК и внешний сигнал АВАРИЯ.
Алгоритм работы автомата следующий:
1. При включении, оба механизма отвести в начало.
2. При нажатии кнопки ПУСК, механизм М1 двинуть вперёд.
3. Когда М1 дойдёт до конца, механизм М2 двинуть вперёд.
4. Когда М2 дойдёт до конца, вернуть М2 в начало.
5. Когда механизм М2 вернётся в начало, механизм М1 вернуть в начало.
6. Ждать следующего нажатия кнопки ПУСК (перейти к пункту 2).
7. При появлении сигнала АВАРИЯ на любом этапе - немедленно отвести механизмы в начало и больше не двигаться до изчезновения аварийного сигнала.
Эта задача относится к классу конечных автоматов.
Конечный автомат, упрощенно говоря, это такой "чёрный ящик", сигналы на выходе которого зависят от сигналов на входе и, внимание, от его внутреннего состояния. То есть он имеет память.
Для решения такого класса задач на ПЛК есть специальный язык SFC (см приведённую ссылку), пока отсутствующий в FLProg.
Предлагаю поискать красивое решение имеющимися средствами.
Прилагаю проект-заготовку со всеми нужными сигналами.