LADDER Blockset

Precedente Home Su Successiva

Link per scaricare il LADDER Blockset: (versione 0.4 del 22.07.2001)

Ladder 0.4.zip (446 Kb)

Aggiornamenti ed Esempi sugli aggiornamenti

PCON: Update 0.3 (18.07.2001)

PICON: Update 0.3.1 (19.07.2001)

Update 0.4 (22.07.2001)

Informazioni ed Installazione 
(aggiornate al 18/08/01)

Introduzione

Il LADDER Blockset consiste in un insieme di funzioni sviluppate per il corso di Automazione Industriale 2000/2001 per il Corso di Diploma in Ingegneria Elettrica di cui sono docente. Le lezioni sono tuttora in corso ed il blockset è in fase di test da parte degli stessi studenti per cui l'attuale versione del materiale è da considerarsi ancora in fase di beta.

Il LADDER Blockset per Simulink.

Ogni componente del blockset è stato realizzato tramite una S-function scritta in C (le DLL le potete trovare nella directory di installazione). L’insieme dei blockset realizzato è costituito dai componenti fondamentali necessari per la costruzione di un diagramma LADDER che effettua le operazioni fondamentali previste per un PLC. E’ previsto lo sviluppo di ulteriori blocchi in seguito alle richieste che man mano verranno espresse dagli studenti (o da coloro che ne vorranno fare uso) in termini di funzionalità. 

I Blocchi per la costruzione del diagramma LADDER

Qui di seguito verrà dato l'elenco dei blocchi attualmente disponibili per la costruzione di un diagramma LADDER.

Terminali
PLC Input: Blocco che fornisce l'energia ai contatti del diagramma LADDER. Questo blocco non è normalmente presente nel linguaggio LADDER standard, ma viene introdotto in questo blocco per propositi sia didattici che pratici, quest'ultimi dettati dalla struttura di Simulink. E' necessario (e obbligatorio) utilizzare solo uno di questi blocchi in ogni diagramma LADDER che deve essere posto ad origine di tutti i pioli (rung) del diagramma. 
PLC Output: Come per il blocco precedente, questo è stato definito per scopi didattici e pratici e non trova riscontri nel linguaggio LADDER standard. Dal punto di vista elettrico, questo blocco costituisce la massa delle connessioni che fanno parte del diagramma. E' necessario (e obbligatorio) utilizzare solo uno di questi blocchi in ogni diagramma LADDER che deve essere posto ad origine di tutti i pioli (rung) del diagramma. 
PLC IC: Il blocco IC viene utilizzato per la derivazione di più collegamenti da un unico collegamento LADDER. Anche se questa operazione può essere effettuata senza l'ausilio di questo blocco (semplicemente derivando con il mouse un filo da un altro), questo blocco garantisce l'ordine di esecuzione dei collegamenti uscenti dall'IC. Il numero delle uscite di questo blocco è modificabile dalla maschera delle proprietà del blocco (raggiungibile effettuando un doppio click sul blocco).
PLC OC: Il blocco OC viene utilizzato per la congiunzione di più collegamenti in un unico collegamento LADDER. Questa operazione non può essere effettuata senza l'ausilio di questo blocco e fornisce la energia alla linea di uscita, se almeno uno delle linee entranti fornisce energia in ingresso. Il numero degli ingressi di questo blocco è modificabile dalla maschera delle proprietà del blocco (raggiungibile effettuando un doppio click).
 
