Grafcet: Loop di esecuzione

Grafcet: Introduzione
Grafcet: Formalizzazione
Grafcet: Loop di esecuzione
Grafcet: Traduzione

Il Grafcet per il progetto di un Processo Automatizzato 

L'idea di utilizzare il Grafcet è nata proprio per colmare il gap tra potenzialità del linguaggio grafico e la complessità del controllo da attuare sul processo automatizzato. 

Anche il Grafcet, come le reti di Petri, permettono una formalizzazione matematica successiva al progetto grafico del controllo. Al contrario delle reti di Petri, però, il fine della formalizzazione non è l'analisi del processo automatizzato ma la stesura del codice che realizza l'automazione desiderata. Per comprendere la procedura di conversione di un diagramma Grafcet in codice è necessario introdurre alcuni elementi fondamentali che la caratterizzano.

Dato un diagramma Grafcet che sintetizza l'automazione di un impianto, il procedimento di conversione di un diagramma in codice consiste, innanzitutto nel definire una serie di variabili booleane associate al processo:

Si Î Bn: Vettore degli Stati: l'elemento i-esimo indica, se pari ad 1, che il relativo stato è attivo;
Tj Î Bm: Vettore Transizioni: l'elemento j-esimo indica, se pari ad 1, che le condizioni che rendono attiva la relativa transizione sono soddisfatte;

A seconda del linguaggio utilizzato per la traduzione, occorrerà effettuare un diverso tipo di dichiarazione, come mostra la tabella che segue:

Tipo di linguaggio Dichiarazione delle variabili di stato e di transizione
PLC: LADDER (simbolico) Occorrerà dichiarare una serie di variabili corrispondenti ai due tipi di variabile. Con questo tipo di linguaggio è possibile riservare una serie di simboli del tipo "S1", "S2" ... "Sn" e "T1", "T2", ..., "Tm" come variabili interne, ovvero variabili di memoria. Normalmente, esiste una zona dell'ambiente di programmazione LADDER dove effettuare questa dichiarazione. 
PLC: LADDER 
(non simbolico)
In questo tipo di linguaggio è necessario allocare una serie di celle di memoria. La convenzione che può essere scelta è normalmente casuale. Per il simulatore LADDER presente nelle pagine di questo sito, ad esempio, potrà essere scelta la corrispondenza variabili booleane - stati del tipo: 
S1 = MB0.1, S2 = MB0.2, ... S7 = MB0.7, S8 = MB1.0, etc.
T1 = MB4.1, T2 = MB4.2, ... T7 = MB4.7, T8 = MB5.0, etc.

E' importante che i byte scelti per l'allocazione delle variabili di stato siano distanti da quelli scelti per le variabili di transizione, in modo da evitare confusioni o sovrapposizioni nel momento in cui sia necessario definire nuove variabili di transizione o di stato.

Può essere utile, per migliorare la leggibilità della traduzione, nominare gli stati allo stesso modo in cui è possibile nominare le variabili. In questo caso, gli stati saranno indicati come: S0.1=MB0.1, ..., S1.3=MB1.3, utilizzando la stessa convenzione per le transizioni: T0.1=MB10.1, T4.1=MB14.1. 

PC: VISUAL BASIC Per i linguaggi strutturati, la definizione di variabili di stato si presenta molto semplice. La classica definizione di un array di booleani risolve il problema:
Dim S(1 To 12) As Boolean
Dim T(1 To 15) As Boolean

In questo caso è stato utilizzato N=12 e M=15. Si ricorda che, nel caso si voglia creare un programma in VB non contenuto in un unico Form, sarà necessario creare un modulo (.BAS) nel quale inserire le precedenti definizioni (come Public invece che come Dim).  

PC: linguaggio C Come per il VB, ma con la difficoltà aggiuntiva di avere array in base 0 invece che 1, e con il tipo di dato booleano non nativo (un booleano, al minimo, consiste in un unsigned character). La definizione più ovvia è la seguente (usando il Visual C):
bool S[12];
bool T[15];

L'interfaccia verso il processo

