[1/2] http://www.gruppodab.it/public/press-area/libretto-musei-V04-def.pdf Protezione di Opere d’arte Videosorveglianza all’aperto ed aree archeologiche Anti intrusione Sistema di Sistema di Controllo rivelazione e visitatori spegnimento incendio 060610 Sistema di Monitoraggio ambientale Antifurto Sistema di supervisione degli impianti tecnologici Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 Controllo accessi 1 [2/2] 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 2 PROBLEMA: PROBLEMA Monitorare una grandezza fisica. Perchè? ...necessita’ concreta Cosa serve? ...idea semplice Come? ...strumenti H/W e S/W Idea S/W Problema Problema H/W 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 3 Cosa serve? ...idea semplice 1. Trasduttore da Grandezza Fisica a Grandezza Elettrica per la misura della G.F. 2. Dispositivo di Conversione da Grandezza Analogica a Grandezza Digitale (A.D.C.) 3. Calibrazione tra G.D. e G.F. 4. Circuito Digitale per la lettura dei valori misurati e convertiti in digitale da ADC 5. Trasferire in un PC i Valori digitali misurati 6. Ad ogni valore misurato va associato l’istante di misura t 7. Salvare in memoria tutti i valori misurati ed il relativo istante di misura in un File 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 4 Principio base di un sistema di controllo 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 5 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 6 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 7 ...idea semplice per monitorare la temperatura H/W: Sensore di temperatura Multimetro Digitale PC S/W: S/W 1. Inviare i comandi attraverso la linea seriale 2. Ricevere i dati misurati attraverso la linea seriale 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 8 Multimetro Digitale: FLUKE45 Sensore di temperatura: LM35 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 9 Vario il duty-cycle del segnale pilota 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 10 Possibile approccio per monitorare in automatico la Temp. senza richiedere l’intervento diretto dell’uomo per ogni singolo passo: 1. Inviare il comando attraverso la linea seriale 2. Ricevere il dato misurato attraverso la linea seriale 3. Registrare il dato misurato utilizzo di un software (insieme di linee di comando ) residente nel PC eseguito passo dopo passo 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 11 Il linguaggio PYTHON nasce nel 1990: il padre e’ Guido van Rossum che all’epoca era un fan di un gruppo di comici inglesi famosi sulla BBC per “Monty Python's Flying Circus” . Quindi, il nome non sta per PITONE... Il sito ufficiale e’ http://www.python.org Si tratta di un linguaggio interpretato anche se molte implementazioni lo compilano per motivi di efficienza): si puo` interagire con una macchina virtuale Python in maniera interattiva. L'esecuzione avviene attraverso l'interprete python, di cui sono disponibili pacchetti di istallazione per le varie distribuzioni di software esistenti. Una caratteristica di Python e’ la sua Portabilita’ da una piattaforma con un Sistema Operativo ad un altro diverso. 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 12 Cosa vuol dire linguaggio “interpretato”? Un linguaggio interpretato è un linguaggio di programmazione i cui programmi vengono eseguiti da un altro programma chiamato interprete. A differenza di un interprete, un compilatore non esegue il programma che riceve in ingresso, ma lo traduce in linguaggio macchina memorizzando su file il codice oggetto pronto per l’esecuzione diretta da parte del processore. L’interprete, che esegue ogni riga del nostro codice, varia a seconda del processore nel computer, per cui ciò che noi scriviamo nel nostro programma viene interpretato in base all'architettura. In questo modo viene garantita la portabilità del codice, ovvero la possibilità di poter far funzionare su tutti i computer che abbiano installato l’interprete il nostro programma. In generale, un linguaggio interpretato può presentare uno svantaggio: risultare più lento del codice compilato, perchè viene interpretata ogni singola istruzione. 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 13 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 14 Prompt dell’interprete Python: >>> Assegnazione: si usa l'operatore = # questo carattere rappresenta l'inizio di un commento Esempio: Python come calcolatrice >>> 2+2 4 >>> 10 / 3 # divisione intera 3 >>> (50-5*6)/4 # a comment 5 >>> width = 20 >>> height = 5*9 >>> width * height 900 >>> x = y = z = 0 # Zero x, y and z >>> # Floating point >>> 3 * 3.75 / 1.5 7.5 >>> 7.0 / 2 3.5 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 15 In Python, non vengono utilizzati caratteri speciali per distinguere il tipo di variabile! …se si utilizza lo stesso nome per una nuova variabile, viene sovrascritto il contenuto della variabile precedente! Il tipo di dato non deve essere dichiarato esplicitamente Esempio: definizione di variabili...non serve dichiararle all’inizio >>> pippo = 7 Viene creata una variabile pippo, di tipo intero, contenente il valore 7 >>> pippo = 5.5 pippo e` divenuta una variabile reale... >>> a = b = c = 0 sia a che b che c assumono il valore 0 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 16 Esempio: stringhe e concatenazioni tra stringhe Esempio: slice di una stringa >>> messaggio = "aiuto! " >>> x = "casa" >>> “Al fuoco! ” + messaggio Al fuoco! aiuto! >>> messaggio * 7 'aiuto! aiuto! aiuto! aiuto! aiuto! aiuto! aiuto! ' >>> messaggio * 0 ' ' # stringa vuota >>> x[:2] 'ca' >>> x[2:] 'sa' | c| a| s| a| | 0| 1| 2| 3| 4 |-4|-3|-2|-1| >>> x[:] 'casa' >>> x[-2] # anche all'indietro! 's' >>> len(x) # lunghezza di una stringa 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 17 Una particolarita’ del linguaggio Python: in generale un blocco e` delimitato per mezzo della indentazione! Si posso usare spazi o tab, basta che siano lo stesso numero. Esempio: istruzione while a, b = 0, 1 # assegnamento con tupla (detto multiplo)! while b < 10: print b, # "," serve ad evitare \n finale a, b = b, a+b 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 18 Esempio: istruzione if Esempio: istruzione if if cond1: x = 25 if x > 50: y=1 elif x < 30: y=2 else: y=3 if x > 10: print 'OK' else: print 'NO' # cond1 vera elif cond2: # cond2 vera elif cond3: # cond3 vera ... else : # nemmeno una vera! 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 19 Esempio: istruzione for >>> for x in (0,1,2): print x**2 0 1 4 >>> range(3) [0, 1, 2] >>> for x in range(3): print x**2 0 1 4 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 20 fluke45_IDN.py print "..............................................." import serial fluke45=serial.Serial('COM7',9600) fluke45.flush() fluke45.write('*IDN?\r') print fluke45.read(41) print "................................................" fluke45.close() fluke45_VAL_mod.py print "..............................................." # import serial fluke45=serial.Serial('COM9', 9600) j=1 # while j<3: Fluke45_VAL.py fluke45.flush() IDLE 1.2.1 fluke45.write('VAL?\r') >>> import serial x1 = fluke45.read(6) >>> fluke45 = serial.Serial('com5',9600) x2 = fluke45.read(8) >>> fluke45.flush() x3 = fluke45.read(2) >>> fluke45.write('VAL?\r') print x1, x2, x3 >>> print fluke45.read(9) j=j+1 -1E+9 # => print "..............................................." >>> fluke45.close() 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 21 uscita-su-finestra-da-prova_290510.txt from datetime import date print date.today() import time print time.ctime() d = time.gmtime() print d print d.tm_min 2010-05-29 Sat May 29 19:44:09 2010 time.struct_time(tm_year=2010, tm_mon=5, tm_mday=29, tm_hour=17, tm_min=44, tm_sec=9, tm_wday=5, tm_yday=149, tm_isdst=0) 44 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 22 prova_010610.py k=0 j=1 secondi0=0 while 1: import serial fluke45 = serial.Serial('COM4',9600) fluke45.flush() fluke45.write('VAL?\r') x1=fluke45.read(10) j=j+1 import time 'scegliere o localtime o gmtime' d = time.localtime() secondi = d.tm_sec fluke45.close() if (secondi - secondi0) == 1 : k = k+1 print secondi , ";",k, ";",x1 secondi0 = secondi if j == 100 : break 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 23 prova2_010610.py import time 'scegliere o localtime o gmtime' d = time.localtime() j=j+1 import time 'scegliere o localtime o gmtime' d = time.localtime() ora0 = d.tm_hour minuti0 = d.tm_min minuti0 = minuti0 + ora0*60 k=0 j=1 secondi0=0 while 1: secondi = d.tm_sec minuti = d.tm_min ora = d.tm_hour import serial fluke45 = serial.Serial('COM4',9600) fluke45.flush() fluke45.write('VAL?\r') x1=fluke45.read(10) fluke45.close() 060610 if (secondi - secondi0) == 1 : k = k+1 print secondi , ";",k, ";",x1 secondi0 = secondi if ((minuti + ora*60)-minuti0) == 1 : break Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 24 prova_020610.py [1/2] durata_daq = input("inserire durata totale acquisizione in minuti: "); print durata_daq; import time 'scegliere o localtime o gmtime' d = time.localtime() ora0 = d.tm_hour minuti0 = d.tm_min minuti0 = minuti0 + ora0*60 k=0 j=1 secondi0=0 while 1: import serial fluke45 = serial.Serial('COM5',9600) fluke45.flush() fluke45.write('VAL?\r') x1=fluke45.read(10) fluke45.close() 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 25 prova_020610.py [2/2] j=j+1 import time 'scegliere o localtime o gmtime' d = time.localtime() secondi = d.tm_sec minuti = d.tm_min ora = d.tm_hour if (secondi - secondi0) == 1 : k = k+1 print k, ";",x1 secondi0 = secondi if ((minuti + ora*60)-minuti0) == durata_daq : break 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 26 prova2_020610.py [1/2] durata_daq = input("inserire durata totale acquisizione in minuti: "); print durata_daq; pluto = open('F:\misure.txt','w') import time 'scegliere o localtime o gmtime' d = time.localtime() ora0 = d.tm_hour minuti0 = d.tm_min minuti0 = minuti0 + ora0*60 k=0 j=1 secondi0=0 while 1: 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 27 prova2_020610.py [2/2] import serial fluke45 = serial.Serial('COM5',9600) fluke45.flush() fluke45.write('VAL?\r') x1=fluke45.read(10) fluke45.close() j=j+1 import time 'scegliere o localtime o gmtime' d = time.localtime() secondi = d.tm_sec minuti = d.tm_min ora = d.tm_hour if (secondi - secondi0) == 1 : k = k+1 print k, ";",x1 pluto.write(str(k)+';'+str(x1)) secondi0 = secondi misura.txt 2;12345 3;12345 4;12345 5;12345 if ((minuti + ora*60)-minuti0) == durata_daq : pluto.close() break 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 28 F L U K E 4 5 + R S 2 3 2 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 29 [1 / 4] FLUKE45 + USB/RS232 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 [2a/4] 30 FLUKE45 + USB/RS232 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 [2b/4] 31 FLUKE45 + USB/RS232 + Python 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 [3/4] 32 Python + SerialUSB/RS232 060610 Lab. Mis. An. Dati (LS in BB-CC) AA209/2010 [4/4] 33