Vai al contenuto

CLIServer, manages a command-line user interface

Vai all indice del manuale di programmazione
Tipo: Blocco funzione
Libreria LogicLab: eLLabUtyLib
Libreria Codesys: Non disponibile

Questo function block da eseguire in task Back, gestisce l’interfaccia a linea di comando in modalità server. In CBSize occorre indicare la dimensione del buffer di ricezione comandi. In CBegin e CBLength è possibile definire un’eventuale stringa di inizio comando. In CEnd e CELength è possibile definire un’eventuale stringa di fine comando.

Alla ricezione dei dati dallo stream di comunicazione definito in Fp se attivo EchoOn viene eseguito l’echo dei dati ricevuti. Se definita la stringa di inizio comando i dati ricevuti dopo la stringa sono sono trasferiti nel buffer.

Se non definita stringa di fine comando si attende di non ricevere più caratteri per il tempo definito in CWTime e si attiva per un loop Done, in CBuffer sono presenti tutti i dati ricevuti, RxChrs ne ritorna il numero.

Se definita stringa di fine comando alla sua ricezione si attiva per un loop Done, in CBuffer sono presenti tutti i dati ricevuti, RxChrs ne ritorna il numero. Se definito CWTime alla ricezione della stringa di fine comando si attende di non ricevere più caratteri per il tempo definito prima di attivare Done.

In caso di errore viene attivata per un loop di programma l’uscita Fault.

Descrizione

Enable (BOOL) Abilita ricezione comando. Terminata la ricezione di un comando per ricevere un nuovo comando disabilitare e poi riabilitare questo ingresso.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB (Vedi articolo).
EchoOn (BOOL) Se attivo viene eseguita la ritrasmissione del carattere ricevuto.
Fp (FILEP) Flusso dati stream da utilizzare per la comunicazione.
CBSize (UDINT) Dimensione buffer memorizzazione comando.
CBegin (PVOID) Puntatore alla stringa di definizione inizio comando. Se eNULL non viene controllata.
CBLength (UDINT) Dimensione stringa inizio comando. Se 0 non viene controllata.
CEnd (PVOID) Puntatore alla stringa di definizione fine comando. Se eNULL non viene controllata.
CELength (UDINT) Dimensione stringa fine comando. Se 0 non viene controllata.
CWTime (TIME) Tempo di attesa fine ricezione caratteri.
Timeout (TIME) Timeout esecuzione.
Done (BOOL) Si attiva su ricezione comando. Si disattiva su disabilitazione ingresso Enable.
Fault (BOOL) Attivo in caso di errore.
RxChrs (UDINT) Lunghezza stringa comando ricevuta.
CBuffer (PVOID) Puntatore a buffer comando ricevuto.

Immagine FB CLIServer

Trigger di spy

Se SpyOn attivo  è possibile utilizzare la console di spionaggio per verificare il funzionamento della FB. Sono previsti vari livelli di triggers.

Livelli di trigger
TriggerDescrizione
16#00000001Rx: Ricezione comando.
16#40000000Er: Errore esecuzione

Esempi

Come utilizzare gli esempi.
Connettendosi al programma con un emulatore di terminale (Esempio l’utility Terminal di Toolly) è possibile inviare dei comandi che saranno eseguiti. Il comando Help ritorna l’elenco dei comandi gestiti.

