Funzioni ed FB di utilità sistema

SysGetSysTime, get system time

image0

Type Library
Function XTarget_07_0

Questa funzione ritorna il tempo di sistema espresso in μS. E” possibile definire con il valore di Cmd se si vuole avere il tempo di sistema attuale (Cmd:=TRUE) oppure quello memorizzato con la precedente esecuzione della funzione (Cmd:=FALSE). Il valore di conteggio parte da 0 e dopo 4294 Secondi si resetta.

Parametri funzione:

Cmd (BOOL)

Indica il valore di tempo che deve essere ritornato.

TRUE: Viene salvato e ritornato il valore attuale di tempo.

FALSE: Viene ritornato il tempo salvato dalla precedente chiamata con Cmd:=TRUE.

La funzione ritorna:

(UDINT) Tempo di sistema espresso in μS.

Esempi

Viene calcolato il tempo in cui l’ingresso digitale Di00M00 rimane nella condizione di attivo.

Definizione variabili
image1

Esempio ST (PTP116A000, ST_SysGetSysTime)

(\* Check if input is activated. \*)
IF (Di00M00 <> Pulse) THEN
Pulse:=Di00M00; (\* Pulse flag \*)
(\* On input raising edge relate time is saved. \*)
IF (Di00M00) THEN StartTime:=SysGetSysTime(TRUE); END_IF;
(\* On input falling edge the set time is calculated. \*)
IF (NOT(Di00M00)) THEN SetTime:=SysGetSysTime(TRUE)-StartTime; END_IF;
END_IF;

Calcolo timeout

Essendo il valore di tempo di sistema ritornato dalla funzione un numero UDINT che si incrementa ogni μS, ed al valore massimo esegue overflow a zero, non è possibile effettuare comparazioni dirette con il tempo di riferimento ma occorre sempre eseguire la differenza.

Nel seguente esempio viene attivato Timeout se l’ingresso Di00M00 rimane attivo per più di un secondo.

IF NOT(Di00M00) THEN TimeBf:=SysGetSysTime(TRUE);
ELSE IF ((SysGetSysTime(TRUE)-TimeBf) >= 1000000) THEN Timeout:=TRUE;
END_IF;
END_IF;

Lo stesso esempio scritto in questo modo non funziona correttamente.

IF NOT(Di00M00) THEN TimeBf:=SysGetSysTime(TRUE);

ELSE IF (SysGetSysTime(TRUE) >= (TimeBf+1000000)) THEN Timeout:=TRUE;
END_IF;

END_IF;

Semplice cronometro

Questo esempio realizza un semplice cronometro per misurare il tempo che intercorre tra un comando di start ed il comando di stop. Utilizzando ad esempio due fotocellule una sulla linea di start ed una sulla linea di stop di un percorso è possibile calcolare il tempo di percorrenza espresso in μS.

Attivando l’ingresso di start Di00M00 viene salvato il tempo di sistema allo start nella variabile StartTime, attivando l’ingresso di stop Di01M00 viene calcolato il tempo trascorso tra il tempo salvato allo start ed il tempo nel momento di stop. Il tempo calcolato è salvato nella variabile DelayTime.

Definizione variabili
image2

Esempio LD (PTP119A000)

image3

SysGetUTC DateTime, get the system Date/Time on UTC

image4

Type Library
Function XTarget_12_0

Questa funzione ritorna la Data/Ora di sistema in UTC, il valore è espresso in Epoch Time.

Parametri funzione:

Cmd (BOOL) Deve sempre essere TRUE.

La funzione ritorna:

(UDINT) Valore Data/Ora di sistema in UTC, il valore è espresso in Epoch Time.

SysSetUTC DateTime, set the system Date/Time on UTC

image5

Type Library
Function XTarget_12_0

Questa funzione imposta la Data/Ora di sistema in UTC, il valore è espresso in Epoch Time.

Impostando il valore di Data/Ora viene anche aggiornato il Real Time Clock di sistema.

Parametri funzione:

UTCDateTime (UDINT) Valore Data/Ora di sistema in UTC, il valore è espresso in Epoch Time.

