Funzioni ed FB gestione modem (eLLabModemLib)

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

Le funzioni ed i blocchi funzione per la gestione del modem utilizzano un modem GSM connesso ad un terminale di I/O del sistema (Tipicamente è utilizzata una porta seriale). Nel modem deve essere inserita una tessera SIM non protetta dal codice PIN.

Nella descrizioni successive si fa riferimento alle seguenti definizioni generali.

Numero di telefono

Il numero di telefono consiste in una stringa lunga da 10 a 16 caratteri numerici conforme al seguente formato:

Prefisso internazionale senza lo zero davanti (es. +39 per Italia, +49 per Germania, +44 per Gran Bretagna ecc.)

Codice dell’operatore mobile (es. 338, 320, 347, ecc.)

Numero di telefono (es. 7589951)

Esempio: +393337589951,+3933812345,+49172123456

Messaggio SMS

Un messaggio SMS può essere lungo fino a 160 caratteri alfanumerici facenti parte del seguente set:

A…Z, a…z, 0…9, Spazio bianco, sono da evitare tutti gli altri caratteri.

ModemCore_v5, modem core management

Type Library
FB eModemLib_E200

image0

Questo blocco funzione gestisce un modem 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 gestisce il dialogo con il modem, ne esegue l’inizializzazione e ne controlla lo stato, controlla se il modem è connesso alla rete GSM e ritorna l’operatore di rete Operator ed il livello del segnale Rssi. Nel caso in cui il modem si sganci dalla rete l’FB provvede al suo riaggancio automatico. L’FB ritorna un ModemID che deve essere passato alle FB collegate (Esempio invio SMS, ricezione SMS, ecc.).L’ingresso SpyOn se attivo permette di spiare il funzionamento della FB.

L’uscita Done si attiva se il modem è correttamente inizializzato, mentre l’uscita Fault si attiva per un loop di programma in caso di errori di gestione.

E” previsto un comando PowerOn per la gestione della alimentazione del modem, in questo modo l’FB può spegnere e riaccendere il modem in caso riscontri una non funzionalità dello stesso.

Su ricezione chiamata telefonica viene rilevato il CLIP del chiamante che è ritornato in uscita CLIPNumber, contemporaneamente ad ogni squillo del telefono si attiva per un loop di programma l’uscita CLIPRxd. Su connessione GPRS viene ritornato l’indirizzo IP assegnato dal gestore alla connessione IPAddress.

Enable (BOOL) Abilitazione blocco funzione, attivandolo viene gestito il modem.
AutoHangUp (BOOL) Abilita l’HangUp automatico alla ricezione di una chiamata telefonica, viene comunque ritornato il CLIP.
SpyOn (BOOL) Se attivo permette di spiarne il funzionamento.
Type (USINT)

Definizione tipo di modem da gestire.

0: Configurazione adatta a tutti modem standard.

1: Configurazione per gestire router Advantech.

File (FILEP) Flusso dati stream ritornato dalla funzione Sysfopen.
APN (STING[32]) Definizione APN per connessione GPRS. Se non definito disabilitata gestione GPRS.
DNS (STING[16]) Definizione indirizzo IP server DNS. Se non definito disabilitata gestione GPRS.
Enabled (BOOL) Blocco funzione abilitato.
Done (BOOL) Modem correttamente inizializzato e funzionante.
Fault (BOOL) Attivo per un loop di programma se errore gestione modem.
PowerOn (BOOL) Comando di gestione uscita alimentazione modem.
CLIPRxd (BOOL) Attivo per un loop di programma ad ogni ricezione CLIP (Tipicamente ad ogni RING del modem).
ModemID (UDINT) ID modem da passare alle FB collegate
CnStatus (USINT)

Stato connessione.

0:
Not registred
1:
Registered to home network
2:
Not Registered but ME is
currently searching for a new
3:
Registration denied.
4:
Unknown (Not used)
5:
Registered roaming.
Operator (STRING[16]) Contiene la stringa con il nome dell’operatore telefonico.
Rssi (USINT) Valore potenza segnale radio.
CLIPNumber (STRING[16]) Contiene la stringa con il numero di CLIP ricevuto.
IPAddress (STING[16]) Indirizzo IP assegnato dal gestore su connessione GPRS.

Trigger di spy

Se SpyOn attivo viene eseguita la funzione SysSpyData che permette di spiare il funzionamento della FB. Sono previsti vari livelli di triggers.

