Vai al contenuto
Vai all indice del manuale di programmazione
Tipo: Funzione
Libreria LogicLab: eLLabXUnified12Lib
Libreria Codesys: Non disponibile

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.

A differenza della funzione SysRMAlloc non è possibile liberare la memoria allocata da questa funzione.

Approfondimenti

Descrizione

Size (UDINT) Indica la dimensione in bytes dell’area da allocare.

La funzione ritorna un puntatore di typo (PVOID) con l’indirizzo di allocazione del buffer di memoria. eNULL se non vi è spazio per allocare il buffer.

Immagine F SysMalloc

Esempi

Come utilizzare gli esempi.
Connettendosi con un telnet alla porta indicata ad ogni secondo viene incrementato il valore di un contatore e ne viene inviato il valore come stringa al terminale.

LogicLab (Ptp116, ST_SysMAlloc)
PROGRAM ST_SysMAlloc
VAR
    Fp : eFILEP; (* File pointer *)
    BSize : UINT := 64; (* Buffer size definition *)
    SOut : @STRING; (* String output pointer *)
    Counter : UDINT; (* Counter *)
    TimeBf : UDINT; (* Time buffer (mS) *)
    TCPServer : SysTCPServer; (* TCPServer management *)
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

        // TCP server parameters.

        TCPServer.FilesArr:=ADR(Fp); //Files array
        TCPServer.LocalAdd:=ADR('0.0.0.0'); //Local address
        TCPServer.LocalPort:=1020; //Local port
        TCPServer.MaxConn:=1; //Accepted connections
        TCPServer.FlushTm:=50; //Flush time (mS)
        TCPServer.LifeTm:=30; //Life time (S)
        TCPServer.RxSize:=128; //Rx buffer size
        TCPServer.TxSize:=128; //Tx buffer size

        // Here a memory buffer is allocated.

        SOut:=SysMAlloc(BSize); //String output pointer
        TimeBf:=SysTimeGetMs(); //Time buffer (mS)
    END_IF;

    // Manage the TCP server.

    TCPServer(Enable:=TRUE); //TCPServer management
    IF NOT(SysFIsOpen(Fp)) THEN RETURN; END_IF;

    // -------------------------------------------------------------------------
    // COUNT AND SENDING VALUE
    // -------------------------------------------------------------------------
    // Every 1,5 second print out the counter value.

    IF ((SysTimeGetMs()-TimeBf) >= TO_UDINT(T#1s500ms)) THEN
        TimeBf:=SysTimeGetMs(); //Time buffer (mS)
        Counter:=Counter+1; //Counter

        eTO_JUNK(DateTimeFormat(TO_LDATE_AND_TIME(SysDateGetNs()), ADR('\[H\:i\:s\.v\]\ '), SOut, BSize));
        eTO_JUNK(SysCVsnprintf(SOut, BSize, ADR('Counter:%04d$r$n'), UDINT_TYPE, ADR(Counter)));
        eTO_JUNK(Sysfwrite(SOut, TO_INT(Sysstrlen(SOut)), 1, Fp));
    END_IF;

// [End of file]
Was this article helpful?