Vai al contenuto

Caratteristiche di memoria dei sistemi

Home Forum Informazioni ambiente di sviluppo LogicLab Caratteristiche di memoria dei sistemi

Stai visualizzando 14 post - dal 1 a 14 (di 14 totali)
  • Autore
    Post
  • #54823
    Marcello
    Partecipante

    Ultimamente ricevo una warning Spazio dati disponibile minore del 10% Il mio programma occupa:
    92kB memoria programma
    640B memoria tampone
    14kB memoria dati

    Il Target selezionato è SlimLine Mps054 XTarget 12.0 Le caratteristiche riportate nelle istruzioni reperibili nel sito sono:
    262kB memoria programma
    6kB memoria tampone
    20kB memoria dati

    Le caratteristiche indicate sulle risorse di LogicLab (vers. 3.1.0.0 – 5.12.0.13) sono:
    256 kB memoria programma
    6kB memoria tampone
    12kB memoria dati

    Quelle riportate dal compilatore:
    255kB memoria programma (max)
    1kB memoria tampone
    16 kB memoria dati.

    Quali sono quelle corrette? Ho pensato fosse un problema di aggiornamento e ho selezionato da “Progetto” -> “Aggiorna sistema corrente” ma il Risultato è che ora il compilatore mi da 791 errori per : Spazio vars Auto esaurito e non c’è verso di farlo compilare.

    Che cosa è successo?
    Come faccio a “dire” al compilatore i dati corretti?

    #54835
    Sergio Bertana
    Amministratore del forum

    Per fare chiarezza la dimensione di memoria sui sistemi MPS054 dipende dal sistema, le versioni Lite dispongono di:
    131 kB programma utente
    12 kB RAM disponibili per dati utente di cui 6 kB sono ritentivi

    E’ possibile acquistare una opzione per estendere le dimensioni di memoria come nelle versioni Full che dispongono di:
    262 kB programma utente
    20 kB RAM disponibili per dati utente di cui 6 kB sono ritentivi

    Collegandoti ad un sistema Full con LogicLab ecco il report di memoria:

    Used code size: 5E50h (23 KByte)
    Free code space: 3A1A0h (232 KByte)
    Total code space:3FFF0h (255 KByte)
    
    Used data space: 695h (1 KByte)
    Free data space: 396Fh (14 KByte)
    Total data space: 4004h (16 KByte)
    
    Used retain data space: 0h (0 KByte)
    Free retain data space: 3E8h (0 KByte)
    Total retain data space: 3E8h (0 KByte)

    Come vedi il total code space è 3FFF0h pari a 262128 bytes, total data space è 4004h pari a 16388 bytes a cui devi sommare i 4096 bytes della DB100 per un totale di 20484 bytes.

    Per quanto riguarda l’area retain abbiamo 3E8h pari a 1000 bytes di area retain a cui occorre sommare i 2048 bytes dell’area retain della DB100 (Da DB100.2048 a DB100.4096). Siccome l’area retain viene salvata 2 volte in FRAM ecco il risultato dei 6 kB.

    Ma a parte questi discorsi teorici, il tuo problema è che probabilmente ti sei connesso ad un sistema Lite ed hai acquisito dal sistema valori di memoria che sono la metà di quelli del sistema Full ed il tuo programma necessita di più memoria dati. O come  dici tu hai eseguito il comando Refresh current target che assegna i valori del sistema Lite.

    Soluzione al problema è connetterti ad un sistema Full (O ad un sistema Lite con opzione installata) ed eseguire dal menù On-line il comando Force target image upload. In questo modo carichi dal sistema il file con estensione imgx che contiene i dati corretti.

    #63394
    Rubox
    Partecipante

    Mi sto ponendo domande su com’è meglio utilizzare la memoria per i dati di un sistema Slimline MPS054.
    Avendo più POU che magari definiscono lo stesso FB, oppure delle variabili dello stesso tipo, conviene definirne una a livello globale che poi si andrà a valorizzare nel POU, oppure conviene definirne una per ogni POU?

    Ad esempio il blocco funzione che restituisce data e ora di sistema,  gli stessi blocchi FIFOFile che utilizzo in più parti del programma (qui utilizzerei un solo FB, ma ovviamente tanti indici quanti sono i FIFOFile) possono essere definiti una volta a livello globale e poi utilizzati?

    Immagino che i blocchi HTTPClient, ModbusMaster e tutti i blocchi che inviano qualcosa e aspettano la risposta debbano invece essere “univoci” all’interno del POU (tutte le comunicazioni di rete).

    #63398
    Sergio Bertana
    Amministratore del forum

    Ogni volta che istanzi variabili o FB viene utilizzata memoria, quindi è certo che se possibile è meglio avere una sola istanza globale utilizzata in vari POUs. Ma occorre fare attenzione se è possibile farlo.

    Và benissimo farlo per esempio per il FB SysETimeToDate, definendolo globale potrai da ogni POU riferirti ai suoi membri per avere i dati che ti servono. Lo faccio normalmente per i FB JSONEncode e JSONDecode, se guardi i miei esempi REST o HTTP vedrai questa tecnica.

    Ma non puoi usarlo per il FB FIFOFile, perchè al di là degli indici ogni FB lavora con il file definito (Oppure memoria) e tiene traccia di dati riferiti allo stesso al suo interno.

    #63404
    Rubox
    Partecipante

    Quindi avendo la necessità di due buffer di 6000 caratteri per spedire i valori in una mail conviene allocare memoria con SysRMalloc all’inizio del POU dove viene generato il corpo della email, inserire il tutto nel file FIFO e liberare la memoria allocata ad ogni ciclo di scrittura?

    A questo punto invece di definire un buffer a livello locale nello spazio di memoria dei dati è meglio allocarlo quando serve e liberarlo?
    La memoria di sistema a cui attinge SysRMalloc la trovo indicata sul datasheet sotto quale voce?

    Oppure come faccio per sapere quanta memoria c’è?

    #63410
    Sergio Bertana
    Amministratore del forum

    Certo quando è possibile conviene sempre allocare memoria con SysRMalloc, puoi tenere la memoria allocata per tutto il tempo che ti serve e poi liberarla con SysRMFree. Occorre sempre controllare che SysRMalloc sia riuscito ad allocare il buffer richiesto prima di utilizzarlo.

    Attenzione all’utilizzo della memoria allocata, la funzione non ritorna direttamene un puntatore come invece fa la SysMAlloc, ma ritorna l’indirizzo della memoria allocata in un buffer. Occorre sempre  fare riferimento al valore nel buffer perchè il sistema operativo sposta automaticamente il blocco di memoria per ottimizzarne l’allocazione. In pratica il buffer allocato si sposta di posizione a tua insaputa quindi l’unico punto in cui è noto l’indsirizzo di allocazione è nel buffer fornito come parametro alla funzione.

    La memoria disponibile alla funzione dipende dalla versione ddel sistema operativo, il comando da Telnet RMStats ne riporta indicazione.

    [Admin]> RMStats
    Memory size......... 36000
    Act free memory..... 31100

    Come vedi in questo caso lo spazio totale è di 36KBytes e lo spazio libero è di 31KBytes.

    #63457
    Rubox
    Partecipante

    Grazie, non avevo visto la sezione “Note” sulla pagina del manuale online.

    L’esecuzione della funzione SysRMalloc è “immediata”? Nel senso: quando richiamo la funzione ottengo subito lo spazio di memoria (o la mancanza di spazio) nello stesso loop di esecuzione, oppure la risposta del sistema operativo può arrivare anche nei loop successivi? (un po’ come succede con le comunicazioni di rete che impiegano del tempo per esser stabilite).

    Avendo bisogno di un buffer in quasi tutti i POU è meglio allocarne uno con SysRMalloc nella task boot e poi utilizzarlo nelle varie POU, oppure allocare e liberare a inizio e fine di ogni singolo POU?

    #63464
    Sergio Bertana
    Amministratore del forum

    Tutte le funzioni non avendo la possibilità di gestire variabili statiche al loro interno tornano immediatamente il risultato. Solo i FB possono gestire operazioni per la cui esecuzione occorrono più cicli di  programma.

    La SysRMAlloc è una funzione quindi ritorna immediatamente TRUE nel caso sia riuscita ad allocare il buffer richiesto, FALSE in caso contrario.

    Certo se vuoi puoi allocare un buffer con la SysRMAlloc e poi utilizzarlo in tutti i POUs, ma attenzione la task di Boot è eseguita una sola volta, e anche se probabilmente si riuscirà ad allocare la memoria, nel caso non si riuscisse non avresti il buffer disponibile.

    E’ meglio invece allocarlo in un POU eseguito in Back e prima di utilizzarlo controllare se è stato allocato.

    #63467
    Rubox
    Partecipante

    Adesso il mio dubbio è questo: se non c’è spazio per i buffer rischio che determinate azioni non siano mai eseguite.

    C’è un comando che fornisca le stesse informazioni della console nel programma?

    In questo modo si potrebbe verificare quanta memoria è possibile richiedere e adeguare il comportamento. Per un corpo di una email si potrebbe optare per un messaggio più breve, ad esempio.

    #63481
    Sergio Bertana
    Amministratore del forum

    Si certo questa è una possibilità, se cerchi di allocare uno spazio e non hai mai memoria disponibile tutte le operazioni legate al buffer di memoria  sono bloccate.

    Il verificare con un comando la disponibilità di spazio non è possibile e comunque siccome l’allocazione potrebbe essere richiesta da altre task corri il rischio che il comando dia una disponibilità che poi un’attimo dopo non sia più vera.

    La soluzione migliore è di provare ad allocare lo spazio che ti serve, se dopo un tempo non riesci provare ad allocare uno spazio minore fino a quando l’allocazione riesce. Così sei certo che hai effettivamente la memoria disponibile.

    Se poi vuoi cimentarti nella richiesta della memoria disponibile puoi utilizzare il FB CLIClient per eseguire il comando RMStats,l’esempio è già pronto nella pagina del manuale.

    #63912
    George
    Partecipante

    I have a MPS056A320 (SFW198E010) and compiling my program i get:

    Used code size:       9180h (   36 KByte)
    Free code space:      16E70h (   91 KByte)
    Total code space:      1FFF0h (  127 KByte)
    
    Used data space:       1E88h (    7 KByte)
    Free data space:        178h (    0 KByte)
    Total data space:       2000h (    8 KByte)
    
    Used retain data space:        214h (     0 KByte)
    Free retain data space:        1D4h (     0 KByte)
    Total retain data space:    3E8h (     0 KByte)

    In the characteristics of the CPU i see the data memory size is 20Kb RAM which is different from 8KBytes that i get. I have already executed the command “Force target image upload”.

     

    #63927
    Sergio Bertana
    Amministratore del forum

    Unfortunately there’s an error on the product data. The MPS056A320 has only 12Kb of data memory.

    LogicLab report 8Kb because there’s 8Kb of memory available for the LogicLab’s linker and additional 4Kb are for the DB100 area. This area is preallocated in the system and it’s not reported by LogicLab.

    But remind over the 12Kb there’s also additional 4Kb that can be used by allocating buffers on it with the SysMAlloc function. And up to 32Kb that can be used by allocating buffers on it with the SysRMAlloc function.

    It’s possible to buy an option that extends memory up to 255Kb of code and 20Kb of data memory (16Kb for LogicLab’s linker and 4Kb for DB100 area). The availbale area for the malloc functions  still remain unchanged.

    #63935
    George
    Partecipante

    So, the information (20 kB RAM user data) I read in product characteristics is not valid?

    Is there the 20Kb option available?

    #63940
    Sergio Bertana
    Amministratore del forum

    Yes it’s true there’s a mismatch in the product data.

    To extend the data memory to 20 Kb it’s possible to buy the CPU program code extension option (See here).

Stai visualizzando 14 post - dal 1 a 14 (di 14 totali)
  • Devi essere connesso per rispondere a questo topic.