# 4. Programmazione del PLC Siemens

Il pacchetto applicazione tavola comprende un Function Block destinato al controllo dell'azionamento mediante la rete Profinet appena configurata, di seguito la struttura dei dati scambiati tra PSD e PLC:

- Output PSD --> Input PLC

  | Nome 		| DataType  | Contenuto 			|
  |-------------|-----------|-----------------------|
  | `0x6041.0`  | WORD	    | Status Word		    | 
  | `0x6064.0`	| LREAL		| Posizione attuale	    |
  | `0x606C.0`	| LREAL		| Velocità attuale  	|
  | `0x31C1.1`	| WORD		| Input digitali Drive	|
  | `0x3C2D.1`	| WORD		| Codice errore Drive	|
  | `0x3321.2`	| LREAL		| Corrente attuale		|


- Output PLC --> Input PSD

  | Nome 		| DataType  | Contenuto 			|
  |-------------|---------- |-----------------------|
  | `0x6040.0`  | WORD	    | Control Word		    | 
  | `0x607A.0`	| LREAL		| Posizione tavola		|
  | `0x6081.0`	| LREAL		| Velocità tavola  	    |
  | `0x6083.0`	| LREAL		| Accelerazione tavola  |
  | `0x6084.0`	| LREAL		| Decelerazione tavola	|
  | `0x346A.0`	| LREAL		| Velocità Jog		    |
  | `0x3468.0`	| LREAL		| Accelerazione Jog	    |
  | `0x60F2.0`	| WORD		| Option Code posizione	|

### Importare il Function Block in TIA Portal:

Per poter utilizzare l'FB in TIA Portal sarà necessario importarne il codice sorgente dal pacchetto *Applicazione Tavola*

- In *Project Tree > PLC_1 > External source files* selezionare la voce *Add new external file* e indicare il percorso del file *TurnTable.scl*
<br>
<br>
  <img src="https://docs.dctrasmissioni.it/uploads/images/gallery/2024-11/tia-add-source.png" alt="tia-add-source.png" width="300"/>
<br>
<br>

- Ora è necessario generare l'FB premendo il tasto destro del mouse sul file appena importato e selezionando la voce *generate blocks from source*
<br>
<br>
  <img src="https://docs.dctrasmissioni.it/uploads/images/gallery/2024-11/tia-generate-blocks.png" alt="tia-generate-blocks.png" width="300"/>
<br>
<br>

A questo punto sarà possibile richiamare il blocco nella sezione desiserata, assegnargli un'istanza e parametrizzarlo.

### Parametrizzazione del Function Block:

- Input:

  | Nome 		  		| DataType | Funzione		 						|
  |---------------------|----------|----------------------------------------|
  | `HW_Address`		| HW_IO    | Indirizzo hardware Profinet del PSD1	|
  | `Enable`			| BOOL     | Abilitazione drive tavola				|
  | `Reset`				| BOOL     | Reset allarmi drive/tavola			    |
  | `GradiPassoA`		| REAL     | Gradi di avanzamento con passo A		|
  | `GradiPassoB` 		| REAL     | Gradi di shifting rispetto a passo A	|
  | `StartPasso`		| BOOL     | Start passo selezionato (NON-latching) |
  | `EseguiPassoB` 		| BOOL     | Selezione passo B	(shifting)			|
  | `nStazioni`			| INT      | N. stazioni shift (Gradi A / Gradi B)	|
  | `JogP`				| BOOL     | Comando Jog positivo					|
  | `JogN`				| BOOL     | Comando Jog negativo					|
  | `PassoLento`		| BOOL     | Attivazione passo lento				|
  | `JogLento`			| BOOL     | Attivazione Jog lento					|
  | `AzzeramentoTavola`	| BOOL     | Comando di azzeramento tavola			|
  | `RangePos`			| REAL     | Range posizionamento (Es: 0,1° = 1/10°)|
  | `VelPassoRapido` 	| DINT     | Velocità passo rapido					|
  | `AccPassoRapido` 	| DINT     | Acc/Dec passo rapido 					|
  | `VelJogRapido`		| DINT     | Velocità Jog rapido					|
  | `AccJogRapido`		| DINT     | Acc/Dec Jog rapido 					|
  | `VelPassoLento` 	| DINT     | Velocità passo lento					|
  | `AccPassoLento` 	| DINT     | Acc/Dec passo lento 					|
  | `VelJogLento`		| DINT     | Velocità Jog lento					    |
  | `AccJogLento`		| DINT     | Acc/Dec Jog lento 					    |

  la variabile `HW_Address` identifica il driver specifico controllato dalla FB e può essere configurato dinamicamente scrivendo al suo interno l'oggetto Profinet corrispondente al Drive desiderato
