Vai al contenuto

Copia dati tra diverse aree di memoria

Home Forum Programmazione IEC 61131 (LogicLab) Copia dati tra diverse aree di memoria

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Autore
    Post
  • #35150
    Giorgio
    Partecipante

    Dovrei copiare i dati presenti nell’area di memoria MX da un indirizzo ad un altro.

    E’ possibile, mediante l’utilizzo dei puntatori copiare i dati presenti in MW100.xxx nella MW100.100 dove xxx varia mediante una variabile e iniziando dalla MW100.200

    #37103
    Sergio Bertana
    Amministratore del forum

    Con i puntatori si può accedere a qualsiasi parte della memoria del sistema, ma in caso di errore si può accedere a qualsiasi variabile senza alcun controllo creando anche problemi gravi di funzionalità del programma. E proprio per questa loro pericolosità che l’uso dei puntatori è deprecato nella programmazione IEC61131.

    In LogicLab esiste la possibilità di utilizzare i puntatori, in linguaggio ST, un puntatore si identifica con il simbolo @ posto davanti al tipo di variabile a cui il puntatore si riferisce. Quindi avremo dei puntatori di tipo @USINT, @INT, @REAL ecc. uno per ogni tipo di variabile gestita.

    L’operando ADR (Utilizzabile in tutti i linguaggi) ritorna l’indirizzo di una variabile, in linguaggio ST si può anche utilizzare il simbolo ? davanti al nome della variabile. Quindi la definizione ADR(%MX100.10) ritornerà l’indirizzo della variabile MX100.10. La definizione ADR(MiaVar) o ?MiaVar ritornerà l’indirizzo della variabile MiaVar.

    Ho realizzato un semplice programma con implementata la funzione eMemCpy che esegue copia tra due aree di memoria. Ecco la stampa del programma ed il programma sorgente, di seguito il codice della funzione eMemCpy.

    WHILE (Size > 0) DO
      @DestBf:=@SrcBf; (* Trasferisco dato in memoria *)
      Size:=Size-1; (* Buffer size *)
      SrcBf:=SrcBf+1; (* Source buffer address *)
      DestBf:=DestBf+1; (* Destination buffer address *)
    END_WHILE;

    #37104
    Sergio Bertana
    Amministratore del forum

    Tu mi chiedevi di poter variare l’indirizzo di memoria MX100 utilizzando una variabile ecco come puoi scriverlo semplicemente in linguaggio ST.

    VAR
      Pointer : @USINT; { DE:”Variable pointer” }
      Offset : UINT; { DE:”MX100 address offset” }
    END_VAR

    Pointer:=ADR(%MX100.0)+Offset;

    Scrivendo nella variabile Offset il valore desiderato, in Pointer verrà ritornato il suo indirizzo che potrai passarlo alla funzione eMemCpy. Volendo copiare 16 bytes da MX100.200 in MX100.100 dovrai scrivere.

    Offset:=200;
    Dummy:=eMemCpy(ADR(%MX100.100), ADR(%MX100.0)+Offset, 16);

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