# Flusso di Scambio Dati (PLC-HMI-SCADA)

## Panoramica

Questo documento descrive la logica e la sequenza dinamica di “handshake” utilizzate per la comunicazione tra il PLC, l’interfaccia operatore (HMI) e il sistema di supervisione (SCADA). L’obiettivo è garantire uno scambio dati robusto e a prova di errore per le operazioni critiche come il cambio produzione e il monitoraggio della connessione.

## Processo Principale: Cambio Ricetta/Produzione

Il processo di cambio ricetta è l’interazione più complessa e viene gestito da una macchina a stati (`S60_RecipeManagement`) nel PLC per garantire che ogni passo venga eseguito nella sequenza corretta.

### Sequenza di Scambio Dati

Il “dialogo” tra i tre sistemi segue questi passaggi:

1. Abilitazione (HMI): L’operatore abilita il controllo remoto sull’HMI.

   - `HMI -> PLC`: Imposta `MachineAnalytics.HMI_Interface.RemoteControlEn = TRUE`.

2. Richiesta (SCADA): Lo SCADA invia i dati per la nuova produzione (Indice Ricetta, Codice Lotto, etc.) e imposta il bit di richiesta.

   - `SCADA -> PLC`: Imposta `ScadaInterface.Ingress.ProductionChangeRequest = TRUE`.

3. Ack a SCADA (PLC): Il PLC valida la richiesta. Se è corretta, risponde immediatamente:

   - `PLC -> SCADA`: Invia la conferma di ricezione (`Egress.AckChangeRecipe = TRUE`).

4. Completamento Handshake (SCADA): Lo SCADA, non appena riceve l’Ack, sa che il PLC ha preso in carico la richiesta e abbassa subito il suo bit di richiesta.

   - `SCADA -> PLC`: Imposta `Ingress.ProductionChangeRequest = FALSE`.

5. Completamento Handshake (PLC): Il PLC, vedendo che la richiesta è stata abbassata, abbassa a sua volta il suo `AckChangeRecipe`. L’handshake iniziale è concluso e il PLC procede autonomamente.

6. Attivazione Pop-up (PLC): Il PLC attiva il flag per l’apertura del pop-up sull’HMI.

   - `PLC -> HMI`: Imposta `HMI_Interface.AckChangeRecipeToHMI = TRUE`.

7. Visualizzazione (HMI): L’HMI mostra il pop-up di conferma all’operatore con i dati della ricetta richiesta.

8. Risposta (Operatore): L’operatore sceglie una delle opzioni sul pop-up:

   - ACCETTA: L’HMI imposta `HMI_Interface.RecipeChangeOk = TRUE`. Il PLC esegue l’azione (carica la ricetta, aggiorna i dati) e invia l’esito positivo allo SCADA (`Egress.RecipeChangeOK = TRUE` per 2 secondi).
   - RIFIUTA (o preme X): L’HMI imposta `HMI_Interface.RejectRecipeChange = TRUE` (o `CloseMESWindow`). Il PLC invia l’esito negativo allo SCADA (`Egress.RecipeChangeReject = TRUE` per 2 secondi).
   - POSTICIPA: L’HMI imposta `HMI_Interface.BatchChangePopupDismiss = TRUE`. Il PLC invia lo stato di attesa allo SCADA (`Egress.RecipeChangePostpone = TRUE`), avvia un timer (30 secondi) e, alla scadenza, torna al Passo 6 per far riapparire il pop-up.

## Handshake di Base: Watchdog (Heartbeat)

Per garantire che la comunicazione sia sempre attiva, è implementato un meccanismo di “heartbeat” a bit alternato.

- Dal PLC allo SCADA: Il PLC inverte il valore del bit `ScadaInterface.Egress.PlcHeartbeat_Toggle` ogni secondo.
- Dallo SCADA al PLC: Lo SCADA deve leggere `PlcHeartbeat_Toggle` e ricopiarne il valore nel bit `ScadaInterface.Ingress.ScadaHeartbeat_Echo`.
- Controllo del PLC: Se `PlcHeartbeat_Toggle` e `ScadaHeartbeat_Echo` rimangono diversi per più di un tempo di timeout (es. 3 secondi), il PLC imposta a `VERO` il flag `ScadaInterface.Egress.MesCommunicationFault`.