TESTO ESERCITAZIONE: CATENA DI ACQUISIZIONE DATI: Qualsiasi sistema in grado di rilevare e memorizzare grandezze analogiche o digitali è un sistema di acquisizione dati. È necessario innanzitutto distinguere tra sistemi in grado di rilevare grandezze analogiche e sistemi che rilevano grandezze digitali. ANALOGICO MF rappresenta il mondo fisico da cui trarre i dati E rappresenta un elaboratore (PC, sistema dedicato, microprocessore) I rappresenta un'interfaccia hardware S rappresenta un sensore A rappresenta un attuatore. Nel caso in cui il dato da acquisire sia di natura digitale, ed essendo E in grado di trattare solo dati digitali, bastano solamente due interfacce hardware (una per S e l'altra per A, essendo anche S e A di natura digitale). Digitale Nel caso in cui il dato da acquisire sia di tipo analogico (grandezze fisiche naturali), S ed A sono analogici per cui necessitano due convertitori: uno ADC posto tra S ed E ed uno DAC tra E ed A e lo schema diventa: in cui CC rappresenta il circuito di condizionamento, ADC il convertitore analogico/digitale e DAC il convertitore digitale/analogico. L’architettura del sistema di acquisizione può essere di due tipologie principali a seconda del numero di grandezze che si vogliono utilizzare: -monocanale -multicanale Monocanale Multicanale L'architettura di una catena di acquisizione dati a più canali è genericamente quella riportata, in cui è inserito un multiplexer analogico per poter smistare i segnali dei singoli sensori al convertitore. Il multiplexer ha ingressi dati in numero proporzionale al numero di linee di selezione I = 2s. Le linee di selezione sono comandate dal blocco della logica di controllo. 1- Sensori: 1 Il dispositivo o elemento sensibile in grado di rilevare le variazioni di una grandezza fisica e di fornire in uscita un'altra grandezza fisica è definito sensore. In genere nei sistemi di processo e/o di controllo la grandezza da controllare è di tipo elettrico (tensione) per cui bisogna garantirsi che l'uscita del sensore fornisca una tensione e questo compito è affidato ai trasduttori. Il trasduttore d'ingresso converte una grandezza fisica in grandezza elettrica; e il trasduttore di uscita è anche chiamato attuatore, e converte la grandezza elettrica in un'altra grandezza fisica. I trasduttori per compiere queste conversioni necessitano di energia, generalmente fornita dall’esterno (trasduttori modulanti), il trasduttore (sensore) che invece non utilizza energia esterna è detto anche trasduttore autogenerante. Possono essere per lo stesso motivo distinti in attivi e passivi. I trasduttori attivi possono essere: analogici e digitali. I trasduttori analogici presentano una caratteristica ingresso/uscita costituita da una funzione continua. I trasduttori digitali presentano una caratteristica ingresso/uscita che può assumere solo due valori: alto o basso, livello logico 1 o livello logico 0. Il trasduttore modulante o passivo può presentare in uscita un valore diverso da zero anche quando in ingresso la grandezza è nulla (offset), per la presenza dell'alimentazione esterna chiamata eccitazione. 2- Circuito di condizionamento La grandezza fisica da rilevare è stata convertita in segnale elettrico dal trasduttore di ingresso che, nel relativo campo di funzionamento, dovrebbe garantire segnali elettrici proporzionali ai valori della grandezza fisica. Il segnale fornito dal trasduttore deve essere adattato alle specifiche d'ingresso del convertitore. Questa funzione, fondamentale per tutti i blocchi successivi della catena di acquisizione, è svolta dal circuito di condizionamento, che assicura un trasferimento migliore del segnale al convertitore, eliminando gran parte dei disturbi. Le azioni principali svolte dai circuiti di condizionamento possono essere: R/V (resistenza/tensione) oppure I/V (corrente/tensione) 3-Sample & Hold Il convertitore A/D ha un tconv (tempo di conversione) finito che può, approssimativamente, andare da 20 ms fino a 1 ns. Eventuali variazioni del segnale durante il processo di conversione possono generare errori significativi. Il circuito S/H, è utilizzato nei casi in cui c’è il rischio che nel processo di conversione si generino errori, e memorizza il valore del campione del segnale di ingresso (sample) mantenendolo inalterato per un dato intervallo di tempo (hold) che dipende dalla lieve scarica che avviene per la corrente di polarizzazione di ingresso dell'A. O. e per le correnti di perdita dell'interruttore e del condensatore. La scelta del compromesso tra tempo di carica il possibile e quello di grande possibile valore di C è un l'esigenza di un più piccolo (campionamento) scarica il più (mantenimento). 4- ADC: convertitore analogico/digitale 2 Il convertitore A/D ha il compito di trasformare il segnale analogico presente al suo ingresso (Vi) in un segnale digitale ad n bit N(10) = b020 + b12 + b222 + ... + bn-12n-1 = Vi / (k • VREF) in cui VREF è la tensione di riferimento, k = 2-n la costante di proporzionalità e N(10) il numero decimale da trasformare in binario. Normalmente sono previsti almeno due segnali di controllo: SC (Start Conversion) in ingresso e EOC (End of Conversion) in uscita. I due segnali sono utilizzati per sincronizzare il funzionamento dell'ADC interfacciato ad un sistema di elaborazione e per questo, in uscita dall'ADC, sono previsti dei latch tri-state ovvero uscite sia seriali che parallele. La conversione è una quantizzazione del segnale analogico, in quanto ogni campione del segnale analogico viene trasformato in un solo valore corrispondente ad un livello e convertito nel codice binario. Ogni convertitore ha un proprio range per la tensione analogica di ingresso che deve essere rispettato. PROGRAMMA PORTA SERIALE: Private Sub Form_Load() With MSComm1 .CommPort = 1 'Imposta e restituisce il numero della porta di comunicazione .Handshaking = 2 - comRTS 'Imposta e restituisce il protocollo di sincronia hardware .RThreshold = 1 'Imposta e restituisce il numero di caratteri che dovranno essere ricevuti .RTSEnable = True 'Determina se attivare la linea RTS (Request To Send ) .Settings = "9600,n,8,1" 'Imposta e restituisce i parametri di velocità di trasmissione, parità, bit di dati e bit di stop .SThreshold = 1 'Imposta e restituisce il numero minimo di caratteri consentito nel buffer di trasmissione .PortOpen = True End With End Sub Private Sub Form_Unload(Cancel As Integer) MSComm1.PortOpen = False End Sub Private Sub MSComm1_OnComm() Dim InBuff As String Select Case MSComm1.CommEvent ' Si gestisce ogni evento o errore ' inserendo del codice opportuno ' dopo ciascun caso. ' Errori Case comEventBreak ' Ricevuto segnale di interruzione. Case comEventCDTO ' CD (RLSD) Timeout. Case comEventCTSTO ' CTS Timeout. Case comEventDSRTO ' DSR Timeout. Case comEventFrame ' Errore di frame. Case comEventOverrun ' Perdita di dati. 3 Case comEventRxOver ' Overflow buffer di ricezione. Case comEventRxParity ' Errore di parità. Case comEventTxFull ' Buffer di trasmissione pieno. Case comEventDCB ' Errore imprevisto durante il recupero di DCB. ' Eventi Case comEvCD ' Modifica la linea CD. Case comEvCTS ' Modifica la linea CTS. Case comEvDSR ' Modifica la linea DSR. Case comEvRing ' Modifica l'indicatore del segnale telefonico. Case comEvReceive ' Ricevuti RThreshold caratteri. InBuff = MSComm1.Input Call HandleInput(InBuff) Case comEvSend ' Ci sono un numero SThreshold di caratteri nel buffer di trasmissione Case comEvEOF ' E' stato trovato un carattere di EOF nel flusso di input End Select End Sub Sub HandleInput(InBuff As String) ' Questa subroutine si occupa di processare ' i dati in arrivo dalla seriale; in questo ' semplice caso si tratta soltanto di visualizzare ' a video il testo in arrivo Text1.Text = Text1.Text & "--" & InBuff End Sub Private Sub Text2_KeyPress(KeyAscii As Integer) carattere = Chr$(KeyAscii) 'Ricavo il carattere associato al codice ASCII ascicarattere = KeyAscii If ascicarattere = 13 Then 'Se ho premuto invio... MSComm1.Output = Chr(13) & Chr(10) 'Vado a capo End If MSComm1.Output = carattere 'Altrimenti scrivo il carattere End Sub PROGRAMMA FTP(Parte FTP): Option Explicit Public ID As String 'Stringa che identifica il comando richiesto Private Sub cmdConnect_Click() Load login ‘Carico il form del login login.Show vbModal 'Visualizzo il form login Unload login End Sub Private Sub cmdDisconnect_Click() Inet1.Execute "", "CLOSE" 'Chiude la connessione End Sub Private Sub cmdExit_Click() Unload Me End Sub Private Sub Inet1_StateChanged(ByVal State As Integer) Dim POSINVIO As Integer Dim RITORNO As String If (ID = "DIR") And (State = icResponseCompleted) Then ‘Se la richiesta è stata completata e sono stati ricevuti tutti i dati e siamo nella directory corrente RITORNO = Inet1.GetChunk(1024, icString) ‘Recupero i dati dell’evento StateChanged POSINVIO = InStr(1, RITORNO, vbNewLine) ‘Restituisce le occorrenze di vbNewLine in RITORNO While POSINVIO > 0 If Left(RITORNO, POSINVIO - 1) <> "" Then ListOut.AddItem Left(RITORNO, POSINVIO - 1) RITORNO = Mid(RITORNO, POSINVIO + 2) 4 POSINVIO = InStr(1, RITORNO, vbNewLine) Wend ID = "" End If End Sub Private Sub Timer1_Timer() ID = "DIR" Inet1.Execute "", "DIR" ‘Vado alla directory corrente Timer1.Enabled = False ListOut.Clear ‘Aggiorno la lista dei files remoti ListOut.AddItem "./" ListOut.AddItem "../" End Sub Private Sub cmdDownload_Click() On Error GoTo ERRORE ‘In caso di errore vai alla gestione degli errori Inet1.Execute "", "GET " & ListOut.Text & " " & ListOut.Text ‘Preleva il file dall’host remoto Exit Sub ‘Esco dalla sub ERRORE: MsgBox "ERRORE: " & Err.Description, vbCritical + vbOKOnly ‘Messaggio di errore End Sub Private Sub cmdUpload_Click() On Error GoTo ERRORE ‘In caso di errore vai alla gestione degli errori Inet1.Execute "", "PUT ./ftp.frm ftp.frm" ‘Carico un file sull’ host remoto Timer1.Enabled = True ' Attende per effettuare il dir Exit Sub ERRORE: MsgBox "ERRORE: " & Err.Description, vbCritical + vbOKOnly ‘Messaggio di errore End Sub Private Sub cmdChangeDir_Click() On Error Resume Next Inet1.Execute "", "CD " & ListOut.Text ‘Cambio la directory sull’host remoto Timer1.Enabled = True ' Attende per effettuare il dir End Sub PROGRAMMA FTP(Parte Login): Option Explicit Private Sub CancelButton_Click() Me.Hide ‘Nasconde il form di connessione End Sub Private Sub OKButton_Click() Dim URLACCESSO As String On Error GoTo ERRORE ‘In caso di errore vai alla gestione degli errori URLACCESSO = "ftp://" & txtUserID.Text & ":" & txtPassword.Text & "@" & txtHost.Text ‘Compone l’URL di accesso Ftp.ID = "DIR" ‘Va alla directory corrente Ftp.Inet1.Execute URLACCESSO ‘Si connette alla URL che è stato appena composto Me.Hide ‘Nasconde il form Exit Sub ERRORE: MsgBox "ERRORE: " & Err.Description, vbCritical + vbOKOnly ‘Visualizza messaggio di errore End Sub PROGRAMMA SUI GRAFICI: Dim arrVis(0 To 1, 0 To 11) 5 Dim Record As Record ' Dichiara la variabile. Private Sub Command1_Click() CommDlg.InitDir = App.Path 'Imposta come directory,la directory in cui è salvato il programma CommDlg.ShowOpen 'Apre la CommonDialog If CommDlg.FileName = "" Then Exit Sub 'Se non ho selezionato nessun file... For I = 0 To 11 arrVis(0, I) = "ora " & I arrVis(1, I) = 0 Next I Open CommDlg.FileName For Random As #1 Len = Len(Record) 'Apre il file che gli ho specificato POS = 0 Do While Not EOF(1) 'Esegue fino alla fine del file If POS > 11 Then Exit Do 'Se il contatore supera 11 esci dal ciclo Get #1, POS + 1, Record 'Prendi il 1°record dal file arrVis(0, POS) = Record.desc 'Inserisci nel vettore-grafico la descrizione dell'elemento arrVis(1, POS) = Record.valore 'Inserisci nel vettore-grafico il valore dell'elemento POS = POS + 1 'Incrementa il contatore Loop Close #1 'Chiude il file MSChart1.ChartData = arrVis 'Crea il grafico MSChart1.Title = "Grafico Temperature" 'Inserisce il titolo al grafico MSChart1.ShowLegend = True 'Inserisce la legenda del grafico End Sub Private Sub Command2_Click() Open CommDlg.FileName For Random As #1 Len = Len(Record) nrec = LOF(1) / Len(Record) 'Calcola il numero dei record presenti nel file Record.desc = Text1.Text 'Preleva la descrizione del record inserito Record.valore = Val(Text2.Text) 'Preleva il valore del record inserito Put #1, nrec + 1, Record 'Inserisce quanto ha prelevato nel file Close (1) 'Chiude il file End Sub Private Sub Command3_Click() CommDlg.InitDir = App.Path 'Imposta come directory,la directory in cui è salvato il programma CommDlg.ShowSave 'Visualizza la finestra di dialogo Salva con nome della CommonDialog Open CommDlg.FileName For Binary Access Write As #1 'Apre il file in scrittura Close (1) 'Chiude il file End Sub 6 7