Sei sulla pagina 1di 80

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 5
1.1 Sistemi di identi azione a radiofrequenza . . . . . . . . . . . . . . 6

Storia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

RFID struttura interna . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Appli azioni RFID . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1.2 Ma hina utilizzata: PLC . . . . . . . . . . . . . . . . . . . . . . . . 8

Storia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

PLC struttura interna e funzionamento . . . . . . . . . . . . . . . . . . . 9

1.3 Proto ollo di omuni azione CANOPEN . . . . . . . . . . . . . . . 9

2 Il Problema 12
2.1 Presentazione progetto . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.2 Use ase sviluppati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

2.3 Periferi he fornite da utilizzare . . . . . . . . . . . . . . . . . . . . . 14

RTPLC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3 Analisi 17
3.1 Use Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.2 Diagrammi di sequenza . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Progettazione si a (Distanza minima tra le foto ellule) . . . . . . . . . 26

3.3 Diagrammi di attività . . . . . . . . . . . . . . . . . . . . . . . . . . 27

4 La Soluzione 31
4.1 Strutturazione del progetto . . . . . . . . . . . . . . . . . . . . . . . 31

4.2 Funzionalità routine . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.3 Struttura interna delle routine . . . . . . . . . . . . . . . . . . . . . 36

4.4 Gestione delle interazioni tra routine . . . . . . . . . . . . . . . . . 37

5 Implementazione 39
5.1 S elte implementative . . . . . . . . . . . . . . . . . . . . . . . . . . 39

5.2 Sviluppo ontrolli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

6 Manuale 41
6.1 Funzionalità oerte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

6.2 Presentazione interfa ia . . . . . . . . . . . . . . . . . . . . . . . . . 42

6.3 Uso dell'interfa ia utente . . . . . . . . . . . . . . . . . . . . . . . . 42

1
7 Con lusioni e sviluppi futuri 49
A Codi e 50
A.1 denition.h: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
A.2 denition. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
A.3 routineMain. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
A.4 routineInit. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
A.5 routine_allarme. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
A.6 routine_leggiDB. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
A.7 routine_aggiornaDB. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
A.8 routine_leggiSeriale. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
A.9 routine_reset. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