TFlags Descrizione
16#00000001 “Rx” Ricezione stringa da modem
16#00000002 “R>” Stringa ricevuta da modem troppo lunga
16#00000004 “Tx” Trasmissione stringa verso modem
16#00000010 “Mr” Ricezione messaggio SMS
16#01000000 “–” Etichette di segnalazione operazioni modem

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

Codice Descrizione
10002010 Valore di File non definito.
10002020 FB protetta, terminato tempo funzionamento in modo demo.
10002050 Timeout esecuzione.
10002080 Errore case gestione.
10002100 FB eseguita in task diversa da quella di background.
10002200~3 Errore ricezione CLIP.
10002300~4 Errore nelle sequenze power on del modem.
10002400~15 Errore nelle sequenze di controllo del modem.
10002500~7 Errore nella ricezione del messaggio SMS.

Esempi

Forniamo di seguito due esempi di utilizzo del FB ModemCore in linguaggio FBD. Nel primo viene gestito un modem standard (Esempio il BGS2 della Gemalto) connesso in seriale sulla porta “COM0”. Nel secondo viene gestito un router (UR5v2 della Advatech) connesso in ethernet con indirizzo IP 192.168.0.184 sulla porta 1000.

Il FB ModemCore gestisce in uscita la variabile ModemID che deve essere passata a tutti i FB relativi al modem. Negli esempi riportati con i successivi FB, ci si collegherà a questa variabile per il riferimento al modem.

Definizione variabili

image1

Esempio FBD (Ptp118b400, FBD_ModemCoreSerial)

image2

Esempio ST (Ptp118b400, ST_ModemCoreSerial)

(\* Program initializations. \*)
IF (SysFirstLoop) THEN
(\* Serial port initialization. \*)
Sp.COM:=ADR('COM0'); (\* COM port definition \*)
Sp.Baudrate:=115200; (\* Baudrate \*)
Sp.Parity:='N'; (\* Parity \*)
Sp.DataBits:=8; (\* Data bits \*)
Sp.StopBits:=1; (\* Stop bits \*)
Sp.DTRManagement:=DTR_OFF; (\* DTR management \*)
Sp.DTRComplement:=FALSE; (\* DTR complement \*)
Sp.EchoFlush:=FALSE; (\* Received echo flush \*)
Sp.DTROnTime:=0; (\* DTR On time delay (mS) \*)
Sp.DTROffTime:=0; (\* DTR Off time delay (mS) \*)
Sp.FlushTm:=0; (\* Flush time (mS) \*)
Sp.RxSize:=0; (\* Rx buffer size \*)
Sp.TxSize:=0; (\* Tx buffer size \*)
(\* Modem initialization. \*)
Mdm.Type:=0; (\* Modem type: Any serial modem \*)
Mdm.SpyOn:=TRUE; (\* Spy On \*)
Mdm.AutoHangUp:=FALSE; (\* Auto hangup \*)
Mdm.APN:=ADR('M2Mbis.vodafone.it'); (\* APN definition \*)
Mdm.DNS:=ADR('8.8.8.8'); (\* DNS definition \*)
END_IF;
(\* Eseguo gestione modem core. \*)
Sp(Open:=TRUE); (\* Serial port management \*)
Mdm.File:=Sp.File; (\* File pointer \*)
Mdm(Enable:=Sp.Opened); (\* Gestione modem core \*)
(\* [End of file] \*)

Definizione variabili

image3

Esempio FBD (Ptp118b400, FBD_ModemCoreEthernet)

image4

Esempio ST (Ptp118b400, ST_ModemCoreEthernet)

(\* Program initializations. \*)
IF (SysFirstLoop) THEN
(\* TCP Client initialization. \*)
TCPClient.PeerAdd:=ADR('192.168.0.184'); (\* Peer address \*)
TCPClient.PeerPort:=1000; (\* Peer port \*)
TCPClient.LocalAdd:=ADR('0.0.0.0'); (\* Local address \*)
TCPClient.LocalPort:=0; (\* Local port \*)
TCPClient.FlushTm:=50; (\* Flush time (mS) \*)
TCPClient.LifeTm:=60; (\* Life time (S) \*)
TCPClient.RxSize:=128; (\* Rx buffer size \*)
TCPClient.TxSize:=128; (\* Tx buffer size \*)
(\* Modem initialization. \*)
Mdm.Type:=1; (\* Modem type: Router Advantech \*)
Mdm.SpyOn:=FALSE; (\* Spy On \*)
Mdm.AutoHangUp:=TRUE; (\* Auto hangup \*)
Mdm.APN:=NULL; (\* APN definition \*)
Mdm.DNS:=NULL; (\* DNS definition \*)
END_IF;
(\* Eseguo gestione modem core. \*)
TCPClient(Connect:=TRUE); (\* TCPClient management \*)
Mdm.File:=TCPClient.File; (\* File pointer \*)
Mdm(Enable:=TCPClient.Connected); (\* Gestione modem core \*)
(\* [End of file] \*)