La funzione ritorna:

(BOOL) FALSE: Errore esecuzione, TRUE: Esecuzione Ok.

SysTimeZoneAdj, adjust date and time

image6

Type Library
Function XTarget_12_0

Questa funzione permette di calcolare il valore di Data/Ora locale partendo dal valore UTC utilizzando il valore di TimeZone e DaylightZone definiti.

Parametri funzione:

UTCDateTime (UDINT) Valore di Date/Time in epoch time (UTC).
TimeZone (SINT) Fuso orario numero che indica la differenza in ore dell’ora locale rispetto al Tempo Coordinato Universale (UTC) riferito al meridiano di Greenwich. Per l’Italia il valore da definire è +1.
DaylightZone (USINT)

Zona di cambio ora legale, il sistema provvede automaticamente al cambio di ora in base alla zona definita. Le zone sono 3 (Per l’Italia occorre impostare 1).

0) Nessun cambiamento di ora legale.

1) Europa, ora legale da Aprile ad Ottobre.

2) USA, ora legale da Aprile a Novembre.

La funzione ritorna:

(UDINT) Valore di Date/Time in epoch time (Locale).

Codici di errore

In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.

9940100 Errore TimeZone
9940110 Errore Daylight

Esempi

Ad ogni secondo viene calcolato il valore di Data/Ora locale per l’Italia.

Definizione variabili
image7
Esempio LD (PTP116B000, LD_SysTimeZoneAdj)

image8

Sysmemset, memory set

image9

Type Library
Function XTarget_12_0

Questa funzione riempie l’area di memoria definita in Buf con il dato definito in Ch. In Size occorre definire la dimensione dell’area da riempire.

La funzione ritorna l’indirizzo dell’area di memoria da riempire.

Parametri funzione:

Buf (@USINT) Indirizzo dell’area di memoria da riempire.
Ch (INT) Dato di riempimento.
Size (UDINT) Dimensione dell’are da riempire.

La funzione ritorna:

(@USINT) Indirizzo dell’area di memoria da riempire.

Codici di errore

In caso di errore la funzione torna NULL e con SysGetLastError è possibile rilevare il codice di errore.

9931100 Pointer Buff non valido.

Esempi

Attivando Cmd viene scritto tutto l’array Buffer con il dato 16#55.

Definizione variabili
image10

Esempio LD (PTP116B000, LD_Sysmemset)

image11

Sysmemmove, memory move

image12

Type Library
Function XTarget_12_0

Questa funzione copia l’area di memoria definita in Src nell’area di memoria definita in Dest per la dimensione definita in Size. Le due aree di memoria possono anche sovrapporsi.

La funzione ritorna l’indirizzo dell’area di memoria di destinazione.

Parametri funzione:

Dest (@USINT) Indirizzo dell’area di memoria di destinazione.
Src (@USINT) Indirizzo dell’area di memoria di origine.
Size (UDINT) Dimensione dell’are da copiare.

La funzione ritorna:

(@USINT) Indirizzo dell’area di memoria di destinazione.

Codici di errore

In caso di errore la funzione torna NULL e con SysGetLastError è possibile rilevare il codice di errore.

9930100 Pointer Dest non valido.

Esempi

Attivando Cmd vengono trasferiti i primi 10 bytes di Source in Destination.

Definizione variabili
image13

Esempio LD (PTP116B000, LD_Sysmemmove)

image14

Systolower, converts a given letter to lowercase

image15

Type Library
Function XTarget_12_0

Questa funzione converte un carattere dal formato maiuscolo nel corrispondente carattere in formato minuscolo.

Parametri funzione:

Ch (INT) Carattere da convertire.

La funzione ritorna:

(INT) Carattere nel formato minuscolo.

Esempi

La variabile Upper viene convertita nel corrispondente valore minuscolo e trasferita in Lower. Il valore di inizializzazione 16#41 che corrisponde alla lettera A, viene convertito nel valore 16#61 che corrisponde alla lettera a.

Definizione variabili
image18

Esempio LD

image19

Esempio IL

