La 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.
Nota
A differenza della funzione SysRMAlloc non è possibile liberare la memoria allocata da questa funzione.
Function
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib
Size (UDINT) Indica la dimensione in bytes dell'area da allocare.
La funzione ritorna un puntatore di typo (@BYTE) con l'indirizzo di allocazione del buffer i memoria. NULL se non vi è spazio per allocare il buffer.
Errori
In caso di errore si attiva l'uscita Fault, eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.
Esempi
Come utilizzare gli esempi.
Al primo loop di esecuzione viene aperta la comunicazione seriale (19200, e, 8, 1) ed allocato un buffer di memoria di 16 bytes. Se le operazioni sono eseguite correttamente ad ogni secondo viene incrementato il valore di un contatore e ne viene inviato il valore come stringa sulla porta seriale.
PROGRAM ST_SysMAlloc VAR i : INT; (* Auxiliary counter *) NrOfChars : INT; (* Number of printed chars *) Counter : UDINT; (* Counter *) SOut : @USINT; (* String output pointer *) TimeBf : UDINT; (* Time buffer (uS) *) BSize : UINT := 16; (* Buffer size definition *) Sp : SysSerialPort; (* Serial port *) END_VAR // ***************************************************************************** // PROGRAM "ST_SysMAlloc" // ***************************************************************************** // An example of how allocate a memory buffer and how to use it. // ----------------------------------------------------------------------------- // ------------------------------------------------------------------------- // INITIALIZATION // ------------------------------------------------------------------------- // First program execution loop initializations. IF (SysFirstLoop) THEN // Serial port opening. Sp.COM:=ADR('COM0'); //COM port definition Sp.Baudrate:=19200; //Baudrate Sp.Parity:='E'; //Parity Sp.DataBits:=8; //Data bits Sp.StopBits:=1; //Stop bits Sp.DTRManagement:=DTR_AUTO_WO_TIMES; //DTR management Sp.DTRComplement:=FALSE; //DTR complement Sp.EchoFlush:=FALSE; //Received echo flush Sp.DTROnTime:=0; //DTR On time delay (mS) Sp.DTROffTime:=0; //DTR Off time delay (mS) Sp.FlushTm:=0; //Flush time (mS) Sp.RxSize:=0; //Rx buffer size Sp.TxSize:=0; //Tx buffer size // Here a memory buffer is allocated. SOut:=SysMAlloc(BSize); //String output pointer TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS) END_IF; // Exit if COM port not opened or memory not allocated. IF (NOT(Sp.Opened) OR (SOut = 0)) THEN RETURN; END_IF; // ------------------------------------------------------------------------- // COUNT AND SENDING VALUE // ------------------------------------------------------------------------- // Every 1 second print out the counter value. IF ((SysGetSysTime(TRUE)-TimeBf) > 1000000) THEN TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS) Counter:=Counter+1; //Counter NrOfChars:=SysVsnprintf(SOut, BSize, ADR('Counter:%04d$r$n'), UDINT_TYPE, ADR(Counter)); i:=Sysfwrite(SOut, NrOfChars, 1, Sp.File); END_IF; // [End of file]
Ultimo aggiornamento: 17 Agosto 2020