2
Elen o delle gure
1.1 tag RFID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Data Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1 RTPLC-SIMU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1 use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3 use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Diagramma di sequenza entrata . . . . . . . . . . . . . . . . . . . . . . . 24
3.5 Diagramma di sequenza us ita . . . . . . . . . . . . . . . . . . . . . . . . 25
3.6 Diagramma di sequenza generale . . . . . . . . . . . . . . . . . . . . . . 26
3.7 Diagramma di attività 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.8 Diagramma di attività 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.9 Diagramma di attività 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.1 S hermata inziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.2 S hermata attesa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.3 S hermata man ato passaggio . . . . . . . . . . . . . . . . . . . . . . . . 44
6.4 S hermata impegno foto ellula1 . . . . . . . . . . . . . . . . . . . . . . . 44
6.5 S hermata passaggio eettuato . . . . . . . . . . . . . . . . . . . . . . . 45
6.6 S hermata us ita utente . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.7 S hermata di reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.8 S hermata allarme manuale . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.9 S hermata allarme impegno simultaneo delle foto ellule . . . . . . . . . . 47
6.10 S hermata allarme Foto ellula2 guasta(o impegnata da troppo tempo) . . 47
6.11 S hermata allarme man ata autenti azione . . . . . . . . . . . . . . . . 48
6.12 S hermata messaggio blo o del reset . . . . . . . . . . . . . . . . . . . . 48

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, Ste-
fano P., Stefano S., Mi hele, Matteo, Jonny, Antonio, Dario, Massimo), per avermi aiu-
tata 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 on-
seguimento 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'au-
tomatizzazione 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 in-
tegrando 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 in-
dustriali 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 am-
bito 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'uti-
lizzo 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 svilup-
pare 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 moder-
no (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 uti-
lizzare memorie tampone per mantenere i dati in memoria. Si ebbe l'inizio delle ap-
pli 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 alimen-
tazione 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 fun-

7
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 ot-
timizzare 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 abbigliamen-
to, 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 al-
izzazione 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, arat-
teristi 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 trasfer-
endo 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 svilup-
pata 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 automa-
tizzare 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 pos-
sibili 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
Us ita: 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.
Attivazione Allarme: gestis e l'avvio degli allarmi, sia per guasti, sia per a esso non
autorizzato, sia per allarmi manuali.
Disattivazione 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.

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 :
Una ma hina RTPLC ULISSE: 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.
Proto ollo CANopen: 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.
RFID: il lettore RFID fornito è ompatibile on tutti i transponder RFID TI LF e HF.
Rileva Tag RFID a una distanza di 10 m.
Foto ellule: le foto ellule fornite sono 2 foto ellule laser on riettore.
Ci alino: 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 Equip-
ment 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 u-
zione 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 opt-

15
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 Use Case


Gli 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


distinto gli

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.

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
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
aso 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
aso 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
aso 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
aso viene rilevato il transponder:
l'utente è tra gli ultimi inque entrati
aso non viene rilevato il transponder:
il sistema ignora il risultato della seriale
il sistema segnala l'us ita utente

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 malfun-
zionamenti 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;
l'attivazione dell'allarme prevede una distinzione tra le ause di
attivazione.
svolgimento il sistema rileva la ausa dell'attivazione dell'allarme
il sistema genera un messaggio di allarme
ri hiama la routine di gestione allarme

Tabella 3.3: Diagramma use ase e ezionali::ATTIVAZIONE ALLARME


(Figura:3.2)

Figura 3.2: use ase

21
Figura 3.3: use ase

22
attori utente
pre ondizioni la ma hina è sempre in allarme
svolgimento
aso 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
aso 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 ALLARME (Figura:3.3)

3.2 Diagrammi di sequenza

Passiamo adesso all'analisi delle interazioni tra routine e attore e vi eversa. I diagram-
mi 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'autor-
izzazione 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 at-
tivazione 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 pri-
mi 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'infor-
mazione 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 im-
plementati (denition.h, denition. , main. , timer. , nel progetto solo denition.h e def-
inition. 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 pro-
getto 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'ap-
pli 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 deni-
tion.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 implemen-
tate 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 svilup-
pano 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 svilup-
po dei messaggi di informazione e di allarme he devono essere visualizzate dall'RT-
PLC_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 hiara-
to 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 pe-
riferi 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 uzio-
ne 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 rou-
tineMain 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 rou-
tine_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 del-
l'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 rou-
tine/funzioni a stati onse utivi, poi hé è ne essario eseguirli tutti in un ordine presta-
bilito 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 or-
gimenti 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 hia-
mare 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 sta-
tus 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 del-

l'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 svilup-

pata nella routineMain, i ontrolli sono rappresentati mediante variabili di stato per di-

stinguere 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 imme-

diata 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'opt-

mod 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 intera-
gire 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'orolo-
gio 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 re-
set (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 on-
sistente. 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 pas-
saggio.
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'al-

46
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 sis-
tema, 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 o-
lare 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 interes-
sante 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 reg-
istrazione degli a essi di modo da poter ontrollare le situazioni arontate dalla ma hi-
na), l'impiego di 4 foto ellule due a due allineate verti almente ma poste ad altezze di-
verse (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 on e

#in lude
// :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" // Messages definitions

#pragma pa k ( push )
#pragma pa k ( 4 )
// :RTPLC_STRUCT_BEGIN
// :RTPLC_STRUCT_END

// :RTPLC_SYNONYMDEF_BEGIN
__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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE ULONG timerT ; // t i m e r s e r i a l e
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE ULONG type ; // t i p o a l l a r m e
__DEFINE ULONG t i m e r A l ; // t i m e o u t a l l a r m e
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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 )
__DEFINE 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 )
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE ULONG i [ 5 ℄ ; // u t i l i z z o p o s i z i o n e a h e
__DEFINE 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
__DEFINE 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
__DEFINE RTPLC_VARIANT R_openmode ; // m o d a l i t a ' a p e r t u r a f i l e
__DEFINE 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 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
__DEFINE 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
__DEFINE RTPLC_VARIANT output ; // o u t p u t da v i s u a l i z z a r e
__DEFINE ULONG timerA ; // t i m e o u t A l l a r m e
__DEFINE 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
__DEFINE SHORT Ora ;
__DEFINE SHORT Minuti ;
__DEFINE SHORT s e o n d i ;
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE RTPLC_VARIANT nome1 ; // p r i m o nome u t e n t e d e l l a a h e
__DEFINE RTPLC_VARIANT nome2 ; // s e o n d o nome u t e n t e d e l l a a h e
__DEFINE RTPLC_VARIANT nome3 ; // t e r z o nome u t e n t e d e l l a a h e
__DEFINE RTPLC_VARIANT nome4 ; // q u a r t o nome u t e n t e d e l l a a h e
__DEFINE RTPLC_VARIANT nome5 ; // q u i n t o nome u t e n t e d e l l a a h e
__DEFINE 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
__DEFINE RTPLC_VARIANT nomeN ; //nome u t e n t e r i m p i a z z a m e n t o
__DEFINE ULONG k ; // v a r a p p o g g i o
__DEFINE ULONG j ; // v a r a p p o g g i o
__DEFINE ULONG e ; // v a r a p p o g g i o
__DEFINE 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
__DEFINE ULONG V i s u a l i z z a ;
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE 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
__DEFINE RTPLC_BIT u s i t o ; // v a r i a b i l e d i u s i t a
__DEFINE 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
__DEFINE ULONG s ;
__DEFINE RTPLC_VARIANT uUs ente ; //nome u t e n t e u s e n t e
__DEFINE 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
__DEFINE 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
// :RTPLC_EVENTDEF_BEGIN
routine_main (LPVOID data ) ;
void RTPLC_ROUTINE r o u t i n e _ i n i t (LPVOID data ) ;
void RTPLC_ROUTINE t i m e r (LPVOID data ) ;
void RTPLC_ROUTINE r o u t i n e _ a l l a r m e (PRTPLC_FUNCTION_INPUT i n p u t ) ;
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 ) ;
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 ) ;
void RTPLC_ROUTINE r o u t i n e _ r e s e t (PRTPLC_FUNCTION_INPUT i n p u t ) ;
void RTPLC_ROUTINE 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 ) ;
void RTPLC_ROUTINE routine_aggiornaDB (PRTPLC_FUNCTION_INPUT i n p u t ) ;

