Funzioni ed FB supporto protocollo NMEA (eLLabNMEALib) ------------------------------------------------------ **Attenzione! Per utilizzare la libreria occorre importarla nel proprio progetto**. Vedere capitolo relativo all'\ `import delle librerie <#ChpLibraryImport>`__. NMEA 0183 (O più comunemente NMEA) è uno standard di comunicazione di dati utilizzato soprattutto in nautica e nella comunicazione di dati satellitari GPS. L'ente che gestisce e sviluppa il protocollo è la National Marine Electronics Association. Questo protocollo si basa sul principio che la fonte, detta talker, può soltanto inviare i dati (sentences) e la ricevente, detta listener, può soltanto riceverli. La libreria **eLLabNMEALib** fornisce una serie di funzioni e blocchi funzione per gestire le sentenze NMEA, in pratica è possibile realizzare programmi con l'ambiente di sviluppo LogicLab che si comportano come listeners di sentenze NMEA. NMEASInterface_v1, NMEA system interface ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eLLabNMEALib_C000 | +-----------------------+-----------------------+ |image0| Questo blocco funzione gestisce l'interfaccia verso un dispositivo che invia sentenze NMEA connesso al dispositivo di I/O definito in **File**, questo è un blocco funzione protetto per utilizzarlo occorre richiedere il codice di protezione, vedi `protezione funzioni e blocchi funzione <#ChpFctFBProtection>`__. E' comunque possibile utilizzarlo liberamente in modo test per 30 Min. L'FB riceve le sentenze NMEA dal dispositivo, ne controlla il prefisso comparandolo con la stringa definita in **DID**, controlla se la sentenza ricevuta è corretta (Controllo sul CRC). L'uscita **Done** si attiva per un loop ad ogni ricezione di sentenza NMEA corretta. L'FB ritorna un **NMEAID** che deve essere passato alle FB collegate (FB di gestione sentenze NMEA). L'uscita **RxString** riportala stringa ricevuta dal dispositivo. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Abilitazione blocco funzione. | +-----------------------------------+-----------------------------------+ | **SpyOn** (BOOL) | Attiva spionaggio. | +-----------------------------------+-----------------------------------+ | **File** (FILEP) | Flusso dati **stream** ritornato | | | dalla funzione **Sysfopen**. | +-----------------------------------+-----------------------------------+ | **DID** (STRING[2]) | Stringa di definizione prefisso | | | dispositivo. | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo per un loop di programma | | | su ricezione sentenza corretta. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop di programma | | | se errore gestione. | +-----------------------------------+-----------------------------------+ | **NMEAID** (@_NMEADATASTRUCT) | ID interfaccia con sistema NMEA | | | da passare alle FB collegate. | +-----------------------------------+-----------------------------------+ | **RxString** (STRING[82]) | Stringa ricevuta dal dispositivo. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#FctSysGetLastError>`__ è possibile rilevare il codice di errore. +------------+----------------------------------------------------------+ | 10017010 | Valore di **File** non definito. | +------------+----------------------------------------------------------+ | 10017020 | FB protetta, terminato tempo funzionamento in modo demo. | +------------+----------------------------------------------------------+ | 10017050 | Timeout esecuzione. | +------------+----------------------------------------------------------+ | 10017070 | Errore case gestione. | +------------+----------------------------------------------------------+ | 10017100~4 | Errore ricezione sentenza NMEA. | +------------+----------------------------------------------------------+ GLLSentence, Geographic Position sentence ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eLLabNMEALib_C000 | +-----------------------+-----------------------+ |image1| Questo blocco funzione esegue la ricezione della sentenza GLL Geographic Position, si collega al blocco funzione **NMEASInterface** di gestione dispositivo NMEA. Occorre passare **NMEAID** in uscita dal blocco funzione di gestione dispositivo. La sentenza GLL contiene le informazioni di latitudine, longitudine ora e fix, esempio di sentenza **$IIGLL,4419.0173,N,00829.6653,E,084550.00,A,2*09**. L'FB controlla correttezza dei campi della sentenza e ne estrae le informazioni di latitudine, longitudine e tempo. L'uscita **Done** si attiva per un loop ad ogni ricezione di sentenza GLL corretta. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Abilitazione blocco funzione. | +-----------------------------------+-----------------------------------+ | **NMEAID** (@_NMEADATASTRUCT) | ID interfaccia con sistema NMEA | | | fornito in uscita dal blocco | | | funzione **MEASInterface**. | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo per un loop di programma | | | su ricezione sentenza GLL | | | corretta. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop di programma | | | se errore sentenza. | +-----------------------------------+-----------------------------------+ | **Latitude** (REAL) | Valore di latitudine indicato | | | nella sentenza, il valore è | | | espresso in frazione di gradi. | | | Valori positivi indicano | | | latitudine nord, valori negativi | | | latitudine sud. | +-----------------------------------+-----------------------------------+ | **Longitude** (REAL) | Valore di longitudine indicato | | | nella sentenza, il valore è | | | espresso in frazione di gradi. | | | Valori positivi indicano | | | longitudine est, valori negativi | | | longitudine ovest. | +-----------------------------------+-----------------------------------+ | **UTCHour** (USINT) | Valore di ora UTC indicato nella | | | sentenza. | +-----------------------------------+-----------------------------------+ | **UTCMinute** (USINT) | Valore di minuti UTC indicato | | | nella sentenza. | +-----------------------------------+-----------------------------------+ | **UTCSecond** (USINT) | Valore di secondi UTC indicato | | | nella sentenza. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#FctSysGetLastError>`__ è possibile rilevare il codice di errore. +------------+------------------------------------------+ | 10018010 | **NMEAID** non definito. | +------------+------------------------------------------+ | 10018020 | **NMEAID** non corretto. | +------------+------------------------------------------+ | 10018100~5 | Errore nel valore di latitudine. | +------------+------------------------------------------+ | 10018200~5 | Errore nel valore di longitudine. | +------------+------------------------------------------+ | 10018300~3 | Errore nel valore ora UTC. | +------------+------------------------------------------+ | 10018400 | Errore acquisizione **Status** sentenza. | +------------+------------------------------------------+ MWVSentence, Wind Speed and Angle sentence ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +-----------------------+-----------------------+ | **Type** | **Library** | +-----------------------+-----------------------+ | FB | eNMEALib_B000 | +-----------------------+-----------------------+ |image2| Questo blocco funzione esegue la ricezione della sentenza MWV wind speed and angle, si collega al blocco funzione **NMEASInterface** di gestione dispositivo NMEA. Occorre passare **NMEAID** in uscita dal blocco funzione di gestione dispositivo. La sentenza MWV contiene le informazioni di velocità e direzione del vento, esempio di sentenza **$IIMWV,120.09,R,4.53,N,A*35**. L'FB controlla correttezza dei campi della sentenza e ne estrae le informazioni di velocità e direzione. L'uscita **Done** si attiva per un loop ad ogni ricezione di sentenza MWV corretta. +-----------------------------------+-----------------------------------+ | **Enable** (BOOL) | Abilitazione blocco funzione. | +-----------------------------------+-----------------------------------+ | **NMEAID** (@_NMEADATASTRUCT) | ID interfaccia con sistema NMEA | | | fornito in uscita dal blocco | | | funzione **MEASInterface**. | +-----------------------------------+-----------------------------------+ | **Done** (BOOL) | Attivo per un loop di programma | | | su ricezione sentenza MWV | | | corretta. | +-----------------------------------+-----------------------------------+ | **Fault** (BOOL) | Attivo per un loop di programma | | | se errore sentenza. | +-----------------------------------+-----------------------------------+ | **WSpeed** (REAL) | Valore di velocità del vento | | | (Nodi). | +-----------------------------------+-----------------------------------+ | **WPAngle** (REAL) | Valore angolo polare (Relative) | | | direzione vento. | +-----------------------------------+-----------------------------------+ **Codici di errore** In caso di errore si attiva l'uscita **Fault**, con `SysGetLastError <#FctSysGetLastError>`__ è possibile rilevare il codice di errore. +------------+------------------------------------------+ | 10020010 | **NMEAID** non definito. | +------------+------------------------------------------+ | 10020020 | **NMEAID** non corretto. | +------------+------------------------------------------+ | 10020100~3 | Errore nel valore di angolo vento. | +------------+------------------------------------------+ | 10020200~3 | Errore nel valore di velocità vento. | +------------+------------------------------------------+ | 10020400 | Errore acquisizione **Status** sentenza. | +------------+------------------------------------------+ **Esempi** """""""""""""""" Ecco un semplice programma che acquisisce le sequenze NMEA da un ricevitore GPS collegato alla porta COM0. **Definizione variabili** |image4| **Esempio ST** *(PTP123B000, ST_GPSInterface)* .. code-block:: none (\* Serial port initialization. \*) IF (SysFirstLoop) THEN Serial.COM:=ADR('COM0'); (\* COM port definition \*) Serial.Baudrate:=9600; (\* Baudrate \*) Serial.Parity:='N'; (\* Parity \*) Serial.DataBits:=8; (\* Data bits \*) Serial.StopBits:=1; (\* Stop bits \*) Serial.DTRManagement:=DTR_AUTO_WO_TIMES; (\* DTR management \*) Serial.DTRComplement:=FALSE; (\* DTR complement \*) Serial.EchoFlush:=FALSE; (\* Received echo flush \*) Serial.DTROnTime:=0; (\* DTR On time delay (mS) \*) Serial.DTROffTime:=0; (\* DTR Off time delay (mS) \*) Serial.FlushTm:=0; (\* Flush time (mS) \*) Serial.RxSize:=0; (\* Rx buffer size \*) Serial.TxSize:=0; (\* Tx buffer size \*) END_IF; (\* Manage the serial port. \*) Serial(Open:=TRUE); (\* Serial port management \*) (\* Execute the NMEA interface. \*) NMEARx.DID:='GP'; (\* Device ID \*) NMEARx.SpyOn:=TRUE; (\* Spy on \*) NMEARx.File:=Serial.File; (\* Data stream \*) NMEARx(Enable:=SysFIsOpen(NMEARx.File)); (\* NMEA device interface FB \*) (\* Acquires the GLL sentence. \*) GLL.NMEAID:=NMEARx.NMEAID; (\* NMEA interface ID \*) GLL(Enable:=TRUE); (\* GLL sentence acquisistion FB \*) (\* Acquires the MWV sentence. \*) MWV.NMEAID:=NMEARx.NMEAID; (\* NMEA interface ID \*) MWV(Enable:=TRUE); (\* MWV sentence acquisistion FB \*) (\* [End of file] \*) .. |image0| image:: media/image1.jpg :width: 1.575in :height: 1.15764in .. |image1| image:: media/image2.jpg :width: 1.55139in :height: 1.70833in .. |image2| image:: media/image3.jpg :width: 1.20833in :height: 1.12569in .. |image3| image:: media/image4.jpg :width: 7.08681in :height: 0.89792in .. |image4| image:: media/image4.jpg :width: 7.08681in :height: 0.89792in