UNIVERSITÀ DI PISA
Fa oltà di s ienze matemati he, si he e naturali Dipartimento di Informati a 12 Di embre 2008
Domoti a industriale
Presentata da Rita Pu
i
Tutore A
ademi o
Tutore Aziendale
Augusto Ciuoletti
Andrea De Nardis
Anno A
ademi o 2007/08 1
A mio padre
2
Sommario Il progetto ha avuto ome obiettivo la reazione di un sistema per appare
hiature Programmable logi ontroller (PLC), ostruite per lo sviluppo di impianti domoti i industriali. Il Sistema sviluppa il ontrollo degli a
essi al magazzino utilizzando la te nologia Radio Frequen y IDenti ation (RFID) per l'identi azione degli utenti e il ontrollo dell'ingressi eettivi alla struttura tramite due foto ellule a laser. In aso di a
esso non autorizzato, viene utilizzato sia un allarme a usti o, un i alino, sia un allarme visivo, visualizzato sull'interfa
ia he è stata implementata per il sistema. Oltre al ontrollo degli a
essi, il sistema, si preo
upa di ontrollare lo stato delle periferi he lan iando allarmi spe i i in aso di guasti eettivi o presunti. Questo sistema di si urezza è stato sviluppato per l'azienda ISAC, seguendo le spe i he indi ate dal tutore aziendale. Ogni funzionalità è stata testata on attori umani e periferi he funzionanti reali, in modo da poter essere un prototipo adabile per eventuali sviluppi.
Indi e 1 Introduzione 1.1 Sistemi di identi azione a radiofrequenza Storia
. . . . . . . . . . . . . .
6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
RFID struttura interna
1.2
1.3
. . . . . . . . . . . . . . . . . . . . . . . . . . .
6
. . . . . . . . . . . . . . . . . . . . . . . .
7
. . . . . . . . . . . . . . . . . . . . . . . .
8
Appli azioni RFID . . . . Ma
hina utilizzata: PLC Storia
5
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
PLC struttura interna e funzionamento . . . . . . . . . . . . . . . . . . .
9
. . . . . . . . . . . . . . .
9
Proto ollo di omuni azione CANOPEN
2 Il Problema 2.1 Presentazione progetto . . . . . 2.2 Use ase sviluppati . . . . . . . . 2.3 Periferi he fornite da utilizzare RTPLC
12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
. . . . . . . . . . . . . . . . . . . . .
14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3 Analisi 3.1 3.2
3.3
12
Use Case
17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
. . . . . . . . . . . . . . . . . . . . . . . . . .
23
. . . . . . . . .
26
. . . . . . . . . . . . . . . . . . . . . . . . . .
27
Diagrammi di sequenza
Progettazione si a (Distanza minima tra le foto ellule)
Diagrammi di attività
4 La Soluzione 4.1 Strutturazione del progetto . . . . . . 4.2 Funzionalità routine . . . . . . . . . . . 4.3 Struttura interna delle routine . . . . 4.4 Gestione delle interazioni tra routine 5 Implementazione 5.1 S elte implementative 5.2 Sviluppo ontrolli . . .
31 . . . . . . . . . . . . . . . . .
31
. . . . . . . . . . . . . . . . .
34
. . . . . . . . . . . . . . . . .
36
. . . . . . . . . . . . . . . . .
37
39 . . . . . . . . . . . . . . . . . . . . . . . . . .
39
. . . . . . . . . . . . . . . . . . . . . . . . . .
40
6 Manuale 6.1 Funzionalità oerte . . . . 6.2 Presentazione interfa
ia . 6.3 Uso dell'interfa
ia utente
41 . . . . . . . . . . . . . . . . . . . . . . . .
41
. . . . . . . . . . . . . . . . . . . . . . . .
42
. . . . . . . . . . . . . . . . . . . . . . . .
42
1
7 Con lusioni e sviluppi futuri
49
A Codi e A.1 denition.h: . . . . . . A.2 denition. : . . . . . . A.3 routineMain. : . . . . . A.4 routineInit. : . . . . . A.5 routine_allarme. : . . A.6 routine_leggiDB. : . . A.7 routine_aggiornaDB. : A.8 routine_leggiSeriale. : A.9 routine_reset. : . . . .
50 50 52 54 60 61 65 68 71 75
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
2
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
Elen o delle gure 1.1 tag RFID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Data Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 10
2.1 RTPLC-SIMU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9
use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
19 21 22 24 25 26 27 28 29
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12
S hermata inziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S hermata attesa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S hermata man ato passaggio . . . . . . . . . . . . . . . . . . . . . . . S hermata impegno foto ellula1 . . . . . . . . . . . . . . . . . . . . . . S hermata passaggio eettuato . . . . . . . . . . . . . . . . . . . . . . S hermata us ita utente . . . . . . . . . . . . . . . . . . . . . . . . . . S hermata di reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S hermata allarme manuale . . . . . . . . . . . . . . . . . . . . . . . . S hermata allarme impegno simultaneo delle foto ellule . . . . . . . . . S hermata allarme Foto ellula2 guasta(o impegnata da troppo tempo) . S hermata allarme man ata autenti azione . . . . . . . . . . . . . . . S hermata messaggio blo
o del reset . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . .
43 43 44 44 45 45 46 46 47 47 48 48
Diagramma di sequenza entrata . Diagramma di sequenza us ita . . Diagramma di sequenza generale Diagramma di attività 1 . . . . . Diagramma di attività 2 . . . . . Diagramma di attività 3 . . . . .
3
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
Ringraziamenti Stima e ri onos enza va al Prof. Augusto Ciuoletti, per la sua disponibilità, i preziosi
onsigli sia durante il tiro inio sia spe i atamente nella stesura della tesi. Ringrazio il dott. Andrea De Nardis, (Capo del entro sviluppo presso la ditta ISAC) per avermi dato la possibilità di svolgere il mio tiro inio presso la sua azienda, e di utilizzare le ma
hine per testare il progetto. Un ringraziamento grande an he ai ragazzi he lavorano nell'azienda (Fran es o, Stefano P., Stefano S., Mi hele, Matteo, Jonny, Antonio, Dario, Massimo), per avermi aiutata a apire ome svolgere il tiro inio e per avermi a
olta subito in un ambiente molto familiare. Ringrazio la mia mamma Teresa, per il sostegno morale e materiale durante il onseguimento di questa laurea supportandomi sempre in questi anni di università. Un grande ringraziamento va a mia sorella Marina per l'aiuto importante he mi ha dato nella stesura della tesi e per avermi sempre in oraggiata. Ringrazio Federi o, per tutto il suo amore e per avermi sopportata in questi anni nei momenti tranquilli, nelle ansie pre-esami e in queste ansie pre-laurea standomi sempre vi ino. Inne ringrazio tutti i miei ami i, ami he e ompagni di orso per la loro ami izia e per il ruolo fondamentale he hanno avuto in questi anni.
4
Capitolo 1 Introduzione La parola Domoti a indi a la s ienza interdis iplinare he si o
upa dello studio dell'automatizzazione di ambienti. Il termine deriva dalla parola fran ese Domotique, espressione verbale questa, formata dalla parola domus e dai termini informatique e télématique. In senso stretto, la Domoti a, è quella des iplina nata per automatizzare ed integrare le funzionalità di un ambiente domesti o apportando omodità nella vita di tutti i giorni. Gli ambiti in ui si sviluppa sono quattro: risparmio energeti o, onfort, si urezza, safety. Mediante un sistema domoti o è possibile gestire gli impianti interni senza spre o di energia ( può ontrollare he non rimangano a
ese lu i in assenza di utenti all'interno dell'ambiente). Rendendo automatizzati i ontrolli della struttura, l'utente non deve o
uparsi del ontrollo degli appare
hi, il sistema garantis e la si urezza della struttura e dell'utente, ontro l'intrusioni si he o all'interno del software di sistema. Gli impianti domoti i devono avere i seguenti requisiti: • modularità : il sistema è diviso in moduli separati da gestire • s alabilità : il sistema è indipendente dalle prestazioni dell'hardware, ogni ompo-
nente può essere sostituito.
• reattività : il sistema deve reagire in tempi brevi • tempo reale: il sistema deve reagire in base ai ambiamenti esterni
Grazie a questa dis iplina è possibile ostruire la propria asa a misura d'uomo integrando an he tutte le situazioni parti olari dovute a handi ap: è infatti s opo della domoti a permettere a hiunque di poter interagire on tutte le appare
hiature presenti nelle nostre ase. Le innovazioni portate dalla Domoti a, trovano appli azioni an he in ambienti industriali e aziendali, dove le stesse te ni he di automazione vengono utilizzate per la gestione di impianti di produzione, videosorveglianza, ontrollo presenze autorizzate,
ampionamento remoto dei sensori, diagnosti a della linea di produzione. Queste nuove appli azioni industriali sono già state sviluppate da molte aziende del settore utilizzando me
anismi sempre più avanzati. Il progetto he si è sviluppato, rappresenta un'appli azione della domoti a in ambito industriale, sviluppata on l'ausilio di dispositivi elettroni i di rilevamento. Questo 5
aspetto è in entrato sul ontrollo delle presenze autorizzate, quindi sulla si urezza di un ambiente aziendale. Sono già state sviluppate soluzioni alternative a quella presentata. Ad esempio l'utilizzo di un lettore biometri o per il ri onos imento delle impronte digitali, l'impiego di un tastierino numeri o (in questo aso il ontrollo viene eseguito dal sistema ontrollando il
odi e inserito) l'impiego di un sensore di prossimità DGLP. La soluzione presentata utilizza la rilevazione tramite foto ellule e il ri onos imento tramite tag RFID. Il reader RFID è una soluzione, per in ontrollo degli a
essi, he è già stata adottata da molte aziende di si urezza e domoti a.
1.1 Sistemi di identi azione a radiofrequenza
Storia
I dispositivi a radio frequenza si sono sviluppati durante di anni 50, in seguito alle ri er he eseguite negli anni della guerra per inviare messaggi riptati in ambienti perturbati da interferenze elettromagneti he. I primi sistemi RFID utilizzavano un transponder he gestiva un'informazione di 1 bit per poter permettere il rilevamento della presenza/assenza dell' utente. Negli anni 70 gli inventori e i laboratori, pubbli i ed universitari, iniziarono a sviluppare i sistemi radio per identi are materiali prodotti da attività nu leari e personale
oinvolto nelle attività . L'RFID fu impiegato an he in ambito militare e per l'identi azione di animali, on transponder a bassa frequenza e on transponder operanti nelle mi roonde. In seguito fu impiegato in ambito dei trasporti per ontrollare i vei oli e la mer e transportata. Iniziò a divenire una te nologia in grande espansione sia negli Stati Uniti sia in Europa on eettivi obiettivi ommer iali. Negli anni 80 l'RFID si aermò ome te nologia ormai ompleta, sviluppata negli Stati Uniti, nel ontrollo di mer i e mezzi trasportati, a
esso del personale e identi azione animali; in Europa si sviluppò maggiormente per l'identi azione di animali, per attività industriali e il ontrollo/a
esso alle autostrade. Solo negli anni 90 si presentarono le ondizioni per lo sviluppo dell'RFID moderno (simile a om'è oggi); i ir uiti si rimpi
iolirono, permettendo una diminuizione dei
onsumi di energia tale da non aver bisogno dell'alimentazione da rete elettri a, poi hé ri evevano energia su iente già dall'onda elettromagneti a generata dal lettore he li interrogava; si iniziarono a utilizzare memorie RAM he eliminavano la ne essità di utilizzare memorie tampone per mantenere i dati in memoria. Si ebbe l'inizio delle appli azioni di massa in settori spe i i, quali le autostrade, permettendo agli autovei oli a
essi autorizzati alle diverse zone.
RFID struttura interna RFID è una te nologia per l'identi azione automati a di oggetti, animali o persone sfruttando le onde radio e leggendo le informazioni ontenute in parti olari eti hette. Il sistema si basa sulla lettura a distanza di informazioni ontenute in un tag usando dei lettori RFID. 6
Figura 1.1: tag RFID Il Tag è un omponente elettroni o omposto da un hip, un'antenna e da una batteria per l'alimentazione del hip (quest'ultima non è sempre ne essaria). È possibile inviare e ri evere informazioni dal tag RFID trasmettendo via radiofrequenza. Spesso il transponder viene inserito in un supporto quale una tessera di plasti a per evitare he si danneggi. Il tag è ostituito da una memoria non volatile he ontiene il
odi e uni o he viene trasmesso al lettore tramite l'antenna (Figura:1.1). Esistono due tipi di tag: i tag attivi e quelli passivi. I primi sono tag on una alimentazione interna indipendente, i se ondi sono tag he hanno bisogno di un'alimentazione proveniente dall'esterno. In questo aso è il lettore stesso a fornire l'alimentazione ne essaria emettendo un ampo elettromagneti o, he tramite induzione fornis e al tag la
orrente utile ad alimentare il hip. Il lettore è un supporto sso he non ha ne essità della visibilità otti a della tag per poterne leggere il odi e, né del ontatto, e per questo è ritenuta una te nologia migliore del odi e a barre o della banda magneti a. È ostituito da due parti : l'unità di ontrollo, un mi ro al olatore on un sistema operativo real time he gestis e le funzionalità del lettore; le antenne, he ostituis ono la reale interfa
ia verso il transponder. Le prestazioni del transponder e del lettore, ri hieste da ogni spe i o pro esso, non hanno impatto sulla struttura si a dell'oggetto ma sulla distanza di lettura e sulla
apa ità di memorizzare informazioni.
Appli azioni RFID La te nologia RFID può essere onsiderata il su
essore del odi e a barre. Le possibilità di utilizzo di questa, a dierenza del se ondo sistema, non si limitano alla sempli e identi azione automati a, dal momento he è possibile memorizzare informazioni e sosti ate operazioni di programmazione all'interno della memoria del transponder. Grazie alle fun7
zionalità sempre più avanzate e all'integrazione dei omponenti, la te nologia RFID ha sostituito la barra magneti a in numerosi ampi tra ui i seguenti:
Appli azioni medi he: I hip RFID possono essere impiegati in appli azioni he ri hiedono alti livelli di si urezza, ome i laboratori lini i e biote nologi i, e per l'identi azione di persone ed oggetti in modo automati o, si uro e velo e, al ne di ottimizzare i pro essi di riduzione degli errori, parti olarmente riti i, in quanto hanno riper ussioni sulla salute umana. Fra le appli azioni della te nologia RFID legate alla salute dell'uomo, ma non strettamente alla medi ina, è in lusa l'identi azione degli atleti durante le manifestazioni sportive allo s opo, non solo di misurarne i tempi, ma an he di assi urare un intervento rapido in aso di malori. In al uni stadi di baseball aliforniani sono stati adottati bra
ialetti RFID ontenenti i dati anagra i degli spettatori, allo s opo di impedire la vendita di al oli i ai minorenni durante le partite.
Anti ontraazione: Sono state sviluppate ome soluzione per l'identi azione della
ontraazione di do umenti, di beni di lusso, ome a
essori, api di abbigliamento, liquori, profumi mediante tag RFID, inserendo la erti azione di origine e provenienza all'interno della mamemoria del tag.
A
essi a strutture pubbli he e industriali: Vengono utilizzati sistemi RFID per il
ontrollo di a
essi a strutture ban arie, par heggi in ambito industriale on lo alizzazione di personale in ambienti a elevata si urezza. Questo tipo di appli azione del sistema RFID, è stata sviluppata nel progetto per il ontrollo degli a
essi al magazzino in modo da garantire un'alta si urezza alla struttura e alle mer i.
1.2
Ma
hina utilizzata: PLC
Il PLC è un omputer industriale programmabile spe ializzato nella gestione dei pro essi industriali. Esegue programmi di gestione di segnali digitali e analogi i dirigendo le azioni al olate sugli attuatori presenti sull'impianto. L'evolversi della te nologia sta progressivamente mignaturizzando i omponenti elettroni i diminuendo i osti del PLC e fa ilitandone la diusione an he in ampi non industriali, quali l'ambiente domesti o. I pannelli PLC vengono infatti utilizzati an he per la gestione di sistemi utili per la asa ome salvavita, antifurto, impianto di ris aldamento e di irrigazione, rendendo automatizzato il ontrollo di questi appare
hi. Una aratteristi a prin ipale del PLC è la robustezza atta a sopportare interferenze elettromagneti he, alte temperature e periodi di attività molto lunghi e ontinui, aratteristi he proprie degli ambienti industriali. La struttura del PLC viene adattata in base al pro esso da automatizzare. Durante la progettazione del sistema di ontrollo, vengono s elte le s hede adatte alle grandezze elettri he in gio o. Le varie s hede vengono quindi inserite sul BUS o ra k del PLC.
8
Storia I PLC si sono sviluppati se ondo la ri hiesta del mer ato industriale. A partire dagli anni 70 vi era ri hiesta di appare
hiature in grado di eseguire logi he elementari. Le prime ma
hine avevano un software rigido e potevano svolgere solo po he funzioni, avendo nello stesso tempo un osto proibitivo e un sistema he risultava omplesso. Negli anni 80 l'industria mise sul mer ato al uni PLC on s hede di modularità e s hede di ingressi e us ita, mantenendo però un prezzo troppo alto per permetterne la diusione tra le industrie. Solo negli ultimi anni vi è stata una reale diusione dei PLC
on una ompleta gamma di a
essori he oprono molte delle appli azioni possibili; an he il linguaggio di programmazione è ambiato passando ad un linguaggio ad alto livello, essendo troppo ompli ato programmare i PLC on linguaggio a basso livello. La te nologia del PLC si è evoluta no ad arrivare a PLC on alte prestazioni e on sistemi operativi moderni ome Windows NT: attualmente sono ma
hine diuse in s ala mondiale ed utilizzate in molti ambiti.
PLC struttura interna e funzionamento Il PLC è ostituito da una CPU, memorie sia volatili he retentive, moduli IN/OUT, un dispositivo di programmazione e un alimentatore. L'unità entrale è basata su un singolo pro essore, solo per appli azioni riti he si utilizzano multipro essori. è presente sia una memoria persistente, he ontiene il sistema operativo, il programma utente e le variabili retentive, sia una memoria volatile dove vi sono l'immagine degli ingressi, delle us ite e delle variabili interne globali he vengono utilizzate per operazione da un i lo all'altro. I moduli di I/O onvertono i segnali provenienti dai sensori in un formato digitale. La prima osa he il PLC ompie è la lettura degli ingressi sia digitali he analogi i, on board o su bus di ampo (s hede remote ollegate al PLC o on una rete di omuni azione). Dopo aver letto tutti gli ingressi, il loro stato viene memorizzato in una memoria
he è denita Registro immagine degli ingressi. A questo punto le istruzioni di omando vengono elaborate in sequenza dalla CPU e il risultato viene memorizzato nel Registro immagine delle us ite. Inne, il ontenuto dell'immagine delle us ite viene s ritto sulle us ite si he ovvero le us ite vengono attivate. L'elaborazione delle istruzioni si ripete ad ogni i lo; il tempo he il ontrollore impiega per una singola elaborazione viene detto tempo di i lo (solitamente po hi millise ondi). 1.3
Proto ollo di omuni azione CANOPEN
Controller Area Network (CAN) è uno standard seriale per bus di ampo, ossia per forme di omuni azione digitale presenti su reti a basso livello per la omuni azione on periferi he quali sensori, i alini, led; si basa su ollegamenti punto a punto on segnali a 4-20mA. Il proto ollo CAN assi ura un elevato sistema di si urezza per le omuni azioni di sistemi in real time on bit rate no a 1Mb. Questo proto ollo è strutturato su 3 livelli: livello oggetto, livello trasferimento, livello si o. 9
Figura 1.2: Data Frame Il Livello oggetto è il livello he si o
upa del ltraggio delle informazioni e della traduzione dei messaggi da linguaggi a basso livello a linguaggi ad alto livello. Il Livello trasferimento è il livello he si o
upa della gestione degli errori a basso livello e di tutto iò he ri hiede una omuni azione garantita (a knowledgement). Viene valutato lo stato della omuni azione, se in ri ezione o in invio, ontrollando lo stato del bus. Il Livello si o è il livello he si o
upa della rappresentazione binaria dei messaggi trasferendo i bit di informazione tra i nodi diversi. I primi due livelli si o
upano del Data Link delle omuni azioni, denito dal modello Open Systems Inter onne tion (ISO/OSI), trasmettendo al livello superiore una omuni azione priva di errori. Il livello si o a
etta e trasmette i messaggi tradotti in binario senza preo
uparsi del ontrollo dei pa
hetti; poi hé è il livello data link ad o
uparsi del rispetto dei vin oli. Tutti i nodi ondividono lo stesso livello si o. Il proto ollo viene usato soprattutto per hé garantis e le seguenti proprietà prin ipali molto utili per la omuni azione in real time: • garanzia della gestione di vari livelli di priorità asso iati ai singoli messaggi • garanzia tempi di latenza • essibilità di ongurazione • ri ezione multi ast on sin ronizzazione temporale • rilevamento e segnalazione di errori • ritrasmissione automati a di messaggi, errati • gestione di errori temporanei • gestione di stati di malfunzionamento permanente • isolamento automati o di nodi difettosi
10
La omuni azione dei segnali da parte delle varie unità, avviene tramite omuni azione in multi ast supportata dal ltraggio dei messaggi, he garantis e ad ogni unità di ra
ogliere solo le informazioni ne essarie. La politi a di a
esso multiplo utilizzata per l'a
esso al anale in multi ast, è il CSMA-CD, politi a on rilevazione della portante e ri onos imento delle ollisioni, alla quale viene aggiunto l'utilizzo della priorità tra messaggi he stabilis e quale messaggio si aggiudi a il bus di omuni azione. Si parla di bit re essivo e di bit dominante in aso di
omuni azione simultanea he vede il bit 0 ome dominante mentre il bit 1 ome re essivo (in una omuni azione simultanea bit 0 e bit 1 risulta sul anale lo 0). I vari dispositivi hanno a disposizione un metodo di invio di remote frame per ri hiedere agli altri nodi l'informazione di interesse.(Figura:1.2). All'interno del ampo Arbitration eld vi è il ampo RTR he indi a se il frame è re essivo, quindi un remote frame, o dominante, quindi un data frame. L'arbitraggio è implementato basandosi an he sul tipo di frame inviato (se dominante o re essivo) in modo he, in aso di invio simultaneo di un remote frame e un data frame, viene favorito il data frame.
11
Capitolo 2 Il Problema 2.1
Presentazione progetto
Il problema presentato è l' implementazione di un'appli azione per il ontrollo degli a
essi ad un magazzino. Si tratta quindi dello sviluppo di un sistema Domoti o per automatizzare tale ontrollo. Le soluzioni appli abili per lo sviluppo di questo sistema sono molte. In questo aso spe i o è stato ri hiesto di utilizzare un sistema di identi azione basato sulla te nologia RFID, he rappresenta una possibilità di rilevazione di tag e sta sostituendo le bande magneti he e i odi i a barre. Mediante RFID, è stato possibile sviluppare un sistema di interazione on l'uomo, eliminando il bisogno di visibilità eettiva del tag da parte del lettore RFID. Questo rappresenta un esempio di automazione dell'ambiente. L'appli azione sviluppata può essere installata in ambienti senza il bisogno di apportare modi he, quindi garantis e la proprietà di portabilità . La soluzione è stata sviluppata utilizzando una periferi a di lettura RFID su porta seriale RS-232, due foto ellule e un i alino, tutti e tre ollegati al sistema tramite un dispositivo CAN. Questo tipo di soluzione rappresenta una delle possibilità per automatizzare un ontrollo a distanza. Il software è stato sviluppato su p on sistema operativo Windows XP Professional sp3, utilizzando Visual studio 2005 Professional ome ambiente di sviluppo e l'appli azione RTPLC-SIMU ome ambiente di simulazione. RTPLC-SIMU da la possibilità di ri reare gli use ase di ui è ri hiesta la gestione,
ontrollando l'ese uzione delle routine e simulando il ambio di stato dei nodi digitali di ingresso/us ita, testando il funzionamento in ambiente ontrollato. Per questo si è rilevato fondamentale per lo sviluppo del progetto e per l'ese uzione dei test iniziali di funzionalità . Per il test eettivo dell'appli azione, inserita in un ontesto real time, si è utilizzata l'implementazione RTPLC ULISSE. 2.2
Use ase sviluppati
L'appli anzione deve gestire gli use ase dovuti alle varie situazioni he possono essere rilevate e ri onos iute dalla ma
hina mediante le periferi he fornite. Trattandosi di use
12
ase reati da utenti umani, non sempre è possibile riprodurre tutte le situazioni he si possono reare intorno alla ma
hina. Per lo sviluppo della soluzione, e per rius ire a prendere in onsiderazione tutte le possibili situazioni he si possono ri reare, sono state analizzate le possibili azioni dell'utente e gli stati assunti dalle periferi he, in quanto ogni stato è utilizzato dall'appli azione per
omprendere la situazione reale he si è reata.
• Utente:
attivazione del lettore RFID tramite transponder di ri onos imento impegno foto ellula1 impegno foto ellula2 • Lettore RFID
lettura identi ativo valido lettura identi ativo non valido man ata lettura (invio di un id nullo) • Foto ellula1
interruzione raggio foto ellula (attivazione) man ato impegno foto ellula1 • Foto ellula2
impegno raggio foto ellula (attivazione) man ato impegno foto ellula2 • Ci alino
attivazione non attivato
Il software gestis e il funzionamento della ma
hina valutando lo stato in ui si trova ogni periferi a per apire quale situazione deve essere ontrollata. Gli attori previsti negli use ase sono rappresentati da un utente, he può provo are solo use ase di allarme manuale o a
esso non autorizzato, e il sistema. È possibile an he avere asi on più di un utente in direzioni diverse (uno in entrata uno in us ita). In questo aso vi sono al uni vin oli da rispettare per assi urare il orretto svolgimento dell'appli azione: poi hé la rilevazione di entrata è blo
ante, è ne essario he l'utente in entrata si identi hi dopo
he l'utente in us ita abbia impegnato la foto ellula2. La ma
hina deve gestire i seguenti use ase: Entrata: un utente entra nella struttura ontrollata dalla ma
hina. Le possibilità gestite sono sia di autenti azione tramite tag, on o senza a
esso eettivo, sia di man ata autenti azione, on o senza a
esso non autorizzato.
13
un utente es e dalla struttura ontrollata dalla ma
hina. Le possibilità gestite sono sia di us ita on autenti azione tramite tag, sia senza autenti azione.
Us ita:
gestis e l'avvio degli allarmi, sia per guasti, sia per a
esso non autorizzato, sia per allarmi manuali.
Attivazione Allarme:
gestis e il ritorno ad uno stato onsistente dell'appli azione distinguendo però gli allarmi di a
esso non autorizzato dagli altri allarmi e quindi gestendo due tipi di ristabilizzazione diversi.
Disattivazione Allarme:
Gli use ase analizzati sono quelli ri hiesti dal tutore aziendale, sono stati testati sia in ambiente teori o (su RTPLC SIMU) sia in ambiente reale (su RTPLC ULISSE), dandomi la possibilità di notare use ase parti olari e situazioni an ora non gestite. L'appli azione segue le ri hieste del progetto, riportando sempre la ma
hina ad uno stato di quies enza e segnalando all'RTPLC i messaggi di informazione. 2.3
Periferi he fornite da utilizzare
Per l'eettivo funzionamento dell'appli azione in un ambiente reale, si devono utilizzare al une periferi he hardware ne essarie per la rilevazione dei tag e per la gestione degli ingressi/us ite. Le periferi he fornite si sono rivelate molto utili per testare il progetto in rapporto a un utente reale, dando la possibilità di reare stati di utilizzo più simili all'ambiente in ui dovrà essere impiegato. L'azienda ha messo a disposizione tutte le periferi he ne essarie : la piattaforma ULISSE è una delle implementazioni del progetto RTPLC, ompleta di hardware basato su Advan ed RISC Ma hine 9 (ARM9) on sistema operativo windows CE .NET 5.0.
Una ma
hina RTPLC ULISSE:
il proto ollo CAN onsente di ontrollare no a 63 dispositivi
ompatibili DS401(ingresso/us ita). Vi sono state ollegate le due foto ellule ome ingressi il i alino e due possibili led ome us ite. Il dispositivo CAN per assi urare il funzionamento ri hiesto dall'appli azione è stato ongurato on un bit-rate di 1Mb/s e 3 dispositivi ollegati.
Proto ollo CANopen:
il lettore RFID fornito è ompatibile on tutti i transponder RFID TI LF e HF. Rileva Tag RFID a una distanza di 10 m.
RFID:
Foto ellule: Ci alino:
le foto ellule fornite sono 2 foto ellule laser on riettore.
pi
olo avvisatore a usti o he emette un suono stridulo.
È utile approfondire il funzionamento del lettore RFID e il reader utilizzato per il progetto, per apire il funzionamento dell'appli azione all'interno della ma
hina ULISSE.
14
Figura 2.1: RTPLC-SIMU
RTPLC RTPLC è il progetto ISAC per la serie di prodotti Programmable Automation Controller (PAC), ovvero un PLC apa e di funzionalità avanzate di omuni azione ed integrazione
on attori software o umani. RTPLC onsente l'ese uzione di una logi a programmabile dal liente Original Equipment Manufa turer (OEM) al ne di ontrollare lo stato delle omponenti si he di us ita. Tali omponenti si he sono di varia natura, possono essere ollegate all'unità entrale in modi molto diversi tra di loro, e la loro gestione è a ari o del software di base. L'ese uzione delle omponenti riti he, ompresa la legge di ontrollo del liente, viene eettuata on tempi erti, ovvero lo stesso usso del programma viene eseguito sempre nello stesso tempo. RTPLC può essere usato in ontesti variegati grazie alla sua estrema essibilità. È stato progettato per poter essere fa ilmente programmabile e per rendere la legge di ontrollo indipendente dalla natura delle omponenti si he di ingresso ed us ita. Le implementazioni del RTPLC sono i vari prodotti dell'azienda distinti per prestazioni e hardware utilizzato (RTPLC-SIMU Figura: 2.1) Ogni implementazione è ostituita da una parte hardware e una parte software. La
omponente software è rappresentata dal framework: questo rea un ambiente di ese uzione multithread omogeneo e astratto dall'hardware, al ne di eseguire in tempi erti la legge di ontrollo implementata, in modo da poter gestire tutti gli ingressi, le us ite, i proto olli di manutenzione e di omuni azione ne essari allo sviluppo dell'appli azione ri hiesta (puo' essere implementata in C). Questa omponente è ontenuta in moduli PLC ari ati su omando dal framework, he provvede a veri are l'esistenza delle risorse ri hieste per l'ese uzione, e quindi, ad eseguire tale legge. Nel aso sia ne essario, il framework aumenta le sue possibilità in ludendo gli opt15
mod (pre edentemente installati sulla ma
hina), ioè moduli opzionali indipendenti dal framework, he interagis ono strettamente on esso, aggiungendo apa ità parti olari. Per il progetto è stato ne essario installare l'OMCOM e l'OMFILE; il primo è un optmod
he onsente la omuni azione on una porta seriale dando la possibilità di leggere dati e inviarne, il se ondo onsente la gestione dei le fornendo tutte le funzioni ne essarie per la loro lettura e s rittura.
16
Capitolo 3 Analisi 3.1 Gli
Use Case
use ase
rilevati sono stati analizzati per poter essere ri reati all'interno dell'appli-
azione e per essere gestiti ompletamente garantendo la stabilità dell'appli azione. Ho
use ase di default (entrata e us ita), situazioni di normalità in ui la ma
hina si può trovare, dagli use ase parti olari (allarmi), situazioni parti olari he ne essitano di attenzione da parte dell'utente. Analizzo prima gli use ase di default. distinto gli
17
attori Utente pre ondizioni tutti i dispositivi sono funzionanti il transponder ritorna sempre un valore per l'identi ativo svolgimento l'utente e munito di transponder e attiva il lettore RFID
aso
aso
aso
il lettore RFID dopo assere stato interrogato dal sistema fornis e l'identi ativo rilevato il sistema ontrolla la presenza dell'indenti ativo tra quelli ari ati su variabili globali non presente tra le variabili globali: il sistema rilegge il le DataBase per aggiornare la a he
aso è presente nel resto del le il sistema ari a il nuovo identi ativo su una delle variabili globali il sistema segnala la veri a dell'identi ativo e es e dalla funzione l'identi ativo veri ato nel db e presente: il sistema si pone in attesa dell'attivazione della foto ellula1 la foto ellula1 viene impegnata
aso la foto ellula2 viene impegnata viene registrato l'ingresso sulla lista degli ultimi 5 ingressi viene generato un messaggio di informazione
aso la foto ellula2 non viene impegnata il sistema mantiene in memoria l'avvenuta autorizzazione la foto ellula1 non viene impegnata il sistema ignora l'autorizzazione L'identi ativo non è stato veri ato: la foto ellula1 viene impegnata il sistema rileva la man ata autorizzazione il sistema attiva l'allarme ingresso non autorizzato
Tabella 3.1: Diagramma use ase default::ENTRATA (Figura:3.1)
18
Figura 3.1: use ase
19
attori Utente pre ondizioni tutti i dispositivi sono funzionanti svolgimento la foto ellula2 viene impegnata dall'utente il sistema veri a se la foto ellula1 è già stata impegnata
aso la foto ellula1 è stata impegnata: si passa al aso d'uso di entrata
aso la foto ellula1 non è stata impegnata:
viene segnalata l'avvenuta us ita dell'utente il sistema interroga il lettore RFID per una eventuale lettura del transponder viene rilevato il transponder: l'utente è tra gli ultimi inque entrati non viene rilevato il transponder: il sistema ignora il risultato della seriale il sistema segnala l'us ita utente
aso
aso
Tabella 3.2: Diagramma use ase default::USCITA (Figura:3.1)
VERIFICA DATA BASE
Il sistema utilizza una a he ari ata all'avvio del programma, omposta da i primi 5 nominativi presenti su le. Nel aso il tag rilevato non appartenga ai nominativi in
a he, il sistema a
ede al le direttamente ontrollando se è presente tra gli eventuali rimanenti nominativi presenti sul le. Analizzo adesso i asi e
ezionali: gli allarmi he la routine_allarme deve gestire, sono allarmi dovuti sia a malfunzionamenti delle periferi he hardware, sia ad a
essi non autorizzati, sia allarmi attivati dall'utente manualmente: • a
esso non autorizzato • attivazione simultanea delle foto ellule • possibile guasto foto ellula1 • possibile guasto foto ellula2 • possibile guasto lettore RFID • manuale
La gestione degli allarmi garantis e la si urezza del magazzino eliminando la possibilità di interventi, tramite interfa
ia, nel aso di a
essi non autorizzati.
20
attori sistema, utente pre ondizionil'utente può attivare solo l'allarme manuale; svolgimento
Tabella 3.3: (Figura:3.2)
l'attivazione dell'allarme prevede una distinzione tra le ause di attivazione. il sistema rileva la ausa dell'attivazione dell'allarme il sistema genera un messaggio di allarme ri hiama la routine di gestione allarme Diagramma use ase e
ezionali::ATTIVAZIONE
Figura 3.2: use ase 21
ALLARME
Figura 3.3: use ase
22
attori pre ondizioni svolgimento
aso
aso
utente la ma
hina è sempre in allarme allarme diverso da man ata autorizzazione: l'utente utilizza il tasto di reset della ma
hina la ma
hina torna ad uno stato onsistente viene tolto il messaggio di allarme allarme man ata autorizzazione: l'utente utilizza il proprio transponder per farsi identi are dalla ma
hina
aso il transponder rilevato dal lettore di RFID è autorizzato: la ma
hina torna ad uno stato onsistente viene tolto il messaggio di allarme
aso il transponder rilevato dal lettore di RFID non è autorizzato la ma
hina rimane in uno stato di allarme:
Tabella 3.4: Diagramma use ase e
ezionali::GESTIONE 3.2
ALLARME
(Figura:3.3)
Diagrammi di sequenza
Passiamo adesso all'analisi delle interazioni tra routine e attore e vi eversa. I diagrammi di sequenza studiati hanno fa ilitato la omprensione delle interazioni tra le routine favorendo la stesura del odi e. Il primo diagramma rappresenta l'ingresso alla struttura Figura:3.4. INGRESSO: Il sistema veri a ogni 100 iterazioni, se il lettore RFID ha rilevato un tag nell'area di azione; nel aso sia stato rilevato un tag, il sistema veri a l'autorizzazione dell'identi ativo rilevato e restituis e true, se l'identi ativo è presente nella lista del personale autorizzato, e false, se non vi risulta. Il se ondo diagramma rappresenta l'us ita dalla struttura Figura:3.5 USCITA: Il sistema rileva l'attivazione della foto ellula 2 e veri a l'avvenuta attivazione della foto ellula 1 per distinguere lo stato di us ita. Nel aso la foto ellula 1 non sia stata attivata pre edentemente, segnala lo stato di us ita dell'utente e ri hiede la lettura del tag per l'aggiornamento della lista delle presenze.
23
Figura 3.4: Diagramma di sequenza entrata
24
Figura 3.5: Diagramma di sequenza us ita
25
Figura 3.6: Diagramma di sequenza generale
Progettazione si a (Distanza minima tra le foto ellule) Ipotizzando he l'utente vada a 10km/h e he il tempo di rilevazione sia di 20mse , si dedu e he la distanza minima tra le due foto ellule sia di 5,6 m. Bisogna naturalmente tenere di onto an he dello spessore di una persona media, 30 m, he deve essere aggiunto alla distanza delle foto ellule. Figura:3.6
26
Figura 3.7: Diagramma di attività 1 3.3
Diagrammi di attività
Controllo1 (transponder): Il sistema deve inviare una ri hiesta di informazioni alla porta seriale del dispositivo di lettura RFID per poter ri evere informazioni dal lettore. Appena inviata la ri hiesta, ri eve le informazioni dal lettore sui tag interni all'area di lavoro di sua ompetenza, e veri a la validità dell'identi ativo rilevato, utilizzando una a he ontenente i primi 5 identi ativi autorizzati. Nel aso in ui non sia presente tra gli identi ativi in
a he, viene ri er ato nel le ban a dati, se viene trovato, la a he aggiorna tramite rimpiazzamento; nel aso ontrario, il sistema segnala la man ata autorizzazione. Appena viene salvato l'identi ativo rilevato, il lettore RFID viene reimpostato sull' attesa di una nuova ri hiesta di lettura. Il lettore RFID legge sempre un risultato: nel
aso ri eva informazioni da un tag, ritorna l'identi ativo letto, nel aso non ri eva al una informazione, ritorna un identi ativo nullo (una parola on lunghezza 0). Il ontrollo1 non prevede l'attivazione dell'allarme in quanto l'utente non è entrato si amente nella 27
Figura 3.8: Diagramma di attività 2 struttura, ma vi si è solo avvi inato. Figura:3.7 Controllo2 (foto ellula1): Il sistema deve rilevare lo stato della foto ellula1: nel aso questa risulti impegnata, veri a il risultato del ontrollo di autorizzazione eettuato sull'eventuale tag rilevata dal lettore RFID (non è detto he l'utente he è entrato sia in possesso di un tag). Nel
aso non sia stato ri evuto un tag, o il tag ri evuto dal lettore RFID non sia valido per l'ingresso, il sistema attiva l'allarme di man ata identi azione, noti ando sulla interfa
ia l'errore ris ontrato e osa fare per fermare l'allarme, la foto ellula1 entra in attesa della gestione allarme.L'attività di gestione allarme si preo
upa di attendere la lettura del tag di un membro autorizzato. Nel aso sia stato ri evuto un tag valido per l'a
esso alla struttura, il sistema segnala l'eettivo passaggio dell'utente davanti alla prima foto ellula. In seguito, se la foto ellula2 risulta essere stata impegnata, il sistema segnala sull'interfa
ia l'eettivo ingresso nella struttura e visualizza il nome dell'utente nella lista degli ultimi 5 utenti entrati all'interno della struttura. Figura:3.8 28
Figura 3.9: Diagramma di attività 3
29
Controllo3 (foto ellula2): Il sistema deve rilevare lo stato della foto ellula2, nel aso risulti impegnata veri a l'impegno della foto ellula1; se la foto ellula1 è impegnata, il sistema attiva l'allarme di impegno simultaneo delle foto ellule. L'Attività di gestione allarme segnala l'errore ris ontrato e attende la liberazione delle due foto ellule o il reset della ma
hina (nel
aso dopo la ne del reset le foto ellule risultino an ora impegnate, s atta nuovamente l'allarme). Se la foto ellula1 risulta essere già stata impegnata prima della foto ellula2 (siamo nel aso di entrata nella struttura), il sistema torna in fase di attesa segnalando l'ingresso di un utente nella struttura. Figura:3.9. Nel aso ontrario, il sistema mantiene l'informazione di avvenuto impegno della foto ellula2, segnalando he un utente sta per us ire dalla struttura.
30
Capitolo 4 La Soluzione 4.1
Strutturazione del progetto
Il progetto è stato sviluppato su Visual Studio 2005 Professional ampliato on un'add-in, sviluppata dall'azienda. Questo intende fa ilitare la reazione dei moduli PLC tramite zone dell'interfa
ia utente reate per la visualizzazione hiara e intuitiva della struttura del progetto e delle variabili utilizzate. L'add-in installato rea, in modo automati o, i le prin ipali he devono essere implementati (denition.h, denition. , main. , timer. , nel progetto solo denition.h e definition. sono stati implementati, poi hé gli altri due non erano utili ai ni del progetto) dando in seguito la possibilità di reare subroutine ome funzioni aggiuntive del main. I le iniziali he devono essere implementati sono le di denizioni di sinonimi, i sinonimi spe i ati sono visibili in tutto il progetto. All'interno del le denition.h sono indi ati gli optmod da in ludere nel progetto: #pragma on e //:OPT_MOD_BEGIN #in lude "om om.h" //:OPT_MOD_END #in lude "om om.h"
//Optmod per la lettura della seriale
#in lude "omfile.h" //Optmod per la gestione dei file #in lude "..\messages.h" // Messages definitions #pragma pa k (push) #pragma pa k (4)
Gli optmod in lusi nel denition.h garantis ono la possibilità di utilizzare funzioni spe i he per la gestione di periferi he ( in questo aso la porta seriale) e l'utilizzo dei le. 31
Per essere utilizzati gli optmod devono essere stati installati pre edentemente in modo da ampliare il framework on funzionalità aggiuntive. Viene in luso, insieme agli optmod, il le message.h, he da modo di utilizzare i messaggi di informazione visualizzabili sull'implementazione SIMU. In seguito viene spe i ata la lista dei sinonimi o variabili globali utilizzate nel progetto all'interno del le; segue questa sintassi: //:RTPLC_SYNONYMDEF_BEGIN __DEFINE ULONG statusSeriale ; . . //:RTPLC_SYNONYMDEF_END
I sinonimi he ho utilizzato nel progetto sono tutti volatili, quindi alla hiusura dell'appli azione (quando viene s ari ato il PLC) non rimangono in memoria. In quanto variabili globali vengono usate per mantenere in memoria i risultati raggiunti dalle varie routine e per renderli a
essibili a tutte le routine e funzioni, durante il tempo di ese uzione. La lista delle funzione denite nel progetto e il loro header si trova an he essa nel le denition.h: //:RTPLC_EVENTDEF_BEGIN void RTPLC_ROUTINE routineMain(LPVOID data); . . //:RTPLC_EVENTDEF_END //:RTPLC_PROXYFUNC_BEGIN void __inline proxy_routine_allarme(ULONG type) { RTPLC_VARIANT param[1℄; param[0℄.vt = RTPLC_FORMAT_UINT32; param[0℄.value.ul = type; invokeFun (_T("routine_allarme"), param,1, NULL); } . //:RTPLC_PROXYFUNC_END
Le funzioni rendono più modulare il progetto dando la possibilità di eettuare modi he in modo rapido e omprendere meglio la struttura dell'appli azione. Sarebbe possibile denire strutture per oggetti omplessi, per quanto queste non siano state attuabili nel progetto presente data l'assenza di strutture tali da ontenere stringhe. All'interno del le denition. sono deniti e des ritti tutti i omponenti di denition.h, vengono indi ate le librerie base per la ompilazione, rtpl .h, e di seguito vi è la lista delle denizioni dove viene asso iato un tipo più spe i o alle variabili globali. Qui si indi a se sono volatili e, in questo aso, vengono an ellate ogni volta he il PLC viene s ari ato dall'RTPLC, oppure retentive, e quindi rimangono in memoria an he dopo aver s ari ato il PLC. 32
Le variabili vengono inizializzate ad un valore indi ato alla reazione da add-in e, se inserita, viene asso iata una des rizione data dallo sviluppatore, di modo da rendere sempli e l'identi azione della variabile e la sua funzione: RTPLC_SYNONYM_VOLATILE_ULONG(statusSeriale,"<des rizione>",0,RTPLC_ACCESS_INPUT)
Nella denizione delle variabili vi è il ampo a
esso he indi a in he direzione si può a
edere alla variabile: input, output, i/o. Dopo la lista delle denizioni delle variabili, vengono des ritte le funzioni implementate nel progetto, spe i ando gli argomenti e i valori di ritorno. Le routine sono di hiarate nella lista routine e vengono identi ate on tag quali RTPLC_MAIN, he spe i ano il tipo di routine implementata, e la priorità rispetto alle altre routine. //:RTPLC_FUNCTION_IO_BEGIN RTPLC_FUNCTION_IO_BEGIN(routine_allarme) RTPLC_FUNCTION_PARAM(type, RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_END(routine_allarme,RTPLC_FORMAT_VOID) . . //:RTPLC_FUNCTION_IO_END //:RTPLC_ROUTINE_BEGIN RTPLC_MAIN(RTPLC_PRIORITY_NORMAL, routine_main) . . //:RTPLC_ROUTINE_END
Il progetto è stato sviluppato su due sottoprogetti: ISACPLC1, RSDLL. All'interno del primo progetto sono spe i ate tutte le routine e le funzioni he sviluppano il funzionamento eettivo dell'appli azione e la gestione degli use ase; all'interno del se ondo progetto sono sviluppate le risorse impiegate per la reazione e lo sviluppo dei messaggi di informazione e di allarme he devono essere visualizzate dall'RTPLC_SIMU per indi are gli eventi. Con la ompilazione di questo progetto viene reato il le message.h e viene aggiornato ogni volta he il progetto RSDLL viene modi ato e ri ompilato. ISACPLC1 è ostituito da 2 le di libreria, denition.h e message.h, e da 8 le di
ui due sono di risorse, routineInit. routineMain. e sei di funzioni routine_reset. routine_leggiDB. routine_leggiSeriale. routine_ ontrolUs ito. routine_aggiornaDB. routine_allarme. , ed il le denition. .
33
4.2
Funzionalità routine
Le routine sviluppate nel progetto implementano funzionalità spe i he per garantire la modularità . Analizziamo le funzionalità delle routine singolarmente, in modo da avere un quadro più hiaro dell'utilizzo he ne viene fatto all'interno del progetto. RoutineInit:
Si o
upa di inizializzare a valori nulli o 1 tutte le variabili globali he vengono utilizzate nel progetto, per avere la si urezza he abbiano valori erti e s elti dallo sviluppatore. Viene hiamata una sola volta dal framework stesso, appena viene
ari ato il PLC. Per assi urarsi he venga mandata in ese uzione non appena ari ato viene, di hiarato all'interno del le denition. ome : //definition. RTPLC_ONINIT(RTPLC_PRIORITY_NORMAL, routine_init)
È implementata on un solo stato in modo he sia una routine leggera da eseguire. RoutineMain:
È la routine prin ipale strutturata in vari stati gestiti on uno swit h omandato da una variabile intera he identi a lo stato in ui i troviamo. Alla prima iterazione, la routineMain manda in ese uzione la lettura del data base, ri hiamando la funzione routine_leggiDB he prepara la a he per l'autorizzazione velo e. In seguito, la routine si o
upa di leggere la seriale ogni 100 iterazioni, ri hiamando la funzione routine_leggiSeriale, e ontrollando ad ogni iterazione lo stato delle periferi he. Questa routine è implementata, an hé gestis a ogni situazione basandosi sui valori di ritorno delle periferi he e dando la possibilità all'utente di interagire direttamente tramite ontrolli sull'interfa
ia. //definition. RTPLC_MAIN(RTPLC_PRIORITY_NORMAL, routine_main)
Viene osì ri onos iuta dal Framework ome routine prin ipale del PLC (routine da eseguire sempre ad ogni iterazione). Routine_reset:
Funzione ri hiamata da omando utente diretto ed utilizzata dalla routineMain per riportare tutti i valori delle variabili globali ad assumere i valori iniziali. 34
Ristabilis e uno stato onsistente del programma. Può essere usata dall'utente per us ire da uno stato di allarme della ma
hina o per azzerare tutte le variabili per sua ne essità. //definition. RTPLC_FUNCTION(routine_reset, routine_reset)
Routine_leggiDB:
Funzione di inizializzazione della a he del PLC strutturata in vari stati di ese uzione gestiti da uno swit h. Viene hiamato dalla routineMain alla prima iterazione. Cari a le prime inque righe dal le database.txt presente nella artella usertar, e vengono ari ate sulle variabili idX e nomeX di tipo RTPLC_VARIANT. Nel aso di reset della ma
hina non vengono annullati gli identi ativi ari ati, rimangono in memoria n quando il PLC rimane ari ato. //definition. RTPLC_FUNCTION(routine_leggiDB, routine_leggiDB)
Routine_leggiSeriale:
Funzione di lettura della seriale di omuni azione on il lettore RFID. Strutturata a stati e gestita on uno swit h su una variabile di stato. Si interfa
ia sulla porta seriale ri hiedendo, se è stato letto, l'identi ativo e gestis e l'autorizzazione dell'utente ris ontrando alla routineMain se vi sono utenti vi ini e se sono autorizzati ad entrare. //definition. RTPLC_FUNCTION(routine_leggiSeriale, routine_leggiSeriale)
Routine_ ontrolUs ito:
Funzione di eliminazione utente in us ita, identi ato dal lettore RFID, dall'elen o ultimi 5 utenti entrati nella struttura. Ri er a tra gli ultimi 5 utenti he hanno eettuato l'ingresso nella struttura se vi è l'utente in us ita, nel aso vi sia, lo an ella dalla lista dei presenti evitandone la visualizzazione sull'interfa
ia. //definition. RTPLC_FUNCTION(routine_ ontrolUs ito,routine_ ontrolUs ito)
35
Routine_aggiornaDB:
Funzione di aggiornamento a he nel aso di rilevazione utente non presente in a he ma presente sul le. Sviluppa il me
anismo di rimpiazzamento di un identi ativo non an ora utilizzato, ma presente in a he, on un identi ativo appena rilevato dal lettore RFID e presente sul le database.txt ma non sulla a he. Mantiene sempre aggiornata la a he basandosi sugli utenti entrati e sostituendo gli utenti he non hanno eettuato l'ingresso. //definition. RTPLC_FUNCTION(routine_aggiornaDB, routine_aggiornaDB)
Routine_allarme:
Funzione di attuazione e gestione di tutti gli allarmi, viene hiamata dalla routineMain non appena viene rilevato uno stato di allarme della ma
hina. Gli stati interni della funzione identi ano i vari allarmi he la funzione può gestire. Si o
upa di omporre il messaggio da visualizzare sul monitor e di attendere lo s adere del timeout in aso di us ita automati a da allarme. //definition. RTPLC_FUNCTION(routine_allarme, routine_allarme) 4.3
Struttura interna delle routine
La struttura delle routine e delle funzioni segue uno s hema di implementazione a stati su
essivi propri di una ese uzione su una ma
hina on apa ità di elaborazione limitata. L'RTPLC ULISSE, essendo basato su ARM9, impiegherebbe troppo tempo per eseguire un odi e uni o e ontinuo on molte elaborazioni interne. La struttura a stati, assi ura un'elaborazione velo e di ogni stato e in totale l'ese uzione ompleta di ogni operazione, an he se sviluppata in più stati. Nel progetto si possono distinguere due modelli di strutturazione utilizzati: il primo modello, appli ato sulle routine/funzioni on istruzioni sempli i, prevede l'utilizzo di un solo stato in modo da essere eseguito una sola volta e svolgere la funzione ri hiesta in una sola iterazione. Il se ondo modello, appli ato a routine/funzioni on istruzioni omplesse, utilizza una struttura modulare a più stati onse utivi, per le routine he devono gestire molte situazioni una dopo l'altra, o a stati indipendenti, per le routine he mantengono lo stesso stato ogni volta he vengono ri hiamate. Appartengono al primo modello di implementazione la routineInit e le funzioni routine_reset e ruotine_allarme: entrambe hanno un'ese uzione immediata e sempli e. Nel
aso di blo
o di queste routine/funzioni non viene ausata al una perdita e lo stato rimane onsistente. 36
Appartengono al se ondo modello le routine e funzioni, he ri hiedono l'elaborazione di istruzioni omplesse, he ri hiedono più stati per assi urare l'elaborazione orretta dell'istruzione. Questa loro strutturazione rende queste funzioni e routine non di ese uzione immediata per un pro essore embedded. Con istruzioni omplesse possiamo indi are la lettura di una porta seriale, l'a
esso ad un le, la hiusura di un le, la s rittura su più variabili, operazioni he ri hiedono tempi hardware non erti, e he non possono essere interrotte. Ogni routine e funzione utilizza delle variabili numeri he, per rappresentare lo stato di ese uzione in ui si trova, gestite da uno swit h he implementa il passaggio allo stato ri hiesto dall'elaborazione. La routineMain è omposta da 5 stati he gestis ono i vari use ase basandosi sui valori assunti dalle periferi he durante l'ese uzione pre edente. Non appena lo stato di una periferi a varia, la routine asso ia alla propria variabile di stato il valore degli use
ase in ui si trova, in modo da avviare la gestione del aso d'uso all'iterazione su
essiva. Nel aso in ui le variabili, he identi ano lo stato delle periferi he, siano tutti ai valori di inizializzazione, si rimane sempre sullo stato 0 (stato di attesa della routineMain). Si notano, all'interno dell'insieme delle routine/funzioni a più stati, distinzioni he
reano due eettivi sottotipi di routine/funzioni: quelle a stati onse utivi, e quelle a stati non onse utivi. Le prime sono routine he ri hiedono l'ese uzione di tutti( o quasi) gli stati in ordine res ente per far si he l'operazione ri hiesta venga eseguita interamente e
orrettamente; le se onde non ne essitano di un'ese uzione in un qual he ordine stabilito, da momento he il passaggio di stato, essendo dovuto a situazioni ambientali, non può essere predi ibile. Le funzioni routine_leggiDB routine_leggiSeriale e routine_aggiornaDB sono routine/funzioni a stati onse utivi, poi hé è ne essario eseguirli tutti in un ordine prestabilito per essere si uri he il sistema esegua orrettamente la funzione. 4.4
Gestione delle interazioni tra routine
Per gestire l'ese uzione di funzioni a stati onse utivi, è ne essario utilizzare degli a
orgimenti he assi urino l'ese uzione della funzione no al termine eettivo dell'operazione ri hiesta. In questo modo è garantita la stabilità del sistema e la orrettezza degli a
essi a le e a porte seriali. Le funzioni a stati onse utivi ritornano un valore di elaborazione he indi a alla routine hiamante, se la funzione ha terminato la sua ese uzione, o se ne essiti di ulteriori iterazioni per on ludersi. Gli stessi a
orgimenti vengono utilizzati per l'ese uzione di operazioni omplesse he ne essitano più iterazioni (quindi mantenendo la funzione sullo stesso stato) per essere eseguite. La routine he ri hiama l'ese uzione della funzione, a se onda se è una funzione a stati omplessa o una funzione a un solo stato, si preo
upa di ontrollare he la funzione venga eseguita on su
esso no al termine. Nel aso di ese uzione di funzioni a più stati ed operazioni omplesse, quindi non eseguibili in una sola iterazione, è stato utilizzato un ontrollo sulla variabile di ritorno della funzione interessata. Si utilizza 1 per indi are he la funzione non è an ora terminata
37
0 per indi are he è stata terminata on su
esso. Possiamo vederlo nella routineMain nel hiamare la funzione routine_leggiDB: ret=proxy_routine_leggiDB();// hiamata funzione //1. lettura DB effettuata on su
esso if(ret==0) inizio=0; else //2. lettura DB in ese uzione if(ret==OMCS_WAIT) inizio=1; else //3. lettura DB errore if(ret<-1) { type=3; allarm((USHORT) AL_SCOLLEGATO);//ri hiesta reazione messaggio d'allarme proxy_routine_allarme(type); }
La variabile di ritorno della funzione è rappresentata dalla variabile ret ed indi a alla routineMain se è stata terminata la lettura del database o se an ora è ne essario eseguire altre iterazioni della funzione. In questo modo vi è la si urezza he le operazioni ri hieste alla ma
hina siano eseguite orrettamente in più iterazioni e mantenendo uno stato onsistente. Nel aso di funzioni a un solo stato o a più stati ma non onse utivi, non viene eettuato al un ontrollo simile: proxy_routine_allarme(type);
In questo aso le routine/funzioni eseguono po he e sempli i operazioni e il sistema non deve fare più iterazioni per assi urarsi he l'ese uzione sia on lusa. È utile sottolineare he le funzioni non possono ri hiamare routine ma possono ri hiamare le altre funzioni in un qualsiasi momento.
38
Capitolo 5 Implementazione 5.1
S elte implementative
Le s elte implementative su ui ho basato lo sviluppo del progetto, mirano a migliorare le prestazioni della ma
hina eseguendo operazioni sempli i e in numero minimo per ogni iterazione. Ho de iso di dividere il progetto in 2 sole routine eettive e 7 funzioni, al ne di reare una modularità interna, per sempli are eventuali modi he al odi e e aumentarene la omprensione. È solamente ne essario sostituire la funzione per avere una modi a delle operazioni, rispettando, però, i vin oli sui parametri di ritorno per gestire l'ese uzione della funzione da parte della routine hiamante. Ogni routine e funzione gestis e la propria variabile di stato internamente, di modo da non avere ambi di stato non gestiti o non previsti eettuati da routine/funzioni esterne. Ho s elto una gestione interna an he per fa ilitare la modi a della variabile stato senza la ne essità di ontrollare le altre routine/funzioni. Solo la routineInit e la funzione routine_reset modi ano il valore degli stati delle altre routine e funzioni, portandoli a un valore iniziale onos iuto e stabile. Ogni routine/funzione a più stati è sviluppata su swit h per reare una struttura a stati sempli e, he permetta di evitare l'ese uzione di parti di odi e non ne essarie per la gestione della situazione rilevata dalla ma
hina. Le routine e le funzioni in ese uzione, risultano di po he righe di odi e, garantendo una velo ità di ese uzione maggiore. La routineMain gestis e molti ontrolli per limitare l'ese uzione di parti non ne essarie al orretto svolgimento dell'appli azione. Le variabili di ontrollo utilizzate dalla routine sono 3 : la variabile inizio, segnala se siamo alla prima iterazione (1 prima iterazione 0 altrimenti); la variabile allarme, segnala se è stato messo in ese uzione un allarme; la variabile reset, segnala se siamo in stato reset. Queste variabili permettono alla routine di saltare parti di odi e he in situazioni parti olari ome l'allarme e il reset non devono essere eseguite, e allo stesso modo, permettono di de idere quando è ne essario eseguire parti di odi e parti olare, ome l'inizializzazione. Le variabili di ontrollo permettono alla routineMain di ottimizzare la propria ese uzione e gestire situazioni solo se realmente presenti. Dal momento he l'appli azione risultava e
essivamente velo e, ho inserito all'interno del progetto, hiamate alla funzione sleep. Nella funzione routine_aggiornaDB è stato ne essario gestire il i lo di lettura utilizzando due status separati (lo status 1 e lo status 2), senza ostruzioni parti olari, in modo da avere la ertezza he non vi fossero la 39
reazione di loop dispendiosi per la ma
hina e he potessero rallentare l'ese uzione dell'appli azione. Ho reato le variabili lo ali all'interno dei blo
hi di interesse, osì he la memoria venga ripulita dalle variabili non globali, ad ogni us ita di blo
o, e le variabili non vengano reate, se non devono essere si uramente utilizzate dall'appli azione.
5.2
Sviluppo ontrolli
Il progetto, basandosi sul passaggio di stato delle periferi he, gestis e un ontrollo per ognuna di esse, di modo da avere un quadro sempre aggioranto di tutti i dispositivi e rappresentare, nel modo più fedele, la realtà he lo ir onda. La gestione dei ontrolli sulle periferi he (tranne la porta seriale) è interamente sviluppata nella routineMain, i ontrolli sono rappresentati mediante variabili di stato per distinguere le varie situazioni real time reate nell'ambiente. Le periferi he rappresentate e gestite dalla routineMain sono le foto ellule, il i alino, i led. Per sviluppare i ontrolli dei led e del i alino, sono state impiegate 3 variabili booleane, una per ogni periferi a. Il ontrollo sulle foto ellule è stato sviluppato impiegando le seguenti variabili per ogni foto ellula: isOnX: indi a se la foto ellula è stata attivata di re ente; questa è stata utilizzata per distinguere l'us ita dall'entrata; gfotoX: è posto in rementato di 1 quando la foto ellula è a
esa e inizializzato a 0 quando viene spenta; lo utilizzo per ontrollare he la foto ellula non sia guasta; fotoX: variabile di stato della foto ellula. Grazie a queste variabili sono distinte le situazioni rilevate dalle foto ellule:
//foto1=1 && sear hDB=1 : L'utente autorizzato ha impegnato la foto ellula1; //foto1=1 && sear hDB=0 && isOn2==0 L'utente non autorizzato ha impegnato la foto ellula1 ma non è in us ita; //foto1=1 && sear hDB=0 && isOn2==1 L'utente non autorizzato ha impegnato la foto ellula1 ma è in us ita; //foto1=0 && sear hDB=1 L'utente autorizzato non ha impegnato la foto ellula1; //foto1=0 && sear hDB=0 Non vi sono utenti; //1. foto2=1 && isOn1 == 1 L'utente è in entrata; //2. foto2=1 && isOn1=0 L'utente è in us ita. Le variabili vengono ontrollate ad ogni iterazione per garantire una risposta immediata all'utente. La routine, in base ai valori di queste variabili, distingue le interazione avvenute on l'utente, in quel momento, e s eglie ome gestirle. La gestione del ontrollo della porta seriale, viene eseguita dalla funzione routine_leggiSeriale utilizzando l'optmod om om, he da la possibilità alla funzione di interagire on la periferi a hardware. Il risultato della gestione della periferi a, da parte della funzione, viene segnalato alla routineMain attraverso la variabile sear hDB, variabile booleana ( true se autorizzato false altrimenti).
40
Capitolo 6 Manuale Il sistema deve ontrollare l'a
esso e l'us ita del personale autorizzato dal magazzino, segnalare eventuali a
essi non autorizzati e possibili guasti alle periferi he. Questo manuale vuole indi are all'utente, utilizzatore dell'appli azione, ome interagire on il sistema di ontrollo a
essi, utilizzando l'interfa
ia utente fornita.
6.1 Funzionalità oerte Sono des ritti, di seguito, i tipi di interazione possibili on la ma
hina e i messaggi visualizzati sull'interfa
ia, di modo da omprendere ome reagire alle situazioni he si posso presentare. All'atto dell'a
esso il sistema deve: 1. Rilevare il odi e del transponder dell'utente; 2. Ri er are il odi e all'interno di una ban a dati; 3. Segnalare la possibilità di eettuare il passaggio o meno; 4. Attendere il passaggio davanti alle foto ellule per un tempo nito di se ondi. All'atto dell'us ita il sistema deve: 1. Rilevare lo stato della se onda foto ellula ; 2. Rilevare l'avvenuta us ita ; 3. Rilevare il odi e del transponder (non ne essario per l'us ita); 4. Nel aso di rilevazione del odi e, deve eliminare l'utente dalla lista presenti(ultimi 5 entrati). Il sistema abilita un allarme sonoro e visivo (sul monitor) in aso di: 1. A
esso non autorizzato; 2. Impegno di entrambe le foto ellule ontemporaneamente ; 3. Impegno ontinuo di una delle due foto ellule (eventuale guasto alle foto ellule); 4. Azionamento allarme manuale. 41
6.2
Presentazione interfa
ia
Mediante l'interfa
ia utente è possibile interagire on la ma
hina, leggendo i messaggi di stato visualizzati, abilitando l'allarme manuale, ri hiedendo il reset del sistema. La grandezza dell'interfa
ia è basata sulla grandezza del monitor dell' ULISSE per garantire una visualizzazione ottimale per il monitor fornito. Sull'interfa
ia sono visualizzati, partendo da in basso a destra dello s hermo: un led RFID, indi a se il tag rilevato è autorizzato all'ingresso, (verde se è autorizzato, rosso se non è autorizzato); un led foto ellula 2, indi a se la foto ellula 2 è impegnata o meno, (verde se è impegnata, rossa se è libera); un led foto ellula 1, indi a se la foto ellula 1 è impegnata o meno,(verde se è impegnata rossa se non è impegnata). Nella parte di destra dell'interfa
ia partendo dall'alto viene visualizzato: l'orologio sin ronizzato on quello della ma
hina; lo spazio di visualizzazione dei messaggi di
ontrollo del sistema, all'interno del quale l'interfa
ia visualizza i messaggi di noti a espli ativi della situazione in ui si trova in quel momento la ma
hina; il tasto di reset (resetta lo stato del sistema ma non la a he) e il tasto di allarme (mette in azione l'allarme manuale); gli ultimi 5 utenti he hanno eettuato l'a
esso autorizzato e due led he indi ano lo stato della ma
hina: verde se non sta eseguendo funzioni rosso se le sta eseguendo ( per esempio se è s attato l'allarme). Il funzionamento dell'interfa
ia è assi urato nel aso he sia già stato ari ato il PLC sulla ma
hina.
Disabilitazione degli allarmi:
gli allarmi possono essere disabilitati premendo il tasto reset sull'interfa
ia, oppure attendendo il timeout interno, dopo il quale viene riportato il sistema ad uno stato onsistente. Nel aso di guasti, il sistema eettua il reset on su
esso, solamente se il guasto rilevato è stato eliminato. L'allarme di man ata autorizzazione è l'uni o allarme he non può essere disabilitato resettando la ma
hina, in quanto ne essita la lettura di un tag autorizzato per terminare e riportare la ma
hina a uno stato onsistente. 6.3
Uso dell'interfa
ia utente
Avvio della ma
hina: All'avvio della ma
hina il sistema si presenta in una fase iniziale in ui tutti i parametri sono inizializzati a un valore di default (Figura:6.1). La ma
hina si pone in attesa di rilevare ambiamenti di stato da parte delle periferi he ollegate.
Autenti azione: Non appena un tag entra nel raggio si azione del lettore RFID, viene ontrollata la presenza del tag tra gli autorizzati all'a
esso alla struttura. Nel aso il tag risulti autorizzato ad a
edere, il sistema visualizza un messaggio di informazione sull'interfa
ia (Figura: 6.2). Non appena il sistema rileva l'autenti azione, si pone in attesa sulla foto ellula 1 per la rilevazione del passaggio dell'utente. 42
Figura 6.1: S hermata inziale
Figura 6.2: S hermata attesa
43
Figura 6.3: S hermata man ato passaggio
Figura 6.4: S hermata impegno foto ellula1 Attesa passaggio:
Nel aso s atti il timeout senza la rilevazione dell'impegno della foto ellula 1 da parte dell'utente, il sistema avverte, tramite interfa
ia, del man ato a
esso e eettua il reset della variabile di autenti azione (Figura:6.3). Quando questa s hermata viene visualizzata non è piu' possibile eettuare il passaggio. Nel aso l'utente impegni la foto ellula 1, il sistema si pone in attesa sulla foto ellula 2 per registrare l'eettivo passaggio (Figure:6.4, 6.5). Il nome dell'utente he si è autenti ato viene visualizzato in una delle elle della lista dei presenti. Us ita dalla struttura:
Se durante la fase di attesa di lettura di un tag, la ma
hina, rileva l'impegno della foto ellula2, segnala l'us ita di un utente (Figura:6.6). 44
Figura 6.5: S hermata passaggio eettuato
Figura 6.6: S hermata us ita utente
45
Figura 6.7: S hermata di reset
Figura 6.8: S hermata allarme manuale Quando viene impegnata an he la foto ellula1, il sistema legge dal lettore RFID, se è stato rilevato un tag. Nel aso sia stato rilevato, elimina il tag dalla lista degli ultimi 5 entrati. Reset della ma
hina:
Se viene premuto il tasto di reset dell'interfa
ia il sistema riporta ai valori iniziali tutte le variabili. Questo è visibile sull'interfa
ia poi hé tutti i led tornano allo stato iniziale e la lista viene svuotata (Figura:6.7). Allarmi:
L'interfa
ia, in aso di allarme, visualizza il tipo di allarme entrato in funzione, attiva il led rosso sotto il tasto di reset, per indi are lo stato di allarme. L'allarme manuale viene attivato premendo il tasto allarme sull'interfa
ia (Figura:6.8) e può essere disabilitato attivando il reset o attendendo lo s adere del timeout. L'al46
Figura 6.9: S hermata allarme impegno simultaneo delle foto ellule
Figura 6.10: S hermata allarme Foto ellula2 guasta(o impegnata da troppo tempo) larme per eventuali guasti alle foto ellule (Figure:6.9 e 6.10) viene attivato dal sistema, si disabilita automati amente dopo il disimpegno delle foto ellule o premendo il tasto di reset. L'allarme di man ata autenti azione (Figura:6.11) viene disabilitato mediante la lettura di un tag autorizzato. Nel aso venga premuto il tasto di reset, l'interfa
ia visualizza il messaggio di non a
ettazione del omando (Figura:6.12).
47
Figura 6.11: S hermata allarme man ata autenti azione
Figura 6.12: S hermata messaggio blo
o del reset
48
Capitolo 7 Con lusioni e sviluppi futuri Il progetto qui presentato ha avuto lo s opo di reare un prototipo di un sistema di si urezza basato sull'RFID, orendomi la possibilità di un appro
io diretto alle ma
hine hardware. Questo tipo di sistema è già stato sviluppato usando la stessa te nologia, in parti olare per sistemi di a
esso, he, dopo aver ri onos iuto un tag autenti ato, sblo
ano la porta dell'ambiente ontrollato permettendo l'a
esso eettivo. A dierenza di questi, il presente progetto si dierenzia in quanto non ri hiede la presenza di una porta reale, dal momento he le foto ellule svolgono la funzione di var o allarmato. Infatti quando viene identi ato un tag autenti ato, le foto ellule si sblo
ano permettendo l'a
esso. Il prin ipale aspetto positivo di questo tipo di progetto è ostuito dall'assenza di
ontrolli si i, quindi barriere, e dalla onseguente rapidità di ingresso degli attori alla struttura. Un se ondo elemento, inoltre, he rende il sistema parti olarmente interessante nella sua appli azione nelle aziende, è ostituito dal fatto he, la manutenzione del programma e la gestione di questo è estremamente sempli e e non ri hiede la presenza di un esperto informati o. È opportuno però a questo punto mettere in evidenza al uni aspetti he rendono il sistema qui presentato un prototipo da svilluppare ulteriormente. Trattandosi infatti di un sistema di ontrollo a
essi, la si ura identi azione degli attori umani e l'impedimento all'a
esso di persone non autorizzate dovrebbero ostituire una priorità . In realtà la presenza di due sole foto ellule he potrebbero essere evitate e il man ato eettivo ontrollo della identità della persona, he potrebbe usare il tag di qual un'altro, ostituis ono due aspetti an ora un po' arenti e las iano spazio a possibili errori umani (quali ad esempio il possibile smarrimento del tag). Il progetto potrebbe essere ampliato aggiungendo la reazione di un le-log (per la registrazione degli a
essi di modo da poter ontrollare le situazioni arontate dalla ma
hina), l'impiego di 4 foto ellule due a due allineate verti almente ma poste ad altezze diverse (per rendere più omplesso evitarle durante il passaggio). Questi due ampliamenti sarebbero, a mio parere, ne essari per aumentare la si urezza garantita dal sistema. Il sistema qui presentato è stato pensato spe i atamente per il ontrollo degli a
essi a un magazzino all'interno di un'azienda. È possibile tuttavia, una volta sviluppato il prototipo, impiegarlo in u i o in zone addette al personale. Sarebbe possibile an he metterlo per ontrollare hi a
ede al retro di un ban one di servizi (bar, supermer ati) e per ontrollare he nessuno a
eda a appare
hiature, se non il personale addetto.
49
Appendi e A Codi e A.1 denition.h: #pragma #in lude
on e
// :OPT_MOD_BEGIN
"om om . h"
// :OPT_MOD_END
#in lude "om om . h" #in lude " o m f i l e . h" #in lude " . . \ messages . h" #pragma pa k ( push ) #pragma pa k ( 4 )
//
Messages
definitions
// :RTPLC_STRUCT_BEGIN // :RTPLC_STRUCT_END // :RTPLC_SYNONYMDEF_BEGIN
__DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE
ULONG s t a t u s M a i n ; // v a r i a b i l e d i s t a t o d e l l a r o u t i n e M a i n ULONG s t a t u s S e r i a l e ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e l e g g i S e r i a l e ULONG statusLeggiDB ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e l e g g i D B ULONG statusAggiornaDB ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e a g g i o r n a D B ULONG timerT ; // t i m e r s e r i a l e RTPLC_BIT f o t o 1 ; // v a r i a b i l e p e r i f e r i a f o t o e l l u l a 1 RTPLC_BIT f o t o 2 ; // v a r i a b i l e p e r i f e r i a f o t o e l l u l a 2 RTPLC_BIT sear hDB ; // v a r i a b i l e d i a u t o r i z z a z i o n e ULONG s t a t u s A l l a r m e ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e a l l a r m e ULONG type ; // t i p o a l l a r m e ULONG t i m e r A l ; // t i m e o u t a l l a r m e RTPLC_BIT a l l a r m e ; // b o o l e a n a d i o n t r o l l o a l l a r m e RTPLC_BIT l u e V e r d e ; // l e d m a h i n a a t t e s a RTPLC_BIT l u e R o s s a ; // l e d m a h i n a i n a r i a m e n t o / a l l a r m e UCHAR t x B u f f e r [ 9 ℄ ; // b u f f e r d e l l a v a r i a b i l e d i domanda a l l a s e r i a l e UCHAR r x B u f f e r [ 2 0 ℄ ; // b u f f e r d e l l a v a r i a b i l e d i r i s p o s t a d a l l a s e r i a l e RTPLC_BIT isOn1 ; // v a r i a b i l e d i o n t r o l l o a t t i v a z i o n e f o t o e l l u l a 1 ( p a s s a t a ) RTPLC_BIT isOn2 ; // v a r i a b i l e d i o n t r o l l o a t t i v a z i o n e f o t o e l l u l a 2 ( p a s s a t a ) ULONG g f o t o 1 ; // v a r i a b i l e d i o n t r o l l o f u n z i o n a m e n t o f o t o e l l u l a 1 ULONG g f o t o 2 ; // v a r i a b i l e d i o n t r o l l o f u n z i o n a m e n t o f o t o e l l u l a 2 ULONG rxLen ; // l u n g h e z z a r i s p o s t a d e l l a s e r i a l e ULONG f i l e _ h a n d l e [ 1 0 ℄ ; // h a n d l e r d e l f i l e ULONG i [ 5 ℄ ; // u t i l i z z o p o s i z i o n e a h e ULONG i n i z i o ; // v a r i a b i l e d i o n t r o l l o p r i m a i t e r a z i o n e ULONG nId ; // p r i m a p o s i z i o n e l i b e r a d e l l a a h e RTPLC_VARIANT R_openmode ; // m o d a l i t a ' a p e r t u r a f i l e RTPLC_VARIANT f i l e n a m e ; //nome d e l f i l e da a p r i r e / l e g g e r e
50
__DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE
ULONG t i m e r S o s t a ; // t i m e r d i s o s t a d i f r o n t e a l l e f o t o e l l u l e RTPLC_BIT r e s e t ; // v a r i a b i l e d i o n t r o l l o p e r i l r e s e t RTPLC_VARIANT output ; // o u t p u t da v i s u a l i z z a r e ULONG timerA ; // t i m e o u t A l l a r m e RTPLC_DAYTIME O r o l o g i o ; // v a r i a b i l e o r o l o g i o SHORT Ora ; SHORT Minuti ; SHORT s e o n d i ; RTPLC_VARIANT i d 1 ; // o d e p r i m o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT i d 2 ; // o d e s e o n d o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT i d 3 ; // o d e t e r z o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT i d 4 ; // o d e q u a r t o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT i d 5 ; // o d e q u i n t o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT nome1 ; // p r i m o nome u t e n t e d e l l a a h e RTPLC_VARIANT nome2 ; // s e o n d o nome u t e n t e d e l l a a h e RTPLC_VARIANT nome3 ; // t e r z o nome u t e n t e d e l l a a h e RTPLC_VARIANT nome4 ; // q u a r t o nome u t e n t e d e l l a a h e RTPLC_VARIANT nome5 ; // q u i n t o nome u t e n t e d e l l a a h e RTPLC_VARIANT idN ; // o d e i d e n t i f i a t i v o r i m p i a z z a m e n t o RTPLC_VARIANT nomeN ; //nome u t e n t e r i m p i a z z a m e n t o ULONG k ; // v a r a p p o g g i o ULONG j ; // v a r a p p o g g i o ULONG e ; // v a r a p p o g g i o RTPLC_VARIANT s r x B u f f e r ; // s t r i n g a d i r i s p o s t a d e l l a s e r i a l e ULONG V i s u a l i z z a ; RTPLC_VARIANT p r e s e n t i 1 ; // p r i m o nome l i s t a p r e s e n t i RTPLC_VARIANT p r e s e n t i 2 ; // s e o n d o nome l i s t a p r e s e n t i RTPLC_VARIANT p r e s e n t i 3 ; // t e r z o nome l i s t a p r e s e n t i RTPLC_VARIANT p r e s e n t i 4 ; // q u a r t o nome l i s t a p r e s e n t i RTPLC_VARIANT p r e s e n t i 5 ; // q u i n t o nome l i s t a p r e s e n t i RTPLC_BIT i s A l 1 ; // l ' a l l a r m e man ata a u t o r i z z a z i o n e e ' i n s e r i t o RTPLC_BIT o n t r o l l a ; // v a r i a b i l e p e r i l o n t r o l l o d i u s i t a RTPLC_BIT u s i t o ; // v a r i a b i l e d i u s i t a ULONG s t a t u s C o n t r o l l o U ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e o n t r o l l o U s i t a ULONG s ; RTPLC_VARIANT uUs ente ; //nome u t e n t e u s e n t e RTPLC_BIT f a t t o ; // v a r i a b i l e o n t r o l l o u s i t a LONG r e s 5 ; // r i t o r n o f u n z i o n i o m p l e s s e
// :RTPLC_SYNONYMDEF_END
__DEFINE RTPLC_VARIANT returnparam ;
void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE
// :RTPLC_EVENTDEF_BEGIN
void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE
routine_main (LPVOID data ) ; r o u t i n e _ i n i t (LPVOID data ) ; t i m e r (LPVOID data ) ; r o u t i n e _ a l l a r m e (PRTPLC_FUNCTION_INPUT i n p u t ) ; r o u t i n e _ l e g g i D B (PRTPLC_FUNCTION_INPUT i n p u t ) ; r o u t i n e _ l e g g i S e r i a l e (PRTPLC_FUNCTION_INPUT i n p u t ) ; r o u t i n e _ r e s e t (PRTPLC_FUNCTION_INPUT i n p u t ) ; r o u t i n e _ o n t r o l U s i t o (PRTPLC_FUNCTION_INPUT i n p u t ) ; routine_aggiornaDB (PRTPLC_FUNCTION_INPUT i n p u t ) ;
// :RTPLC_EVENTDEF_END
r o u t i n e M a i n (LPVOID data ) ; r o u t i n e I n i t (LPVOID data ) ;
routine_main (LPVOID data ) ; r o u t i n e _ i n i t (LPVOID data ) ; t i m e r (LPVOID data ) ;
void
// :RTPLC_PROXYFUNC_BEGIN
__inline p ro x y _ro u tin e_a lla rme (ULONG type ) { RTPLC_VARIANT param [ 1 ℄ ; param [ 0 ℄ . vt = RTPLC_FORMAT_UINT32; param [ 0 ℄ . v a l u e . u l = type ; invokeFun (_T( " r o u t i n e _ a l l a r m e " ) , param , 1 , NULL) ; }
51
ULONG __inline proxy_routine_leggiDB ( ) { RTPLC_VARIANT r e t v a l ; invokeFun (_T( " r o u t i n e _ l e g g i D B " ) , NULL, 0 , &r e t v a l ) ; r e t v a l . value . ul ; }
return
ULONG __inline p r o x y _ r o u t i n e _ l e g g i S e r i a l e ( ) { RTPLC_VARIANT r e t v a l ; invokeFun (_T( " r o u t i n e _ l e g g i S e r i a l e " ) , NULL, 0 , &r e t v a l ) ; r e t v a l . value . ul ; }
return
void }
__inline p r o x y _ r o u t i n e _ r e s e t ( ) { invokeFun (_T( " r o u t i n e _ r e s e t " ) , NULL, 0 , NULL) ;
ULONG __inline p r o x y _ r o u t i n e _ o n t r o l U s i t o ( ) { RTPLC_VARIANT r e t v a l ; invokeFun (_T( " r o u t i n e _ o n t r o l U s i t o " ) , NULL, 0 , &r e t v a l ) ; r e t v a l . value . ul ; } ULONG __inline proxy_routine_aggiornaDB ( ) { RTPLC_VARIANT r e t v a l ; invokeFun (_T( " routine_aggiornaDB " ) , NULL, 0 , &r e t v a l ) ; r e t v a l . value . ul ; }
return
return
// :RTPLC_PROXYFUNC_END
#pragma
pa k ( pop )
A.2 denition. : #define RTPLC_ALLOC #define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude " d e f i n i t i o n s . h" // :RTPLC_FUNCTION_IO_BEGIN
RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ a l l a r m e ) RTPLC_FUNCTION_PARAM( type , RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_END( r o u t i n e _ a l l a r m e ,RTPLC_FORMAT_VOID) RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ l e g g i D B ) RTPLC_FUNCTION_IO_END( routine_leggiDB ,RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ l e g g i S e r i a l e ) RTPLC_FUNCTION_IO_END( r o u t i n e _ l e g g i S e r i a l e ,RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ r e s e t ) RTPLC_FUNCTION_IO_END( r o u t i n e _ r e s e t ,RTPLC_FORMAT_VOID) RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ o n t r o l U s i t o ) RTPLC_FUNCTION_IO_END( r o u t i n e _ o n t r o l U s i t o ,RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_BEGIN( routine_aggiornaDB ) RTPLC_FUNCTION_IO_END( routine_aggiornaDB ,RTPLC_FORMAT_UINT32) // :RTPLC_FUNCTION_IO_END
RTPLC_ROUTINE_BEGIN( ) // :RTPLC_ROUTINE_BEGIN
RTPLC_MAIN(RTPLC_PRIORITY_NORMAL, routine_main ) RTPLC_ONINIT(RTPLC_PRIORITY_NORMAL, r o u t i n e _ i n i t )
52
RTPLC_ONTIMER(RTPLC_PRIORITY_NORMAL, t i m e r ) RTPLC_FUNCTION( r o u t i n e _ a l l a r m e , r o u t i n e _ a l l a r m e ) RTPLC_FUNCTION( routine_leggiDB , r o u t i n e _ l e g g i D B ) RTPLC_FUNCTION( r o u t i n e _ l e g g i S e r i a l e , r o u t i n e _ l e g g i S e r i a l e ) RTPLC_FUNCTION( r o u t i n e _ r e s e t , r o u t i n e _ r e s e t ) RTPLC_FUNCTION( r o u t i n e _ o n t r o l U s i t o , r o u t i n e _ o n t r o l U s i t o ) RTPLC_FUNCTION( routine_aggiornaDB , routine_aggiornaDB ) // :RTPLC_ROUTINE_END
RTPLC_ROUTINE_END( )
RTPLC_STRUCTDESCRIPTION_BEGIN( ) // : RTPLC_STRUCTDESCRIPTION_BEGIN // :RTPLC_STRUCTDESCRIPTION_END
RTPLC_STRUCTDESCRIPTION_END( )
RTPLC_SYNEVT_LINK_BEGIN_DEFAULT( t i m e r ) // :RTPLC_SYNEVT_LINK_BEGIN // :RTPLC_SYNEVT_LINK_END
RTPLC_SYNEVT_LINK_END( )
RTPLC_LIBRARY_DEFINITION( "PLC2" , " " , " r t p l . h" , SYNEVTLINK_STANDARD) RTPLC_SYNONYM_BEGIN( ) // :RTPLC_SYNONYM_BEGIN
RTPLC_SYNONYM_VOLATILE_ULONG( statusMain , " V a r i a b i l e d i s t a t o d e l l a r o u t i n e main" , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( s t a t u s S e r i a l e , " V a r i a b i l e d i s t a t o r o u t i n e l e g g i S e r i a l e " , 0 , RTPLC_ACCESS_INPUT) RTPLC_SYNONYM_VOLATILE_ULONG( statusLeggiDB , " V a r i a b i l e d i s t a t o d e l l a r o u t i n e leggiDB " , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( statusAggiornaDB , " V a r i a b i l e d i s t a t o d e l l a r o u t i n e aggiornaDB " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( timerT , " Timer d i a e s s o a l l a s e r i a l e " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_DI_BIT( f o t o 1 , " V a r i a b i l e d e l l a f o t o e l l u l a 1 " , 0 , 0 , 0 ) RTPLC_SYNONYM_DI_BIT( f o t o 2 , " V a r i a b i l e d e l l a foto ellula2 " ,0 ,0 ,2) RTPLC_SYNONYM_VOLATILE_BIT( sear hDB , " V a r i a b i l e r i r i e r a i d e n t i f i a t i v o a u t o r i z z a t o " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( s t a t u s A l l a r m e , " V a r i a b i l e d i s t a t o d e l l a r o u t i n e a l l a r m e " , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( type , " type a l l a r m e r i h i a m a t o " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( timerAl , " Timer d e l l a r o u t i n e a l l a r m e " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_DO_BIT( a l l a r m e , " I n d i a t o r e s t a t o d i a l l a r m e on/ o f f " , 0 , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_DO_BIT( lu eV erd e , " Lu e d i p l l i b e r o on/ o f f " , 0 , 0 , 2 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_DO_BIT( l u e R o s s a , " Lu e d i p l impegnato on/ o f f " , 0 , 0 , 4 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ARRAYUCHAR( t x B u f f e r , " B u f f e r d e l l a query a l l a s e r i a l e " , 0 , 5 1 2 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ARRAYUCHAR( r x B u f f e r , " B u f f e r d i r i s p o s t a d e l l a s e r i a l e " , 0 , 5 1 2 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( isOn1 , " b o o l e a n d i s t i n z i o n e e n t r a t a " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( isOn2 , " b o o l e a n d i s t i n z i o n e u s i t a " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( g f o t o 1 , " C o n t r o l l o g u a s t o f o t o e l l u l a 1 " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( g f o t o 2 , " C o n t r o l l o g u a s t o f o t o e l l u l a 2 " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( rxLen , " Lunghezza b u f f e r " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ARRAYULONG( f i l e _ h a n d l e , " h a n d l e r d e l f i l e " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ARRAYULONG( i , " a e s s i da p a r t e d e g l i u t e n t i " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( i n i z i o , " v a r i a b i l e i n d i a t o r e d i i n z i o i l o " , 0 , RTPLC_ACCESS_INPUT) RTPLC_SYNONYM_VOLATILE_ULONG( nId , "numero i d e n t i f i a t o r e i n s e r i t o " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( R_openmode , " m o d a l i t a a p e r t u r a i n l e t t u r a " , 3 , " r " ) RTPLC_SYNONYM_STRING( f i l e n a m e , "nome d e l f i l e da l e g g e r e " , 4 0 , "%u s e r s e t t i n g s %\\dataBase . txt ") RTPLC_SYNONYM_VOLATILE_ULONG( t i m e r S o s t a , " t i m e r o n t r o l l o s o s t a " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( r e s e t , " v a r i a b i l e d i r i h i e s t a r e s e t " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( output , " output d e l p l " , 2 5 6 , " " ) RTPLC_SYNONYM_VOLATILE_ULONG( timerA , " Timer d i a t t e s a p a s s a g g i o u t e n t e " , 0 ,
53
RTPLC_ACCESS_INPUT) RTPLC_SYNONYM_DAYTIME( O r o l o g i o , " O r o l o g i o " ) RTPLC_SYNONYM_VOLATILE_SHORT( Ora , " o r a o r r e n t e " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_SHORT( Minuti , " Minuti o r r e n t i " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_SHORT( s e o n d i , " s e o n d i o r r e n t i " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( id1 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( id2 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( id3 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( id4 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( id5 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome1 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome2 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome3 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome4 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome5 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( idN , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING(nomeN , " " , 2 0 , " " ) RTPLC_SYNONYM_VOLATILE_ULONG( k , " " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( j , " " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( e , " o n t a t o r e p e r l a aggiornaDB " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( s r x B u f f e r , " parametro d i r i t o r n o d e l l a s e r i a l e " , 3 0 , " " ) RTPLC_SYNONYM_VOLATILE_ULONG( V i s u a l i z z a , " s " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( p r e s e n t i 1 , " primo p r e s e n t e " , 4 0 , " " ) RTPLC_SYNONYM_STRING( p r e s e n t i 2 , " " , 4 0 , " " ) RTPLC_SYNONYM_STRING( p r e s e n t i 3 , " " , 4 0 , " " ) RTPLC_SYNONYM_STRING( p r e s e n t i 4 , " " , 4 0 , " " ) RTPLC_SYNONYM_STRING( p r e s e n t i 5 , " " , 4 0 , " " ) RTPLC_SYNONYM_VOLATILE_BIT( i s A l 1 , " C o n t r o l l a s e e ' s t a t o a t t i v a t o l ' a l l a r m e d i i n t r u s i o n e " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( o n t r o l l a , " i n d i a he b i s o g n a o n t r o l l a r e l ' u s i t a " , 0 , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( u s i t o , " i n d i a he s t i a m o us endo " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( s t a t u s C o n t r o l l o U , " s t a t u s r o u t i n e o n t r o l l o U s i t o " , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( s , " v a r i a b i l e a p p o g g i o p e r l a a n e l l a z i o n e i n u s i t a " , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( uUs ente , " " , 3 0 0 , " " ) RTPLC_SYNONYM_VOLATILE_BIT( f a t t o , " " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_LONG( r e s 5 , " d s d s " , 0 ,RTPLC_ACCESS_IO) // :RTPLC_SYNONYM_END
RTPLC_SYNONYM_STRING( returnparam , " " , 3 0 0 , " " ) RTPLC_SYNONYM_END( )
A.3
routineMain. :
#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude "om om . h" #in lude " d e f i n i t i o n s . h" /∗ R o u t i n e /gestita /si
di
gestione
ome
o
upa
del
main
dal
dell ' appli azione framework
ontrollo
di
tutti
i
asi
d ' uso
void RTPLC_ROUTINE
gestiti
dal
progetto
routine_main (LPVOID n u l l ) { ULONG r i t o r n o S ; // V a l o r e d i r i t o r n o d e l l a seriale ULONG r i t o r n o C ; // V a l o r e d i r i t o r n o d e l o n t r o l l o r e ULONG r e t ; RTPLC_STRING format ; RTPLC_VARIANT a p p o g g i o ; // a g g i o r n a m e n t o
varaibili
globali
Ora=O r o l o g i o . hour ; Minuti=O r o l o g i o . min ; s e o n d i=O r o l o g i o . s e ; output . vt=RTPLC_FORMAT_STRING;
54
∗/
// i n i z i a l i z z a z i o n e
variabili
// a n e l l o
messagi
lo ali
a p p o g g i o . vt=RTPLC_FORMAT_STRING; format . s i z e =6; a p p o g g i o . v a l u e . s t r i n g . s i z e =200; format . s z=" ∗∗%s ∗∗ \n %s \n" ; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; tutti
i
messagp ( (USHORT) 0 ) ;
in
sospeso
if ( r e s e t==RTPLC_TRUE) { if ( ( type==1) | | ( i s A l 1==RTPLC_TRUE) ) // i n
aso
venga
ri hiesto
il
reset
della
ma
hina
{
// e '
stato
ri hiesto
il
reset
durante
un
allarme
di
man ata
autorizzazione
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗NON E ' POSSIBILE EFFETTUARE IL RESET ∗∗ \ n ∗∗UTENTE NON AUTORIZZATO E ' ENTRATO NELLA STRUTTURA∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r e s e t=RTPLC_FALSE; type =1; sleep (2000) ; }
else
{
// a t t i v a z i o n e
}
reset
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗RESET IN CORSO∗∗ \n" ; l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; proxy_routine_reset ( n u l l ) ; r e s e t=RTPLC_FALSE; }
else
{
if ( a l l a r m e ==0) { if ( i n i z i o ==1)
// v a r i a b i l e
// p r i m a
{
di
stato
status_main
iterazione
devo
// L e t t u r a
inizializzare
file
e
la
ari amento
a he identifi ativi
( ok )
r e t=proxy_routine_leggiDB ( ) ;
if ( r e t ==0) i n i z i o =0; else if ( r e t==OMCS_WAIT) i n i z i o =1; else if ( r e t <−1)
// 1 .
lettura
DB
effettuata
// 2 .
lettura
DB i n
// 3 .
lettura
DB
on
su
esso
ese uzione
errore
{
}
type =3; a l l a r m ( (USHORT) AL_SCOLLEGATO) ; p ro x y _ro u tin e_a lla rme ( type ) ; }
else
{
if ( f o t o 1
// 0 .
ontrollo
se
entrambe
le
foto ellule
sono
== RTPLC_TRUE && f o t o 2 == RTPLC_TRUE)
a
ese
ontemporanemente
{ a p p o g g i o . v a l u e . s t r i n g . s z="~ S e g n a l i d e l l e f o t o e l l u l e s i m u l t a n e i ~\n" ; a l l a r m ( (USHORT) AL_SIMULTANEE) ; isOn1 =1; isOn2 =1; r t p l t r a e ( 1 ,_T( "~ S e g n a l i d e l l e f o t o e l l u l e s i m u l t a n e i ~\n" ) ) ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; type =2;
55
( ok )
timerT =0;
// a t t i v o l ' allarme // ri hiamo la routine di allarme per la simultaneita ' dei segnali
p ro x y _ro u tin e_a lla rme ( type ) ; }
else swit h ( s t a t u s M a i n ) {
ase 0 : {
{
// stato di attesa o quietes enza //da questo stato vengono o n t r o l l a t e t u t t e l e v a r i a b i l i d e l l e p e r i f e r i h e
RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g . s i z e =100;
// funzione per la l e t t u r a d e l l a s e r i a l e // se i l timer e ' 100 devo leggere la s e r i a l e
if ( ( timerT ==
{
1 0 0 ) | | ( u s i t o==RTPLC_TRUE) )
// ri hiamo la routine di l e t t u r a d e l l a s e r i a l e
r i t o r n o S=p r o x y _ r o u t i n e _ l e g g i S e r i a l e ( ) ; ( r i t o r n o S ==1) { ; }
if
break else
{
timerT =0; ( ( u s i t o==RTPLC_TRUE)&&(sear hDB==RTPLC_TRUE) ) { sear hDB=RTPLC_FALSE;
o n t r o l l a=RTPLC_TRUE; } u s i t o=RTPLC_FALSE;
if
} }
else
timerT++;
if ( o n t r o l l a==RTPLC_TRUE) // ' e ' un utente in us ita
{
// ontrollo l ' i d e n t i f i a t i v o ( se mostrato )
r i t o r n o C=p r o x y _ r o u t i n e _ o n t r o l U s i t o ( ) ; ( r i t o r n o C ==1) { ; }
if
break else
{
} }
o n t r o l l a=RTPLC_FALSE; s t a t u s C o n t r o l l o U =0; f a t t o=RTPLC_FALSE;
// ontrollo l e f o t o e l l u l e // 1. f o t o e l l u l a 1 true
if
( f o t o 1 == RTPLC_TRUE) { s t a t u s M a i n =1; g f o t o 1=g f o t o 1 +1;
// ontrollo f u n z i o n a l i t a ' f o t o e l l u l a 1
if ( g f o t o 1 ==1000)
{
output1 . v a l u e . s t r i n g . s z="~ P o s s i b i l e g u a s t o a l l a f o t o e l l u l a 1 ~\n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok type =4; a l l a r m ( (USHORT) AL_FOTO1) ;
56
p ro x y _ro u tin e_a lla rme ( type ) ;
break ; } break ; }
// 2. f o t o e l l u l a 2 true / f a l s e
if
( f o t o 2 == RTPLC_TRUE) { g f o t o 2=g f o t o 2 +1; statusMain = 3 ;
// ontrollo f u n z i o n a l i t a ' f o t o e l l u l a 2
if ( g f o t o 2 ==1000)
{
// la f o t o e l l u l a
output1 . v a l u e . s t r i n g . s z="~ P o s s i b i l e g u a s t o a l l a f o t o e l l u l a 2 ~\n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok type =5; a l l a r m ( (USHORT) AL_FOTO2) ; p ro x y _ro u tin e_a lla rme ( type ) ; ;
break break ; } else }
// r e s e t t o l e v a r i a b i l i di ontrollo d e l l a f o t o e l l u l a 2 g f o t o 2 =0; // 3. f o t o e l l u l a 1 f a l s e
if ( f o t o 1
{
ase
{
g f o t o 1 =0; s t a t u s M a i n =2; t i m e r S o s t a =0; ;
break break ; }
}
== RTPLC_FALSE)
1:
RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g . s i z e =100; r t p l t r a e ( 1 ,_T( " Booleana d i a u t o r i z z a z i o n e % \n" ) , sear hDB ) ;
// 1. foto1=1 && sear hDB=1
if ( sear hDB == RTPLC_TRUE)
{
output1 . v a l u e . s t r i n g . s z=" \n ∗∗ Utente A u t o r i z z a t o ∗∗ \0 " ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " S t r i n g a da v i s u a l i z z a r e %s numero i d e n t i f i a t i v i output . v a l u e . s t r i n g . s z ) ; isOn1 =1; s t a t u s M a i n =0; sear hDB =0; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; ;
break else // 2. foto1=1 && sear hDB=0 && isOn2==0 if ( sear hDB == RTPLC_FALSE) { if ( isOn2==0) }
\n" ) ,
{ output1 . v a l u e . s t r i n g . s z="~Utente non A u t o r i z z a t o ! ~ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " S t r i n g a da v i s u a l i z z a r e %s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok a l l a r m ( (USHORT) AL_INTRUSO) ; type =1; timerT =0;
57
p ro x y _ro u tin e_a lla rme ( type ) ; // ri hiamo
autorizzazione
break ; } else
la routine di allarme per la man ata
{ s t a t u s M a i n =0; output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente U s i t o ∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok isOn2 =0; sleep (4000) ; u s i t o=RTPLC_TRUE; messagp ( (USHORT)M_USCITA) ; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE;
if else t i m e r S o s t a=t i m e r S o s t a +1; break ;
( t i m e r S o s t a ==80) r t p l t r a e ( 1 ,_T( "L ' u t e n t e s i e ' f e r m a t o d i f r o n t e a l l a f o t o e l l u l a \n" ) ) ;
}
}
}
ase
{
2:
RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g . s i z e =100;
// 1. foto1=0 && sear hDB=1
if ( sear hDB == RTPLC_TRUE)
{
}
s t a t u s M a i n = 4 ; // stato attesa passaggio utente output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente A u t o r i z z a t o , a t t e s a p a s s a g g i o ∗∗ \n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; ;
break
// 2. foto1=0 && sear hDB=0
else
{
}
}
statusMain = 0 ;
break ;
ase
{
3:
RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g . s i z e =100; ( isOn1==1) { // 1. foto2=1 && isOn1 == 1 output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente e n t r a t o ∗∗ \n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " output : %s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok messagp ( (USHORT)M_ENTRATA) ;
if
if
( k==6) { k=1; // r i i n i z i a s =5; }
a riempire d a l l ' i n i z i o d e l l a l i s t a
else if ( s !=5) s=k ; swit h ( nId )
{
58
// inseris o g l i i d e n t i f i a t i v i n e l l a l i s t a presenti
ase 1 : swit h ( k ) {
ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ; default : break ; } break ;
ase 2 : swit h ( k ) {
ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ; default : break ; } break ;
ase 3 : swit h ( k ) {
ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ; default : break ; } break ;
ase 4 : swit h ( k ) {
ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ; default : break ; } break ;
ase 5 : swit h ( k ) {
ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ; default : break ; } break ; default : break ;
} s t a t u s M a i n =0; isOn1 =0; nId =0; sear hDB =0; sleep (4000) ; ;
break else
}
{ // 2. foto2=1 && isOn1=0 output1 . v a l u e . s t r i n g . s z=" ∗∗ U s i t a u t e n t e ∗∗ \ n" ;
59
}
}
ase
s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok s t a t u s M a i n =0; isOn2 =1; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; ;
break 4:
//Utente r i l e v a t o attesa passaggio utente // 1. S atta i l timeout , autenti azione annullata
if ( ( timerA ==
{
}
3 0 0 ) && ( f o t o 1 == RTPLC_FALSE ) )
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗ P a s s a g g i o non e f f e t t u a t o ∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok statusMain = 0 ; nId =0; timerA =0; k −−; sear hDB = RTPLC_FALSE ; l u e R o s s a=RTPLC_TRUE; l u e V e r d e=RTPLC_FALSE; ;
break
// 2. Passaggio rilevato , timerA r e i n i z i a l i z z a t o
if ( f o t o 1
{
}
== RTPLC_TRUE)
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗ P a s s a g g i o e f f e t t u a t o ∗∗ \n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok timerA = 0 ; s t a t u s M a i n =0; sear hDB = RTPLC_FALSE; isOn1 =1; sleep (3000) ; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; ;
break
// 3. Passaggio non rilevato , timerA in rementato
if ( f o t o 1==RTPLC_FALSE
{
} }
)
timerA=timerA +1;
break ; } default : break ;
} }
else
}
}
{ p ro x y _ro u tin e_a lla rme ( type ) ; }
A.4
routineInit. :
#define #define
_INTERNAL_GENERATION DATABASE " dataBase . t x t "
#in lude #in lude
" r t p l . h" " d e f i n i t i o n s . h"
60
void RTPLC_ROUTINE /∗ r o u t i n e
di
inizializzazione
di
variabili
∗/
r o u t i n e _ i n i t (LPVOID n u l l ) {
// i n i z i a l i z z a z i o n e
variabili
globali
// 0 .
inizializzazione
segnalatori
// 1 .
inizializzazione
status
l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE;
s t a t u s M a i n =0; // s t a t u s s t a t u s S e r i a l e =0; // s t a t u s statusLeggiDB =0; // s t a t u s s t a t u s A l l a r m e =0; // s t a t u s s t a t u s C o n t r o l l o U =0; // s t a t u s statusAggiornaDB =0; // s t a t u s
lavoro
routine
della
routineMain
della
routine_leggiSeriale
della
routine_leggiDB
della
routine_allarme
della
routine_ ontrolUs ito
della
routine_aggiornaDB
// 2 .
inizializzazione
timer
routine
// 3 .
inizializzazione
variabili
timerT =0; // t i m e r t r a n s p o n d e r timerA =0; // t i m e r p a s s a g g i o u t e n t e t i m e r A l =0; // t i m e r d i a l l a r m e t i m e r S o s t a =0; // t i m e r d i s o s t a
type =0; // t i p o a l l a r m e a z i o n a t o rxLen =0; // l u n g h e z z a b u f f e r s e r i a l e g f o t o 1 =0; // o n t r o l l o r e g u a s t i f o t o e l l u l a 1 g f o t o 2 =0; // o n t r o l l o r e g u a s t i f o t o e l l u l a 2 i n i z i o =1; // v a r i a b i l e d i o n d i z i o n a m e n t o p e r l ' e s e u z i o n e d e l l a nId =1; // numero d e l l a p o s i z i o n e i n p r e s e n t i d o v e i n s e r i r e il k=0; // numero p r e s e n t i j =0; // v a r i a b i l e d ' a p p o g g i o p e r l ' i n t e r f a i a s =0; e =1; // v a r i a b i l e p e r l ' i n s e r i m e n t o n u o v i e l e m e n t i n e l d b memset ( i , 0 , 5 ) ; // 4 .
inizializzazione
variabili
isOn1=RTPLC_FALSE; isOn2=RTPLC_FALSE; r e s e t=RTPLC_FALSE; a l l a r m e=RTPLC_FALSE; f o t o 1=RTPLC_FALSE; f o t o 2=RTPLC_FALSE; sear hDB=RTPLC_FALSE; V i s u a l i z z a=RTPLC_FALSE; u s i t o=RTPLC_FALSE;
o n t r o l l a=RTPLC_FALSE; f a t t o=RTPLC_FALSE; i s A l 1=RTPLC_FALSE;
booleane passato
stato
di
attivita '
foto ellula1
// o n t r o l l o r e
passato
stato
di
attivita '
foto ellula2
// v a r i a b i l e
di
azionamento
reset
// v a r i a b i l e
di
azionamento
allarme
// v a r i a b i l e
ontrollo
azionamento
foto ellula1 foto ellula2
( i alino )
// v a r i a b i l e
ontrollo
azionamento
// v a r i a b i l e
ontrollo
autorizzazione
// v a r i a b i l e
appoggio
// v a r i a b i l e
he
// v a r i a b i l e
indi a
in
segnala se
d e l l ' utente
// o n t r o l l o r e manuale
per
t y p e =1
aso
di
e '
l ' interfa
ia
he
'e '
gia
un
stato
utente
( per non
evitare
routine_allarme. :
void s t u b _ r o u t i n e _ a l l a r m e (ULONG type ) ; void RTPLC_ROUTINE r o u t i n e _ a l l a r m e (PRTPLC_FUNCTION_INPUT // : FUNCTION_BEGIN
61
il
autorizzato )
#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude " d e f i n i t i o n s . h"
}
us ita
us ente
allarme
ingresso
s t u b _ r o u t i n e _ a l l a r m e ( input −>params [ 0 ℄ . v a l u e . u l ) ;
in
memorizzato
}
A.5
filedatabase
// o n t r o l l o r e
// l ' i d e n t i f i a t i v o // r e s e t
lettura prossimo
input ) {
possibile
// :FUNCTION_END // :STUB_IMPLEMENTATION /∗ R o u t i n e / param / ogni
void
di
type stato
/ indi a
gestione numero
attivazione
di
stato
rappresenta
l ' allarme
da
un
allarme .
d e l l ' allarme allarme
attivare
attivato
diverso
il
numero
passato
per
argomento
∗/
s t u b _ r o u t i n e _ a l l a r m e (ULONG type ) {
ULONG r i t o r n o S e r i a l e ; s t a t u s A l l a r m e = type ; a l l a r m e = RTPLC_TRUE; l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE;
swit h ( s t a t u s A l l a r m e )
ase 1 :
{
{
// a l l a r m e
utente
non
autorizzato
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE UTENTE NON AUTORIZZATO∗∗∗∗∗∗∗∗ \ n\0 " ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; i s A l 1=RTPLC_TRUE; //
if
ogni
10
iterazioni
lettore
ontrolla
se
un
utente
autorizzato
si
e '
identifi ato
sul
Rfid
( timerT==10) { ritornoSeriale = proxy_routine_leggiSeriale () ;
if ( r i t o r n o S e r i a l e
// r i h i a m a
{
la
funzione
== 1 )
leggiSeriale
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45; a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i a z i o n e non e f f e t t u a t a , \ n l e t t u r a s e r i a l e i n
o r s o \n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; ;
break else
} {
timerT =0; ( sear hDB == RTPLC_TRUE) {
if
// l ' u t e n t e
} }
}
si
e '
autentifi ato
l ' allarme
viene
disinserito
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45; a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i a z i o n e e f f e t t u a t a , \ n u s i t a s t a t o d i a l l a r m e \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; a l l a r m e = RTPLC_FALSE; // i n d i a t o r e d i s t a t o d i a l l a r m e d i s a b i l i t a t o sear hDB = RTPLC_FALSE; // r e s e t r i e r a i s A l 1 = RTPLC_FALSE; type = 0 ; // r e s e t t y p e d e l l ' e r r o r e a l l a r m ( (USHORT) 0 ) ; s t a t u s M a i n =0; ;
break
else
{ a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45; a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i f i a z i o n e non e f f e t t u a t a , \ n a t t e s a a u t e n t i f i a z i o n e \n" ;
62
}
s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; timerT=timerT +1; } break ;
ase 2 :
{
// A l l a r m e
segnali
foto ellule
simultanei
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE SEGNALI FOTOCELLULE SIMULTANEI,STATO INCONSISTENTE ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ A t t e n d e r e r i s t a b i l i z z a z i o n e s t a t o o n s i s t e n t e ∗∗∗∗∗∗∗∗ \ n\0 " ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
i f ( f o t o 1==RTPLC_FALSE && f o t o 2==RTPLC_FALSE)
{
// r i i n i z i a l i z z a z i o n e
a l l a r m e =0; s t a t u s A l l a r m e =0; sear hDB =0; type =0; a l l a r m ( (USHORT) 0 ) ;
variabili
globali
}
}
break ;
ase 3 :
{
// A l l a r m e
}
lettore
RFID non
attivo
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE LETTORE RFID NON COLLEGATO ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ P r o e d e r e on i l r e s e t manuale d e l PLC ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; a l l a r m e =1; break ;
ase 4 :
{
// A l l a r m e
possibile
guasto
alla
foto ellula
1
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE POSSIBILE GUASTO ALLA FOTOCELLULA1 ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ Se non g u a s t a l i b e r a r e l a f o t o e l l u l a ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ oppure p r o e d e r e on i l r e s e t ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
i f ( f o t o 1==RTPLC_FALSE)
{
}
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ F o t o e l l u l a 1 l i b e r a t a r i s t a b i l i z z a z i o n e r o u t i n e main ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; a l l a r m ( (USHORT) 0 ) ; s t a t u s M a i n =0; isOn1 =0; a l l a r m e =0; t i m e r A l =0; g f o t o 1 =0; break ;
i f ( t i m e r A l ==60)
{
// d o p o
60
iterazioni
on
la
foto1
attiva
e '
ne essario
resettare
la
ma
hina
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ P r o e d e r e on i l r e s e t f o t o e l l u l a 1 non l i b e r a t a
63
}
∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; break ;
else
t i m e r A l=t i m e r A l +1;
}
break ;
ase 5 :
{
// A l l a r m e
possibile
guasto
alla
foto ellula
2
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE POSSIBILE GUASTO ALLA FOTOCELLULA2 ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ Se non e ' g u a s t a l i b e r a r e l a f o t o e l l u l a ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ oppure p r o e d e r e on i l r e s e t ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
i f ( f o t o 2==RTPLC_FALSE)
{
}
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ F o t o e l l u l a 2 l i b e r a t a r i s t a b i l i z z a z i o n e r o u t i n e main ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; a l l a r m ( (USHORT) 0 ) ; s t a t u s M a i n =0; isOn2 =0; a l l a r m e =0; t i m e r A l =0; g f o t o 2 =0; break ;
i f ( t i m e r A l ==60)
{
// d o p o
60
iterazioni
on
la
foto2
attiva
e '
ne essario
resettare
la
ma
hina
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ P r o e d e r e on i l r e s e t f o t o e l l u l a 2 non l i b e r a t a ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; i f ( k==2) r e s e t =1; sleep (300) ;
}
break ; } t i m e r A l=t i m e r A l +1; break ;
ase 6 :
{
// a t t i v a z i o n e
allarme
manuale
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE ATTIVATO ALLARME MANUALE∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; a l l a r m ( (USHORT) AL_MANUALE) ; t i m e r A l++; i f ( t i m e r A l ==300) { // s i
}
resetta
automati amente
dopo
300
iterazioni
a p p o g g i o . v a l u e . s t r i n g . s z =(PRTPLC_CHARSTRING)_T( " ∗∗∗∗∗∗∗∗ PLC r e s e t ∗∗∗∗∗∗∗ \ n" ) ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r e s e t=RTPLC_TRUE; a l l a r m e =0; t i m e r A l =0; break ;
64
}
default : break ;
}
}
A.6
routine_leggiDB. :
;# d e f i n e _INTERNAL_GENERATION
#in lude #in lude #in lude
" r t p l . h" " d e f i n i t i o n s . h" " o m f i l e . h"
// : FUNCTION_BEGIN
ULONG stub_routine_leggiDB ( ) ;
void RTPLC_ROUTINE }
r o u t i n e _ l e g g i D B (PRTPLC_FUNCTION_INPUT i n p u t ) { input −>r e t V a l −>v a l u e . u l= stub_routine_leggiDB ( ) ;
// :FUNCTION_END // :STUB_IMPLEMENTATION /∗ R o u t i n e / return
di
long
ari amento
della
indi a
routine
alla
a he
degli
identifi ativi
hiamante
se
la
funzione
leggiDB
ha
terminato
la
sua
ese uzione /
1
non
/
0
ha
ha
terminato
t e r m i n a t o ∗/
ULONG stub_routine_leggiDB ( ) { SHORT r e t o d e ; ULONG s i z e S ; OMRESULT r e t ; RTPLC_STRING nome ; RTPLC_STRING f i n e ; RTPLC_STRING format ; RTPLC_STRING nomeUtente ; RTPLC_STRING s e r i a l e ; // i n i z i a l i z z o
le
variabili
r e t o d e =0; s i z e S =0; f i n e . s i z e =5; nome . s i z e =5; format . s i z e =5; s e r i a l e . s i z e =18; nomeUtente . s i z e =18; f i n e . s z=" \n" ; nome . s z=" ! " ; s e r i a l e . s z=" " ; nomeUtente . s z=" " ; format . s z="%s " ; l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE;
swit h ( statusLeggiDB ) {
ase 0 : // v a r i a b i l e
//
di
apertura
stato
file
di
appoggio
status_seriale
txt
in
lettura
r t p l t r a e ( 1 ,_T( " f u n z i o n e l e g g i d b s t a t o 0 \n" ) ) ; //
valore
di
risposta
//
apertura
if
(OMFAILED ( r e t ) )
r e t = OM_OK;
d e l l ' apertura
del
file
inizializzato
a
ok
file
r e t = o m f i l e o p e n (& f i l e n a m e . v a l u e . s t r i n g ,&R_openmode . v a l u e . s t r i n g ,& f i l e _ h a n d l e [ 0 ℄ ) ; r t p l t r a e ( 1 ,_T( " A t t e s a \n" ) ) ;
// 1 .
{
apertura
fallita
r e t <0
r t p l t r a e ( 1 ,_T( " E r r o r e a p e r t u r a f i l e %s \n" ) ,W322OMERR( r e t ) ) ;
65
statusLeggiDB = 0 ;
}
return OM_ERROR;
else
// 2 .
apertura
in
ese uzione
i f ( r e t == OMCS_WAIT)
{ }
r e t ==1
r t p l t r a e ( 1 ,_T( " A t t e s a \n" ) ) ;
return OMCS_WAIT;
else
// 3 .
file
aperto
r e t ==0
i f ( r e t == OM_OK)
{
}
r t p l t r a e ( 1 ,_T( " F i l e a p e r t o o r r e t t a m e n t e \n" ) ) ; statusLeggiDB = 1 ; return OMCS_WAIT; // p e r h e ' a n o r a d e v e l e g g e r e
ase 1 :
// l e t t u r a
// v a r i a b i l e
file
ritorno
lettura
file
inizializzata
a
ok
r t p l t r a e ( 1 ,_T( " l e t t u r a \n" ) ) ; r e t = OM_OK; r e t = o m f i l e r e a d l i n e ( f i l e _ h a n d l e [ 0 ℄ , & returnparam . v a l u e . s t r i n g ) ; // 1 .
lettura
file
fallita
// 2 .
lettura
file
in
// 3 .
lettura
file
terminata
i f (OMFAILED ( r e t ) ) return OM_ERROR;
i f ( r e t == OMCS_WAIT) return 1 ;
i f ( r e t == OM_OK)
{ }
r e t <0
ese uzione
r e t ==1
r e t ==0
statusLeggiDB =2;
return OMCS_WAIT;
ase 2 : // l e
stringhe
// t o k e n i z z o
a he // n I d
sul
le
file
linee
devono
lette
da
essere
del
file
le
e
tipo
:
< o d i e >!<nome>
inseris o
nella
prima
posizione
in
libera
indi a
la
posizione
libera
in
a he
r t p l t r a e ( 1 ,_T( " t o k e n i z z a z i o n e \n" ) ) ; r t p l t r a e ( 1 ,_T( "NID : \n" ) ) ; i f ( nId==1) { r t p l t r a e ( 1 ,_T( " s r t o k \n" ) ) ; s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; r t p l t r a e ( 1 ,_T( " s r p y \n" ) ) ; s r p y (& i d 1 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome1 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome1 . v a l u e . s t r i n g . sz , i d 1 . v a l u e . s t r i n g . s z ) ; nId++; statusLeggiDB =1; r t p l t r a e ( 1 ,_T( " e s o n i d 1 \n" ) ) ; return 1 ; }
else i f ( nId==2)
{
r t p l t r a e ( 1 ,_T( " n i d =2\n" ) ) ; s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; s r p y (& i d 2 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome2 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " n i d =2\n" ) ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome2 . v a l u e . s t r i n g . sz , i d 2 . v a l u e . s t r i n g . s z ) ;
66
nId++; statusLeggiDB =1; r t p l t r a e ( 1 ,_T( " e s o n i d 2 \n" ) ) ; return 1 ; }
else i f ( nId==3)
{
s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; s r p y (& i d 3 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome3 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome3 . v a l u e . s t r i n g . sz , i d 3 . v a l u e . s t r i n g . s z ) ; nId++; statusLeggiDB =1; r t p l t r a e ( 1 ,_T( " e s o n i d 3 \n" ) ) ; return 1 ;
}
else i f ( nId==4)
{
}
s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; s r p y (& i d 4 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome4 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome4 . v a l u e . s t r i n g . sz , i d 4 . v a l u e . s t r i n g . s z ) ; nId++; statusLeggiDB =1; return 1 ;
else i f ( nId==5)
{
}
s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; s r p y (& i d 5 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome5 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome5 . v a l u e . s t r i n g . sz , i d 5 . v a l u e . s t r i n g . s z ) ; statusLeggiDB++;
return 1 ;
ase 3 : // v a r i a b i l e
ritorno
hiusura
init
ok
ret = omfile lose ( file_handle [ 0 ℄ ) ; // 1 .
hiusura
fallita
r e t <0
i f (OMFAILED ( r e t ) )
{
}
r t p l t r a e ( 2 , _T( " E r r o r e d u r a n t e l a h i u s u r a d i un f i l e " ) ) ;
return − 1;
// 2 .
hiusura
// 3 .
fine
in
ese uzione
i f ( r e t == OMCS_WAIT) return 1 ; operazione
i f ( r e t == OM_OK)
{
r e t =1
hiusura
file_handle [ 0 ℄ = 0;
return 0 ; }
default :
67
return return 0 ;
0;
} }
A.7
routine_aggiornaDB. :
#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude " d e f i n i t i o n s . h" // : FUNCTION_BEGIN
ULONG stub_routine_aggiornaDB ( ) ;
void RTPLC_ROUTINE }
routine_aggiornaDB (PRTPLC_FUNCTION_INPUT i n p u t ) { input −>r e t V a l −>v a l u e . u l= stub_routine_aggiornaDB ( ) ;
// :FUNCTION_END // :STUB_IMPLEMENTATION /∗ f u n z i o n e
di
/ implementa / return
long
/
1
/
0
aggiornamento
le
funzioni
di
identifi ativi rimpiazzamento
indi a
alla
non
terminata
e '
e '
routine
in
a he
proprie
hiamante
se
la
di
una
funzione
a he e '
terminata
t e r m i n a t a ∗/
ULONG stub_routine_aggiornaDB ( ) { OMRESULT r e t ; USHORT mp ; RTPLC_STRING o d i e ; RTPLC_STRING nomeUtente ; RTPLC_STRING nome ; RTPLC_STRING f i n e ; RTPLC_BIT t r o v a t o ; // i n i z i a l i z z a z i o n e
variabili
f i n e . s i z e =5; nome . s i z e =5;
o d i e . s i z e =20; nomeUtente . s i z e =20;
o d i e . s z=" " ; nomeUtente . s z=" " ; f i n e . s z=" \n" ; nome . s z=" ! " ; t r o v a t o=RTPLC_FALSE;
mp=0;
di
appoggio
swit h ( statusAggiornaDB )
ase 0 :
{
{
// 1 .
Apro
il
r e t = OM_OK;
file
//
apertura
file
if
(OMFAILED ( r e t ) )
r e t = o m f i l e o p e n (& f i l e n a m e . v a l u e . s t r i n g ,&R_openmode . v a l u e . s t r i n g ,& f i l e _ h a n d l e [ 0 ℄ ) ;
// 1 . 1
{
apertura
fallita
r t p l t r a e ( 1 ,_T( " E r r o r e a p e r t u r a f i l e %s \n" ) ,W322OMERR( r e t ) ) ; statusAggiornaDB = 0 ; OM_ERROR;
return else if ( r e t == OMCS_WAIT) return OMCS_WAIT; else
}
r e t <0
// 1 . 2
apertura
// 1 . 3
file
in
aperto
ese uzione
r e t ==1
r e t ==0
68
if ( ret
== OM_OK)
{ statusAggiornaDB
return
=
OMCS_WAIT;
1;
// p e r h e ' an ora deve l e g g e r e
} }
ase
{
1:
// v a r i a b i l e d i annullamento v a l o r e i n t e r n o d e l l a v a r i a b i l e
RTPLC_VARIANT
annulla ;
a n n u l l a . v t=RTPLC_FORMAT_STRING ; a n n u l l a . v a l u e . s t r i n g . s i z e =3; a n n u l l a . v a l u e . s t r i n g . s z=" " ;
// 2 . l e g g o l a r i g a ret
= OM_OK;
ret
=
omfilereadline ( file_handle
[ 0 ℄ , & returnparam . value . s t r i n g ) ;
// 2 . 1 l e t t u r a f i l e f a l l i t a r e t <0
if
(OMFAILED
( ret ) )
{ s t a t u s A g g i o r n a D B =5; s e a r h D B=RTPLC_FALSE ;
return
1;
}
// 2 . 2 l e t t u r a f i l e i n e s e u z i o n e r e t==1
if
( ret
== OMCS_WAIT)
return
1;
// 2 . 3 l e t t u r a f i l e t e r m i n a t a r e t==0
if ( ret
{
== OM_OK)
i f ( s r m p (& r e t u r n p a r a m . v a l u e . s t r i n g ,& a n n u l l a . v a l u e . s t r i n g ) ==0) {
// n e l aso l a s t r i n g a l e t t a s i a n u l l a e s e d a l l a f u n z i o n e s t a t u s A g g i o r n a D B =5; s e a r h D B=RTPLC_FALSE ;
return
1;
} s t a t u s A g g i o r n a D B =2;
return
OMCS_WAIT;
}
}
ase
{
2:
// prendo l a l i n e a l e t t a da f i l e e o n t r o l l o s e e ' l ' i d e n t i f i a t i v o he e r o
RTPLC_VARIANT
annulla ;
a n n u l l a . v t=RTPLC_FORMAT_STRING ; a n n u l l a . v a l u e . s t r i n g . s i z e =3; a n n u l l a . v a l u e . s t r i n g . s z=" " ;
// 3 . s r t o k d e l l a s t r i n g a l e t t a
o d i e . s z=s r t o k (& r e t u r n p a r a m . v a l u e . s t r i n g ,& nome ) ; n o m e U t e n t e . s z=s r t o k (NULL,& f i n e ) ;
// i n s e r i s o l e due s t r i n g h e n e l l e v a r i a b i l i g l o b a l i per i l rimpiazzamento s r p y (& idN . v a l u e . s t r i n g ,& o d i e ) ; s r p y (&nomeN . v a l u e . s t r i n g ,& n o m e U t e n t e ) ;
−−−− s e r i a l=%s <−−−\n " )
r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :% s< s z , idN . v a l u e . s t r i n g . s z ) ;
s r p y (& r e t u r n p a r a m . v a l u e . s t r i n g ,& a n n u l l a . v a l u e . s t r i n g ) ; s t a t u s A g g i o r n a D B =3;
return
1;
}
ase
3:
{
// 4 . o n f r o n t o i l o d i e l e t t o on q u e l l o p a s s a t o ( sr mp )
mp=s r m p (& idN . v a l u e . s t r i n g ,& s r x B u f f e r . v a l u e . s t r i n g ) ;
i f ( mp==0)
{
69
, nomeN . v a l u e . s t r i n g .
// ho t r o v a t o l ' i d e n t i f i a t i v o ora devo f a r e i l rimpiazzamento s e a r h D B=RTPLC_TRUE; s t a t u s A g g i o r n a D B =4;
return
1;
}
else
{
// r i o r s i o n e r i i n i z i o d a l l o s t a t o 1 s t a t u s A g g i o r n a D B =1;
return
1;
} }
ase
4:
{
// 5 . l e g g o l ' a r r a y i e d e i d o i n he i d i n s e r i r l o
i f ( e !=6) {
// e v i t o d i f a r e i l w h i l e per non r e a r e l o o p // aso 1 : siamo i n p o s i z i o n i i n t e r n e d e l l ' a r r a y // d e l l ' uso d e l l a a he
i f ( i [ e ℄!=0) {
// l a p o s i z i o n e " e " e ' s t a t a u t i l i z z a t a e ++;
return
1;
} }
i f ( e ==6) {
// aso2 : t u t t e l e p o s i z i o n i sono s t a t e u t i l i z z a t e // r i m p i a z z o l a prima p o s i z i o n e
s r p y (& i d 1 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome1 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; s t a t u s A g g i o r n a D B =5; i [1℄=1;
return
1;
}
else
{
swit h ( e ) {
// e s e g u o i l rimpiazzamento d e l l a p o s i z i o n e p r e s e l t a
ase
1:
s r p y (& i d 1 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome1 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [1℄=1; n I d =1; s t a t u s A g g i o r n a D B =5;
return
ase 2 :
1;
s r p y (& i d 2 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome2 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [2℄=1; n I d =2; s t a t u s A g g i o r n a D B =5;
return
ase 3 :
1;
s r p y (& i d 3 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome3 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [3℄=1; n I d =3; s t a t u s A g g i o r n a D B =5;
return
ase 4 :
1;
s r p y (& i d 4 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome4 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [4℄=1; n I d =4; s t a t u s A g g i o r n a D B =5;
return
ase 5 :
1;
s r p y (& i d 5 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ;
70
s r p y (&nome5 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [5℄=1; nId =5; statusAggiornaDB =5; 1; : statusAggiornaDB =5; 1;
return default return
} } }
ase
{
5:
// 6 . h i u d o
il
file
ret = omfile lose ( file_handle [ 0 ℄ ) ;
if
// 1 .
{
}
if
hiusura
r e t <0
r t p l t r a e ( 2 , _T( " E r r o r e d u r a n t e l a h i u s u r a d i un f i l e " ) ) ; − 1;
return
// 2 .
hiusura
in
ese uzione
( r e t == OMCS_WAIT) 1;
return
if ( r e t
// 3 .
{
fallita
(OMFAILED ( r e t ) )
fine
operazione
== OM_OK)
r e t =1
hiusura
file_handle [ 0 ℄ = 0; statusAggiornaDB =0; e =1; 0;
return } } }
}
default : return
A.8
0;
routine_leggiSeriale. :
#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude "om om . h" #in lude " d e f i n i t i o n s . h" // : FUNCTION_BEGIN
ULONG s t u b _ r o u t i n e _ l e g g i S e r i a l e ( ) ;
void RTPLC_ROUTINE }
r o u t i n e _ l e g g i S e r i a l e (PRTPLC_FUNCTION_INPUT i n p u t ) { input −>r e t V a l −>v a l u e . u l= s t u b _ r o u t i n e _ l e g g i S e r i a l e ( ) ;
// :FUNCTION_END // :STUB_IMPLEMENTATION /∗ F u n z i o n e / return
di
long
lettura indi a
/
0
e '
/
1
non
porta
alla
seriale
routine
hiamante
terminata e '
t e r m i n a t a ∗/
ULONG s t u b _ r o u t i n e _ l e g g i S e r i a l e ( ) { // v a r i a b i l i
di
OMFRESULT r e s ;
risposta
//OMFRESULT r e s 2 ;
USHORT mp ; ULONG r e t ; USHORT s i z e I ;
71
se
la
funzione
e '
terminata
RTPLC_STRING format ; // i n z i z i a l i z z a z i o n e
variabili
mp=0; s i z e I =0; format . s i z e =15; format . s z="%02X%02X%02X%02X" ; l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE; // i n i z i a l i z z a z i o n e
txBuffer txBuffer txBuffer txBuffer txBuffer txBuffer txBuffer txBuffer txBuffer
[0℄ [1℄ [2℄ [3℄ [4℄ [5℄ [6℄ [7℄ [8℄
= = = = = = = = =
buffer
lo ali
domanda
0 x01 ; 0 x09 ; 0 x00 ; 0 x03 ; 0 x01 ; 0 x41 ; 0 x01 ; 0x4A ; 0xB5 ;
//
primo
//
se ondo
byte
della
byte
byte
request
della
LENGHT MSB
//
terzo
//
quarto
byte
della
request
DEVICE ID
//
quinto
byte
della
request
CMD1
byte
della
SOF
request
della
request
LENGHT LSB
//
sesto
//
settimo
//
ottavo
byte
della
request
LRC1
//
ultimo
byte
della
request
LRC2
byte
request
della
CMD2
request
TIME OUT
i f ( k==5) k=0;
// v a r i a b i l e
di
stato
swit h ( s t a t u s S e r i a l e )
{
statusSeriale
ase 0 :
r e s=OMCS_OK;
// r i h i e s t a
lettura
// T r a s m i s s i o n e
alla
request
seriale
su
om1
r e s = om write ( 1 , t x B u f f e r , s i z e o f ( t x B u f f e r ) ) ; i f ( r e s == OMCS_WAIT)
// non
ha
finito
di
return 1 ; else
{
leggere
i f ( r e s == OMCS_OK) // ha
{ }
finito
di
leggere
statusSeriale = 1;
return 1 ;
else i f ( r e s == OMCS_ERROR) // ha
}
fatto
errore
return − 1;
break ;
ase 1 : {
ULONG r i s ; // o n t r o l l o h e l a r i s p o s t a non s i a o s t i t u i t a RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =20; a p p o g g i o . v a l u e . s t r i n g . s z=" 000000000000000000000000000000 " ; // l e t t u r a
risposta
da
0
nel
aso
seriale
r e s 5 = om read ( 1 , r x B u f f e r , s i z e o f ( r x B u f f e r ) , 3 0 0 , ( int ∗ )&rxLen ,TRUE) ;
// i n s e r i s o
i
bit
letti
in
una
variabile
string
per
poter
essere
gestita
v s r p r i n t f (& s r x B u f f e r . v a l u e . s t r i n g ,& format , r x B u f f e r [ 1 3 ℄ , r x B u f f e r [ 1 2 ℄ , r x B u f f e r [ 1 1 ℄ , rxBuffer [ 1 0 ℄ ) ;
i f ( r e s 5 == OMCS_WAIT) return 1 ; else i f ( r e s 5 == OMCS_OK)
{
r t p l t r a e ( 1 ,_T( "OMCS_OK\n" ) ) ; // f i n e
trasmissione
r i s=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; statusSeriale = 0;
72
i f ( ( rxLen != 0 ) | | ( r i s ==0)) { // 1 . l a l u n g h e z z a d e l l a r i s p o s t a // 1 . 1
ho
ri evuto
un
return 1 ; // l e t t u r a
diversa
0
identifi atore
s t a t u s S e r i a l e = 2 ; // a m b i o identifi atori
e '
stato
per
iniziare
mp
onfronti
on
gli
autorizzati non
terminata
}
else
{ // 2 . La l e t t u r a non e ' a v v e n u t a RTPLC_VARIANT a p p o g g i o ; // C o n d i z i o n e
di
t a g NON t r o v a t o
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" Nessun Tag r i l e v a t o n e l r a g g i o d i a z i o n e d e l r e a d e r \n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 , _T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; statusSeriale = 0; sear hDB =0; return 0 ; // f i n e l e t t u r a s e r i a l e }
}
else
s t a t u s S e r i a l e =0;
break ; }
// i n i z i o
ase 2 :
ri er a
identifi atore
in
a he
{
// o n f r o n t o
on
identifi atore1
mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " primo :% s s z ) ; // o k i f ( mp==0) { sear hDB=RTPLC_TRUE; nId =1; s t a t u s S e r i a l e =0; k++; i [1℄=1; r t p l t r a e ( 1 ,_T( " due %s
rx====%s \n" ) , i d 1 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g .
%s \n" ) , i d 1 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; //
ok
} {
}
return 0 ; s t a t u s S e r i a l e =3;
mp=0; return 1 ;
break ; }
ase 3 :
{
// o n f r o n t o
on
identifi atore2
mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 2 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " s e o n d o :% s %s \n" ) , i d 2 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; // ok
i f ( mp==0)
{
sear hDB=RTPLC_TRUE; nId =2; s t a t u s S e r i a l e =0; k++; i [2℄=1;
73
}
return 0 ;
else
{
}
s t a t u s S e r i a l e =4;
mp=0; return 1 ;
break ; }
ase 4 :
{
// o n f r o n t o
on
identifi atore3
mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 3 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " t e r z o :% s %s \n" ) , i d 3 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; // o k
i f ( mp==0)
{
}
sear hDB=RTPLC_TRUE; nId =3; s t a t u s S e r i a l e =0; k++; i [3℄=1;
return 0 ;
else
{
}
s t a t u s S e r i a l e =5;
mp=0; return 1 ;
break ; }
ase 5 :
{
// o n f r o n t o
on
identifi atore4
mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 4 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " q u a r t o :% s %s \n" ) , i d 4 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; // ok
i f ( mp==0) // s e r i a l e
{
}
letta
sear hDB=RTPLC_TRUE; nId =4; s t a t u s S e r i a l e =0; k++; i [4℄=1; r t p l t r a e ( 1 ,_T( "%s
=
id4
%s \n" ) , i d 4 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ;
return 0 ;
else
{
}
s t a t u s S e r i a l e =6;
mp=0; return 1 ;
break ; }
ase 6 :
{
// o n f r o n t o
on
identifi atore5
mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 5 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " q u i n t o : %s %s \n" ) , i d 5 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; i f ( mp==0) // S e r i a l e l e t t a = a i d 5 { sear hDB=RTPLC_TRUE; nId =5;
74
s t a t u s S e r i a l e =0; k++; i [5℄=1; r t p l t r a e ( 1 ,_T( "%s
return else
%s \n" ) , i d 5 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ;
0;
} {
// e s p a n z i o n e
:
// h i a m a
nuova
// h e
una
aggiorna
il
routine database
ontrolla nel
aso
file ritrovi
l ' id
r e t=proxy_routine_aggiornaDB ( s r x B u f f e r . v a l u e . s t r i n g ) ; ( r e t ==1) 1; ( r e t ==0) { ( sear hDB==RTPLC_FALSE) { nId =0; s t a t u s S e r i a l e =0;
mp=0; e =0; } k++; s t a t u s S e r i a l e =0;
if return if if
}
return 0 ; break ; } default : break ; } return 0 ; }
}
A.9
routine_reset. :
#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude " d e f i n i t i o n s . h" void s t u b _ r o u t i n e _ r e s e t ( ) ; void RTPLC_ROUTINE r o u t i n e _ r e s e t (PRTPLC_FUNCTION_INPUT // : FUNCTION_BEGIN
}
stub_routine_reset () ;
input ) {
// :FUNCTION_END // :STUB_IMPLEMENTATION
void
/∗ f u n z i o n e //
di
reset
delle
variabili
stub_routine_reset () {
Routine
per
la
globali
ristabilizzazione
// a l l a r m ( (USHORT)
0) ;
// 0 .
segnalazione
di
// 1 .
riinizializzazione
di
∗/
uno
stato
onsistente
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =2; a p p o g g i o . v a l u e . s t r i n g . s z=" " ; impegno
l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE;
s t a t u s M a i n =0; s t a t u s S e r i a l e =0; statusLeggiDB =0; s t a t u s A l l a r m e =0; s t a t u s C o n t r o l l o U =0;
variabili
di
stato
75
del
pl
// 2 .
riinizializzazione
timer
// 3 .
riinizializzazione
variabili
// 4 .
riinizializzazione
variabili
timerT =0; timerA =0; t i m e r A l =0; t i m e r S o s t a =0;
isOn1=RTPLC_FALSE; isOn2=RTPLC_FALSE; r e s e t=RTPLC_FALSE; a l l a r m e=RTPLC_FALSE; f o t o 1=RTPLC_FALSE; f o t o 2=RTPLC_FALSE; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; sear hDB=RTPLC_FALSE; V i s u a l i z z a=RTPLC_FALSE; u s i t o=RTPLC_FALSE;
o n t r o l l a=RTPLC_FALSE; f a t t o=RTPLC_FALSE; i s A l 1=RTPLC_FALSE;
// ( non
vengono
type =0; g f o t o 1 =0; g f o t o 2 =0; nId =1; k=0; j =0; s =0;
resettati
// 5 .
riinizializzazione
// 6 .
delete
:
rxLen
booleane
e
inizio )
presenti
s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& uUs ente . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; messaggi / a l l a r m i
messagp ( (USHORT) 0 ) ; a l l a r m ( (USHORT) 0 ) ;
}
76
A ronimi PLC
Programmable logi ontroller
RFID
Radio Frequen y IDenti ation
CAN
Controller Area Network
ISO/OSI
Open Systems Inter onne tion
ARM9
Advan ed RISC Ma hine 9
OEM
Original Equipment Manufa turer
77