
Part Production Cell — MES & OEE
OpenPLC, Ignition Perspective и SQLite: порядок в событиях, KPI и причинах простоев.
Проект начался с простой линии сортировки. Деталь проходит входной датчик, получает тип и либо уходит в боковой поток толкателем, либо едет дальше к выходу. Но основная задача была не в анимации конвейера, а в понятной последовательности событий.
Сначала разделил ответственность в PLC. Ladder держит режим, запуск, разрешения, финальные команды и общий fault. Structured Text ведёт только цикл детали: запоминает тип, ждёт обратную связь, обрабатывает таймауты и обновляет счётчики.
Дальше собрал замкнутый путь: действие оператора → логика PLC → команда → датчики модели → состояние на HMI. Это desktop-симуляция для изучения управления, не промышленная и не safety-certified система.

Ladder отвечает за режим, Run latch, permissives, финальные команды и общий fault. Structured Text отвечает за состояние детали, таймауты и счётчики. За счёт этого одну команду не пишут два блока логики.

На PE_Infeed PLC фиксирует type A или B. Следующую деталь он не принимает, пока текущий цикл не завершён.
Для type A цикл проходит 10 → 20 → 30 → 0: движение к divert, feedback выдвижения, возврат в home и инкремент Type A/Total.
Нет нужного PE или feedback толкателя — sequence уходит в state 90 и снимает автоматические команды. Reset возвращает в idle, но не запускает новый цикл.
ST-блок берёт зафиксированный тип детали и ведёт её через состояния: вход, движение к divert, выдвижение толкателя, возврат в home и завершение. На каждом ожидании есть свой таймаут и переход в fault.

На PE_Infeed state machine сохраняет type A или B. Дальше она работает с этим значением, поэтому внешняя смена сигнала не меняет маршрут детали в середине цикла.
Ladder формирует команды и permissives. ST не пишет оборудование напрямую: он отдаёт состояние, fault и счётчики. Поэтому у финальной команды остаётся один writer.
Если датчик или Pusher_Extended не приходит вовремя, state machine переходит в state 90. Автоматические команды снимаются. Для нового цикла нужны Reset и новый Start.
CASE Sequence_State OF
0:
IF Mode_Auto_Active AND Run_Active
AND Pusher_Home AND PE_Infeed THEN
Active_Part_Type_A := Part_Type_A;
IF Part_Type_A THEN
Sequence_State := 10;
ELSE
Sequence_State := 50;
END_IF;
END_IF;
END_CASE;
10:
IF Divert_Edge.Q THEN
Sequence_State := 20;
ELSIF T_To_Divert.Q THEN
Fault_Jam := TRUE;
Sequence_State := 90;
END_IF;
20:
IF Pusher_Extended THEN
Sequence_State := 30;
ELSIF T_Extend.Q THEN
Fault_Pusher := TRUE;
Sequence_State := 90;
END_IF;
90:
IF Reset_Pulse THEN
Fault_Jam := FALSE;
Fault_Pusher := FALSE;
Active_Part_Type_A := FALSE;
Sequence_State := 0;
END_IF;
В Perspective на одном экране собраны Auto, Start/Stop/Reset, статусы датчиков, pusher, fault и три счётчика. Gateway Timer моделирует только входы и обратную связь. Команды, fault и counts остаются в PLC.

Здесь собраны команды, статус линии, conveyor, три PE, feedback толкателя, причина fault и отдельные счётчики.
Gateway Timer с периодом 200 ms чередует A/B. Для A он даёт PE_Infeed → PE_Divert → Extended → Home с запасом внутри 2-секундного PLC watchdog.
В тестовом цикле type A изменил Total/A/B с 10/4/6 до 11/5/6. Затем type B — с 11/5/6 до 12/5/7. Active fault не появился.
Выводы:

OpenPLC, Ignition Perspective и SQLite: порядок в событиях, KPI и причинах простоев.

OpenPLC, Modbus TCP и Ignition: от ladder-логики до проверяемого операторского сценария.

Enterprise-мониторинг для АЭС: состояния системы, инженерные ограничения и 3D-логика хранилищ.