ModemSMSReceive_v1, receive a SMS message

Type Library
FB eModemLib_E000

image5

Questo blocco funzione esegue la ricezione di un messaggio SMS, si collega al blocco funzione di gestione modem ModemCore, occorre passare il ModemID in uscita dal blocco funzione di gestione modem.

Alla ricezione di un messaggio SMS si attiva per un loop di programma l’uscita Done, sull’uscita SMSText viene ritornato l’indirizzo del buffer con il messaggio ricevuto, all’uscita CLIPNumber della FB ModemCore è ritornato il numero di telefono da cui il messaggio è stato ricevuto. L’indirizzo del buffer messaggio ricevuto rimane presente in uscita per un solo loop di programma.

Enable (BOOL) Abilita la ricezione dei messaggi SMS.
ModemID (UDINT) ID modem fornito in uscita dalla ModemCore.
Done (BOOL) Attivo per un loop se ricevuto messaggio SMS.
Fault (BOOL) Attivo per un loop se errore.
Text (@STRING) Indirizzo del buffer con il messaggio SMS ricevuto (Lunghezza massima 160 caratteri).

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

10003010 ModemID non definito.
10003020 ModemID non corretto.

Esempi

Nell’esempio è gestita la ricezione di un messaggio SMS dal modem definito nella variabile ModemID.

Definizione variabili

image6

Esempio LD (Ptp118b400, FBD_ModemSMReceive)

image7

ModemSMSRxCmd_v1, receive a SMS command

Type Library
FB eModemLib_E000

image8

Questo blocco funzione esegue la ricezione di un comando tramite un messaggio SMS, si collega al blocco funzione di gestione modem ModemCore, occorre passare il ModemID in uscita dal blocco funzione di gestione modem.

Alla ricezione di un messaggio SMS se nel testo del messaggio è presente la stringa definita in Command, si attiva per un loop di programma l’uscita Done, all’uscita CLIPNumber della FB ModemCore è ritornato il numero di telefono da cui il messaggio è stato ricevuto.

Attivando Cin il controllo sulla stringa definita in Command verrà fatto non considerando il case (Maiuscolo/minuscolo) dei caratteri.

Enable (BOOL) Abilita la ricezione del comando.
ModemID (UDINT) ID modem fornito in uscita dalla ModemCore.
CIn (BOOL) Se attivo, controllo di Command non considerando case (Maiuscolo/minuscolo) dei caratteri.
Command (@USINT) Pointer al testo del comando da eseguire.
Done (BOOL) Attivo per un loop se ricevuto messaggio SMS contenente il testo indicato in Command.
Fault (BOOL) Attivo per un loop se errore.

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

10004010 ModemID non definito.
10004020 ModemID non corretto.

Esempi

Nell’esempio è gestito un comando di Accensione/Spegnimento di una uscita logica su ricezione messaggio SMS dal modem definito nella variabile ModemID.

Definizione variabili

image9

Esempio LD (Ptp118b200, LD_ModemSMSRxCmd)

image10

ModemSMSSend_v2, send a SMS message

Type Library
FB eModemLib_E000

image11

Questo blocco funzione esegue l’invio di un messaggio SMS, si collega al blocco funzione di gestione modem ModemCore, occorre passare alla FB il ModemID in uscita dal blocco funzione di gestione modem.

Su fronte attivazione ingresso di Send viene prenotato l’invio del messaggio, non appena sarà possibile il messaggio definito in Text verrà inviato al numero definito in Number. Terminato l’invio verrà attivata per un loop di programma l’uscita Done.

TLgt definisce il numero di caratteri da inviare del messaggio definito in Text, se non definito o definito “0” viene inviato l’intero messaggio Text.

Send (BOOL) Sul fronte di attivazione comanda l’invio del messaggio SMS. Attenzione! Il messaggio sarà inviato non appena il modem è libero per l’invio.
ModemID (UDINT) ID modem fornito in uscita dalla ModemCore.
Number (@USINT) Pointer al numero di telefono a cui eseguire l’invio del messaggio.
TLgt (UDINT) Numero di caratteri del messaggio da inviare. Se “0” viene inviato l’intero messaggio.
Text (@USINT) Pointer al testo messaggio da inviare.
Done (BOOL) Attivo per un loop al termine dell’invio del messaggio SMS.
Fault (BOOL) Attivo per un loop se errore invio messaggio SMS.

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

