SysMAlloc, memory allocation

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

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.

Information Circle

Funzione

CODESYS: Non disponibile

LogicLab: eLLabXUnified12Lib

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
    i : UDINT; (* Auxiliary counter *)
    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

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

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