Professional Documents
Culture Documents
Domoti a industriale
Presentata da
Rita Pu
i
1
A mio padre
2
Sommario
Il progetto ha avuto
ome obiettivo la
reazione di un sistema per appare
hiature
Programmable logi
ontroller (PLC),
ostruite per lo sviluppo di impianti domoti
i
industriali.
Il Sistema sviluppa il
ontrollo degli a
essi al magazzino utilizzando la te
nologia
Radio Frequen
y IDenti
ation (RFID) per l'identi
azione degli utenti e il
ontrollo
dell'ingressi eettivi alla struttura tramite due foto
ellule a laser. In
aso di a
esso non
autorizzato, viene utilizzato sia un allarme a
usti
o, un
i
alino, sia un allarme visivo,
visualizzato sull'interfa
ia
he è stata implementata per il sistema.
Oltre al
ontrollo degli a
essi, il sistema, si preo
upa di
ontrollare lo stato delle
periferi
he lan
iando allarmi spe
i
i in
aso di guasti eettivi o presunti.
Questo sistema di si
urezza è stato sviluppato per l'azienda ISAC, seguendo le spe
i-
he indi
ate dal tutore aziendale. Ogni funzionalità è stata testata
on attori umani e
periferi
he funzionanti reali, in modo da poter essere un prototipo adabile per eventuali
sviluppi.
Indi
e
1 Introduzione 5
1.1 Sistemi di identi
azione a radiofrequenza . . . . . . . . . . . . . . 6
Storia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Storia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2 Il Problema 12
2.1 Presentazione progetto . . . . . . . . . . . . . . . . . . . . . . . . . . 12
RTPLC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 Analisi 17
3.1 Use Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4 La Soluzione 31
4.1 Strutturazione del progetto . . . . . . . . . . . . . . . . . . . . . . . 31
5 Implementazione 39
5.1 S
elte implementative . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6 Manuale 41
6.1 Funzionalità oerte . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1
7 Con
lusioni e sviluppi futuri 49
A Codi
e 50
A.1 denition.h: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
A.2 denition.
: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
A.3 routineMain.
: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
A.4 routineInit.
: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
A.5 routine_allarme.
: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
A.6 routine_leggiDB.
: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
A.7 routine_aggiornaDB.
: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
A.8 routine_leggiSeriale.
: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
A.9 routine_reset.
: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
2
Elen
o delle gure
1.1 tag RFID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Data Frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.1 RTPLC-SIMU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.1 use
ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.2 use
ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.3 use
ase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Diagramma di sequenza entrata . . . . . . . . . . . . . . . . . . . . . . . 24
3.5 Diagramma di sequenza us
ita . . . . . . . . . . . . . . . . . . . . . . . . 25
3.6 Diagramma di sequenza generale . . . . . . . . . . . . . . . . . . . . . . 26
3.7 Diagramma di attività 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.8 Diagramma di attività 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.9 Diagramma di attività 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
6.1 S
hermata inziale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.2 S
hermata attesa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.3 S
hermata man
ato passaggio . . . . . . . . . . . . . . . . . . . . . . . . 44
6.4 S
hermata impegno foto
ellula1 . . . . . . . . . . . . . . . . . . . . . . . 44
6.5 S
hermata passaggio eettuato . . . . . . . . . . . . . . . . . . . . . . . 45
6.6 S
hermata us
ita utente . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.7 S
hermata di reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.8 S
hermata allarme manuale . . . . . . . . . . . . . . . . . . . . . . . . . 46
6.9 S
hermata allarme impegno simultaneo delle foto
ellule . . . . . . . . . . 47
6.10 S
hermata allarme Foto
ellula2 guasta(o impegnata da troppo tempo) . . 47
6.11 S
hermata allarme man
ata autenti
azione . . . . . . . . . . . . . . . . 48
6.12 S
hermata messaggio blo
o del reset . . . . . . . . . . . . . . . . . . . . 48
3
Ringraziamenti
Stima e ri
onos
enza va al Prof. Augusto Ciuoletti, per la sua disponibilità, i preziosi
onsigli sia durante il tiro
inio sia spe
i
atamente nella stesura della tesi.
Ringrazio il dott. Andrea De Nardis, (Capo del
entro sviluppo presso la ditta ISAC)
per avermi dato la possibilità di svolgere il mio tiro
inio presso la sua azienda, e di
utilizzare le ma
hine per testare il progetto.
Un ringraziamento grande an
he ai ragazzi
he lavorano nell'azienda (Fran
es
o, Ste-
fano P., Stefano S., Mi
hele, Matteo, Jonny, Antonio, Dario, Massimo), per avermi aiu-
tata a
apire
ome svolgere il tiro
inio e per avermi a
olta subito in un ambiente molto
familiare.
Ringrazio la mia mamma Teresa, per il sostegno morale e materiale durante il
on-
seguimento di questa laurea supportandomi sempre in questi anni di università.
Un grande ringraziamento va a mia sorella Marina per l'aiuto importante
he mi ha
dato nella stesura della tesi e per avermi sempre in
oraggiata.
Ringrazio Federi
o, per tutto il suo amore e per avermi sopportata in questi anni nei
momenti tranquilli, nelle ansie pre-esami e in queste ansie pre-laurea standomi sempre
vi
ino.
Inne ringrazio tutti i miei ami
i, ami
he e
ompagni di
orso per la loro ami
izia e
per il ruolo fondamentale
he hanno avuto in questi anni.
4
Capitolo 1
Introduzione
La parola Domoti
a indi
a la s
ienza interdis
iplinare
he si o
upa dello studio dell'au-
tomatizzazione di ambienti. Il termine deriva dalla parola fran
ese Domotique, espressione
verbale questa, formata dalla parola domus e dai termini informatique e télématique.
In senso stretto, la Domoti
a, è quella des
iplina nata per automatizzare ed integrare
le funzionalità di un ambiente domesti
o apportando
omodità nella vita di tutti i giorni.
Gli ambiti in
ui si sviluppa sono quattro: risparmio energeti
o,
onfort, si
urezza,
safety. Mediante un sistema domoti
o è possibile gestire gli impianti interni senza spre
o
di energia ( può
ontrollare
he non rimangano a
ese lu
i in assenza di utenti all'interno
dell'ambiente). Rendendo automatizzati i
ontrolli della struttura, l'utente non deve
o
uparsi del
ontrollo degli appare
hi, il sistema garantis
e la si
urezza della struttura
e dell'utente,
ontro l'intrusioni si
he o all'interno del software di sistema.
Gli impianti domoti
i devono avere i seguenti requisiti:
• modularità : il sistema è diviso in moduli separati da gestire
Grazie a questa dis
iplina è possibile
ostruire la propria
asa a misura d'uomo in-
tegrando an
he tutte le situazioni parti
olari dovute a handi
ap: è infatti s
opo della
domoti
a permettere a
hiunque di poter interagire
on tutte le appare
hiature presenti
nelle nostre
ase.
Le innovazioni portate dalla Domoti
a, trovano appli
azioni an
he in ambienti in-
dustriali e aziendali, dove le stesse te
ni
he di automazione vengono utilizzate per la
gestione di impianti di produzione, videosorveglianza,
ontrollo presenze autorizzate,
ampionamento remoto dei sensori, diagnosti
a della linea di produzione.
Queste nuove appli
azioni industriali sono già state sviluppate da molte aziende del
settore utilizzando me
anismi sempre più avanzati.
Il progetto
he si è sviluppato, rappresenta un'appli
azione della domoti
a in am-
bito industriale, sviluppata
on l'ausilio di dispositivi elettroni
i di rilevamento. Questo
5
aspetto è in
entrato sul
ontrollo delle presenze autorizzate, quindi sulla si
urezza di un
ambiente aziendale.
Sono già state sviluppate soluzioni alternative a quella presentata. Ad esempio l'uti-
lizzo di un lettore biometri
o per il ri
onos
imento delle impronte digitali, l'impiego di un
tastierino numeri
o (in questo
aso il
ontrollo viene eseguito dal sistema
ontrollando il
odi
e inserito) l'impiego di un sensore di prossimità DGLP.
La soluzione presentata utilizza la rilevazione tramite foto
ellule e il ri
onos
imento
tramite tag RFID. Il reader RFID è una soluzione, per in
ontrollo degli a
essi,
he è
già stata adottata da molte aziende di si
urezza e domoti
a.
6
Figura 1.1: tag RFID
7
zionalità sempre più avanzate e all'integrazione dei
omponenti, la te
nologia RFID ha
sostituito la barra magneti
a in numerosi
ampi tra
ui i seguenti:
Appli
azioni medi
he: I
hip RFID possono essere impiegati in appli
azioni
he ri
hiedono
alti livelli di si
urezza,
ome i laboratori
lini
i e biote
nologi
i, e per l'identi-
azione di persone ed oggetti in modo automati
o, si
uro e velo
e, al ne di ot-
timizzare i pro
essi di riduzione degli errori, parti
olarmente
riti
i, in quanto hanno
riper
ussioni sulla salute umana. Fra le appli
azioni della te
nologia RFID legate
alla salute dell'uomo, ma non strettamente alla medi
ina, è in
lusa l'identi
azione
degli atleti durante le manifestazioni sportive allo s
opo, non solo di misurarne i
tempi, ma an
he di assi
urare un intervento rapido in
aso di malori. In al
uni
stadi di baseball
aliforniani sono stati adottati bra
ialetti RFID
ontenenti i dati
anagra
i degli spettatori, allo s
opo di impedire la vendita di al
oli
i ai minorenni
durante le partite.
Anti
ontraazione: Sono state sviluppate
ome soluzione per l'identi
azione della
ontraazione di do
umenti, di beni di lusso,
ome a
essori,
api di abbigliamen-
to, liquori, profumi mediante tag RFID, inserendo la
erti
azione di origine e
provenienza all'interno della mamemoria del tag.
A
essi a strutture pubbli
he e industriali: Vengono utilizzati sistemi RFID per il
ontrollo di a
essi a strutture ban
arie, par
heggi in ambito industriale
on lo
al-
izzazione di personale in ambienti a elevata si
urezza. Questo tipo di appli
azione
del sistema RFID, è stata sviluppata nel progetto per il
ontrollo degli a
essi al
magazzino in modo da garantire un'alta si
urezza alla struttura e alle mer
i.
Il PLC è un
omputer industriale programmabile spe
ializzato nella gestione dei pro-
essi industriali. Esegue programmi di gestione di segnali digitali e analogi
i dirigendo
le azioni
al
olate sugli attuatori presenti sull'impianto. L'evolversi della te
nologia sta
progressivamente mignaturizzando i
omponenti elettroni
i diminuendo i
osti del PLC
e fa
ilitandone la diusione an
he in
ampi non industriali, quali l'ambiente domesti-
o. I pannelli PLC vengono infatti utilizzati an
he per la gestione di sistemi utili per
la
asa
ome salvavita, antifurto, impianto di ris
aldamento e di irrigazione, rendendo
automatizzato il
ontrollo di questi appare
hi.
Una
aratteristi
a prin
ipale del PLC è la robustezza atta a sopportare interferenze
elettromagneti
he, alte temperature e periodi di attività molto lunghi e
ontinui,
arat-
teristi
he proprie degli ambienti industriali. La struttura del PLC viene adattata in base
al pro
esso da automatizzare.
Durante la progettazione del sistema di
ontrollo, vengono s
elte le s
hede adatte alle
grandezze elettri
he in gio
o. Le varie s
hede vengono quindi inserite sul BUS o ra
k del
PLC.
8
Storia
I PLC si sono sviluppati se
ondo la ri
hiesta del mer
ato industriale. A partire dagli anni
70 vi era ri
hiesta di appare
hiature in grado di eseguire logi
he elementari.
Le prime ma
hine avevano un software rigido e potevano svolgere solo po
he funzioni,
avendo nello stesso tempo un
osto proibitivo e un sistema
he risultava
omplesso.
Negli anni 80 l'industria mise sul mer
ato al
uni PLC
on s
hede di modularità e
s
hede di ingressi e us
ita, mantenendo però un prezzo troppo alto per permetterne la
diusione tra le industrie. Solo negli ultimi anni vi è stata una reale diusione dei PLC
on una
ompleta gamma di a
essori
he
oprono molte delle appli
azioni possibili;
an
he il linguaggio di programmazione è
ambiato passando ad un linguaggio ad alto
livello, essendo troppo
ompli
ato programmare i PLC
on linguaggio a basso livello.
La te
nologia del PLC si è evoluta no ad arrivare a PLC
on alte prestazioni e
on
sistemi operativi moderni
ome Windows NT: attualmente sono ma
hine diuse in s
ala
mondiale ed utilizzate in molti ambiti.
Controller Area Network (CAN) è uno standard seriale per bus di
ampo, ossia per
forme di
omuni
azione digitale presenti su reti a basso livello per la
omuni
azione
on
periferi
he quali sensori,
i
alini, led; si basa su
ollegamenti punto a punto
on segnali
a 4-20mA.
Il proto
ollo CAN assi
ura un elevato sistema di si
urezza per le
omuni
azioni di
sistemi in real time
on bit rate no a 1Mb.
Questo proto
ollo è strutturato su 3 livelli: livello oggetto, livello trasferimento, livello
si
o.
9
Figura 1.2: Data Frame
Il Livello oggetto è il livello
he si o
upa del ltraggio delle informazioni e della traduzione
dei messaggi da linguaggi a basso livello a linguaggi ad alto livello.
Il Livello trasferimento è il livello
he si o
upa della gestione degli errori a basso livello
e di tutto
iò
he ri
hiede una
omuni
azione garantita (a
knowledgement). Viene
valutato lo stato della
omuni
azione, se in ri
ezione o in invio,
ontrollando lo stato
del bus.
Il Livello si
o è il livello
he si o
upa della rappresentazione binaria dei messaggi trasfer-
endo i bit di informazione tra i nodi diversi.
I primi due livelli si o
upano del Data Link delle
omuni
azioni, denito dal modello
Open Systems Inter
onne
tion (ISO/OSI), trasmettendo al livello superiore una
omuni-
azione priva di errori. Il livello si
o a
etta e trasmette i messaggi tradotti in binario
senza preo
uparsi del
ontrollo dei pa
hetti; poi
hé è il livello data link ad o
uparsi
del rispetto dei vin
oli. Tutti i nodi
ondividono lo stesso livello si
o.
Il proto
ollo viene usato soprattutto per
hé garantis
e le seguenti proprietà prin
ipali
molto utili per la
omuni
azione in real time:
• garanzia della gestione di vari livelli di priorità asso iati ai singoli messaggi
• essibilità di ongurazione
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
12
ase
reati da utenti umani, non sempre è possibile riprodurre tutte le situazioni
he si
possono
reare intorno alla ma
hina.
Per lo sviluppo della soluzione, e per rius
ire a prendere in
onsiderazione tutte le pos-
sibili situazioni
he si possono ri
reare, sono state analizzate le possibili azioni dell'utente
e gli stati assunti dalle periferi
he, in quanto ogni stato è utilizzato dall'appli
azione per
omprendere la situazione reale
he si è
reata.
• Utente:
attivazione
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:
13
Us
ita: un utente es
e dalla struttura
ontrollata dalla ma
hina. Le possibilità gestite
sono sia di us
ita
on autenti
azione tramite tag, sia senza autenti
azione.
Attivazione Allarme: gestis
e l'avvio degli allarmi, sia per guasti, sia per a
esso non
autorizzato, sia per allarmi manuali.
Disattivazione Allarme: gestis
e il ritorno ad uno stato
onsistente dell'appli
azione
distinguendo però gli allarmi di a
esso non autorizzato dagli altri allarmi e quindi
gestendo due tipi di ristabilizzazione diversi.
Gli use
ase analizzati sono quelli ri
hiesti dal tutore aziendale, sono stati testati sia in
ambiente teori
o (su RTPLC SIMU) sia in ambiente reale (su RTPLC ULISSE), dandomi
la possibilità di notare use
ase parti
olari e situazioni an
ora non gestite. L'appli
azione
segue le ri
hieste del progetto, riportando sempre la ma
hina ad uno stato di quies
enza
e segnalando all'RTPLC i messaggi di informazione.
14
Figura 2.1: RTPLC-SIMU
RTPLC
RTPLC è il progetto ISAC per la serie di prodotti Programmable Automation Controller
(PAC), ovvero un PLC
apa
e di funzionalità avanzate di
omuni
azione ed integrazione
on attori software o umani.
RTPLC
onsente l'ese
uzione di una logi
a programmabile dal
liente Original Equip-
ment Manufa
turer (OEM) al ne di
ontrollare lo stato delle
omponenti si
he di us
ita.
Tali
omponenti si
he sono di varia natura, possono essere
ollegate all'unità
entrale
in modi molto diversi tra di loro, e la loro gestione è a
ari
o del software di base.
L'ese
uzione delle
omponenti
riti
he,
ompresa la legge di
ontrollo del
liente, viene
eettuata
on tempi
erti, ovvero lo stesso usso del programma viene eseguito sempre
nello stesso tempo. RTPLC può essere usato in
ontesti variegati grazie alla sua estrema
essibilità. È stato progettato per poter essere fa
ilmente programmabile e per rendere la
legge di
ontrollo indipendente dalla natura delle
omponenti si
he di ingresso ed us
ita.
Le implementazioni del RTPLC sono i vari prodotti dell'azienda distinti per prestazioni
e hardware utilizzato (RTPLC-SIMU Figura: 2.1)
Ogni implementazione è
ostituita da una parte hardware e una parte software. La
omponente software è rappresentata dal framework: questo
rea un ambiente di ese
u-
zione multithread omogeneo e astratto dall'hardware, al ne di eseguire in tempi
erti
la legge di
ontrollo implementata, in modo da poter gestire tutti gli ingressi, le us
ite,
i proto
olli di manutenzione e di
omuni
azione ne
essari allo sviluppo dell'appli
azione
ri
hiesta (puo' essere implementata in C). Questa
omponente è
ontenuta in moduli
PLC
ari
ati su
omando dal framework,
he provvede a veri
are l'esistenza delle risorse
ri
hieste per l'ese
uzione, e quindi, ad eseguire tale legge.
Nel
aso sia ne
essario, il framework aumenta le sue possibilità in
ludendo gli opt-
15
mod (pre
edentemente installati sulla ma
hina),
ioè moduli opzionali indipendenti dal
framework,
he interagis
ono strettamente
on esso, aggiungendo
apa
ità parti
olari.
Per il progetto è stato ne
essario installare l'OMCOM e l'OMFILE; il primo è un optmod
he
onsente la
omuni
azione
on una porta seriale dando la possibilità di leggere dati e
inviarne, il se
ondo
onsente la gestione dei le fornendo tutte le funzioni ne
essarie per
la loro lettura e s
rittura.
16
Capitolo 3
Analisi
si può trovare, dagli use ase parti olari (allarmi), situazioni parti olari he ne essitano
17
attori Utente
pre
ondizioni tutti i dispositivi sono funzionanti
il transponder ritorna sempre un valore per l'identi
ativo
svolgimento l'utente e munito di transponder e attiva il lettore RFID
il lettore RFID dopo assere stato interrogato dal sistema fornis
e
l'identi
ativo rilevato
il sistema
ontrolla la presenza dell'indenti
ativo tra quelli
ari
ati su
variabili globali
aso non presente tra le variabili globali:
il sistema rilegge il le DataBase per aggiornare la
a
he
aso è presente nel resto del le
il sistema
ari
a il nuovo identi
ativo su una delle variabili globali
il sistema segnala la veri
a dell'identi
ativo e es
e dalla funzione
aso l'identi
ativo veri
ato nel db e presente:
il sistema si pone in attesa dell'attivazione della foto
ellula1
la foto
ellula1 viene impegnata
aso la foto
ellula2 viene impegnata
viene registrato l'ingresso sulla lista degli ultimi 5 ingressi
viene generato un messaggio di informazione
aso la foto
ellula2 non viene impegnata
il sistema mantiene in memoria l'avvenuta autorizzazione
la foto
ellula1 non viene impegnata
il sistema ignora l'autorizzazione
aso L'identi
ativo non è stato veri
ato:
la foto
ellula1 viene impegnata
il sistema rileva la man
ata autorizzazione
il sistema attiva l'allarme ingresso non autorizzato
18
Figura 3.1: use
ase
19
attori Utente
pre
ondizioni tutti i dispositivi sono funzionanti
svolgimento la foto
ellula2 viene impegnata dall'utente
il sistema veri
a se la foto
ellula1 è già stata impegnata
aso la foto
ellula1 è stata impegnata:
si passa al
aso d'uso di entrata
aso la foto
ellula1 non è stata impegnata:
viene segnalata l'avvenuta us
ita dell'utente
il sistema interroga il lettore RFID per una eventuale lettura del
transponder
aso viene rilevato il transponder:
l'utente è tra gli ultimi
inque entrati
aso non viene rilevato il transponder:
il sistema ignora il risultato della seriale
il sistema segnala l'us
ita utente
• manuale
20
attori sistema, utente
pre
ondizionil'utente può attivare solo l'allarme manuale;
l'attivazione dell'allarme prevede una distinzione tra le
ause di
attivazione.
svolgimento il sistema rileva la
ausa dell'attivazione dell'allarme
il sistema genera un messaggio di allarme
ri
hiama la routine di gestione allarme
21
Figura 3.3: use
ase
22
attori utente
pre
ondizioni la ma
hina è sempre in allarme
svolgimento
aso allarme diverso da man
ata autorizzazione:
l'utente utilizza il tasto di reset della ma
hina
la ma
hina torna ad uno stato
onsistente
viene tolto il messaggio di allarme
aso allarme man
ata autorizzazione:
l'utente utilizza il proprio transponder per farsi identi
are dalla
ma
hina
aso il transponder rilevato dal lettore di RFID è autorizzato:
la ma
hina torna ad uno stato
onsistente
viene tolto il messaggio di allarme
aso il transponder rilevato dal lettore di RFID non è autorizzato
la ma
hina rimane in uno stato di allarme:
Passiamo adesso all'analisi delle interazioni tra routine e attore e vi
eversa. I diagram-
mi di sequenza studiati hanno fa
ilitato la
omprensione delle interazioni tra le routine
favorendo la stesura del
odi
e.
Il primo diagramma rappresenta l'ingresso alla struttura Figura:3.4.
INGRESSO: Il sistema veri
a ogni 100 iterazioni, se il lettore RFID ha rilevato
un tag nell'area di azione; nel
aso sia stato rilevato un tag, il sistema veri
a l'autor-
izzazione dell'identi
ativo rilevato e restituis
e true, se l'identi
ativo è presente nella
lista del personale autorizzato, e false, se non vi risulta.
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
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
26
Figura 3.7: Diagramma di attività 1
Controllo1 (transponder):
Il sistema deve inviare una ri
hiesta di informazioni alla porta seriale del dispositivo
di lettura RFID per poter ri
evere informazioni dal lettore. Appena inviata la ri
hiesta,
ri
eve le informazioni dal lettore sui tag interni all'area di lavoro di sua
ompetenza,
e veri
a la validità dell'identi
ativo rilevato, utilizzando una
a
he
ontenente i pri-
mi 5 identi
ativi autorizzati. Nel
aso in
ui non sia presente tra gli identi
ativi in
a
he, viene ri
er
ato nel le ban
a dati, se viene trovato, la
a
he aggiorna tramite
rimpiazzamento; nel
aso
ontrario, il sistema segnala la man
ata autorizzazione.
Appena viene salvato l'identi
ativo rilevato, il lettore RFID viene reimpostato sull'
attesa di una nuova ri
hiesta di lettura. Il lettore RFID legge sempre un risultato: nel
aso ri
eva informazioni da un tag, ritorna l'identi
ativo letto, nel
aso non ri
eva al
una
informazione, ritorna un identi
ativo nullo (una parola
on lunghezza 0). Il
ontrollo1
non prevede l'attivazione dell'allarme in quanto l'utente non è entrato si
amente nella
27
Figura 3.8: Diagramma di attività 2
28
Figura 3.9: Diagramma di attività 3
29
Controllo3 (foto
ellula2):
Il sistema deve rilevare lo stato della foto
ellula2, nel
aso risulti impegnata veri
a
l'impegno della foto
ellula1; se la foto
ellula1 è impegnata, il sistema attiva l'allarme
di impegno simultaneo delle foto
ellule. L'Attività di gestione allarme segnala l'errore
ris
ontrato e attende la liberazione delle due foto
ellule o il reset della ma
hina (nel
aso dopo la ne del reset le foto
ellule risultino an
ora impegnate, s
atta nuovamente
l'allarme).
Se la foto
ellula1 risulta essere già stata impegnata prima della foto
ellula2 (siamo
nel
aso di entrata nella struttura), il sistema torna in fase di attesa segnalando l'ingresso
di un utente nella struttura. Figura:3.9. Nel
aso
ontrario, il sistema mantiene l'infor-
mazione di avvenuto impegno della foto
ellula2, segnalando
he un utente sta per us
ire
dalla struttura.
30
Capitolo 4
La Soluzione
#pragma on e
//:OPT_MOD_BEGIN
#in
lude "om
om.h"
//:OPT_MOD_END
#pragma pa
k (push)
#pragma pa
k (4)
Gli optmod in
lusi nel denition.h garantis
ono la possibilità di utilizzare funzioni spe
i-
he per la gestione di periferi
he ( in questo
aso la porta seriale) e l'utilizzo dei le.
31
Per essere utilizzati gli optmod devono essere stati installati pre
edentemente in modo
da ampliare il framework
on funzionalità aggiuntive.
Viene in
luso, insieme agli optmod, il le message.h,
he da modo di utilizzare i
messaggi di informazione visualizzabili sull'implementazione SIMU.
In seguito viene spe
i
ata la lista dei sinonimi o variabili globali utilizzate nel pro-
getto all'interno del le; segue questa sintassi:
//:RTPLC_SYNONYMDEF_BEGIN
__DEFINE ULONG statusSeriale ;
.
.
//:RTPLC_SYNONYMDEF_END
I sinonimi
he ho utilizzato nel progetto sono tutti volatili, quindi alla
hiusura dell'ap-
pli
azione (quando viene s
ari
ato il PLC) non rimangono in memoria. In quanto variabili
globali vengono usate per mantenere in memoria i risultati raggiunti dalle varie routine
e per renderli a
essibili a tutte le routine e funzioni, durante il tempo di ese
uzione.
La lista delle funzione denite nel progetto e il loro header si trova an
he essa nel le
denition.h:
//:RTPLC_EVENTDEF_BEGIN
void RTPLC_ROUTINE routineMain(LPVOID data);
.
.
//:RTPLC_EVENTDEF_END
//:RTPLC_PROXYFUNC_BEGIN
void __inline proxy_routine_allarme(ULONG type) {
RTPLC_VARIANT param[1℄;
param[0℄.vt = RTPLC_FORMAT_UINT32; param[0℄.value.ul = type;
invokeFun
(_T("routine_allarme"), param,1, NULL);
}
.
//:RTPLC_PROXYFUNC_END
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)
//: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
33
4.2 Funzionalità routine
RoutineInit:
//definition.
RTPLC_ONINIT(RTPLC_PRIORITY_NORMAL, routine_init)
È la routine prin
ipale strutturata in vari stati gestiti
on uno swit
h
omandato
da una variabile intera
he identi
a lo stato in
ui
i troviamo.
Alla prima iterazione, la routineMain manda in ese
uzione la lettura del data base,
ri
hiamando la funzione routine_leggiDB
he prepara la
a
he per l'autorizzazione
velo
e.
In seguito, la routine si o
upa di leggere la seriale ogni 100 iterazioni, ri
hiamando
la funzione routine_leggiSeriale, e
ontrollando ad ogni iterazione lo stato delle pe-
riferi
he. Questa routine è implementata, an
hé gestis
a ogni situazione basandosi
sui valori di ritorno delle periferi
he e dando la possibilità all'utente di interagire
direttamente tramite
ontrolli sull'interfa
ia.
//definition.
RTPLC_MAIN(RTPLC_PRIORITY_NORMAL, routine_main)
Viene
osì ri
onos
iuta dal Framework
ome routine prin
ipale del PLC (routine da
eseguire sempre ad ogni iterazione).
Routine_reset:
34
Ristabilis
e uno stato
onsistente del programma. Può essere usata dall'utente per
us
ire da uno stato di allarme della ma
hina o per azzerare tutte le variabili per
sua ne
essità.
//definition.
RTPLC_FUNCTION(routine_reset, routine_reset)
Routine_leggiDB:
Funzione di inizializzazione della
a
he del PLC strutturata in vari stati di ese
uzio-
ne gestiti da uno swit
h. Viene
hiamato dalla routineMain alla prima iterazione.
Cari
a le prime
inque righe dal le database.txt presente nella
artella usertar, e
vengono
ari
ate sulle variabili idX e nomeX di tipo RTPLC_VARIANT.
Nel
aso di reset della ma
hina non vengono annullati gli identi
ativi
ari
ati,
rimangono in memoria n quando il PLC rimane
ari
ato.
//definition.
RTPLC_FUNCTION(routine_leggiDB, routine_leggiDB)
Routine_leggiSeriale:
//definition.
RTPLC_FUNCTION(routine_leggiSeriale, routine_leggiSeriale)
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.
35
Routine_aggiornaDB:
//definition.
RTPLC_FUNCTION(routine_aggiornaDB, routine_aggiornaDB)
Routine_allarme:
Funzione di attuazione e gestione di tutti gli allarmi, viene
hiamata dalla rou-
tineMain non appena viene rilevato uno stato di allarme della ma
hina. Gli stati
interni della funzione identi
ano i vari allarmi
he la funzione può gestire.
Si o
upa di
omporre il messaggio da visualizzare sul monitor e di attendere lo
s
adere del timeout in
aso di us
ita automati
a da allarme.
//definition.
RTPLC_FUNCTION(routine_allarme, routine_allarme)
La struttura delle routine e delle funzioni segue uno s
hema di implementazione a stati
su
essivi propri di una ese
uzione su una ma
hina
on
apa
ità di elaborazione limitata.
L'RTPLC ULISSE, essendo basato su ARM9, impiegherebbe troppo tempo per eseguire
un
odi
e uni
o e
ontinuo
on molte elaborazioni interne.
La struttura a stati, assi
ura un'elaborazione velo
e di ogni stato e in totale l'ese-
uzione
ompleta di ogni operazione, an
he se sviluppata in più stati.
Nel progetto si possono distinguere due modelli di strutturazione utilizzati: il primo
modello, appli
ato sulle routine/funzioni
on istruzioni sempli
i, prevede l'utilizzo di un
solo stato in modo da essere eseguito una sola volta e svolgere la funzione ri
hiesta in una
sola iterazione. Il se
ondo modello, appli
ato a routine/funzioni
on istruzioni
omplesse,
utilizza una struttura modulare a più stati
onse
utivi, per le routine
he devono gestire
molte situazioni una dopo l'altra, o a stati indipendenti, per le routine
he mantengono
lo stesso stato ogni volta
he vengono ri
hiamate.
Appartengono al primo modello di implementazione la routineInit e le funzioni rou-
tine_reset e ruotine_allarme: entrambe hanno un'ese
uzione immediata e sempli
e. Nel
aso di blo
o di queste routine/funzioni non viene
ausata al
una perdita e lo stato
rimane
onsistente.
36
Appartengono al se
ondo modello le routine e funzioni,
he ri
hiedono l'elaborazione
di istruzioni
omplesse,
he ri
hiedono più stati per assi
urare l'elaborazione
orretta del-
l'istruzione. Questa loro strutturazione rende queste funzioni e routine non di ese
uzione
immediata per un pro
essore embedded. Con istruzioni
omplesse possiamo indi
are la
lettura di una porta seriale, l'a
esso ad un le, la
hiusura di un le, la s
rittura su più
variabili, operazioni
he ri
hiedono tempi hardware non
erti, e
he non possono essere
interrotte.
Ogni routine e funzione utilizza delle variabili numeri
he, per rappresentare lo stato
di ese
uzione in
ui si trova, gestite da uno swit
h
he implementa il passaggio allo stato
ri
hiesto dall'elaborazione.
La routineMain è
omposta da 5 stati
he gestis
ono i vari use
ase basandosi sui
valori assunti dalle periferi
he durante l'ese
uzione pre
edente. Non appena lo stato di
una periferi
a varia, la routine asso
ia alla propria variabile di stato il valore degli use
ase in
ui si trova, in modo da avviare la gestione del
aso d'uso all'iterazione su
essiva.
Nel
aso in
ui le variabili,
he identi
ano lo stato delle periferi
he, siano tutti ai valori
di inizializzazione, si rimane sempre sullo stato 0 (stato di attesa della routineMain).
Si notano, all'interno dell'insieme delle routine/funzioni a più stati, distinzioni
he
reano due eettivi sottotipi di routine/funzioni: quelle a stati
onse
utivi, e quelle a stati
non
onse
utivi. Le prime sono routine
he ri
hiedono l'ese
uzione di tutti( o quasi) gli
stati in ordine
res
ente per far si
he l'operazione ri
hiesta venga eseguita interamente e
orrettamente; le se
onde non ne
essitano di un'ese
uzione in un qual
he ordine stabilito,
da momento
he il passaggio di stato, essendo dovuto a situazioni ambientali, non può
essere predi
ibile.
Le funzioni routine_leggiDB routine_leggiSeriale e routine_aggiornaDB sono rou-
tine/funzioni a stati
onse
utivi, poi
hé è ne
essario eseguirli tutti in un ordine presta-
bilito per essere si
uri
he il sistema esegua
orrettamente la funzione.
Per gestire l'ese
uzione di funzioni a stati
onse
utivi, è ne
essario utilizzare degli a
or-
gimenti
he assi
urino l'ese
uzione della funzione no al termine eettivo dell'operazione
ri
hiesta. In questo modo è garantita la stabilità del sistema e la
orrettezza degli a
essi
a le e a porte seriali.
Le funzioni a stati
onse
utivi ritornano un valore di elaborazione
he indi
a alla
routine
hiamante, se la funzione ha terminato la sua ese
uzione, o se ne
essiti di ulteriori
iterazioni per
on
ludersi. Gli stessi a
orgimenti vengono utilizzati per l'ese
uzione di
operazioni
omplesse
he ne
essitano più iterazioni (quindi mantenendo la funzione sullo
stesso stato) per essere eseguite.
La routine
he ri
hiama l'ese
uzione della funzione, a se
onda se è una funzione a
stati
omplessa o una funzione a un solo stato, si preo
upa di
ontrollare
he la funzione
venga eseguita
on su
esso no al termine.
Nel
aso di ese
uzione di funzioni a più stati ed operazioni
omplesse, quindi non
eseguibili in una sola iterazione, è stato utilizzato un
ontrollo sulla variabile di ritorno
della funzione interessata. Si utilizza 1 per indi
are
he la funzione non è an
ora terminata
37
0 per indi
are
he è stata terminata
on su
esso. Possiamo vederlo nella routineMain
nel
hiamare la funzione routine_leggiDB:
proxy_routine_allarme(type);
38
Capitolo 5
Implementazione
39
reazione di loop dispendiosi per la ma
hina e
he potessero rallentare l'ese
uzione del-
l'appli azione. Ho reato le variabili lo ali all'interno dei blo hi di interesse, osì he la
memoria venga ripulita dalle variabili non globali, ad ogni us ita di blo o, e le variabili
non vengano reate, se non devono essere si uramente utilizzate dall'appli azione.
Il progetto, basandosi sul passaggio di stato delle periferi he, gestis e un ontrollo per
La gestione dei ontrolli sulle periferi he (tranne la porta seriale) è interamente svilup-
pata nella routineMain, i ontrolli sono rappresentati mediante variabili di stato per di-
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
viene spenta; lo utilizzo per ontrollare he la foto ellula non sia guasta;
Grazie a queste variabili sono distinte le situazioni rilevate dalle foto ellule:
avvenute on l'utente, in quel momento, e s eglie ome gestirle. La gestione del ontrollo
della porta seriale, viene eseguita dalla funzione routine_leggiSeriale utilizzando l'opt-
Il risultato della gestione della periferi a, da parte della funzione, viene segnalato alla
false altrimenti).
40
Capitolo 6
Manuale
Il sistema deve
ontrollare l'a
esso e l'us
ita del personale autorizzato dal magazzino,
segnalare eventuali a
essi non autorizzati e possibili guasti alle periferi
he.
Questo manuale vuole indi
are all'utente, utilizzatore dell'appli
azione,
ome intera-
gire
on il sistema di
ontrollo a
essi, utilizzando l'interfa
ia utente fornita.
41
6.2 Presentazione interfa
ia
42
Figura 6.1: S
hermata inziale
43
Figura 6.3: S
hermata man
ato passaggio
Attesa passaggio:
Nel
aso s
atti il timeout senza la rilevazione dell'impegno della foto
ellula 1 da
parte dell'utente, il sistema avverte, tramite interfa
ia, del man
ato a
esso e
eettua il reset della variabile di autenti
azione (Figura:6.3).
Quando questa s
hermata viene visualizzata non è piu' possibile eettuare il pas-
saggio.
Nel
aso l'utente impegni la foto
ellula 1, il sistema si pone in attesa sulla foto
ellula
2 per registrare l'eettivo passaggio (Figure:6.4, 6.5).
Il nome dell'utente
he si è autenti
ato viene visualizzato in una delle
elle della
lista dei presenti.
Us
ita dalla struttura:
44
Figura 6.5: S
hermata passaggio eettuato
45
Figura 6.7: S
hermata di reset
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:
46
Figura 6.9: S
hermata allarme impegno simultaneo delle foto
ellule
Figura 6.10: S hermata allarme Foto ellula2 guasta(o impegnata da troppo tempo)
larme per eventuali guasti alle foto
ellule (Figure:6.9 e 6.10) viene attivato dal sis-
tema, si disabilita automati
amente dopo il disimpegno delle foto
ellule o premendo
il tasto di reset.
L'allarme di man
ata autenti
azione (Figura:6.11) viene disabilitato mediante la
lettura di un tag autorizzato. Nel
aso venga premuto il tasto di reset, l'interfa
ia
visualizza il messaggio di non a
ettazione del
omando (Figura:6.12).
47
Figura 6.11: S
hermata allarme man
ata autenti
azione
48
Capitolo 7
Con
lusioni e sviluppi futuri
49
Appendi
e A
Codi
e
A.1 denition.h:
#pragma on
e
#in
lude
// :OPT_MOD_BEGIN
"om
om . h"
// :OPT_MOD_END
#pragma pa
k ( push )
#pragma pa
k ( 4 )
// :RTPLC_STRUCT_BEGIN
// :RTPLC_STRUCT_END
// :RTPLC_SYNONYMDEF_BEGIN
__DEFINE ULONG s t a t u s M a i n ; // v a r i a b i l e d i s t a t o d e l l a r o u t i n e M a i n
__DEFINE ULONG s t a t u s S e r i a l e ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e l e g g i S e r i a l e
__DEFINE ULONG statusLeggiDB ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e l e g g i D B
__DEFINE ULONG statusAggiornaDB ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e a g g i o r n a D B
__DEFINE ULONG timerT ; // t i m e r s e r i a l e
__DEFINE RTPLC_BIT f o t o 1 ; // v a r i a b i l e p e r i f e r i
a f o t o
e l l u l a 1
__DEFINE RTPLC_BIT f o t o 2 ; // v a r i a b i l e p e r i f e r i
a f o t o
e l l u l a 2
__DEFINE RTPLC_BIT sear
hDB ; // v a r i a b i l e d i a u t o r i z z a z i o n e
__DEFINE ULONG s t a t u s A l l a r m e ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e a l l a r m e
__DEFINE ULONG type ; // t i p o a l l a r m e
__DEFINE ULONG t i m e r A l ; // t i m e o u t a l l a r m e
__DEFINE RTPLC_BIT a l l a r m e ; // b o o l e a n a d i
o n t r o l l o a l l a r m e
__DEFINE RTPLC_BIT l u
e V e r d e ; // l e d m a
h i n a a t t e s a
__DEFINE RTPLC_BIT l u
e R o s s a ; // l e d m a
h i n a i n
a r i
a m e n t o / a l l a r m e
__DEFINE UCHAR t x B u f f e r [ 9 ℄ ; // b u f f e r d e l l a v a r i a b i l e d i domanda a l l a s e r i a l e
__DEFINE UCHAR r x B u f f e r [ 2 0 ℄ ; // b u f f e r d e l l a v a r i a b i l e d i r i s p o s t a d a l l a s e r i a l e
__DEFINE RTPLC_BIT isOn1 ; // v a r i a b i l e d i
o n t r o l l o a t t i v a z i o n e f o t o
e l l u l a 1 ( p a s s a t a )
__DEFINE RTPLC_BIT isOn2 ; // v a r i a b i l e d i
o n t r o l l o a t t i v a z i o n e f o t o
e l l u l a 2 ( p a s s a t a )
__DEFINE ULONG g f o t o 1 ; // v a r i a b i l e d i
o n t r o l l o f u n z i o n a m e n t o f o t o
e l l u l a 1
__DEFINE ULONG g f o t o 2 ; // v a r i a b i l e d i
o n t r o l l o f u n z i o n a m e n t o f o t o
e l l u l a 2
__DEFINE ULONG rxLen ; // l u n g h e z z a r i s p o s t a d e l l a s e r i a l e
__DEFINE ULONG f i l e _ h a n d l e [ 1 0 ℄ ; // h a n d l e r d e l f i l e
__DEFINE ULONG i [ 5 ℄ ; // u t i l i z z o p o s i z i o n e
a
h e
__DEFINE ULONG i n i z i o ; // v a r i a b i l e d i
o n t r o l l o p r i m a i t e r a z i o n e
__DEFINE ULONG nId ; // p r i m a p o s i z i o n e l i b e r a d e l l a
a
h e
__DEFINE RTPLC_VARIANT R_openmode ; // m o d a l i t a ' a p e r t u r a f i l e
__DEFINE RTPLC_VARIANT f i l e n a m e ; //nome d e l f i l e da a p r i r e / l e g g e r e
50
__DEFINE ULONG t i m e r S o s t a ; // t i m e r d i s o s t a d i f r o n t e a l l e f o t o
e l l u l e
__DEFINE RTPLC_BIT r e s e t ; // v a r i a b i l e d i
o n t r o l l o p e r i l r e s e t
__DEFINE RTPLC_VARIANT output ; // o u t p u t da v i s u a l i z z a r e
__DEFINE ULONG timerA ; // t i m e o u t A l l a r m e
__DEFINE RTPLC_DAYTIME O r o l o g i o ; // v a r i a b i l e o r o l o g i o
__DEFINE SHORT Ora ;
__DEFINE SHORT Minuti ;
__DEFINE SHORT s e
o n d i ;
__DEFINE RTPLC_VARIANT i d 1 ; //
o d e p r i m o i d e n t i f i
a t i v o d e l l a
a
h e
__DEFINE RTPLC_VARIANT i d 2 ; //
o d e s e
o n d o i d e n t i f i
a t i v o d e l l a
a
h e
__DEFINE RTPLC_VARIANT i d 3 ; //
o d e t e r z o i d e n t i f i
a t i v o d e l l a
a
h e
__DEFINE RTPLC_VARIANT i d 4 ; //
o d e q u a r t o i d e n t i f i
a t i v o d e l l a
a
h e
__DEFINE RTPLC_VARIANT i d 5 ; //
o d e q u i n t o i d e n t i f i
a t i v o d e l l a
a
h e
__DEFINE RTPLC_VARIANT nome1 ; // p r i m o nome u t e n t e d e l l a
a
h e
__DEFINE RTPLC_VARIANT nome2 ; // s e
o n d o nome u t e n t e d e l l a
a
h e
__DEFINE RTPLC_VARIANT nome3 ; // t e r z o nome u t e n t e d e l l a
a
h e
__DEFINE RTPLC_VARIANT nome4 ; // q u a r t o nome u t e n t e d e l l a
a
h e
__DEFINE RTPLC_VARIANT nome5 ; // q u i n t o nome u t e n t e d e l l a
a
h e
__DEFINE RTPLC_VARIANT idN ; //
o d e i d e n t i f i
a t i v o r i m p i a z z a m e n t o
__DEFINE RTPLC_VARIANT nomeN ; //nome u t e n t e r i m p i a z z a m e n t o
__DEFINE ULONG k ; // v a r a p p o g g i o
__DEFINE ULONG j ; // v a r a p p o g g i o
__DEFINE ULONG e ; // v a r a p p o g g i o
__DEFINE RTPLC_VARIANT s r x B u f f e r ; // s t r i n g a d i r i s p o s t a d e l l a s e r i a l e
__DEFINE ULONG V i s u a l i z z a ;
__DEFINE RTPLC_VARIANT p r e s e n t i 1 ; // p r i m o nome l i s t a p r e s e n t i
__DEFINE RTPLC_VARIANT p r e s e n t i 2 ; // s e o
n d o nome l i s t a p r e s e n t i
__DEFINE RTPLC_VARIANT p r e s e n t i 3 ; // t e r z o nome l i s t a p r e s e n t i
__DEFINE RTPLC_VARIANT p r e s e n t i 4 ; // q u a r t o nome l i s t a p r e s e n t i
__DEFINE RTPLC_VARIANT p r e s e n t i 5 ; // q u i n t o nome l i s t a p r e s e n t i
__DEFINE RTPLC_BIT i s A l 1 ; // l ' a l l a r m e man
ata a u t o r i z z a z i o n e e ' i n s e r i t o
__DEFINE RTPLC_BIT
o n t r o l l a ; // v a r i a b i l e p e r i l
o n t r o l l o d i u s
i t a
__DEFINE RTPLC_BIT u s
i t o ; // v a r i a b i l e d i u s
i t a
__DEFINE ULONG s t a t u s C o n t r o l l o U ; // v a r i a b i l e d i s t a t o d e l l a f u n z i o n e
o n t r o l l o U s
i t a
__DEFINE ULONG s ;
__DEFINE RTPLC_VARIANT uUs
ente ; //nome u t e n t e u s
e n t e
__DEFINE RTPLC_BIT f a t t o ; // v a r i a b i l e
o n t r o l l o u s
i t a
__DEFINE LONG r e s 5 ; // r i t o r n o f u n z i o n i
o m p l e s s e
// :RTPLC_SYNONYMDEF_END
__DEFINE RTPLC_VARIANT returnparam ;
void RTPLC_ROUTINE
// :RTPLC_EVENTDEF_BEGIN
routine_main (LPVOID data ) ;
void RTPLC_ROUTINE r o u t i n e _ i n i t (LPVOID data ) ;
void RTPLC_ROUTINE t i m e r (LPVOID data ) ;
void RTPLC_ROUTINE r o u t i n e _ a l l a r m e (PRTPLC_FUNCTION_INPUT i n p u t ) ;
void RTPLC_ROUTINE r o u t i n e _ l e g g i D B (PRTPLC_FUNCTION_INPUT i n p u t ) ;
void RTPLC_ROUTINE r o u t i n e _ l e g g i S e r i a l e (PRTPLC_FUNCTION_INPUT i n p u t ) ;
void RTPLC_ROUTINE r o u t i n e _ r e s e t (PRTPLC_FUNCTION_INPUT i n p u t ) ;
void RTPLC_ROUTINE r o u t i n e _
o n t r o l U s
i t o (PRTPLC_FUNCTION_INPUT i n p u t ) ;
void RTPLC_ROUTINE routine_aggiornaDB (PRTPLC_FUNCTION_INPUT i n p u t ) ;
void RTPLC_ROUTINE
// :RTPLC_EVENTDEF_END
r o u t i n e M a i n (LPVOID data ) ;
void RTPLC_ROUTINE r o u t i n e I n i t (LPVOID data ) ;
void
// :RTPLC_PROXYFUNC_BEGIN
__inline p ro x y _ro u tin e_a lla rme (ULONG type ) {
RTPLC_VARIANT param [ 1 ℄ ;
param [ 0 ℄ . vt = RTPLC_FORMAT_UINT32; param [ 0 ℄ . v a l u e . u l = type ;
invokeFun
(_T( " r o u t i n e _ a l l a r m e " ) , param , 1 , NULL) ;
}
51
ULONG __inline proxy_routine_leggiDB ( ) {
RTPLC_VARIANT r e t v a l ;
invokeFun
(_T( " r o u t i n e _ l e g g i D B " ) , NULL, 0 , &r e t v a l ) ;
return
r e t v a l . value . ul ;
}
ULONG __inline p r o x y _ r o u t i n e _ l e g g i S e r i a l e ( ) {
RTPLC_VARIANT r e t v a l ;
invokeFun
(_T( " r o u t i n e _ l e g g i S e r i a l e " ) , NULL, 0 , &r e t v a l ) ;
return
r e t v a l . value . ul ;
}
void __inline p r o x y _ r o u t i n e _ r e s e t ( ) {
invokeFun
(_T( " r o u t i n e _ r e s e t " ) , NULL, 0 , NULL) ;
}
ULONG __inline p r o x y _ r o u t i n e _
o n t r o l U s
i t o ( ) {
RTPLC_VARIANT r e t v a l ;
invokeFun
(_T( " r o u t i n e _
o n t r o l U s
i t o " ) , NULL, 0 , &r e t v a l ) ;
return
r e t v a l . value . ul ;
}
ULONG __inline proxy_routine_aggiornaDB ( ) {
RTPLC_VARIANT r e t v a l ;
invokeFun
(_T( " routine_aggiornaDB " ) , NULL, 0 , &r e t v a l ) ;
return
r e t v a l . value . ul ;
}
// :RTPLC_PROXYFUNC_END
#pragma pa k ( pop )
A.2 denition.
:
#define RTPLC_ALLOC
#define _INTERNAL_GENERATION
#in
lude " r t p l
. h"
#in
lude " d e f i n i t i o n s . h"
// :RTPLC_FUNCTION_IO_BEGIN
RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ a l l a r m e )
RTPLC_FUNCTION_PARAM( type , RTPLC_FORMAT_UINT32)
RTPLC_FUNCTION_IO_END( r o u t i n e _ a l l a r m e ,RTPLC_FORMAT_VOID)
RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ l e g g i D B )
RTPLC_FUNCTION_IO_END( routine_leggiDB ,RTPLC_FORMAT_UINT32)
RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ l e g g i S e r i a l e )
RTPLC_FUNCTION_IO_END( r o u t i n e _ l e g g i S e r i a l e ,RTPLC_FORMAT_UINT32)
RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _ r e s e t )
RTPLC_FUNCTION_IO_END( r o u t i n e _ r e s e t ,RTPLC_FORMAT_VOID)
RTPLC_FUNCTION_IO_BEGIN( r o u t i n e _
o n t r o l U s
i t o )
RTPLC_FUNCTION_IO_END( r o u t i n e _
o n t r o l U s
i t o ,RTPLC_FORMAT_UINT32)
RTPLC_FUNCTION_IO_BEGIN( routine_aggiornaDB )
RTPLC_FUNCTION_IO_END( routine_aggiornaDB ,RTPLC_FORMAT_UINT32)
// :RTPLC_FUNCTION_IO_END
RTPLC_ROUTINE_BEGIN( )
// :RTPLC_ROUTINE_BEGIN
RTPLC_MAIN(RTPLC_PRIORITY_NORMAL, routine_main )
RTPLC_ONINIT(RTPLC_PRIORITY_NORMAL, r o u t i n e _ i n i t )
52
RTPLC_ONTIMER(RTPLC_PRIORITY_NORMAL, t i m e r )
RTPLC_FUNCTION( r o u t i n e _ a l l a r m e , r o u t i n e _ a l l a r m e )
RTPLC_FUNCTION( routine_leggiDB , r o u t i n e _ l e g g i D B )
RTPLC_FUNCTION( r o u t i n e _ l e g g i S e r i a l e , r o u t i n e _ l e g g i S e r i a l e )
RTPLC_FUNCTION( r o u t i n e _ r e s e t , r o u t i n e _ r e s e t )
RTPLC_FUNCTION( r o u t i n e _
o n t r o l U s
i t o , r o u t i n e _
o n t r o l U s
i t o )
RTPLC_FUNCTION( routine_aggiornaDB , routine_aggiornaDB )
// :RTPLC_ROUTINE_END
RTPLC_ROUTINE_END( )
RTPLC_STRUCTDESCRIPTION_BEGIN( )
// : RTPLC_STRUCTDESCRIPTION_BEGIN
// :RTPLC_STRUCTDESCRIPTION_END
RTPLC_STRUCTDESCRIPTION_END( )
RTPLC_SYNEVT_LINK_BEGIN_DEFAULT( t i m e r )
// :RTPLC_SYNEVT_LINK_BEGIN
// :RTPLC_SYNEVT_LINK_END
RTPLC_SYNEVT_LINK_END( )
RTPLC_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
A.3 routineMain. :
#define _INTERNAL_GENERATION
#in
lude " r t p l
. h"
#in
lude "om
om . h"
#in
lude " d e f i n i t i o n s . h"
/∗ R o u t i n e di gestione dell ' appli
azione
/gestita
ome main dal framework
/si o
upa del
ontrollo di tutti i
asi d ' uso gestiti dal progetto ∗/
// a g g i o r n a m e n t o varaibili globali
Ora=O r o l o g i o . hour ;
Minuti=O r o l o g i o . min ;
s e
o n d i=O r o l o g i o . s e
;
output . vt=RTPLC_FORMAT_STRING;
54
// i n i z i a l i z z a z i o n e variabili lo
ali
a p p o g g i o . vt=RTPLC_FORMAT_STRING;
format . s i z e =6;
a p p o g g i o . v a l u e . s t r i n g . s i z e =200;
format . s z=" ∗∗%s ∗∗ \n %s \n" ;
l u
e V e r d e=RTPLC_TRUE;
l u
e R o s s a=RTPLC_FALSE;
if ( r e s e t==RTPLC_TRUE)
// i n
aso venga ri
hiesto il reset della ma
hina
{
if ( ( type==1) | | ( i s A l 1==RTPLC_TRUE) )
{
// e ' stato ri
hiesto il reset durante un allarme di man
ata autorizzazione
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗NON E ' POSSIBILE EFFETTUARE IL RESET ∗∗ \ n
∗∗UTENTE NON AUTORIZZATO E ' ENTRATO NELLA STRUTTURA∗∗ \ n" ;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r e s e t=RTPLC_FALSE;
type =1;
sleep (2000) ;
}
else
{
// a t t i v a z i o n e reset
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗RESET IN CORSO∗∗ \n" ;
l u
e V e r d e=RTPLC_FALSE;
l u
e R o s s a=RTPLC_TRUE;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
proxy_routine_reset ( n u l l ) ;
r e s e t=RTPLC_FALSE;
}
}
else
{
if ( a l l a r m e ==0)
// v a r i a b i l e di stato status_main
{
if ( i n i z i o ==1)
// p r i m a iterazione devo inizializzare la
a
he
// L e t t u r a file e
ari
amento identifi
ativi ( ok )
{
r e t=proxy_routine_leggiDB ( ) ;
if ( r e t ==0)
// 1 . lettura DB effettuata
on su
esso
i n i z i o =0;
else
if ( r e t==OMCS_WAIT)
// 2 . lettura DB i n ese
uzione
i n i z i o =1;
else
if ( r e t <−1)
// 3 . lettura DB errore
{
type =3;
a l l a r m ( (USHORT) AL_SCOLLEGATO) ;
p ro x y _ro u tin e_a lla rme ( type ) ;
}
}
else
{
if ( f o t o 1
// 0 .
ontrollo se entrambe le foto
ellule sono a
ese
ontemporanemente ( ok )
== RTPLC_TRUE && f o t o 2 == RTPLC_TRUE)
{
a p p o g g i o . v a l u e . s t r i n g . s z="~ S e g n a l i d e l l e f o t o
e l l u l e s i m u l t a n e i ~\n" ;
a l l a r m ( (USHORT) AL_SIMULTANEE) ;
isOn1 =1;
isOn2 =1;
r t p l
t r a
e ( 1 ,_T( "~ S e g n a l i d e l l e f o t o
e l l u l e s i m u l t a n e i ~\n" ) ) ;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
type =2;
55
timerT =0;
// a t t i v o l ' allarme
// ri
hiamo la routine di allarme per la simultaneita ' dei segnali
p ro x y _ro u tin e_a lla rme ( type ) ;
}
else
{
swit
h ( s t a t u s M a i n )
{
ase 0 :
{
// stato di attesa o quietes
enza
//da questo stato vengono
o n t r o l l a t e t u t t e l e v a r i a b i l i d e l l e p e r i f e r i
h e
RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g .
s i z e =100;
// funzione per la l e t t u r a d e l l a s e r i a l e
// se i l timer e ' 100 devo leggere la s e r i a l e
if ( ( timerT == 1 0 0 ) | | ( u s
i t o==RTPLC_TRUE) )
{
// ri
hiamo la routine di l e t t u r a d e l l a s e r i a l e
r i t o r n o S=p r o x y _ r o u t i n e _ l e g g i S e r i a l e ( ) ;
if ( r i t o r n o S ==1)
{
break ;
}
else
{
timerT =0;
if ( ( u s
i t o==RTPLC_TRUE)&&(sear
hDB==RTPLC_TRUE) )
{
sear
hDB=RTPLC_FALSE;
o n t r o l l a=RTPLC_TRUE;
}
u s
i t o=RTPLC_FALSE;
}
}
else
timerT++;
//
ontrollo l e f o t o
e l l u l e
// 1. f o t o
e l l u l a 1 true
if ( f o t o 1 == RTPLC_TRUE)
{
s t a t u s M a i n =1;
g f o t o 1=g f o t o 1 +1;
//
ontrollo f u n z i o n a l i t a ' f o t o
e l l u l a 1
if ( g f o t o 1 ==1000)
{
output1 . v a l u e . s t r i n g . s z="~ P o s s i b i l e g u a s t o a l l a f o t o
e l l u l a 1 ~\n" ;
s r
p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
type =4;
a l l a r m ( (USHORT) AL_FOTO1) ;
56
p ro x y _ro u tin e_a lla rme ( type ) ;
break ;
}
break ;
}
// 2. f o t o
e l l u l a 2 true / f a l s e
if ( f o t o 2 == RTPLC_TRUE)
{
g f o t o 2=g f o t o 2 +1;
statusMain = 3 ;
//
ontrollo f u n z i o n a l i t a ' f o t o
e l l u l a 2
if ( g f o t o 2 ==1000)
{
// la f o t o
e l l u l a
output1 . v a l u e . s t r i n g . s z="~ P o s s i b i l e g u a s t o a l l a f o t o
e l l u l a 2 ~\n" ;
s r
p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
type =5;
a l l a r m ( (USHORT) AL_FOTO2) ;
p ro x y _ro u tin e_a lla rme ( type ) ;
break ;
}
break ;
}
else
// r e s e t t o l e v a r i a b i l i di
ontrollo d e l l a f o t o
e l l u l a 2
g f o t o 2 =0;
// 3. f o t o
e l l u l a 1 f a l s e
if ( f o t o 1 == RTPLC_FALSE)
{
g f o t o 1 =0;
s t a t u s M a i n =2;
t i m e r S o s t a =0;
break ;
}
break ;
}
ase 1:
{
RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g .
s i z e =100;
r t p l
t r a
e ( 1 ,_T( " Booleana d i a u t o r i z z a z i o n e %
\n" ) , sear
hDB ) ;
// 1. foto1=1 && sear
hDB=1
if ( sear
hDB == RTPLC_TRUE)
{
output1 . v a l u e . s t r i n g . s z=" \n ∗∗ Utente A u t o r i z z a t o ∗∗ \0 " ;
s r
p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( " S t r i n g a da v i s u a l i z z a r e %s numero i d e n t i f i
a t i v i \n" ) ,
output . v a l u e . s t r i n g . s z ) ;
isOn1 =1;
s t a t u s M a i n =0;
sear
hDB =0;
l u
e V e r d e=RTPLC_TRUE;
l u
e R o s s a=RTPLC_FALSE;
break ;
}
else
// 2. foto1=1 && sear
hDB=0 && isOn2==0
if ( sear
hDB == RTPLC_FALSE)
{
if ( isOn2==0)
{
output1 . v a l u e . s t r i n g . s z="~Utente non A u t o r i z z a t o ! ~ \ n" ;
s r
p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( " S t r i n g a da v i s u a l i z z a r e %s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
a l l a r m ( (USHORT) AL_INTRUSO) ;
type =1;
timerT =0;
57
p ro x y _ro u tin e_a lla rme ( type ) ; // ri
hiamo la routine di allarme per la man
ata
autorizzazione
break ;
}
else
{
s t a t u s M a i n =0;
output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente U s
i t o ∗∗ \ n" ;
s r
p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
isOn2 =0;
sleep (4000) ;
u s
i t o=RTPLC_TRUE;
messagp ( (USHORT)M_USCITA) ;
l u
e V e r d e=RTPLC_TRUE;
l u
e R o s s a=RTPLC_FALSE;
if ( t i m e r S o s t a ==80)
r t p l
t r a
e ( 1 ,_T( "L ' u t e n t e s i e ' f e r m a t o d i f r o n t e a l l a f o t o
e l l u l a \n" ) ) ;
else
t i m e r S o s t a=t i m e r S o s t a +1;
break ;
}
}
}
ase 2:
{
RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g .
s i z e =100;
// 1. foto1=0 && sear
hDB=1
if ( sear
hDB == RTPLC_TRUE)
{
s t a t u s M a i n = 4 ; // stato attesa passaggio utente
output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente A u t o r i z z a t o , a t t e s a p a s s a g g i o ∗∗ \n" ;
s r
p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
l u
e V e r d e=RTPLC_TRUE;
l u
e R o s s a=RTPLC_FALSE;
break ;
}
// 2. foto1=0 && sear
hDB=0
else
{
statusMain = 0 ;
break ;
}
}
ase 3:
{
RTPLC_VARIANT output1 ; output1 . vt=RTPLC_FORMAT_STRING; output1 . v a l u e . s t r i n g .
s i z e =100;
if ( isOn1==1)
{ // 1. foto2=1 && isOn1 == 1
output1 . v a l u e . s t r i n g . s z=" ∗∗ Utente e n t r a t o ∗∗ \n" ;
s r
p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( " output : %s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
messagp ( (USHORT)M_ENTRATA) ;
if ( k==6)
{
k=1; // r i i n i z i a a riempire d a l l ' i n i z i o d e l l a l i s t a
s =5;
}
else
if ( s !=5)
s=k ;
swit
h ( nId )
{
58
// inseris
o g l i i d e n t i f i
a t i v i n e l l a l i s t a presenti
ase 1 :
swit
h ( k )
{
ase 1 : s r
p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r
p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r
p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r
p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r
p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome1 . v a l u e . s t r i n g ) ; break ;
default : break ;
}
break ;
ase 2 :
swit
h ( k )
{
ase 1 : s r
p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r
p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r
p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r
p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r
p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome2 . v a l u e . s t r i n g ) ; break ;
default : break ;
}
break ;
ase 3 :
swit
h ( k )
{
ase 1 : s r
p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r
p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r
p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r
p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r
p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome3 . v a l u e . s t r i n g ) ; break ;
default : break ;
}
break ;
ase 4 :
swit
h ( k )
{
ase 1 : s r
p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r
p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r
p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r
p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r
p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome4 . v a l u e . s t r i n g ) ; break ;
default : break ;
}
break ;
ase 5 :
swit
h ( k )
{
ase 1 : s r
p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
ase 2 : s r
p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
ase 3 : s r
p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
ase 4 : s r
p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
ase 5 : s r
p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,&nome5 . v a l u e . s t r i n g ) ; break ;
default : break ;
}
break ;
default : break ;
}
s t a t u s M a i n =0;
isOn1 =0;
nId =0;
sear
hDB =0;
sleep (4000) ;
break ;
}
else
{ // 2. foto2=1 && isOn1=0
output1 . v a l u e . s t r i n g . s z=" ∗∗ U s
i t a u t e n t e ∗∗ \ n" ;
59
s r
p y (& output . v a l u e . s t r i n g ,& output1 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
s t a t u s M a i n =0;
isOn2 =1;
l u
e V e r d e=RTPLC_TRUE;
l u
e R o s s a=RTPLC_FALSE;
break ;
}
}
ase 4:
//Utente r i l e v a t o attesa passaggio utente
// 1. S
atta i l timeout , autenti
azione annullata
if ( ( timerA == 3 0 0 ) && ( f o t o 1 == RTPLC_FALSE ) )
{
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗ P a s s a g g i o non e f f e t t u a t o ∗∗ \ n" ;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
statusMain = 0 ;
nId =0;
timerA =0;
k −−;
sear
hDB = RTPLC_FALSE ;
l u
e R o s s a=RTPLC_TRUE;
l u
e V e r d e=RTPLC_FALSE;
break ;
}
// 2. Passaggio rilevato , timerA r e i n i z i a l i z z a t o
if ( f o t o 1 == RTPLC_TRUE)
{
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗ P a s s a g g i o e f f e t t u a t o ∗∗ \n" ;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ; //ok
timerA = 0 ;
s t a t u s M a i n =0;
sear
hDB = RTPLC_FALSE;
isOn1 =1;
sleep (3000) ;
l u
e V e r d e=RTPLC_TRUE;
l u
e R o s s a=RTPLC_FALSE;
break ;
}
// 3. Passaggio non rilevato , timerA in
rementato
if ( f o t o 1==RTPLC_FALSE )
{
timerA=timerA +1;
break ;
}
default :
break ;
}
}
}
}
else
{
p ro x y _ro u tin e_a lla rme ( type ) ;
}
}
}
A.4 routineInit. :
#define _INTERNAL_GENERATION
#define DATABASE " dataBase . t x t "
60
void RTPLC_ROUTINE
/∗ r o u t i n e di inizializzazione di variabili ∗/
r o u t i n e _ i n i t (LPVOID n u l l ) {
// i n i z i a l i z z a z i o n e variabili globali
// 0 . inizializzazione segnalatori lavoro
l u
e V e r d e=RTPLC_TRUE;
l u
e R o s s a=RTPLC_FALSE;
// 3 . inizializzazione variabili
type =0; // t i p o a l l a r m e a z i o n a t o
rxLen =0; // l u n g h e z z a b u f f e r s e r i a l e
g f o t o 1 =0; //
o n t r o l l o r e g u a s t i f o t o
e l l u l a 1
g f o t o 2 =0; //
o n t r o l l o r e g u a s t i f o t o
e l l u l a 2
i n i z i o =1; // v a r i a b i l e d i
o n d i z i o n a m e n t o p e r l ' e s e
u z i o n e d e l l a lettura filedatabase
nId =1; // numero d e l l a p o s i z i o n e i n p r e s e n t i d o v e i n s e r i r e il prossimo
k=0; // numero p r e s e n t i
j =0; // v a r i a b i l e d ' a p p o g g i o p e r l ' i n t e r f a
i a
s =0;
e =1; // v a r i a b i l e p e r l ' i n s e r i m e n t o n u o v i e l e m e n t i n e l d b
memset ( i , 0 , 5 ) ;
A.5 routine_allarme. :
#define _INTERNAL_GENERATION
#in
lude " r t p l
. h"
#in
lude " d e f i n i t i o n s . h"
void s t u b _ r o u t i n e _ a l l a r m e (ULONG type ) ;
// : FUNCTION_BEGIN
61
// :FUNCTION_END
// :STUB_IMPLEMENTATION
/∗ R o u t i n e di gestione attivazione allarme .
/ param type numero di stato d e l l ' allarme attivato
/ ogni stato rappresenta un allarme diverso il numero passato per argomento
void
/ indi
a l ' allarme da attivare ∗/
s t u b _ r o u t i n e _ a l l a r m e (ULONG type ) {
ULONG r i t o r n o S e r i a l e ;
s t a t u s A l l a r m e = type ;
a l l a r m e = RTPLC_TRUE;
l u
e V e r d e=RTPLC_FALSE;
l u
e R o s s a=RTPLC_TRUE;
swit
h ( s t a t u s A l l a r m e )
{
ase 1 :
{
// a l l a r m e utente non autorizzato
RTPLC_VARIANT a p p o g g i o ;
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45;
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE UTENTE NON AUTORIZZATO∗∗∗∗∗∗∗∗ \ n\0 " ;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
i s A l 1=RTPLC_TRUE;
// ogni 10 iterazioni
ontrolla se un utente autorizzato si e ' identifi
ato sul
if
lettore Rfid
( timerT==10)
{
ritornoSeriale = proxy_routine_leggiSeriale () ;
if ( r i t o r n o S e r i a l e
// r i
h i a m a la funzione leggiSeriale
== 1 )
{
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45;
a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i
a z i o n e non e f f e t t u a t a , \ n l e t t u r a s e r i a l e i n
o r s o \n" ;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
break ;
}
else
{
timerT =0;
if( sear
hDB == RTPLC_TRUE)
{
// l ' u t e n t e si e ' autentifi
ato l ' allarme viene disinserito
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45;
a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i
a z i o n e e f f e t t u a t a , \ n u s
i t a s t a t o d i a l l a r m e \
n" ;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
a l l a r m e = RTPLC_FALSE; // i n d i
a t o r e d i s t a t o d i a l l a r m e d i s a b i l i t a t o
sear
hDB = RTPLC_FALSE; // r e s e t r i
e r
a
i s A l 1 = RTPLC_FALSE;
type = 0 ; // r e s e t t y p e d e l l ' e r r o r e
a l l a r m ( (USHORT) 0 ) ;
s t a t u s M a i n =0;
break ;
}
}
}
else
{
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =45;
a p p o g g i o . v a l u e . s t r i n g . s z=" A u t e n t i f i
a z i o n e non e f f e t t u a t a , \ n a t t e s a a u t e n t i f i
a z i o n e
\n" ;
62
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
timerT=timerT +1;
}
break ;
}
ase 2 :
{
// A l l a r m e segnali foto
ellule simultanei
RTPLC_VARIANT a p p o g g i o ;
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100;
a p p o g g i o . v a l u e . s t r i n g . s z=" ∗∗∗∗∗∗∗∗ATTENZIONE SEGNALI FOTOCELLULE SIMULTANEI,STATO
INCONSISTENTE ∗∗∗∗∗∗∗∗ \ n
∗∗∗∗∗∗∗∗ A t t e n d e r e r i s t a b i l i z z a z i o n e s t a t o
o n s i s t e n t e ∗∗∗∗∗∗∗∗ \ n\0 " ;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
}
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
// : FUNCTION_BEGIN
ULONG stub_routine_leggiDB ( ) ;
// :STUB_IMPLEMENTATION
/∗ R o u t i n e di
ari
amento della
a
he degli identifi
ativi
/ return long indi
a alla routine
hiamante se la funzione leggiDB ha terminato la sua
ese
uzione
/ 1 non ha terminato
/ 0 ha t e r m i n a t o ∗/
ULONG stub_routine_leggiDB ( ) {
SHORT r e t
o d e ;
ULONG s i z e S ;
OMRESULT r e t ;
RTPLC_STRING nome ;
RTPLC_STRING f i n e ;
RTPLC_STRING format ;
RTPLC_STRING nomeUtente ;
RTPLC_STRING s e r i a l e ;
// i n i z i a l i z z o le variabili di appoggio
r e t
o d e =0;
s i z e S =0;
f i n e . s i z e =5;
nome . s i z e =5;
format . s i z e =5;
s e r i a l e . s i z e =18;
nomeUtente . s i z e =18;
f i n e . s z=" \n" ;
nome . s z=" ! " ;
s e r i a l e . s z=" " ;
nomeUtente . s z=" " ;
format . s z="%s " ;
l u
e V e r d e=RTPLC_FALSE;
l u
e R o s s a=RTPLC_TRUE;
swit
h ( statusLeggiDB )
// v a r i a b i l e di stato status_seriale
{
ase 0 : // apertura file txt in lettura
if
// 1 . apertura fallita r e t <0
(OMFAILED ( r e t ) )
{
r t p l
t r a
e ( 1 ,_T( " E r r o r e a p e r t u r a f i l e %s \n" ) ,W322OMERR( r e t ) ) ;
65
statusLeggiDB = 0 ;
return OM_ERROR;
}
else
// 2 . apertura in ese
uzione r e t ==1
i f ( r e t == OMCS_WAIT)
{
r t p l
t r a
e ( 1 ,_T( " A t t e s a \n" ) ) ;
return OMCS_WAIT;
}
else
// 3 . file aperto r e t ==0
i f ( r e t == OM_OK)
{
r t p l
t r a
e ( 1 ,_T( " F i l e a p e r t o
o r r e t t a m e n t e \n" ) ) ;
statusLeggiDB = 1 ;
return OMCS_WAIT; // p e r
h e ' a n
o r a d e v e l e g g e r e
}
ase 1 : // l e t t u r a file
// v a r i a b i l e ritorno lettura file inizializzata a ok
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
default :
67
return 0;
}
return 0 ;
}
A.7 routine_aggiornaDB. :
#define _INTERNAL_GENERATION
#in
lude " r t p l
. h"
#in
lude " d e f i n i t i o n s . h"
// : FUNCTION_BEGIN
ULONG stub_routine_aggiornaDB ( ) ;
// :STUB_IMPLEMENTATION
/∗ f u n z i o n e di aggiornamento identifi
ativi in
a
he
/ implementa le funzioni di rimpiazzamento proprie di una
a
he
/ return long indi
a alla routine
hiamante se la funzione e ' terminata
/ 1 non e ' terminata
/ 0 e ' t e r m i n a t a ∗/
ULONG stub_routine_aggiornaDB ( ) {
OMRESULT r e t ;
USHORT
mp ;
RTPLC_STRING
o d i
e ;
RTPLC_STRING nomeUtente ;
RTPLC_STRING nome ;
RTPLC_STRING f i n e ;
RTPLC_BIT t r o v a t o ;
// i n i z i a l i z z a z i o n e variabili di appoggio
f i n e . s i z e =5;
nome . s i z e =5;
o d i
e . s i z e =20;
nomeUtente . s i z e =20;
o d i
e . s z=" " ;
nomeUtente . s z=" " ;
f i n e . s z=" \n" ;
nome . s z=" ! " ;
t r o v a t o=RTPLC_FALSE;
mp=0;
swit
h ( statusAggiornaDB )
{
ase 0 :
{
// 1 . Apro il file
r e t = OM_OK;
// apertura file
r e t = o m f i l e o p e n (& f i l e n a m e . v a l u e . s t r i n g ,&R_openmode . v a l u e . s t r i n g ,& f i l e _ h a n d l e [ 0 ℄ ) ;
if
// 1 . 1 apertura fallita r e t <0
(OMFAILED ( r e t ) )
{
r t p l
t r a
e ( 1 ,_T( " E r r o r e a p e r t u r a f i l e %s \n" ) ,W322OMERR( r e t ) ) ;
statusAggiornaDB = 0 ;
return OM_ERROR;
}
else
if ( r e t == OMCS_WAIT)
// 1 . 2 apertura in ese
uzione r e t ==1
return OMCS_WAIT;
else
// 1 . 3 file aperto r e t ==0
68
if ( ret == OM_OK)
statusAggiornaDB = 1;
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;
// 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)
// 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:
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 ) ;
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 z , idN . v a l u e . s t r i n g . s z ) ;
s r p y (& r e t u r n p a r a m . v a l u e . s t r i n g ,& a n n u l l a . v a l u e . s t r i n g ) ;
s t a t u s A g g i o r n a D B =3;
return 1;
ase 3:
// 4 .
o n f r o n t o i l
o d i
e l e t t o
on q u e l l o p a s s a t o ( sr
mp )
mp=s r
m p (& idN . v a l u e . s t r i n g ,& s r x B u f f e r . v a l u e . s t r i n g ) ;
i f (
mp==0)
{
69
// ho t r o v a t o l ' i d e n t i f i
a t i v o ora devo f a r e i l rimpiazzamento
s e a r
h D B=RTPLC_TRUE;
s t a t u s A g g i o r n a D B =4;
return 1;
else
{
// r i
o r s i o n e r i i n i z i o d a l l o s t a t o 1
s t a t u s A g g i o r n a D B =1;
return 1;
ase 4:
// 5 . l e g g o l ' a r r a y i e d e i d o i n he i d i n s e r i r l o
i f ( e !=6)
{ // e v i t o d i f a r e i l w h i l e per non
r e a r e l o o p
//
aso 1 : siamo i n p o s i z i o n i i n t e r n e d e l l ' a r r a y
// d e l l ' uso d e l l a
a
he
i f ( i [ e ℄!=0)
{
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 (&nome1 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ;
i [1℄=1;
n I d =1;
s t a t u s A g g i o r n a D B =5;
return 1;
ase 2 :
s r
p y (& i d 2 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ;
s r p y (&nome2 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ;
i [2℄=1;
n I d =2;
s t a t u s A g g i o r n a D B =5;
return 1;
ase 3 :
s r
p y (& i d 3 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ;
s r p y (&nome3 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ;
i [3℄=1;
n I d =3;
s t a t u s A g g i o r n a D B =5;
return 1;
ase 4 :
s r
p y (& i d 4 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ;
s r p y (&nome4 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ;
i [4℄=1;
n I d =4;
s t a t u s A g g i o r n a D B =5;
return 1;
ase 5 :
s r
p y (& i d 5 . v a l u e . s t r i n g ,& idN . v a l u e . s t r i n g ) ;
70
s r
p y (&nome5 . v a l u e . s t r i n g ,&nomeN . v a l u e . s t r i n g ) ;
i [5℄=1;
nId =5;
statusAggiornaDB =5;
return 1;
default :
statusAggiornaDB =5;
return 1;
}
}
}
ase 5:
{
// 6 .
h i u d o il file
ret = omfile
lose ( file_handle [ 0 ℄ ) ;
if
// 1 .
hiusura fallita r e t <0
(OMFAILED ( r e t ) )
{
r t p l
t r a
e ( 2 , _T( " E r r o r e d u r a n t e l a
h i u s u r a d i un f i l e " ) ) ;
return − 1;
}
if
// 2 .
hiusura in ese
uzione r e t =1
( r e t == OMCS_WAIT)
return 1;
if ( r e t
// 3 . fine operazione
hiusura
== OM_OK)
{
file_handle [ 0 ℄ = 0;
statusAggiornaDB =0;
e =1;
return 0;
}
}
default : return 0;
}
}
A.8 routine_leggiSeriale. :
#define _INTERNAL_GENERATION
#in
lude " r t p l
. h"
#in
lude "om
om . h"
#in
lude " d e f i n i t i o n s . h"
// : FUNCTION_BEGIN
ULONG s t u b _ r o u t i n e _ l e g g i S e r i a l e ( ) ;
// :STUB_IMPLEMENTATION
/∗ F u n z i o n e di lettura porta seriale
/ return long indi
a alla routine
hiamante se la funzione e ' terminata
/ 0 e ' terminata
/ 1 non e ' t e r m i n a t a ∗/
ULONG s t u b _ r o u t i n e _ l e g g i S e r i a l e ( )
{
// v a r i a b i l i di risposta
OMFRESULT r e s ;
//OMFRESULT r e s 2 ;
USHORT
mp ;
ULONG r e t ;
USHORT s i z e I ;
71
RTPLC_STRING format ;
// i n z i z i a l i z z a z i o n e variabili lo
ali
mp=0;
s i z e I =0;
format . s i z e =15;
format . s z="%02X%02X%02X%02X" ;
l u
e V e r d e=RTPLC_FALSE;
l u
e R o s s a=RTPLC_TRUE;
// i n i z i a l i z z a z i o n e buffer domanda
txBuffer [0℄ = 0 x01 ; // primo byte della request SOF
txBuffer [1℄ = 0 x09 ; // se
ondo byte della request LENGHT MSB
txBuffer [2℄ = 0 x00 ; // terzo byte della request LENGHT LSB
txBuffer [3℄ = 0 x03 ; // quarto byte della request DEVICE ID
txBuffer [4℄ = 0 x01 ; // quinto byte della request CMD1
txBuffer [5℄ = 0 x41 ; // sesto byte della request CMD2
txBuffer [6℄ = 0 x01 ; // settimo byte della request TIME OUT
txBuffer [7℄ = 0x4A ; // ottavo byte della request LRC1
txBuffer [8℄ = 0xB5 ; // ultimo byte della request LRC2
i f ( k==5)
k=0;
// v a r i a b i l e di stato statusSeriale
swit
h ( s t a t u s S e r i a l e )
{
ase 0 :
r e s=OMCS_OK;
// r i
h i e s t a lettura alla seriale
// T r a s m i s s i o n e request su
om1
r e s = om
write ( 1 , t x B u f f e r , s i z e o f ( t x B u f f e r ) ) ;
i f ( r e s == OMCS_WAIT)
// non ha finito di leggere
return 1 ;
else
{
i f ( r e s == OMCS_OK)
// ha finito di leggere
{
statusSeriale = 1;
return 1 ;
}
else
i f ( r e s == OMCS_ERROR)
// ha fatto errore
return − 1;
}
break ;
ase 1 :
{
ULONG r i s ; //
o n t r o l l o
h e l a r i s p o s t a non s i a
o s t i t u i t a da 0 nel
aso
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING;
a p p o g g i o . v a l u e . s t r i n g . s i z e =20;
a p p o g g i o . v a l u e . s t r i n g . s z=" 000000000000000000000000000000 " ;
// l e t t u r a risposta seriale
r e s 5 = om
read ( 1 , r x B u f f e r , s i z e o f ( r x B u f f e r ) , 3 0 0 , ( int ∗ )&rxLen ,TRUE) ;
// i n s e r i s
o i bit letti in una variabile string per poter essere gestita
v s r p r i n t f (& s r x B u f f e r . v a l u e . s t r i n g ,& format , r x B u f f e r [ 1 3 ℄ , r x B u f f e r [ 1 2 ℄ , r x B u f f e r [ 1 1 ℄ ,
rxBuffer [ 1 0 ℄ ) ;
i f ( r e s 5 == OMCS_WAIT)
return 1 ;
else
i f ( r e s 5 == OMCS_OK)
{
r t p l
t r a
e ( 1 ,_T( "OMCS_OK\n" ) ) ;
// f i n e trasmissione
r i s=sr
mp(& s r x B u f f e r . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
statusSeriale = 0;
72
i f ( ( rxLen != 0 ) | | ( r i s ==0))
{ // 1 . l a l u n g h e z z a d e l l a r i s p o s t a e ' diversa 0
}
else
{ // 2 . La l e t t u r a non e ' a v v e n u t a
RTPLC_VARIANT a p p o g g i o ;
// C o n d i z i o n e di t a g NON t r o v a t o
a p p o g g i o . vt=RTPLC_FORMAT_STRING; a p p o g g i o . v a l u e . s t r i n g . s i z e =100;
a p p o g g i o . v a l u e . s t r i n g . s z=" Nessun Tag r i l e v a t o n e l r a g g i o d i a z i o n e d e l r e a d e r \n"
;
s r
p y (& output . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 , _T( "%s \n" ) , output . v a l u e . s t r i n g . s z ) ;
statusSeriale = 0;
sear
hDB =0;
return 0 ; // f i n e l e t t u r a s e r i a l e
}
}
else
s t a t u s S e r i a l e =0;
break ;
}
// i n i z i o ri
er
a identifi
atore in
a
he
ase 2 :
{
//
o n f r o n t o
on identifi
atore1
mp=sr
mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 1 . v a l u e . s t r i n g ) ;
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
return 0 ;
}
else
{
s t a t u s S e r i a l e =6;
mp=0;
return 1 ;
}
break ;
}
ase 6 :
{
//
o n f r o n t o
on identifi
atore5
mp=sr
mp(& s r x B u f f e r . v a l u e . s t r i n g ,& i d 5 . v a l u e . s t r i n g ) ;
r t p l
t r a
e ( 1 ,_T( " q u i n t o : %s %s \n" ) , i d 5 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ;
i f (
mp==0) // S e r i a l e l e t t a = a i d 5
{
sear
hDB=RTPLC_TRUE;
nId =5;
74
s t a t u s S e r i a l e =0;
k++;
i [5℄=1;
r t p l
t r a
e ( 1 ,_T( "%s %s \n" ) , i d 5 . v a l u e . s t r i n g . sz , s r x B u f f e r . v a l u e . s t r i n g . s z ) ;
return 0;
}
else
{
// e s p a n z i o n e :
//
h i a m a una nuova routine
ontrolla file
//
h e aggiorna il database nel
aso ritrovi l ' id
r e t=proxy_routine_aggiornaDB ( s r x B u f f e r . v a l u e . s t r i n g ) ;
if ( r e t ==1)
return 1;
if ( r e t ==0)
{
if ( sear
hDB==RTPLC_FALSE)
{
nId =0;
s t a t u s S e r i a l e =0;
mp=0;
e =0;
}
k++;
s t a t u s S e r i a l e =0;
}
return 0 ;
}
break ;
}
default : break ;
}
return 0 ;
}
A.9 routine_reset. :
#define _INTERNAL_GENERATION
#in
lude " r t p l
. h"
#in
lude " d e f i n i t i o n s . h"
void s t u b _ r o u t i n e _ r e s e t ( ) ;
// : FUNCTION_BEGIN
// :STUB_IMPLEMENTATION
void
/∗ f u n z i o n e di reset delle variabili globali ∗/
stub_routine_reset () {
// Routine per la ristabilizzazione di uno stato
onsistente del pl
// a l l a r m ( (USHORT) 0) ;
RTPLC_VARIANT a p p o g g i o ; a p p o g g i o . vt=RTPLC_FORMAT_STRING;
a p p o g g i o . v a l u e . s t r i n g . s i z e =2; a p p o g g i o . v a l u e . s t r i n g . s z=" " ;
// 0 . segnalazione di impegno
l u
e V e r d e=RTPLC_FALSE;
l u
e R o s s a=RTPLC_TRUE;
75
// 2 . riinizializzazione timer
timerT =0;
timerA =0;
t i m e r A l =0;
t i m e r S o s t a =0;
// 4 . riinizializzazione variabili
// ( non vengono resettati : rxLen e inizio )
type =0;
g f o t o 1 =0;
g f o t o 2 =0;
nId =1;
k=0;
j =0;
s =0;
// 5 . riinizializzazione presenti
s r
p y (& p r e s e n t i 1 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
s r
p y (& p r e s e n t i 2 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
s r
p y (& p r e s e n t i 3 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
s r
p y (& p r e s e n t i 4 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
s r
p y (& p r e s e n t i 5 . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
s r
p y (& uUs
ente . v a l u e . s t r i n g ,& a p p o g g i o . v a l u e . s t r i n g ) ;
// 6 . delete messaggi / a l l a r m i
messagp ( (USHORT) 0 ) ;
a l l a r m ( (USHORT) 0 ) ;
76
A
ronimi
PLC Programmable logi
ontroller
RFID Radio Frequen
y IDenti
ation
CAN Controller Area Network
ISO/OSI Open Systems Inter
onne
tion
ARM9 Advan
ed RISC Ma
hine 9
OEM Original Equipment Manufa
turer
77