378 lines
13 KiB
Markdown
378 lines
13 KiB
Markdown
# 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:
|
|
```pascal
|
|
// 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 sistema
|
|
- `i_Pth_Min_Accumulation`: Fotocellula accumulo minimo
|
|
- `i_Pth_Count_Input`: Fotocellula conteggio ingresso
|
|
- `i_Pth_Safety_Selector_Input`: Fotocellula sicurezza selettore ingresso
|
|
- `i_Pth_Safety_Selector_Output`: Fotocellula sicurezza selettore uscita
|
|
- `i_Pth_Count_Output`: Fotocellula conteggio uscita
|
|
- `i_Pth_Max_Accumulation`: Fotocellula accumulo massimo
|
|
- `i_GuidesInPosition`: Conferma posizionamento guide
|
|
- `i_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 carico
|
|
- `o_Unload_Finish`: Segnale completamento operazione scarico
|
|
|
|
#### Struttura Logica Principale:
|
|
|
|
Il sistema opera attraverso una macchina a stati con molteplici passi di ciclo che gestiscono:
|
|
|
|
1. **Selezione Canale**: Selezione automatica dei canali disponibili per l'instradamento bottiglie
|
|
2. **Calcolo Velocità**: Regolazione dinamica velocità basata sui parametri bottiglia
|
|
3. **Tracciamento Area**: Simulazione encoder virtuale per il tracciamento bottiglie
|
|
4. **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
|
|
|
|
```mermaid
|
|
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**:
|
|
```pascal
|
|
// 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**:
|
|
```pascal
|
|
#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**:
|
|
```pascal
|
|
// 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**:
|
|
1. Configurare selettori in posizione centrale
|
|
2. Fermare ingresso durante preparazione
|
|
3. Svuotare aree centrali
|
|
4. 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**:
|
|
```pascal
|
|
// 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**:
|
|
1. Fermare alimentazione ingresso
|
|
2. Posizionare selettore ingresso al centro
|
|
3. Svuotare tutte le aree centrali
|
|
4. 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**:
|
|
```pascal
|
|
// 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**:
|
|
```pascal
|
|
// 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:
|
|
```pascal
|
|
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
|
|
|
|
```plantuml
|
|
@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
|
|
```
|
|
|