void RTPLC_ROUTINE
// :RTPLC_EVENTDEF_END
r o u t i n e M a i n (LPVOID data ) ;
void RTPLC_ROUTINE r o u t i n e I n i t (LPVOID data ) ;

void RTPLC_ROUTINE routine_main (LPVOID data ) ;


void RTPLC_ROUTINE r o u t i n e _ i n i t (LPVOID data ) ;

void RTPLC_ROUTINE 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 ) ;
return
r e t v a l . value . ul ;
}

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 ) ;
return
r e t v a l . value . ul ;
}

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 ) ;
return
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 ) ;
return
r e t v a l . value . ul ;
}

// :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 di gestione dell ' appli azione
/gestita ome main dal framework
/si o upa del ontrollo di tutti i asi d ' uso gestiti dal progetto ∗/

void RTPLC_ROUTINE 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 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;

// a n e l l o tutti i messagi in sospeso


messagp ( (USHORT) 0 ) ;

if ( r e s e t==RTPLC_TRUE)
// i n aso venga ri hiesto il reset della ma hina

{
if ( ( type==1) | | ( i s A l 1==RTPLC_TRUE) )
{
// 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)
// v a r i a b i l e di stato status_main

{
if ( i n i z i o ==1)
// p r i m a iterazione devo inizializzare la a he
// L e t t u r a file e ari amento identifi ativi ( ok )
{
r e t=proxy_routine_leggiDB ( ) ;

if ( r e t ==0)
// 1 . lettura DB effettuata on su esso

i n i z i o =0;
else
if ( r e t==OMCS_WAIT)
// 2 . lettura DB i n ese uzione

i n i z i o =1;
else
if ( r e t <−1)
// 3 . lettura DB 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 a ese ontemporanemente ( ok )
== RTPLC_TRUE && f o t o 2 == RTPLC_TRUE)
{
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
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 ( ) ;
if ( r i t o r n o S ==1)
{
break ;
}
else
{
timerT =0;
if ( ( 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;
}
}
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 ( ) ;
if ( r i t o r n o C ==1)
{
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 == RTPLC_FALSE)
{
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 ;
}

ase 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 \n" ) ,
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)
{
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 la routine di allarme per la man ata
autorizzazione
break ;
}
else
{
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 ( 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" ) ) ;
else
t i m e r S o s t a=t i m e r S o s t a +1;
break ;
}
}
}

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;
if ( 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 ( k==6)
{
k=1; // r i i n i z i a a riempire d a l l ' i n i z i o d e l l a l i s t a
s =5;
}
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
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 ;
}
}

ase 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 _INTERNAL_GENERATION
#define DATABASE " dataBase . t x t "

#in lude " r t p l . h"


#in lude " 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 lavoro
l u e V e r d e=RTPLC_TRUE;
l u e R o s s a=RTPLC_FALSE;

// 1 . inizializzazione status routine


s t a t u s M a i n =0; // s t a t u s della routineMain
s t a t u s S e r i a l e =0; // s t a t u s della routine_leggiSeriale
statusLeggiDB =0; // s t a t u s della routine_leggiDB
s t a t u s A l l a r m e =0; // s t a t u s della routine_allarme
s t a t u s C o n t r o l l o U =0; // s t a t u s della routine_ ontrolUs ito
statusAggiornaDB =0; // s t a t u s della routine_aggiornaDB

// 2 . inizializzazione timer routine


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

// 3 . inizializzazione variabili
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 lettura filedatabase
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 prossimo
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 booleane


isOn1=RTPLC_FALSE; // o n t r o l l o r e passato stato di attivita ' foto ellula1
isOn2=RTPLC_FALSE; // o n t r o l l o r e passato stato di attivita ' foto ellula2
r e s e t=RTPLC_FALSE; // v a r i a b i l e di azionamento reset
a l l a r m e=RTPLC_FALSE; // v a r i a b i l e di azionamento allarme ( i alino )
f o t o 1=RTPLC_FALSE; // v a r i a b i l e ontrollo azionamento foto ellula1
f o t o 2=RTPLC_FALSE; // v a r i a b i l e ontrollo azionamento foto ellula2
sear hDB=RTPLC_FALSE; // v a r i a b i l e ontrollo autorizzazione
V i s u a l i z z a=RTPLC_FALSE; // v a r i a b i l e appoggio per l ' interfa ia
u s i t o=RTPLC_FALSE;
o n t r o l l a=RTPLC_FALSE; // v a r i a b i l e he segnala he 'e ' un utente in us ita
f a t t o=RTPLC_FALSE; // v a r i a b i l e indi a se e ' gia stato memorizzato
// l ' i d e n t i f i a t i v o d e l l ' utente us ente
i s A l 1=RTPLC_FALSE; // o n t r o l l o r e t y p e =1 allarme ( per evitare il possibile
// r e s e t manuale in aso di ingresso non autorizzato )

A.5 routine_allarme. :

#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 _ a l l a r m e (ULONG type ) ;
// : FUNCTION_BEGIN

void RTPLC_ROUTINE r o u t i n e _ a l l a r m e (PRTPLC_FUNCTION_INPUT input ) {


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 ) ;
}

61
// :FUNCTION_END

// :STUB_IMPLEMENTATION
/∗ R o u t i n e di gestione attivazione allarme .
/ param type numero di stato d e l l ' allarme attivato
/ ogni stato rappresenta un allarme diverso il numero passato per argomento

void
/ indi a l ' allarme da attivare ∗/
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;
// ogni 10 iterazioni ontrolla se un utente autorizzato si e ' identifi ato sul

if
lettore 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 leggiSeriale
== 1 )
{
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;
if( sear hDB == RTPLC_TRUE)
{
// 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 variabili globali
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 ) ;

}
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 " r t p l . h"