10005010 ModemID non definito.
10005020 ModemID non corretto.
10005080 Errore case gestione.
10005100~3 Errore gestione invio SMS.

Esempi

Nell’esempio attivando l’ingresso Di00CPU viene eseguito l’invio di un messaggio SMS sul modem definito nella variabile ModemID.

Definizione variabili

image12

Esempio LD (Ptp118b200, LD_ModemSMSSend)

image13

Invio di un messaggio a più numeri

Molte volte succede di dover inviare su un evento (Esempio ingresso digitale) diversi messaggi SMS ognuno con il proprio testo a diversi numeri telefonici. Il blocco funzione ModemSMSend permette la gestione dell’invio sullo stesso evento di più messaggi, ogni messaggio è contraddistinto dal numero di telefono e dal testo del messaggio.

Nell’esempio è gestito l’invio di un messaggio a più numeri di telefono. Come si può vedere attivando l’ingresso digitale Di01CPU verranno inviati due messaggi a due diversi numeri di telefono. E” possibile aggiungere altri rami con il blocco funzione ModemSMSSend ognuno con il proprio messaggio e numero di telefono sempre attivati dallo stesso ingresso.

Definizione variabili

image14

Esempio LD (Ptp118b200, LD_ModemSMSSendMultiple)

image15

ModemPhoneCall_v1, executes a phone call

Type Library
FB eModemLib_E000

image16

Questo blocco funzione esegue una chiamata telefonica al numero indicato, si collega al blocco funzione di gestione modem ModemCore, occorre passare il ModemID in uscita dal blocco funzione di gestione modem.

Su fronte attivazione ingresso di Call viene prenotata l’esecuzione della chiamata, non appena sarà possibile verrà eseguita la chiamata al numero definito in Number. Terminato il tempo definito in Time la chiamata verrà terminata. Se non vi sono problemi verrà attivata per un loop di programma l’uscita Done.

Call (BOOL) Sul fronte di attivazione comanda “esecuzione della chiamata. Attenzione! La chiamata verrà eseguita non appena il modem è libero.
ModemID (UDINT) ID modem fornito in uscita dalla ModemCore.
Number (@USINT) Pointer al numero di telefono da chiamare.
Time (UINT) Tempo di durata chiamata (Sec).
Done (BOOL) Attivo per un loop al termine della esecuzione chiamata.
Fault (BOOL) Attivo per un loop se errore esecuzione chiamata.

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

10037010 ModemID non definito.
10037020 ModemID non corretto.
10037080 Errore case gestione.
10037100~3 Errore gestione chiamata telefonica.

Esempi

Nell’esempio è gestita una chiamata al numero indicato. Dopo 15 secondi la chiamata viene conclusa.

Definizione variabili

image17

Esempio LD (Ptp118b200, LD_ModemPhoneCall)

image18

ModemHTTPGet, executes a HTTP Get request

Type Library
FB eModemLib_E000

image19

Questo blocco funzione esegue una richiesta HTTP inserendo in linea dei parametri GET, si collega al blocco funzione di gestione modem ModemCore, occorre passare il ModemID in uscita dal blocco funzione di gestione modem.

Su fronte attivazione ingresso Send viene eseguita la connessione al Server HTPP sulla porta Port, e richiesta la pagina Page. La pagina viene richiesta con i parametri GET definiti nel buffer puntato da GETPars. La pagina ricevuta dal server viene trasferita nel buffer puntato da RxBuffer, i dati ricevuti che superano la dimensione del buffer RxSpace sono scartati.

Terminata la ricezione della pagina richiesta si attiva per un loop l’uscita Done, se pagina non è ritornata nel tempo definito in TimeOut l’esecuzione termina con errore.

Send (BOOL) Sul fronte di attivazione comanda richiesta pagina HTTP. Attenzione! La richiesta verrà eseguita non appena il modem è libero.
ModemID (UDINT) ID modem fornito in uscita dalla ModemCore.
Server (@USINT) Pointer alla stringa di definizione del server HTTP.
Port (UINT) Porta su cui effettuare la connessione.
Page (@USINT) Pointer alla stringa di definizione pagina richiesta.
GETPars (@USINT) Pointer alla stringa parametri GET da inserire nella richiesta (Max 512 caratteri).
RxBuffer (@USINT) Pointer al buffer di ricezione pagina richiesta (Max 360 caratteri).
RXSpace (UINT) Dimensione in bytes del buffer di ricezione pagina.
TimeOut (UINT) Tempo massimo attesa ricezione pagina (mS).
Done (BOOL) Attivo per un loop al termine della ricezione pagina.
Fault (BOOL) Attivo per un loop se errore ricezione pagina.

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