I Contatti Standard LADDER 
CONTATTO NORMALMENTE APERTO: Anche indicato come LD (LoaD) o XIO (eXamine If On). Condizione vera (passaggio di corrente o continuità circuitale) quando l’ingresso è presente o la cella di memoria corrispondente vale 1. Il simbolo può essere usato per indicare sia celle di memoria che ingressi o uscite. Corrispondono alla simulazione software  dei relais; Si può cambiare l'indirizzo di memoria dal quale legge lo stato tramite un doppio click sul simbolo; Gli indirizzi ammessi sono del tipo XYn.m, dove X è la zona di memoria [I:Input, O:Output, M:Memoria], Y è il tipo di dato [B:bit, Y:byte, F:float, I:Integer (32bit)]. n ed m sono il byte e il bit prescelto per la lettura del contatto.
CONTATTO NORMALMENTE CHIUSO: Anche indicato come LDN (LoaD Not) o XIC (eXamine If Closed). Condizione vera (passaggio di corrente o continuità circuitale) quando l’ingresso non è presente o la cella di memoria corrispondente vale 0. Il simbolo può essere usato per indicare sia celle di memoria che ingressi o uscite. Si può cambiare l'indirizzo di memoria dal quale legge lo stato tramite un doppio click sul simbolo; Gli indirizzi ammessi sono del tipo XYn.m, dove X è la zona di memoria [I:Input, O:Output, M:Memoria], Y è il tipo di dato [B:bit, Y:byte, F:float, I:Integer (32bit)]. n ed m sono il byte e il bit prescelto per la lettura del contatto.

USCITA: Anche indicato con OUT oppure OE (Output Energize). Se c’è almeno un percorso in cui sussiste la continuità circuitale nel rung sul quale si trova questo simbolo allora la cella di memoria corrispondente viene posta ad 1. Questa istruzione può essere usata per modificare lo stato della memoria e delle uscite. Gli indirizzi ammessi sono del tipo XYn.m, dove X è la zona di memoria [O:Output, M:Memoria], Y è il tipo di dato [B:bit, Y:byte, F:float, I:Integer (32bit)]. n ed m sono il byte e il bit prescelto per la lettura del contatto.

Rispetto alla semplice uscita OUT, il cui stato è dipendente dalla continuità del circuito in cui è inserita, è spesso necessario avere un’uscita il cui stato, una volta attivato si mantenga tale indipendentemente dalla corrente in ingresso. Questo componente è chiamato SET (RESET) per la attivazione e disattivazione definitiva dell’uscita.
SET
Attiva il bit associato all'istruzione, quando a monte del componente è verificata la continuità circuitale. Quando a monte non c'è continuità circuitale, lo stato del bit associato all'istruzione non viene modificato.
RESET
: Disattiva il bit associato all'istruzione, quando a monte del componente è verificata la continuità circuitale.
Gli indirizzi ammessi sono del tipo XYn.m, dove X è la zona di memoria [ O:Output, M:Memoria], Y è il tipo di dato [B:bit, Y:byte, F:float, I:Integer (32bit)]. n ed m sono il byte e il bit prescelto per la lettura del contatto.

 

I Contatti di tipo TIMER 

Ritardo all’inserzione (On Delay Timers, TON): questo tipo di timer ritarda l’abilitazione dell’uscita di x secondi rispetto all’istante in cui il segnale in ingresso al timer si è attivato. 
TIMER A RITARDO DI INSERZIONE (TON): Ha un canale di ingresso dedicato alla linea dalla quale arriva il fronte d’onda necessario per l’attivazione del timer. Dopo aver ricevuto il fronte d’onda il timer attende il numero di secondi programmato prima di attivarsi. Se l’ingresso si disattiva il timer viene resettato (anche se il timer non ha finito il conteggio). Lo stato del timer, oltre ad essere riportato in uscita, viene memorizzato nel bit prescelto.

Ritardo alla disinserzione (Off Delay Timers, TOFF):Rispetto al caso precedente, questo timer lavora sul ritardo alla disattivazione del timer rispetto all’istante in cui il fronte di salita sull’ingresso è stato rilevato.
TIMER A RITARDO DI DISINSERZIONE (TOFF): Ha un canale di ingresso dedicato alla linea dalla quale arriva il fronte d’onda necessario per l’attivazione del timer. Dopo aver ricevuto il fronte d’onda il timer si attiva immediatamente. Dopo l'attivazione dell’ingresso, il timer attende il numero programmato di secondi prima di disattivare l'uscita. Se l'ingresso si disattiva, il timer viene resettato. Lo stato del timer, oltre ad essere riportato in uscita, viene memorizzato nel bit prescelto.

 