#in lude " d e f i n i t i o n s . h"
#in lude " 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 di ari amento della a he degli identifi ativi
/ return long indi a alla routine hiamante se la funzione leggiDB ha terminato la sua
ese uzione
/ 1 non ha terminato
/ 0 ha 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 di appoggio
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 )
// v a r i a b i l e di stato status_seriale

{
ase 0 : // apertura file 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 d e l l ' apertura del file inizializzato a ok
r e t = OM_OK;
// apertura 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" ) ) ;

if
// 1 . apertura fallita r e t <0
(OMFAILED ( r e t ) )
{
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 r e t ==1
i f ( r e t == OMCS_WAIT)
{
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 file
// v a r i a b i l e 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 r e t <0


i f (OMFAILED ( r e t ) )
return OM_ERROR;
// 2 . lettura file in ese uzione r e t ==1
i f ( r e t == OMCS_WAIT)
return 1 ;
// 3 . lettura file terminata r e t ==0
i f ( r e t == OM_OK)
{
statusLeggiDB =2;
return OMCS_WAIT;
}
ase 2 : // l e stringhe sul file devono essere del tipo : < o d i e >!<nome>
// t o k e n i z z o le linee lette da file e le inseris o nella prima posizione in
a he libera
// n I d 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 in ese uzione r e t =1
i f ( r e t == OMCS_WAIT)
return 1 ;
// 3 . fine operazione hiusura
i f ( r e t == OM_OK)
{
file_handle [ 0 ℄ = 0;
return 0 ;
}

default :

67
return 0;
}
return 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 aggiornamento identifi ativi in a he
/ implementa le funzioni di rimpiazzamento proprie di una a he
/ return long indi a alla routine hiamante se la funzione e ' terminata
/ 1 non e ' terminata
/ 0 e ' 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 di appoggio
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;

swit h ( statusAggiornaDB )
{
ase 0 :
{
// 1 . Apro il file
r e t = OM_OK;
// apertura 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 ℄ ) ;

if
// 1 . 1 apertura fallita r e t <0
(OMFAILED ( r e t ) )
{
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 ;
return OM_ERROR;
}
else
if ( r e t == OMCS_WAIT)
// 1 . 2 apertura in ese uzione r e t ==1

return OMCS_WAIT;
else
// 1 . 3 file aperto r e t ==0

68
if ( ret == OM_OK)

statusAggiornaDB = 1;

return OMCS_WAIT; // 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 ) ;

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 " ) , nomeN . v a l u e . s t r i n g .

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
// 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 1;

ase 2 :
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 1;

ase 3 :
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 1;

ase 4 :
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 1;

ase 5 :
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;
return 1;
default :
statusAggiornaDB =5;
return 1;
}

}
}
ase 5:
{
// 6 . h i u d o il file
ret = omfile lose ( file_handle [ 0 ℄ ) ;

if
// 1 . hiusura fallita r e t <0
(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;
}

if
// 2 . hiusura in ese uzione r e t =1
( r e t == OMCS_WAIT)
return 1;

if ( r e t
// 3 . fine operazione hiusura
== OM_OK)
{
file_handle [ 0 ℄ = 0;
statusAggiornaDB =0;
e =1;
return 0;

}
}
default : return 0;
}
}

A.8 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 di lettura porta seriale
/ return long indi a alla routine hiamante se la funzione e ' terminata
/ 0 e ' terminata
/ 1 non 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 risposta
OMFRESULT r e s ;
//OMFRESULT r e s 2 ;
USHORT mp ;
ULONG r e t ;
USHORT s i z e I ;

71
RTPLC_STRING format ;

// i n z i z i a l i z z a z i o n e variabili lo ali
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 buffer domanda
txBuffer [0℄ = 0 x01 ; // primo byte della request SOF
txBuffer [1℄ = 0 x09 ; // se ondo byte della request LENGHT MSB
txBuffer [2℄ = 0 x00 ; // terzo byte della request LENGHT LSB
txBuffer [3℄ = 0 x03 ; // quarto byte della request DEVICE ID
txBuffer [4℄ = 0 x01 ; // quinto byte della request CMD1
txBuffer [5℄ = 0 x41 ; // sesto byte della request CMD2
txBuffer [6℄ = 0 x01 ; // settimo byte della request TIME OUT
txBuffer [7℄ = 0x4A ; // ottavo byte della request LRC1
txBuffer [8℄ = 0xB5 ; // ultimo byte della request LRC2

i f ( k==5)
k=0;

// v a r i a b i l e di stato statusSeriale
swit h ( s t a t u s S e r i a l e )
{
ase 0 :
r e s=OMCS_OK;
// r i h i e s t a lettura alla seriale
// T r a s m i s s i o n e request 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 leggere
return 1 ;
else
{
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 da 0 nel aso
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 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 e ' diversa 0

// 1 . 1 ho ri evuto un identifi atore


s t a t u s S e r i a l e = 2 ; // a m b i o stato per iniziare mp onfronti on gli
identifi atori autorizzati
return 1 ; // l e t t u r a 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 ri er a identifi atore in a he
ase 2 :
{
// 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 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 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 %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 = id4


{
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 %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 %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 ) ;

return 0;
}
else
{
// e s p a n z i o n e :
// h i a m a una nuova routine ontrolla file
// h e aggiorna il database nel aso 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 ) ;
if ( r e t ==1)
return 1;
if ( r e t ==0)
{
if ( 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;

}
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 ( ) ;
// : FUNCTION_BEGIN

void RTPLC_ROUTINE r o u t i n e _ r e s e t (PRTPLC_FUNCTION_INPUT input ) {


stub_routine_reset () ;
}
// :FUNCTION_END

// :STUB_IMPLEMENTATION

void
/∗ f u n z i o n e di reset delle variabili globali ∗/
stub_routine_reset () {
// Routine per la ristabilizzazione di uno stato onsistente del pl
// a l l a r m ( (USHORT) 0) ;
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=" " ;
// 0 . segnalazione di impegno
l u e V e r d e=RTPLC_FALSE;
l u e R o s s a=RTPLC_TRUE;

// 1 . riinizializzazione variabili di stato


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;

75
// 2 . riinizializzazione timer
timerT =0;
timerA =0;
t i m e r A l =0;
t i m e r S o s t a =0;

// 3 . riinizializzazione variabili booleane


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;

// 4 . riinizializzazione variabili
// ( non vengono resettati : rxLen e inizio )
type =0;
g f o t o 1 =0;
g f o t o 2 =0;
nId =1;
k=0;
j =0;
s =0;

// 5 . riinizializzazione 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 ) ;

// 6 . delete 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