<br>
<br>
  <img src="https://docs.dctrasmissioni.it/uploads/images/gallery/2024-11/tia-psd-hw-address-14words.png" alt="tia-psd-hw-address-14words.png" width="600"/>
<br>
<br>

- Output:

  | Nome 		  | DataType | Funzione		 						    |
  |---------------|----------|------------------------------------------|
  | `DriveStatus` | INT      |	Stato del Drive della tavola			|
  | `_Status`     | STRING[30] |	Descrizione dello stato             |
  | `Enabled`	  | BOOL     | Tavola abilitata						    |
  | `Fault`		  | BOOL     | Anomalia/Allarme tavola o Drive			|	
  | `TavolaInPos` | BOOL     | Tavola in posizione						|
  | `TavolaFerma` | BOOL     | Tavola non in movimento					|
  | `ActPos`	  | REAL     | Posizione attuale Tavola				    |
  | `ActShiftPos` | REAL     | Posizione attuale Tavola dopo shift (passo B) |
  | `nPallet`	  | INT      | Riferimento di pallet dopo shift		    |
  | `ErrorDrive`  | WORD     | Codice di errore Drive (lista allarmi PSD) |
  | `ErrorCode`	  | INT      | Codice di errore FB tavola				|

  La variabile `DriveStatus` può assumere valori 1-4 corrispondenti alle relative descrizioni nella variabile `_Status`:

  | Valore | Descrizione          |
  |-----|-------------------------|
  | `1` | Switching On Inhibited  |
  | `2` | Ready To Switch On	  |
  | `3` | Switched On			  |
  | `4` | Operation Enabled		  |

  La variabile `ErrorCode` può assumere valori 1-7:
  | Valore | Descrizione                    |
  |-----|-----------------------------------|
  | `1` | Start senza abilitazione Tavola	|
  | `2` | Jog senza abilitazione Tavola		|
  | `3` | Homing senza abilitazione Tavola	|
  | `4` | Gradi Passi errato (Passo A o Passo B non divide interamente 360°) |
  | `5` | Numero stazioni errato (Se Passo A / Passo B non è uguale a numero stazioni) |
  | `6` | Gradi tolleranza errato (Se la tolleranza di posizione è uguale a 0) |
  | `7` | parametri posizionamento errati (Se velocità o accelerazioni sono uguali a 0) |

### Esempi di gestione della Tavola:

- **Abilitazione Tavola:**
  Per poter abilitare la tavola è necessario che non ci siano anomalie relative al Drive (`ErrorDrive = 0`)

- **Impostazione gradi step:**
  Il numero di gradi espresso in `GradiPassoA` **DEVE** dividere per intero 360°, cioè un giro di tavola completo.

  *Es: `GradiPassoA = 90.0`*

- **Impostazione numero di stazioni:**
  Se sulla tavola sono presenti shift da eseguire, impostare il numero di gradi in `GradiPassoB` in maniera tale da dividere interamente `GradiPassoA`.

  *Es: `GradiPassoA = 90.0 / GradiPassoB = 18.0 => nStazioni = 5`*

  Se correttamente impostato, `nStazioni` indica quanti shift è possibile eseguire in `GradoPassoA` gradi.
Il numero di stazione in cui ci si trova dopo uno shift è indicato dalla variabile in uscita `nPallet`.

- **Impostazione tolleranza di posizionamento:**
  Il parametro `RangePos` indica il range di tolleranza per il posizionamento della tavola.

  *Es. `RangePos = 0.1` => la tolleranza è 1/10 di grado*
  <br>
  <br>
  ⚠️ Se `RangePos = 0.0` la tavola **NON** eseguirà alcun movimento (`ErrorCode = 6`)
  <br>
  <br>
- **Impostazione parametri di posizionamento:**
  Di seguito un esempio di parametrizzazione delle velocità è delle accelerazioni della tavola.

  | Nome           | Valore |
  |----------------|--------|
  |`VelPassoRapido`|`120000`|
  |`AccPassoRapido`|`500000`|
  |`VelJogRapido`  |`30000` |
  |`AccJogRapido`  |`400000`|
  |`VelPassoLento` |`15000` |
  |`AccPassoLento` |`400000`|
  |`VelJogLento`   |`100`	|
  |`AccJogLento`   |`400000`|