Passa al contenuto principale

CLIServer, manages a command-line user interface

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​

Immagine FB CLIServer

ParametroTipoDescrizione
EnableBOOLAbilita ricezione comando. Terminata la ricezione di un comando per ricevere un nuovo comando disabilitare e poi riabilitare questo ingresso.
SpyOnBOOLSe attivo permette di spiare il funzionamento della FB (Vedi articolo).
EchoOnBOOLSe attivo viene eseguita la ritrasmissione del carattere ricevuto.
FpFILEPFlusso dati stream da utilizzare per la comunicazione.
CBSizeUDINTDimensione buffer memorizzazione comando.
CBeginPVOIDPuntatore alla stringa di definizione inizio comando. Se eNULL non viene controllata.
CBLengthUDINTDimensione stringa inizio comando. Se 0 non viene controllata.
CEndPVOIDPuntatore alla stringa di definizione fine comando. Se eNULL non viene controllata.
CELengthUDINTDimensione stringa fine comando. Se 0 non viene controllata.
CWTimeTIMETempo di attesa fine ricezione caratteri.
TimeoutTIMETimeout esecuzione.
DoneBOOLSi attiva su ricezione comando. Si disattiva su disabilitazione ingresso Enable.
FaultBOOLAttivo in caso di errore.
RxChrsUDINTLunghezza stringa comando ricevuta.
CBufferPVOIDPuntatore a buffer comando ricevuto.

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]