Vai al contenuto

ModemCore, modem core management

Vai all indice del manuale di programmazione

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.

Immagine FB_ModemCore

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#00000001Rx: Visualizzo dati ricevuti da modem.
16#00000002Tx: Visualizzo dati inviati al modem.
16#10000000Lg: Messaggi di log funzionamento.
16#40000000Er: 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]
Was this article helpful?