LogicLab (Ptp114, ST_CLIServer)
PROGRAM ST_CLIServer
VAR
    CaseNr : USINT; (* Program case *)
    HIDx : UDINT; (* Help Index *)
    Fp : eFILEP; (* File pointer array *)
    LDTValue : LDATE_AND_TIME; (* Long Date/Time value *)
    AStr : STRING[ 64 ]; (* Auxiliary string *)
    TCPServer : SysTCPServer; (* TCPServer management *)
    CLI : CLIServer; (* Command line interface server *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_CLIServer"
// *****************************************************************************
// By connecting to the program with a terminal emulator (for example the
// Terminal utility of Toolly) it's possible send commands that will be
// executed. The Help command returns the list of managed commands.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Program initializations.

    IF (SysFirstLoop) THEN

        // TCPClient initialization.

        TCPServer.FilesArr:=ADR(Fp); //Files array
        TCPServer.LocalAdd:=ADR('0.0.0.0'); //Local address
        TCPServer.LocalPort:=3000; //Local port
        TCPServer.MaxConn:=1; //Accepted connections
        TCPServer.FlushTm:=50; //Flush time (mS)
        TCPServer.LifeTm:=30; //Life time (S)
        TCPServer.RxSize:=128; //Rx buffer size
        TCPServer.TxSize:=256; //Tx buffer size

        // Command line interface initialization.

        CLI.SpyOn:=FALSE; //Spy On
        CLI.EchoOn:=TRUE; //Echo On
        CLI.CBSize:=512; //Command buffer size
        CLI.CBegin:=eNULL; //Command begin
        CLI.CBLength:=0; //Command begin length
        CLI.CEnd:=ADR('$r'); //Command end
        CLI.CELength:=Sysstrlen(CLI.CEnd); //Command end length
        CLI.CWTime:=T#100ms; //Character waiting
        CLI.Timeout:=T#10s; //Timeout
    END_IF;

    // -------------------------------------------------------------------------
    // FBs EXECUTION
    // -------------------------------------------------------------------------
    // Manage the FBs.

    TCPServer(Enable:=TRUE); //TCPServer management
    CLI(Fp:=Fp); //Command interface server
    IF NOT(SysFIsOpen(Fp)) THEN CaseNr:=0; RETURN; END_IF;

    // Checks if space enough in output buffer to contain answer message.

    IF (SysFGetOSpace(Fp) < 128) THEN RETURN; END_IF;

    // -------------------------------------------------------------------------
    // PROGRAM SEQUENCIES
    // -------------------------------------------------------------------------
    // Manage the program sequencies.

    CASE (CaseNr) OF

        // ---------------------------------------------------------------------
        // WAITING THE COMMAND
        // ---------------------------------------------------------------------
        // Welcome message.

        0:
        CLI.Enable:=FALSE; //CLI server enable
        eTO_JUNK(SysVfprintf(Fp, ADR('$n%s > '), STRING_TYPE, ADR('Command')));
        HIDx:=0; //Help Index
        CaseNr:=CaseNr+1; //Program case

        // ---------------------------------------------------------------------
        // Waiting the command reception.

        1:
        CLI.Enable:=TRUE; //CLI server enable
        IF NOT(CLI.Done) THEN RETURN; END_IF;
        CaseNr:=0; //Program case

        // Checks the received command and jump to management case. Otherwise
        // jump to case 0 and resend the prompt.

        IF (SysStrFind(CLI.CBuffer, ADR('?'), FIND_DEFAULT OR FIND_NO_CASE) <> eNULL) THEN CaseNr:=10; END_IF;
        IF (SysStrFind(CLI.CBuffer, ADR('Help'), FIND_DEFAULT OR FIND_NO_CASE) <> eNULL) THEN CaseNr:=10; END_IF;
        IF (SysStrFind(CLI.CBuffer, ADR('Time'), FIND_DEFAULT OR FIND_NO_CASE) <> eNULL) THEN CaseNr:=20; END_IF;

        // ---------------------------------------------------------------------
        // HELP COMMAND
        // ---------------------------------------------------------------------
        // Return command descriptions.

        10:
        CASE (HIDx) OF         
            0: eTO_JUNK(SysVfprintf(Fp, ADR('Help, %s$r$n'), STRING_TYPE, ADR('Help using commands')));
            1: eTO_JUNK(SysVfprintf(Fp, ADR('Time, %s$r$n'), STRING_TYPE, ADR('Returns system date and time')));
            2: CaseNr:=0; //Program case
        END_CASE;
        HIDx:=HIDx+1; //Help Index

        // ---------------------------------------------------------------------
        // Help command.

        20:
        LDTValue:=TO_LDATE_AND_TIME(SysDateGetNs()); //Long Date/Time value
        eTO_JUNK(DateTimeFormat(LDTValue, ADR('^"Date" d\/m\/Y "Time" H\:i\:s$r$n'), ADR(AStr), SIZEOF(AStr)));
        eTO_JUNK(Sysfwrite(ADR(AStr), TO_INT(LEN(AStr)), 1, Fp));
        CaseNr:=0; //Program case
    END_CASE;

// [End of file]
Was this article helpful?