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.

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
Trigger | Descrizione |
---|---|
16#00000001 | Rx: Ricezione comando. |
16#40000000 | Er: 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]