13 KiB
Tavola di Accumulo
Panoramica del Sistema
Il Sistema Tavola di Accumulo è una soluzione di controllo basata su PLC progettata per un impianto di test ring per gestire due diversi formati di bottiglie. Il sistema gestisce l'accumulo delle bottiglie, le operazioni di divisore/combinatore e le capacità di cambio formato per la movimentazione di singole bottiglie.
Architettura del Sistema
Il sistema è costruito intorno a diversi componenti chiave dal master Vetromeccanica:
- Controllore Principale:
FC_Ttop_Run
- Funzione di controllo esecuzione principale - Configurazione Dispositivi:
FC_Ttop_Devices
- Configurazione e setup dei dispositivi - Logica di Accumulo:
FB_AccumTable
- Blocco funzione principale della tavola di accumulo - Gestione Motori:
FB_Motors_Manage
- Blocco di controllo motori universale - Gestione Formato:
FC_FormatCheck
- Coordinamento cambio formato
Analisi Componenti Principali
1. FC380 FC_Ttop_Devices
Questa funzione è responsabile della configurazione dei dispositivi e dell'inizializzazione del sistema table top.
Caratteristiche Principali:
- Configurazione Ricette: Imposta parametri di velocità, posizione e temporizzazione per tutti i dispositivi
- Gestione Aree: Configura le aree di ingresso, uscita e canali con le rispettive ricette
- Coordinamento Motori: Collega tutti i motori con i loro specifici blocchi funzione
- Gestione Formato: Aggiorna le posizioni delle guide in base ai requisiti del formato
Parametri di Configurazione di ogni Area:
// Configurazione Area Canale
"FB_AccumTable_DB".Area_Channel[n].Recipe.Length := 11600;
"FB_AccumTable_DB".Area_Channel[n].Recipe.End_Area := 300;
"FB_AccumTable_DB".Area_Channel[n].Recipe.Initial_Area := 500;
"FB_AccumTable_DB".Area_Channel[n].Recipe.Outfeed_Safety_Area := 2000;
Integrazione Motori:
- Motori Tavola Ingresso: M31610 (Sinistro), M31710 (Destro)
- Motori Tavola Uscita: M34110 (Sinistro), M34210 (Destro)
- Motori Canale: U32810-U33610 (Canali 1-9)
- Motori Guide: M31810 (Ingresso), M34310 (Uscita)
2. FB_AccumTable - FB dal Tavolo
Il blocco funzione principale che gestisce le operazioni della tavola di accumulo.
Parametri di Ingresso:
i_Reset_AllCounters
: Segnale di reset sistemai_Pth_Min_Accumulation
: Fotocellula accumulo minimoi_Pth_Count_Input
: Fotocellula conteggio ingressoi_Pth_Safety_Selector_Input
: Fotocellula sicurezza selettore ingressoi_Pth_Safety_Selector_Output
: Fotocellula sicurezza selettore uscitai_Pth_Count_Output
: Fotocellula conteggio uscitai_Pth_Max_Accumulation
: Fotocellula accumulo massimoi_GuidesInPosition
: Conferma posizionamento guidei_Nominal_Speed
: Riferimento velocità base (1000.0 mm/sec)i_Bottle_Size
: Dimensioni bottiglia (100.0 mm)i_Bottle_Gap
: Spazio tra bottiglie (5.0 mm)
Parametri di Uscita:
o_Load_Finish
: Segnale completamento operazione caricoo_Unload_Finish
: Segnale completamento operazione scarico
Struttura Logica Principale:
Il sistema opera attraverso una macchina a stati con molteplici passi di ciclo che gestiscono:
- Selezione Canale: Selezione automatica dei canali disponibili per l'instradamento bottiglie
- Calcolo Velocità: Regolazione dinamica velocità basata sui parametri bottiglia
- Tracciamento Area: Simulazione encoder virtuale per il tracciamento bottiglie
- Gestione Sicurezza: Monitoraggio zone sicurezza basato su fotocellule
Algoritmi Chiave:
Funzionamento Macchina
Il FB_AccumTable opera attraverso una macchina a stati completa implementata tramite un'istruzione CASE basata su #Status.Cycle_Step
. Questa macchina a stati gestisce tutte le modalità operative e le transizioni.
Architettura Macchina a Stati
stateDiagram-v2
[*] --> Idle
Idle --> Bypass_Setup: Nessuna Richiesta Carico/Scarico
Idle --> Loading_Mode: Richiesta Carico
Idle --> UnLoading_Mode: Richiesta Scarico
Bypass_Setup --> Bypass_Mode: Selettori Posizionati
Bypass_Mode --> Loading_Mode: Richiesta Carico
Bypass_Mode --> UnLoading_Mode: Richiesta Scarico
Loading_Mode --> Load_Ch1: Formato Sx
Loading_Mode --> Load_Ch9: Formato Dx
Loading_Mode --> Idle: Nessuno Spazio Disponibile
Load_Ch1 --> Load_Ch2: Canale 1 Pieno
Load_Ch2 --> Load_Ch3: Canale 2 Pieno
Load_Ch3 --> Load_Ch4: Canale 3 Pieno
Load_Ch4 --> Idle: Canale 4 Pieno/Timeout
Load_Ch9 --> Load_Ch8: Canale 9 Pieno
Load_Ch8 --> Load_Ch7: Canale 8 Pieno
Load_Ch7 --> Load_Ch6: Canale 7 Pieno
Load_Ch6 --> Idle: Canale 6 Pieno/Timeout
UnLoading_Mode --> Unload_Ch4: Formato Sx
UnLoading_Mode --> Unload_Ch6: Formato Dx
UnLoading_Mode --> Idle: Tutto Vuoto
Unload_Ch4 --> Unload_Ch3: Canale 4 Vuoto
Unload_Ch3 --> Unload_Ch2: Canale 3 Vuoto
Unload_Ch2 --> Unload_Ch1: Canale 2 Vuoto
Unload_Ch1 --> Idle: Canale 1 Vuoto
Unload_Ch6 --> Unload_Ch7: Canale 6 Vuoto
Unload_Ch7 --> Unload_Ch8: Canale 7 Vuoto
Unload_Ch8 --> Unload_Ch9: Canale 8 Vuoto
Unload_Ch9 --> Idle: Canale 9 Vuoto
Definizioni Stati e Operazioni
1. Stato IDLE (#Idle: 0
)
Scopo: Stato di attesa sistema con selezione operazione basata su priorità Logica:
// Gerarchia priorità: Carico > Scarico > Bypass
IF #i_Load_Request THEN
#Status.Cycle_Step := #Loading_Mode;
ELSIF #i_Unload_Request THEN
#Status.Cycle_Step := #UnLoading_Mode;
ELSIF NOT #i_Load_Request AND NOT #i_Unload_Request THEN
#Status.Cycle_Step := #Bypass_Setup;
END_IF;
Transizioni: Basate su richieste esterne con priorità definita
2. Stato BYPASS_SETUP (#Bypass_Setup: 1000
)
Scopo: Preparare sistema per flusso diretto bottiglie attraverso canale centrale Operazioni Chiave:
- Configurare entrambi i selettori in posizione centrale (Canale 5)
- Abilitare movimento selettori
- Verificare posizionamento e condizioni sicurezza
- Attendere tutti i sistemi pronti
Condizioni Sicurezza:
#Conditions_To_Run := #i_GuidesInPosition AND
(#Infeed_ChSelector.o_InPosition = #Central) AND
(#Outfeed_ChSelector.o_InPosition = #Central) AND
#Status.Motors_Enable AND #Status.AutoCycle;
3. Stato BYPASS_MODE (#Bypass_Mode: 1010
)
Scopo: Operazione bypass attiva per flusso diretto bottiglie Logica:
- Monitoraggio continuo posizioni selettori
- Controllo motori basato su domanda
- Ritorno a setup se selettori si muovono incorrettamente
Controllo Flusso:
// Funzionamento canale centrale basato su domanda uscita
IF #Area_Outfeed_Ch_Selector.Status.Empty_End_Area OR #Dosser_Output.i_Motor_Run THEN
#Area_Channel[#Central].i_Motor_Run := TRUE;
#Dosser_Input.i_Motor_Run := TRUE;
ELSE
// Stop se nessuna domanda dall'uscita
#Area_Channel[#Central].i_Motor_Run := FALSE;
#Dosser_Input.i_Motor_Run := FALSE;
END_IF;
4. Stato LOADING_MODE (#Loading_Mode: 2000
)
Scopo: Preparazione iniziale e valutazione disponibilità canali Logica Disponibilità Canali:
- Formato Sx (Sinistro): Controlla canali 1-4 per spazio disponibile
- Formato Dx (Destro): Controlla canali 6-9 per spazio disponibile
Sequenza Preparazione:
- Configurare selettori in posizione centrale
- Fermare ingresso durante preparazione
- Svuotare aree centrali
- Determinare canale di partenza basato su formato
5. Stati Carico Canali (#Load_Ch1-9: 2010-2090
)
Strategia Caricamento:
- Formato Sinistro (Sx): Sequenza carico 1→2→3→4 (esterno verso interno)
- Formato Destro (Dx): Sequenza carico 9→8→7→6 (esterno verso interno)
Esempio - Logica Carico Canale 1:
// Prerequisiti per caricamento Canale 1:
// - Canale target (1) deve avere spazio area finale
// - Tutti i canali intermedi (2,3,4) devono essere completamente vuoti
IF #Conditions_To_Run AND
#Area_Channel[1].Status.Empty_End_Area AND
#Area_Channel[2].Status.Empty AND
#Area_Channel[3].Status.Empty AND
#Area_Channel[4].Status.Empty THEN
// Configurare selettore e far funzionare motori
#Status.InfeedSelector_Ch := 1;
// Far funzionare tutti i canali nel percorso: 1→2→3→4→5(centrale)
#Area_Channel[1].i_Motor_Run := #Filtered.Min_Accumulation OR NOT #i_Load_Request;
// ... (simile per canali 2,3,4,5)
END_IF;
Logica Caricamento Progressivo:
- Ogni canale richiede che i canali a valle siano vuoti
- I motori funzionano basandosi sullo stato di accumulo o richiesta carico
- Il dosatore ingresso funziona solo quando il canale target ha grande spazio disponibile
6. Stato UNLOADING_MODE (#UnLoading_Mode: 3000
)
Scopo: Preparazione per evacuazione bottiglie dai canali di stoccaggio Passi Preparazione:
- Fermare alimentazione ingresso
- Posizionare selettore ingresso al centro
- Svuotare tutte le aree centrali
- Determinare canale di partenza (interno verso esterno)
7. Stati Scarico Canali (#Unload_Ch1-9: 3010-3090
)
Strategia Scaricamento:
- Formato Sinistro (Sx): Sequenza scarico 4→3→2→1 (interno verso esterno)
- Formato Destro (Dx): Sequenza scarico 6→7→8→9 (interno verso esterno)
Esempio - Logica Scarico Canale 4:
// Condizioni base per scaricamento
#Conditions_To_Run := #Dosser_Output.i_Motor_Run AND
#Area_Channel[#Central].Status.Empty AND
#Area_Infeed_Ch_Selector.Status.Empty;
// Far funzionare motori solo quando selettore uscita è posizionato
IF #Outfeed_ChSelector.o_InPosition = #Status.OutfeedSelector_Ch THEN
#Area_Channel[#Central].i_Motor_Run := #Conditions_To_Run;
#Area_Channel[4].i_Motor_Run := #Conditions_To_Run;
END_IF;
Logica Scaricamento Progressivo:
- Iniziare dai canali più interni (più vicini al centrale)
- Ogni canale attende che il canale precedente si svuoti
- Il selettore uscita si muove progressivamente verso l'esterno
- Le aree di sicurezza devono essere libere prima delle transizioni
Controlli Transizione Stati
Validazione Transizioni:
- Tutte le transizioni verificano condizioni di sicurezza
- Posizioni selettori confermate prima delle operazioni motori
- Stato aree controllato prima dei cambi stato
- Protezione timeout previene loop infiniti
Transizioni Emergenza:
- Qualsiasi stato può tornare a IDLE su timeout
- Richieste Carico/Scarico possono interrompere operazioni bypass
- Violazioni sicurezza forzano stop immediati
Rilevamento Completamento:
// Completamento caricamento
IF NOT #Area_Channel[#Channel].Status.Empty_End_Area THEN
#Status.Cycle_Step := #Next_Channel; // Passa al canale successivo
END_IF;
// Completamento scaricamento
IF #Area_Channel[#Channel].Status.Empty_Outfeed_Safety_Area THEN
#o_Unload_Finish := TRUE;
#Status.Cycle_Step := #Idle;
END_IF;
3. Blocchi Funzione di Supporto
FB_DoserPair : Dosatori a due Minimotor in modo senzafine
Gestisce operazioni dosaggio accoppiate con:
- Sincronizzazione motori tra alimentatori sinistro e destro
- Coordinamento velocità basato su valori nominali
- Gestione stati abilitazione/pronto
FB_AreaTracker : Logica di gestione delle aree FIFO pero senza utilizare FIFO. Questo permette un sistema senza conteggio e affidabile.
Fornisce capacità tracciamento bottiglie:
- Simulazione fotocellule virtuali
- Tracciamento posizione bottiglie attraverso aree trasportatore
- Calcolo posizione basato su velocità
FB_PositionAxis : Gestione formatti Minimotor per le guide di cambio formatto
Gestisce operazioni posizionamento:
- Integrazione sensore home
- Gestione feedback posizione
- Reporting stato in-posizione
4. Gestione Dati
DB_TransportStatus
Struttura dati centrale contenente:
- Definizioni formato (2 formati supportati)
- Dati interfaccia HMI
- Informazioni stato tavola
- Stato sistema trasporto
- Stato divisore e combinatore
Struttura Formato:
VAR
Formats : Array[0..1] of "Struct";
_00_HMI_Machine : "Struct";
_01_Table : "Struct";
_02_Transport : "Struct";
_03_Divider : "Struct";
_04_Combiner : "Struct";
END_VAR
Modalità Operative Sistema
1. Modalità Bypass
Quando non è richiesto accumulo:
- Instradamento diretto bottiglie attraverso canali selezionati
- Utilizzo buffer minimo
- Capacità cambio formato in tempo reale
2. Modalità Carico
Per stoccaggio formato:
- Utilizzo completo canali
- Operazioni caricamento/scaricamento sequenziali
- Gestione segregazione formato
3. Modalità Cambio Formato
Durante transizioni formato:
- Svuotamento controllato aree accumulo
- Operazioni riposizionamento guide
- Verifica liberazione zone sicurezza
Architettura di chiamate per FB_AccumTable
@startuml
package "Sistema Controllo TTOP" {
[FC_Ttop_Run] as run
[FC_Ttop_Devices] as devices
[FB_AccumTable] as accum
[FB_Motors_Manage] as motors
[FC_Motor_Protocols] as protocols
[DB_TransportStatus] as db
run --> devices : Configurare
run --> accum : Controllo
devices --> accum : Setup
accum --> motors : Comandi
motors --> protocols : Comunicazione
db <--> accum : Dati Stato
db <--> devices : Configurazione
}
package "Rete Motori" {
[M31610] as m1
[M31710] as m2
[U32810-U33610] as channels
[M31810] as guide1
[M34310] as guide2
}
protocols --> m1
protocols --> m2
protocols --> channels
protocols --> guide1
protocols --> guide2
@enduml