Domotica Industriale

  • Uploaded by: Rita
  • 0
  • 0
  • December 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Domotica Industriale as PDF for free.

More details

  • Words: 35,729
  • Pages: 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 1.1 Sistemi di identi azione a radiofrequenza Storia

. . . . . . . . . . . . . .

6

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

6

RFID struttura interna

1.2

1.3

. . . . . . . . . . . . . . . . . . . . . . . . . . .

6

. . . . . . . . . . . . . . . . . . . . . . . .

7

. . . . . . . . . . . . . . . . . . . . . . . .

8

Appli azioni RFID . . . . Ma

hina utilizzata: PLC Storia

5

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

9

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

9

. . . . . . . . . . . . . . .

9

Proto ollo di omuni azione CANOPEN

2 Il Problema 2.1 Presentazione progetto . . . . . 2.2 Use ase sviluppati . . . . . . . . 2.3 Periferi he fornite da utilizzare RTPLC

12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

. . . . . . . . . . . . . . . . . . . . .

14

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

3 Analisi 3.1 3.2

3.3

12

Use Case

17 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

17

. . . . . . . . . . . . . . . . . . . . . . . . . .

23

. . . . . . . . .

26

. . . . . . . . . . . . . . . . . . . . . . . . . .

27

Diagrammi di sequenza

Progettazione si a (Distanza minima tra le foto ellule)

Diagrammi di attività

4 La Soluzione 4.1 Strutturazione del progetto . . . . . . 4.2 Funzionalità routine . . . . . . . . . . . 4.3 Struttura interna delle routine . . . . 4.4 Gestione delle interazioni tra routine 5 Implementazione 5.1 S elte implementative 5.2 Sviluppo ontrolli . . .

31 . . . . . . . . . . . . . . . . .

31

. . . . . . . . . . . . . . . . .

34

. . . . . . . . . . . . . . . . .

36

. . . . . . . . . . . . . . . . .

37

39 . . . . . . . . . . . . . . . . . . . . . . . . . .

39

. . . . . . . . . . . . . . . . . . . . . . . . . .

40

6 Manuale 6.1 Funzionalità oerte . . . . 6.2 Presentazione interfa

ia . 6.3 Uso dell'interfa

ia utente

41 . . . . . . . . . . . . . . . . . . . . . . . .

41

. . . . . . . . . . . . . . . . . . . . . . . .

42

. . . . . . . . . . . . . . . . . . . . . . . .

42

1

7 Con lusioni e sviluppi futuri

49

A Codi e A.1 denition.h: . . . . . . A.2 denition. : . . . . . . A.3 routineMain. : . . . . . A.4 routineInit. : . . . . . A.5 routine_allarme. : . . A.6 routine_leggiDB. : . . A.7 routine_aggiornaDB. : A.8 routine_leggiSeriale. : A.9 routine_reset. : . . . .

50 50 52 54 60 61 65 68 71 75

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

2

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

Elen o delle gure 1.1 tag RFID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Data Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7 10

2.1 RTPLC-SIMU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15

3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9

use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . use ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . .

. . . . . .

19 21 22 24 25 26 27 28 29

6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12

S hermata inziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S hermata attesa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S hermata man ato passaggio . . . . . . . . . . . . . . . . . . . . . . . S hermata impegno foto ellula1 . . . . . . . . . . . . . . . . . . . . . . S hermata passaggio eettuato . . . . . . . . . . . . . . . . . . . . . . S hermata us ita utente . . . . . . . . . . . . . . . . . . . . . . . . . . S hermata di reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S hermata allarme manuale . . . . . . . . . . . . . . . . . . . . . . . . S hermata allarme impegno simultaneo delle foto ellule . . . . . . . . . S hermata allarme Foto ellula2 guasta(o impegnata da troppo tempo) . S hermata allarme man ata autenti azione . . . . . . . . . . . . . . . S hermata messaggio blo

o del reset . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . .

43 43 44 44 45 45 46 46 47 47 48 48

Diagramma di sequenza entrata . Diagramma di sequenza us ita . . Diagramma di sequenza generale Diagramma di attività 1 . . . . . Diagramma di attività 2 . . . . . Diagramma di attività 3 . . . . .

3

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

Ringraziamenti Stima e ri onos enza va al Prof. Augusto Ciuoletti, per la sua disponibilità, i preziosi

onsigli sia durante il tiro inio sia spe i atamente nella stesura della tesi. Ringrazio il dott. Andrea De Nardis, (Capo del entro sviluppo presso la ditta ISAC) per avermi dato la possibilità di svolgere il mio tiro inio presso la sua azienda, e di utilizzare le ma

hine per testare il progetto. Un ringraziamento grande an he ai ragazzi he lavorano nell'azienda (Fran es o, Stefano P., Stefano S., Mi hele, Matteo, Jonny, Antonio, Dario, Massimo), per avermi aiutata a apire ome svolgere il tiro inio e per avermi a

olta subito in un ambiente molto familiare. Ringrazio la mia mamma Teresa, per il sostegno morale e materiale durante il onseguimento di questa laurea supportandomi sempre in questi anni di università. Un grande ringraziamento va a mia sorella Marina per l'aiuto importante he mi ha dato nella stesura della tesi e per avermi sempre in oraggiata. Ringrazio Federi o, per tutto il suo amore e per avermi sopportata in questi anni nei momenti tranquilli, nelle ansie pre-esami e in queste ansie pre-laurea standomi sempre vi ino. Inne ringrazio tutti i miei ami i, ami he e ompagni di orso per la loro ami izia e per il ruolo fondamentale he hanno avuto in questi anni.

4

Capitolo 1 Introduzione La parola Domoti a indi a la s ienza interdis iplinare he si o

upa dello studio dell'automatizzazione di ambienti. Il termine deriva dalla parola fran ese Domotique, espressione verbale questa, formata dalla parola domus e dai termini informatique e télématique. In senso stretto, la Domoti a, è quella des iplina nata per automatizzare ed integrare le funzionalità di un ambiente domesti o apportando omodità nella vita di tutti i giorni. Gli ambiti in ui si sviluppa sono quattro: risparmio energeti o, onfort, si urezza, safety. Mediante un sistema domoti o è possibile gestire gli impianti interni senza spre o di energia ( può ontrollare he non rimangano a

ese lu i in assenza di utenti all'interno dell'ambiente). Rendendo automatizzati i ontrolli della struttura, l'utente non deve o

uparsi del ontrollo degli appare

hi, il sistema garantis e la si urezza della struttura e dell'utente, ontro l'intrusioni si he o all'interno del software di sistema. Gli impianti domoti i devono avere i seguenti requisiti: • modularità : il sistema è diviso in moduli separati da gestire • s alabilità : il sistema è indipendente dalle prestazioni dell'hardware, ogni ompo-

nente può essere sostituito.

• reattività : il sistema deve reagire in tempi brevi • tempo reale: il sistema deve reagire in base ai ambiamenti esterni

Grazie a questa dis iplina è possibile ostruire la propria asa a misura d'uomo integrando an he tutte le situazioni parti olari dovute a handi ap: è infatti s opo della domoti a permettere a hiunque di poter interagire on tutte le appare

hiature presenti nelle nostre ase. Le innovazioni portate dalla Domoti a, trovano appli azioni an he in ambienti industriali e aziendali, dove le stesse te ni he di automazione vengono utilizzate per la gestione di impianti di produzione, videosorveglianza, ontrollo presenze autorizzate,

ampionamento remoto dei sensori, diagnosti a della linea di produzione. Queste nuove appli azioni industriali sono già state sviluppate da molte aziende del settore utilizzando me

anismi sempre più avanzati. Il progetto he si è sviluppato, rappresenta un'appli azione della domoti a in ambito industriale, sviluppata on l'ausilio di dispositivi elettroni i di rilevamento. Questo 5

aspetto è in entrato sul ontrollo delle presenze autorizzate, quindi sulla si urezza di un ambiente aziendale. Sono già state sviluppate soluzioni alternative a quella presentata. Ad esempio l'utilizzo di un lettore biometri o per il ri onos imento delle impronte digitali, l'impiego di un tastierino numeri o (in questo aso il ontrollo viene eseguito dal sistema ontrollando il

odi e inserito) l'impiego di un sensore di prossimità DGLP. La soluzione presentata utilizza la rilevazione tramite foto ellule e il ri onos imento tramite tag RFID. Il reader RFID è una soluzione, per in ontrollo degli a

essi, he è già stata adottata da molte aziende di si urezza e domoti a.

1.1 Sistemi di identi azione a radiofrequenza

Storia

I dispositivi a radio frequenza si sono sviluppati durante di anni 50, in seguito alle ri er he eseguite negli anni della guerra per inviare messaggi riptati in ambienti perturbati da interferenze elettromagneti he. I primi sistemi RFID utilizzavano un transponder he gestiva un'informazione di 1 bit per poter permettere il rilevamento della presenza/assenza dell' utente. Negli anni 70 gli inventori e i laboratori, pubbli i ed universitari, iniziarono a sviluppare i sistemi radio per identi are materiali prodotti da attività nu leari e personale

oinvolto nelle attività . L'RFID fu impiegato an he in ambito militare e per l'identi azione di animali, on transponder a bassa frequenza e on transponder operanti nelle mi roonde. In seguito fu impiegato in ambito dei trasporti per ontrollare i vei oli e la mer e transportata. Iniziò a divenire una te nologia in grande espansione sia negli Stati Uniti sia in Europa on eettivi obiettivi ommer iali. Negli anni 80 l'RFID si aermò ome te nologia ormai ompleta, sviluppata negli Stati Uniti, nel ontrollo di mer i e mezzi trasportati, a

esso del personale e identi azione animali; in Europa si sviluppò maggiormente per l'identi azione di animali, per attività industriali e il ontrollo/a

esso alle autostrade. Solo negli anni 90 si presentarono le ondizioni per lo sviluppo dell'RFID moderno (simile a om'è oggi); i ir uiti si rimpi

iolirono, permettendo una diminuizione dei

onsumi di energia tale da non aver bisogno dell'alimentazione da rete elettri a, poi hé ri evevano energia su iente già dall'onda elettromagneti a generata dal lettore he li interrogava; si iniziarono a utilizzare memorie RAM he eliminavano la ne essità di utilizzare memorie tampone per mantenere i dati in memoria. Si ebbe l'inizio delle appli azioni di massa in settori spe i i, quali le autostrade, permettendo agli autovei oli a

essi autorizzati alle diverse zone.

RFID struttura interna RFID è una te nologia per l'identi azione automati a di oggetti, animali o persone sfruttando le onde radio e leggendo le informazioni ontenute in parti olari eti hette. Il sistema si basa sulla lettura a distanza di informazioni ontenute in un tag usando dei lettori RFID. 6

