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 eNULL.

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

Approfondimenti
  • In questo topic ulteriori informazioni sull’utilizzo della allocazione dinamica della memoria.
  • In questo articolo informazioni sulla memoria dei sistemi.

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 *)
    Counter : UDINT; (* Counter *)
    TimeBf : UDINT; (* Time buffer (mS) *)
    SOut : @STRING; (* String output pointer *)
    BSize : UINT := 64; (* Buffer size definition *)
    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. Once allocated, the buffer
        // cannot be deallocated, so the allocation remains valid until the
        // next system restart

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

    // If the memory buffer is not allocated (this can happen if not enough
    // memory is available), execution is terminated.

    IF (SOut = eNULL) THEN RETURN; END_IF;

    // Manage the TCP server to handle incoming connection.

    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?