LD Upper (\* Uppercase letter \*)
Systolower (\* Uppercase to lowercase letter conversion \*)
ST Lower (\* Lowercase letter \*)

Esempio ST

Lower:=Systolower(Upper); (\* Uppercase to lowercase letter
conversion \*)

Systoupper, Lowercase to uppercase letter conversion

image20

Type Library
Function XTarget_12_0

Questa funzione converte un carattere dal formato minuscolo nel corrispondente carattere in formato maiuscolo.

Parametri funzione:

Ch (INT) Carattere da convertire.

La funzione ritorna:

(INT) Carattere nel formato maiuscolo.

Esempi

La variabile Lower viene convertita nel corrispondente valore maiuscolo e trasferita in Upper. Il valore di inizializzazione 16#61 che corrisponde alla lettera a, viene convertito nel valore 16#41 che corrisponde alla lettera A.

Definizione variabili
image23

Esempio LD

image24

Esempio IL

LD Lower (\* Lowercase letter \*)
Systoupper (\* Lowercase to uppercase letter conversion \*)
ST Upper (\* Lowercase letter \*)

Esempio ST

Upper:=Systoupper(Lower); (\* Lowercase to uppercase letter conversion \*)

SysSetTaskLpTime, set task loop time

Type Library
Function XTarget_07_0

Questa funzione permette di impostare il tempo di esecuzione delle tasks PLC. Esistono due tasks eseguite a tempo la task slow ID_TASK_SLOW e la task fast ID_TASK_FAST, ad ognuna di queste task può essere assegnato un tempo di esecuzione.

Se il tempo impostato non è compreso nel range definito o se il rapporto tra i tempi di esecuzione della task fast rispetto alla slow non sono coerenti la funzione non modifica i tempi di esecuzione e ritorna FALSE. Di seguito sono riportati i range di tempo definibili per le varie tasks.

ID_TASK_FAST Range da 100 μS a 10 mS
ID_TASK_SLOW Range da 1 a 100 mS

Parametri funzione:

TaskID (USINT) Identifica la task a cui si vuole definire il tempo di esecuzione secondo le definizioni in Task ID.
Time (UDINT) Indica il valore di tempo di esecuzione task espresso in μS.

La funzione ritorna:

(BOOL)

TRUE: Se funzione eseguita correttamente

FALSE: In caso di errore esecuzione, esempio parametri errati.

Codici di errore

In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.

9948990 Non implementata nel simulatore.

Esempi

Attivando l’ingresso Di00M00 viene impostato un tempo di esecuzione di 5 ms per la task PlcFast.

Attenzione! Per aumentare i tempi di esecuzione delle tasks dal valore di default occorre eseguire la funzione nella task di boot.

Definizione variabili
image26

Esempio LD (PTP116A000, LD_SysSetTaskLpTime)

Esempio ST

Enabled:=Di00M00; (\* Function enabled \*)
IF Di00M00 THEN
ExecutionOk:=SysSetTaskLpTime(TaskID:=ID_TASK_FAST, Time:=5000); (\* Function execution ok \*)
END_IF;

SysGetRandom, get random number

image27

Type Library
Function XTarget_07_0

Questa funzione ritorna un numero random compreso tra 0.0 e 1.0. E” possibile definire con il valore di Cmd se si vuole avere un nuovo numero random (Cmd:=TRUE) oppure quello memorizzato con la precedente esecuzione della funzione (Cmd:=FALSE).

Parametri funzione:

Cmd (BOOL)

Indica il numero random ritornato.

TRUE: Viene salvato e ritornato un nuovo numero random.

FALSE: Viene ritornato il numero salvato dalla precedente chiamata con Cmd:=TRUE.

La funzione ritorna:

(REAL) Un numero random compreso nel range da 0.0 a 1.0.

Esempi

Attivando l’ingresso digitale Di00M00 viene inviato sulla porta seriale COM0 una sequenza di 10 numeri random.

Definizione variabili
image28

Esempio ST (PTP116A000, ST_SysGetRandom)

