# Siemens PLC Client (Python) Questo progetto fornisce un client Python per la lettura di dati da un PLC Siemens S7 (es. S7-300/400/1500) utilizzando la libreria `snap7`. Include una dashboard visuale in linea di comando che mostra lo stato del sistema, i parametri di configurazione, le stringhe identificative e un grafico a barre dinamico dei dati di processo. ## Funzionalità - **Lettura DB100**: Estrazione di parametri di configurazione, bit di stato e stringhe. - **Lettura DB101**: Acquisizione di un array di 40 valori REAL. - **Dashboard Dinamica**: Visualizzazione in tempo reale con colori (Verde/Rosso) e grafico a barre in ASCII. - **Campionamento Adattivo**: Passa automaticamente a 25ms in modalità "Acquisizione" e a 1s in modalità "Attesa". ## Requisiti di Sistema - **Python 3.8+** - **snap7 library**: È necessaria la libreria nativa `snap7`. - Windows: Scarica `snap7.dll` e mettilo nella cartella del progetto o in PATH. - Linux: Installa tramite `sudo apt-get install libsnap7-dev`. ## Installazione Questo progetto utilizza `uv` per la gestione dell'ambiente virtuale e delle dipendenze. 1. **Installazione di uv** (se non presente): Segui le istruzioni su [astral.sh/uv](https://astral.sh/uv) 2. **Setup dell'ambiente**: Esegui i seguenti comandi nella cartella del progetto: ```bash uv venv uv pip install python-snap7 uv pip install flask ``` ## Struttura Memoria PLC (Mapping) Il client è configurato per leggere le seguenti aree di memoria: ### Configurazione Attuale Di seguito la mappa aggiornata delle DB impiegate: DB900, DB901, DB920 #### DB900 (Dati di Processo) - 16kb | Indirizzo | Tipo Dati | Descrizione | | ---------- | --------- | ------------------------------------------------------------------------------------------------------------ | | DBD0-4 | 1 DINT | Numero di misure registrate nella DB (dimensione dell'array seguente di misure DINT) | | DBD4-16387 | 4096 DINT | Array variabile fino a 4096 valori DINT (dimensione effettiva definita nel DBD0) - misure espresse in micron | NB: probabilmente va letto il primo valore per determinare dimensione e successivamente letto per blocchi il set di misure completo. #### DB901 (Configurazione e Stato) - 38 Byte | Indirizzo | Tipo Dati | Descrizione | | --------- | --------- | ----------------------------------------------------------------------------------------------------------- | | DBD0 | Bit | Bit 0: Stato Ready \| Bit 1: Acquisizione (1=ON) \| Bit 2: Fine Acquisizione \| Bit 3: Dati Pronti su DB900 | | DBD1 | Bit | ACK WRITE (da scrivere al PLC) per indicare lettura bit della cella precedente (stessa struttura interna) | | DBD2 | Word | Sensore in uso: 1=Sensore SP1, 2=Sensore SP2, 3=Sensori SP1+SP2, 4=Sensori SP2-SP1 | | DBD4 | Word | Tipo di misura: 0=Rettilinietà 1=Rotondità | | DBD6 | REAL | Freccia Bombatura: 0=Cilindro, >0=Bombatura Convessa, <0=Bombatura Concava | | DBD10 | Word | Numero di misure di rotondità richieste | | DBD12 | Word | Numero di misura attuale di rotondità | | DBD14 | REAL | Lunghezza Pezzo totale | | DBD18 | REAL | Lunghezza Misura pezzo | | DBD22 | DINT | Valore Attuale Misura (real time) in Micron | | DBD26 | REAL | Posizione longitudinale della misura Asse Z (real time) | | DBD30 | DINT | Numero totale di punti misurati | | DBD34 | DINT | Numero Pointer ultimo punto misurato | #### DB920 Gestione Certificato - 186 Byte | Indirizzo | Tipo Dati | Descrizione | | --------- | ---------- | ------------------------------------------------------------------------------------------------------------ | | DBD0 | String(30) | Nome Cliente | | DBD32 | String(30) | Articolo Codice Pezzo | | DBD64 | String(30) | Matricola Pezzo | | DBD96 | String(30) | Nome Operatore | | DBD128 | String(30) | Nome Supervisore | | DBD160 | DINT | Codice Produzione PEP | | DBD164 | DINT | Numero di Certificato | | DBD168 | DINT | Massima Tolleranza Rettilinietà (micron) | | DBD172 | DINT | Massima Tolleranza Rotondità (micron) | | DBD176 | DINT | Errore Riscontrato di Rettilinietà (micron, max) | | DBD180 | DINT | Errore Riscontrato di Rotondità (micron, max) | | DBD184 | Bit | Bit 0: Attivazione Pagina Certificato (1=ON) \| Bit 1: Richiesta salvataggio certificato (1=ON) | | DBD185 | Bit | WRITE ACK (risposta a PLC per completamento azioni) Bit 0: Conferma Salvataggio Certificato Richiesta (1=ON) | Da valutare gestione in 2 blocchi, quello iniziale delle string e poi il resto di tipo misto ### Versione Originale #### DB100 (Configurazione e Stato) - 192 Byte | Indirizzo | Tipo Dati | Descrizione | |-----------|-----------|-------------| | DBD0 | Bit | Bit 0: Stato Acquisizione (1=ON) \| Bit 8: Pronti (1=ON) | | DBD4-44 | REAL | Parametri configurazione (Iniziale, Finale, Limiti, Tipo, etc.) | | DBD56 | REAL | Valore LIVE X | | DBD60 | REAL | Valore LIVE Y | | DBD64 | String(30)| Commessa | | DBD96 | String(30)| Articolo | | DBD128 | String(30)| IdControllo | | DBD160 | String(30)| Altro | #### DB101 (Dati di Processo) - 160 Byte | Indirizzo | Tipo Dati | Descrizione | |-----------|-----------|-------------| | DBD0-159 | 40 REAL | Array di 40 valori REAL (Processo dinamico) | ## Utilizzo Per avviare il client: ```bash uv run python plc_client.py ``` ## Configurazione Modifica le variabili all'inizio di `plc_client.py`: - `PLC_IP`: L'indirizzo IP del PLC. - `RACK`: Numero di rack (solitamente 0). - `SLOT`: Numero di slot (solitamente 1 per S7-300, potrebbe variare per S7-1500).