ModemCore, modem core management

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

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.

Information Circle

Blocco funzione

CODESYS: Non disponibile

LogicLab: eLLabModemLib

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.
Nell’esempio è gestito un router WL-R220L in cui è in esecuzione il programma ser2net che permette la gestione dei comandi AT su di una connessione TCP/IP. Il programma gestisce sia la ricezione che l’invio di messaggi SMS.

LogicLab (Ptp118, ST_ModemCore)
PROGRAM ST_ModemCore
VAR
    i : UDINT; (* Auxiliary variable *)
    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_ModemCore"
// *****************************************************************************
// 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.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
        i:=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
        i:=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
        i:=SysVsnprintf(ADR(SMSText), SIZEOF(SMSText), ADR('Status message, Operator:%s$n'), STRING_TYPE, ADR(Mdm.Operator));
        i:=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?