10042010 ModemID non definito.
10042020 ModemID non corretto.
10042080 Errore case gestione.
10042100~8 Errore gestione richiesta pagina da server HTTP.
10042200 Stringa GET parametri troppo lunga.

Esempi

L’utilizzo tipico di questa FB è di collegarsi ad un server HTTP dove sono eseguite pagine script (ASP, PHP, Phyton, ecc) richiedendo la pagina fornendo in linea alla chiamata dei parametri in GET. Lo script della pagina potrà eseguire operazioni con i dati passati in linea e ritornare dei valori come risultato.

Definizione variabili

image21

Esempio ST (Ptp118b200, ST_ModemHTTPGet)

(\* Program initializations. \*)
IF (SysFirstLoop) THEN
HTTP.ModemID:=ModemID; (\* Modem ID \*)
HTTP.Server:=ADR('slimline.altervista.org'); (\* HTTP server \*)
HTTP.Page:=ADR('Mdp095a000/Ptp118b200/Division.php'); (\* Page name \*)
HTTP.Port:=80; (\* HTTP port \*)
HTTP.TimeOut:=5000; (\* Connection timeout (mS) \*)
HTTP.GETPars:=ADR(TxBuffer); (\* GET parameters pointer \*)
HTTP.RxBuffer:=ADR(RxBuffer); (\* Rx buffer pointer \*)
HTTP.RxSpace:=30; (\* Rx buffer space \*)
END_IF;
(\* Create the GET parameters string to add to page request. \*)
IF (HTTP.Send) THEN
i:=SysVarsnprintf(ADR(TxBuffer), SIZEOF(TxBuffer), 'Dividend=%.3f', REAL_TYPE, ADR(Dividend));
i:=SysLWVarsnprintf(ADR(TxBuffer), SIZEOF(TxBuffer), '&Divisor=%.3f', REAL_TYPE, ADR(Divisor));
END_IF;
(\* Execute the "ModemHTTPGet" FB and count the execution errors. \*)
HTTP();
HTTP.Send:=FALSE;
IF (HTTP.Fault) THEN HTTPCECtr:=HTTPCECtr+1; END_IF;
(\* If a correct TCP packet has been received, acquire the value. \*)
IF (HTTP.Done) THEN
IF NOT(SysVarsscanf(SysStrFind(ADR(RxBuffer), ADR('The result is:'),
FIND_GET_END), '%f', REAL_TYPE, ADR(Result))) THEN
Result:=0.0; (\* Division result \*)
END_IF;
END_IF;
(\* Execute HTTP connection on command. \*)
IF (Di00CPU <> Pulse) THEN
Pulse:=Di00CPU; (\* Auxiliary pulse \*)
IF (Pulse) THEN HTTP.Send:=TRUE; END_IF;
END_IF;
(\* [End of file] \*)

Vediamo di spiegare come funziona il programma, sul fronte di attivazione dell’ingresso Di00CPU viene effettuata la connessione al server www.slimline.altervista.org e richiesta l pagina Mdp095a000/Ptp118b200/Division.php. In linea alla chiamata della pagina sono posti i campi GET Dividend=200.0&Divisor=10.0.

Sul server è presente una pagina con uno script PHP che esegue la divisione e ritorna il risultato. Il funzionamento dello script si può testare con un comune browser digitando l’indirizzo:

**http:****\www.slimline.altervista.orgMdp095a000/Ptp118b200/Division.php?Dividend=200.0&Divisor=10.0

Se lo script funziona nella pagina del browser verrà visualizzato:

The result is: 20

Lo script PHP sul server è del tipo:

<?php echo «The result is: «.($_REQUEST[«Dividend»]/$_REQUEST[«Divisor»]); ?>

Come si vede lo script invia in echo il risultato della divisione. I parametri posti in GET alla richiesta sono automaticamente trasferiti negli statements $_REQUEST[“Dividend”] e $_REQUEST[“Divisor”]. Come si vede è quindi possibile passare in GET allo script tutti i valori che si desiderano.

Il valore di ritorno dallo script definito con lo statement echo verrà trasferito nel buffer RxBuffer del nostro programma e quindi è possibile operare su di esso con le istruzioni di gestione stringa.