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.

LogicLab (Ptp116)
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
        Sp.COM:=ADR('COM0'); //COM port definition
        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:=SysVarsnprintf(SOut, BSize, 'Counter:%04d$r$n', VR_TYPE#UDINT_TYPE, ADR(Counter));
        i:=Sysfwrite(SOut, NrOfChars, 1, Sp.File);
    END_IF;

// [End of file]

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 19 Agosto 2019