Questo blocco funzione da eseguire in task Back, gestisce un modem connesso allo stream di comunicazione definito in File, il 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, ne controlla lo stato, controlla se il modem è connesso alla rete, ritorna in Operator l’operatore di rete ed in Rssi il livello del segnale. Nel caso in cui il modem si sganci dalla rete l’FB provvede al suo riaggancio automatico. L’uscita MOk si attiva se il modem è correttamente inizializzato, l’uscita Fault si attiva per un loop di programma in caso di errori di gestione.
E’ previsto il comando Power per la gestione 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 e viene incrementato il numero in Rings.
Approfondimenti
- In questo topic suggerimenti sull’utilizzo del Moden Telit EGX81-W.
Descrizione
Enable (BOOL) Abilitazione blocco funzione, attivandolo viene gestito il modem.
SpyOn (BOOL) Se attivo permette di spiarne il funzionamento.
Type (MODEM_TYPE) Definizione tipo di modem da gestire (Definizione).
File (eFILEP) Stream di comunicazione con il modem.
TPower (TIME) Tempo necessario alla accensione del modem.
TCheck (TIME) Tempo di pausa tra esecuzioni controllo modem.
MOk (BOOL) Modem correttamente inizializzato e funzionante.
Fault (BOOL) Attivo per un loop di programma se errore.
Power (BOOL) Comando di gestione alimentazione modem.
Connect (BOOL) Comando connessione stream di comunicazione al modem.
MMD (_MODEMCOREDATA) Struttura dati utilizzata dagli oggetti di libreria.
CLIPRxD (BOOL) Attivo per un loop di programma ad ogni ricezione CLIP (Tipicamente ad ogni ring).
CLIPNumber (STRING[16]) Stringa con il numero di CLIP ricevuto, si resetta ad ogni check del modem.
Operator (STRING[16]) Stringa con nome operatore telefonico.
Rssi (USINT) Valore potenza segnale radio.
Rings (USINT) Numero ring ricevuti, si resetta ad ogni check del modem. Attenzione, il ring ricevuto non corrisponde al tono di ring riprodotto dal chiamante.
Errors (UDINT) Numero errori esecuzione.

