| step | state | event | action | next | 
| <0 | pressed = 0 top = 1 bottom = 0 | 0 | ||
| 0 | btn_start = 1 pressed = 0 top = 1 bottom = 0 | 1 | ||
| 1 | pressed = 0 top = 1 bottom = 0 | btn_start = 0 | clamp := 1 | 2 | 
| 2 | top = 1 bottom = 0 | pressed = 1 | rotate := 1 mv_down := 1 | 3 | 
| 3 | bottom = 0 pressed = 1 | top = 0 | liquid := switch_liquid (включение или невключение СОЖ в зависимости от положения переключателя режима) | 4 | 
| 4 | top = 0 pressed = 1 | bottom = 1 | mv_down := 0; начало паузы 1–2 сек | 5 | 
| 5 | bottom = 1 top = 0 pressed = 1 | завершение паузы | mv_up := 1 | 6 | 
| 6 | top = 0 pressed = 1 | bottom = 0 | liquid := 0 | 7 | 
| 7 | bottom = 0 pressed = 1 | top = 1 | mv_up := 0 clamp := 0 | 8 | 
| 8 | top = 1 bottom = 0 | pressed = 0 | обнуление qb0 (выключение всего) | 0 | 
Для каждого шага в графе event указано изменение состояния, ожидаемое в результате действия, запущенного на предыдущем шаге. Состояние, указанное в state, уже достигнуто (на предыдущих шагах) и должно сохраняться. Например, условие pressed = 1 на шаге 3 указано в event, а на последующих шагах — в state. Это означает, что зажим тисков, ожидаемый на шаге 3, на последующих шагах будет постоянно проверяться — деталь должна быть зажата до конца обработки.
В табл. 4 приведены значения таймаутов. В первой колонке указано событие, запускающее отсчет времени, в следующей колонке — ожидаемое событие, а в последней — предельно допустимый промежуток времени (до наступления ожидаемого события).
Таблица 4. Значения таймаутов
| start_event | stop_event | time_limit | 
| clamp := 1 (зажим тисков) | pressed = 1 (тиски зажаты) | 3 сек | 
| clamp := 0 (разжим тисков) | pressed = 0 (тиски разжаты) | 3 сек | 
| mv_down := 1 (вкл. движения Z+) | mv_down := 0 (выкл. движения Z+) | 8 сек | 
| mv_up = 1 (вкл. движения Z–) | mv_up = 0 (выкл. движения Z–) | 8 сек | 
4. Структура программы
Программа реализована в виде нескольких функций без параметров, они вызываются последовательно (по возрастанию номеров) из OB1. Эти функции перечислены в табл. 5.
Таблица 5. Основные программные блоки
| № FC | Имя | Назначение | Условие вызова из OB1 | 
| 1 | sequencer | Реализует последовательное управление, описанное в табл. 3 в графах {step, event, action, next}. Замечание: Не контролирует ни state, ни таймаут | |
| 2 | state_ctrl | Контроль достигнутого состояния (см. state в табл. 3) в зависимости от номера шага. Если текущее состояние не совпадает с указанным в state, вызывает функцию stop. | ^m2.2 | 
| 3 | time_ctrl | Контролирует таймауты согласно табл. 4. Если ожидаемое событие не наступает за указанное время, вызывает функцию stop. | ^m2.3 | 
| 4 | stop | Обнуляет выходные сигналы и делает номер шага отрицательным: step := – abs(step); вызывается также из функций state_ctrl и time_ctrl | btn_stop | 
| 5 | panel | Пультовый режим (движения по кнопкам). Замечание: вызов функции запрограммирован, но сама функция пока что пустая | step <= 0 | 
Вызовы контрольных функций state_ctrl и time_ctrl по умолчанию включены (поскольку после старта m2.2 = m2.3 = 0). Они могут быть отключены (за счет установки в 1 битов m2.2 и m2.3) при помощи Watch table или с панели оператора. Эта возможность упрощает наладку и тестирование.
Глобальные данные приведены в табл. 6. Нулевая начальная величина означает, что данные нужно либо поместить в несохраняемую (non-retain) память, либо явно обнулить в стартовом OB.
Таблица 6. Глобальные данные
| Адрес | Имя | Назначение | Начальное значение (при рестарте) | 
| mw0 | step | Номер шага циклограммы (см. табл. 1) | 0 | 
| m2.2 | Единица блокирует вызов функции state_ctrl | 0 | |
| m2.3 | Единица блокирует вызов функции time_ctrl | 0 | 
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.