Questa funzione permette di inviare dati alla console di spionaggio (Accessibile da Telnet con il comando SpyData). É possibile definire sia il modo di visualizzazione dei dati spiati Mode che abbinare una etichetta nella stringa spiata Label.

Con il parametro TFlags è possibile definire un pattern di 32 bits che viene usato come trigger per la visualizzazione dei dati spiati nella console di spionaggio Telnet.

Eseguendo la funzione con tutti i parametri a “0” viene eseguito il controllo sullo spazio nella console di spionaggio Telnet.

La funzione ritorna una varaibile (BOOL), TRUE se vi è spazio per salvare il record spiato e FALSE se la console è occupata.

Function
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib

Mode (USINT) Definisce il modo di visualizzazione dei dati spiati.

TFlags (UDINT) Definisce i bits di trigger per la visualizzazione dei dati spiati.

Label (@STRING) Etichetta riportata nella stringa spiata.

DPtr (@STRING) Puntatore alla stringa dati da spiare.

La funzione ritorna un (BOOL) FALSE se console di spionaggio occupata, TRUE se funzione eseguita correttamente.

Errori

In caso di errore la funzione ritorna FALSE, eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.

Record di spy

Il record di spy visualizzato nella console di spionaggio ha lunghezza totale di 80 caratteri, tipicamente è un record del tipo:

00:00:00(0000)|Label|Spy data string--------------------------------------------

Il record inizia con un campo ora, seguito dal tempo intercorso dal record precedente (in mS) nel caso il tempo sia superiore ai 10 secondi viene visualizzato (9999).

I primi due campi hanno lunghezza costante (15 Caratteri), a seguire racchiuso tra i caratteri | vi è la stringa indicata nel parametro Label, a seguire i dati di spionaggio. Il campo Label con i dati di spionaggio possono raggiungere in totale 65 caratteri, se la stringa da spiare è più lunga viene tagliata.

Nel caso in cui vengano persi records di spionaggio al posto del tempo intercorso verrà visualizzato (----). Per evitare di perdere records di spionaggio è possibile eseguire la funzione con i parametri azzerati controllandone il ritorno.

IF (SysSpyData(0, 0, NULL, NULL)) THEN
    i:=SysSpyData(SPY_ASCII, 16#00000001, ADR('Lbl'), ADR('This is a spy record'));
END_IF;

Mode SPY_BINARY

Se si definisce come Mode il modo SPY_BINARY occorre anche definire il numero di bytes da visualizzare della stringa da spiare. Il numero và sommato alla definizione di modo, quindi ipotizzando di voler visualizzare solo 8 bytes avremo una definizione del tipo:

i:=SysSpyData(SPY_BINARY+8, 16#00000100, ADR('Sp 3'), ADR(TString));

Nel caso la lunghezza della stringa da spiare sia maggiore di 80 occorre limitarla per evitare di avere una errata definizione di Mode. Ipotizzando in un programma di voler spiare un buffer la cui dimensione potrebbe essere superiore a quella accettata, dovremo scrivere qualcosa del tipo:

IF (SIZEOF(SpyBuffer) < 80) THEN i:=SIZEOF(SpyBuffer); ELSE i:=80; END_IF;
i:=SysSpyData(SPY_BINARY+TO_USINT(i), 16#00000001, ADR('Spy'), ADR(SpyBuffer));

Esempi

Come utilizzare gli esempi.
Con tempi random compresi tra 1mS e 1 secondo sono inviati 3 messaggi alla console di spionaggio, per evitare di perdere messaggi, prima dell'invio del messaggio viene verificato se vi è spazio nel buffer di spionaggio. Ogni messaggio ha Mode diverso ed è contraddistinto da una etichetta che lo identifica. Ecco il risultato visibile dalla console di spionaggio.

11:19:28(.674)|Sp 1|Hello!..                                                    
11:19:28(.169)|Sp 2|Hello![0D][0A]
11:19:28(.005)|Sp 3|48 65 6C 6C 6F 21 0D 0A 00 00 00 00 00 00 00 00 00 00 00 00
11:19:29(.916)|Sp 1|Hello!..
11:19:30(.744)|Sp 2|Hello![0D][0A]
11:19:31(.943)|Sp 3|48 65 6C 6C 6F 21 0D 0A 00 00 00 00 00 00 00 00 00 00 00 00
LogicLab (Ptp116)
PROGRAM ST_SysSpyData
VAR
    i : UDINT; (* Auxiliary buffer *)
    CaseNr : USINT; (* Program case *)
    TimeBf : UDINT; (* Time buffer (uS) *)
    WTime : REAL; (* Wait time (S) *)
    TString : STRING[ 32 ]; (* Text string *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysSpyData"
// *****************************************************************************
// Sends to spy console 3 data records.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // PROGRAM INIT
    // -------------------------------------------------------------------------
    // Program init.

    IF (SysFirstLoop) THEN
        TString:='Hello!$r$n'; //Text string
        TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS)
        WTime:=1.0; //Wait time (S)
    END_IF;

    // -------------------------------------------------------------------------
    // SEND SPY DATA RECORDS
    // -------------------------------------------------------------------------
    // Check if there is space to spy.

    IF NOT(SysSpyData(0, 0, NULL, NULL))THEN RETURN; END_IF;

    // Wait a random time between 0.1 to 1 second.

    IF ((SysGetSysTime(TRUE)-TimeBf) < TO_UDINT(WTime*1000000.0)) THEN RETURN; END_IF;
    TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS)
    WTime:=0.001+(SysGetRandom(TRUE)*0.999); //Wait time (S)

    // Change the program case.

    CaseNr:=CaseNr+1; //Program case
    IF (CaseNr > 2) THEN CaseNr:=0; END_IF;

    // Send spy message.

    CASE (CaseNr) OF
        0: i:=SysSpyData(SPY_ASCII, 16#00000001, ADR('Sp 1'), ADR(TString)); //Ascii mode
        1: i:=SysSpyData(SPY_ASCHEX, 16#00000010, ADR('Sp 2'), ADR(TString)); //Extended ascii mode
        2: i:=SysSpyData(SPY_BINARY+8, 16#00000100, ADR('Sp 3'), ADR(TString)); //Binary mode
    END_CASE;

// [End of file]

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 2 Dicembre 2019