Mentre nel LADDER per PLC, l'interfaccia verso il processo è costituita dalle variabili di ingresso e di uscita che vengono manipolate come qualsiasi altra variabile, nei linguaggi per PC è necessario costruire un programma che permette di accedere ad un'area di memoria condivisa con il processo che rappresenta l'interfaccia di ingresso e di uscita.

Comunque sia, le variabili di ingresso e di uscita devono essere correttamente individuate prima della stesura del programma e, se il loro aggiornamento non viene condotto automaticamente dal sistema operativo (all'inizio ed alla fine di ogni ciclo di programma, come avviene per un PLC), tale operazione deve essere effettuata dal programma in VB o in C attraverso delle specifiche subroutine, se necessario.

La struttura ciclica del programma

Un PLC lavora naturalmente in maniera ciclica, eseguendo alla massima velocità possibile (oppure ad una velocità indicata dall'utente), tutti i gradini che compongono un diagramma LADDER. Per un programma per PC, il funzionamento ciclico non è naturale e deve essere organizzato tramite una delle funzioni tipiche che permettono di modificare il flusso di esecuzione del programma.

Il modo più semplice per fare questo (ma non il migliore) è rappresentato nella tabella che segue (per i programmi per PC):

Tipo di linguaggio Costruzione del loop di esecuzione
PC: Visual Basic Questo loop può essere inserito in un modulo .BAS o in un form. Consiste nel tipico loop infinito di tipo While, regolato in uscita da una variabile che ne permette l'interruzione (in questo caso la variabile di ingresso IB0.5) avente in corrispondenza dell'inizio e della fine del ciclo la lettura e la scrittura delle strutture di ingresso e di uscita:

Private Sub Form_Load()
   Dim endOfLoop As Boolean
   endOfLoop = False; 

   While (endOfLoop)
      ' Leggi gli ingressi
      PLC_GetInput I

      ' Esegui Grafcet
      '....

      ' Verifica fine del loop
      endOfLoop = I.IB(0).Bit(5)

      ' Scrivi le uscite
      PLC_SetOutput O
   Wend
End Sub

PC: linguaggio C Loop inseribile nella funzione main. Deve essere regolato in uscita da una variabile che ne permette l'interruzione (in questo caso la variabile di ingresso IB0.5) avente in corrispondenza dell'inizio e della fine del ciclo la lettura e la scrittura delle strutture di ingresso e di uscita: 

main()
{
   bool endOfLoop = FALSE;
   
   while(endOfLoop)
   {
      // Leggi gli ingressi
      PLC_GetInput(&I);

      // Esegui Grafcet
      //....

      // Verifica fine del loop
      endOfLoop = I.IB(0).bit(5);

      // Scrivi le uscite
      PLC_SetOutput(&O);
   }
   
   return 0;
}

Per quanto riguarda la descrizione delle funzioni utilizzate per l'interfacciamento verso il processo, si rimanda alla relativa sezione ( in fase di costruzione).

Si è detto che questo non è il modo migliore di operare nella costruzione di un loop. Le strutture di programma riportate si rivelano essere troppo impegnative per una macchina multitasking. Nel caso quindi, in cui anche un altro processo (un'altra applicazione, come lo stesso sistema operativo) debba essere eseguito contemporaneamente alla esecuzione del loop, è opportuno inserire nel loop una funzione di ritardo (definita appositamente nella libreria di interfaccia), detta PLC_Wait

Tipo di linguaggio Funzione di temporizzazione del loop
PC: Visual Basic
PLC_Wait time, priority
PC: linguaggio C
PLC_Wait(time, priority)
Significato degli argomenti
time è dato in millisecondi
priority può assumere i seguenti valori:
0: Priorità normale
1: Priorità alta
2: Priorità realtime

Per un tipico programma, è opportuno utilizzare una priorità di tipo normale.

Questa pagina è stata aggiornata il 19/06/01.

Leonardo Daga's Warehouseâ, http://leonardodaga.insyde.it
Send any Comments to: leonardo.daga@gmail.com