
Part Production Cell — MES & OEE
OpenPLC, Ignition Perspective e SQLite: eventi, KPI e cause dei fermi macchina organizzati in modo chiaro.
Il progetto è nato da una semplice linea di smistamento. Un pezzo raggiunge il sensore di ingresso, riceve un tipo e poi viene deviato su una linea laterale tramite uno spintore oppure prosegue verso l’uscita. Il compito reale non era animare il trasportatore, ma costruire una sequenza che restasse comprensibile.
Per prima cosa ho separato le responsabilità nel PLC. Ladder gestisce la modalità, l’avvio, i consensi, i comandi finali e lo stato di guasto comune. Structured Text gestisce il ciclo del pezzo: memorizza il tipo, attende i feedback, gestisce i timeout e aggiorna i contatori.
Ho quindi chiuso l’anello: azione dell’operatore → logica PLC → comando → feedback del modello → stato HMI. È una simulazione didattica desktop, non un sistema di produzione né un sistema certificato per la sicurezza.

Ladder gestisce la modalità, il latch Run, i consensi, i comandi finali e lo stato di guasto comune. Structured Text gestisce lo stato del pezzo, i timeout e i contatori. Così un comando finale non riceve scritture da due blocchi logici.

A PE_Infeed, il PLC memorizza il tipo A o B. Non accetta il pezzo successivo finché il ciclo attivo non è completato.
Per il tipo A, il ciclo segue 10 → 20 → 30 → 0: avanzamento verso la deviazione, feedback di estensione, ritorno alla posizione iniziale, poi incremento di Tipo A/Totale.
Se manca il feedback richiesto di un PE o dello spintore, la sequenza passa allo stato 90 e rimuove i comandi automatici. Reset riporta allo stato inattivo; non avvia un altro ciclo.
Il blocco ST porta il tipo di pezzo memorizzato attraverso ingresso, avanzamento verso la deviazione, estensione dello spintore, ritorno alla posizione iniziale e completamento. Ogni attesa ha il proprio timeout e la propria transizione di guasto.

A PE_Infeed, la macchina a stati memorizza il tipo A o B. Continua a usare quel valore, così un segnale esterno variabile non può reindirizzare un pezzo a metà del ciclo.
Ladder crea comandi e consensi. ST non scrive direttamente le apparecchiature: fornisce stato della sequenza, guasto e contatori. Il comando finale ha un solo writer.
Se un sensore o Pusher_Extended non arriva in tempo, la macchina a stati entra nello stato 90. I comandi automatici vengono rimossi. Un nuovo ciclo richiede Reset e un nuovo 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 riunisce su una schermata Auto, Start/Stop/Reset, stato dei sensori, feedback dello spintore, guasto e tre contatori. Il Gateway Timer modella solo ingressi e feedback. Comandi, guasti e conteggi restano nel PLC.

La schermata contiene comandi, stato della linea, trasportatore, tre sensori PE, feedback dello spintore, causa del guasto e contatori separati.
Un Gateway Timer da 200 ms alterna A/B. Per A produce PE_Infeed → PE_Divert → Extended → Home, con margine entro il watchdog PLC di 2 s.
Nel ciclo di test, il tipo A ha portato Totale/A/B da 10/4/6 a 11/5/6. Poi il tipo B ha portato 11/5/6 a 12/5/7. Non è apparso alcun guasto attivo.
Conclusioni:

OpenPLC, Ignition Perspective e SQLite: eventi, KPI e cause dei fermi macchina organizzati in modo chiaro.

OpenPLC, Modbus TCP e Ignition: dalla logica Ladder a uno scenario operatore verificabile.

Monitoraggio enterprise per una centrale nucleare: stati del sistema, vincoli ingegneristici e logica 3D degli stoccaggi.