7.5 KiB
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.dlle mettilo nella cartella del progetto o in PATH. - Linux: Installa tramite
sudo apt-get install libsnap7-dev.
- Windows: Scarica
Installazione
Questo progetto utilizza uv per la gestione dell'ambiente virtuale e delle dipendenze.
-
Installazione di uv (se non presente): Segui le istruzioni su astral.sh/uv
-
Setup dell'ambiente: Esegui i seguenti comandi nella cartella del progetto:
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:
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).