Differenze
Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.
Entrambe le parti precedenti la revisione Revisione precedente | |||
software:devices:datastore [2019/08/29 17:01] – modifica esterna 127.0.0.1 | software:devices:datastore [2020/07/13 15:07] (versione attuale) – qem103 | ||
---|---|---|---|
Linea 1: | Linea 1: | ||
+ | ====== DEVICE DATASTORE ====== | ||
+ | |||
+ | |||
+ | ====== - Introduzione ====== | ||
+ | |||
+ | Il device DATASTORE, è utilizzato per gestire la scrittura e lettura nella memoria removibile MMC (Multi Media Card) e nella memoria non removibile (NAND) degli strumenti della famiglia Qmove. | ||
+ | |||
+ | |||
+ | ===== - Installazione ===== | ||
+ | |||
+ | ==== - DICHIARAZIONE DEVICE NELL' | ||
+ | |||
+ | Nell' | ||
+ | necessarie allimplementazione del device DATASTORE. | ||
+ | <code QCL> | ||
+ | ; | ||
+ | ; Dichiarazione devices interni | ||
+ | ; | ||
+ | INTDEVICE | ||
+ | <nome device> | ||
+ | </ | ||
+ | |||
+ | dove: | ||
+ | |<nome device> | ||
+ | |DATASTORE|Parola chiave che identifica il device.| | ||
+ | |Tcamp|Tempo campionamento device (1÷10 ms).| | ||
+ | |<port type> | ||
+ | |||
+ | === - Esempio === | ||
+ | <code QCL> | ||
+ | ; | ||
+ | ; Dichiarazione devices interni | ||
+ | ; | ||
+ | INTDEVICE | ||
+ | DEV DATASTORE | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== - Funzionamento ===== | ||
+ | |||
+ | ==== - INTRODUZIONE ==== | ||
+ | |||
+ | L' | ||
+ | In questo modo i dati salvati sono condivisibili con qualsiasi PC ed il dispositivo viene visto da esso come un semplice | ||
+ | floppy disk. | ||
+ | |||
+ | **// | ||
+ | Il file-system supporta le seguenti tipologie di FAT:\\ | ||
+ | FAT12 Utilizzata nei floppy disk o dispositivi di memorizzazione con capacità limitata.\\ | ||
+ | FAT16 Utilizzata nella maggior parte dei dispositivi di memorizzazione. E in grado di arrivare a memorizzare 2GB di dati.\\ | ||
+ | FAT32 Utilizzata nei dispositivi ad alta capacità di memorizzazione, | ||
+ | |||
+ | Il file-system implementato, | ||
+ | tali file devono essere presenti nella sola "root directory" | ||
+ | Il device, inoltre, è in grado di aprire/ | ||
+ | |||
+ | Sono supportati due tipi di file:\\ | ||
+ | * **Formato BINARIO**: il file è scritto direttamente come se fosse un array di long (estensione .hex); | ||
+ | * **Formato CSV (Comma Separated Values)**: i dati vengono scritti in una tabella composta da un certo numero di colonne impostabile. I dati sono separati da ";" | ||
+ | |||
+ | ==== - FORMATO DEL FILE E DEI DATI ==== | ||
+ | |||
+ | I formati file supportati sono il BINARIO ed il CSV. Nella nostra implementazione sono disponibili le funzioni di lettura ed | ||
+ | accodamento (scrittura a fine file), ma non la funzione di sovrascrittura su tutti i tipi di file. | ||
+ | |||
+ | **//Formato BINARIO//** | ||
+ | I files binari avranno estensione hex. Nella nostra implementazione sarà possibile scrivere e leggere un file binario in cui | ||
+ | i dati depositati siano dei valori a long (32bits) in base esadecimale (HEX). Per scrivere o leggere un file di questo tipo è | ||
+ | necessario impostare il parametro // | ||
+ | |||
+ | === - Esempio: === | ||
+ | Se abbiamo nelle variabili olongXX i valori:\\ | ||
+ | <code QCL> | ||
+ | olong01 = 0 => H00000000 | ||
+ | olong02 = -1 => HFFFFFFFF | ||
+ | olong03 = 10000 => H00002710 | ||
+ | olong04 = -10000 => HFFFFD8F0 | ||
+ | </ | ||
+ | |||
+ | Eseguiamo il comando WRITE impostando il parametro "// | ||
+ | <code QCL> | ||
+ | 00000000FFFFFFFF00002710FFFFD8F0'' | ||
+ | </ | ||
+ | |||
+ | **//Formato CSV//** | ||
+ | I files csv avranno estensione csv. I dati scritti in questi file sono disposti in una tabella formata da un numero impostabile | ||
+ | di colonne, ogni colonna viene detta " | ||
+ | considera la presenza dell' | ||
+ | |||
+ | Per scrivere alcuni dati long tipo, 10000, -1, 2147483647 e -2147483648, | ||
+ | Il file system supporta le seguenti tipologie di FAT:\\ | ||
+ | <code QCL> | ||
+ | Field1------------ +Field2--------- +Field3-------- +Field4-----+ | ||
+ | 10000 -1 | ||
+ | </ | ||
+ | |||
+ | In questo modo loccupazione di spazio di ogni record è fissa. Se impostiamo invece // | ||
+ | <code QCL> | ||
+ | 10000; | ||
+ | </ | ||
+ | |||
+ | I maggiori software d' | ||
+ | larghezza fissa (// | ||
+ | La differenza sostanziale tra un formato e laltro sta nella ricerca dei records.\\ | ||
+ | Leggere un determinato record con il formato 1, non è difficile in quanto la posizione dinizio allinterno del file è calcolabile | ||
+ | facilmente dato che la lunghezza del record è fissa.\\ | ||
+ | Leggere invece un record con il formato 2, implica invece una ricerca allinterno del file della posizione dinizio del record. | ||
+ | Questoperazione potrebbe risultare lunga. | ||
+ | |||
+ | ==== - ACCESSO AI FILE ==== | ||
+ | |||
+ | Per utilizzare il dispositivo di memorizzazione (MMC) è necessario utilizzare il comando del device che permette di riconoscerlo | ||
+ | e di attivarlo. Il comando MOUNT permette di eseguire quest' | ||
+ | stato // | ||
+ | Si ricorda che dopo ogni comando il device segna che è in corso la gestione di tale comando con lo stato // | ||
+ | lo stato //st_busy// è a 1 il device non può accedere ad altri comandi.\\ | ||
+ | Per aprire un file esistente o aprire un file nuovo bisogna impostare prima di tutto il parametro // | ||
+ | specificare il formato del file che s' | ||
+ | Di seguito divideremo la trattazione a seconda se il parametro filetype assume i seguenti valori:\\ | ||
+ | a) 0: file binari;\\ | ||
+ | b) 1-2: file CSV con spazio fisso per i dati;\\ | ||
+ | c) 3-4: file CSV con i dati separati dal carattere ";" | ||
+ | Prima di inviare il comando d' | ||
+ | Se il file e presente nel dispositivo di memorizzazione esso è aperto altrimenti viene creato un nuovo file con il nome specificato in file // | ||
+ | Quando lo stato // | ||
+ | |||
+ | **a)** Nei file binari i dati sono presenti uno di seguito all' | ||
+ | * aggiungere un dato in coda; | ||
+ | * sovrascrivere un dato già presente nell' | ||
+ | Per leggere uno o più dati in un file binario, è necessario impostare nel parametro //record// da quale dato iniziare la lettura | ||
+ | e nel parametro //filed// quanti dati leggere un massimo di 32 dati con una lettura. A questo punto si deve utilizzare il comando | ||
+ | READ.\\ | ||
+ | I dati letti sono riportati nei parametri // | ||
+ | |||
+ | === - Esempio: === | ||
+ | Lettura di 3 dati nella posizione 11, 12, 13 nel file binario. | ||
+ | <code QCL> | ||
+ | DEV: | ||
+ | DEV:field=3 | ||
+ | READ DEV | ||
+ | WAIT NOT DEV: st_busy | ||
+ | glVar1=DEV: ilong01 | ||
+ | glVar2=DEV: ilong02 | ||
+ | glVar3=DEV: ilong03 | ||
+ | </ | ||
+ | |||
+ | Per scrivere uno o più dati in un file binario è necessario impostare nel parametro //record// da quale dato iniziare la sovrasrittura | ||
+ | e nel parametro //field// quanti dati sovrascrivere.\\ | ||
+ | I valori dei dati da sovrascrivere ai dati presenti nel file devono essere inseriti nei parametri // | ||
+ | |||
+ | === - Esempio: === | ||
+ | Scrittura di 3 dati nella posizione 11, 12, 13 nel file binario. | ||
+ | <code QCL> | ||
+ | DEV: | ||
+ | DEV:field=3 | ||
+ | DEV: | ||
+ | DEV: | ||
+ | DEV: | ||
+ | WRITE DEV | ||
+ | WAIT NOT DEV: st_busy | ||
+ | </ | ||
+ | |||
+ | Per accodare dei dati nuovi ad un file binario bisogna utilizzare il metodo descritto in precedenza ricordandosi di impostare | ||
+ | il parametro //record// a -1. | ||
+ | |||
+ | **B)** Nei file CSV con spazio dati fisso, viene creata una tabella composta da colonne, chiamate field, e righe, chiamate record. | ||
+ | Il numero di field con cui creare la tabella si deve specificare prima di aprire il nuovo file nel parametro // | ||
+ | Per ogni dato inserito in questa tabella viene riservato uno spazio fisso. In questo modo ogni record, composto da un | ||
+ | numero field di dati occupa uno spazio fisso nel file.\\ | ||
+ | Per leggere un record di un file di questo tipo bisogna impostare nel parametro //record// il numero del record da leggere ed | ||
+ | inviare il comando READ. Nei parametri // | ||
+ | |||
+ | Per sovrascrivere un record di un file di questo tipo bisogna impostare nel parametro record il numero del record da scrivere, | ||
+ | impostare nei parametri // | ||
+ | il comando WRITE.\\ | ||
+ | Per accodare un nuovo record al file è necessario impostare il valore -1 in //record//. | ||
+ | |||
+ | === - Esempio: === | ||
+ | Lettura del record 3 (Composto di tre field): | ||
+ | <code QCL> | ||
+ | DEV:record = 3 | ||
+ | READ DEV | ||
+ | glVar1 = DEV:ilong01 | ||
+ | glVar2 = DEV:ilong02 | ||
+ | glVar3 = DEV:ilong03 | ||
+ | </ | ||
+ | |||
+ | **C)** Come nel caso B, ma in questo caso non è possibile leggere o sovrascrivere un particolare record. E' possibile solo | ||
+ | leggere in modo sequenziale tutto il file e scrivere solo aggiungendo un nuovo record. | ||
+ | |||
+ | Tabella riassuntiva: | ||
+ | ^ Operazioni | ||
+ | ^::: | ||
+ | |OPEN/ | ||
+ | |DELETE|sì|sì|sì| | ||
+ | |READ record sequenziali*|sì|sì|sì| | ||
+ | |READ record indicizzati* *|sì|sì|no| | ||
+ | |WRITE aggiunge un record|sì|sì|sì| | ||
+ | |WRITE sovrascrive record|sì|sì|no| | ||
+ | |||
+ | * = **READ record sequenziali**: | ||
+ | lettura non prevede la possibilità di leggere record in ordine casuale all' | ||
+ | di leggere i record partendo dal primo e leggendo sempre il successivo all' | ||
+ | * * = **READ record indicizzati**: | ||
+ | casuale. | ||
+ | |||
+ | |||
+ | ===== - Tabella comandi e parametri ===== | ||
+ | |||
+ | |||
+ | ==== - SIMBOLOGIA ADOTTATA ==== | ||
+ | |||
+ | Il nome del parametro, stato o comando è riportato alla sinistra della tabella. | ||
+ | |||
+ | **R**\\ | ||
+ | Indica se il relativo parametro o stato è ritentivo (al momento dellinizializzazione del device mantiene lo stato precedentemente definito), oppure lo stato che assume al momento dellinizializzazione del device.\\ | ||
+ | Se il device non necessita d' | ||
+ | R = Ritentivo\\ | ||
+ | 0 = Al momento dellinizializzazione del device il valore è forzato a zero.\\ | ||
+ | 1 = Al momento dellinizializzazione del device il valore è forzato a uno.\\ | ||
+ | - = Al momento dellinizializzazione del device è presentato il valore significativo. | ||
+ | |||
+ | **D**\\ | ||
+ | Indica la **dimensione del parametro**.\\ | ||
+ | F = Flag\\ | ||
+ | B = Byte\\ | ||
+ | W = Word\\ | ||
+ | L = Long\\ | ||
+ | S = Single Float | ||
+ | |||
+ | === - Condizioni === | ||
+ | Sono descritte tutte le **condizioni necessarie affinché il parametro sia considerato corretto o perché il comando sia accettato**.\\ | ||
+ | In alcuni casi sono specificati dei valori limite per laccettazione del parametro: se sono introdotti dei valori esterni ai limiti | ||
+ | impostati, il dato è in ogni caso accettato; pertanto devono essere previsti opportuni controlli dellapplicativo tali da garantire | ||
+ | il corretto funzionamento.\\ | ||
+ | Per lesecuzione di un comando, tutte le relative condizioni devono necessariamente essere soddisfatte; | ||
+ | il comando non è inviato. | ||
+ | |||
+ | **A**\\ | ||
+ | Indica il **modo d' | ||
+ | R = Read (lettura).\\ | ||
+ | W = Write (scrittura).\\ | ||
+ | RW,= Read / Write.\\ | ||
+ | |||
+ | ==== - Parametri ==== | ||
+ | |||
+ | Di seguito sono presentati i parametri, variabili, stati e comandi necessari allesecuzione del device. | ||
+ | ^Nome^D^R^A^Condizioni^Descrizione^ | ||
+ | |priority|B|5|R-W|-|**Priority**\\ Nei prodotti della serie **Qmove** indica la priorità di esecuzione del device rispetto all' | ||
+ | |filetype|B|0|R-W|-|**File Format**\\ Definisce le caratteristiche del file (Range 0÷4):\\ \\ Tipo 0\\ type = BINARY\\ record non separati\\ field non separati da"," | ||
+ | |field|W|0|R-W|filetype=0÷4|**Field**\\ Nel caso in cui // | ||
+ | |filenum|L|0|R-W|-|**File Number**\\ Definisce il " | ||
+ | |||
+ | ==== - Variabili ==== | ||
+ | |||
+ | ^Nome^D^R^A^Condizioni^Descrizione^ | ||
+ | |disksize|L|0|R|-|**Disk Size**\\ Indica la dimensione del dispositivo di memorizzazione in bytes.\\ Il valore è aggiornato al momento dellesecuzione del comando MOUNT.| | ||
+ | |diskfree|L|0|R|-|**Disk Free**\\ Indica lo spazio libero sul dispositivo di memorizzazione in bytes.\\ Il valore è aggiornato al momento dellesecuzione del comando MOUNT ed alla chiusura e scrittura di un file.| | ||
+ | |filesize|L|0|R|-|**File Size**\\ Indica la dimensione del file in bytes.\\ Il valore è aggiornato al momento dellapertura e ad ogni successiva operazione di scrittura.| | ||
+ | |numrecord|L|0|R|st_openfile|**File Record Number**\\ Indica il numero di record presenti nel file.\\ Il valore è aggiornato al momento dellapertura e ad ogni successiva operazione di scrittura.\\ Se 0 significa che il file non contiene record formattati correttamente (viene settata anche la variabile //error//), oppure che si tratta di un nuovo file.| | ||
+ | |numfield|W|0|R|-|**Field Number**\\ Indica il numero di campi presenti nel primo record letto.\\ Il valore è aggiornato al momento della prima apertura o al momento della prima scrittura.| | ||
+ | |record|L|0|R-W|-|**Record Number**\\ Indica il numero di record (//row//) che è processato dai comandi WRITE e READ.\\ Se 1, con il comando WRITE sarà eseguito un accodamento.| | ||
+ | |ilong01÷32|L|0|R|-|**Input Long nr. 1 32**| | ||
+ | |ibyte0|B|0|R|-|**Input Byte 0 (LSB) ilong01**\\ Indica il byte nr. 0 (LSB) della long ilong01| | ||
+ | |ibyte1|B|0|R|-|**Input Byte 1 ilong01**\\ Indica il byte nr. 1 della long ilong01| | ||
+ | |ibyte2|B|0|R|-|**Input Byte 2 ilong01**\\ Indica il byte nr. 2 della long ilong01| | ||
+ | |ibyte3|B|0|R|-|**Input Byte 3 (MSB) ilong01**\\ Indica il byte nr. 3 (MSB) della long ilong01.\\ <code QCL> | ||
+ | obyte3 | ||
+ | obyte2 | ||
+ | obyte1 | ||
+ | obyte0 | ||
+ | |olong01-32|L|0|R-W|-|**Output Long nr. 1 32**| | ||
+ | |obyte0|B|0|R-W|-|**Output Byte 0 (LSB) olong01**\\ Indica il byte nr. 0 (LSB) della long olong01| | ||
+ | |obyte1|B|0|R-W|-|**Output Byte 1 olong01**\\ Indica il byte nr. 1 della long olong01| | ||
+ | |obyte2|B|0|R-W|-|**Input Byte 2 olong01**\\ Indica il byte nr. 2 della long olong01| | ||
+ | |obyte3|B|0|R-W|-|**Input Byte 3 (MSB) olong01**\\ Indica il byte nr. 3 (MSB) della long olong01.\\ <code QCL> | ||
+ | ibyte3 xx------ (MSB) | ||
+ | ibyte2 --xx---- + | ||
+ | ibyte1 ----xx-- + | ||
+ | ibyte0 ------xx (LSB) </ | ||
+ | |errcode|B|0|R|-|**Error Code**\\ Indica lultimo errore occorso nellesecuzione dei comandi di gestione del device.\\ 0 = no error\\ 1 = n.d. (reserved)\\ 2 = open file error\\ 3 = read data error\\ 4 = write data error\\ 5 = file system error (reserved)\\ 6 = file system error (reserved)\\ 7 = file system error (reserved)\\ 8 = file system error (reserved)\\ 9 = file system error (reserved)\\ 10 = record format error\\ 11 = unknow error| | ||
+ | |errvalue|B|0|R|-|**Error Value**\\ Sempre 0.| | ||
+ | |wrncode|B|0|R|-|**Warning Code**\\ Indica lultimo warning occorso nellesecuzione dei comandi di gestione del device.\\ 0 = no warning\\ 1 = warning data\\ 2 = warning command\\ 3 = device not inserted| | ||
+ | |wrnvalue|B|0|R|-|**Warning Value**\\ Sempre 0.| | ||
+ | |||
+ | ==== - Stati ==== | ||
+ | |||
+ | ^Nome^D^R^A^Condizioni^Descrizione^ | ||
+ | |st_mount|F|0|R|-|**Device Mount**\\ Lattivazione indica che è inserito un dispositivo di memorizzazione.\\ Il device verifica la presenza di un nuovo dispositivo a seguito del comando MOUNT.| | ||
+ | |st_openfile|F|0|R|-|**Open file**\\ Lattivazione indica che il file è stato aperto/ | ||
+ | |st_busy|F|0|R|-|**Busy**\\ Lattivazione indica che il sistema è occupato in unoperazione d' | ||
+ | |st_error|F|0|R|-|**Error**| | ||
+ | |st_warning|F|0|R|-|**Warning**| | ||
+ | |||
+ | ==== - Comandi ==== | ||
+ | |||
+ | ^Nome^D^R^A^Condizioni^Descrizione^ | ||
+ | |MOUNT|-|-|-|st_openfile = 0|**Mount Device**\\ Verifica la presenza di un nuovo dispositivo, | ||
+ | |UMOUNT|-|-|-|st_openfile = 0|**Unmount Device**\\ Questo comando serve a chiudere il dispositivo in modo che possa essere rimosso.\\ Lo stato st_mount diventa 0.| | ||
+ | |OPENFILE|-|-|-|st_mount = 1\\ st_openfile = 0|**Open File**\\ Esegue lapertura del file filenum. Se il file non esiste, è creato.\\ Lo stato st_openfile diventa 1.| | ||
+ | |CLOSEFILE|-|-|-|st_openfile = 1|**Close File**\\ Chiude il file filenum.\\ Lo stato st_openfile diventa 0.| | ||
+ | |DELFILE|-|-|-|st_mount = 1\\ st_openfile = 0|**Delete File**\\ Elimina il file filenum. Per essere cancellato, il file deve essere chiuso.| | ||
+ | |READ|-|-|-|st_openfile = 1|**Read Record**\\ Esegue la lettura del record indicato dalla variabile record.\\ Tutti i field letti sono posti nelle variabili ilongXX da ilong01.| | ||
+ | |WRITE|-|-|-|st_openfile = 1|**Append Record**\\ Esegue laccodamento di un nuovo record, prelevando i valori dalle variabili olongXX a partire da olong01.| | ||
+ | |RSERR|-|-|-|-|**Clear Error**\\ Azzera la segnalazione del parametro st_error e le variabili errcode ed errvalue.| | ||
+ | |RSWRN|-|-|-|-|**Clear Warning**\\ Azzera la segnalazione del parametro st_warning e le variabili //wrncode// ed // | ||
+ | |||
+ | |||
+ | ===== - Limitazioni ===== | ||
+ | |||
+ | I dati tipo SINGLE non sono trattati. È necessario convertire questi dati di tipo interno prima di trasferirli nella MMC. | ||
+ | |||
+ | |||
+ | ===== - Esempio applicativo ===== | ||
+ | |||
+ | ==== - VERIFICA DI UN DISPOSITIVO: | ||
+ | |||
+ | <code QCL> | ||
+ | WAIT NOT DEV: | ||
+ | ; è in uno stato di busy finchè non termina | ||
+ | ; le operazioni di inizializzazione. | ||
+ | MOUNT DEV ; esegue il MOUNT del dispositivo | ||
+ | WAIT NOT DEV: | ||
+ | IF DEV: | ||
+ | < | ||
+ | ENDIF | ||
+ | </ | ||
+ | |||
+ | ==== - APERTURA DI UN FILE ==== | ||
+ | |||
+ | <code QCL> | ||
+ | DEV: | ||
+ | DEV:filenum = 123 ; imposta il nome del file come 123.hex | ||
+ | WAIT NOT DEV:st_busy | ||
+ | OPENFILE DEV ; esegui il comando di apertura | ||
+ | WAIT NOT DEV: | ||
+ | IF DEV: | ||
+ | < | ||
+ | ENDIF | ||
+ | </ | ||
+ | |||
+ | ==== - SCRITTURA DI ALCUNI RECORD, A PARTIRE DAL FILE APERTO IN PRECEDENZA: ==== | ||
+ | |||
+ | <code QCL> | ||
+ | DEV:field = 2 ; imposta il numero di campi di cui | ||
+ | ; è composto il record | ||
+ | ; Nota: se il tipo di file è BINARY, | ||
+ | ; questo parametro indica il numero di long | ||
+ | ; che verranno scritte/ | ||
+ | DEV:record = -1 ; indica al device di eseguire loperazione a | ||
+ | ; partire dalla fine del file (accodamento). | ||
+ | DEV:olong01 = 123456 | ||
+ | DEV:olong02 = 654321 | ||
+ | WAIT NOT DEV:st_busy | ||
+ | WRITE DEV ; esegui il comando di scrittura | ||
+ | WAIT NOT DEV: | ||
+ | IF DEV: | ||
+ | < | ||
+ | ENDIF | ||
+ | </ | ||
+ | |||