I Contatti di tipo CONTATORI 
Per l’uso dei contatori è necessario avere: Il canale in ingresso che fornisce gli impulsi che incrementano il contatore; La condizione di reset, consistente normalmente in un canale di ingresso che, se attivo resetta il conteggio; Quanti impulsi bisogna contare prima che il contatore diventi attivo; L'indirizzo di memoria (normalmente una locazione di tipo byte, float o intero) nel quale memorizzare il valore attuale del conteggio;
Update!

CONTATORE UP (CON): Ha due canali di ingresso, uno dedicato alla linea sulla quale è presente l’impulso da contare, l’altra per il reset del contatore. Come uscita, il blocco ha un segnale che è attivo quando il contatore è arrivato al valore massimo programmato. Nella notazione grafica, oltre a riportare l'indirizzo della cella di memoria incrementata durante il conteggio, è presente il valore max di conteggio, dopo il quale il contatore viene abilitato. Per l'incremento del contatore è sufficiente il fronte di salita del primo ingresso (non importa, poi, se questo rimane attivo o si disattiva), mentre il contatore rimarrà resettato per tutto il tempo in cui l'ingresso di reset è attivo. Per quanto riguarda l'uscita, questa rimarrà attiva per tutto il tempo in cui la variabile di conteggio (in questo caso, OY1) rimarrà maggiore del valore di conteggio (in questo caso, 5), indipendentemente dallo stato del primo ingresso.

Update!

CONTATORE UP-DOWN (CUD): Ha tre canali di ingresso, uno dedicato alla linea sulla quale è presente l’impulso da contare per incrementare il contatore, il secondo dedicato alla linea sulla quale è presente l’impulso da contare per decrementare il contatore, l’altra per il reset del contatore. Come uscita, il blocco ha un segnale che è attivo quando il contatore è arrivato al valore massimo programmato ed un segnale che è attivo quando il contatore è al valore minimo possibile (0). Nella notazione grafica, oltre a riportare l'indirizzo della cella di memoria incrementata durante il conteggio, è presente il valore max di conteggio, dopo il quale la prima uscita del contatore viene abilitato. Per l'incremento del contatore è sufficiente il fronte di salita del primo ingresso (non importa, poi, se questo rimane attivo o si disattiva), così come il decremento sarà effettuato in corrispondenza del fronte di salita del secondo ingresso. Il contatore rimarrà resettato per tutto il tempo in cui l'ingresso di reset è attivo. Per quanto riguarda le uscite, la prima rimarrà attiva per tutto il tempo in cui la variabile di conteggio (in questo caso, OY3) rimarrà maggiore del valore di conteggio (in questo caso, 5), indipendentemente dallo stato del primo ingresso. Per la seconda, vale una condizione analoga, ovvero, rimarrà attiva per tutto il tempo in cui la variabile di conteggio rimarrà a zero.

Update!

CONTATORE PROGRAMMABILE UP (PCON): Ha due canali di ingresso, uno dedicato alla linea sulla quale è presente l’impulso da contare, l’altra per il reset del contatore. Come uscita, il blocco ha un segnale che è attivo quando il contatore è arrivato al valore massimo programmato. Il valore massimo di conteggio è contenuto in una locazione di memoria indicata da pannello. Nel caso riportato al lato, la locazione di memoria che contiene il valore massimo di conteggio è IY2 (byte di input) mentre quella che viene incrementata durante il conteggio è OY1 (byte di uscita). Per l'incremento del contatore è sufficiente il fronte di salita del primo ingresso (non importa, poi, se questo rimane attivo o si disattiva), mentre il contatore rimarrà resettato per tutto il tempo in cui l'ingresso di reset è attivo. Per quanto riguarda l'uscita, questa rimarrà attiva per tutto il tempo in cui la variabile di conteggio (in questo caso, OY1) rimarrà maggiore del massimo valore di conteggio (in questo caso, IY2), indipendentemente dallo stato del primo ingresso.