Spionaggio funzionamento
Se SpyOn attivo è possibile utilizzare utilizzare la console di spionaggio per verificare il funzionamento della FB. Sono previsti vari livelli di triggers.
Trigger di spionaggio
16#00000001 | Rx: Visualizzo dati ricevuti da modem. |
16#00000002 | Tx: Visualizzo dati inviati al modem. |
16#10000000 | Lg: Messaggi di log funzionamento. |
16#40000000 | Er: Errori di esecuzione. |
Esempi
Come utilizzare gli esempi.
ST_ModemCoreSerial: Viene gestito un modem connesso alla porta seriale.
ST_ModemCoreTCP: Viene gestito un router WL-R220L, l’esecuzione del programma ser2net permette la gestione dei comandi AT su connessione TCP/IP.
LogicLab (Ptp118, ST_ModemCoreSerial)
PROGRAM ST_ModemCoreSerial
VAR
SMSSend : BOOL; (* SMS send command *)
CLIPNumber : STRING[ 16 ]; (* CLIP number *)
SMSText : STRING[ 128 ]; (* SMS text *)
Sp : SysSerialPort; (* Serial port management *)
Mdm : ModemCore; (* Modem core FB *)
SMSTx : ModemSMSSend; (* Modem SMS send *)
SMSRx : ModemSMSReceive; (* Modem SMS receive *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_ModemCoreSerial"
// *****************************************************************************
// The program shows how to manage a modem through a serial connection.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATIONS
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
// TCP Client 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_ON; //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
// FB Modem initialization.
// TCheck must be set to a value less than TCPClient LifeTm.
// TPower must be set to the time required to modem powering on.
Mdm.Enable:=TRUE; //Enable
Mdm.SpyOn:=TRUE; //Spy On
Mdm.Type:=MODEM_TYPE#EGX81; //Modem type
Mdm.TCheck:=T#30s; //Check time
Mdm.TPower:=T#60s; //Power time
// Set SMS receive parameters.
SMSRx.TCheck:=T#15s; //Check time
END_IF;
// -------------------------------------------------------------------------
// MODEM CORE MANAGEMENT
// -------------------------------------------------------------------------
// Modem core.management.
Sp(Open:=Mdm.Connect); //Serial port management
Mdm(File:=Sp.File); //Modem core management
SMSTx(Modem:=ADR(Mdm)); //Modem SMS send
IF (SMSTx.Fault) THEN SMSTx.Send:=FALSE; END_IF;
IF (SMSTx.Done) THEN SMSTx.Send:=FALSE; END_IF;
SMSRx(Modem:=ADR(Mdm)); //Modem SMS receive
// -------------------------------------------------------------------------
// CALL RING MANAGEMENT
// -------------------------------------------------------------------------
// On a call ring an SMS send is executed.
IF (Mdm.CLIPRxD) THEN
CLIPNumber:=Mdm.CLIPNumber; //CLIP number
SMSTx.Number:=ADR(CLIPNumber); //Phone number
eTO_JUNK(SysVsnprintf(ADR(SMSText), SIZEOF(SMSText), ADR('Call received from: %s$n'), STRING_TYPE, ADR(CLIPNumber)));
SMSTx.Text:=ADR(SMSText); //Text to send
SMSTx.Send:=TRUE; //SMS send command
END_IF;
// -------------------------------------------------------------------------
// SMS RECEPTION
// -------------------------------------------------------------------------
// On a SMS reception an SMS send is executed.
IF (SMSRx.SMSRxD) THEN
CLIPNumber:=SMSRx.Number; //CLIP number
eTO_JUNK(Sysmemmove(ADR(SMSText), SMSRx.SMSText, Sysstrlen(SMSRx.SMSText)+1));
SMSTx.Number:=ADR(CLIPNumber); //Phone number
SMSTx.Text:=ADR(SMSText); //Text to send
SMSTx.Send:=TRUE; //SMS send command
END_IF;
// -------------------------------------------------------------------------
// MANUAL SMS SENDING
// -------------------------------------------------------------------------
// By forcing the command an SMS send is executed.
IF (SMSSend) THEN
SMSSend:=FALSE; //SMS send command
SMSTx.Number:=ADR(CLIPNumber); //Phone number
eTO_JUNK(SysVsnprintf(ADR(SMSText), SIZEOF(SMSText), ADR('Status message, Operator:%s$n'), STRING_TYPE, ADR(Mdm.Operator)));
eTO_JUNK(SysCVsnprintf(ADR(SMSText), SIZEOF(SMSText), ADR(', Rssi:%d'), USINT_TYPE, ADR(Mdm.Rssi)));
SMSTx.Text:=ADR(SMSText); //Text to send
SMSTx.Send:=TRUE; //SMS send command
END_IF;
// [End of file]
LogicLab (Ptp118, ST_ModemCoreTCP)
PROGRAM ST_ModemCoreTCP
VAR
SMSSend : BOOL; (* SMS send command *)
CLIPNumber : STRING[ 16 ]; (* CLIP number *)
SMSText : STRING[ 128 ]; (* SMS text *)
TCPClient : SysTCPClient; (* TCPClient management *)
Mdm : ModemCore; (* Modem core FB *)
SMSTx : ModemSMSSend; (* Modem SMS send *)
SMSRx : ModemSMSReceive; (* Modem SMS receive *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_ModemCoreTCP"
// *****************************************************************************
// The program shows how to manage a modem through a TCP connection. As modem
// is used the WL-R220 router with ser2net program active on port 1000.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATIONS
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
// TCP Client initialization.
TCPClient.PeerAdd:=ADR('192.168.1.1'); //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:=256; //Rx buffer size
TCPClient.TxSize:=256; //Tx buffer size
// FB Modem initialization.
// TCheck must be set to a value less than TCPClient LifeTm.
// TPower must be set to the time required to modem powering on.
Mdm.Enable:=TRUE; //Enable
Mdm.SpyOn:=TRUE; //Spy On
Mdm.Type:=MODEM_TYPE#WLR220; //Modem WLink WL-R220
Mdm.TCheck:=T#30s; //Check time
Mdm.TPower:=T#60s; //Power time
// Set SMS receive parameters.
SMSRx.TCheck:=T#15s; //Check time
END_IF;
// -------------------------------------------------------------------------
// MODEM CORE MANAGEMENT
// -------------------------------------------------------------------------
// Modem core.management.
TCPClient(Connect:=Mdm.Connect); //TCPClient management
Mdm(File:=TCPClient.File); //Modem core management
SMSTx(Modem:=ADR(Mdm)); //Modem SMS send
IF (SMSTx.Fault) THEN SMSTx.Send:=FALSE; END_IF;
IF (SMSTx.Done) THEN SMSTx.Send:=FALSE; END_IF;
SMSRx(Modem:=ADR(Mdm)); //Modem SMS receive
// -------------------------------------------------------------------------
// CALL RING MANAGEMENT
// -------------------------------------------------------------------------
// On a call ring an SMS send is executed.
IF (Mdm.CLIPRxD) THEN
CLIPNumber:=Mdm.CLIPNumber; //CLIP number
SMSTx.Number:=ADR(CLIPNumber); //Phone number
eTO_JUNK(SysVsnprintf(ADR(SMSText), SIZEOF(SMSText), ADR('Call received from: %s$n'), STRING_TYPE, ADR(CLIPNumber)));
SMSTx.Text:=ADR(SMSText); //Text to send
SMSTx.Send:=TRUE; //SMS send command
END_IF;
// -------------------------------------------------------------------------
// SMS RECEPTION
// -------------------------------------------------------------------------
// On a SMS reception an SMS send is executed.
IF (SMSRx.SMSRxD) THEN
CLIPNumber:=SMSRx.Number; //CLIP number
eTO_JUNK(Sysmemmove(ADR(SMSText), SMSRx.SMSText, Sysstrlen(SMSRx.SMSText)));
SMSTx.Number:=ADR(CLIPNumber); //Phone number
SMSTx.Text:=ADR(SMSText); //Text to send
SMSTx.Send:=TRUE; //SMS send command
END_IF;
// -------------------------------------------------------------------------
// MANUAL SMS SENDING
// -------------------------------------------------------------------------
// By forcing the command an SMS send is executed.
IF (SMSSend) THEN
SMSSend:=FALSE; //SMS send command
SMSTx.Number:=ADR(CLIPNumber); //Phone number
eTO_JUNK(SysVsnprintf(ADR(SMSText), SIZEOF(SMSText), ADR('Status message, Operator:%s$n'), STRING_TYPE, ADR(Mdm.Operator)));
eTO_JUNK(SysCVsnprintf(ADR(SMSText), SIZEOF(SMSText), ADR(', Rssi:%d'), USINT_TYPE, ADR(Mdm.Rssi)));
SMSTx.Text:=ADR(SMSText); //Text to send
SMSTx.Send:=TRUE; //SMS send command
END_IF;
// [End of file]