(\* Here the COM0 port is opened in read/write. \*)
IF (Fp = NULL) THEN
Fp:=Sysfopen('COM0', 'rw'); (\* Port COM0 file pointer \*)
END_IF;
(\* Check if input is activated. \*)
IF (Di00M00 <> Pulse) THEN
Pulse:=Di00M00; (\* Pulse flag \*)
(\* On input raising edge print out 10 random numbers. \*)
IF (Di00M00) THEN
FOR i:=0 TO (9) BY 1 DO
RandomNr:=TO_UINT(SysGetRandom(TRUE)*1000.0); (\* Random number \*)
NrOfChars:=SysVarfprintf(Fp, 'Rn:%03d$r$n', UINT_TYPE, ADR(RandomNr));
END_FOR;
END_IF;
END_IF;

Collegando un terminale seriale alla porta COM0 impostato a 115200,e,8,1 vedremo un elenco del tipo:

Rn:437
Rn:488
Rn:898
...
Rn:261
Rn:944

SysGetLastError, get last error

image29

Type Library
Function XTarget_07_0

Questa funzione ritorna il numero dell’ultimo errore rilevato da una funzione e/o da un blocco funzione. Occorre eseguire la funzione su abilitazione del bit di fault in uscita dalla funzione e/o blocco funzione da controllare. E” possibile definire con il valore di Cmd se si vuole avere il valore attuale dell’ultimo errore (Cmd:=TRUE) oppure quello memorizzato con la precedente esecuzione della funzione (Cmd:=FALSE).

Parametri funzione:

Cmd (BOOL)

Indica il numero di errore ritornato.

TRUE: Viene ritornato l’ultimo valore di errore.

FALSE: Viene ritornato il numero salvato dalla precedente chiamata con Cmd:=TRUE.

La funzione ritorna:

(UDINT) Il numero dell’ultimo errore rilevato

Esempi

Viene salvato l’eventuale errore durante l’esecuzione del blocco funzione SysGetPhrDI. In caso di errore il numero di errore è trasferito nella variabile Error.

Definizione variabili
image30

Esempio LD

image31

SysOSIDValue, get or set an operative system variable

image32

Type Library
Function XTarget_12_0

Questa funzione permette di leggere e/o impostare variabili del sistema operativo. In OSID occorre specificare la variabile su cui operare.

In caso di lettura Wr:=FALSE il valore della variabile sarà trasferito nel buffer di memoria indicato in Val. In caso di scrittura lettura Wr:=TRUE il valore presente nel buffer di memoria indicato in Val sarà trasferito nella variabile.

Occorre dimensionare il buffer coerentemente con il tipo di dato relativo all”OSID definito. In uscita dalla funzione avremo TRUE se funzione eseguita correttamente, FALSE in caso di errore e con la SysGetLastError è possibile acquisire l’errore.

Parametri funzione:

Wr (BOOL)

Tipo di operazione da eseguire

FALSE: Lettura, il valore della variabile è trasferito nel buffer definito in Val.

TRUE: Scrittura, il valore del buffer definito in Val è trasferito nella variabile.

OSID (UDINT) Identificativo variabile, vedi tabella.
Val (@USINT) Pointer al buffer di memoria che contiene il valore della variabile.

La funzione ritorna:

(BOOL)

FALSE: Errore esecuzione.

TRUE: Funzione eseguita correttamente.

Codici di errore

In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.

9924100 Scrittura non consentita.
9924110 Lettura non consentita.
9924120 OSID non valido.
9926990 Non presente nel simulatore

Esempi

Viene acquisito l’indirizzo IP impostato sull’interfaccia di rete Ethernet dello SlimLine. Il valore è ritornato in IP.

Definizione variabili
image33

Esempio LD (PTP116B000,LD_SysOSIDValue)

image34

SysPCodeAccept, accepts the protection code

Type Library
Function XTarget_07_0

Alcune funzioni di programma e/o blocchi funzione possono essere protetti da un codice che deve essere ordinato separatamente. Per abilitare l’esecuzione della funzione e/o del blocco funzione occorre sbloccarlo definendone il codice con questa funzione.

