Introduzione
Le variabili globali (da qui e in seguito denominate GV) sono aree di memoria condivise con accesso semaforato.
Lo scopo di queste variabili è di essere usate per lo scambio dati. Sfruttandole non si è più costretti a dover definire una variabile come public in un task e quindi come extern in un altro task che la utilizza.
Segnalibri
Argomenti correlati
Istruzioni gestione variabili globali |
Creazione variabili globali
Creazione tramite file XML
La creazione di queste variabili viene fatta, tipicamente, leggendo i file di configurazione presenti nella directory /GV/.
Il file, in formato XML, contiene:
•Nome della variabile
•Descrizione testuale del tipo di variabile
•Dimensione della variabile in byte
•Attributi della variabile
•Rappresentazione dell'area dati (questa può essere omessa)
I nomi dei file seguono la seguente struttura: GV_nomedellavariabile_dimensione.CFG
Esempio
File XML "GV_globalVar1_4.CFG": <?xml version="1.0" encoding="utf-8"?> <!-- Global Variable updated on date(ymd)/time(hms) 2019/03/14 08:25:20 --> <globalVariables version="1"> <globalVariable persistent="true" size="4" dataInFile="true" onlyOneWrite="false"> <fullName>globalVar1</fullName> <dataType>U32</dataType> <wp></wp> <hexasciiData>73000000</hexasciiData> <crc>695D</crc> </globalVariable> </globalVariables> |
Dopo la generazione delle GV da file, quelle di tipo persistente sono collegate alla componente ritentiva.
All'accensione, per le GV persistenti, si procede all'aggiornamento dei dati nel file di configurazione utilizzando i valori letti in memoria ritentiva, se presenti.
Creazione tramite istruzione GV_CREATE
È possibile creare le GV da istruzione (GV_CREATE) specificando:
•Il nome (chiave di riferimento per successivi collegamenti)
•Informazione testuale del tipo di area dati (es "U32" o "Struct PUNTO" ...)
•Informazione della dimensione dell'area dati
•Eventuale password per abilitare l'accesso in scrittura
•Attributi (persistente, opzione per creare il file di definizione, opzione per memorizzazione dei dati nel file, ...)
•Eventuali dati per inizializzare la variabile
La creazione delle GV è possibile solo se non ne esiste già una con lo stesso nome (che viene utilizzato come chiave).
Creando una variabile da istruzione, il file di configurazione della variabile viene creato automaticamente.
NOTA: I nomi delle GV sono gestiti come case insensitive, pertanto "pippo" e "Pippo" definiscono il nome della medesima GV.
Collegamento alle variabili globali
Il collegamento delle aree di memoria (istruzione GV_LINK) delle GV avviene mediante il nome e la dimensione (che devono coincidere con le GV definite) e una copia locale della stessa.
La funzione di collegamento rende un riferimento all'interfaccia di connessione tra la copia locale e quella globale della variabile.
Tutte le operazioni sulle GV avvengono utilizzando il solo riferimento all'interfaccia.
È possibile aver più interfacce verso la stessa GV in task o contesti diversi.
NOTA: Ogni ambito omogeneo di lavoro (task, rule od OB) deve avere la propria copia locale connessa con la propria interfaccia. È da considerarsi un errore usare la stessa interfaccia in contesti di task diversi (es. RULE e TASK) o più interfacce che utilizzano la stessa area dati locale.
Accesso alle variabili globali
L'accesso alle GV avviene in modo indiretto tramite funzioni (GV_READ, GV_WRITE...).
Mediante funzioni è possibile quindi aggiornare i dati da area locale a quella globale e viceversa. Queste operazioni sono, ovviamente, gestite con semafori in modo da garantire che l'operazione (in ambo le direzioni) sia consistente (o atomica).
È inoltre possibile imporre una restrizione all'accesso a ogni singola GV in modo che solo l'interfaccia che ha preso i diritti su essa possa accedervi.
NOTA: Attualmente non sono gestiti l'annidamento della presa/rilascio diritti di accesso sulla stessa interfaccia.
In caso che sia presente una password di scrittura solo i link che forniscono la corretta password possono avere accesso in scrittura.
È inoltre possibile specificare che solo il primo che si connette alla variabile con la corretta password ha diritto di scrittura.
È possibile anche aggiornare solo una parte della variabile con l'apposita istruzione.
GV persistenti
Per poter gestire le GV persistenti è indispensabile aver impostato l'area di memoria ritentiva preposta alle GV nella configurazione del progetto (Versioni RDE superiori alla versione 3.51.1).
Quando si crea una GV con l'attributo persistente si crea anche la componente in memoria ritentiva. La creazione è abortita se non c'é memoria a disposizione almeno pari alla dimensione della nuova GV sommata alla dimensione massima tra le GV presenti in memoria ritentiva. L'accesso all'area delle GV persistenti è gestita tramite un semaforo. Una sola GV persistente può essere aggiornata alla volta.
L'aggiornamento in area ritentiva avviene quando si effettua la copia dei dati da area locale ad area globale.
Dato che l'operazione di copia non è istantanea, qualora il controllo venisse spento durante tale operazione, è garantito che i dati ritentivi non sono persi, ovviamente saranno validi gli ultimi scritti completamente e non quelli in fase di aggiornamento.
Se invece la GV di tipo persistente non è già presente in area ritentiva ne viene creata una inizializzata con i valori presenti nel file.
È possibile che in memoria ritentiva ci siano delle variabili globali non connesse ad alcuna variabile globale definita. In tal caso rimangono in memoria ritentiva senza essere utilizzabili fino a che non si riusi il file descrittore o si ricrei la variabile con lo stesso nome e la stessa dimensione.
Direttive GV
Elenca tutte le variabili globali e i loro attributi |
|
Forza la cancellazione dell'area di variabili persistenti |
Allarmi GV