Figura 1.1: tag RFID Il Tag è un omponente elettroni o omposto da un hip, un'antenna e da una batteria per l'alimentazione del hip (quest'ultima non è sempre ne essaria). È possibile inviare e ri evere informazioni dal tag RFID trasmettendo via radiofrequenza. Spesso il transponder viene inserito in un supporto quale una tessera di plasti a per evitare he si danneggi. Il tag è ostituito da una memoria non volatile he ontiene il

odi e uni o he viene trasmesso al lettore tramite l'antenna (Figura:1.1). Esistono due tipi di tag: i tag attivi e quelli passivi. I primi sono tag on una alimentazione interna indipendente, i se ondi sono tag he hanno bisogno di un'alimentazione proveniente dall'esterno. In questo aso è il lettore stesso a fornire l'alimentazione ne essaria emettendo un ampo elettromagneti o, he tramite induzione fornis e al tag la

orrente utile ad alimentare il hip. Il lettore è un supporto sso he non ha ne essità della visibilità otti a della tag per poterne leggere il odi e, né del ontatto, e per questo è ritenuta una te nologia migliore del odi e a barre o della banda magneti a. È ostituito da due parti : l'unità di ontrollo, un mi ro al olatore on un sistema operativo real time he gestis e le funzionalità del lettore; le antenne, he ostituis ono la reale interfa

ia verso il transponder. Le prestazioni del transponder e del lettore, ri hieste da ogni spe i o pro esso, non hanno impatto sulla struttura si a dell'oggetto ma sulla distanza di lettura e sulla

apa ità di memorizzare informazioni.

Appli azioni RFID La te nologia RFID può essere onsiderata il su

essore del odi e a barre. Le possibilità di utilizzo di questa, a dierenza del se ondo sistema, non si limitano alla sempli e identi azione automati a, dal momento he è possibile memorizzare informazioni e sosti ate operazioni di programmazione all'interno della memoria del transponder. Grazie alle fun7

zionalità sempre più avanzate e all'integrazione dei omponenti, la te nologia RFID ha sostituito la barra magneti a in numerosi ampi tra ui i seguenti:

Appli azioni medi he: I hip RFID possono essere impiegati in appli azioni he ri hiedono alti livelli di si urezza, ome i laboratori lini i e biote nologi i, e per l'identi azione di persone ed oggetti in modo automati o, si uro e velo e, al ne di ottimizzare i pro essi di riduzione degli errori, parti olarmente riti i, in quanto hanno riper ussioni sulla salute umana. Fra le appli azioni della te nologia RFID legate alla salute dell'uomo, ma non strettamente alla medi ina, è in lusa l'identi azione degli atleti durante le manifestazioni sportive allo s opo, non solo di misurarne i tempi, ma an he di assi urare un intervento rapido in aso di malori. In al uni stadi di baseball aliforniani sono stati adottati bra

ialetti RFID ontenenti i dati anagra i degli spettatori, allo s opo di impedire la vendita di al oli i ai minorenni durante le partite.

Anti ontraazione: Sono state sviluppate ome soluzione per l'identi azione della

ontraazione di do umenti, di beni di lusso, ome a

essori, api di abbigliamento, liquori, profumi mediante tag RFID, inserendo la erti azione di origine e provenienza all'interno della mamemoria del tag.

A

essi a strutture pubbli he e industriali: Vengono utilizzati sistemi RFID per il

ontrollo di a

essi a strutture ban arie, par heggi in ambito industriale on lo alizzazione di personale in ambienti a elevata si urezza. Questo tipo di appli azione del sistema RFID, è stata sviluppata nel progetto per il ontrollo degli a

essi al magazzino in modo da garantire un'alta si urezza alla struttura e alle mer i.

1.2

Ma

hina utilizzata: PLC

Il PLC è un omputer industriale programmabile spe ializzato nella gestione dei pro essi industriali. Esegue programmi di gestione di segnali digitali e analogi i dirigendo le azioni al olate sugli attuatori presenti sull'impianto. L'evolversi della te nologia sta progressivamente mignaturizzando i omponenti elettroni i diminuendo i osti del PLC e fa ilitandone la diusione an he in ampi non industriali, quali l'ambiente domesti o. I pannelli PLC vengono infatti utilizzati an he per la gestione di sistemi utili per la asa ome salvavita, antifurto, impianto di ris aldamento e di irrigazione, rendendo automatizzato il ontrollo di questi appare

hi. Una aratteristi a prin ipale del PLC è la robustezza atta a sopportare interferenze elettromagneti he, alte temperature e periodi di attività molto lunghi e ontinui, aratteristi he proprie degli ambienti industriali. La struttura del PLC viene adattata in base al pro esso da automatizzare. Durante la progettazione del sistema di ontrollo, vengono s elte le s hede adatte alle grandezze elettri he in gio o. Le varie s hede vengono quindi inserite sul BUS o ra k del PLC.

8

Storia I PLC si sono sviluppati se ondo la ri hiesta del mer ato industriale. A partire dagli anni 70 vi era ri hiesta di appare

hiature in grado di eseguire logi he elementari. Le prime ma

hine avevano un software rigido e potevano svolgere solo po he funzioni, avendo nello stesso tempo un osto proibitivo e un sistema he risultava omplesso. Negli anni 80 l'industria mise sul mer ato al uni PLC on s hede di modularità e s hede di ingressi e us ita, mantenendo però un prezzo troppo alto per permetterne la diusione tra le industrie. Solo negli ultimi anni vi è stata una reale diusione dei PLC

on una ompleta gamma di a

essori he oprono molte delle appli azioni possibili; an he il linguaggio di programmazione è ambiato passando ad un linguaggio ad alto livello, essendo troppo ompli ato programmare i PLC on linguaggio a basso livello. La te nologia del PLC si è evoluta no ad arrivare a PLC on alte prestazioni e on sistemi operativi moderni ome Windows NT: attualmente sono ma

hine diuse in s ala mondiale ed utilizzate in molti ambiti.

PLC struttura interna e funzionamento Il PLC è ostituito da una CPU, memorie sia volatili he retentive, moduli IN/OUT, un dispositivo di programmazione e un alimentatore. L'unità entrale è basata su un singolo pro essore, solo per appli azioni riti he si utilizzano multipro essori. è presente sia una memoria persistente, he ontiene il sistema operativo, il programma utente e le variabili retentive, sia una memoria volatile dove vi sono l'immagine degli ingressi, delle us ite e delle variabili interne globali he vengono utilizzate per operazione da un i lo all'altro. I moduli di I/O onvertono i segnali provenienti dai sensori in un formato digitale. La prima osa he il PLC ompie è la lettura degli ingressi sia digitali he analogi i, on board o su bus di ampo (s hede remote ollegate al PLC o on una rete di omuni azione). Dopo aver letto tutti gli ingressi, il loro stato viene memorizzato in una memoria

he è denita Registro immagine degli ingressi. A questo punto le istruzioni di omando vengono elaborate in sequenza dalla CPU e il risultato viene memorizzato nel Registro immagine delle us ite. Inne, il ontenuto dell'immagine delle us ite viene s ritto sulle us ite si he ovvero le us ite vengono attivate. L'elaborazione delle istruzioni si ripete ad ogni i lo; il tempo he il ontrollore impiega per una singola elaborazione viene detto tempo di i lo (solitamente po hi millise ondi). 1.3

Proto ollo di omuni azione CANOPEN

Controller Area Network (CAN) è uno standard seriale per bus di ampo, ossia per forme di omuni azione digitale presenti su reti a basso livello per la omuni azione on periferi he quali sensori, i alini, led; si basa su ollegamenti punto a punto on segnali a 4-20mA. Il proto ollo CAN assi ura un elevato sistema di si urezza per le omuni azioni di sistemi in real time on bit rate no a 1Mb. Questo proto ollo è strutturato su 3 livelli: livello oggetto, livello trasferimento, livello si o. 9

Figura 1.2: Data Frame Il Livello oggetto è il livello he si o

upa del ltraggio delle informazioni e della traduzione dei messaggi da linguaggi a basso livello a linguaggi ad alto livello. Il Livello trasferimento è il livello he si o

upa della gestione degli errori a basso livello e di tutto iò he ri hiede una omuni azione garantita (a knowledgement). Viene valutato lo stato della omuni azione, se in ri ezione o in invio, ontrollando lo stato del bus. Il Livello si o è il livello he si o

upa della rappresentazione binaria dei messaggi trasferendo i bit di informazione tra i nodi diversi. I primi due livelli si o

upano del Data Link delle omuni azioni, denito dal modello Open Systems Inter onne tion (ISO/OSI), trasmettendo al livello superiore una omuni azione priva di errori. Il livello si o a

etta e trasmette i messaggi tradotti in binario senza preo

uparsi del ontrollo dei pa

hetti; poi hé è il livello data link ad o

uparsi del rispetto dei vin oli. Tutti i nodi ondividono lo stesso livello si o. Il proto ollo viene usato soprattutto per hé garantis e le seguenti proprietà prin ipali molto utili per la omuni azione in real time: • garanzia della gestione di vari livelli di priorità asso iati ai singoli messaggi • garanzia tempi di latenza • essibilità di ongurazione • ri ezione multi ast on sin ronizzazione temporale • rilevamento e segnalazione di errori • ritrasmissione automati a di messaggi, errati • gestione di errori temporanei • gestione di stati di malfunzionamento permanente • isolamento automati o di nodi difettosi

10

La omuni azione dei segnali da parte delle varie unità, avviene tramite omuni azione in multi ast supportata dal ltraggio dei messaggi, he garantis e ad ogni unità di ra

ogliere solo le informazioni ne essarie. La politi a di a

esso multiplo utilizzata per l'a

esso al anale in multi ast, è il CSMA-CD, politi a on rilevazione della portante e ri onos imento delle ollisioni, alla quale viene aggiunto l'utilizzo della priorità tra messaggi he stabilis e quale messaggio si aggiudi a il bus di omuni azione. Si parla di bit re essivo e di bit dominante in aso di

omuni azione simultanea he vede il bit 0 ome dominante mentre il bit 1 ome re essivo (in una omuni azione simultanea bit 0 e bit 1 risulta sul anale lo 0). I vari dispositivi hanno a disposizione un metodo di invio di remote frame per ri hiedere agli altri nodi l'informazione di interesse.(Figura:1.2). All'interno del ampo Arbitration eld vi è il ampo RTR he indi a se il frame è re essivo, quindi un remote frame, o dominante, quindi un data frame. L'arbitraggio è implementato basandosi an he sul tipo di frame inviato (se dominante o re essivo) in modo he, in aso di invio simultaneo di un remote frame e un data frame, viene favorito il data frame.

11

Capitolo 2 Il Problema 2.1

Presentazione progetto

Il problema presentato è l' implementazione di un'appli azione per il ontrollo degli a

essi ad un magazzino. Si tratta quindi dello sviluppo di un sistema Domoti o per automatizzare tale ontrollo. Le soluzioni appli abili per lo sviluppo di questo sistema sono molte. In questo aso spe i o è stato ri hiesto di utilizzare un sistema di identi azione basato sulla te nologia RFID, he rappresenta una possibilità di rilevazione di tag e sta sostituendo le bande magneti he e i odi i a barre. Mediante RFID, è stato possibile sviluppare un sistema di interazione on l'uomo, eliminando il bisogno di visibilità eettiva del tag da parte del lettore RFID. Questo rappresenta un esempio di automazione dell'ambiente. L'appli azione sviluppata può essere installata in ambienti senza il bisogno di apportare modi he, quindi garantis e la proprietà di portabilità . La soluzione è stata sviluppata utilizzando una periferi a di lettura RFID su porta seriale RS-232, due foto ellule e un i alino, tutti e tre ollegati al sistema tramite un dispositivo CAN. Questo tipo di soluzione rappresenta una delle possibilità per automatizzare un ontrollo a distanza. Il software è stato sviluppato su p on sistema operativo Windows XP Professional sp3, utilizzando Visual studio 2005 Professional ome ambiente di sviluppo e l'appli azione RTPLC-SIMU ome ambiente di simulazione. RTPLC-SIMU da la possibilità di ri reare gli use ase di ui è ri hiesta la gestione,

ontrollando l'ese uzione delle routine e simulando il ambio di stato dei nodi digitali di ingresso/us ita, testando il funzionamento in ambiente ontrollato. Per questo si è rilevato fondamentale per lo sviluppo del progetto e per l'ese uzione dei test iniziali di funzionalità . Per il test eettivo dell'appli azione, inserita in un ontesto real time, si è utilizzata l'implementazione RTPLC ULISSE. 2.2

Use ase sviluppati

L'appli anzione deve gestire gli use ase dovuti alle varie situazioni he possono essere rilevate e ri onos iute dalla ma

hina mediante le periferi he fornite. Trattandosi di use

12

ase reati da utenti umani, non sempre è possibile riprodurre tutte le situazioni he si possono reare intorno alla ma

hina. Per lo sviluppo della soluzione, e per rius ire a prendere in onsiderazione tutte le possibili situazioni he si possono ri reare, sono state analizzate le possibili azioni dell'utente e gli stati assunti dalle periferi he, in quanto ogni stato è utilizzato dall'appli azione per

omprendere la situazione reale he si è reata.

• Utente:

 attivazione del lettore RFID tramite transponder di ri onos imento  impegno foto ellula1  impegno foto ellula2 • Lettore RFID

 lettura identi ativo valido  lettura identi ativo non valido  man ata lettura (invio di un id nullo) • Foto ellula1

 interruzione raggio foto ellula (attivazione)  man ato impegno foto ellula1 • Foto ellula2

 impegno raggio foto ellula (attivazione)  man ato impegno foto ellula2 • Ci alino

 attivazione  non attivato

Il software gestis e il funzionamento della ma

hina valutando lo stato in ui si trova ogni periferi a per apire quale situazione deve essere ontrollata. Gli attori previsti negli use ase sono rappresentati da un utente, he può provo are solo use ase di allarme manuale o a

esso non autorizzato, e il sistema. È possibile an he avere asi on più di un utente in direzioni diverse (uno in entrata uno in us ita). In questo aso vi sono al uni vin oli da rispettare per assi urare il orretto svolgimento dell'appli azione: poi hé la rilevazione di entrata è blo

ante, è ne essario he l'utente in entrata si identi hi dopo

he l'utente in us ita abbia impegnato la foto ellula2. La ma

hina deve gestire i seguenti use ase: Entrata: un utente entra nella struttura ontrollata dalla ma

hina. Le possibilità gestite sono sia di autenti azione tramite tag, on o senza a

esso eettivo, sia di man ata autenti azione, on o senza a

esso non autorizzato.

13

un utente es e dalla struttura ontrollata dalla ma

hina. Le possibilità gestite sono sia di us ita on autenti azione tramite tag, sia senza autenti azione.

Us ita:

gestis e l'avvio degli allarmi, sia per guasti, sia per a

esso non autorizzato, sia per allarmi manuali.

Attivazione Allarme:

gestis e il ritorno ad uno stato onsistente dell'appli azione distinguendo però gli allarmi di a

esso non autorizzato dagli altri allarmi e quindi gestendo due tipi di ristabilizzazione diversi.

Disattivazione Allarme:

Gli use ase analizzati sono quelli ri hiesti dal tutore aziendale, sono stati testati sia in ambiente teori o (su RTPLC SIMU) sia in ambiente reale (su RTPLC ULISSE), dandomi la possibilità di notare use ase parti olari e situazioni an ora non gestite. L'appli azione segue le ri hieste del progetto, riportando sempre la ma

hina ad uno stato di quies enza e segnalando all'RTPLC i messaggi di informazione. 2.3

Periferi he fornite da utilizzare

Per l'eettivo funzionamento dell'appli azione in un ambiente reale, si devono utilizzare al une periferi he hardware ne essarie per la rilevazione dei tag e per la gestione degli ingressi/us ite. Le periferi he fornite si sono rivelate molto utili per testare il progetto in rapporto a un utente reale, dando la possibilità di reare stati di utilizzo più simili all'ambiente in ui dovrà essere impiegato. L'azienda ha messo a disposizione tutte le periferi he ne essarie : la piattaforma ULISSE è una delle implementazioni del progetto RTPLC, ompleta di hardware basato su Advan ed RISC Ma hine 9 (ARM9) on sistema operativo windows CE .NET 5.0.

Una ma

hina RTPLC ULISSE:

il proto ollo CAN onsente di ontrollare no a 63 dispositivi

ompatibili DS401(ingresso/us ita). Vi sono state ollegate le due foto ellule ome ingressi il i alino e due possibili led ome us ite. Il dispositivo CAN per assi urare il funzionamento ri hiesto dall'appli azione è stato ongurato on un bit-rate di 1Mb/s e 3 dispositivi ollegati.

Proto ollo CANopen:

il lettore RFID fornito è ompatibile on tutti i transponder RFID TI LF e HF. Rileva Tag RFID a una distanza di 10 m.

RFID:

Foto ellule: Ci alino:

le foto ellule fornite sono 2 foto ellule laser on riettore.

pi

olo avvisatore a usti o he emette un suono stridulo.

È utile approfondire il funzionamento del lettore RFID e il reader utilizzato per il progetto, per apire il funzionamento dell'appli azione all'interno della ma

hina ULISSE.

14

Figura 2.1: RTPLC-SIMU

RTPLC RTPLC è il progetto ISAC per la serie di prodotti Programmable Automation Controller (PAC), ovvero un PLC apa e di funzionalità avanzate di omuni azione ed integrazione

on attori software o umani. RTPLC onsente l'ese uzione di una logi a programmabile dal liente Original Equipment Manufa turer (OEM) al ne di ontrollare lo stato delle omponenti si he di us ita. Tali omponenti si he sono di varia natura, possono essere ollegate all'unità entrale in modi molto diversi tra di loro, e la loro gestione è a ari o del software di base. L'ese uzione delle omponenti riti he, ompresa la legge di ontrollo del liente, viene eettuata on tempi erti, ovvero lo stesso usso del programma viene eseguito sempre nello stesso tempo. RTPLC può essere usato in ontesti variegati grazie alla sua estrema essibilità. È stato progettato per poter essere fa ilmente programmabile e per rendere la legge di ontrollo indipendente dalla natura delle omponenti si he di ingresso ed us ita. Le implementazioni del RTPLC sono i vari prodotti dell'azienda distinti per prestazioni e hardware utilizzato (RTPLC-SIMU Figura: 2.1) Ogni implementazione è ostituita da una parte hardware e una parte software. La

omponente software è rappresentata dal framework: questo rea un ambiente di ese uzione multithread omogeneo e astratto dall'hardware, al ne di eseguire in tempi erti la legge di ontrollo implementata, in modo da poter gestire tutti gli ingressi, le us ite, i proto olli di manutenzione e di omuni azione ne essari allo sviluppo dell'appli azione ri hiesta (puo' essere implementata in C). Questa omponente è ontenuta in moduli PLC ari ati su omando dal framework, he provvede a veri are l'esistenza delle risorse ri hieste per l'ese uzione, e quindi, ad eseguire tale legge. Nel aso sia ne essario, il framework aumenta le sue possibilità in ludendo gli opt15

mod (pre edentemente installati sulla ma

hina), ioè moduli opzionali indipendenti dal framework, he interagis ono strettamente on esso, aggiungendo apa ità parti olari. Per il progetto è stato ne essario installare l'OMCOM e l'OMFILE; il primo è un optmod

he onsente la omuni azione on una porta seriale dando la possibilità di leggere dati e inviarne, il se ondo onsente la gestione dei le fornendo tutte le funzioni ne essarie per la loro lettura e s rittura.

16

Capitolo 3 Analisi 3.1 Gli

Use Case

use ase

rilevati sono stati analizzati per poter essere ri reati all'interno dell'appli-

azione e per essere gestiti ompletamente garantendo la stabilità dell'appli azione. Ho

use ase di default (entrata e us ita), situazioni di normalità in ui la ma

hina si può trovare, dagli use ase parti olari (allarmi), situazioni parti olari he ne essitano di attenzione da parte dell'utente. Analizzo prima gli use ase di default. distinto gli

17

attori Utente pre ondizioni tutti i dispositivi sono funzionanti il transponder ritorna sempre un valore per l'identi ativo svolgimento l'utente e munito di transponder e attiva il lettore RFID

aso

aso

aso

il lettore RFID dopo assere stato interrogato dal sistema fornis e l'identi ativo rilevato il sistema ontrolla la presenza dell'indenti ativo tra quelli ari ati su variabili globali non presente tra le variabili globali: il sistema rilegge il le DataBase per aggiornare la a he

aso è presente nel resto del le il sistema ari a il nuovo identi ativo su una delle variabili globali il sistema segnala la veri a dell'identi ativo e es e dalla funzione l'identi ativo veri ato nel db e presente: il sistema si pone in attesa dell'attivazione della foto ellula1 la foto ellula1 viene impegnata

aso la foto ellula2 viene impegnata viene registrato l'ingresso sulla lista degli ultimi 5 ingressi viene generato un messaggio di informazione

aso la foto ellula2 non viene impegnata il sistema mantiene in memoria l'avvenuta autorizzazione la foto ellula1 non viene impegnata il sistema ignora l'autorizzazione L'identi ativo non è stato veri ato: la foto ellula1 viene impegnata il sistema rileva la man ata autorizzazione il sistema attiva l'allarme ingresso non autorizzato

Tabella 3.1: Diagramma use ase default::ENTRATA (Figura:3.1)

18

Figura 3.1: use ase

19

attori Utente pre ondizioni tutti i dispositivi sono funzionanti svolgimento la foto ellula2 viene impegnata dall'utente il sistema veri a se la foto ellula1 è già stata impegnata

aso la foto ellula1 è stata impegnata: si passa al aso d'uso di entrata

aso la foto ellula1 non è stata impegnata:

viene segnalata l'avvenuta us ita dell'utente il sistema interroga il lettore RFID per una eventuale lettura del transponder viene rilevato il transponder: l'utente è tra gli ultimi inque entrati non viene rilevato il transponder: il sistema ignora il risultato della seriale il sistema segnala l'us ita utente

aso

aso

Tabella 3.2: Diagramma use ase default::USCITA (Figura:3.1)

VERIFICA DATA BASE

Il sistema utilizza una a he ari ata all'avvio del programma, omposta da i primi 5 nominativi presenti su le. Nel aso il tag rilevato non appartenga ai nominativi in

a he, il sistema a

ede al le direttamente ontrollando se è presente tra gli eventuali rimanenti nominativi presenti sul le. Analizzo adesso i asi e

ezionali: gli allarmi he la routine_allarme deve gestire, sono allarmi dovuti sia a malfunzionamenti delle periferi he hardware, sia ad a

essi non autorizzati, sia allarmi attivati dall'utente manualmente: • a

esso non autorizzato • attivazione simultanea delle foto ellule • possibile guasto foto ellula1 • possibile guasto foto ellula2 • possibile guasto lettore RFID • manuale

La gestione degli allarmi garantis e la si urezza del magazzino eliminando la possibilità di interventi, tramite interfa

ia, nel aso di a

essi non autorizzati.

20

attori sistema, utente pre ondizionil'utente può attivare solo l'allarme manuale; svolgimento

Tabella 3.3: (Figura:3.2)

l'attivazione dell'allarme prevede una distinzione tra le ause di attivazione. il sistema rileva la ausa dell'attivazione dell'allarme il sistema genera un messaggio di allarme ri hiama la routine di gestione allarme Diagramma use ase e

ezionali::ATTIVAZIONE

Figura 3.2: use ase 21

ALLARME

Figura 3.3: use ase

22

attori pre ondizioni svolgimento

aso

aso

utente la ma

hina è sempre in allarme allarme diverso da man ata autorizzazione: l'utente utilizza il tasto di reset della ma

hina la ma

hina torna ad uno stato onsistente viene tolto il messaggio di allarme allarme man ata autorizzazione: l'utente utilizza il proprio transponder per farsi identi are dalla ma

hina

aso il transponder rilevato dal lettore di RFID è autorizzato: la ma

hina torna ad uno stato onsistente viene tolto il messaggio di allarme

aso il transponder rilevato dal lettore di RFID non è autorizzato la ma

hina rimane in uno stato di allarme:

Tabella 3.4: Diagramma use ase e

ezionali::GESTIONE 3.2

ALLARME

(Figura:3.3)

Diagrammi di sequenza

Passiamo adesso all'analisi delle interazioni tra routine e attore e vi eversa. I diagrammi di sequenza studiati hanno fa ilitato la omprensione delle interazioni tra le routine favorendo la stesura del odi e. Il primo diagramma rappresenta l'ingresso alla struttura Figura:3.4. INGRESSO: Il sistema veri a ogni 100 iterazioni, se il lettore RFID ha rilevato un tag nell'area di azione; nel aso sia stato rilevato un tag, il sistema veri a l'autorizzazione dell'identi ativo rilevato e restituis e true, se l'identi ativo è presente nella lista del personale autorizzato, e false, se non vi risulta. Il se ondo diagramma rappresenta l'us ita dalla struttura Figura:3.5 USCITA: Il sistema rileva l'attivazione della foto ellula 2 e veri a l'avvenuta attivazione della foto ellula 1 per distinguere lo stato di us ita. Nel aso la foto ellula 1 non sia stata attivata pre edentemente, segnala lo stato di us ita dell'utente e ri hiede la lettura del tag per l'aggiornamento della lista delle presenze.

23

Figura 3.4: Diagramma di sequenza entrata

24

Figura 3.5: Diagramma di sequenza us ita

25

Figura 3.6: Diagramma di sequenza generale

Progettazione si a (Distanza minima tra le foto ellule) Ipotizzando he l'utente vada a 10km/h e he il tempo di rilevazione sia di 20mse , si dedu e he la distanza minima tra le due foto ellule sia di 5,6 m. Bisogna naturalmente tenere di onto an he dello spessore di una persona media, 30 m, he deve essere aggiunto alla distanza delle foto ellule. Figura:3.6

26

Figura 3.7: Diagramma di attività 1 3.3

Diagrammi di attività

Controllo1 (transponder): Il sistema deve inviare una ri hiesta di informazioni alla porta seriale del dispositivo di lettura RFID per poter ri evere informazioni dal lettore. Appena inviata la ri hiesta, ri eve le informazioni dal lettore sui tag interni all'area di lavoro di sua ompetenza, e veri a la validità dell'identi ativo rilevato, utilizzando una a he ontenente i primi 5 identi ativi autorizzati. Nel aso in ui non sia presente tra gli identi ativi in

a he, viene ri er ato nel le ban a dati, se viene trovato, la a he aggiorna tramite rimpiazzamento; nel aso ontrario, il sistema segnala la man ata autorizzazione. Appena viene salvato l'identi ativo rilevato, il lettore RFID viene reimpostato sull' attesa di una nuova ri hiesta di lettura. Il lettore RFID legge sempre un risultato: nel

aso ri eva informazioni da un tag, ritorna l'identi ativo letto, nel aso non ri eva al una informazione, ritorna un identi ativo nullo (una parola on lunghezza 0). Il ontrollo1 non prevede l'attivazione dell'allarme in quanto l'utente non è entrato si amente nella 27

Figura 3.8: Diagramma di attività 2 struttura, ma vi si è solo avvi inato. Figura:3.7 Controllo2 (foto ellula1): Il sistema deve rilevare lo stato della foto ellula1: nel aso questa risulti impegnata, veri a il risultato del ontrollo di autorizzazione eettuato sull'eventuale tag rilevata dal lettore RFID (non è detto he l'utente he è entrato sia in possesso di un tag). Nel

aso non sia stato ri evuto un tag, o il tag ri evuto dal lettore RFID non sia valido per l'ingresso, il sistema attiva l'allarme di man ata identi azione, noti ando sulla interfa

ia l'errore ris ontrato e osa fare per fermare l'allarme, la foto ellula1 entra in attesa della gestione allarme.L'attività di gestione allarme si preo

upa di attendere la lettura del tag di un membro autorizzato. Nel aso sia stato ri evuto un tag valido per l'a

esso alla struttura, il sistema segnala l'eettivo passaggio dell'utente davanti alla prima foto ellula. In seguito, se la foto ellula2 risulta essere stata impegnata, il sistema segnala sull'interfa

ia l'eettivo ingresso nella struttura e visualizza il nome dell'utente nella lista degli ultimi 5 utenti entrati all'interno della struttura. Figura:3.8 28

Figura 3.9: Diagramma di attività 3

29

Controllo3 (foto ellula2): Il sistema deve rilevare lo stato della foto ellula2, nel aso risulti impegnata veri a l'impegno della foto ellula1; se la foto ellula1 è impegnata, il sistema attiva l'allarme di impegno simultaneo delle foto ellule. L'Attività di gestione allarme segnala l'errore ris ontrato e attende la liberazione delle due foto ellule o il reset della ma

hina (nel

aso dopo la ne del reset le foto ellule risultino an ora impegnate, s atta nuovamente l'allarme). Se la foto ellula1 risulta essere già stata impegnata prima della foto ellula2 (siamo nel aso di entrata nella struttura), il sistema torna in fase di attesa segnalando l'ingresso di un utente nella struttura. Figura:3.9. Nel aso ontrario, il sistema mantiene l'informazione di avvenuto impegno della foto ellula2, segnalando he un utente sta per us ire dalla struttura.

30

Capitolo 4 La Soluzione 4.1

Strutturazione del progetto

Il progetto è stato sviluppato su Visual Studio 2005 Professional ampliato on un'add-in, sviluppata dall'azienda. Questo intende fa ilitare la reazione dei moduli PLC tramite zone dell'interfa

ia utente reate per la visualizzazione hiara e intuitiva della struttura del progetto e delle variabili utilizzate. L'add-in installato rea, in modo automati o, i le prin ipali he devono essere implementati (denition.h, denition. , main. , timer. , nel progetto solo denition.h e definition. sono stati implementati, poi hé gli altri due non erano utili ai ni del progetto) dando in seguito la possibilità di reare subroutine ome funzioni aggiuntive del main. I le iniziali he devono essere implementati sono le di denizioni di sinonimi, i sinonimi spe i ati sono visibili in tutto il progetto. All'interno del le denition.h sono indi ati gli optmod da in ludere nel progetto: #pragma on e //:OPT_MOD_BEGIN #in lude "om om.h" //:OPT_MOD_END #in lude "om om.h"

//Optmod per la lettura della seriale

#in lude "omfile.h" //Optmod per la gestione dei file #in lude "..\messages.h" // Messages definitions #pragma pa k (push) #pragma pa k (4)

Gli optmod in lusi nel denition.h garantis ono la possibilità di utilizzare funzioni spe i he per la gestione di periferi he ( in questo aso la porta seriale) e l'utilizzo dei le. 31

Per essere utilizzati gli optmod devono essere stati installati pre edentemente in modo da ampliare il framework on funzionalità aggiuntive. Viene in luso, insieme agli optmod, il le message.h, he da modo di utilizzare i messaggi di informazione visualizzabili sull'implementazione SIMU. In seguito viene spe i ata la lista dei sinonimi o variabili globali utilizzate nel progetto all'interno del le; segue questa sintassi: //:RTPLC_SYNONYMDEF_BEGIN __DEFINE ULONG statusSeriale ; . . //:RTPLC_SYNONYMDEF_END

I sinonimi he ho utilizzato nel progetto sono tutti volatili, quindi alla hiusura dell'appli azione (quando viene s ari ato il PLC) non rimangono in memoria. In quanto variabili globali vengono usate per mantenere in memoria i risultati raggiunti dalle varie routine e per renderli a

essibili a tutte le routine e funzioni, durante il tempo di ese uzione. La lista delle funzione denite nel progetto e il loro header si trova an he essa nel le denition.h: //:RTPLC_EVENTDEF_BEGIN void RTPLC_ROUTINE routineMain(LPVOID data); . . //:RTPLC_EVENTDEF_END //:RTPLC_PROXYFUNC_BEGIN void __inline proxy_routine_allarme(ULONG type) { RTPLC_VARIANT param[1℄; param[0℄.vt = RTPLC_FORMAT_UINT32; param[0℄.value.ul = type; invokeFun (_T("routine_allarme"), param,1, NULL); } . //:RTPLC_PROXYFUNC_END

Le funzioni rendono più modulare il progetto dando la possibilità di eettuare modi he in modo rapido e omprendere meglio la struttura dell'appli azione. Sarebbe possibile denire strutture per oggetti omplessi, per quanto queste non siano state attuabili nel progetto presente data l'assenza di strutture tali da ontenere stringhe. All'interno del le denition. sono deniti e des ritti tutti i omponenti di denition.h, vengono indi ate le librerie base per la ompilazione, rtpl .h, e di seguito vi è la lista delle denizioni dove viene asso iato un tipo più spe i o alle variabili globali. Qui si indi a se sono volatili e, in questo aso, vengono an ellate ogni volta he il PLC viene s ari ato dall'RTPLC, oppure retentive, e quindi rimangono in memoria an he dopo aver s ari ato il PLC. 32

Le variabili vengono inizializzate ad un valore indi ato alla reazione da add-in e, se inserita, viene asso iata una des rizione data dallo sviluppatore, di modo da rendere sempli e l'identi azione della variabile e la sua funzione: RTPLC_SYNONYM_VOLATILE_ULONG(statusSeriale,"<des rizione>",0,RTPLC_ACCESS_INPUT)

Nella denizione delle variabili vi è il ampo a

esso he indi a in he direzione si può a

edere alla variabile: input, output, i/o. Dopo la lista delle denizioni delle variabili, vengono des ritte le funzioni implementate nel progetto, spe i ando gli argomenti e i valori di ritorno. Le routine sono di hiarate nella lista routine e vengono identi ate on tag quali RTPLC_MAIN, he spe i ano il tipo di routine implementata, e la priorità rispetto alle altre routine. //:RTPLC_FUNCTION_IO_BEGIN RTPLC_FUNCTION_IO_BEGIN(routine_allarme) RTPLC_FUNCTION_PARAM(type, RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_END(routine_allarme,RTPLC_FORMAT_VOID) . . //:RTPLC_FUNCTION_IO_END //:RTPLC_ROUTINE_BEGIN RTPLC_MAIN(RTPLC_PRIORITY_NORMAL, routine_main) . . //:RTPLC_ROUTINE_END

Il progetto è stato sviluppato su due sottoprogetti: ISACPLC1, RSDLL. All'interno del primo progetto sono spe i ate tutte le routine e le funzioni he sviluppano il funzionamento eettivo dell'appli azione e la gestione degli use ase; all'interno del se ondo progetto sono sviluppate le risorse impiegate per la reazione e lo sviluppo dei messaggi di informazione e di allarme he devono essere visualizzate dall'RTPLC_SIMU per indi are gli eventi. Con la ompilazione di questo progetto viene reato il le message.h e viene aggiornato ogni volta he il progetto RSDLL viene modi ato e ri ompilato. ISACPLC1 è ostituito da 2 le di libreria, denition.h e message.h, e da 8 le di

ui due sono di risorse, routineInit. routineMain. e sei di funzioni routine_reset. routine_leggiDB. routine_leggiSeriale. routine_ ontrolUs ito. routine_aggiornaDB. routine_allarme. , ed il le denition. .

33

4.2

Funzionalità routine

Le routine sviluppate nel progetto implementano funzionalità spe i he per garantire la modularità . Analizziamo le funzionalità delle routine singolarmente, in modo da avere un quadro più hiaro dell'utilizzo he ne viene fatto all'interno del progetto. RoutineInit:

Si o

upa di inizializzare a valori nulli o 1 tutte le variabili globali he vengono utilizzate nel progetto, per avere la si urezza he abbiano valori erti e s elti dallo sviluppatore. Viene hiamata una sola volta dal framework stesso, appena viene

ari ato il PLC. Per assi urarsi he venga mandata in ese uzione non appena ari ato viene, di hiarato all'interno del le denition. ome : //definition. RTPLC_ONINIT(RTPLC_PRIORITY_NORMAL, routine_init)

È implementata on un solo stato in modo he sia una routine leggera da eseguire. RoutineMain:

È la routine prin ipale strutturata in vari stati gestiti on uno swit h omandato da una variabile intera he identi a lo stato in ui i troviamo. Alla prima iterazione, la routineMain manda in ese uzione la lettura del data base, ri hiamando la funzione routine_leggiDB he prepara la a he per l'autorizzazione velo e. In seguito, la routine si o

upa di leggere la seriale ogni 100 iterazioni, ri hiamando la funzione routine_leggiSeriale, e ontrollando ad ogni iterazione lo stato delle periferi he. Questa routine è implementata, an hé gestis a ogni situazione basandosi sui valori di ritorno delle periferi he e dando la possibilità all'utente di interagire direttamente tramite ontrolli sull'interfa

ia. //definition. RTPLC_MAIN(RTPLC_PRIORITY_NORMAL, routine_main)

Viene osì ri onos iuta dal Framework ome routine prin ipale del PLC (routine da eseguire sempre ad ogni iterazione). Routine_reset:

Funzione ri hiamata da omando utente diretto ed utilizzata dalla routineMain per riportare tutti i valori delle variabili globali ad assumere i valori iniziali. 34

Ristabilis e uno stato onsistente del programma. Può essere usata dall'utente per us ire da uno stato di allarme della ma

hina o per azzerare tutte le variabili per sua ne essità. //definition. RTPLC_FUNCTION(routine_reset, routine_reset)

Routine_leggiDB:

Funzione di inizializzazione della a he del PLC strutturata in vari stati di ese uzione gestiti da uno swit h. Viene hiamato dalla routineMain alla prima iterazione. Cari a le prime inque righe dal le database.txt presente nella artella usertar, e vengono ari ate sulle variabili idX e nomeX di tipo RTPLC_VARIANT. Nel aso di reset della ma

hina non vengono annullati gli identi ativi ari ati, rimangono in memoria n quando il PLC rimane ari ato. //definition. RTPLC_FUNCTION(routine_leggiDB, routine_leggiDB)

Routine_leggiSeriale:

Funzione di lettura della seriale di omuni azione on il lettore RFID. Strutturata a stati e gestita on uno swit h su una variabile di stato. Si interfa

ia sulla porta seriale ri hiedendo, se è stato letto, l'identi ativo e gestis e l'autorizzazione dell'utente ris ontrando alla routineMain se vi sono utenti vi ini e se sono autorizzati ad entrare. //definition. RTPLC_FUNCTION(routine_leggiSeriale, routine_leggiSeriale)

Routine_ ontrolUs ito:

Funzione di eliminazione utente in us ita, identi ato dal lettore RFID, dall'elen o ultimi 5 utenti entrati nella struttura. Ri er a tra gli ultimi 5 utenti he hanno eettuato l'ingresso nella struttura se vi è l'utente in us ita, nel aso vi sia, lo an ella dalla lista dei presenti evitandone la visualizzazione sull'interfa

ia. //definition. RTPLC_FUNCTION(routine_ ontrolUs ito,routine_ ontrolUs ito)

35

Routine_aggiornaDB:

Funzione di aggiornamento a he nel aso di rilevazione utente non presente in a he ma presente sul le. Sviluppa il me

anismo di rimpiazzamento di un identi ativo non an ora utilizzato, ma presente in a he, on un identi ativo appena rilevato dal lettore RFID e presente sul le database.txt ma non sulla a he. Mantiene sempre aggiornata la a he basandosi sugli utenti entrati e sostituendo gli utenti he non hanno eettuato l'ingresso. //definition. RTPLC_FUNCTION(routine_aggiornaDB, routine_aggiornaDB)

Routine_allarme:

Funzione di attuazione e gestione di tutti gli allarmi, viene hiamata dalla routineMain non appena viene rilevato uno stato di allarme della ma

hina. Gli stati interni della funzione identi ano i vari allarmi he la funzione può gestire. Si o

upa di omporre il messaggio da visualizzare sul monitor e di attendere lo s adere del timeout in aso di us ita automati a da allarme. //definition. RTPLC_FUNCTION(routine_allarme, routine_allarme) 4.3

Struttura interna delle routine

La struttura delle routine e delle funzioni segue uno s hema di implementazione a stati su

essivi propri di una ese uzione su una ma

hina on apa ità di elaborazione limitata. L'RTPLC ULISSE, essendo basato su ARM9, impiegherebbe troppo tempo per eseguire un odi e uni o e ontinuo on molte elaborazioni interne. La struttura a stati, assi ura un'elaborazione velo e di ogni stato e in totale l'ese uzione ompleta di ogni operazione, an he se sviluppata in più stati. Nel progetto si possono distinguere due modelli di strutturazione utilizzati: il primo modello, appli ato sulle routine/funzioni on istruzioni sempli i, prevede l'utilizzo di un solo stato in modo da essere eseguito una sola volta e svolgere la funzione ri hiesta in una sola iterazione. Il se ondo modello, appli ato a routine/funzioni on istruzioni omplesse, utilizza una struttura modulare a più stati onse utivi, per le routine he devono gestire molte situazioni una dopo l'altra, o a stati indipendenti, per le routine he mantengono lo stesso stato ogni volta he vengono ri hiamate. Appartengono al primo modello di implementazione la routineInit e le funzioni routine_reset e ruotine_allarme: entrambe hanno un'ese uzione immediata e sempli e. Nel

aso di blo

o di queste routine/funzioni non viene ausata al una perdita e lo stato rimane onsistente. 36

Appartengono al se ondo modello le routine e funzioni, he ri hiedono l'elaborazione di istruzioni omplesse, he ri hiedono più stati per assi urare l'elaborazione orretta dell'istruzione. Questa loro strutturazione rende queste funzioni e routine non di ese uzione immediata per un pro essore embedded. Con istruzioni omplesse possiamo indi are la lettura di una porta seriale, l'a

esso ad un le, la hiusura di un le, la s rittura su più variabili, operazioni he ri hiedono tempi hardware non erti, e he non possono essere interrotte. Ogni routine e funzione utilizza delle variabili numeri he, per rappresentare lo stato di ese uzione in ui si trova, gestite da uno swit h he implementa il passaggio allo stato ri hiesto dall'elaborazione. La routineMain è omposta da 5 stati he gestis ono i vari use ase basandosi sui valori assunti dalle periferi he durante l'ese uzione pre edente. Non appena lo stato di una periferi a varia, la routine asso ia alla propria variabile di stato il valore degli use

ase in ui si trova, in modo da avviare la gestione del aso d'uso all'iterazione su

essiva. Nel aso in ui le variabili, he identi ano lo stato delle periferi he, siano tutti ai valori di inizializzazione, si rimane sempre sullo stato 0 (stato di attesa della routineMain). Si notano, all'interno dell'insieme delle routine/funzioni a più stati, distinzioni he

reano due eettivi sottotipi di routine/funzioni: quelle a stati onse utivi, e quelle a stati non onse utivi. Le prime sono routine he ri hiedono l'ese uzione di tutti( o quasi) gli stati in ordine res ente per far si he l'operazione ri hiesta venga eseguita interamente e

orrettamente; le se onde non ne essitano di un'ese uzione in un qual he ordine stabilito, da momento he il passaggio di stato, essendo dovuto a situazioni ambientali, non può essere predi ibile. Le funzioni routine_leggiDB routine_leggiSeriale e routine_aggiornaDB sono routine/funzioni a stati onse utivi, poi hé è ne essario eseguirli tutti in un ordine prestabilito per essere si uri he il sistema esegua orrettamente la funzione. 4.4

Gestione delle interazioni tra routine

Per gestire l'ese uzione di funzioni a stati onse utivi, è ne essario utilizzare degli a

orgimenti he assi urino l'ese uzione della funzione no al termine eettivo dell'operazione ri hiesta. In questo modo è garantita la stabilità del sistema e la orrettezza degli a

essi a le e a porte seriali. Le funzioni a stati onse utivi ritornano un valore di elaborazione he indi a alla routine hiamante, se la funzione ha terminato la sua ese uzione, o se ne essiti di ulteriori iterazioni per on ludersi. Gli stessi a

orgimenti vengono utilizzati per l'ese uzione di operazioni omplesse he ne essitano più iterazioni (quindi mantenendo la funzione sullo stesso stato) per essere eseguite. La routine he ri hiama l'ese uzione della funzione, a se onda se è una funzione a stati omplessa o una funzione a un solo stato, si preo

upa di ontrollare he la funzione venga eseguita on su

esso no al termine. Nel aso di ese uzione di funzioni a più stati ed operazioni omplesse, quindi non eseguibili in una sola iterazione, è stato utilizzato un ontrollo sulla variabile di ritorno della funzione interessata. Si utilizza 1 per indi are he la funzione non è an ora terminata

37

0 per indi are he è stata terminata on su

esso. Possiamo vederlo nella routineMain nel hiamare la funzione routine_leggiDB: ret=proxy_routine_leggiDB();// hiamata funzione //1. lettura DB effettuata on su

esso if(ret==0) inizio=0; else //2. lettura DB in ese uzione if(ret==OMCS_WAIT) inizio=1; else //3. lettura DB errore if(ret<-1) { type=3; allarm((USHORT) AL_SCOLLEGATO);//ri hiesta reazione messaggio d'allarme proxy_routine_allarme(type); }

La variabile di ritorno della funzione è rappresentata dalla variabile ret ed indi a alla routineMain se è stata terminata la lettura del database o se an ora è ne essario eseguire altre iterazioni della funzione. In questo modo vi è la si urezza he le operazioni ri hieste alla ma

hina siano eseguite orrettamente in più iterazioni e mantenendo uno stato onsistente. Nel aso di funzioni a un solo stato o a più stati ma non onse utivi, non viene eettuato al un ontrollo simile: proxy_routine_allarme(type);

In questo aso le routine/funzioni eseguono po he e sempli i operazioni e il sistema non deve fare più iterazioni per assi urarsi he l'ese uzione sia on lusa. È utile sottolineare he le funzioni non possono ri hiamare routine ma possono ri hiamare le altre funzioni in un qualsiasi momento.

38

Capitolo 5 Implementazione 5.1

S elte implementative

Le s elte implementative su ui ho basato lo sviluppo del progetto, mirano a migliorare le prestazioni della ma

hina eseguendo operazioni sempli i e in numero minimo per ogni iterazione. Ho de iso di dividere il progetto in 2 sole routine eettive e 7 funzioni, al ne di reare una modularità interna, per sempli are eventuali modi he al odi e e aumentarene la omprensione. È solamente ne essario sostituire la funzione per avere una modi a delle operazioni, rispettando, però, i vin oli sui parametri di ritorno per gestire l'ese uzione della funzione da parte della routine hiamante. Ogni routine e funzione gestis e la propria variabile di stato internamente, di modo da non avere ambi di stato non gestiti o non previsti eettuati da routine/funzioni esterne. Ho s elto una gestione interna an he per fa ilitare la modi a della variabile stato senza la ne essità di ontrollare le altre routine/funzioni. Solo la routineInit e la funzione routine_reset modi ano il valore degli stati delle altre routine e funzioni, portandoli a un valore iniziale onos iuto e stabile. Ogni routine/funzione a più stati è sviluppata su swit h per reare una struttura a stati sempli e, he permetta di evitare l'ese uzione di parti di odi e non ne essarie per la gestione della situazione rilevata dalla ma

hina. Le routine e le funzioni in ese uzione, risultano di po he righe di odi e, garantendo una velo ità di ese uzione maggiore. La routineMain gestis e molti ontrolli per limitare l'ese uzione di parti non ne essarie al orretto svolgimento dell'appli azione. Le variabili di ontrollo utilizzate dalla routine sono 3 : la variabile inizio, segnala se siamo alla prima iterazione (1 prima iterazione 0 altrimenti); la variabile allarme, segnala se è stato messo in ese uzione un allarme; la variabile reset, segnala se siamo in stato reset. Queste variabili permettono alla routine di saltare parti di odi e he in situazioni parti olari ome l'allarme e il reset non devono essere eseguite, e allo stesso modo, permettono di de idere quando è ne essario eseguire parti di odi e parti olare, ome l'inizializzazione. Le variabili di ontrollo permettono alla routineMain di ottimizzare la propria ese uzione e gestire situazioni solo se realmente presenti. Dal momento he l'appli azione risultava e

essivamente velo e, ho inserito all'interno del progetto, hiamate alla funzione sleep. Nella funzione routine_aggiornaDB è stato ne essario gestire il i lo di lettura utilizzando due status separati (lo status 1 e lo status 2), senza ostruzioni parti olari, in modo da avere la ertezza he non vi fossero la 39

reazione di loop dispendiosi per la ma

hina e he potessero rallentare l'ese uzione dell'appli azione. Ho reato le variabili lo ali all'interno dei blo

hi di interesse, osì he la memoria venga ripulita dalle variabili non globali, ad ogni us ita di blo

o, e le variabili non vengano reate, se non devono essere si uramente utilizzate dall'appli azione.

5.2

Sviluppo ontrolli

Il progetto, basandosi sul passaggio di stato delle periferi he, gestis e un ontrollo per ognuna di esse, di modo da avere un quadro sempre aggioranto di tutti i dispositivi e rappresentare, nel modo più fedele, la realtà he lo ir onda. La gestione dei ontrolli sulle periferi he (tranne la porta seriale) è interamente sviluppata nella routineMain, i ontrolli sono rappresentati mediante variabili di stato per distinguere le varie situazioni real time reate nell'ambiente. Le periferi he rappresentate e gestite dalla routineMain sono le foto ellule, il i alino, i led. Per sviluppare i ontrolli dei led e del i alino, sono state impiegate 3 variabili booleane, una per ogni periferi a. Il ontrollo sulle foto ellule è stato sviluppato impiegando le seguenti variabili per ogni foto ellula: isOnX: indi a se la foto ellula è stata attivata di re ente; questa è stata utilizzata per distinguere l'us ita dall'entrata; gfotoX: è posto in rementato di 1 quando la foto ellula è a

esa e inizializzato a 0 quando viene spenta; lo utilizzo per ontrollare he la foto ellula non sia guasta; fotoX: variabile di stato della foto ellula. Grazie a queste variabili sono distinte le situazioni rilevate dalle foto ellule:

//foto1=1 && sear hDB=1 : L'utente autorizzato ha impegnato la foto ellula1; //foto1=1 && sear hDB=0 && isOn2==0 L'utente non autorizzato ha impegnato la foto ellula1 ma non è in us ita; //foto1=1 && sear hDB=0 && isOn2==1 L'utente non autorizzato ha impegnato la foto ellula1 ma è in us ita; //foto1=0 && sear hDB=1 L'utente autorizzato non ha impegnato la foto ellula1; //foto1=0 && sear hDB=0 Non vi sono utenti; //1. foto2=1 && isOn1 == 1 L'utente è in entrata; //2. foto2=1 && isOn1=0 L'utente è in us ita. Le variabili vengono ontrollate ad ogni iterazione per garantire una risposta immediata all'utente. La routine, in base ai valori di queste variabili, distingue le interazione avvenute on l'utente, in quel momento, e s eglie ome gestirle. La gestione del ontrollo della porta seriale, viene eseguita dalla funzione routine_leggiSeriale utilizzando l'optmod om om, he da la possibilità alla funzione di interagire on la periferi a hardware. Il risultato della gestione della periferi a, da parte della funzione, viene segnalato alla routineMain attraverso la variabile sear hDB, variabile booleana ( true se autorizzato false altrimenti).

40

Capitolo 6 Manuale Il sistema deve ontrollare l'a

esso e l'us ita del personale autorizzato dal magazzino, segnalare eventuali a

essi non autorizzati e possibili guasti alle periferi he. Questo manuale vuole indi are all'utente, utilizzatore dell'appli azione, ome interagire on il sistema di ontrollo a

essi, utilizzando l'interfa

ia utente fornita.

6.1 Funzionalità oerte Sono des ritti, di seguito, i tipi di interazione possibili on la ma

hina e i messaggi visualizzati sull'interfa

ia, di modo da omprendere ome reagire alle situazioni he si posso presentare. All'atto dell'a

esso il sistema deve: 1. Rilevare il odi e del transponder dell'utente; 2. Ri er are il odi e all'interno di una ban a dati; 3. Segnalare la possibilità di eettuare il passaggio o meno; 4. Attendere il passaggio davanti alle foto ellule per un tempo nito di se ondi. All'atto dell'us ita il sistema deve: 1. Rilevare lo stato della se onda foto ellula ; 2. Rilevare l'avvenuta us ita ; 3. Rilevare il odi e del transponder (non ne essario per l'us ita); 4. Nel aso di rilevazione del odi e, deve eliminare l'utente dalla lista presenti(ultimi 5 entrati). Il sistema abilita un allarme sonoro e visivo (sul monitor) in aso di: 1. A

esso non autorizzato; 2. Impegno di entrambe le foto ellule ontemporaneamente ; 3. Impegno ontinuo di una delle due foto ellule (eventuale guasto alle foto ellule); 4. Azionamento allarme manuale. 41

6.2

Presentazione interfa

ia

Mediante l'interfa

ia utente è possibile interagire on la ma

hina, leggendo i messaggi di stato visualizzati, abilitando l'allarme manuale, ri hiedendo il reset del sistema. La grandezza dell'interfa

ia è basata sulla grandezza del monitor dell' ULISSE per garantire una visualizzazione ottimale per il monitor fornito. Sull'interfa

ia sono visualizzati, partendo da in basso a destra dello s hermo: un led RFID, indi a se il tag rilevato è autorizzato all'ingresso, (verde se è autorizzato, rosso se non è autorizzato); un led foto ellula 2, indi a se la foto ellula 2 è impegnata o meno, (verde se è impegnata, rossa se è libera); un led foto ellula 1, indi a se la foto ellula 1 è impegnata o meno,(verde se è impegnata rossa se non è impegnata). Nella parte di destra dell'interfa

ia partendo dall'alto viene visualizzato: l'orologio sin ronizzato on quello della ma

hina; lo spazio di visualizzazione dei messaggi di

ontrollo del sistema, all'interno del quale l'interfa

ia visualizza i messaggi di noti a espli ativi della situazione in ui si trova in quel momento la ma

hina; il tasto di reset (resetta lo stato del sistema ma non la a he) e il tasto di allarme (mette in azione l'allarme manuale); gli ultimi 5 utenti he hanno eettuato l'a

esso autorizzato e due led he indi ano lo stato della ma

hina: verde se non sta eseguendo funzioni rosso se le sta eseguendo ( per esempio se è s attato l'allarme). Il funzionamento dell'interfa

ia è assi urato nel aso he sia già stato ari ato il PLC sulla ma

hina.

Disabilitazione degli allarmi:

gli allarmi possono essere disabilitati premendo il tasto reset sull'interfa

ia, oppure attendendo il timeout interno, dopo il quale viene riportato il sistema ad uno stato onsistente. Nel aso di guasti, il sistema eettua il reset on su

esso, solamente se il guasto rilevato è stato eliminato. L'allarme di man ata autorizzazione è l'uni o allarme he non può essere disabilitato resettando la ma

hina, in quanto ne essita la lettura di un tag autorizzato per terminare e riportare la ma

hina a uno stato onsistente. 6.3

Uso dell'interfa

ia utente

Avvio della ma

hina: All'avvio della ma

hina il sistema si presenta in una fase iniziale in ui tutti i parametri sono inizializzati a un valore di default (Figura:6.1). La ma

hina si pone in attesa di rilevare ambiamenti di stato da parte delle periferi he ollegate.

Autenti azione: Non appena un tag entra nel raggio si azione del lettore RFID, viene ontrollata la presenza del tag tra gli autorizzati all'a

esso alla struttura. Nel aso il tag risulti autorizzato ad a

edere, il sistema visualizza un messaggio di informazione sull'interfa

ia (Figura: 6.2). Non appena il sistema rileva l'autenti azione, si pone in attesa sulla foto ellula 1 per la rilevazione del passaggio dell'utente. 42

Figura 6.1: S hermata inziale

Figura 6.2: S hermata attesa

43

Figura 6.3: S hermata man ato passaggio

Figura 6.4: S hermata impegno foto ellula1 Attesa passaggio:

Nel aso s atti il timeout senza la rilevazione dell'impegno della foto ellula 1 da parte dell'utente, il sistema avverte, tramite interfa

ia, del man ato a

esso e eettua il reset della variabile di autenti azione (Figura:6.3). Quando questa s hermata viene visualizzata non è piu' possibile eettuare il passaggio. Nel aso l'utente impegni la foto ellula 1, il sistema si pone in attesa sulla foto ellula 2 per registrare l'eettivo passaggio (Figure:6.4, 6.5). Il nome dell'utente he si è autenti ato viene visualizzato in una delle elle della lista dei presenti. Us ita dalla struttura:

Se durante la fase di attesa di lettura di un tag, la ma

hina, rileva l'impegno della foto ellula2, segnala l'us ita di un utente (Figura:6.6). 44

Figura 6.5: S hermata passaggio eettuato

Figura 6.6: S hermata us ita utente

45

Figura 6.7: S hermata di reset

Figura 6.8: S hermata allarme manuale Quando viene impegnata an he la foto ellula1, il sistema legge dal lettore RFID, se è stato rilevato un tag. Nel aso sia stato rilevato, elimina il tag dalla lista degli ultimi 5 entrati. Reset della ma

hina:

Se viene premuto il tasto di reset dell'interfa

ia il sistema riporta ai valori iniziali tutte le variabili. Questo è visibile sull'interfa

ia poi hé tutti i led tornano allo stato iniziale e la lista viene svuotata (Figura:6.7). Allarmi:

L'interfa

ia, in aso di allarme, visualizza il tipo di allarme entrato in funzione, attiva il led rosso sotto il tasto di reset, per indi are lo stato di allarme. L'allarme manuale viene attivato premendo il tasto allarme sull'interfa

ia (Figura:6.8) e può essere disabilitato attivando il reset o attendendo lo s adere del timeout. L'al46

Figura 6.9: S hermata allarme impegno simultaneo delle foto ellule

Figura 6.10: S hermata allarme Foto ellula2 guasta(o impegnata da troppo tempo) larme per eventuali guasti alle foto ellule (Figure:6.9 e 6.10) viene attivato dal sistema, si disabilita automati amente dopo il disimpegno delle foto ellule o premendo il tasto di reset. L'allarme di man ata autenti azione (Figura:6.11) viene disabilitato mediante la lettura di un tag autorizzato. Nel aso venga premuto il tasto di reset, l'interfa

ia visualizza il messaggio di non a

ettazione del omando (Figura:6.12).

47

Figura 6.11: S hermata allarme man ata autenti azione

Figura 6.12: S hermata messaggio blo

o del reset

48

Capitolo 7 Con lusioni e sviluppi futuri Il progetto qui presentato ha avuto lo s opo di reare un prototipo di un sistema di si urezza basato sull'RFID, orendomi la possibilità di un appro

io diretto alle ma

hine hardware. Questo tipo di sistema è già stato sviluppato usando la stessa te nologia, in parti olare per sistemi di a

esso, he, dopo aver ri onos iuto un tag autenti ato, sblo

ano la porta dell'ambiente ontrollato permettendo l'a

esso eettivo. A dierenza di questi, il presente progetto si dierenzia in quanto non ri hiede la presenza di una porta reale, dal momento he le foto ellule svolgono la funzione di var o allarmato. Infatti quando viene identi ato un tag autenti ato, le foto ellule si sblo

ano permettendo l'a

esso. Il prin ipale aspetto positivo di questo tipo di progetto è ostuito dall'assenza di

ontrolli si i, quindi barriere, e dalla onseguente rapidità di ingresso degli attori alla struttura. Un se ondo elemento, inoltre, he rende il sistema parti olarmente interessante nella sua appli azione nelle aziende, è ostituito dal fatto he, la manutenzione del programma e la gestione di questo è estremamente sempli e e non ri hiede la presenza di un esperto informati o. È opportuno però a questo punto mettere in evidenza al uni aspetti he rendono il sistema qui presentato un prototipo da svilluppare ulteriormente. Trattandosi infatti di un sistema di ontrollo a

essi, la si ura identi azione degli attori umani e l'impedimento all'a

esso di persone non autorizzate dovrebbero ostituire una priorità . In realtà la presenza di due sole foto ellule he potrebbero essere evitate e il man ato eettivo ontrollo della identità della persona, he potrebbe usare il tag di qual un'altro, ostituis ono due aspetti an ora un po' arenti e las iano spazio a possibili errori umani (quali ad esempio il possibile smarrimento del tag). Il progetto potrebbe essere ampliato aggiungendo la reazione di un le-log (per la registrazione degli a

essi di modo da poter ontrollare le situazioni arontate dalla ma

hina), l'impiego di 4 foto ellule due a due allineate verti almente ma poste ad altezze diverse (per rendere più omplesso evitarle durante il passaggio). Questi due ampliamenti sarebbero, a mio parere, ne essari per aumentare la si urezza garantita dal sistema. Il sistema qui presentato è stato pensato spe i atamente per il ontrollo degli a

essi a un magazzino all'interno di un'azienda. È possibile tuttavia, una volta sviluppato il prototipo, impiegarlo in u i o in zone addette al personale. Sarebbe possibile an he metterlo per ontrollare hi a

ede al retro di un ban one di servizi (bar, supermer ati) e per ontrollare he nessuno a

eda a appare

hiature, se non il personale addetto.

49

Appendi e A Codi e A.1 denition.h: #pragma #in lude

on e

// :OPT_MOD_BEGIN

"om om . h"

// :OPT_MOD_END

#in lude "om om . h" #in lude " o m f i l e . h" #in lude " . . \ messages . h" #pragma pa k ( push ) #pragma pa k ( 4 )

//

Messages

definitions

// :RTPLC_STRUCT_BEGIN // :RTPLC_STRUCT_END // :RTPLC_SYNONYMDEF_BEGIN

__DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE

ULONG s t a t u s M a i n ; // v a r i a b i l e d i s t a t o d e l l a r o u t i n e M a i n ULONG s t a t u s S e r i a l e ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e l e g g i S e r i a l e ULONG statusLeggiDB ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e l e g g i D B ULONG statusAggiornaDB ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e a g g i o r n a D B ULONG timerT ; // t i m e r s e r i a l e RTPLC_BIT f o t o 1 ; // v a r i a b i l e p e r i f e r i a f o t o e l l u l a 1 RTPLC_BIT f o t o 2 ; // v a r i a b i l e p e r i f e r i a f o t o e l l u l a 2 RTPLC_BIT sear hDB ; // v a r i a b i l e d i a u t o r i z z a z i o n e ULONG s t a t u s A l l a r m e ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e a l l a r m e ULONG type ; // t i p o a l l a r m e ULONG t i m e r A l ; // t i m e o u t a l l a r m e RTPLC_BIT a l l a r m e ; // b o o l e a n a d i o n t r o l l o a l l a r m e RTPLC_BIT l u e V e r d e ; // l e d m a h i n a a t t e s a RTPLC_BIT l u e R o s s a ; // l e d m a h i n a i n a r i a m e n t o / a l l a r m e UCHAR t x B u f f e r [ 9 ℄ ; // b u f f e r d e l l a v a r i a b i l e d i domanda a l l a s e r i a l e UCHAR r x B u f f e r [ 2 0 ℄ ; // b u f f e r d e l l a v a r i a b i l e d i r i s p o s t a d a l l a s e r i a l e RTPLC_BIT isOn1 ; // v a r i a b i l e d i o n t r o l l o a t t i v a z i o n e f o t o e l l u l a 1 ( p a s s a t a ) RTPLC_BIT isOn2 ; // v a r i a b i l e d i o n t r o l l o a t t i v a z i o n e f o t o e l l u l a 2 ( p a s s a t a ) ULONG g f o t o 1 ; // v a r i a b i l e d i o n t r o l l o f u n z i o n a m e n t o f o t o e l l u l a 1 ULONG g f o t o 2 ; // v a r i a b i l e d i o n t r o l l o f u n z i o n a m e n t o f o t o e l l u l a 2 ULONG rxLen ; // l u n g h e z z a r i s p o s t a d e l l a s e r i a l e ULONG f i l e _ h a n d l e [ 1 0 ℄ ; // h a n d l e r d e l f i l e ULONG i [ 5 ℄ ; // u t i l i z z o p o s i z i o n e a h e ULONG i n i z i o ; // v a r i a b i l e d i o n t r o l l o p r i m a i t e r a z i o n e ULONG nId ; // p r i m a p o s i z i o n e l i b e r a d e l l a a h e RTPLC_VARIANT R_openmode ; // m o d a l i t a ' a p e r t u r a f i l e RTPLC_VARIANT f i l e n a m e ; //nome d e l f i l e da a p r i r e / l e g g e r e

50

__DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE __DEFINE

ULONG t i m e r S o s t a ; // t i m e r d i s o s t a d i f r o n t e a l l e f o t o e l l u l e RTPLC_BIT r e s e t ; // v a r i a b i l e d i o n t r o l l o p e r i l r e s e t RTPLC_VARIANT output ; // o u t p u t da v i s u a l i z z a r e ULONG timerA ; // t i m e o u t A l l a r m e RTPLC_DAYTIME O r o l o g i o ; // v a r i a b i l e o r o l o g i o SHORT Ora ; SHORT Minuti ; SHORT s e o n d i ; RTPLC_VARIANT i d 1 ; // o d e p r i m o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT i d 2 ; // o d e s e o n d o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT i d 3 ; // o d e t e r z o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT i d 4 ; // o d e q u a r t o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT i d 5 ; // o d e q u i n t o i d e n t i f i a t i v o d e l l a a h e RTPLC_VARIANT nome1 ; // p r i m o nome u t e n t e d e l l a a h e RTPLC_VARIANT nome2 ; // s e o n d o nome u t e n t e d e l l a a h e RTPLC_VARIANT nome3 ; // t e r z o nome u t e n t e d e l l a a h e RTPLC_VARIANT nome4 ; // q u a r t o nome u t e n t e d e l l a a h e RTPLC_VARIANT nome5 ; // q u i n t o nome u t e n t e d e l l a a h e RTPLC_VARIANT idN ; // o d e i d e n t i f i a t i v o r i m p i a z z a m e n t o RTPLC_VARIANT nomeN ; //nome u t e n t e r i m p i a z z a m e n t o ULONG k ; // v a r a p p o g g i o ULONG j ; // v a r a p p o g g i o ULONG e ; // v a r a p p o g g i o RTPLC_VARIANT s r x B u f f e r ; // s t r i n g a d i r i s p o s t a d e l l a s e r i a l e ULONG V i s u a l i z z a ; RTPLC_VARIANT p r e s e n t i 1 ; // p r i m o nome l i s t a p r e s e n t i RTPLC_VARIANT p r e s e n t i 2 ; // s e o n d o nome l i s t a p r e s e n t i RTPLC_VARIANT p r e s e n t i 3 ; // t e r z o nome l i s t a p r e s e n t i RTPLC_VARIANT p r e s e n t i 4 ; // q u a r t o nome l i s t a p r e s e n t i RTPLC_VARIANT p r e s e n t i 5 ; // q u i n t o nome l i s t a p r e s e n t i RTPLC_BIT i s A l 1 ; // l ' a l l a r m e man ata a u t o r i z z a z i o n e e ' i n s e r i t o RTPLC_BIT o n t r o l l a ; // v a r i a b i l e p e r i l o n t r o l l o d i u s i t a RTPLC_BIT u s i t o ; // v a r i a b i l e d i u s i t a ULONG s t a t u s C o n t r o l l o U ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e o n t r o l l o U s i t a ULONG s ; RTPLC_VARIANT uUs ente ; //nome u t e n t e u s e n t e RTPLC_BIT f a t t o ; // v a r i a b i l e o n t r o l l o u s i t a LONG r e s 5 ; // r i t o r n o f u n z i o n i o m p l e s s e

// :RTPLC_SYNONYMDEF_END

__DEFINE RTPLC_VARIANT returnparam ;

void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE

// :RTPLC_EVENTDEF_BEGIN

void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE void RTPLC_ROUTINE

routine_main (LPVOID data ) ; r o u t i n e _ i n i t (LPVOID data ) ; t i m e r (LPVOID data ) ; r o u t i n e _ a l l a r m e (PRTPLC_FUNCTION_INPUT i n p u t ) ; r o u t i n e _ l e g g i D B (PRTPLC_FUNCTION_INPUT i n p u t ) ; r o u t i n e _ l e g g i S e r i a l e (PRTPLC_FUNCTION_INPUT i n p u t ) ; r o u t i n e _ r e s e t (PRTPLC_FUNCTION_INPUT i n p u t ) ; r o u t i n e _ o n t r o l U s i t o (PRTPLC_FUNCTION_INPUT i n p u t ) ; routine_aggiornaDB (PRTPLC_FUNCTION_INPUT i n p u t ) ;

// :RTPLC_EVENTDEF_END

r o u t i n e M a i n (LPVOID data ) ; r o u t i n e I n i t (LPVOID data ) ;

routine_main (LPVOID data ) ; r o u t i n e _ i n i t (LPVOID data ) ; t i m e r (LPVOID data ) ;

void

// :RTPLC_PROXYFUNC_BEGIN

__inline p ro x y _ro u tin e_a lla rme (ULONG type ) { RTPLC_VARIANT param [ 1 ℄ ; param [ 0 ℄ . vt = RTPLC_FORMAT_UINT32; param [ 0 ℄ . v a l u e . u l = type ; invokeFun (_T( " r o u t i n e _ a l l a r m e " ) , param , 1 , NULL) ; }

51

ULONG __inline proxy_routine_leggiDB ( ) { RTPLC_VARIANT r e t v a l ; invokeFun (_T( " r o u t i n e _ l e g g i D B " ) , NULL, 0 , &r e t v a l ) ; r e t v a l . value . ul ; }

return

ULONG __inline p r o x y _ r o u t i n e _ l e g g i S e r i a l e ( ) { RTPLC_VARIANT r e t v a l ; invokeFun (_T( " r o u t i n e _ l e g g i S e r i a l e " ) , NULL, 0 , &r e t v a l ) ; r e t v a l . value . ul ; }

return

void }

__inline p r o x y _ r o u t i n e _ r e s e t ( ) { invokeFun (_T( " r o u t i n e _ r e s e t " ) , NULL, 0 , NULL) ;

ULONG __inline p r o x y _ r o u t i n e _ o n t r o l U s i t o ( ) { RTPLC_VARIANT r e t v a l ; invokeFun (_T( " r o u t i n e _ o n t r o l U s i t o " ) , NULL, 0 , &r e t v a l ) ; r e t v a l . value . ul ; } ULONG __inline proxy_routine_aggiornaDB ( ) { RTPLC_VARIANT r e t v a l ; invokeFun (_T( " routine_aggiornaDB " ) , NULL, 0 , &r e t v a l ) ; r e t v a l . value . ul ; }

return

return

// :RTPLC_PROXYFUNC_END

#pragma

pa k ( pop )

A.2 denition. : #define RTPLC_ALLOC #define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude " d e f i n i t i o n s . h" // :RTPLC_FUNCTION_IO_BEGIN

RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ a l l a r m e ) RTPLC_FUNCTION_PARAM( type , RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_END( r o u t i n e _ a l l a r m e ,RTPLC_FORMAT_VOID) RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ l e g g i D B ) RTPLC_FUNCTION_IO_END( routine_leggiDB ,RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ l e g g i S e r i a l e ) RTPLC_FUNCTION_IO_END( r o u t i n e _ l e g g i S e r i a l e ,RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ r e s e t ) RTPLC_FUNCTION_IO_END( r o u t i n e _ r e s e t ,RTPLC_FORMAT_VOID) RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ o n t r o l U s i t o ) RTPLC_FUNCTION_IO_END( r o u t i n e _ o n t r o l U s i t o ,RTPLC_FORMAT_UINT32) RTPLC_FUNCTION_IO_BEGIN( routine_aggiornaDB ) RTPLC_FUNCTION_IO_END( routine_aggiornaDB ,RTPLC_FORMAT_UINT32) // :RTPLC_FUNCTION_IO_END

RTPLC_ROUTINE_BEGIN( ) // :RTPLC_ROUTINE_BEGIN

RTPLC_MAIN(RTPLC_PRIORITY_NORMAL, routine_main ) RTPLC_ONINIT(RTPLC_PRIORITY_NORMAL, r o u t i n e _ i n i t )

52

RTPLC_ONTIMER(RTPLC_PRIORITY_NORMAL, t i m e r ) RTPLC_FUNCTION( r o u t i n e _ a l l a r m e , r o u t i n e _ a l l a r m e ) RTPLC_FUNCTION( routine_leggiDB , r o u t i n e _ l e g g i D B ) RTPLC_FUNCTION( r o u t i n e _ l e g g i S e r i a l e , r o u t i n e _ l e g g i S e r i a l e ) RTPLC_FUNCTION( r o u t i n e _ r e s e t , r o u t i n e _ r e s e t ) RTPLC_FUNCTION( r o u t i n e _ o n t r o l U s i t o , r o u t i n e _ o n t r o l U s i t o ) RTPLC_FUNCTION( routine_aggiornaDB , routine_aggiornaDB ) // :RTPLC_ROUTINE_END

RTPLC_ROUTINE_END( )

RTPLC_STRUCTDESCRIPTION_BEGIN( ) // : RTPLC_STRUCTDESCRIPTION_BEGIN // :RTPLC_STRUCTDESCRIPTION_END

RTPLC_STRUCTDESCRIPTION_END( )

RTPLC_SYNEVT_LINK_BEGIN_DEFAULT( t i m e r ) // :RTPLC_SYNEVT_LINK_BEGIN // :RTPLC_SYNEVT_LINK_END

RTPLC_SYNEVT_LINK_END( )

RTPLC_LIBRARY_DEFINITION( "PLC2" , " " , " r t p l . h" , SYNEVTLINK_STANDARD) RTPLC_SYNONYM_BEGIN( ) // :RTPLC_SYNONYM_BEGIN

RTPLC_SYNONYM_VOLATILE_ULONG( statusMain , " V a r i a b i l e d i s t a t o d e l l a r o u t i n e main" , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( s t a t u s S e r i a l e , " V a r i a b i l e d i s t a t o r o u t i n e l e g g i S e r i a l e " , 0 , RTPLC_ACCESS_INPUT) RTPLC_SYNONYM_VOLATILE_ULONG( statusLeggiDB , " V a r i a b i l e d i s t a t o d e l l a r o u t i n e leggiDB " , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( statusAggiornaDB , " V a r i a b i l e d i s t a t o d e l l a r o u t i n e aggiornaDB " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( timerT , " Timer d i a e s s o a l l a s e r i a l e " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_DI_BIT( f o t o 1 , " V a r i a b i l e d e l l a f o t o e l l u l a 1 " , 0 , 0 , 0 ) RTPLC_SYNONYM_DI_BIT( f o t o 2 , " V a r i a b i l e d e l l a foto ellula2 " ,0 ,0 ,2) RTPLC_SYNONYM_VOLATILE_BIT( sear hDB , " V a r i a b i l e r i r i e r a i d e n t i f i a t i v o a u t o r i z z a t o " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( s t a t u s A l l a r m e , " V a r i a b i l e d i s t a t o d e l l a r o u t i n e a l l a r m e " , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( type , " type a l l a r m e r i h i a m a t o " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( timerAl , " Timer d e l l a r o u t i n e a l l a r m e " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_DO_BIT( a l l a r m e , " I n d i a t o r e s t a t o d i a l l a r m e on/ o f f " , 0 , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_DO_BIT( lu eV erd e , " Lu e d i p l l i b e r o on/ o f f " , 0 , 0 , 2 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_DO_BIT( l u e R o s s a , " Lu e d i p l impegnato on/ o f f " , 0 , 0 , 4 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ARRAYUCHAR( t x B u f f e r , " B u f f e r d e l l a query a l l a s e r i a l e " , 0 , 5 1 2 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ARRAYUCHAR( r x B u f f e r , " B u f f e r d i r i s p o s t a d e l l a s e r i a l e " , 0 , 5 1 2 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( isOn1 , " b o o l e a n d i s t i n z i o n e e n t r a t a " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( isOn2 , " b o o l e a n d i s t i n z i o n e u s i t a " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( g f o t o 1 , " C o n t r o l l o g u a s t o f o t o e l l u l a 1 " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( g f o t o 2 , " C o n t r o l l o g u a s t o f o t o e l l u l a 2 " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( rxLen , " Lunghezza b u f f e r " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ARRAYULONG( f i l e _ h a n d l e , " h a n d l e r d e l f i l e " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ARRAYULONG( i , " a e s s i da p a r t e d e g l i u t e n t i " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( i n i z i o , " v a r i a b i l e i n d i a t o r e d i i n z i o i l o " , 0 , RTPLC_ACCESS_INPUT) RTPLC_SYNONYM_VOLATILE_ULONG( nId , "numero i d e n t i f i a t o r e i n s e r i t o " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( R_openmode , " m o d a l i t a a p e r t u r a i n l e t t u r a " , 3 , " r " ) RTPLC_SYNONYM_STRING( f i l e n a m e , "nome d e l f i l e da l e g g e r e " , 4 0 , "%u s e r s e t t i n g s %\\dataBase . txt ") RTPLC_SYNONYM_VOLATILE_ULONG( t i m e r S o s t a , " t i m e r o n t r o l l o s o s t a " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( r e s e t , " v a r i a b i l e d i r i h i e s t a r e s e t " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( output , " output d e l p l " , 2 5 6 , " " ) RTPLC_SYNONYM_VOLATILE_ULONG( timerA , " Timer d i a t t e s a p a s s a g g i o u t e n t e " , 0 ,

53

RTPLC_ACCESS_INPUT) RTPLC_SYNONYM_DAYTIME( O r o l o g i o , " O r o l o g i o " ) RTPLC_SYNONYM_VOLATILE_SHORT( Ora , " o r a o r r e n t e " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_SHORT( Minuti , " Minuti o r r e n t i " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_SHORT( s e o n d i , " s e o n d i o r r e n t i " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( id1 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( id2 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( id3 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( id4 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( id5 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome1 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome2 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome3 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome4 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( nome5 , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING( idN , " " , 2 0 , " " ) RTPLC_SYNONYM_STRING(nomeN , " " , 2 0 , " " ) RTPLC_SYNONYM_VOLATILE_ULONG( k , " " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( j , " " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( e , " o n t a t o r e p e r l a aggiornaDB " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( s r x B u f f e r , " parametro d i r i t o r n o d e l l a s e r i a l e " , 3 0 , " " ) RTPLC_SYNONYM_VOLATILE_ULONG( V i s u a l i z z a , " s " , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( p r e s e n t i 1 , " primo p r e s e n t e " , 4 0 , " " ) RTPLC_SYNONYM_STRING( p r e s e n t i 2 , " " , 4 0 , " " ) RTPLC_SYNONYM_STRING( p r e s e n t i 3 , " " , 4 0 , " " ) RTPLC_SYNONYM_STRING( p r e s e n t i 4 , " " , 4 0 , " " ) RTPLC_SYNONYM_STRING( p r e s e n t i 5 , " " , 4 0 , " " ) RTPLC_SYNONYM_VOLATILE_BIT( i s A l 1 , " C o n t r o l l a s e e ' s t a t o a t t i v a t o l ' a l l a r m e d i i n t r u s i o n e " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( o n t r o l l a , " i n d i a he b i s o g n a o n t r o l l a r e l ' u s i t a " , 0 , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_BIT( u s i t o , " i n d i a he s t i a m o us endo " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( s t a t u s C o n t r o l l o U , " s t a t u s r o u t i n e o n t r o l l o U s i t o " , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_ULONG( s , " v a r i a b i l e a p p o g g i o p e r l a a n e l l a z i o n e i n u s i t a " , 0 , RTPLC_ACCESS_IO) RTPLC_SYNONYM_STRING( uUs ente , " " , 3 0 0 , " " ) RTPLC_SYNONYM_VOLATILE_BIT( f a t t o , " " , 0 , 0 ,RTPLC_ACCESS_IO) RTPLC_SYNONYM_VOLATILE_LONG( r e s 5 , " d s d s " , 0 ,RTPLC_ACCESS_IO) // :RTPLC_SYNONYM_END

RTPLC_SYNONYM_STRING( returnparam , " " , 3 0 0 , " " ) RTPLC_SYNONYM_END( )

A.3

routineMain. :

#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude "om om . h" #in lude " d e f i n i t i o n s . h" /∗ R o u t i n e /gestita /si

di

gestione

ome

o

upa

del

main

dal

dell ' appli azione framework

ontrollo

di

tutti

i

asi

d ' uso

void RTPLC_ROUTINE

gestiti

dal

progetto

routine_main (LPVOID n u l l ) { ULONG r i t o r n o S ; // V a l o r e d i r i t o r n o d e l l a seriale ULONG r i t o r n o C ; // V a l o r e d i r i t o r n o d e l o n t r o l l o r e ULONG r e t ; RTPLC_STRING format ; RTPLC_VARIANT a p p o g g i o ; // a g g i o r n a m e n t o

varaibili

globali

Ora=O r o l o g i o . hour ; Minuti=O r o l o g i o . min ; s e o n d i=O r o l o g i o . s e ; output . vt=RTPLC_FORMAT_STRING;

54

∗/

// i n i z i a l i z z a z i o n e

variabili

// a n e l l o

messagi

lo ali

a p p o g g i o . vt=RTPLC_FORMAT_STRING; format . s i z e =6; a p p o g g i o . v a l u e . s t r i n g . s i z e =200; format . s z=" ∗∗%s ∗∗ \n %s \n" ; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; tutti

i

messagp ( (USHORT) 0 ) ;

in

sospeso

if ( r e s e t==RTPLC_TRUE) { if ( ( type==1) | | ( i s A l 1==RTPLC_TRUE) ) // i n

aso

venga

ri hiesto

il

reset

della

ma

hina

{

// e '

stato

ri hiesto

il

reset

durante

un

allarme

di

man ata

autorizzazione

a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗NON E ' POSSIBILE EFFETTUARE IL RESET ∗∗ \ n ∗∗UTENTE NON AUTORIZZATO E ' ENTRATO NELLA STRUTTURA∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r e s e t=RTPLC_FALSE; type =1; sleep (2000) ; }

else

{

// a t t i v a z i o n e

}

reset

a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗RESET IN CORSO∗∗ \n" ; l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; proxy_routine_reset ( n u l l ) ; r e s e t=RTPLC_FALSE; }

else

{

if ( a l l a r m e ==0) { if ( i n i z i o ==1)

// v a r i a b i l e

// p r i m a

{

di

stato

status_main

iterazione

devo

// L e t t u r a

inizializzare

file

e

la

ari amento

a he identifi ativi

( ok )

r e t=proxy_routine_leggiDB ( ) ;

if ( r e t ==0) i n i z i o =0; else if ( r e t==OMCS_WAIT) i n i z i o =1; else if ( r e t <−1)

// 1 .

lettura

DB

effettuata

// 2 .

lettura

DB i n

// 3 .

lettura

DB

on

su

esso

ese uzione

errore

{

}

type =3; a l l a r m ( (USHORT) AL_SCOLLEGATO) ; p ro x y _ro u tin e_a lla rme ( type ) ; }

else

{

if ( f o t o 1

// 0 .

ontrollo

se

entrambe

le

foto ellule

sono

== RTPLC_TRUE && f o t o 2 == RTPLC_TRUE)

a

ese

ontemporanemente

{ a p p o g g i o . v a l u e . s t r i n g . s z="~ S e g n a l i d e l l e f o t o e l l u l e s i m u l t a n e i ~\n" ; a l l a r m ( (USHORT) AL_SIMULTANEE) ; isOn1 =1; isOn2 =1; r t p l t r a e ( 1 ,_T( "~ S e g n a l i d e l l e f o t o e l l u l e s i m u l t a n e i ~\n" ) ) ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; type =2;

55

( ok )

timerT =0;

// a t t i v o l ' allarme // ri hiamo la routine di allarme per la simultaneita ' dei segnali

p ro x y _ro u tin e_a lla rme ( type ) ; }

else swit h ( s t a t u s M a i n ) {

ase 0 : {

{

// stato di attesa o quietes enza //da questo stato vengono o n t r o l l a t e t u t t e l e v a r i a b i l i d e l l e p e r i f e r i h e

RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g . s i z e =100;

// funzione per la l e t t u r a d e l l a s e r i a l e // se i l timer e ' 100 devo leggere la s e r i a l e

if ( ( timerT ==

{

1 0 0 ) | | ( u s i t o==RTPLC_TRUE) )

// ri hiamo la routine di l e t t u r a d e l l a s e r i a l e

r i t o r n o S=p r o x y _ r o u t i n e _ l e g g i S e r i a l e ( ) ; ( r i t o r n o S ==1) { ; }

if

break else

{

timerT =0; ( ( u s i t o==RTPLC_TRUE)&&(sear hDB==RTPLC_TRUE) ) { sear hDB=RTPLC_FALSE;

o n t r o l l a=RTPLC_TRUE; } u s i t o=RTPLC_FALSE;

if

} }

else

timerT++;

if ( o n t r o l l a==RTPLC_TRUE) // ' e ' un utente in us ita

{

// ontrollo l ' i d e n t i f i a t i v o ( se mostrato )

r i t o r n o C=p r o x y _ r o u t i n e _ o n t r o l U s i t o ( ) ; ( r i t o r n o C ==1) { ; }

if

break else

{

} }

o n t r o l l a=RTPLC_FALSE; s t a t u s C o n t r o l l o U =0; f a t t o=RTPLC_FALSE;

// ontrollo l e f o t o e l l u l e // 1. f o t o e l l u l a 1 true

if

( f o t o 1 == RTPLC_TRUE) { s t a t u s M a i n =1; g f o t o 1=g f o t o 1 +1;

// ontrollo f u n z i o n a l i t a ' f o t o e l l u l a 1

if ( g f o t o 1 ==1000)

{

output1 . v a l u e . s t r i n g . s z="~ P o s s i b i l e g u a s t o a l l a f o t o e l l u l a 1 ~\n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok type =4; a l l a r m ( (USHORT) AL_FOTO1) ;

56

p ro x y _ro u tin e_a lla rme ( type ) ;

break ; } break ; }

// 2. f o t o e l l u l a 2 true / f a l s e

if

( f o t o 2 == RTPLC_TRUE) { g f o t o 2=g f o t o 2 +1; statusMain = 3 ;

// ontrollo f u n z i o n a l i t a ' f o t o e l l u l a 2

if ( g f o t o 2 ==1000)

{

// la f o t o e l l u l a

output1 . v a l u e . s t r i n g . s z="~ P o s s i b i l e g u a s t o a l l a f o t o e l l u l a 2 ~\n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok type =5; a l l a r m ( (USHORT) AL_FOTO2) ; p ro x y _ro u tin e_a lla rme ( type ) ; ;

break break ; } else }

// r e s e t t o l e v a r i a b i l i di ontrollo d e l l a f o t o e l l u l a 2 g f o t o 2 =0; // 3. f o t o e l l u l a 1 f a l s e

if ( f o t o 1

{

ase

{

g f o t o 1 =0; s t a t u s M a i n =2; t i m e r S o s t a =0; ;

break break ; }

}

== RTPLC_FALSE)

1:

RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g . s i z e =100; r t p l t r a e ( 1 ,_T( " Booleana d i a u t o r i z z a z i o n e % \n" ) , sear hDB ) ;

// 1. foto1=1 && sear hDB=1

if ( sear hDB == RTPLC_TRUE)

{

output1 . v a l u e . s t r i n g . s z=" \n ∗∗ Utente A u t o r i z z a t o ∗∗ \0 " ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " S t r i n g a da v i s u a l i z z a r e %s numero i d e n t i f i a t i v i output . v a l u e . s t r i n g . s z ) ; isOn1 =1; s t a t u s M a i n =0; sear hDB =0; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; ;

break else // 2. foto1=1 && sear hDB=0 && isOn2==0 if ( sear hDB == RTPLC_FALSE) { if ( isOn2==0) }

\n" ) ,

{ output1 . v a l u e . s t r i n g . s z="~Utente non A u t o r i z z a t o ! ~ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " S t r i n g a da v i s u a l i z z a r e %s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok a l l a r m ( (USHORT) AL_INTRUSO) ; type =1; timerT =0;

57

p ro x y _ro u tin e_a lla rme ( type ) ; // ri hiamo

autorizzazione

break ; } else

la routine di allarme per la man ata

{ s t a t u s M a i n =0; output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente U s i t o ∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok isOn2 =0; sleep (4000) ; u s i t o=RTPLC_TRUE; messagp ( (USHORT)M_USCITA) ; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE;

if else t i m e r S o s t a=t i m e r S o s t a +1; break ;

( t i m e r S o s t a ==80) r t p l t r a e ( 1 ,_T( "L ' u t e n t e s i e ' f e r m a t o d i f r o n t e a l l a f o t o e l l u l a \n" ) ) ;

}

}

}

ase

{

2:

RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g . s i z e =100;

// 1. foto1=0 && sear hDB=1

if ( sear hDB == RTPLC_TRUE)

{

}

s t a t u s M a i n = 4 ; // stato attesa passaggio utente output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente A u t o r i z z a t o , a t t e s a p a s s a g g i o ∗∗ \n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; ;

break

// 2. foto1=0 && sear hDB=0

else

{

}

}

statusMain = 0 ;

break ;

ase

{

3:

RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g . s i z e =100; ( isOn1==1) { // 1. foto2=1 && isOn1 == 1 output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente e n t r a t o ∗∗ \n" ; s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " output : %s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok messagp ( (USHORT)M_ENTRATA) ;

if

if

( k==6) { k=1; // r i i n i z i a s =5; }

a riempire d a l l ' i n i z i o d e l l a l i s t a

else if ( s !=5) s=k ; swit h ( nId )

{

58

// inseris o g l i i d e n t i f i a t i v i n e l l a l i s t a presenti

ase 1 : swit h ( k ) {

ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;

ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;

ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;

ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;

ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ; default : break ; } break ;

ase 2 : swit h ( k ) {

ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;

ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;

ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;

ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;

ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ; default : break ; } break ;

ase 3 : swit h ( k ) {

ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;

ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;

ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;

ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;

ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ; default : break ; } break ;

ase 4 : swit h ( k ) {

ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;

ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;

ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;

ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;

ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ; default : break ; } break ;

ase 5 : swit h ( k ) {

ase 1 : s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;

ase 2 : s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;

ase 3 : s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;

ase 4 : s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;

ase 5 : s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ; default : break ; } break ; default : break ;

} s t a t u s M a i n =0; isOn1 =0; nId =0; sear hDB =0; sleep (4000) ; ;

break else

}

{ // 2. foto2=1 && isOn1=0 output1 . v a l u e . s t r i n g . s z=" ∗∗ U s i t a u t e n t e ∗∗ \ n" ;

59

}

}

ase

s r p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok s t a t u s M a i n =0; isOn2 =1; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; ;

break 4:

//Utente r i l e v a t o attesa passaggio utente // 1. S atta i l timeout , autenti azione annullata

if ( ( timerA ==

{

}

3 0 0 ) && ( f o t o 1 == RTPLC_FALSE ) )

a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗ P a s s a g g i o non e f f e t t u a t o ∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok statusMain = 0 ; nId =0; timerA =0; k −−; sear hDB = RTPLC_FALSE ; l u e R o s s a=RTPLC_TRUE; l u e V e r d e=RTPLC_FALSE; ;

break

// 2. Passaggio rilevato , timerA r e i n i z i a l i z z a t o

if ( f o t o 1

{

}

== RTPLC_TRUE)

a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗ P a s s a g g i o e f f e t t u a t o ∗∗ \n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok timerA = 0 ; s t a t u s M a i n =0; sear hDB = RTPLC_FALSE; isOn1 =1; sleep (3000) ; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; ;

break

// 3. Passaggio non rilevato , timerA in rementato

if ( f o t o 1==RTPLC_FALSE

{

} }

)

timerA=timerA +1;

break ; } default : break ;

} }

else

}

}

{ p ro x y _ro u tin e_a lla rme ( type ) ; }

A.4

routineInit. :

#define #define

_INTERNAL_GENERATION DATABASE " dataBase . t x t "

#in lude #in lude

" r t p l . h" " d e f i n i t i o n s . h"

60

void RTPLC_ROUTINE /∗ r o u t i n e

di

inizializzazione

di

variabili

∗/

r o u t i n e _ i n i t (LPVOID n u l l ) {

// i n i z i a l i z z a z i o n e

variabili

globali

// 0 .

inizializzazione

segnalatori

// 1 .

inizializzazione

status

l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE;

s t a t u s M a i n =0; // s t a t u s s t a t u s S e r i a l e =0; // s t a t u s statusLeggiDB =0; // s t a t u s s t a t u s A l l a r m e =0; // s t a t u s s t a t u s C o n t r o l l o U =0; // s t a t u s statusAggiornaDB =0; // s t a t u s

lavoro

routine

della

routineMain

della

routine_leggiSeriale

della

routine_leggiDB

della

routine_allarme

della

routine_ ontrolUs ito

della

routine_aggiornaDB

// 2 .

inizializzazione

timer

routine

// 3 .

inizializzazione

variabili

timerT =0; // t i m e r t r a n s p o n d e r timerA =0; // t i m e r p a s s a g g i o u t e n t e t i m e r A l =0; // t i m e r d i a l l a r m e t i m e r S o s t a =0; // t i m e r d i s o s t a

type =0; // t i p o a l l a r m e a z i o n a t o rxLen =0; // l u n g h e z z a b u f f e r s e r i a l e g f o t o 1 =0; // o n t r o l l o r e g u a s t i f o t o e l l u l a 1 g f o t o 2 =0; // o n t r o l l o r e g u a s t i f o t o e l l u l a 2 i n i z i o =1; // v a r i a b i l e d i o n d i z i o n a m e n t o p e r l ' e s e u z i o n e d e l l a nId =1; // numero d e l l a p o s i z i o n e i n p r e s e n t i d o v e i n s e r i r e il k=0; // numero p r e s e n t i j =0; // v a r i a b i l e d ' a p p o g g i o p e r l ' i n t e r f a i a s =0; e =1; // v a r i a b i l e p e r l ' i n s e r i m e n t o n u o v i e l e m e n t i n e l d b memset ( i , 0 , 5 ) ; // 4 .

inizializzazione

variabili

isOn1=RTPLC_FALSE; isOn2=RTPLC_FALSE; r e s e t=RTPLC_FALSE; a l l a r m e=RTPLC_FALSE; f o t o 1=RTPLC_FALSE; f o t o 2=RTPLC_FALSE; sear hDB=RTPLC_FALSE; V i s u a l i z z a=RTPLC_FALSE; u s i t o=RTPLC_FALSE;

o n t r o l l a=RTPLC_FALSE; f a t t o=RTPLC_FALSE; i s A l 1=RTPLC_FALSE;

booleane passato

stato

di

attivita '

foto ellula1

// o n t r o l l o r e

passato

stato

di

attivita '

foto ellula2

// v a r i a b i l e

di

azionamento

reset

// v a r i a b i l e

di

azionamento

allarme

// v a r i a b i l e

ontrollo

azionamento

foto ellula1 foto ellula2

( i alino )

// v a r i a b i l e

ontrollo

azionamento

// v a r i a b i l e

ontrollo

autorizzazione

// v a r i a b i l e

appoggio

// v a r i a b i l e

he

// v a r i a b i l e

indi a

in

segnala se

d e l l ' utente

// o n t r o l l o r e manuale

per

t y p e =1

aso

di

e '

l ' interfa

ia

he

'e '

gia

un

stato

utente

( per non

evitare

routine_allarme. :

void s t u b _ r o u t i n e _ a l l a r m e (ULONG type ) ; void RTPLC_ROUTINE r o u t i n e _ a l l a r m e (PRTPLC_FUNCTION_INPUT // : FUNCTION_BEGIN

61

il

autorizzato )

#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude " d e f i n i t i o n s . h"

}

us ita

us ente

allarme

ingresso

s t u b _ r o u t i n e _ a l l a r m e ( input −>params [ 0 ℄ . v a l u e . u l ) ;

in

memorizzato

}

A.5

filedatabase

// o n t r o l l o r e

// l ' i d e n t i f i a t i v o // r e s e t

lettura prossimo

input ) {

possibile

// :FUNCTION_END // :STUB_IMPLEMENTATION /∗ R o u t i n e / param / ogni

void

di

type stato

/ indi a

gestione numero

attivazione

di

stato

rappresenta

l ' allarme

da

un

allarme .

d e l l ' allarme allarme

attivare

attivato

diverso

il

numero

passato

per

argomento

∗/

s t u b _ r o u t i n e _ a l l a r m e (ULONG type ) {

ULONG r i t o r n o S e r i a l e ; s t a t u s A l l a r m e = type ; a l l a r m e = RTPLC_TRUE; l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE;

swit h ( s t a t u s A l l a r m e )

ase 1 :

{

{

// a l l a r m e

utente

non

autorizzato

RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE UTENTE NON AUTORIZZATO∗∗∗∗∗∗∗∗ \ n\0 " ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; i s A l 1=RTPLC_TRUE; //

if

ogni

10

iterazioni

lettore

ontrolla

se

un

utente

autorizzato

si

e '

identifi ato

sul

Rfid

( timerT==10) { ritornoSeriale = proxy_routine_leggiSeriale () ;

if ( r i t o r n o S e r i a l e

// r i h i a m a

{

la

funzione

== 1 )

leggiSeriale

a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45; a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i a z i o n e non e f f e t t u a t a , \ n l e t t u r a s e r i a l e i n

o r s o \n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; ;

break else

} {

timerT =0; ( sear hDB == RTPLC_TRUE) {

if

// l ' u t e n t e

} }

}

si

e '

autentifi ato

l ' allarme

viene

disinserito

a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45; a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i a z i o n e e f f e t t u a t a , \ n u s i t a s t a t o d i a l l a r m e \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; a l l a r m e = RTPLC_FALSE; // i n d i a t o r e d i s t a t o d i a l l a r m e d i s a b i l i t a t o sear hDB = RTPLC_FALSE; // r e s e t r i e r a i s A l 1 = RTPLC_FALSE; type = 0 ; // r e s e t t y p e d e l l ' e r r o r e a l l a r m ( (USHORT) 0 ) ; s t a t u s M a i n =0; ;

break

else

{ a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45; a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i f i a z i o n e non e f f e t t u a t a , \ n a t t e s a a u t e n t i f i a z i o n e \n" ;

62

}

s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; timerT=timerT +1; } break ;

ase 2 :

{

// A l l a r m e

segnali

foto ellule

simultanei

RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE SEGNALI FOTOCELLULE SIMULTANEI,STATO INCONSISTENTE ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ A t t e n d e r e r i s t a b i l i z z a z i o n e s t a t o o n s i s t e n t e ∗∗∗∗∗∗∗∗ \ n\0 " ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;

i f ( f o t o 1==RTPLC_FALSE && f o t o 2==RTPLC_FALSE)

{

// r i i n i z i a l i z z a z i o n e

a l l a r m e =0; s t a t u s A l l a r m e =0; sear hDB =0; type =0; a l l a r m ( (USHORT) 0 ) ;

variabili

globali

}

}

break ;

ase 3 :

{

// A l l a r m e

}

lettore

RFID non

attivo

RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE LETTORE RFID NON COLLEGATO ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ P r o e d e r e on i l r e s e t manuale d e l PLC ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; a l l a r m e =1; break ;

ase 4 :

{

// A l l a r m e

possibile

guasto

alla

foto ellula

1

RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE POSSIBILE GUASTO ALLA FOTOCELLULA1 ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ Se non g u a s t a l i b e r a r e l a f o t o e l l u l a ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ oppure p r o e d e r e on i l r e s e t ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;

i f ( f o t o 1==RTPLC_FALSE)

{

}

a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ F o t o e l l u l a 1 l i b e r a t a r i s t a b i l i z z a z i o n e r o u t i n e main ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; a l l a r m ( (USHORT) 0 ) ; s t a t u s M a i n =0; isOn1 =0; a l l a r m e =0; t i m e r A l =0; g f o t o 1 =0; break ;

i f ( t i m e r A l ==60)

{

// d o p o

60

iterazioni

on

la

foto1

attiva

e '

ne essario

resettare

la

ma

hina

a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ P r o e d e r e on i l r e s e t f o t o e l l u l a 1 non l i b e r a t a

63

}

∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; break ;

else

t i m e r A l=t i m e r A l +1;

}

break ;

ase 5 :

{

// A l l a r m e

possibile

guasto

alla

foto ellula

2

RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE POSSIBILE GUASTO ALLA FOTOCELLULA2 ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ Se non e ' g u a s t a l i b e r a r e l a f o t o e l l u l a ∗∗∗∗∗∗∗∗ \ n ∗∗∗∗∗∗∗∗ oppure p r o e d e r e on i l r e s e t ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;

i f ( f o t o 2==RTPLC_FALSE)

{

}

a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ F o t o e l l u l a 2 l i b e r a t a r i s t a b i l i z z a z i o n e r o u t i n e main ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; a l l a r m ( (USHORT) 0 ) ; s t a t u s M a i n =0; isOn2 =0; a l l a r m e =0; t i m e r A l =0; g f o t o 2 =0; break ;

i f ( t i m e r A l ==60)

{

// d o p o

60

iterazioni

on

la

foto2

attiva

e '

ne essario

resettare

la

ma

hina

a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ P r o e d e r e on i l r e s e t f o t o e l l u l a 2 non l i b e r a t a ∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; i f ( k==2) r e s e t =1; sleep (300) ;

}

break ; } t i m e r A l=t i m e r A l +1; break ;

ase 6 :

{

// a t t i v a z i o n e

allarme

manuale

RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE ATTIVATO ALLARME MANUALE∗∗∗∗∗∗∗∗ \ n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; a l l a r m ( (USHORT) AL_MANUALE) ; t i m e r A l++; i f ( t i m e r A l ==300) { // s i

}

resetta

automati amente

dopo

300

iterazioni

a p p o g g i o . v a l u e . s t r i n g . s z =(PRTPLC_CHARSTRING)_T( " ∗∗∗∗∗∗∗∗ PLC r e s e t ∗∗∗∗∗∗∗ \ n" ) ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r e s e t=RTPLC_TRUE; a l l a r m e =0; t i m e r A l =0; break ;

64

}

default : break ;

}

}

A.6

routine_leggiDB. :

;# d e f i n e _INTERNAL_GENERATION

#in lude #in lude #in lude

" r t p l . h" " d e f i n i t i o n s . h" " o m f i l e . h"

// : FUNCTION_BEGIN

ULONG stub_routine_leggiDB ( ) ;

void RTPLC_ROUTINE }

r o u t i n e _ l e g g i D B (PRTPLC_FUNCTION_INPUT i n p u t ) { input −>r e t V a l −>v a l u e . u l= stub_routine_leggiDB ( ) ;

// :FUNCTION_END // :STUB_IMPLEMENTATION /∗ R o u t i n e / return

di

long

ari amento

della

indi a

routine

alla

a he

degli

identifi ativi

hiamante

se

la

funzione

leggiDB

ha

terminato

la

sua

ese uzione /

1

non

/

0

ha

ha

terminato

t e r m i n a t o ∗/

ULONG stub_routine_leggiDB ( ) { SHORT r e t o d e ; ULONG s i z e S ; OMRESULT r e t ; RTPLC_STRING nome ; RTPLC_STRING f i n e ; RTPLC_STRING format ; RTPLC_STRING nomeUtente ; RTPLC_STRING s e r i a l e ; // i n i z i a l i z z o

le

variabili

r e t o d e =0; s i z e S =0; f i n e . s i z e =5; nome . s i z e =5; format . s i z e =5; s e r i a l e . s i z e =18; nomeUtente . s i z e =18; f i n e . s z=" \n" ; nome . s z=" ! " ; s e r i a l e . s z=" " ; nomeUtente . s z=" " ; format . s z="%s " ; l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE;

swit h ( statusLeggiDB ) {

ase 0 : // v a r i a b i l e

//

di

apertura

stato

file

di

appoggio

status_seriale

txt

in

lettura

r t p l t r a e ( 1 ,_T( " f u n z i o n e l e g g i d b s t a t o 0 \n" ) ) ; //

valore

di

risposta

//

apertura

if

(OMFAILED ( r e t ) )

r e t = OM_OK;

d e l l ' apertura

del

file

inizializzato

a

ok

file

r e t = o m f i l e o p e n (& f i l e n a m e . v a l u e . s t r i n g ,&R_openmode . v a l u e . s t r i n g ,& f i l e _ h a n d l e [ 0 ℄ ) ; r t p l t r a e ( 1 ,_T( " A t t e s a \n" ) ) ;

// 1 .

{

apertura

fallita

r e t <0

r t p l t r a e ( 1 ,_T( " E r r o r e a p e r t u r a f i l e %s \n" ) ,W322OMERR( r e t ) ) ;

65

statusLeggiDB = 0 ;

}

return OM_ERROR;

else

// 2 .

apertura

in

ese uzione

i f ( r e t == OMCS_WAIT)

{ }

r e t ==1

r t p l t r a e ( 1 ,_T( " A t t e s a \n" ) ) ;

return OMCS_WAIT;

else

// 3 .

file

aperto

r e t ==0

i f ( r e t == OM_OK)

{

}

r t p l t r a e ( 1 ,_T( " F i l e a p e r t o o r r e t t a m e n t e \n" ) ) ; statusLeggiDB = 1 ; return OMCS_WAIT; // p e r h e ' a n o r a d e v e l e g g e r e

ase 1 :

// l e t t u r a

// v a r i a b i l e

file

ritorno

lettura

file

inizializzata

a

ok

r t p l t r a e ( 1 ,_T( " l e t t u r a \n" ) ) ; r e t = OM_OK; r e t = o m f i l e r e a d l i n e ( f i l e _ h a n d l e [ 0 ℄ , & returnparam . v a l u e . s t r i n g ) ; // 1 .

lettura

file

fallita

// 2 .

lettura

file

in

// 3 .

lettura

file

terminata

i f (OMFAILED ( r e t ) ) return OM_ERROR;

i f ( r e t == OMCS_WAIT) return 1 ;

i f ( r e t == OM_OK)

{ }

r e t <0

ese uzione

r e t ==1

r e t ==0

statusLeggiDB =2;

return OMCS_WAIT;

ase 2 : // l e

stringhe

// t o k e n i z z o

a he // n I d

sul

le

file

linee

devono

lette

da

essere

del

file

le

e

tipo

:

< o d i e >!<nome>

inseris o

nella

prima

posizione

in

libera

indi a

la

posizione

libera

in

a he

r t p l t r a e ( 1 ,_T( " t o k e n i z z a z i o n e \n" ) ) ; r t p l t r a e ( 1 ,_T( "NID : \n" ) ) ; i f ( nId==1) { r t p l t r a e ( 1 ,_T( " s r t o k \n" ) ) ; s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; r t p l t r a e ( 1 ,_T( " s r p y \n" ) ) ; s r p y (& i d 1 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome1 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome1 . v a l u e . s t r i n g . sz , i d 1 . v a l u e . s t r i n g . s z ) ; nId++; statusLeggiDB =1; r t p l t r a e ( 1 ,_T( " e s o n i d 1 \n" ) ) ; return 1 ; }

else i f ( nId==2)

{

r t p l t r a e ( 1 ,_T( " n i d =2\n" ) ) ; s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; s r p y (& i d 2 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome2 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " n i d =2\n" ) ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome2 . v a l u e . s t r i n g . sz , i d 2 . v a l u e . s t r i n g . s z ) ;

66

nId++; statusLeggiDB =1; r t p l t r a e ( 1 ,_T( " e s o n i d 2 \n" ) ) ; return 1 ; }

else i f ( nId==3)

{

s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; s r p y (& i d 3 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome3 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome3 . v a l u e . s t r i n g . sz , i d 3 . v a l u e . s t r i n g . s z ) ; nId++; statusLeggiDB =1; r t p l t r a e ( 1 ,_T( " e s o n i d 3 \n" ) ) ; return 1 ;

}

else i f ( nId==4)

{

}

s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; s r p y (& i d 4 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome4 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome4 . v a l u e . s t r i n g . sz , i d 4 . v a l u e . s t r i n g . s z ) ; nId++; statusLeggiDB =1; return 1 ;

else i f ( nId==5)

{

}

s e r i a l e . s z=s r t o k (& returnparam . v a l u e . s t r i n g ,&nome ) ; nomeUtente . s z=s r t o k (NULL,& f i n e ) ; s r p y (& i d 5 . v a l u e . s t r i n g ,& s e r i a l e ) ; s r p y (&nome5 . v a l u e . s t r i n g ,& nomeUtente ) ; r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :%s<−−−− s e r i a l=%s<−−−\n" ) , nome5 . v a l u e . s t r i n g . sz , i d 5 . v a l u e . s t r i n g . s z ) ; statusLeggiDB++;

return 1 ;

ase 3 : // v a r i a b i l e

ritorno

hiusura

init

ok

ret = omfile lose ( file_handle [ 0 ℄ ) ; // 1 .

hiusura

fallita

r e t <0

i f (OMFAILED ( r e t ) )

{

}

r t p l t r a e ( 2 , _T( " E r r o r e d u r a n t e l a h i u s u r a d i un f i l e " ) ) ;

return − 1;

// 2 .

hiusura

// 3 .

fine

in

ese uzione

i f ( r e t == OMCS_WAIT) return 1 ; operazione

i f ( r e t == OM_OK)

{

r e t =1

hiusura

file_handle [ 0 ℄ = 0;

return 0 ; }

default :

67

return return 0 ;

0;

} }

A.7

routine_aggiornaDB. :

#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude " d e f i n i t i o n s . h" // : FUNCTION_BEGIN

ULONG stub_routine_aggiornaDB ( ) ;

void RTPLC_ROUTINE }

routine_aggiornaDB (PRTPLC_FUNCTION_INPUT i n p u t ) { input −>r e t V a l −>v a l u e . u l= stub_routine_aggiornaDB ( ) ;

// :FUNCTION_END // :STUB_IMPLEMENTATION /∗ f u n z i o n e

di

/ implementa / return

long

/

1

/

0

aggiornamento

le

funzioni

di

identifi ativi rimpiazzamento

indi a

alla

non

terminata

e '

e '

routine

in

a he

proprie

hiamante

se

la

di

una

funzione

a he e '

terminata

t e r m i n a t a ∗/

ULONG stub_routine_aggiornaDB ( ) { OMRESULT r e t ; USHORT mp ; RTPLC_STRING o d i e ; RTPLC_STRING nomeUtente ; RTPLC_STRING nome ; RTPLC_STRING f i n e ; RTPLC_BIT t r o v a t o ; // i n i z i a l i z z a z i o n e

variabili

f i n e . s i z e =5; nome . s i z e =5;

o d i e . s i z e =20; nomeUtente . s i z e =20;

o d i e . s z=" " ; nomeUtente . s z=" " ; f i n e . s z=" \n" ; nome . s z=" ! " ; t r o v a t o=RTPLC_FALSE;

mp=0;

di

appoggio

swit h ( statusAggiornaDB )

ase 0 :

{

{

// 1 .

Apro

il

r e t = OM_OK;

file

//

apertura

file

if

(OMFAILED ( r e t ) )

r e t = o m f i l e o p e n (& f i l e n a m e . v a l u e . s t r i n g ,&R_openmode . v a l u e . s t r i n g ,& f i l e _ h a n d l e [ 0 ℄ ) ;

// 1 . 1

{

apertura

fallita

r t p l t r a e ( 1 ,_T( " E r r o r e a p e r t u r a f i l e %s \n" ) ,W322OMERR( r e t ) ) ; statusAggiornaDB = 0 ; OM_ERROR;

return else if ( r e t == OMCS_WAIT) return OMCS_WAIT; else

}

r e t <0

// 1 . 2

apertura

// 1 . 3

file

in

aperto

ese uzione

r e t ==1

r e t ==0

68

if ( ret

== OM_OK)

{ statusAggiornaDB

return

=

OMCS_WAIT;

1;

// p e r h e ' an ora deve l e g g e r e

} }

ase

{

1:

// v a r i a b i l e d i annullamento v a l o r e i n t e r n o d e l l a v a r i a b i l e

RTPLC_VARIANT

annulla ;

a n n u l l a . v t=RTPLC_FORMAT_STRING ; a n n u l l a . v a l u e . s t r i n g . s i z e =3; a n n u l l a . v a l u e . s t r i n g . s z=" " ;

// 2 . l e g g o l a r i g a ret

= OM_OK;

ret

=

omfilereadline ( file_handle

[ 0 ℄ , & returnparam . value . s t r i n g ) ;

// 2 . 1 l e t t u r a f i l e f a l l i t a r e t <0

if

(OMFAILED

( ret ) )

{ s t a t u s A g g i o r n a D B =5; s e a r h D B=RTPLC_FALSE ;

return

1;

}

// 2 . 2 l e t t u r a f i l e i n e s e u z i o n e r e t==1

if

( ret

== OMCS_WAIT)

return

1;

// 2 . 3 l e t t u r a f i l e t e r m i n a t a r e t==0

if ( ret

{

== OM_OK)

i f ( s r m p (& r e t u r n p a r a m . v a l u e . s t r i n g ,& a n n u l l a . v a l u e . s t r i n g ) ==0) {

// n e l aso l a s t r i n g a l e t t a s i a n u l l a e s e d a l l a f u n z i o n e s t a t u s A g g i o r n a D B =5; s e a r h D B=RTPLC_FALSE ;

return

1;

} s t a t u s A g g i o r n a D B =2;

return

OMCS_WAIT;

}

}

ase

{

2:

// prendo l a l i n e a l e t t a da f i l e e o n t r o l l o s e e ' l ' i d e n t i f i a t i v o he e r o

RTPLC_VARIANT

annulla ;

a n n u l l a . v t=RTPLC_FORMAT_STRING ; a n n u l l a . v a l u e . s t r i n g . s i z e =3; a n n u l l a . v a l u e . s t r i n g . s z=" " ;

// 3 . s r t o k d e l l a s t r i n g a l e t t a

o d i e . s z=s r t o k (& r e t u r n p a r a m . v a l u e . s t r i n g ,& nome ) ; n o m e U t e n t e . s z=s r t o k (NULL,& f i n e ) ;

// i n s e r i s o l e due s t r i n g h e n e l l e v a r i a b i l i g l o b a l i per i l rimpiazzamento s r p y (& idN . v a l u e . s t r i n g ,& o d i e ) ; s r p y (&nomeN . v a l u e . s t r i n g ,& n o m e U t e n t e ) ;

−−−− s e r i a l=%s <−−−\n " )

r t p l t r a e ( 1 ,_T( " s r x B u f f e r . v a l u e . s t r i n g :% s< s z , idN . v a l u e . s t r i n g . s z ) ;

s r p y (& r e t u r n p a r a m . v a l u e . s t r i n g ,& a n n u l l a . v a l u e . s t r i n g ) ; s t a t u s A g g i o r n a D B =3;

return

1;

}

ase

3:

{

// 4 . o n f r o n t o i l o d i e l e t t o on q u e l l o p a s s a t o ( sr mp )

mp=s r m p (& idN . v a l u e . s t r i n g ,& s r x B u f f e r . v a l u e . s t r i n g ) ;

i f ( mp==0)

{

69

, nomeN . v a l u e . s t r i n g .

// ho t r o v a t o l ' i d e n t i f i a t i v o ora devo f a r e i l rimpiazzamento s e a r h D B=RTPLC_TRUE; s t a t u s A g g i o r n a D B =4;

return

1;

}

else

{

// r i o r s i o n e r i i n i z i o d a l l o s t a t o 1 s t a t u s A g g i o r n a D B =1;

return

1;

} }

ase

4:

{

// 5 . l e g g o l ' a r r a y i e d e i d o i n he i d i n s e r i r l o

i f ( e !=6) {

// e v i t o d i f a r e i l w h i l e per non r e a r e l o o p // aso 1 : siamo i n p o s i z i o n i i n t e r n e d e l l ' a r r a y // d e l l ' uso d e l l a a he

i f ( i [ e ℄!=0) {

// l a p o s i z i o n e " e " e ' s t a t a u t i l i z z a t a e ++;

return

1;

} }

i f ( e ==6) {

// aso2 : t u t t e l e p o s i z i o n i sono s t a t e u t i l i z z a t e // r i m p i a z z o l a prima p o s i z i o n e

s r p y (& i d 1 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome1 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; s t a t u s A g g i o r n a D B =5; i [1℄=1;

return

1;

}

else

{

swit h ( e ) {

// e s e g u o i l rimpiazzamento d e l l a p o s i z i o n e p r e s e l t a

ase

1:

s r p y (& i d 1 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome1 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [1℄=1; n I d =1; s t a t u s A g g i o r n a D B =5;

return

ase 2 :

1;

s r p y (& i d 2 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome2 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [2℄=1; n I d =2; s t a t u s A g g i o r n a D B =5;

return

ase 3 :

1;

s r p y (& i d 3 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome3 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [3℄=1; n I d =3; s t a t u s A g g i o r n a D B =5;

return

ase 4 :

1;

s r p y (& i d 4 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ; s r p y (&nome4 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [4℄=1; n I d =4; s t a t u s A g g i o r n a D B =5;

return

ase 5 :

1;

s r p y (& i d 5 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ;

70

s r p y (&nome5 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ; i [5℄=1; nId =5; statusAggiornaDB =5; 1; : statusAggiornaDB =5; 1;

return default return

} } }

ase

{

5:

// 6 . h i u d o

il

file

ret = omfile lose ( file_handle [ 0 ℄ ) ;

if

// 1 .

{

}

if

hiusura

r e t <0

r t p l t r a e ( 2 , _T( " E r r o r e d u r a n t e l a h i u s u r a d i un f i l e " ) ) ; − 1;

return

// 2 .

hiusura

in

ese uzione

( r e t == OMCS_WAIT) 1;

return

if ( r e t

// 3 .

{

fallita

(OMFAILED ( r e t ) )

fine

operazione

== OM_OK)

r e t =1

hiusura

file_handle [ 0 ℄ = 0; statusAggiornaDB =0; e =1; 0;

return } } }

}

default : return

A.8

0;

routine_leggiSeriale. :

#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude "om om . h" #in lude " d e f i n i t i o n s . h" // : FUNCTION_BEGIN

ULONG s t u b _ r o u t i n e _ l e g g i S e r i a l e ( ) ;

void RTPLC_ROUTINE }

r o u t i n e _ l e g g i S e r i a l e (PRTPLC_FUNCTION_INPUT i n p u t ) { input −>r e t V a l −>v a l u e . u l= s t u b _ r o u t i n e _ l e g g i S e r i a l e ( ) ;

// :FUNCTION_END // :STUB_IMPLEMENTATION /∗ F u n z i o n e / return

di

long

lettura indi a

/

0

e '

/

1

non

porta

alla

seriale

routine

hiamante

terminata e '

t e r m i n a t a ∗/

ULONG s t u b _ r o u t i n e _ l e g g i S e r i a l e ( ) { // v a r i a b i l i

di

OMFRESULT r e s ;

risposta

//OMFRESULT r e s 2 ;

USHORT mp ; ULONG r e t ; USHORT s i z e I ;

71

se

la

funzione

e '

terminata

RTPLC_STRING format ; // i n z i z i a l i z z a z i o n e

variabili

mp=0; s i z e I =0; format . s i z e =15; format . s z="%02X%02X%02X%02X" ; l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE; // i n i z i a l i z z a z i o n e

txBuffer txBuffer txBuffer txBuffer txBuffer txBuffer txBuffer txBuffer txBuffer

[0℄ [1℄ [2℄ [3℄ [4℄ [5℄ [6℄ [7℄ [8℄

= = = = = = = = =

buffer

lo ali

domanda

0 x01 ; 0 x09 ; 0 x00 ; 0 x03 ; 0 x01 ; 0 x41 ; 0 x01 ; 0x4A ; 0xB5 ;

//

primo

//

se ondo

byte

della

byte

byte

request

della

LENGHT MSB

//

terzo

//

quarto

byte

della

request

DEVICE ID

//

quinto

byte

della

request

CMD1

byte

della

SOF

request

della

request

LENGHT LSB

//

sesto

//

settimo

//

ottavo

byte

della

request

LRC1

//

ultimo

byte

della

request

LRC2

byte

request

della

CMD2

request

TIME OUT

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

// v a r i a b i l e

di

stato

swit h ( s t a t u s S e r i a l e )

{

statusSeriale

ase 0 :

r e s=OMCS_OK;

// r i h i e s t a

lettura

// T r a s m i s s i o n e

alla

request

seriale

su

om1

r e s = om write ( 1 , t x B u f f e r , s i z e o f ( t x B u f f e r ) ) ; i f ( r e s == OMCS_WAIT)

// non

ha

finito

di

return 1 ; else

{

leggere

i f ( r e s == OMCS_OK) // ha

{ }

finito

di

leggere

statusSeriale = 1;

return 1 ;

else i f ( r e s == OMCS_ERROR) // ha

}

fatto

errore

return − 1;

break ;

ase 1 : {

ULONG r i s ; // o n t r o l l o h e l a r i s p o s t a non s i a o s t i t u i t a RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =20; a p p o g g i o . v a l u e . s t r i n g . s z=" 000000000000000000000000000000 " ; // l e t t u r a

risposta

da

0

nel

aso

seriale

r e s 5 = om read ( 1 , r x B u f f e r , s i z e o f ( r x B u f f e r ) , 3 0 0 , ( int ∗ )&rxLen ,TRUE) ;

// i n s e r i s o

i

bit

letti

in

una

variabile

string

per

poter

essere

gestita

v s r p r i n t f (& s r x B u f f e r . v a l u e . s t r i n g ,& format , r x B u f f e r [ 1 3 ℄ , r x B u f f e r [ 1 2 ℄ , r x B u f f e r [ 1 1 ℄ , rxBuffer [ 1 0 ℄ ) ;

i f ( r e s 5 == OMCS_WAIT) return 1 ; else i f ( r e s 5 == OMCS_OK)

{

r t p l t r a e ( 1 ,_T( "OMCS_OK\n" ) ) ; // f i n e

trasmissione

r i s=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; statusSeriale = 0;

72

i f ( ( rxLen != 0 ) | | ( r i s ==0)) { // 1 . l a l u n g h e z z a d e l l a r i s p o s t a // 1 . 1

ho

ri evuto

un

return 1 ; // l e t t u r a

diversa

0

identifi atore

s t a t u s S e r i a l e = 2 ; // a m b i o identifi atori

e '

stato

per

iniziare

mp

onfronti

on

gli

autorizzati non

terminata

}

else

{ // 2 . La l e t t u r a non e ' a v v e n u t a RTPLC_VARIANT a p p o g g i o ; // C o n d i z i o n e

di

t a g NON t r o v a t o

a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100; a p p o g g i o . v a l u e . s t r i n g . s z=" Nessun Tag r i l e v a t o n e l r a g g i o d i a z i o n e d e l r e a d e r \n" ; s r p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 , _T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; statusSeriale = 0; sear hDB =0; return 0 ; // f i n e l e t t u r a s e r i a l e }

}

else

s t a t u s S e r i a l e =0;

break ; }

// i n i z i o

ase 2 :

ri er a

identifi atore

in

a he

{

// o n f r o n t o

on

identifi atore1

mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 1 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " primo :% s s z ) ; // o k i f ( mp==0) { sear hDB=RTPLC_TRUE; nId =1; s t a t u s S e r i a l e =0; k++; i [1℄=1; r t p l t r a e ( 1 ,_T( " due %s

rx====%s \n" ) , i d 1 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g .

%s \n" ) , i d 1 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; //

ok

} {

}

return 0 ; s t a t u s S e r i a l e =3;

mp=0; return 1 ;

break ; }

ase 3 :

{

// o n f r o n t o

on

identifi atore2

mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 2 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " s e o n d o :% s %s \n" ) , i d 2 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; // ok

i f ( mp==0)

{

sear hDB=RTPLC_TRUE; nId =2; s t a t u s S e r i a l e =0; k++; i [2℄=1;

73

}

return 0 ;

else

{

}

s t a t u s S e r i a l e =4;

mp=0; return 1 ;

break ; }

ase 4 :

{

// o n f r o n t o

on

identifi atore3

mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 3 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " t e r z o :% s %s \n" ) , i d 3 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; // o k

i f ( mp==0)

{

}

sear hDB=RTPLC_TRUE; nId =3; s t a t u s S e r i a l e =0; k++; i [3℄=1;

return 0 ;

else

{

}

s t a t u s S e r i a l e =5;

mp=0; return 1 ;

break ; }

ase 5 :

{

// o n f r o n t o

on

identifi atore4

mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 4 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " q u a r t o :% s %s \n" ) , i d 4 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; // ok

i f ( mp==0) // s e r i a l e

{

}

letta

sear hDB=RTPLC_TRUE; nId =4; s t a t u s S e r i a l e =0; k++; i [4℄=1; r t p l t r a e ( 1 ,_T( "%s

=

id4

%s \n" ) , i d 4 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ;

return 0 ;

else

{

}

s t a t u s S e r i a l e =6;

mp=0; return 1 ;

break ; }

ase 6 :

{

// o n f r o n t o

on

identifi atore5

mp=sr mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 5 . v a l u e . s t r i n g ) ; r t p l t r a e ( 1 ,_T( " q u i n t o : %s %s \n" ) , i d 5 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ; i f ( mp==0) // S e r i a l e l e t t a = a i d 5 { sear hDB=RTPLC_TRUE; nId =5;

74

s t a t u s S e r i a l e =0; k++; i [5℄=1; r t p l t r a e ( 1 ,_T( "%s

return else

%s \n" ) , i d 5 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ;

0;

} {

// e s p a n z i o n e

:

// h i a m a

nuova

// h e

una

aggiorna

il

routine database

ontrolla nel

aso

file ritrovi

l ' id

r e t=proxy_routine_aggiornaDB ( s r x B u f f e r . v a l u e . s t r i n g ) ; ( r e t ==1) 1; ( r e t ==0) { ( sear hDB==RTPLC_FALSE) { nId =0; s t a t u s S e r i a l e =0;

mp=0; e =0; } k++; s t a t u s S e r i a l e =0;

if return if if

}

return 0 ; break ; } default : break ; } return 0 ; }

}

A.9

routine_reset. :

#define _INTERNAL_GENERATION #in lude " r t p l . h" #in lude " d e f i n i t i o n s . h" void s t u b _ r o u t i n e _ r e s e t ( ) ; void RTPLC_ROUTINE r o u t i n e _ r e s e t (PRTPLC_FUNCTION_INPUT // : FUNCTION_BEGIN

}

stub_routine_reset () ;

input ) {

// :FUNCTION_END // :STUB_IMPLEMENTATION

void

/∗ f u n z i o n e //

di

reset

delle

variabili

stub_routine_reset () {

Routine

per

la

globali

ristabilizzazione

// a l l a r m ( (USHORT)

0) ;

// 0 .

segnalazione

di

// 1 .

riinizializzazione

di

∗/

uno

stato

onsistente

RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =2; a p p o g g i o . v a l u e . s t r i n g . s z=" " ; impegno

l u e V e r d e=RTPLC_FALSE; l u e R o s s a=RTPLC_TRUE;

s t a t u s M a i n =0; s t a t u s S e r i a l e =0; statusLeggiDB =0; s t a t u s A l l a r m e =0; s t a t u s C o n t r o l l o U =0;

variabili

di

stato

75

del

pl

// 2 .

riinizializzazione

timer

// 3 .

riinizializzazione

variabili

// 4 .

riinizializzazione

variabili

timerT =0; timerA =0; t i m e r A l =0; t i m e r S o s t a =0;

isOn1=RTPLC_FALSE; isOn2=RTPLC_FALSE; r e s e t=RTPLC_FALSE; a l l a r m e=RTPLC_FALSE; f o t o 1=RTPLC_FALSE; f o t o 2=RTPLC_FALSE; l u e V e r d e=RTPLC_TRUE; l u e R o s s a=RTPLC_FALSE; sear hDB=RTPLC_FALSE; V i s u a l i z z a=RTPLC_FALSE; u s i t o=RTPLC_FALSE;

o n t r o l l a=RTPLC_FALSE; f a t t o=RTPLC_FALSE; i s A l 1=RTPLC_FALSE;

// ( non

vengono

type =0; g f o t o 1 =0; g f o t o 2 =0; nId =1; k=0; j =0; s =0;

resettati

// 5 .

riinizializzazione

// 6 .

delete

:

rxLen

booleane

e

inizio )

presenti

s r p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; s r p y (& uUs ente . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ; messaggi / a l l a r m i

messagp ( (USHORT) 0 ) ; a l l a r m ( (USHORT) 0 ) ;

}

76

A ronimi PLC

Programmable logi ontroller

RFID

Radio Frequen y IDenti ation

CAN

Controller Area Network

ISO/OSI

Open Systems Inter onne tion

ARM9

Advan ed RISC Ma hine 9

OEM

Original Equipment Manufa turer

77

Related Documents

Domotica Industriale
December 2019 54
Domotica
May 2020 9
Domotica
October 2019 17
Domotica
April 2020 8
Domotica
November 2019 21

More Documents from ""

Posbindu.doc
May 2020 27
Ibn Rushd
July 2020 37
May 2020 38
Tandatangan.docx
June 2020 33
July 2020 28