La funzione controlla il codice fornito e ritorna TRUE se codice accettato. Vedere capitolo Protezione funzioni e blocchi funzione per ulteriori informazioni.

Parametri funzione:

Code (STRING[20]) Codice di protezione.

La funzione ritorna:

(BOOL) TRUE: Codice verificato ID relativo sbloccato. FALSE: Codice non verificato.

Codici di errore

In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.

9991100 Valore di Code non corretto.
9991990 Non implementata nel simulatore.

Esempi

E” riportato un semplice programma che esegue il controllo sul codice di sblocco “abcdefghijklmnopqrst“. Se il codice è corretto viene attivata la variabile CodeAccepted.

Definizione variabili
image37

Esempio LD (PTP116A000,LD_SysPCodeAccept)

image38

Esempio ST

(\* Check the protection code. \*)
CodeAccepted:=SysPCodeAccept('abcdefghijklmnopqrst'); (\* Protection code accepted \*)

SysGetCheck, gets the check

image39

Type Library
Function XTarget_12_0

Questa funzione funzione esegue il calcolo del pattern di controllo su di un’area dati. Il calcolo è effettuato secondo il tipo indicato nel parametro Type.

Occorre passare alla funzione l’indirizzo del buffer di memoria Buf ed il numero di bytes ByteNr su cui eseguire il calcolo. Occorre anche indicare un valore di inizializzazione del calcolo che cambia in funzione del tipo di pattern di controllo calcolato.

Parametri funzione:

Buf (@USINT) Indirizzo dell’area di memoria su cui eseguire il calcolo.
ByteNr (UDINT) Numero di bytes su cui eseguire il calcolo a partire dall’indirizzo definito in Buf.
Init (UDINT) Valore di inizializzazione del calcolo.
Type (UISNT) Tipo di calcolo da eseguire (Vedi tabella).

La funzione ritorna:

(UDINT) Valore pattern di controllo calcolato.

Codici di errore

In caso di errore viene ritornato 0 e con SysGetLastError è possibile rilevare il codice di errore.

9938100 Tipo calcolo errato.

Esempi

