Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
| Entrambe le parti precedenti la revisione Revisione precedente Prossima revisione | Revisione precedente | ||
| software:qview:qview41:manuale_easy [2014/11/05 08:43] – documentazione | software:qview:qview41:manuale_easy [2019/10/30 09:17] (versione attuale) – qem202 | ||
|---|---|---|---|
| Linea 1: | Linea 1: | ||
| + | ====== Manuale Easy ====== | ||
| + | |||
| + | * **TIPI DI VARIABILI** [[#Tipi di variabili|Dettagli]] | ||
| + | |||
| + | |**FLAG**|Variabili booleane. Range di valori: 0 a 1. Spazio memoria: dipendente dal loro numero. Sintassi: <nome variabile> | ||
| + | |**BYTE**|Range di valori: -128 a +127. Spazio memoria: 1 byte cadauna. Sintassi: <nome variabile> | ||
| + | |**WORD**|Range di valori: -32768 a +32767. Spazio memoria: 2 byte cadauna. Sintassi <nome variabile> | ||
| + | |**LONG**|Range di valori: -2147483648 a +2147483648. Spazio memoria: 4 byte cadauna. Sintassi <nome variabile> | ||
| + | |**SINGLE**|Range di valori: -3.4 x 1038 a +3.4 x 1038. Spazio memoria: 4 byte cadauna. Sintassi <nome variabile> | ||
| + | |||
| + | * **IDENTIFICATORI** " | ||
| + | * **COSTANTI** Keyword: CONST Sintassi: <nome costante> | ||
| + | * **LE VARIABILI** [[#Le variabili SYSTEM|Dettagli]] | ||
| + | |||
| + | | **SYSTEM** | Variabili ritentivi. Sintassi: Titolo SYSTEM <nome variabile> | ||
| + | | **GLOBAL** | Variabili non ritentivi. Sintassi: Titolo GLOBAL <nome variabile> | ||
| + | | **ARRAY SYSTEM** | Variabili ritentivi uguali. Sintassi: Titolo ARRSYS <nome variabile> | ||
| + | | **ARRAY GLOBAL** | Variabili non ritentivi uguali. Sintassi: Titolo ARRGBL <nome variabile> | ||
| + | | **TIMER** | Variabili temporizzatori. Sintassi: Titolo TIMER <nome variabile> | ||
| + | | **INPUT** | Variabili con riferimenti a input. Sintassi: Titolo INPUT <nome variabile> | ||
| + | | **OUTPUT** | Variabili con riferimenti a output. Sintassi: Titolo OUTPUT <nome variabile> | ||
| + | | **DATAGROUP** | Variabili XXXXXXXX XXXXXX. Sintassi: Titolo DATAGROUP < | ||
| + | |||
| + | * **Sezione BUS** **XXXX** XXX XXXXXX | ||
| + | |||
| + | * **SIMBOLI SPECIALI** [[#Simboli Speciali|Dettagli]] | ||
| + | |||
| + | * **ISTRUZIONI QCL** [[# | ||
| + | |||
| + | * **OPERATORI** [[#Gli operatori del QCL|Dettagli]] | ||
| + | | **Operatore di assegnamento** | ...| | ||
| + | | ARITMETICI | somma (+), sottrazione (-), moltiplicazione (*), divisione (/) ed il resto della divisione (%)XXX | | ||
| + | | LOGICI | (AND, OR e NOT) xxx | | ||
| + | | BINARI | (ANDB, ORB, NOTB, XORB)XXX | | ||
| + | | RELAZIONALI | EQ(=) LT(<) LE (<=) GT (>) GE (>=) XXX | | ||
| + | | LIVELLO DI PRECEDENZA | () XXX | | ||
| + | |||
| + | ===== Introduzione alla programmazione ===== | ||
| + | |||
| + | ==== Unità di configurazione ==== | ||
| + | L’unità di configurazione è un componente fondamentale di un progetto per QMOVE; è unica nel | ||
| + | progetto e si accompagna al resto delle unità componenti il progetto (che possono essere più di | ||
| + | una).\\ | ||
| + | L’unità di configurazione contiene le dichiarazioni di tutte le variabili e di tutte le costanti | ||
| + | utilizzate nell’applicativo; | ||
| + | QMOVE adottato, specificando il tipo di scheda CPU, le schede intelligenti e le schede non | ||
| + | intelligenti presenti sul rack. L’unità di configurazione deve essere editata tramite l’editor dell’ambiente | ||
| + | QVIEW.\\ | ||
| + | L’unità di configurazione è composta da una serie di sezioni a seconda del gruppo di variabili da | ||
| + | dichiarare. Per la definizione specifica delle varie sezioni si rimanda ai paragrafi seguenti; ogni | ||
| + | sezione è identificata da una parola chiave che indica l’inizio della sezione stessa all’interno | ||
| + | dell’unità di configurazione.\\ | ||
| + | Le parole chiavi sono:\\ | ||
| + | - CONST\\ | ||
| + | - SYSTEM\\ | ||
| + | - GLOBAL\\ | ||
| + | - ARRSYS\\ | ||
| + | - ARRGBL\\ | ||
| + | - TIMER\\ | ||
| + | - INPUT\\ | ||
| + | - OUTPUT\\ | ||
| + | - DATAGROUP\\ | ||
| + | - BUS\\ | ||
| + | - INTDEVICE (sezione inserita nel capitolo dedicato ai device)\\ | ||
| + | - EXTDEVICE (sezione inserita nel capitolo dedicato ai device) | ||
| + | |||
| + | Gli esempi di composizione dell’unità di configurazione vengono presentati nel resto del manuale | ||
| + | al momento delle dichiarazioni delle variabili. | ||
| + | |||
| + | ==== Tipi di variabili ==== | ||
| + | QCL prevede cinque tipi principali di dato: | ||
| + | |||
| + | === Flag === | ||
| + | Il dato di tipo FLAG è utilizzato per la definizione di variabili booleane che hanno un range di | ||
| + | valori compreso tra 0 e 1. L’occupazione della memoria da parte delle variabili di questo tipo | ||
| + | dipende dal loro numero.\\ | ||
| + | La sintassi per la definizione di una variabile di tipo FLAG nell’unità di configurazione è la | ||
| + | seguente:\\ | ||
| + | <code QCL> | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | |||
| + | === Byte === | ||
| + | Il dato di tipo BYTE è utilizzato per la definizione di variabili che hanno un range di valori | ||
| + | compreso tra -128 e +127; ogni variabile occupa un byte di memoria.\\ | ||
| + | La sintassi per la definizione di una variabile BYTE nell’unità di configurazione è la seguente:\\ | ||
| + | <code QCL> | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | |||
| + | === Word === | ||
| + | Il dato di tipo WORD è utilizzato per la definizione di variabili che hanno un range di valori | ||
| + | compreso tra -32768 e +32767; ogni variabile occupa due byte di memoria.\\ | ||
| + | La sintassi per la definizione di una variabile WORD nell’unità di configurazione è la seguente:\\ | ||
| + | <code QCL> | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | |||
| + | === Long === | ||
| + | Il dato di tipo LONG è utilizzato per la definizione di variabili che hanno un range di valori | ||
| + | compreso tra -2147483648 e +2147483647; | ||
| + | sintassi per la definizione di una variabile LONG nell’unità di configurazione è la seguente:\\ | ||
| + | <code QCL> | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | |||
| + | === Single === | ||
| + | Il dato di tipo SINGLE è utilizzato per la definizione di variabili reali che hanno un range di valori | ||
| + | compreso tra -3.4 x 1038 e +3.4 x 1038; ogni variabile occupa quattro byte di memoria.\\ | ||
| + | La sintassi per la definizione di una variabile SINGLE nell’unità di configurazione è la seguente:\\ | ||
| + | <code QCL> | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | |||
| + | La precisione massima delle variabili SINGLE è di sette cifre (contando le cifre prima e dopo la | ||
| + | virgola). Esempio:\\ | ||
| + | | ||
| + | | ||
| + | | ||
| + | |||
| + | === Tabella riassuntiva dei tipi di variabili utilizzabili === | ||
| + | ^Assegnando ad una variabile un valore esterno al range consentito si verifica la condizione di overflow.^ | ||
| + | |||
| + | |Tipo dato|Codice|Spazio occupato memoria (Bit)|Intervallo| | ||
| + | |FLAG|F|1|0 ÷ 1| | ||
| + | |BYTE|B|8|-128 ÷ 127| | ||
| + | |WORD|W|16|-32768 ÷ 32767| | ||
| + | |LONG|L|32|-2147483648 ÷ 2147483647| | ||
| + | |SINGLE|S|32|-3.4 x 10E38÷+3.4 x 10E38| | ||
| + | |||
| + | ==== Gli Identificatori ==== | ||
| + | ^Il carattere punto e virgola (";" | ||
| + | Gli identificatori sono dei nomi tramite i quali è possibile fare dei riferimenti ad oggetti o ad | ||
| + | etichette. Ogni identificatore è formato da uno o più caratteri alfanumerici tenendo presente | ||
| + | che il primo deve essere una lettera. I caratteri alfanumerici possono essere riassunti in:\\ | ||
| + | - dalla " | ||
| + | - dalla " | ||
| + | - da " | ||
| + | - " | ||
| + | |||
| + | === I nomi === | ||
| + | I nomi vengono usati per agevolare l' | ||
| + | Per oggetto si intende qualsiasi entità gestibile a livello di linguaggio e provvista di caratteristiche | ||
| + | fisiche proprie come ad esempio: variabili, ingressi, uscite e devices interni od esterni. I | ||
| + | nomi sono limitati ad una lunghezza massima di 12 caratteri ed essendo immagazzinati nella | ||
| + | memoria del QMOVE incidono per un byte a carattere nell' | ||
| + | progetto non vi possono essere due oggetti con lo stesso nome. | ||
| + | |||
| + | ==== Le costanti ==== | ||
| + | Una costante è un carattere o una stringa di caratteri utilizzabile come valore in un applicativo. | ||
| + | Le costanti vengono dichiarate nell’unità di configurazione e devono essere poste in seguito alla | ||
| + | parola chiave “CONST”. Viene riportata la sintassi per la definizione di costanti: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione costanti | ||
| + | ; | ||
| + | CONST | ||
| + | <nome costante> | ||
| + | </ | ||
| + | dove: | ||
| + | |CONST|Parola chiave che indica la definizione delle costanti.| | ||
| + | |<nome costante> | ||
| + | |< | ||
| + | |||
| + | [[#Esempio Costanti|Esempio]] | ||
| + | |||
| + | ==== Le variabili SYSTEM ==== | ||
| + | ^Le variabili SYSTEM mantengono il loro valore anche allo spegnimento del sistema.^ | ||
| + | Con il nome SYSTEM vengono raggruppate tutte le variabili ritentive di uso generico; possono | ||
| + | essere di tipo FLAG, BYTE, WORD, LONG o SINGLE e sono accessibili sia in scrittura che in lettura. | ||
| + | Vengono dichiarate nell’unità di configurazione e devono essere poste in seguito alla parola | ||
| + | chiave “SYSTEM”. Viene riportata la sintassi per la definizione di variabili SYSTEM. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili SYSTEM | ||
| + | ; | ||
| + | SYSTEM | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | dove: | ||
| + | |SYSTEM|Parola chiave che indica la definizione di variabili SYSTEM.| | ||
| + | |<nome variabile> | ||
| + | |< | ||
| + | |||
| + | [[#Esempio Variabili SYSTEM|Esempio]] | ||
| + | |||
| + | |||
| + | ==== Le variabili GLOBAL ==== | ||
| + | Con il nome GLOBAL vengono raggruppate tutte le variabili non ritentive ad uso generico; hanno | ||
| + | la caratteristica di venire azzerate ad ogni accensione del sistema; possono essere di tipo FLAG, | ||
| + | BYTE, WORD, LONG e SINGLE e sono accessibili sia in scrittura che in lettura. Vengono dichiarate | ||
| + | nell’unità di configurazione e devono essere poste in seguito alla parola chiave “GLOBAL”. Viene | ||
| + | riportata la sintassi per la definizione di variabili GLOBAL. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili GLOBAL | ||
| + | ; | ||
| + | GLOBAL | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | dove: | ||
| + | |GLOBAL|Parola chiave che indica per la definizione di variabili GLOBAL.| | ||
| + | |<nome variabile> | ||
| + | |< | ||
| + | Per esempi relativi alla sintassi per la definizione, | ||
| + | SYSTEM. | ||
| + | ^Quanto descritto in questo esempio deve essere inserito nel progetto Firstapp.qm4 in modo da poter mettere immediatamente in pratica quanto appreso.^ | ||
| + | |||
| + | [[#Esempio variabili GLOBAL|Esempio]] | ||
| + | |||
| + | ==== Utilizzo variabili SYSTEM e GLOBAL ===== | ||
| + | Le variabili SYSTEM e GLOBAL possono essere utilizzate sia a destra che a sinistra di un’assegnazione | ||
| + | o dentro un’espressione (indicandone soltanto il nome). Non è possibile indicizzare una | ||
| + | variabile di questo tipo.\\ | ||
| + | Esempi di scrittura ed utilizzo delle variabili system e global sono inseriti nello sviluppo del | ||
| + | progetto // | ||
| + | |||
| + | ==== Le variabili ARRAY SYSTEM ==== | ||
| + | Una variabile Array System è un insieme di variabili ritentive dello stesso tipo, aventi la stessa | ||
| + | dimensione ed alle quali è possibile accedere tramite un nome comune, riferendosi ad uno | ||
| + | specifico elemento tramite un indice. Non sono previsti array di variabili tipo FLAG.\\ | ||
| + | Come le SYSTEM sono variabili ritentive di uso generale e devono essere dichiarate di seguito | ||
| + | alla parola chiave “ARRSYS”.\\ | ||
| + | Viene riportata la sintassi per la definizione di variabili ARRAY SYSTEM. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili ARRAY SYSTEM | ||
| + | ; | ||
| + | ARRSYS | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | dove: | ||
| + | |GLOBAL|Parola chiave che per la definizione di variabili ARRAY SYSTEM.| | ||
| + | |<nome variabile> | ||
| + | |< | ||
| + | |< | ||
| + | |||
| + | Il numero massimo di elementi consentiti in un array è di 65535. Non si possono indicare dimensioni | ||
| + | negative o dimensioni con parte decimale. Come dimensione dell’array è possibile usare | ||
| + | delle costanti già definite nella sezione CONST; se questa avesse valore decimale verrà troncato: | ||
| + | ad esempio il valore 200.34 viene forzato a 200. | ||
| + | |||
| + | [[#Esempio variabili ARRAY SYSTEM|Esempio]] | ||
| + | |||
| + | ==== Le variabili ARRAY GLOBAL ==== | ||
| + | Una variabile Array Global è un insieme di variabili non ritentive dello stesso tipo, aventi la | ||
| + | stessa dimensione ed alle quali è possibile accedere tramite un nome comune, riferendosi ad | ||
| + | uno specifico elemento tramite un indice. Non sono previsti array di variabili tipo FLAG.\\ | ||
| + | Come le GLOBAL sono variabili non ritentive di uso generale e devono essere dichiarate di seguito | ||
| + | alla parola chiave “ARRGBL”.\\ | ||
| + | Viene riportata la sintassi per la definizione di variabili ARRAY GLOBAL: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili ARRAY GLOBAL | ||
| + | ; | ||
| + | ARRGBL | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | dove: | ||
| + | |ARRGBL|Parola chiave per la definizione di variabili ARRAY GLOBAL.| | ||
| + | |<nome variabile> | ||
| + | |< | ||
| + | |< | ||
| + | |||
| + | Per esempi relativi alla sintassi per la definizione, | ||
| + | ARRAY SYSTEM. | ||
| + | |||
| + | [[#Esempio variabili ARRAY GLOBAL|Esempio]] | ||
| + | |||
| + | ==== Utilizzo variabili ARRAY SYSTEM ed ARRAY GLOBAL ==== | ||
| + | Le variabili Array possono essere utilizzate sia a destra che a sinistra di un’assegnazione o dentro | ||
| + | un’espressione con la seguente sintassi: | ||
| + | <code QCL> | ||
| + | < Nome Array >[ i ] | ||
| + | </ | ||
| + | |||
| + | dove “i” può essere un numero, una costante, una variabile (non di tipo Single) o un’espressione | ||
| + | complessa. Gli indici di un array partono sempre da 1 e non sono ammessi valori superiori al | ||
| + | numero massimo di elementi. | ||
| + | |||
| + | ==== Le variabili TIMER ==== | ||
| + | Sono variabili utilizzate per realizzare temporizzazioni alle quali può essere assegnato un valore | ||
| + | intero (espresso in ms) che rappresenta il tempo che deve trascorrere (dal momento dell’assegnazione); | ||
| + | in lettura è disponibile lo stato di “temporizzazione terminata” (1) o “temporizzazione | ||
| + | attiva” (0).\\ | ||
| + | Mediante l’istruzione //<nome variabile>: | ||
| + | prima della fine del timer.\\ | ||
| + | Le variabili timer vengono dichiarate nell’unità di configurazione e devono essere poste in seguito | ||
| + | alla parola chiave “TIMER”.\\ | ||
| + | Viene riportata la sintassi per la definizione di variabili TIMER. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili TIMER | ||
| + | ; | ||
| + | TIMER | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | dove: | ||
| + | |TIMER|Parola chiave per la definizione di variabili TIMER.| | ||
| + | |<nome variabile> | ||
| + | |||
| + | [[#Esempio variabili TIMER|Esempio]] | ||
| + | |||
| + | ==== Utilizzo variabili TIMER ==== | ||
| + | Le variabili timer possono essere utilizzate sia a destra che a sinistra di un’assegnazione o | ||
| + | dentro un’espressione indicando semplicemente il nome della variabile: | ||
| + | <code QCL> | ||
| + | < Nome Timer > | ||
| + | </ | ||
| + | |||
| + | Quando la variabile timer si trova a sinistra dell’assegnazione si definisce il caricamento di un | ||
| + | valore sul timer (valore espresso in millisecondi): | ||
| + | <code QCL> | ||
| + | tMioTimer = 1000 ;Imposta il timer tMioTimer a 1 secondo. | ||
| + | </ | ||
| + | |||
| + | Quando la variabile timer si trova a destra dell’assegnazione o all’interno di una espressione ne | ||
| + | viene letto lo stato (0 = Temporizzazione attiva, 1 = Temporizzazione terminata): | ||
| + | <code QCL> | ||
| + | gfIsTimerEnd = tMioTimer ;Assegna alla variabile gfIsTimerEnd lo stato del timer. | ||
| + | </ | ||
| + | oppure | ||
| + | <code QCL> | ||
| + | IF(tMioTimer) | ||
| + | ..... | ||
| + | ..... | ||
| + | ENDIF | ||
| + | </ | ||
| + | |||
| + | È, inoltre, possibile leggere il valore del tempo rimanente prima dello scadere del timer (il | ||
| + | valore restituito è espresso in millisecondi): | ||
| + | <code QCL> | ||
| + | < Nome Timer >:remain | ||
| + | </ | ||
| + | |||
| + | Esempio: | ||
| + | <code QCL> | ||
| + | glTempoRiman = tMioTimer: | ||
| + | </ | ||
| + | |||
| + | ==== Le variabili INPUT ed OUTPUT ==== | ||
| + | Sono tutte le variabili che fanno riferimento ad ingressi od uscite digitali. Vengono dichiarate | ||
| + | nell’unità di configurazione; | ||
| + | ingressi o “OUTPUT” per le uscite.\\ | ||
| + | Viene riportata la sintassi per la definizione di variabili INPUT ed OUTPUT. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili INPUT ed OUTPUT | ||
| + | ; | ||
| + | INPUT | ||
| + | <nome variabile> | ||
| + | OUTPUT | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | ^Gli I/O address sono disponibili sulle schede tecniche hardware delle schede utilizzate.^ | ||
| + | |||
| + | dove: | ||
| + | |INPUT|Parola chiave per la definizione di variabili INPUT.| | ||
| + | |OUTPUT|Parola chiave per la definizione di variabili OUTPUT.| | ||
| + | |<nome variabile> | ||
| + | |< | ||
| + | |<io address> | ||
| + | |||
| + | Un’applicazione interessante degli ingressi e delle uscite digitali è quello del raggruppamento | ||
| + | degli stessi in un unico identificatore. Questo identificatore è analogo ad una variabile di otto | ||
| + | bit dove ogni ingresso o uscita digitale rappresenta un bit.\\ | ||
| + | Se per esempio abbiamo una terza scheda MIX montata sullo slot 3 sono possibile le ulteriori | ||
| + | dichiarazioni: | ||
| + | **Nella sezione INPUT** | ||
| + | <code QCL> | ||
| + | ibIngresso B 3.INPB | ||
| + | </ | ||
| + | |||
| + | **Nella sezione OUTPUT** | ||
| + | <code QCL> | ||
| + | obUscita B 3.OUTB | ||
| + | </ | ||
| + | |||
| + | Se si dispone di schede con più di otto ingressi o uscite digitali (per esempio D24, I24 oppure | ||
| + | O24), è possibile raggrupparli in gruppi di otto modificando la dichiarazione: | ||
| + | **Nella sezione INPUT** | ||
| + | <code QCL> | ||
| + | ibIngresso1 B 3.INPB1 | ||
| + | ;digitali raggruppati in un byte. | ||
| + | ibIngresso2 B 3.INPB2 | ||
| + | ;ingressi digitali raggruppati in | ||
| + | ;un byte. | ||
| + | </ | ||
| + | |||
| + | **Nella sezione OUTPUT** | ||
| + | <code QCL> | ||
| + | obUscita1 B 3.OUTB1 | ||
| + | ;digitali raggruppate in un byte. | ||
| + | obUscita2 B 3.OUTB2 | ||
| + | ;digitali raggruppate in un byte. | ||
| + | </ | ||
| + | |||
| + | [[#Esempio variabili INPUT ed OUTPUT|Esempio]] | ||
| + | ==== Le variabili DATAGROUP ==== | ||
| + | Le variabili finora presentate possono essere pensate come una zona di memoria, di dimensioni | ||
| + | diverse a seconda del tipo della variabile, contenente un singolo valore. Nel progetto si fa | ||
| + | riferimento a tale zona di memoria tramite un identificatore che è il nome assegnato alla variabile | ||
| + | nell’unità di configurazione.\\ | ||
| + | Le variabili Datagroup sono una particolare struttura di dati. Quando si dichiara un datagroup, si | ||
| + | organizza una parte della memoria come una tabella formata da righe e colonne. Le colonne | ||
| + | sono chiamate “programmi”, | ||
| + | Ogni programma (colonna) contiene due tipologie di variabili: | ||
| + | - Statiche.\\ | ||
| + | - Indicizzate. | ||
| + | |||
| + | Le statiche sono delle variabili che possono assumere un valore diverso a seconda del programma | ||
| + | (colonna) a cui si fa riferimento. Nella dichiarazione, | ||
| + | con un unico nome quindi, per poter far riferimento ai diversi valori che può assumere, si deve | ||
| + | utilizzare un metodo di indicizzazione. Per esempio, per far riferimento alla variabile “dslVeMa” | ||
| + | del programma (colonna) 5, viene adottato questo metodo:\\ | ||
| + | | ||
| + | |||
| + | Le indicizzate sono variabili che possono assumere un valore diverso a seconda del programma e | ||
| + | del passo (riga) a cui si fa riferimento. Nella dichiarazione, | ||
| + | con un unico nome quindi, per potersi riferire ai diversi valori che può assumere, si deve | ||
| + | utilizzare un metodo di indicizzazione. Per esempio, per far riferimento alla variabile “ddwLuPe” | ||
| + | del programma (colonna) 5 e del passo (riga) 3, viene adottato questo metodo:\\ | ||
| + | | ||
| + | |||
| + | Graficamente il datagroup si può rappresentare in questo modo: | ||
| + | ^_^Prog.1^Prog. 2^Prog. 3^Prog. 4^Prog. 5^_^ | ||
| + | ^_|dslVeMa[1]|dslVeMa[2]|dslVeMa[3]|dslVeMa[4]|dslVeMa[5]^Statiche^ | ||
| + | ^Step 1|ddwLuPe[1, | ||
| + | ^Step 2|ddwLuPe[1, | ||
| + | ^Step 3|ddwLuPe[1, | ||
| + | ^Step 4|_|_|_|_|ddwLuPe[5, | ||
| + | ^Step 5|_|_|_|_|ddwLuPe[5, | ||
| + | Nelle due sezioni, statiche e indicizzate, | ||
| + | |||
| + | Viene riportata la sintassi per la definizione di variabili DATAGROUP: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione del DataGroup | ||
| + | ; | ||
| + | DATAGROUP | ||
| + | <nome DataGroup> | ||
| + | ; | ||
| + | DATAPROGRAM | ||
| + | <numero programmi> | ||
| + | ; | ||
| + | <nome variabile> | ||
| + | <nome variabile> | ||
| + | <nome variabile> | ||
| + | ; | ||
| + | STEP | ||
| + | <numero passi> | ||
| + | ;Definisce le variabili indicizzate di ciascun passo | ||
| + | <nome variabile> | ||
| + | <nome variabile> | ||
| + | <nome variabile> | ||
| + | </ | ||
| + | dove: | ||
| + | |DATAGROUP|Parola chiave per la definizione di un DataGroup.| | ||
| + | |<nome DataGroup|Nome associato al DataGroup.| | ||
| + | |DATAPROGRAM|Parola chiave per la definizione delle variabili statiche nel DataGroup.| | ||
| + | |<num. programmi> | ||
| + | |<nome variabile> | ||
| + | |< | ||
| + | |STEP|Parola chiave per la definizione delle variabili indicizzate nel DataGroup.| | ||
| + | |<numero passi> | ||
| + | |<nome variabile> | ||
| + | |< | ||
| + | |||
| + | La definizione del DATAGROUP è composta di 3 parti:\\ | ||
| + | - una relativa alla definizione del nome del datagroup.\\ | ||
| + | - una relativa all’impostazione del numero programmi e delle variabili statiche (inizia con la parola chiave DATAPROGRAM).\\ | ||
| + | - una relativa all’impostazione del numero di passi di programma e delle variabili indicizzate (inizia con la parola chiave STEP). | ||
| + | |||
| + | Il nome datagroup segue tutte le regole generali finora incontrate per la sintassi dei nomi variabili. | ||
| + | |||
| + | Il numero programmi va scritto in forma numerica, oppure tramite l’ausilio di costanti e deve essere diverso da zero; il numero massimo di programmi è 65534. | ||
| + | |||
| + | Il numero passi va scritto in forma numerica, oppure tramite l’ausilio di costanti e deve essere diverso da zero. Il numero massimo di passi è 65534. | ||
| + | |||
| + | La sottosezione DATAPROGRAM è obbligatoria, | ||
| + | |||
| + | Non è possibile dichiarare una sezione STEP senza dichiarare almeno una variabile indicizzata. È | ||
| + | possibile dichiarare una sezione STEP senza dichiarare una sezione DATAPROGRAM. Non è possibile | ||
| + | dichiarare una sezione DATAPROGRAM senza dichiarare almeno una variabile statica. È possibile | ||
| + | dichiarare una sezione DATAPROGRAM senza dichiarare una sezione STEP.\\ | ||
| + | In un DATAGROUP tutte le variabili, sia statiche che indicizzate, | ||
| + | |||
| + | Per calcolare l’occupazione in memoria totale del DATAGROUP si deve tener presente che ogni | ||
| + | variabile inserita nel datagroup occupata 4 byte (qualsiasi sia il tipo scelto per la variabile | ||
| + | stessa). Quindi l’occupazione in byte è pari a: | ||
| + | |||
| + | (N.Programmi x N.Variabili statiche x 4 ) + ( N.Programmi x N.Passi x N.Variabili indicizzate x 4). | ||
| + | |||
| + | [[#Esempio variabili DATAGROUP|Esempio]] | ||
| + | |||
| + | ==== Utilizzo variabili DATAGROUP ==== | ||
| + | Una variabile DataGroup (static o index), può essere utilizzata sia a destra che a sinistra di | ||
| + | un’assegnazione o dentro un’espressione. | ||
| + | |||
| + | Sintassi nel caso di variabile statiche: | ||
| + | <code QCL> | ||
| + | < Nome variabile Static > < [ num_prog ] > | ||
| + | </ | ||
| + | |||
| + | Sintassi nel caso di variabile indicizzate: | ||
| + | <code QCL> | ||
| + | < Nome variabile Index > < [ num_prog, num_step ] > | ||
| + | </ | ||
| + | |||
| + | // | ||
| + | un’espressione complessa. Nel caso di numero o di costante, viene eseguito il controllo durante | ||
| + | la compilazione che l’indice non superi la dimensione massima dichiarata in configurazione (rispettivamente | ||
| + | per il numero programmi e il numero step); gli altri indici - //num_prog e num_step// - partono (in valore) da uno. | ||
| + | |||
| + | Un esempio di utilizzo dei datagroups viene presentato nell’esempio dell’istruzione FOR / NEXT. | ||
| + | |||
| + | ==== Sezione BUS ==== | ||
| + | La sezione BUS nell’unità di configurazione è indispensabile per dichiarare quali siano le dotazioni | ||
| + | hardware che il programmatore ha a disposizione.\\ | ||
| + | In questa sezione si dovrà indicare quale è la CPU utilizzata e inserita nello slot 1 e quali siano le | ||
| + | altre schede negli altri slots.\\ | ||
| + | Ogni scheda è individuata da una parola chiave che ne identifica tipologia di hardware e, nel | ||
| + | caso di schede intelligenti, | ||
| + | installazione e manutenzione dell’hardware utilizzato. | ||
| + | |||
| + | [[#Esempio configurazione BUS|Esempio]] | ||
| + | |||
| + | ===== Simboli Speciali ===== | ||
| + | |||
| + | Vi sono dei simboli che sono dichiarabili esclusivamente nello slot 1 ( CPU ) e che servono per | ||
| + | leggere gli ingressi in interruzione e per i device simulati. Di seguito è riportata una tabella | ||
| + | riepilogativa per questi simboli: | ||
| + | |||
| + | |**Simbolo**|**Tipo segnale**|**Dimensione**|**Accesso**| | ||
| + | |INT01|Input|Flag|Read| | ||
| + | |INT02|Input|Flag|Read| | ||
| + | |INT03|Input|Flag|Read| | ||
| + | |INT04|Input|Flag|Read| | ||
| + | |INT05|Input|Flag|Read| | ||
| + | |INT06|Input|Flag|Read| | ||
| + | |INT07|Input|Flag|Read| | ||
| + | |INT08|Input|Flag|Read| | ||
| + | |CNT01|Conteggio|Word|Read| | ||
| + | |CNT02|Conteggio|Word|Read| | ||
| + | |CNT03|Conteggio|Word|Read| | ||
| + | |CNT04|Conteggio|Word|Read| | ||
| + | |CNT05|Conteggio|Word|Read| | ||
| + | |AN01|DAC|Word|Write| | ||
| + | |AN02|DAC|Word|Write| | ||
| + | |AN03|DAC|Word|Write| | ||
| + | |AN04|DAC|Word|Write| | ||
| + | |AN05|DAC|Word|Write| | ||
| + | |||
| + | Con il simbolo speciale INTnn è possibile dichiarare un ingresso fittizio che legge la linea di | ||
| + | interrupt in ingresso alla CPU. Un esempio di utilizzo di questo simbolo speciale è: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili INPUT ed OUTPUT | ||
| + | ; | ||
| + | INPUT | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | </ | ||
| + | Gli altri simboli della tabella sono utilizzati per creare dei device simulati. Utilizzando i simboli | ||
| + | CNTnn in una dichiarazione di un normale device il conteggio che il device acquisisce non è | ||
| + | reale, ma viene simulato dalla CPU stessa. Se per esempio vengono dichiarati i seguenti device | ||
| + | (si veda dichiarazione dei device nei relativi manuali): | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; INTDEVICE Declaration | ||
| + | ; | ||
| + | INTDEVICE | ||
| + | eaSim EANPOS | ||
| + | cnSim COUNTER3 | ||
| + | </ | ||
| + | |||
| + | Il device EANPOS, che è un posizionatore analogico, genererà un profilo ideale della posizione | ||
| + | nel tempo e il device COUNTER3 leggerà semplicemente la posizione di un asse dall’ingresso di | ||
| + | conteggio virtuale 1.CNT01.\\ | ||
| + | Se inoltre il device EANPOS viene dichiarato nel seguente modo: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; INTDEVICE Declaration | ||
| + | ; | ||
| + | INTDEVICE | ||
| + | eaSim EANPOS | ||
| + | </ | ||
| + | la CPU generà, oltre al profilo di posizione nel tempo, anche l’andamento di una tensione virtuale | ||
| + | nel tempo per realizzare tale posizionamento. L’andamento della tensione nel tempo si può | ||
| + | leggere da un apposito parametro del device EANPOS. | ||
| + | |||
| + | ===== Istruzioni QCL ===== | ||
| + | |||
| + | Il QCL (QEM Control Language) è un linguaggio nato appositamente per la programmazione del | ||
| + | sistema QMOVE. Le caratteristiche principali del QCL sono la semplicità (poche ma potenti istruzioni) | ||
| + | la facilità d’uso (somiglianza con il linguaggio BASIC) e l’orientamento verso l’automazione | ||
| + | industriale grazie alle istruzioni appositamente studiate per il controllo assi. | ||
| + | |||
| + | ==== Gli operatori del QCL ==== | ||
| + | Nel linguaggio QCL vengono messi a disposizione tutti gli operatori elementari per la manipolazione | ||
| + | dei dati. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | === Esempio Costanti === | ||
| + | ^Quanto descritto in questo esempio deve essere inserito nel progetto Firstapp.qm4 in modo da poter mettere immediatamente in pratica quanto appreso.^ | ||
| + | Nell’unità di configurazione (firstapp) aggiungiamo la sezione per la dichiarazione delle costanti: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione COSTANTI | ||
| + | ; | ||
| + | CONST | ||
| + | TM_SECONDO 1000 ;Costante con valore 1000 per il tempo di un secondo. | ||
| + | DIM_ARRAY 7 ; | ||
| + | DIM_PROG 10 ; | ||
| + | DIM_STEP 5 ;Costante con valore 5 per il numero degli step nel datagroup. | ||
| + | </ | ||
| + | |||
| + | === Esempio Variabili SYSTEM === | ||
| + | ^Quanto descritto in questo esempio deve essere inserito nel progetto Firstapp.qm4 in modo da poter mettere immediatamente in pratica quanto appreso.^ | ||
| + | Attualmente nell’unità firstapp di esempio è già presente la sezione SYSTEM (nella quale è | ||
| + | dichiarata la variabile slProva); aggiungiamo le seguenti variabili: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione Variabili SYSTEM | ||
| + | ; | ||
| + | SYSTEM | ||
| + | slProva L ;Variabile di prova dimensione LONG tipo SYSTEM. | ||
| + | sbSecondi B ;Variabile per i secondi. | ||
| + | sbMinuti B ; | ||
| + | swOre W ;Variabile per le ore. | ||
| + | </ | ||
| + | |||
| + | ==== Esempio variabili GLOBAL ==== | ||
| + | Nell’unità di configurazione (firstapp), in seguito alla sezione SYSTEM aggiungiamo la sezione | ||
| + | per la dichiarazione del gruppo GLOBAL: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione Variabili GLOBAL | ||
| + | ; | ||
| + | GLOBAL | ||
| + | gfMioFlag | ||
| + | gbTuoByte | ||
| + | gwSuoWord | ||
| + | glNostroLong | ||
| + | gsVostroSing | ||
| + | </ | ||
| + | |||
| + | ==== Utilizzo variabili SYSTEM e GLOBAL ===== | ||
| + | Le variabili SYSTEM e GLOBAL possono essere utilizzate sia a destra che a sinistra di un’assegnazione | ||
| + | o dentro un’espressione (indicandone soltanto il nome). Non è possibile indicizzare una | ||
| + | variabile di questo tipo.\\ | ||
| + | Esempi di scrittura ed utilizzo delle variabili system e global sono inseriti nello sviluppo del | ||
| + | progetto // | ||
| + | |||
| + | |||
| + | === Esempio variabili ARRAY SYSTEM === | ||
| + | ^Quanto descritto in questo esempio deve essere inserito nel progetto Firstapp.qm4 in modo da poter mettere immediatamente in pratica quanto appreso.^ | ||
| + | Nell’unità di configurazione (firstapp), in seguito alla sezione GLOBAL aggiungiamo la sezione | ||
| + | per la dichiarazione del gruppo ARRAY SYSTEM. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili ARRAY SYSTEM | ||
| + | ; | ||
| + | ARRSYS | ||
| + | asbMioArray B 10 ; | ||
| + | aslTuoArray L DIM_ARRAY | ||
| + | </ | ||
| + | Si osservi che nel secondo array si è usata una costante per la dichiarazione della dimensione. | ||
| + | |||
| + | ==== Esempio variabili ARRAY GLOBAL ==== | ||
| + | ^Quanto descritto in questo esempio deve essere inserito nel progetto Firstapp.qm4 in modo da poter mettere immediatamente in pratica quanto appreso.^ | ||
| + | Nell’unità di configurazione (firstapp), in seguito alla sezione ARRAY SYSTEM aggiungiamo la | ||
| + | sezione per la dichiarazione del gruppo ARRAY GLOBAL. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione variabili ARRAY GLOBAL | ||
| + | ; | ||
| + | ARRGBL | ||
| + | arwMioArray W 15 ; | ||
| + | </ | ||
| + | |||
| + | Un esempio della modalità di scrittura in un’array viene fatto in seguito nell’esempio relativo | ||
| + | all’istruzione FOR / NEXT. | ||
| + | |||
| + | ==== Utilizzo variabili ARRAY SYSTEM ed ARRAY GLOBAL ==== | ||
| + | Le variabili Array possono essere utilizzate sia a destra che a sinistra di un’assegnazione o dentro | ||
| + | un’espressione con la seguente sintassi: | ||
| + | <code QCL> | ||
| + | < Nome Array >[ i ] | ||
| + | </ | ||
| + | |||
| + | dove “i” può essere un numero, una costante, una variabile (non di tipo Single) o un’espressione | ||
| + | complessa. Gli indici di un array partono sempre da 1 e non sono ammessi valori superiori al | ||
| + | numero massimo di elementi. | ||
| + | |||
| + | ==== Esempio variabili TIMER ==== | ||
| + | ^Quanto descritto in questo esempio deve essere inserito nel progetto Firstapp.qm4 in modo da poter mettere immediatamente in pratica quanto appreso.^ | ||
| + | Nell’unità di configurazione (firstapp), in seguito alla sezione ARRAY GLOBAL aggiungiamo la | ||
| + | sezione per la dichiarazione del gruppo TIMER. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione TIMER | ||
| + | ; | ||
| + | TIMER | ||
| + | tTempo1 | ||
| + | tTempo2 | ||
| + | tSecondi | ||
| + | tDelay | ||
| + | </ | ||
| + | |||
| + | Un’esempio di uso della variabile timer viene presentato in seguito nell’esempio per l’istruzione | ||
| + | IF / ELSE / ENDIF per la realizzazione di un semplice orologio. | ||
| + | |||
| + | ==== Utilizzo variabili TIMER ==== | ||
| + | Le variabili timer possono essere utilizzate sia a destra che a sinistra di un’assegnazione o | ||
| + | dentro un’espressione indicando semplicemente il nome della variabile: | ||
| + | <code QCL> | ||
| + | < Nome Timer > | ||
| + | </ | ||
| + | |||
| + | Quando la variabile timer si trova a sinistra dell’assegnazione si definisce il caricamento di un | ||
| + | valore sul timer (valore espresso in millisecondi): | ||
| + | <code QCL> | ||
| + | tMioTimer = 1000 ;Imposta il timer tMioTimer a 1 secondo. | ||
| + | </ | ||
| + | |||
| + | Quando la variabile timer si trova a destra dell’assegnazione o all’interno di una espressione ne | ||
| + | viene letto lo stato (0 = Temporizzazione attiva, 1 = Temporizzazione terminata): | ||
| + | <code QCL> | ||
| + | gfIsTimerEnd = tMioTimer ;Assegna alla variabile gfIsTimerEnd lo stato del timer. | ||
| + | </ | ||
| + | oppure | ||
| + | <code QCL> | ||
| + | IF(tMioTimer) | ||
| + | ..... | ||
| + | ..... | ||
| + | ENDIF | ||
| + | </ | ||
| + | |||
| + | È, inoltre, possibile leggere il valore del tempo rimanente prima dello scadere del timer (il | ||
| + | valore restituito è espresso in millisecondi): | ||
| + | <code QCL> | ||
| + | < Nome Timer >:remain | ||
| + | </ | ||
| + | |||
| + | Esempio: | ||
| + | <code QCL> | ||
| + | glTempoRiman = tMioTimer: | ||
| + | </ | ||
| + | |||
| + | ==== Esempio variabili INPUT ed OUTPUT ==== | ||
| + | ^Quanto descritto in questo esempio deve essere inserito nel progetto Firstapp.qm4 in modo da poter mettere immediatamente in pratica quanto appreso.^ | ||
| + | Per inserire la sezione relativa alla dichiarazione del gruppo di INPUT e di OUTPUT è necessario | ||
| + | disporre di una scheda che metta a disposizione un insieme di ingressi e di uscite digitali. In | ||
| + | questo esempio faremo riferimento ad una scheda MIX, la quale dispone di otto ingressi e otto | ||
| + | uscite digitali identificabili nei manuali delle schede tecniche con X.INP01 … X.INP08 e X.OUT01 | ||
| + | … X.OUT08, rispettivamente, | ||
| + | Nell’unità di configurazione (firstapp), in seguito alla sezione TIMER aggiungiamo la sezione per | ||
| + | la dichiarazione delle variabili INPUT ed OUTPUT. | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione degli INPUT | ||
| + | ; | ||
| + | INPUT | ||
| + | ifSetUpOre F 2.INP01 | ||
| + | ; | ||
| + | ifSetUpMin F 2.INP02 | ||
| + | ; | ||
| + | ifAbilU1 F 2.INP03 | ||
| + | ; | ||
| + | ; | ||
| + | ; Definizione degli OUTPUT | ||
| + | ; | ||
| + | OUTPUT | ||
| + | ofUscita1 F 2.OUT01 | ||
| + | ; | ||
| + | ofUscita2 F 2.OUT02 | ||
| + | ; | ||
| + | </ | ||
| + | |||
| + | ==== Esempio variabili DATAGROUP ==== | ||
| + | ^Quanto descritto in questo esempio deve essere inserito nel progetto Firstapp.qm4 in modo da poter mettere immediatamente in pratica quanto appreso.^ | ||
| + | Nell’unità di configurazione (firstapp), in seguito alla sezione di dichiarazione degli INPUT ed | ||
| + | OUTPUT inseriamo le dichiarazioni del gruppo DATAGROUP: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Definizione del DATAGROUP | ||
| + | ; | ||
| + | DATAGROUP | ||
| + | dMioDataGrp | ||
| + | ;Datagroup. | ||
| + | DATAPROGRAM | ||
| + | DIM_PROG | ||
| + | ; | ||
| + | dsfStat1 F ;variabile statica di tipo Flag. | ||
| + | dswStat2 W ;Variabile statica di tipo Word. | ||
| + | STEP | ||
| + | DIM_STEP | ||
| + | ; | ||
| + | ddbDin1 B ; | ||
| + | ddlDin2 L ; | ||
| + | </ | ||
| + | |||
| + | === Esempio configurazione BUS === | ||
| + | Nell’unità di configurazione (firstapp), in seguito alla sezione di dichiarazione dei DATAGROUP | ||
| + | inseriamo le dichiarazioni relative alla configurazione del BUS: | ||
| + | <code QCL> | ||
| + | ; | ||
| + | ; Configurazione BUS | ||
| + | ; | ||
| + | BUS | ||
| + | 1 1CPUB 02 ; | ||
| + | 2 1MIXA 00 ; | ||
| + | 3 . . ;Lo slot 3 è il primo libero. | ||
| + | </ | ||
| + | Dopo aver configurato in questo modo il BUS è possibile compilare il progetto. Se ci sono errori | ||
| + | nella compilazione verrà visualizzato un messaggio di errore che darà una descrizione sommaria | ||
| + | del tipo di errore, indicando il file, riga e colonna in cui è localizzato.\\ | ||
| + | Una volta compilato ed eseguito correttamente il download del progetto è possibile visualizzare, | ||
| + | con i comandi del menu monitor, tutte le variabili introdotte, compresi gli elementi degli | ||
| + | arrays e le variabili dei datagroup; con un doppio clic sul nome della variabile appare una piccola | ||
| + | finestra per l’inserzione del valore.\\ | ||
| + | Immettendo un valore diverso da zero in una variabile global, quando si mette in stato di stop la | ||
| + | CPU questa variabile perde il valore impostato e si azzera. | ||
| + | Ora abbiamo a disposizione una serie di variabili su cui sperimentare le istruzioni QCL descritte | ||
| + | in seguito. | ||
| + | |||
| + | Se non si ha a disposizione l’hardware indicato nella configurazione del bus, dovranno essere | ||
| + | inserite le parole chiave relative alle schede in possesso. È chiaro che per il corretto funzionamento | ||
| + | dell’esempio Firstapp.qm4 è necessario che nello slot 2 venga inserito un hardware che | ||
| + | metta a disposizione ingressi ed uscite digitali. | ||
| + | |||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||
| + | * [[software: | ||