Cerca nel sito per parola chiave

rapporti - Deliverable

4.3.2-Sistema di supervisione della test-facility: sviluppo software

rapporti - Deliverable

4.3.2-Sistema di supervisione della test-facility: sviluppo software

Recently updated on Aprile 7th, 2021 at 01:25 pm

Questo rapporto contiene la descrizione del software sviluppato per il sistema di controllo di cui al precedente documento CESI A4500492 del 31/03/2004 (“Sistema di supervisione della test-facility: specifica del sistema”). In particolare si fa riferimento al sistema periferico d’acquisizione e controllo locale (ACL) dedicato alla supervisione operativa del quadro di bassa tensione, che consente la configurazione dell’impianto in questione, ed all’Unità centrale di Raccolta dati e d’Archiviazione (URA), che provvede alla raccolta ed all’archiviazione dei dati dai vari ACL adeguandosi alle possibilità offerte dai diversi costruttori. Entrambi le implementazioni sono state effettuate, su piattaforma Linux, utilizzando il C ed il linguaggio Java 1 , potendo così porre una particolare attenzione alla loro portabilità. La loro struttura presenta notevoli analogie poiché basata su di un insieme di programmi, accoppiati tramite un’area di memoria condivisa, funzionalmente molto simili. Si trovano in ambo i sistemi, infatti, un programma per il caricamento iniziale dell’area di memoria condivisa, una serie di programmi per la scansione dei sottosistemi esterni, singoli strumenti o front-end complessi, un server per mettere a disposizione i dati con il protocollo UDP/IP, alcuni programmi d’utilità ed ultime, ma non per importanza, le pagine HTML 2 con applet 3 Java per l’HMI 4 e l’archiviazione dei dati. Assolutamente comune, inoltre, la libreria di sottoprogrammi per l’interazione con il server di cui sopra. Nei capitoli seguenti i sistemi saranno descritti partendo dalla struttura dettagliata dell’area di memoria condivisa. Seguirà, per ciascuno dei programmi, l’elencazione delle parole chiave da questo utilizzate nel file di configurazione ed una sommaria descrizione del suo funzionamento. 1 GENERALITÀ Nella progettazione del sistema non si era ritenuto necessario ricorrere a metodi di sincronizzazione particolarmente stringenti tra i vari programmi concorrenti. Questo, poiché la natura stessa dei vari sottosistemi con cui ci si trova ad interagire rende molto aleatorio il tempo di reazione che ci si può attendere. Non si dimentichi, infatti, che in svariati casi ci si trova di fronte ad apparati che presentano un HTTP 5 server come interfaccia, con tutte le incertezze nei tempi di risposta che questo protocollo comporta. 1 un marchio registrato di Sun Microsystems Inc, 2 acronimo di HyperText Markup Language: è un semplice linguaggio di etichette progettato per specificare l’organizzazione logica di un documento con importanti estensioni ipertestuali nell’ottica dell’indipendenza della piattaforma su cui questo venga visualizzato 3 programma, solitamente piccolo, in linguaggio Java, incorporato in una pagina HTML ed eseguito dal browser dell’elaboratore client. 4 Human Machine Interface 5 acronimo di Hypertext Transfer Protocol: ( copyright © 1996-2003 di W3C ® ), è il protocollo per interagire con ipertesti su Web

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 4/36 Si è quindi preferita una soluzione in cui i vari programmi d’acquisizione scandiscono il campo, sia questo rappresentato da strumentazione ad hoc o da sottosistemi di controllo di apparati specifici, con una periodicità tipica, diversa caso per caso. Si va quindi dai 100 ms per l’acquisizione degli ingressi digitali, al mezzo secondo per le grandezze AC fino ai 5 s per l’interrogazione di un HTP server. Tutti questi programmi ciclici utilizzano l’area di memoria condivisa per ricavarne i parametri di scansione e per memorizzarvi il risultato della stessa. Sempre in quest’area, inoltre, sono previste opportune variabili che ne condizionino l’esecuzione e ne permettano il controllo della regolarità. Il programma server invece è normalmente in attesa su di una porta UDP 6 (normalmente la 7777) di richieste dalla rete, da parte di clienti remoti, o dell’HTTP server, via localhost, per l’HMI. Tali richieste pervengono come messaggi di testo aventi il formato di un file XML 7 e, una volta servite con risposte aderenti allo stesso protocollo, il programma si rimette immediatamente in ascolto sulla porta. Il linguaggio XML è stato inoltre adottato per tutti i file di dati e di configurazione presenti nei sistemi. Due di questi, setup.qbt.xml e setup.ura.xml, sono particolarmente importanti in quanto contengono, per il front-end del quadro BT e per il sistema di archiviazione rispettivamente, la traduzione dalle parole chiave utilizzate dai vari programmi nei contenuti tipici di un particolare assetto del sistema. In particolare ciascun programma può trovarvi dove leggere i dati circa i punti da scandire, il numero delle schede d’acquisizione collegate, il timeout da considerare come limite per la risposta di un periferico “intelligente” e quant’altro. Ciò avviene banalmente ricavando il contenuto d’elementi del linguaggio XML aventi com’etichetta, o tag, la parola chiave desiderata. Nella implementazione corrente di questi file, la parola chiave può trovarsi o direttamente come etichetta di un elemento figlio dell’elemento principale, <qbt> ed <ura> rispettivamente, o più annidata in una cascata di elementi figlio. Nei capitoli seguenti per ogni programma sarà fornita, oltre ad una sommaria descrizione, l’elencazione dettagliata delle varie possibilità di parametrizzazione ottenibile con questo sistema di setup così da consentire l’adattamento del funzionamento alle varie necessità operative e configurazioni. I parametri opzionali sono riportati su sfondo bianco mentre quelli obbligatori su sfondo grigio. A titolo d’esempio, in Appendice A, si riporta una versione intermadia dei due file in oggetto. 2 QBT: SISTEMA DI CONTROLLO DEL QUADRO BT Il software per il sistema di controllo del quadro di bassa tensione consiste, principalmente, in un’area di memoria condivisa (qbtArera 2.1) utilizzata da una serie di programmi per lo scambio dati e per condizionare la propria esecuzione. Quest’area, per sua natura volatile, è creata ed inizializzata da un apposito programma (msload 2.2) e viene aggiornata ciclicamente dai programmi di scansione delle periferiche di acquisizione delle grandezze in AC (ssimeas 2.4) e del sottosistema di I/O digitale (dingus 2.3). Il contenuto dell’area è messo a disposizione dei programmi di HMI e d’eventuali codici di calcolo esterni tramite un server su UDP /IP (risqbt 2.7). È a questo server che si connettono gli applet in linguaggio Java contenuti in una serie di pagine HTML per animarne il contenuto con i valori dei punti di impianto. Il tutto avviene quando un browser procede dalla rete alla loro visualizzazione, richiedendole al Webserver Tomcat 8 , attivo su questo sistema Un apposito programma (rilbanc 2.8) provvede, su eventuale richiesta dell’operatore, a rilasciare correttamente l’area condivisa dopo aver determinato la fine dell’esecuzione dei programmi di scansione e del server. 6 acronimo di User Datagram Protocol: protocollo di trasporto su Internet (IP) che, a differenza di TCP, risulta connectionless cioè senza particolare sincronizzazione tra chi invia e chi riceve. 7 acronimo di eXtensible Markup Language, un copyright © 1996-2003 di W3C ® 8 Tomcat è un copyright © 2000 di The Apache Software Foundation

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 5/36 Per la predisposizione e la diagnostica impiantistica del sistema sono previsti due programmi, uno per prefissare il contenuto di grandezze che in fase di commissioning non fossero momentaneamente disponibili (px 2.6), un altro per visualizzare lo stato di una qualunque grandezza del sistema (pv 2.5). 2.1 qbtArea : l’area di memoria condivisa Baricentro del sistema è l’area di memoria condivisa. Vi si possono individuare, in linea di massima, tre distinte parti: 1. le variabili per determinare e condizionare l’esecuzione dei programmi di scansione 2. l’immagine on line delle grandezze organizzate su strutture aderenti all’organizzazione delle periferiche di I/O cui queste fanno riferimento 3. l’elenco punti dove tutte le grandezza note del sistema sono definite e caratterizzate dalla loro descrizione, dall’unità di misura e da quant’altro possa servire per la loro acquisizione e la corretta gestione Questa struttura è assai stabile nel tempo poiché dipendente dalla configurazione hardware del sistema, modificabile solo a seguito di cablaggi non indifferenti. Pertanto si è deciso di ricorrere ad una banale parametrizzazione con le definizioni per il preprocessore C, qui a seguito elencate. #define NOMEaREA "qbtArea" #define NOMmAX 256 // Numero massimo di punti previsti nel sistema #define NtASK 5 // Numero massimo programmi ciclici di scansione #define NOaDAMiN 3 // Numero moduli d’ingressi digitali #define NOiNmOD 16 // Numero ingressi digitali per modulo #define NOaDAMoU 7 // Numero moduli d’uscite digitali #define NOoUmOD 4 // Numero d’uscite digitali per modulo #define NOsIMEAS 6 // Numero moduli acquisizione misure AC #define NOmACmOD 43 // Numero di misure AC per modulo #define NOgCA 32 // Numero massimo calcolate a valore reale #define NOgCD 32 // Numero massimo calcolate a valore intero #define NOgTT 16 // Numero massimo delle grandezze di testo #define NOcHgTT 32 // Lunghezza in caratteri delle grandezze di testo L’elenco punti è costituito da un vettore d’elementi del tipo a seguito descritto (le dimensioni di alcune variabili sono quelle definite in Tabella 1 del capitolo 4). struct punto { Char sigla[LUsIGLA], // Sigle dei punti descrizione[LUdESC], // Descrizione del punto in italiano description[LUdESC], // Descrizione del punto in inglese unita[LUuNIT], // Unita’ di misura tipo, // Tipi di punto modulo, // Numero del modulo di I/O canale; }; // Posizione della grandezza nel modulo

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 6/36 Chiaramente questa struttura non esaurisce la ricchezza di possibilità offerta dallo schema XML cui si è fatto riferimento nella specifica del sistema, ma rappresenta in ogni caso una caratterizzazione più che sufficiente per l’applicazione sperimentale. struct tDI { // Struttura degli ingressi digitali char v, // Valore dell’ingresso digitale a, // Attendibilita’ dell’ingresso digitale p; }; // Flag di prefissazione dell’ingresso digitale struct tDO { // Struttura delle uscite digitali char v, // Valore dell’uscita digitale e, // Modalita’ di attuazione dell’uscita digitale o, // Tempo di isteresi dell’uscita digitale p; }; // Flag di prefissazione dell’uscita digitale struct tAI { // Struttura delle misure AC float v, // Valore della misura AC s; // Soglia sulla misura AC Char a, // Attendibilita’ della misura AC p; }; // Flag di prefissazione della misura AC struct tAC { // Struttura per le grandezze calcolate a valore reale float v; // Valore calcolato Char a, // Attendibilita’ valore calcolato p; }; // Flag di prefissazione del valore calcolato struct tDC { // Struttura per le grandezze calcolate a valore intero char v, // Valore calcolato a, // Attendibilita’ valore calcolato p; }; // Flag di prefissazione del valore calcolato struct tTT { // Struttura delle grandezze testo char t[NOcHgTT], // Messaggio di testo a, // Attendibilita’ del messaggio di testo p; }; // Flag di prefissazione del messaggio di testo Le strutture precedenti rappresentano le variabili di I/O nel formato più vicino a come sono acquisite od emesse o calcolate dai programmi di scansione. Questo al fine di minimizzarne i tempi d’elaborazione. Sempre per questo motivo, i vettori che costituiscono le locazioni dove fisicamente i programmi suddetti scaricano o prelevano i dati hanno una struttura analoga alle morsettiere della periferia di I/O. Completando il tutto con un vettore per condizionare l’esecuzione dei programmi di scansione, un vettore per raccoglierne lo stato ed una variabile per contenere il numero di punti effettivamente definiti nel sistema, si ottiene per l’area di memoria condivisa la seguente struttura (sono evidenti le tre zone come precedentemente elencate).

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 7/36 struct qbtShare { // Area di memoria condivisa tra i programmi int stati[NtASK], // Abilitazioni programmi ciclici di scansione esiti[NtASK], // Segnalazioni da programmi ciclici di scansione nPunti; // Numero di punti presenti nel sistema struct tDI sDI[NOaDAMiN][NOiNmOD]; // Buffer ingressi digitali struct tDO sDO[NOaDAMoU][NOoUmOD]; // Buffer uscite digitali struct tAI sAI[NOsIMEAS][NOmACmOD]; // Buffer misure AC struct tAC sCA[NOgCA]; // Buffer grandezze calcolate a valore reale struct tDC sCD[NOgCD]; // Buffer grandezze calcolate a valore intero struct tTT sTT[NOgTT]; // Buffer messaggi di testo struct punto p[NOMmAX]; }; 2.2 msload : caricamento iniziale dell’area di memoria condivisa Questo programma esegue per primo all’attivazione del sistema. Creata l’area di memoria condivisa provvede ad inizializzarla mediante il parsing del file XML che contiene l’elenco dei punti definiti. Qualunque problema riscontrato durante quest’operazione, così come il suo buon esito, sono memorizzati in un opportuno file di log. Le parole chiave utilizzate per la ricerca all’interno del file di configurazione sono: Tag Significato filePunti nome completo del file XML contenente l’elenco punti msloadLog nome completo del file dove memorizzare errori eventuali ed esito 2.3 dingus : I/O digitale Per l’I/O digitale si è ritenuto di implementare un unico programma di scansione, in maniera da mantenere rigorosamente sincrona l’acquisizione degli ingressi e l’emissione di un comando eventualmente generato da una combinazione di questi. Le periferiche di processo sono connesse su di un bus seriale RS485 e consistono in dodici moduli, quattro da 16 ingressi digitali ed in otto moduli da quattro uscite digitali, della serie Adam 4000 di Advantech. La scansione avviene in polling utilizzando il loro protocollo nativo i . Il programma dingus, infatti, elabora con un periodo di 0.5 s effettuando, ad ogni ciclo, cinque successivi passi intervallati da 0.1 s:

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 8/36 t+0.0 acquisizione del primo insieme di posizioni dei contatti di ingresso t+0.1 acquisizione del secondo insieme di posizioni dei contatti di ingresso t+0.2 acquisizione del terzo insieme di posizioni dei contatti di ingresso, t+0.3 eliminazione di eventuali incongruenze temporanee ed esecuzione dei calcoli di scansione t+0.4 emissione dei comandi La funzione logica implementata, per evitare situazioni incongrue tra contatti relativi allo stato di uno stesso organo (per esempio i contatti di CHIUSO ed APERTO relativi al medesimo INTERRUTTORE) qualora siano letti proprio durante una commutazione, è rappresentata nella sottostante figura. t+0.0 t+0.1 t+0.2 risultato 000 0 001 0 010 0 011 1 100 0 101 1 110 1 111 1 Immediatamente a seguito di quest’elaborazione si effettuano i calcoli di scansione, o “calcoli semplici”, vale a dire banali operazioni logiche – algebriche sugli ingressi appena acquisiti. Anche in questo caso, a titolo di esempio, prendiamo in considerazione la creazione dello stato di POSIZIONE INTERRUTTORE [APERTO/CHIUSO] ed ATTENDIBILITÀ INTERRUTTORE [SI/NO] a partire dai contatti di INTERRUTTORE APERTO [SI/NO] ed INTERRUTORE CHIUSO [SI/NO] effettuata con la sottostante tavola di decisione. INTERRUTTORE CHIUSO NO 0NO0SI1SI1 INTERRUTTORE APERTO NO 0SI1NO0SI1 POSIZIONE INTERRUTTORE APERTO 0 CHIUSO 1 ATTENDIBILITÀ INTERRUTTORE NO 0 SI 1 SI 1 NO 0 Per effettuare questi calcoli, che possono trovare contribuenti anche in altre grandezze presenti nell’area di memoria condivisa se pur non generate direttamente da questo programma, è stata implementata un’apposita libreria che consentisse l’accesso alle grandezze in maniera simbolica, in pratica specificandone semplicemente la sigla (mesh 5). Qualunque problema riscontrato durante quest’operazione, così come il suo buon esito della stessa, sono memorizzate in un opportuno file di log. Il programma, prima di terminare l’esecuzione, provvede ad aprire tutti i contatti sulle uscite digitali. Le tag degli elementi rilevanti per dingus all’interno del file di configurazione sono:

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 9/36 Tag SubTag Contenuto dingusLog nome completo del file dove memorizzare errori eventuali ed esito porta nome del driver seriale cui sono connessi i moduli di input (p.e. /dev/ttyS11) timeout massimo ritardo accettabile per la risposta da un modulo di inputAdamInput moduli elenco degli indirizzi, sul bus RS485, dei moduli di input presenti, terminati da ; porta nome del driver seriale cui sono connessi i moduli di output (p.e. /dev/ttyS12) timeout massimo ritardo accettabile per la risposta da un modulo di outputAdamOutput moduli elenco degli indirizzi, sul bus RS485 dei moduli di output presenti, terminati da ; 2.4 ssimeas : acquisizione delle misure in AC Le misure in corrente alternata sono acquisite da alcuni convertitori Simeas T della Siemens, ciascuno interfacciato con linea seriale RS232 dedicata. Ogni strumento è connesso alle tre fasi ed al neutro di una linea AC ed a tre bobine TA, una per ogni fase della medesima linea. Grazie a questo schema di connessione le grandezze elettriche che è possibile misurare su ciascuna linea sono 43. Nella tabella seguente sono elencate quelle più indicative, per le quali è effettuata la conversione in unità ingegneristiche. Indice Sigla Descrizione Unità Range 0 V1 tensione fase 1-N V 180÷280 1 V2 tensione fase 2-N V 180÷280 2 V3 tensione fase 3-N V 180÷280 3 VC12 tensione concatenata 1-2 V 320÷480 4 VEN Sbilanciamento fasi V 320÷480 7 I1 corrente fase 1 A 0÷300 8 I2 corrente fase 2 A 0÷300 9 I3 corrente fase 3 A 0÷300 10 I0 corrente neutro A 0÷300 11 f frequenza Hz 49.8÷50.2 12 ph sfasamento grad -180÷180 13 Pt potenza attiva totale kW -250÷250 17 Qt potenza reattiva totale kVAR -250÷250 21 cosfi cosfi p.u. -1÷1 22 cosf1 cosfi fase 1 p.u. -1÷1 23 cosf2 cosfi fase 2 p.u. -1÷1 24 cosf3 cosfi fase 3 p.u. -1÷1 25 At potenza apparente totale kVA -250÷250 26 Eaa energia attiva assorbita kWh 0÷500000 30 Eag energia attiva generata kWh 0÷500000 34 Era energia reattiva assorbita kVARh 0÷500000 38 Erg energia reattiva generata kVARh 0÷500000 42 Evat energia apparente totale kVAh 0÷500000

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 10/36 Il programma una volta determinato dal file l’accoppiamento linea seriale – strumento, determina il baudrate al quale questo sta colloquiando. Fatto ciò può procedere ad impostarlo ai valori più appropriati di baudrate (19200 baud), di frequenza (50 Hz) e di campo di misura (0÷450 V, 0÷10 A). Terminata questa operazione su tutti gli strumenti collegati ed attivi, od almeno risultanti tali dal file di setup, il programma inizia il ciclo di scansione con un passo di 0.5 s. Questo è eseguito lanciando contemporaneamente, o meglio in rapida successione, a tutti gli strumenti la richiesta per il valore corrente delle grandezze da questi misurate o calcolate. Fatto ciò il programma attende il completamento delle risposte processandole, man mano queste sono disponibili, convertendo le grandezze di interesse e memorizzandole nell’area di memoria condivisa. Il tutto utilizzando un protocollo proprietario ii ASCII con controllo di checksum. Qualora uno strumento non rispondesse entro un tempo prefissato, la richiesta di dati gli viene ripresentata per un determinato numero di volte dopo di che questi viene dichiarato “fuori scansione” ed il suo stato annotato nell’area di memoria condivisa. Le tag degli elementi rilevanti per ssimeas all’interno del file di configurazione sono: Tag Contenuto ssimeasLog nome completo del file dove memorizzare errori eventuali ed esito timeoutSimeas massimo ritardo accettabile per la risposta da un modulo Simeas T portaSimeas0 nome del driver seriale preposto al modulo Simeas 0 (p.e. /dev/ttyS5) portaSimeas1 nome del driver seriale preposto al modulo Simeas 1 (p.e. /dev/ttyS6) portaSimeas2 nome del driver seriale preposto al modulo Simeas 2 (p.e. /dev/ttyS7) portaSimeas3 nome del driver seriale preposto al modulo Simeas 3 (p.e. /dev/ttyS8) portaSimeas4 nome del driver seriale preposto al modulo Simeas 4 (p.e. /dev/ttyS9) portaSimeas5 nome del driver seriale preposto al modulo Simeas 5 (p.e. /dev/ttyS10) 2.5 pv : visualizzazione del valore di una misura Questo programma consente di visualizzare lo stato istantaneo di un punto specificandone la sigla. È stato implementato in maniera da poter essere attivato direttamente da linea di comando o da file batch, banalmente specificando la sigla della grandezza che si vuol visualizzare. Vengono visualizzati, su di un’unica riga da sinistra a destra separati da una barra verticale ( | ), o la sigla del punto o il tipo di punto [AI, AO, DI, DO, CA, CD] o la descrizione o l’eventuale indicatore di prefissazione [P] o lo stato del punto [0, 1, D, E, F] come dalla sottostante tabella o il valore del punto Stato normale 0 Valore non attendibile 1 Punto fuori scansione D Valore prefissato E Punto non definito F

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 11/36 L’unica tag di un elemento rilevante per pv all’interno del file di configurazione è: Tag Contenuto lingua lingua in cui si desidera la descrizione (“I” Italiano, “E” Inglese) 2.6 px : appostamento di una misura ad un valore prefissato Questo programma consente di impostare una qualsiasi grandezza ad un valore che non venga modificato da altri programmi fino a che questa prefissazione perduri. È stato implementato in maniera da poter essere attivato direttamente da linea di comando o da file batch, banalmente specificando la sigla della grandezza di cui si vuol fissare il valore seguita dal valore medesimo. Questa prefissazione può essere rimossa ripetendo il medesimo comando con l’avvertenza di omettere il valore. Le tag degli elementi rilevanti per px all’interno del file di configurazione sono: Tag Contenuto pxLog nome completo del file dove memorizzare errori eventuali ed esito lingua lingua in cui si desidera la descrizione (“I” Italiano, “E” Inglese) 2.7 risqbt : server per l’accesso alle variabili del sistema Questo programma funge da server verso l’area di memoria condivisa utilizzando il protocollo DIGECOP iii , vale a dire con messaggi in formato XML su una connessione UDP/IP. Il programma affacciandosi ad una porta verso la rete, è stata usata la 7777 normalmente non utilizzata da altri servizi, è in grado di gestire contemporaneamente un numero illimitato di clienti. Questo può avvenire dopo che il potenziale utente si sia accreditato con uno scambio di credenziali gestito in modo crittografato. Questo consente al sistema di stabilire per ciascun utente i particolari diritti d’accesso alle grandezze del sistema: vi saranno utenti cui è consentita la sola lettura delle variabili, altri che potranno anche modificarne il valore. L’elenco degli utenti abilitati all’accesso al server è contenuto nel file /etc/clienti dove, in formato testo, si susseguono, uno per riga, il nome dell’utente e, separato da uno spazio, il carattere R per la sola lettura e W per la lettura / scrittura. Le potenzialità offerte ai clienti sono: o il richiedere l’elenco dei punti noti al sistema, o il richiedere le caratteristiche di ciascun punto, o il richiedere i valori di un insieme di punti, o l’inviare, per la memorizzazione, i valori di un insieme di punti. La richiesta e l’invio dei valori delle variabili avviene previa dichiarazione dell’insieme delle grandezze cui si vuole accedere. Questa particolare dichiarazione, con due insiemi distinti per la lettura e la scrittura, è registrata per ciascun cliente in modo che questi possa richiedere od inviare ciclicamente i valori senza appesantire la rete con inutili, reiterate elencazioni di sigle.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 12/36 Ciò comporta l’allocazione di una certa quantità di memoria per ciascun cliente che deve quindi essere rilasciata, al termine della connessione, al fine di non provocare l’esaurimento di questa risorsa dopo giorni, potenzialmente mesi, d’elaborazione continua con il conseguente gran numero d’accessi. Si è pertanto introdotto il concetto di ciclicità dell’accesso, in altre parole l’intervallo trascorso il quale il client, presumibilmente, reitererà una richiesta, per esempio per rinfrescare un sinottico o per avere nuovi valori da archiviare. Il programma può così calcolare un tempo che, una volta trascorso senza richieste da parte del client, possa far ritenere quest’ultimo non più attivo e di conseguenza ne consenta il rilascio delle relative risorse. Le tag degli elementi rilevanti per risqbt all’interno del file di configurazione sono: Tag SubTag Contenuto lingua lingua in cui si desidera la descrizione (“I” Italiano, “E” Inglese) risqbtLog nome completo del file dove memorizzare errori eventuali ed esito chiaveOut chiave per crittografare la parte variabile delle credenziali da inviare al cliente risqbt chiaveIn chiave per decrittare le credenziali ricevute dal potenziale cliente 2.8 rilbanc : termine dell’elaborazione del sistema QBT Questo programma provvede a terminare l’elaborazione del sistema provocando la terminazione dei programmi ciclici e del server e rilasciando l’area di memoria condivisa. Il termine dei programmi ciclici è ottenuto impostando le apposite variabili di controllo nell’area di memoria condivisa. Oltre a ciò, affinché il server termini il servizio, è necessario un accesso alla sua porta per distoglierlo dall’attesa ed imporgli di terminare l’elaborazione. Tag SubTag Contenuto rilbancLog nome completo del file dove memorizzare errori eventuali ed esito nodoServer nodo su cui questo è in elaborazione utente utente abilitato allo shutdown del serverrilbanc programmaServer nome del server UDP da arrestare p.e. risqbt come nella tag seguente chiaveOut chiave per decrittare parte variabile credenziali ricevuta dal server risqbt chiaveIn chiave per crittografare le credenziali da inviare al server

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 13/36 3 URA: SISTEMA DI RACCOLTA DATI ED ARCHIVIAZIONE Il software per il sistema di raccolta centralizzata dei dati ed archiviazione consiste, principalmente, in un’area di memoria condivisa (uraArera 3.1) utilizzata da una serie di programmi per lo scambio dei dati e per condizionare la propria esecuzione. Quest’area, per sua natura volatile, è creata ed inizializzata da un apposito programma (msload 3.2) e viene aggiornata ciclicamente dai programmi di scansione dei front end dei vari apparati della test facility (quadro 3.3) (fotovoltaico 3.4) (microturbina 0) (stirling 3.6). Il contenuto dell’area è messo a disposizione dei programmi di HMI, di archiviazione e d’eventuali codici di calcolo esterni tramite un server su UDP /IP (risura 3.7). È a questo server che si connettono gli applet in linguaggio Java contenuti in una serie di pagine HTML (3.9) per animarne il contenuto con i valori dei punti d’impianto. Il tutto avviene quando un browser procede dalla rete alla loro visualizzazione, richiedendole al Webserver Tomcat, attivo su questo sistema. Sempre a cura di un opportuno codice Java avviene la richiesta ciclica dei valori delle variabili e la loro archiviazione (3.10). Un apposito programma (rilbanc 3.8) provvede, su richiesta dell’operatore, a rilasciare correttamente l’area condivisa dopo aver determinato la fine dell’esecuzione dei programmi di scansione e del server. Analogamente a quanto già precedentemente descritto, per la predisposizione e la diagnostica impiantistica del sistema sono previsti due programmi, uno per prefissare il contenuto di grandezze che in fase di commissioning non fossero momentaneamente disponibili (px 2.6), un altro per visualizzare lo stato di una qualunque grandezza del sistema (pv 2.5). 3.1 uraArea : l’area di memoria condivisa Baricentro del sistema è l’area di memoria condivisa. Vi si possono individuare, in linea di massima, tre distinte parti: 1. le variabili per determinare e condizionare l’esecuzione dei programmi di scansione 2. l’immagine on line delle grandezze organizzate su strutture che ne facilitino l’allocazione dinamica 3. l’elenco punti dove tutte le grandezza note del sistema sono definite e caratterizzate dalla loro descrizione, dall’unità di misura e da quant’altro possa servire per la loro acquisizione e la corretta gestione Questa struttura è allocata dinamicamente, ad ogni esecuzione a cura del programma msload (3.2), in modo da tener conto in maniera automatica di eventuali aggiunte od eliminazioni nei file di definizione dei punti provenienti dai vari sottosistemi di front end. Minimo è pertanto il contenuto di parametri, come risulta dalla seguente tabella. #define NOMEaREA "uraArea" #define NtASK 5 // Numero massimo programmi ciclici di scansione L’elenco punti, assai simile a quanto precedentemente descritto (2.1), ha la struttura riportata nella tabella seguente.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 14/36 struct punto { Char sigla[LUsIGLA], // Sigle dei punti descrizione[LUdESC], // Descrizione del punto in italiano description[LUdESC], // Descrizione del punto in inglese unita[LUuNIT], // Unita’ di misura tipo, // Tipi di punto indice, // Posizione nel vettore dimensione; }; // Dimensione per grandezze vettoriali In questa struttura si è eliminato il riferimento a moduli e morsettiere preferendo astrarre l’allocazione delle variabili in generici vettori di punti, a valore scalare o vettoriale, introducendo quindi, per ogni grandezza, oltre al puntatore (o indice), il numero d’unità d’allocazione occupate (o dimensione). Le strutture delle singole variabili invece non differiscono in maniera sensibile da quanto precedentemente descritto (2.1) e sono quindi riportate, a seguito, quasi esclusivamente per completezza. struct tDI { // Struttura degli ingressi digitali char v, // Valore dell’ingresso digitale a, // Attendibilita’ dell’ingresso digitale P, // Flag di prefissazione dell’ingresso digitale d; }; // Libero per appostamento alla cella di memoria struct tDO { // Struttura delle uscite digitali char v, // Valore dell’uscita digitale e, // Modalita’ di attuazione dell’uscita digitale o, // Tempo di isteresi dell’uscita digitale p; }; // Flag di prefissazione dell’uscita digitale struct tAI { // Struttura delle misure AC float v, // Valore della misura AC s; // Soglia sulla misura AC char a, // Attendibilita’ della misura AC p; }; // Flag di prefissazione della misura AC struct tCA { // Struttura per le grandezze calcolate a valore reale float v; // Valore calcolato char a, // Attendibilita’ valore calcolato p; }; // Flag di prefissazione del valore calcolato struct tCD { // Struttura per le grandezze calcolate a valore intero char v, // Valore calcolato a, // Attendibilita’ valore calcolato p; }; // Flag di prefissazione del valore calcolato struct tTT { // Struttura delle grandezze testo char t[NOcHgTT], // Messaggio di testo a, // Attendibilita’ del messaggio di testo p; }; // Flag di prefissazione del messaggio di testo

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 15/36 Abbandonato quindi ogni riferimento ad una specifica configurazione dell’hardware, l’area di memoria condivisa presenta sempre tre aree distinte, separate da linee tratteggiate nella tabella seguente. Una prima zona contiene il vettore per condizionare l’esecuzione dei programmi di scansione e quello per raccoglierne lo stato. Segue la zona di variabili necessarie per indirizzare le singole grandezze nella metafora vettoriale cui si è fatto precedentemente riferimento, costituita in pratica dalle lunghezze dei vettori delle singole tipologie di grandezze e dai vettori di puntatori alle specifiche unità d’allocazione. Infine una struttura (definita come union) costituisce l’area effettiva di memorizzazione delle variabili. struct uraShare { // Struttura della banca dati di scambio tra task Int stati[NtASK], // Abilitazioni task scansione esiti[NtASK],// Segnalazioni da task scansione nDI, // Numero degli ingressi digitali presenti nDO, // Numero delle uscite digitali presenti NAI, // Numero degli ingressi analogici presenti nCD, // Numero delle grandezze calcolate a valore intero presenti nCA, // Numero delle grandezze calcolate a valore reale presenti nTT, // Numero delle grandezze a valore di testo presenti nPunti; // Numero totale di punti presenti nel sistema struct tDI *sDI; // Buffer ingressi digitali struct tDO *sDO; // Buffer uscite digitali struct tAI *sAI; // Buffer misure AC struct tCD *sCD; // Buffer richieste operatore struct tCA *sCA; // Buffer grandezze calcolate struct tTT *sTT; // Buffer messaggi di testo struct punto *p; union { struct tDI iDI[0]; struct tDO iDO[0]; struct tAI iAI[0]; struct tCD iCD[0]; struct tCA iCA[0]; struct tTT iTT[0]; struct punto ipunto[0]; } i; };

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 16/36 3.2 msload : caricamento iniziale dell’area di memoria condivisa Questo programma è attivato per primo ricevendo come parametri, sulla linea di comando, i prefissi delle sigle dei punti dei sottosistemi che si desidera acquisire (Qu per il quadro bassa tensione, Mt per la microturbina, St per il Dish Stirling, Si per il campo foto-voltaico, ecc). È così in grado di calcolare la quantità di memoria necessaria per l’area condivisa che, una volta allocata, procura caricare. Questo avviene con il parsing dei vari file XML, ciascuno contenente i punti definiti per il particolare sottosistema, i cui nomi sono composti utilizzando i prefissi di cui sopra. La dimensione dell’area di memoria condivisa è memorizzata nel file di setup rimanendo così a disposizione degli altri programmi, al momento in cui questi debbono condividerla. Qualunque anomalia riscontrata durante quest’operazione, così come la riuscita della stessa, è memorizzata in un opportuno file di log. Le parole chiave utilizzate per la ricerca all’interno del file di configurazione sono: Tag Significato filePunti nome del file descrittivo di ciascun sottosistema (p.e. punti in punti.Qu.xml) areaShared elemento dove memorizzare la dimensione dell’area di memoria condivisa msloadLog nome completo del file dove memorizzare errori eventuali ed esito 3.3 quadro : interazione con il sistema di controllo del quadro BT Questo programma, una volta determinato l’elenco dei punti definiti nel sottosistema di controllo del quadro BT, selezionati opportunamente dal loro prefisso nell’elenco punti dell’area di memoria condivisa, procede a dichiararli in lettura al server UDP del sistema di controllo suddetto (2.7) utilizzando le opportune chiamate della libreria g21rete (4). Il passo successivo è il dichiararli in scrittura verso l’area di memoria condivisa con l’apposita chiamata alla libreria g21mesh (5). Il programma può così avviare la richiesta ciclica dei valori delle variabili al server remoto ed alla loro successiva memorizzazione nell’area di memoria condivisa. Le tag degli elementi rilevanti per quadro all’interno del file di configurazione sono: Tag SubTag Significato quadroLog nome completo del file dove memorizzare errori eventuali ed esito server nome dell’elaboratore di controllo del quadro BT porta porta cui è affacciato il server UDP del quadro BT ciclo ciclicità con cui si intende richiedere i dati al server del quadro BT timeout massima attesa ammessa per ricevere i dati dal server del quadro BT chiaveIn chiave per decrittare la parte variabile delle credenziali ricevute dal server chiaveOut chiave per crittografare le credenziali da inviare al server quadro utente nome dell’utente con coi accreditarsi al server del quadro BT

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 17/36 3.4 fotovoltaico : acquisizione dal campo foto-voltaico Questo programma provvede ad acquisire una pagina da un HTTP server, nel caso quello presente nel sistema di controllo del campo foto-voltaico, la decodifica estraendone i valori delle variabili contenute e memorizza i valori così ricavati nell’area di memoria condivisa. Il programma prevede l’eventuale passaggio attraverso un proxy server così come la richiesta di credenziali da parte del server di destinazione. Queste possibilità sono configurabili fornendo gli opportuni parametri nel file di setup, che prevede pertanto i seguenti elementi. Tag SubTag Contenuto fotovoltaicoLog nome completo del file dove memorizzare errori eventuali ed esito paginaDati URL della pagina HTML contenente i valori desiderati utenteServer nome utente dell’HTTP server passwordServer password per l’HTTP server proxy nome utente per il proxy server passwordProxy password per il proxy server ciclo periodo con cui reiterare la richiesta della pagina all’HTTP server fotovoltaico timeout massima attesa ammessa per ricevere la pagina dall’HTTP server 3.5 microturbina : interazione con il sistema di controllo della microturbina Questo programma opera in maniera simile al precedente dedicandosi al sistema di controllo della microturbina presente nella test facility. Di conseguenza i parametri che questi prevede nel file di setup sono elencati nella sottostante tabella. Tag SubTag Contenuto microturbinaLog nome completo del file dove memorizzare errori ed esito paginaDati URL della pagina HTML contenente i valori desiderati utenteServer nome utente dell’HTTP server passwordServer password per l’HTTP server proxy nome utente per il proxy server passwordProxy password per il proxy server ciclo periodo con richiedere la pagina all’HTTP server microturbina timeout massima attesa per ricevere la pagina dall’HTTP server 3.6 stirling : acquisizione dal generatore Stirling In maniera del tutto analoga ai due precedenti si comporta il programma di acquisizione delle variabili dal sistema di monitoraggio del generatore Stirling. La tabella seguente riassume le possibilità di configurazione offerte a tal proposito dal file di setup.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 18/36 Tag SubTag Contenuto stirlingLog nome completo del file dove memorizzare errori eventuali ed esito paginaDati URL della pagina HTML contenente i valori desiderati utenteServer nome utente dell’HTTP server passwordServer password per l’HTTP server proxy nome utente per il proxy server passwordProxy password per il proxy server ciclo periodo con cui reiterare la richiesta della pagina all’HTTP server stirling timeout massima attesa ammessa per ricevere la pagina dall’HTTP server 3.7 risura : server per l’accesso alle variabili del sistema Ha un’implementazione del tutto analoga al programma risqbt, descritto nel precedente paragrafo 2.7 Le tag degli elementi rilevanti per risura all’interno del file di configurazione sono: Tag SubTag Contenuto lingua lingua in cui si desidera la descrizione (“I” Italiano, “E” Inglese) risuraLog nome completo del file dove memorizzare errori eventuali ed esito chiaveOut chiave per crittografare la parte variabile delle credenziali da inviare al cliente risura chiaveIn chiave per decrittare le credenziali ricevute dal potenziale cliente 3.8 rilbanc : termine dell’elaborazione del sistema URA Questo programma provvede a terminare l’elaborazione del sistema provocando la terminazione dei programmi ciclici e del server e rilasciando l’area di memoria condivisa. Il termine dei programmi ciclici è ottenuto impostando le apposite variabili di controllo nell’area di memoria condivisa. Oltre a ciò, affinché il server termini il servizio, è necessario un accesso alla sua porta per distoglierlo dall’attesa ed imporgli di terminare l’elaborazione. Tag SubTag Contenuto rilbancLog nome completo del file dove memorizzare errori eventuali ed esito utente utente abilitato allo shutdown del server rilbanc programmaServer nome del server UDP da arrestare p.e. risura come nella tag seguente chiaveOut chiave per decrittare parte variabile credenziali ricevuta dal server risura chiaveIn chiave per crittografare le credenziali da inviare al server

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 19/36 3.9 Le pagine di HMI Le pagine visualizzate sono pagine JSP, pagine cioè contenenti informazioni HTML, Java e Java script, costruite in modo dinamico tramite XSLT, partendo da file XML. Viene dunque eseguita una compilazione run-time del codice server che è poi spedito al client (browser remoto) come codice HTML. L’animazione dei dati è fatta in generale tramite applet, che consentono di rinfrescare i dati visualizzati senza bisogno di ricaricare l’intera pagina. In pratica, com’è ormai consuetudine per molte applicazioni web, esiste una connessione HTTP classica ed una connessione nascosta nelle applet Java che consente il rinfrescamento dei soli dati. Il software di visualizzazione è costituito da diversi strati indipendenti l’uno dall’altro, che comunicano tra loro attraverso uno scambio di messaggi definiti. Come conseguenza di ciò è possibile sostituire ogni parte della struttura con una parte analoga che parli lo stesso protocollo: è possibile sostituire le servlet con altre servlet che accedono a strutture di database diverse, oppure è possibile sostituire la parte di presentazione grafica con strumenti d’analogo tipo. Tutto ciò risponde ad esigenze oltre che di portabilità dello strumento, anche di manutenibilità dello stesso. Il sinottico dell’impianto è stato costruito tramite Glg Toolkit (Generic Logic Inc. http://www.genlogic.com/): un software che consente sia la costruzione delle pagine di sinottico, mediante un editor grafico compreso nel toolkit, sia la loro presentazione su pagina web mediante metodi Java richiamati dalle applet. L’interfaccia grafica si presenta con una pagina di login: Dopo aver effettuato l’autenticazione si entra in un menù di scelta nel quale vengono presentati i diversi sottosistemi cui è possibile collegarsi:

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 20/36 Scegliendo uno dei sistemi elencati si accede ad un successivo menù contenente tutti gli elementi che compongono il sottosistema in oggetto.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 21/36 Una particolare attenzione deve essere posta al sinottico generale d’impianto, che è presentato scegliendo nell’apposito menù il sistema “QUADRO BT – Quadro di distribuzione in bassa tensione” e, successivamente, l’elemento “Sinottico per la visualizzazione della Test Facility CESI”. Il sinottico appare nel modo seguente: Tramite l’interfaccia sinottico è possibile navigare all’interno dei diversi sottosistemi così come dal menù testuale. In tal caso è sufficiente “clickare” sull’elemento grafico corrispondente per richiamare i dati ad esso relativi.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 22/36 Viceversa, se si sceglie di procedere utilizzando il menù testuale, scegliendo un sistema diverso dal QUADRO BT ed un elemento all’interno del sistema scelto, appaiono pagine di visualizzazione delle grandezze relative ai singoli impianti. La figura precedente si riferisce alle grandezze acquisite tramite lo strumento Simeas posto sulla SBARRA BT. Il bottone Trend a fianco di ciascuna grandezza consente la sua visualizzazione in un intervallo di tempo antecedente a quello corrente. Se viene effettuata la scelta di più grandezze senza chiudere la pagina di Trend, esse sono visualizzate contemporaneamente fino ad un massimo di sei variabili. Un esempio di pagina di Trend è quella seguente: 3.10 La gestione dell’archiviazione Per quanto riguarda l’archiviazione dei dati si è cercato di trovare un compromesso tra strumenti sufficientemente affidabili ed il fatto che essi fossero open source, con l’obiettivo di realizzare un prodotto che non fosse legato a costose licenze d’utilizzo. Ne è scaturito un sistema basato su tre elementi principali: 1. il Servlet/JSP container Tomcat (Apache Software, http://jakarta.apache.org/tomcat/), che permette di eseguire Servlet e pagine JSP su richiesta dell’utente; nell’applicazione specifica esso è utilizzato in modo a se stante, senza la necessità di cooperare con alcun web server; 2. il DataBase XML eXist (http://exist-db.org/index.html), sviluppato secondo le specifiche W3C (che rappresenta lo standard per quanto riguarda XML) che usa XmlDb e dispone di Xquery per le interrogazione, Xinclude, XmlRpc etc. 3. un Archiviatore, che è un’applicazione Java definita appositamente per fare da ponte tra i sistemi di campo, gestiti a loro volta tramite servlet che si collega al server URA, ed il database XML eXist.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 23/36 Il DB eXist viene utilizzato sia per gestire l’autenticazione degli utenti, comprese le abilitazioni ad essi associate, sia per la memorizzazione delle informazioni relative alle variabili di campo (sigle, valori, attendibilità, etc.). Il DB eXist può essere considerato, secondo le definizioni classiche, come un database gerarchico, in quanto è organizzato in “collection” (collezioni), a loro volta strutturate in sotto-collezioni. Le collection contengono poi file XML nei quali sono memorizzate le informazioni vere e proprie: per loro natura anche i file XML hanno una struttura gerarchica. È bene sottolineare che i dati provenienti dal campo seguono due strade distinte. Essi sono da una parte visualizzati direttamente sull’interfaccia grafica, per una fotografia in tempo reale del sistema, e dall’altra archiviati con l’associazione di un appropriato tag temporale. Le richieste di visualizzazione dei trend storici, effettuabili sempre tramite interfaccia grafica, scatenano un insieme di query al database, che consentono l’individuazione dei dati richiesti e la successiva visualizzazione. Il processo è semplificato dal fatto che vengono impiegati strumenti affini di gestione della grafica tramite file XML ed un database XML, qual è appunto eXist. Si ritiene opportuno dare nel seguito uno stralcio di due tipologie di file di archiviazione.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 24/36 File di descrizione delle grandezze da acquisire <?xml version="1.0" encoding="UTF-8"?> <sigle del="20040708164941464"> <sigla> <nome>Mt.Ap</nome> <t>CA</t> <um>nd</um> <d>Caduta pressione filtro input</d> <origine>Mt</origine> </sigla> <sigla> <nome>Mt.At</nome> <t>CA</t> <um>nd</um> <d>Temperatura aria ingresso</d> <origine>Mt</origine> </sigla> <sigla> <nome>Mt.Eea</nome> <t>CA</t> <um>nd</um> <d>Energia elettrica prodotta</d> <origine>Mt</origine> </sigla> – – – – – – – – – – <sigla> <nome>St.Ws</nome> <t>CA</t> <um>nd</um> <d>Velocita’ del vento</d> <origine>St</origine> </sigla> <sigla> <nome>St.Wti</nome> <t>CA</t> <um>nd</um> <d>Temperatura acqua ingresso</d> <origine>St</origine> </sigla> <sigla> <nome>St.Wto</nome> <t>CA</t> <um>nd</um> <d>Temperatura acqua uscita</d> <origine>St</origine> </sigla> </sigle>

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 25/36 File di descrizione dei dati <?xml version="1.0" encoding="UTF-8"?> <root> <dati dataora="20040708164945129" secAcq="1089298185"> <g n="Mt.Ap" v="0.00" s="1"/> <g n="Mt.At" v="0.00" s="1"/> <g n="Mt.Eea" v="0.00" s="1"/> <g n="Mt.Gp" v="0.00" s="1"/> <g n="Mt.InPo" v="0.00" s="1"/> <g n="Mt.Ns" v="0.00" s="1"/> <g n="Mt.Ot" v="0.00" s="1"/> <g n="Mt.Pt" v="0.00" s="1"/> <g n="Mt.Pti" v="0.00" s="1"/> <g n="Mt.Ptr" v="0.00" s="1"/> <g n="Mt.Rh" v="0.00" s="1"/> <g n="Mt.St" v="0.00" s="1"/> <g n="Mt.cfi" v="0.00" s="1"/> <g n="Mt.cfr" v="0.00" s="1"/> <g n="Qu.Fe01At" v="0.00" s="1"/> <g n="Qu.Fe01C0Po" v="0" s="1"/> <g n="Qu.Fe01CaPo" v="0" s="1"/> <g n="Qu.Fe01CbPo" v="0" s="1"/> – – – – – – – – – – <g n="St.Wti" v="0.00" s="1"/> <g n="St.Wto" v="0.00" s="1"/> </dati> <dati dataora="20040708164947142" secAcq="1089298187"> <g n="Mt.Ap" s="1" v="0.00"/> <g n="Mt.At" s="1" v="0.00"/> <g n="Mt.Eea" s="1" v="0.00"/> <g n="Mt.Es" s="1" v="0.00"/> <g n="Mt.Ev" s="1" v="0.00"/> <g n="Mt.Gp" s="1" v="0.00"/> <g n="Mt.InPo" s="1" v="0.00"/> <g n="Mt.Ns" s="1" v="0.00"/> <g n="Mt.Ot" s="1" v="0.00"/> – – – – – – – – – – <g n="St.PtDp" s="1" v="0.00"/> <g n="St.PtEp" s="1" v="0.00"/> <g n="St.Wd" s="1" v="0.00"/> <g n="St.Ws" s="1" v="0.00"/> <g n="St.Wti" s="1" v="0.00"/> <g n="St.Wto" s="1" v="0.00"/> </dati> </root>

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 26/36 4 LA LIBRERIA G21RETE Come anzidetto l’accesso in lettura e scrittura alle variabili sottese da entrambi le piattaforme di controllo, avviene tramite opportuni server (RISQBT e RISURA) a ciò preposti. La base dati può essere considerata come organizzata in un insieme di vettori di variabili omogenee. Gli elementi di ciascuno di questi vettori (cui si fa riferimento anche come misura, punto, quantità, ecc.) possono essere di tipo intero, a valore reale o una stringa di caratteri, sempre corredati da un attributo (un carattere) d’attendibilità. Un’apposita libreria, rilasciata in un unico file sorgente in linguaggio C, rete.c per l’esattezza, permette a programmi client, implementati su piattaforme Linux, di collegarsi ai server summenzionati. La seguente tabella riassume, a titolo indicativo, le dimensioni massime, in caratteri, delle variabili cui si farà riferimento nella trattazione (contenute nell’include file parametriColloqio.h). LUsIGLA 16 Sigla del punto LUtIPO 3 Tipo di punto LUdESC 32 Descrizione del punto LUuNIT 12 Unità di misura LUvALO 8 Valore LUvAtT 32 Lunghezza di una variabile stringa LXM 4096 Lunghezza di un messaggio UDP Tabella 1 La spiegazione delle chiamate ai singoli sottoprogrammi sarà effettuata usando la sintassi del linguaggio C. G21allOK 0 Tutto bene G21seRiM 1 Il messaggio dal server non è un file XML valido G21hoSco 2 Il server risiede su di un host sconosciuto G21apSoc 3 Errore nell’apertura del socket G21apPor 4 Errore nel collegare il socket alla porta G21invio 5 Errore di rete nell’inviare il messaggio al server G21ricez 6 Errore di rete nella ricezione del messaggio dal server G21tiOut 7 Scaduto il timeout sulla connessione G21alarm 8 L’I/O è stato interrotto Tabella 2 Dove non differentemente specificato, i sottoprogrammi ritornano un codice d’errore come dalla precedente tabella 2 (include file codici.h). Nel caso che i parametri di chiamata ad un sottoprogramma siano chiamati a riceverne anche il risultato dell’elaborazione, gli stessi saranno evidenziati con il simbolo ⊗. I sottoprogrammi d’uso più comune sono evidenziati da uno sfondo grigio.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 27/36 Interruzione della connessione void G21LoChiudi() La connessione con la base dati remota viene interrotta unilateralmente, senza aspettare alcuna conferma dal server, liberando il socket e le variabili locali. Messaggio di errore char *G21Errore() Il sottoprogramma ritorna il puntatore ad una stringa di caratteri, costituenti un semplice messaggio illustrante l’esito dell’ultima chiamata ad un sottoprogramma della libreria. Chiusura della connessione int G21Chiudi() La connessione con la base dati remota viene terminata, liberando il socket, le variabili locali ed attendendo dal server la conferma dell’avvenuta sconnessione. Apertura della connessione int G21Apri( char *nodo, short int *porta, int timeout, int periodo, char *lingua, char *utente, char *chiaveIngresso, char *chiaveUscita) Apertura di una connessione con protocollo XML su UDP/IP con un server di base dati; [nodo] è il nome del nodo di elaborazione (il cui indirizzo IP è contenuto nel file /etc/hosts o comunque noto ad un eventuale server DNS) su cui il server è in elaborazione; [porta] è il numero della porta su cui il servizio è attivo (in genere 7777 o 7778); [timeout] è il numero di secondi trascorsi i quali, in mancanza di risposta, si considera interrotto il collegamento con la base dati (dipendente dall’ampiezza di banda del collegamento in rete); [periodo] è la periodicità, in secondi, prevista per le richieste al server così che questi possa (con un coefficiente moltiplicativo precauzionale) valutare la possibilità di una rottura accidentale del collegamento con il client; [lingua] da porsi a “I” per ottenere le descrizioni dei punti ed i messaggi in Italiano, “E” per la lingua Inglese; [utente] è l’identificativo che determina i diritti di accesso sulle variabili della base dati (sola lettura o lettura/scrittura); [chiaveIngresso] e [chiaveUscita] sono due chiavi per crittografare la sequenza di accreditamento, da concordare con l’amministratore del sistema.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 28/36 Richiesta di informazioni su di un punto int G21Info( char *etichetta, char *risposta) ⊗ Richiesta di tutte le informazioni disponibili circa una variabile; [etichetta] identifica la grandezza di cui si richiedono le informazioni; il risultato dell’interrogazione è reso in [risposta] sotto forma di stringa, terminata da 0, in cui si susseguono, a loro volta terminati da un punto e virgola, l’etichetta del punto, il tipo, l’unità di misura e la descrizione. Dichiarazione delle variabili i cui valori si desiderano richiedere al server int G21DichiarazioneLettura( char *etichette[], int nSl) Dichiarazione di una lista di variabili i cui valori ci si aspetterà di ricevere, nel medesimo ordine in cui li sta dichiarando, in una o più chiamate successive G21Lettura; [etichette] è il vettore di nomi delle variabili in questione, rappresentati da stringhe di caratteri terminati da 0; [nSl] è il numero delle summenzionate variabili. Dichiarazione delle variabili i cui valori si desiderano inviare al server int G21DichiarazioneScrittura( char *etichette[], char tipi[], ⊗ int nSl) Dichiarazione di una lista di variabili i cui valori ci si appresta ad inviare, nel medesimo ordine in cui li sta dichiarando, in una o più chiamate successive a G21Scrittura; [etichette] è il vettore di nomi delle variabili in questione, rappresentati da stringhe di caratteri terminati da 0; [tipi] è un vettore di nSl caratteri destinato a contenere i loro tipi, reale od intero, come restituiti dal server; [nSl] è il numero delle summenzionate variabili. Lettura di una lista di valori int G21Lettura( float valoriReali[], ⊗ int valoriInteri[], ⊗ char attendibilita[]) ⊗ Ricezione dei valori puntuali delle variabili di cui all’ultima chiamata a G21DichiarazioneLettura, nell’ordine in cui questi sono stati specificati; [valoriReali] contiene la rappresentazione floating point dei valori delle variabili di tipo reale ed intero; [valoriInteri] contiene la parte intera dei valori delle variabili reali od il valore delle variabili intere; [attendibilita] contiene gli attributi di attendibilità (come da tabella 3).

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 29/36 sG21ok Stato normale 0 sG21na Valore non attendibile 1 sG21fs Punto fuori scansione D sG21pr Valore prefissato E sG2ne Punto non definito F Tabella 3 Richiesta dell’elenco delle variabili definite int G21Elenco( char **sigle, int *nSl) Ricezione della lista delle sigle delle variabili sottese dal server; [sigle], inizialmente impostata a NULL, al ritorno del sottoprogramma conterrà l’etichette delle variabili note al server come vettore di stringhe di caratteri terminate da 0; [nSl] conterrà il numero di tali variabili. Un semplice esempio di prova Qui di seguito si riporta un semplice esempio d’applicazione della libreria rete.c. Il programma client di prova procede con i seguenti passi: o stabilisce una connessione con il server, o dichiara alcune variabili sia in lettura che scrittura, o invia al server un insieme di valori per queste variabili, o rilegge alcune volte i valori da lui stesso inviati, o chiude la connessione. Scrittura di un vettore di variabili int G21Scrittura( float valoriReali[]; short int valoriInteri[]) Invio di una lista di valori da assegnare alle variabili di cui all’ultima chiamata a G21DichiarazioneScrittura, nello stesso ordine in cui queste sono state dichiarate; [valoriReali] contiene i valori floating point per le variabili di tipo reale; [valoriInteri] contiene, per l’appunto, i valori interi per le variabili di quel tipo.

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 30/36 extern int G21Apri(),G21DichiarazioneLettura(),G21Errore(),G21Chiudi(), G21DichiarazioneScrittura(), G21Lettura(), G21Scrittura(); #define IN 4 #define OU 4 main(int argc, char *argv[]) { char *sIn[] = {"Qu.Tr01V1N","Xy.xyxy","Qu.Tr01InPo","Mt.Pti"}, // Attenzione! : Xy.xyxy non esiste *sOu[] = {"Qu.Tr01V1N","Xy.xyxy","Qu.Tr01InPo","Mt.Pti"}, aIn[IN], tOu[OU], aOu[OU] = {‘0′,’0′,’0′,’0′}; // Indicatori di attendibilita’ float rIn[IN], rOu[OU] = {220.0,0.,0.,50.}; // Valori per Qu.Tr01V1N e Mt.Pti int iIn[IN], iOu[OU] = {0,0,1,0}, // Valore per Qu.Tr01InPo n, i, j; // Apre la connessione con il server “induno” ed utente “lbisone” j = G21Apri("induno",7777,10,2,"E","lbisone","jhs34ddq","w2kuid95"); printf("esito G21Apri %d – %sn",j,G21Errore()); // Dichiarazione delle variabili che si desiderano in lettura j = G21DichiarazioneLettura(sIn,IN); printf("esito G21DichiarazioneLettura %d – %sn",j,G21Errore()); // Dichiarazione delle variabili da scrivere sul server j = G21DichiarazioneScrittura(sOu,tOu,OU); printf("esito G21DichiarazioneScrittura %d – %sn",j,G21Errore()); j = G21Scrittura(rOu,iOu,tOu,aOu,OU); // Scrittura valori printf("esito G21Scrittura %d – %sn",j,G21Errore()); for (n=0;n<5;n++) { // Rilettura dei valori dal server j = G21Lettura(rIn,iIn,aIn); printf("esito G21Lettura %d – %sn",j,G21Errore()); for (i=0;i<IN;i++) printf("[%d] %f %d %cn",i,rIn[i],iIn[i],aIn[i]); sleep(5); } j = G21Chiudi(); // Chiusura della connessione printf("esito G21Chiudi %d – %sn",j,G21Errore()); }

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 31/36 5 LA LIBRERIA G21MESH Come anzidetto l’accesso in lettura e scrittura alle variabili presenti nell’area di memoria condivisa, in entrambi le piattaforme di controllo, può avvenire, da parte di un qualsiasi programma che elabori sulle macchine in questione, tramite un’opportuna libreria di sottoprogrammi a ciò preposti, rilasciata in un unico file sorgente in linguaggio C, mesh.c per l’esattezza. Questo metodo d’accesso garantisce il massimo delle prestazioni pur agendo in maniera simbolica, cioè senza richiedere l’esatta collocazione in memoria delle grandezze interessate. La base è convenzionalmente considerata come organizzata in un insieme di vettori di variabili omogenee. Gli elementi di ciascuno di questi vettori (cui si fa riferimento anche come misura, punto, quantità, ecc.) possono essere di tipo intero o a valore reale, sempre corredati da un attributo (un carattere) d’attendibilità. La spiegazione delle chiamate ai singoli sottoprogrammi sarà effettuata usando la sintassi del linguaggio C. Nel caso che i parametri di chiamata ad un sottoprogramma siano chiamati a riceverne anche il risultato dell’elaborazione, gli stessi saranno evidenziati con il simbolo ⊗. Chiusura della connessione void G21SMChiudi() La connessione con l’area di memoria condivisa viene interrotta. Apertura della connessione struct qbtShare *G21SMApri( char *nom) Viene stabilita la connessione con l’area di memoria condivisa. Dichiarazione delle variabili i cui valori si desiderano leggere dalla memoria condivisa int G21SMDicLeggi( char *etichette[], int nSl) Dichiarazione di una lista di variabili i cui valori ci si aspetterà di ricevere, nel medesimo ordine in cui li sta dichiarando, in una o più chiamate successive G21SMLeggi; [etichette] è il vettore di nomi delle variabili in questione, rappresentati da stringhe di caratteri terminati da 0; [nSl] è il numero delle summenzionate variabili. Dichiarazione delle variabili i cui valori si desiderano scrivere nella memoria condivisa void G21SMDicScrivi( char *sigle, int nOs) Dichiarazione di una lista di variabili i cui valori ci si appresta ad inviare, nel medesimo ordine in cui li sta dichiarando, in una o più chiamate successive a G21SMScrivi; [etichette] è il vettore di nomi delle

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 32/36 variabili in questione, rappresentati da stringhe di caratteri terminati da 0; [nSl] è il numero delle summenzionate variabili. Lettura di un vettore di variabili void G21SMLeggi( float *valoriReali, int *valoriInteri, char *attendibilità) Ricezione dei valori puntuali delle variabili di cui all’ultima chiamata a G21SMDicLeggi, nell’ordine in cui questi sono stati specificati; [valoriReali] contiene la rappresentazione floating point dei valori delle variabili di tipo reale ed intero; [valoriInteri] contiene la parte intera dei valori delle variabili reali od il valore delle variabili intere; [attendibilita] contiene gli attributi di attendibilità (come dalla sottostante tabella). sG21ok Stato normale 0 sG21na Valore non attendibile 1 sG21fs Punto fuori scansione D sG21pr Valore prefissato E sG2ne Punto non definito F Scrittura di un vettore di variabili void G21SMScrivi( float *valoriReali, int *valoriInteri, char *attendibilita) Invio di una lista di valori da assegnare alle variabili di cui all’ultima chiamata a G21SMDicScrivi, nello stesso ordine in cui queste sono state dichiarate; [valoriReali] contiene i valori floating point per le variabili di tipo reale; [valoriInteri] contiene, per l’appunto, i valori interi per le variabili di quel tipo; [attendibilità] contiene gli attributi come dalla soprastante tabella (include file “stati.h”). Un semplice esempio di prova Qui di seguito si riporta un semplice esempio d’applicazione della libreria G21MESH.. Il programma di prova procede con i seguenti passi: o si connette all’area di memoria condivisa e dichiara alcune variabili sia in lettura che scrittura, o esegue cento volte, ad intervalli di un secondo, la lettura di un insieme di fine corsa di interruttori, il calcolo dello stato e della relativa attendibilità, la memorizzazione del tutto nell’area condivisa. o si sconnette dall’area condivisa

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 33/36 #include “memdb.h” // Dichiarazione struttura memoria condivisa #include “stati.h” // Costanti di attendibilita’ extern struct qbtShare *G21SMApri(char *); extern void G21SMDicLeggi(char *,int), G21SMDicScrivi(char *,int), G21SMLeggi(float *,int *,char *), G21SMScrivi(float *,int *,char *), G21SMChiudi(); #define IN 10 // Numero di contribuenti ai calcoli #define OU 5 // Numero di grandezze calcolate main(int argc, char *argv[]) { struct qbtShare *b; // Struttura area condivisa char sIn[IN][LUsIGLA] = {"Qu.I152DP1Ao","Qu.I152DP1Co","Qu.IQ1Ao", "Qu.IQ1Co","Qu.IQ3Ao","Qu.IQ3Co","Qu.IQ5Ao", "Qu.IQ5Co","Qu.IQ7Ao","Qu.IQ7Co"}, sOu[OU][LUsIGLA] = {"Qu.I152DP1Po","Qu.IQ1Po","Qu.IQ3Po", "Qu.IQ5Po","Qu.IQ7Po"}, aIn[IN], aOu[OU]; float rIn[IN], rOu[OU]; int iIn[IN], iOu[OU], i, j, n; b = G21SMApri(“qbtArea”); // Collegamento alla memoria condivisa G21SMDicLeggi((char *)sIn,IN); // Dichiarazione contribuenti calcoli G21SMDicScrivi((char *)sOu,OU); // Dichiarazione prodotti dei calcoli for (i=0;i<100;i++) { G21SMLeggi(rIn,iIn,aIn); // Lettura contribuenti ai calcoli for (j=0;j<OU;j++) { n = j*2; if ((iIn[n]==’1′)&&(iIn[n+1]==’0′)) { iOu[j] = ‘0’; // Interruttore APERTO aOu[j] = sG2ok; } else if ((iIn[n]==’0′)&&(iIn[n+1]==’1′)) { iOu[j] = ‘1’; // Interruttore CHIUSO aOu[j] = sG2ok; } else { iOu[j] = ‘0’; // Risultato non attendibile aOu[j] = sG2na; } } G21SMScrivi(rOu,iOu,aOu); // Scrittura dei risultati dei calcoli sleep(1); } G21SMChiudi(); // Scollegamento dall’area di memoria condivisa }

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 34/36 6 APPENDICE A: BOZZE DEI FILE DI SETUP Esempio di setup.qbt.xml <?xml version="1.0"?> <qbt> <ssimeasLog>/home/qbt/log/ssimeas.log</ssimeasLog> <risqbtLog>/home/qbt/log/risqbt.log</risqbtLog> <dingusLog>/home/qbt/log/dingus.log</dingusLog> <msloadLog>/home/qbt/log/msload.log</msloadLog> <rilbancLog>/home/qbt/log/rilbanc.log</rilbancLog> <pxLog>/home/qbt/log/px.log</pxLog> <filePunti>punti.Qu.xml</filePunti> <lingua>E</lingua> <risqbt> <chiaveIn>gendis21</chiaveIn> <chiaveOut>dispower</chiaveOut> </risqbt> <rilbanc> <programmaServer>risqbt</programmaServer> <nodoServer>grandate</nodoServer> <utente>lbisone</utente> </rilbanc> <portaSimeas0>/dev/ttyS5</portaSimeas0> <portaSimeas1>/dev/ttyS6</portaSimeas1> <portaSimeas2>/dev/ttyS7</portaSimeas2> <portaSimeas3>/dev/ttyS8</portaSimeas3> <portaSimeas4>/dev/ttyS9</portaSimeas4> <portaSimeas5>/dev/ttyS10</portaSimeas5> <baudrateSimeas>19200</baudrateSimeas> <timeoutSimeas>5</timeoutSimeas> <AdamInput> <porta>/dev/ttyS11</porta> <timeout>2</timeout> <moduli>17;18;19;</moduli> </AdamInput> <AdamOutput> <porta>/dev/ttyS12</porta> <timeout>2</timeout> <moduli>1;2;3;4;5;6;7;</moduli> </AdamOutput> </qbt>

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 35/36 Esempio di setup.ura.xml <?xml version="1.0"?> <ura> <msloadLog>/home/ura/log/msload.log</msloadLog> <stirlingLog>/home/ura/log/stirling.log</stirlingLog> <areaShared>34104</areaShared> <filePunti>punti</filePunti> <risura> <chiaveIn>generazione</chiaveIn> <chiaveOut>distribuita</chiaveOut> </risura> <rilbanc> <programmaServer>risura</programmaServer> <nodoServer>localhost</nodoServer> <utente>ura</utente> </rilbanc> <microturbina> <paginaDati>http://192.168.1.10/logg.eng.htm</_paginaDati> <utenteServer>user_1</utenteServer> <passwordServer>3105</passwordServer> <utenteProxy>lbisone</utenteProxy> <passwordProxy>luigi177</passwordProxy> <proxy>http://bigarello.cesi:6588</proxy> </microturbina> <stirling> <paginaDati>http://stirling/stirling/dati.htm</paginaDati> <proxy>http://proxy.cesi:8080</proxy> <utenteProxy>lbisone</utenteProxy> <passwordProxy>hdyttegr</passwordProxy> <ciclo>5</ciclo> <timeout>3</timeout> </stirling> <fotovoltaico> <paginaDati>http://leni/leni/DatiHTML.htm</paginaDati> <proxy>http://proxy.cesi:8080</proxy> <ciclo>5</ciclo> </fotovoltaico> <quadro> <server>grandate</server> <porta>7777</porta> <utente>ura</utente> <timeout>5</timeout> <ciclo>5</ciclo> <chiaveIn>dispower</chiaveIn> <chiaveOut>gendis21</chiaveOut> </quadro> </ura>

CESI A4505507 Rapporto FIA Informatica e Automazione Approvato Pag. 36/36 7 BIBLIOGRAFIA i ADAM 4000 Series User’s Manual ii Digitaler Meßumformer “SIMEAS T” | 7KG6000-8AA/AB bis 7KG6000-8EA/EB | Funktionsbeshreibung iii Sistema di supervisione della test facility: specifica del sistema, rapporto CESI A4500492

Progetti

Commenti