Flusso di Scambio Dati (PLC - HMI - SCADA)

Questo documento descrive il processo di scambio dati tra PLC, HMI e SCADA
per la gestione del cambio ricetta e del meccanismo di heartbeat (watchdog).


Sequence Diagram – Cambio Ricetta e Heartbeat

sequenceDiagram
    autonumber
    participant HMI as HMI (Operatore)
    participant PLC as PLC
    participant SCADA as SCADA

    Note over HMI: Operatore abilita controllo remoto
    HMI->>PLC: RemoteControlEn = TRUE

    Note over SCADA: Invio nuova produzione (indice ricetta, lotto, …)
    SCADA->>PLC: ProductionChangeRequest = TRUE

    PLC-->>SCADA: AckChangeRecipe = TRUE
    SCADA-->>PLC: ProductionChangeRequest = FALSE
    PLC-->>SCADA: AckChangeRecipe = FALSE

    PLC-->>HMI: AckChangeRecipeToHMI = TRUE (apri pop-up)

    alt Operatore ACCETTA
        HMI->>PLC: RecipeChangeOk = TRUE
        PLC->>PLC: Carica ricetta / aggiorna dati
        PLC-->>SCADA: RecipeChangeOK = TRUE (2s)
    else Operatore RIFIUTA (o chiude)
        HMI->>PLC: RejectRecipeChange = TRUE (o CloseMESWindow)
        PLC-->>SCADA: RecipeChangeReject = TRUE (2s)
    else Operatore POSTICIPA
        HMI->>PLC: BatchChangePopupDismiss = TRUE
        PLC->>PLC: Avvia timer 30s
        PLC-->>SCADA: RecipeChangePostpone = TRUE
        PLC-->>HMI: (allo scadere 30s) ri-apri pop-up
    end

    par Heartbeat / Watchdog
        loop ogni 1s
            PLC-->>SCADA: PlcHeartbeat_Toggle (inverti bit)
            SCADA-->>PLC: ScadaHeartbeat_Echo = PlcHeartbeat_Toggle
        end
        PLC->>PLC: Se mismatch > 3s ⇒ MesCommunicationFault = TRUE
    end

State Diagram – Macchina a stati (S60_RecipeManagement)

stateDiagram-v2
    [*] --> Idle

    Idle --> Handshake_In: ProductionChangeRequest ↑
    Handshake_In --> Wait_Request_Low: AckChangeRecipe = TRUE
    Wait_Request_Low --> Popup_To_HMI: ProductionChangeRequest = FALSE, AckChangeRecipe = FALSE

    Popup_To_HMI --> Wait_Operator: AckChangeRecipeToHMI = TRUE

    state Wait_Operator {
      [*] --> AwaitChoice
      AwaitChoice --> ApplyRecipe: RecipeChangeOk = TRUE
      AwaitChoice --> RejectRecipe: RejectRecipeChange = TRUE
      AwaitChoice --> Postpone: BatchChangePopupDismiss = TRUE

      ApplyRecipe --> ReportOK: (carica/aggiorna dati)
      ReportOK --> [*]

      RejectRecipe --> ReportReject
      ReportReject --> [*]

      Postpone --> Timer30s
      Timer30s --> Popup_To_HMI: allo scadere 30s (riapri pop-up)
    }

    note right of ReportOK
      Egress.RecipeChangeOK = TRUE (2s)
    end note

    note right of ReportReject
      Egress.RecipeChangeReject = TRUE (2s)
    end note