Viene calcolato il CRC di un frame Modbus RTU per il comando di lettura registri Read holding registers. Il valore del CRC calcolato è 17466 (16#443A).

Definizione variabili
image41

Esempio ST (PTP116B000, ST_SysGetCheck)

(\* Define the registers address and the number of registers to read.
\*)
(\* +--+--+--+--+--+--+-+-+ \*)
(\* \|Nd|03|Addr \|NumR \|CRC\| \*)
(\* +--+--+--+--+--+--+-+-+ \*)
RegsAddress:=16#0120; (\* Registers address \*)
NrOfRegs:=8; (\* Number of registers \*)
(\* Prepare the command frame. \*)
Frame[0]:=1; (\* Node address \*)
Frame[1]:=3; (\* Function code (16#03) \*)
Frame[2]:=TO_USINT(RegsAddress/256); (\* MSB registers address \*)
Frame[3]:=TO_USINT(RegsAddress&255); (\* LSB registers address \*)
Frame[4]:=0; (\* MSB number of registers to read \*)
Frame[5]:=NrOfRegs; (\* LSB number of registers to read \*)
(\* Calculate the frame CRC. \*)
CRCValue:=SysGetCheck(Buf:=ADR(Frame[0]), ByteNr:=6, Init:=16#FFFF,
Type:=CRC_16_MODBUS);
Frame[6]:=TO_USINT(CRCValue/256); (\* MSB of CRC value \*)
Frame[7]:=TO_USINT(CRCValue&255); (\* LSB of CRC value \*)

SysMAlloc, memory allocation

image42

Type Library
Function XTarget_07_0

Questa funzione esegue l’allocazione di uno spazio di memoria della dimensione in byte definita da parametro Size. La funzione ritorna il puntatore allo spazio di memoria allocato.

La memoria è allocata nella memoria di sistema e quindi non utilizza la memoria a disposizione del programma utente. Nel caso in cui non vi sia spazio in memoria per l’allocazione del buffer definito, la funzione ritorna 0.

Parametri funzione:

Size (UDINT) Dimensione in bytes dell’area da allocare.

La funzione ritorna:

(@USINT) Indirizzo allocazione buffer. NULL se non vi è spazio per allocare il buffer.

Codici di errore

In caso di errore la funzione torna NULL e con SysGetLastError è possibile rilevare il codice di errore.

9947990 Non implementata nel simulatore.

Esempi

Su fronte attivazione ingresso Di00M00 viene incrementata la variabile Counter e la stampa del suo valore trasferita nell’array StringOut. Il valore presente in StringOut viene poi inviato sulla porta seriale COM0.

Definizione variabili
image44

Esempio ST (PTP116A300, ST_SysMAlloc)

(\* Here at first program execution loop allocate memory and open COM. \*)
IF (SysFirstLoop) THEN
StringOut:=SysMAlloc(16); (\* String output pointer \*)
Fp:=Sysfopen('COM0', 'rw'); (\* Port COM0 file pointer \*)
END_IF;
IF ((StringOut = 0) OR (Fp = 0)) THEN RETURN; END_IF;
(\* On input raising edge the counter value is printed. \*)
IF (Di00M00 <> Pulse) THEN
Pulse:=Di00M00; (\* Pulse flag \*)
IF (Di00M00) THEN
Counter:=Counter+1; (\* Counter \*)
NrOfChars:=SysVarsnprintf(StringOut, 32, 'Counter:%04d$r$n',
UDINT_TYPE, ADR(Counter));
FOR i:=0 TO NrOfChars DO
Ch:=Sysfputc(TO_INT(@StringOut), Fp); (\* Written character \*)
StringOut:=StringOut+1; (\* String output pointer \*)
END_FOR;
END_IF;
END_IF;

SysRMAlloc, relocatable memory allocation

image45

Type Library
Function XTarget_12_0

Questa funzione esegue l’allocazione di uno spazio di memoria della dimensione in byte definita da parametro Size. L’indirizzo alla memoria allocata è salvato nella variabile DataPtr. La funzione ritorna FALSE se errore allocazione e TRUE se memoria allocata.

La memoria è allocata nella memoria di sistema e quindi non utilizza la memoria a disposizione del programma utente. La memoria allocata viene automaticamente rilocata dal sistema operativo per ottimizzare lo spazio. Quindi prima di utilizzarla occorre sempre fare riferimento all’indirizzo memorizzato in DataPtr.

Parametri funzione:

Size (UDINT) Dimensione in bytes dell’area da allocare.
DataPtr (UDINT) Buffer indirizzo memoria allocata.

La funzione ritorna:

(BOOL) FALSE: Errore allocazione memoria, TRUE: Memoria allocata

Codici di errore

In caso di errore la funzione torna NULL e con SysGetLastError è possibile rilevare il codice di errore.

9933100 Funzione eseguita in task diversa da Slow e Back.
9933110 Valore di Size errato.
9933990 Non implementata nel simulatore.

Esempi

Su fronte attivazione ingresso Di00M00 viene incrementata la variabile Counter e la stampa del suo valore trasferita nell’array StringOut. Il valore presente in StringOut viene poi inviato sulla porta seriale COM0.

Definizione variabili
image47

Esempio ST (PTP116B000, ST_SysRMAlloc)

(\* Here at first program execution loop open COM. \*)
IF (SysFirstLoop) THEN Fp:=Sysfopen('COM0', 'rw'); END_IF;
(\* Check if input is activated. \*)
IF (Di00M00 <> Pulse) THEN
Pulse:=Di00M00; (\* Pulse flag \*)
IF (Di00M00) THEN
Counter:=Counter+1; (\* Counter \*)
IF (SysRMAlloc(16, ADR(StringOut))) THEN
NrOfChars:=SysVarsnprintf(StringOut, 14+1, 'Counter:%04d$r$n',
UDINT_TYPE, ADR(Counter));
NrOfChars:=Sysfwrite(StringOut, NrOfChars, 1, Fp);
Dummy:=SysRMFree(ADR(StringOut));
END_IF;
END_IF;
END_IF;

SysRMFree, relocatable memory free

image48

Type Library
Function XTarget_12_0

Questa funzione esegue la disallocazione di uno spazio di memoria precedentemente allocato da una funzione SysRMAlloc. Occorre fornire l’indirizzo alla memoria allocata nella variabile DataPtr. La funzione ritorna FALSE se errore disallocazione e TRUE se memoria disallocata.

Nota: Non è possibile disallocare la memoria allocata con la funzione SysMAlloc.

Parametri funzione:

DataPtr (UDINT) Buffer indirizzo memoria allocata. Deve essere un indirizzo di memoria valido non è accettato NULL.

La funzione ritorna:

(BOOL) FALSE: Errore disallocazione memoria, TRUE: Memoria disallocata

Codici di errore

In caso di errore la funzione torna NULL e con SysGetLastError è possibile rilevare il codice di errore.

9934100 Funzione eseguita in task diversa da Slow e Back.
9934990 Non implementata nel simulatore.

Esempi

Vedere esempio fornito con funzione SysRMAlloc.

SysGetEnd ianness, get the system endianness

image49

Type Library
Function XTarget_12_0

Questa funzione ritorna il tipo di endianness del sistema.

Se sistema Little-Endian, memorizzazione che inizia dal byte meno significativo per finire col più significativo, la funzione ritorna FALSE.

Se sistema Big-Endian, memorizzazione che inizia dal byte più significativo per finire col meno significativo, la funzione ritorna TRUE.

Parametri funzione:

Cmd (BOOL) Deve sempre essere TRUE.

La funzione ritorna:

(BOOL) FALSE: Sistema Little-Endian, TRUE: Sistema Big-Endian

SysSpyData, system spy data

image50

Type Library
Function XTarget_11_0

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 TRUE se vi è spazio per salvare il record spiato e FALSE se la console è occupata.

Parametri funzione:

Mode (USINT) Definisce il modo di visualizzazione dei dati spiati, Spy mode.
TFlags (UDINT) Definisce i bits di trigger per la visualizzazione dei dati spiati.
Label (@USINT) Etichetta riportata nella stringa spiata.
DPtr (@USINT) Puntatore alla stringa dati da spiare.

La funzione ritorna:

(BOOL) TRUE: Spionaggio possibile. FALSE: Console di spionaggio occupata.

Codici di errore

In caso di errore la funzione torna FALSE e con SysGetLastError è possibile rilevare il codice di errore.

9950100 FB usata in task diversa da Back.
9950200 Errore allocazione memoria funzione.
9950990 Non implementata nel simulatore.

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——————————————–

I campi ora e ritardo dallo spy record precedente sono di lunghezza costante (15 Caratteri). Il campo Label con i dati di spionaggio possono raggiungere in totale 65 caratteri.

Nota

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 al 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

Ecco un esempio di programma che invia ad ogni secondo tre records alla console di spionaggio.

Definizione variabili
image51

Esempio ST (PTP116A400, ST_SysSpyData)

(* Init the string to be spied and check if there is space to spy. *) TString:=”Hello!$r$n”; (* Text string *) IF NOT(SysSpyData(0, 0, NULL, NULL))THEN RETURN; END_IF; (* Check if is a second pulse. *) IF (SysClock1000 = SpyPulse) THEN RETURN; END_IF; SpyPulse:=SysClock1000; (* Spy data pulse *) (* Send 3 spy data records. *) ABf:=SysSpyData(SPY_ASCII, 16#00000001, ADR(“Sp 1”), ADR(TString)); ABf:=SysSpyData(SPY_ASCHEX, 16#00000010, ADR(“Sp 2”), ADR(TString)); ABf:=SysSpyData(SPY_BINARY+8, 16#00000100, ADR(“Sp 3”), ADR(TString));

Console di spionaggio

image52

Per attivare la console di spionaggio occorre accedere al sistema in Telnet, (Fare riferimento al Manuale riferimento comandi Telnet CPU SlimLine). Con il comando SpyData si attiva la console di spionaggio e sono visualizzati i vari records dati.