Update!
CONTATORE PROGRAMMABILE AD INCREMENTO PROGRAMMABILE UP (PICON): Ha due canali di ingresso, uno dedicato alla linea sulla quale è presente l’impulso da contare, l’altra per il reset del contatore. Come uscita, il blocco ha un segnale che è attivo quando il contatore è arrivato al valore massimo programmato. Il valore massimo di conteggio è contenuto in una locazione di memoria indicata da pannello. Anche l'incremento è programmabile ed è indicato in un'altra variabile inseribile da pannello. Nel caso riportato al lato, la locazione di memoria che contiene il valore massimo di conteggio è OY1, quella che viene  incrementata durante il conteggio è OY2, mentre quella in cui viene memorizzato l'incremento da apportare al contatore è OY5. Per l'incremento del contatore di OY5 è sufficiente il fronte di salita del primo ingresso (non importa, poi, se questo rimane attivo o si disattiva), mentre il contatore rimarrà resettato per tutto il tempo in cui l'ingresso di reset è attivo. Per quanto riguarda l'uscita, questa rimarrà attiva per tutto il tempo in cui la variabile di conteggio (in questo caso, OY2) rimarrà maggiore del valore di conteggio (in questo caso, OY1), indipendentemente dallo stato del primo ingresso.
 
I Contatti di tipo OPERATORE ARITMETICO sono stati aggiunti per offrire maggiore flessibilità nella creazione del programma e in particolare nella traduzione di un grafcet in un programma LADDER. Sono tutti blocchi ad un solo ingresso e ad una sola uscita. In uscita c'è la replica dello stato in ingresso, per cui possono essere accodati più blocchi per fare più operazioni in successione su comando di un unico stato di ingresso. L'operazione aritmetica viene effettuata in corrispondenza del fronte di salita del segnale in ingresso. Segue una breve descrizione dei blocchi.
New!

New!

New!

BLOCCO SOMMA (SUM): Un canale in ingresso, il cui fronte di salita abilita l'operazione di somma. Le variabili utilizzate nella somma vengono impostate da pannello e nel simbolo grafico del blocco vengono riportati i primi due termini della somma al di sopra della linea mentre la varibile usata per il risultato viene posta al di sotto della linea. La linea di uscita replica esattamente il valore della linea di ingresso. I termini della somma possono essere qualsiasi a scelta tra BYTE, FLOAT e INTERI. La conversione viene effettuata automaticamente in modo da minimizzare l'errore di arrotondamento

BLOCCO SOTTRAZIONE (SUB): Blocco identico al blocco somma, eccetto l'operazione aritmetica effettuata, corrispondente alla sottrazione. 

BLOCCO MOLTIPLICAZIONE (MUL): Blocco identico al blocco somma, eccetto l'operazione aritmetica effettuata, corrispondente alla moltiplicazione. 

 

I Contatti di tipo OPERATORE LOGICO e di ASSEGNAZIONE 
Il motivo dell'introduzione di questi blocchi è analogo a quello dei blocchi precedenti e ne estende l'uso:
New!

OPERATORI LOGICI DI CONFRONTO (LOGOP): Affinché il risultato dell'esecuzione di una serie di operazioni aritmetiche potesse essere monitorata nel risultato, sono state introdotte le operazioni di confronto logico del contenuto delle celle di memoria. Le operazioni permesse sono tutte quelle classiche:

Uguaglianza: ==

Maggiore o Uguale: >=

Minore o Uguale: <=

Maggiore ma non uguale: >

Minore ma non uguale: < 

Diverso: ~=

Il risultato dell'operazione di confronto viene riportato in uscita per tutto il tempo in cui l'ingresso del blocco è attivo. La scelta delle variabili da mettere a confronto viene operata dal pannello del blocco. Anche la scelta della operazione di confronto da effettuare viene scelta da pannello da una lista di operazioni. Non ha importanza il tipo di variabile prescelta per il confronto: possono essere scelti BYTE, FLOAT e INTERI, potendo anche scegliere per il confronto due variabili di tipo diverso.

