Funzioni ed FB supporto protocollo NMEA (eLLabNMEALib)

Attenzione! Per utilizzare la libreria occorre importarla nel proprio progetto. Vedere capitolo relativo all”import delle librerie.

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. 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 è 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<CR><LF>.

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 è 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<CR><LF>.

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 è 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)

(\* 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] \*)