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)* .. code-block:: none (\* 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. .. code-block:: none 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. .. code-block:: none 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 <#sysgetlasterror-get-last-error>`__ è 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 <#sysgetlasterror-get-last-error>`__ è 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 <#sysgetlasterror-get-last-error>`__ è 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** .. code-block:: none LD Upper (\* Uppercase letter \*) Systolower (\* Uppercase to lowercase letter conversion \*) ST Lower (\* Lowercase letter \*) **Esempio ST** .. code-block:: none 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** .. code-block:: none LD Lower (\* Lowercase letter \*) Systoupper (\* Lowercase to uppercase letter conversion \*) ST Upper (\* Lowercase letter \*) **Esempio ST** .. code-block:: none 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 <#TabTaskIDDefs>`__. | +-----------------------------------+-----------------------------------+ | **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 <#sysgetlasterror-get-last-error>`__ è 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** .. code-block:: none 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)* .. code-block:: none (\* 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: .. code-block:: none 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 <#sysgetlasterror-get-last-error>`__ è 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 <#TabOSIDDefs>`__. | +-----------------------------------+-----------------------------------+ | **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 <#sysgetlasterror-get-last-error>`__ è 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 <#ChpFctFBProtection>`__ 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 <#sysgetlasterror-get-last-error>`__ è 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** .. code-block:: none (\* 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 <#TabCheckType>`__). | +-----------------------------------+-----------------------------------+ La funzione ritorna: +---------+----------------------------------------+ | (UDINT) | Valore pattern di controllo calcolato. | +---------+----------------------------------------+ **Codici di errore** In caso di errore viene ritornato 0 e con `SysGetLastError <#sysgetlasterror-get-last-error>`__ è 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)* .. code-block:: none (\* 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 <#sysgetlasterror-get-last-error>`__ è 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)* .. code-block:: none (\* 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 <#sysgetlasterror-get-last-error>`__ è 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)* .. code-block:: none (\* 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 <#sysgetlasterror-get-last-error>`__ è 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 <#TabSpyModeDefs>`__. | +-----------------------------------+-----------------------------------+ | **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 <#sysgetlasterror-get-last-error>`__ è 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: .. code-block:: none 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. .. |image0| image:: media/image1.jpg :width: 1.65764in :height: 0.45694in .. |image1| image:: media/image2.jpg :width: 7.08681in :height: 0.7125in .. |image2| image:: media/image3.jpg :width: 7.08681in :height: 0.52361in .. |image3| image:: media/image4.jpg :width: 7.08681in :height: 2in .. |image4| image:: media/image5.jpg :width: 1.79167in :height: 0.42917in .. |image5| image:: media/image6.jpg :width: 2.35417in :height: 0.46875in .. |image6| image:: media/image7.jpg :width: 2.14583in :height: 0.81528in .. |image7| image:: media/image8.jpg :width: 7.08681in :height: 0.37431in .. |image8| image:: media/image9.jpg :width: 7.08681in :height: 1.29931in .. |image9| image:: media/image10.jpg :width: 1.53125in :height: 0.89792in .. |image10| image:: media/image11.jpg :width: 7.08681in :height: 0.72431in .. |image11| image:: media/image12.jpg :width: 7.01042in :height: 2.77153in .. |image12| image:: media/image13.jpg :width: 1.72847in :height: 0.86597in .. |image13| image:: media/image14.jpg :width: 7.08681in :height: 0.91319in .. |image14| image:: media/image15.jpg :width: 6.98056in :height: 2.77986in .. |image15| image:: media/image16.jpg :width: 1.575in :height: 0.49236in .. |image16| image:: media/image17.jpg :width: 7.08681in :height: 0.55139in .. |image17| image:: media/image18.jpg :width: 6.99028in :height: 1.40694in .. |image18| image:: media/image17.jpg :width: 7.08681in :height: 0.55139in .. |image19| image:: media/image18.jpg :width: 6.99028in :height: 1.40694in .. |image20| image:: media/image19.jpg :width: 1.54306in :height: 0.49236in .. |image21| image:: media/image20.jpg :width: 7.08681in :height: 0.56319in .. |image22| image:: media/image21.jpg :width: 7.03125in :height: 1.22014in .. |image23| image:: media/image20.jpg :width: 7.08681in :height: 0.56319in .. |image24| image:: media/image21.jpg :width: 7.03125in :height: 1.22014in .. |image25| image:: media/image22.jpg :width: 7.08681in :height: 0.53542in .. |image26| image:: media/image22.jpg :width: 7.08681in :height: 0.53542in .. |image27| image:: media/image23.jpg :width: 1.64583in :height: 0.49236in .. |image28| image:: media/image24.jpg :width: 7.08681in :height: 1.075in .. |image29| image:: media/image25.jpg :width: 1.94861in :height: 0.51944in .. |image30| image:: media/image26.jpg :width: 7.21875in :height: 0.57431in .. |image31| image:: media/image27.jpg :width: 7.41458in :height: 2.44861in .. |image32| image:: media/image28.jpg :width: 1.72847in :height: 0.89792in .. |image33| image:: media/image29.jpg :width: 7.08681in :height: 0.53542in .. |image34| image:: media/image30.jpg :width: 5.90556in :height: 2.48819in .. |image35| image:: media/image31.jpg :width: 7.08681in :height: 0.52361in .. |image36| image:: media/image32.jpg :width: 7.08681in :height: 0.61042in .. |image37| image:: media/image31.jpg :width: 7.08681in :height: 0.52361in .. |image38| image:: media/image32.jpg :width: 7.08681in :height: 0.61042in .. |image39| image:: media/image33.jpg :width: 1.88611in :height: 1.06319in .. |image40| image:: media/image34.jpg :width: 7.08681in :height: 0.89792in .. |image41| image:: media/image34.jpg :width: 7.08681in :height: 0.89792in .. |image42| image:: media/image35.jpg :width: 1.27986in :height: 0.44861in .. |image43| image:: media/image36.jpg :width: 7.08681in :height: 1.425in .. |image44| image:: media/image36.jpg :width: 7.08681in :height: 1.425in .. |image45| image:: media/image37.jpg :width: 1.45694in :height: 0.6375in .. |image46| image:: media/image38.jpg :width: 7.08681in :height: 1.25972in .. |image47| image:: media/image38.jpg :width: 7.08681in :height: 1.25972in .. |image48| image:: media/image39.jpg :width: 1.44861in :height: 0.45694in .. |image49| image:: media/image40.jpg :width: 1.60625in :height: 0.43681in .. |image50| image:: media/image41.jpg :width: 1.45694in :height: 0.98819in .. |image51| image:: media/image42.jpg :width: 7.08681in :height: 0.84236in .. |image52| image:: media/image43.jpg :width: 7.16667in :height: 4.76042in