OPERATORE DI ASSEGNAZIONE CONDIZIONATA (VSET): Ha due canali di ingresso, il primo dedicato alla linea che condiziona l'assegnazione, il secondo contenente il valore al quale deve essere settato il BYTE, FLOAT o INTERO della memoria prescelto. La cella di memoria prescelta si seleziona, come al solito, eseguendo un doppio click sul simbolo VSET. Il primo dei due ingressi, quando attivo, provoca l'assegnazione sulla cella di memoria selezionata. Il secondo ingresso, deve essere selezionato per mezzo di una costante simulink (vedi esempio). Come uscita al blocco VSET c'è l'esatta copia del primo dei due ingressi.
New!
OPERATORE DI ASSEGNAZIONE CONDIZIONATA (PSET): Molto simile come funzionamento all'operatore VSET di assegnazione di una variabile. Le due variabili vengono scelte da pannello e l'operazione effettuata viene visualizzata sul simbolo grafico del blocco. L'operazione di assegnazione viene effettuata per tutto il tempo in cui il segnale di ingresso è attivo. Così come per il blocco VSET, il segnale di ingresso del blocco viene direttamente riportato in uscita. Non ha importanza il tipo di variabile prescelta per l'assegnazione: possono essere scelti BYTE, FLOAT e INTERI, potendo anche scegliere per l'assegnazione due variabili di tipo diverso. La conversione viene effettuata automaticamente in modo da minimizzare l'errore di arrotondamento.

L'organizzazione della memoria nella simulazione del PLC

Per la simulazione del PLC, un'area di memoria viene allocata dal programma in Simulink (più precisamente, dal blocco terminale PLC Input), le cui dimensioni sono state fissate, per ora in maniera arbitraria, secondo il seguente schema:

Area di Memoria Input
BIT8    IB[INBBIT];  // 8 bytes
BYTE   IY[INBYTE];  // 8 bytes
float   IF[INFLOAT];  // 4 float
int      II[ININT];   // 8 Integer
Area di Memoria Output
BIT8    OB[INBBIT];  // 8 bytes
BYTE   OY[INBYTE];  // 8 bytes
float   OF[INFLOAT];  // 4 float
int      OI[ININT];   // 8 Integer
Area di Memoria di Scambio
BIT8    MB[MEMBBIT];   // 16 bytes
BYTE   MY[MEMBYTE];  // 64 bytes
float   MF[MEMFLOAT]; // 16 float
int      MI[MEMINT];        // 32 Integers
TMR    MT[MEMTIMER]; // 8 Timers
CNT    MC[MEMCNT]; // 8 Counters

Allo stato attuale dell'implementazione, i timer e i contatori sono allocati in zone qualsiasi di memoria. Prossimamente si provvederà a ricollocare questi oggetti nelle zone di memoria programmate. Per questi oggetti, il formato di dato utilizzato è particolare in quanto deve prevedere le seguenti informazioni:

Struttura Timer:
valore di conteggio attuale (float)
valore massimo di conteggio (float)
stato attuale uscita (ON/OFF)
stato attuale ingresso (ON/OFF)
Struttura Contatori:
valore di conteggio attuale (int)
valore massimo di conteggio (int)
stato attuale uscita (MIN/OFF/MAX)
stato attuale ingresso (DEC/OFF/INC)

Data la struttura di memoria usata, si deve intendere che ognuno dei simboli utilizzati sarà quello che dovrà essere utilizzato per mappare una certa area di memoria. Ad esempio, volendo utilizzare per un contatto normalmente aperto il bit 5 (la base è zero) del byte 3 dell'area di memoria di input, bisognerà inserire nell'apposita finestra il simbolo IB5.3

Le interfacce per il test del programma

Appositamente per il LADDER blockset, sono state realizzate due interfacce in Visual Basic 5 per comandare, durante la simulazione, gli ingressi e le uscite del sistema di controllo progettato. Entrambe le interfacce hanno semplici funzionalità, intuibili semplicemente. Per il loro utilizzo, aprire l'Explorer e nella directory nella quale è stato installato il LADDER blockset, eseguire rispettivamente i programmi PLC_IN_IF.exe e PLC_OUT_IF.exe. Le interfacce risultanti sono riportate nelle figure che seguono.

Gli esempi di progetti possibili

Il progetto di esempi con Visual Basic

Essendo un argomento piuttosto ampio, si rimanda la discussione alla pagina relativa: Esempi di Interfacce PLC con Visual Basic 

Parametri per la Simulazione con Simulink

Visto che i blocchi LADDER sono di tipo sia completamente discreto che continuo (blocchi TIMER), è necessario settare l'ambiente nel modo che segue: 

  1. Dopo aver aperto una nuova finestra del Simulink (dalla voce di menu: File-->New-->Model) selezionare nella finestra del modello la voce di menu: Simulations-->Parameters;
  2. Nella finestra che appare, selezionare la scheda (tab) Solver, disponibile in alto;
  3. Selezionare un tempo di simulazione abbastanza alto;
  4. Tra le "Solver Options", selezionare come type: "Fixed Step" e "ode1 (Euler)" come metodo di integrazione;
  5. Come "fixed step size", indicare 0.01, o un valore maggiore per macchine meno veloci;
  6. Accettare i parametri prescelti premendo il tasto OK.

Avvisi

E' doveroso ricordare che si tratta di un prodotto non disponibile sul mercato e che non presenta pertanto alcuna caratteristica di garanzia rispetto al proprio funzionamento poiché completamente gratis. Una versione del codice C per la realizzazione delle DLL e per l'interfacciamento ad applicazioni esterne del tipo Visual Basic o Visual C è disponibile solo su richiesta ben motivata. Tutto il materiale è stato realizzato (con molta fatica) dal sottoscritto indipendentemente da qualsiasi regola contrattuale con l'Università per cui la proprietà intellettuale del software è esclusivamente del sottoscritto.

Installazione del Matrix Blockset

All'inizio di questa pagina, un link al file LADDER.zip consente di scaricare la libreria LADDER Blockset. Il file zip è stato memorizzato senza un riferimento preciso ad una directory, per cui la directory di installazione dovrà essere scelta dall'utente al momento dell'installazione. 

Dopo aver avviato il programma Winzip sul file LADDER.zip, premere il tasto "Extract" per estrarre i file in una directory a piacimento.

Finestra per la scelta della directory di installazione.

Nella finestra di edit chiamata "Extract To:" (vedi figura) bisogna inserire il percorso completo della directory scelta per l'installazione. Se la directory non esiste, crearla premendo sul tasto "New Folder...". Le opzioni da attivare sono quelle mostrate nella figura. Premere quindi il tasto "Extract" per procedere all'installazione.

Dopo aver completato l'installazione, aggiungere il percorso della directory prescelta nel LADDER utilizzando l'item del menu File-->Set Path...

A questo punto l'installazione è completa. Per prelevare un blocco dal LADDER Blockset, nella finestra del Matlab è sufficiente digitare "ladder" e si otterrà come risultato la visualizzazione di un modello Simulink con tutte le funzioni a disposizione.

Per verificare la correttezza dell'installazione, nella finestra del Matlab occorre digitare il comando "TankControl1". Un modello Simulink verrà visualizzato. Il test consiste nel mandare in esecuzione il modello e verificare che l'esecuzione non dia luogo ad errori. In tal caso, avviare dalla cartella prescelta per l'installazione il programma PLC_IO_TANK.exe e quindi avviare il modello Simulink per la verifica del corretto funzionamento del controllo tramite LADDER.

Nel caso nella finestra del Matlab venga visualizzato qualche errore, vi prego di inviare una mail al sottoscritto con una spiegazione dettagliata delle operazioni compiute. Vi risponderò non appena possibile.

On Working 

Questa pagina è stata aggiornata il 18/08/01.

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