Vai al contenuto

Conversione da formato esadecimale a decimale (Hex to Dec)

Home Forum Programmazione IEC 61131 (LogicLab) Conversione da formato esadecimale a decimale (Hex to Dec)

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #35017
    Anonimo
    Inattivo

    E’ la prima volta che uso un PLC avendo sempre sviluppato con micro in assembler e C e stiamo usando lo scada WinCC con protocollo Hostlink della OMRON. La stringa del protocollo mi passa l’indirizzo della variabile da leggere e quante variabili leggere nel seguente formato:

    40 30 30 52 44 30 30 31 32 30 30 32 31 XX 2A 0D in Hex, @00RD00120021CK*<CR> in ASCII.

    Dove:
    RD è il comando di lettura
    0012 è l’indirizzo della variabile da leggere
    0021 è il numero di variabili da leggere
    CK è il valore del checksum calcolato come XOR

    Il mio problema è banale ma sto litigando. Ho raggruppato in una word l’indirizzo della variabile da leggere “0012” e in un altra word il numero di caratteri da leggere “0021”

    Come faccio a trasformare questi due valori da Hex in Dec ?
    Questi valori li vorrei usare per un ciclo di for next come offset di un puntatore.

    #36753
    Sergio Bertana
    Amministratore del forum

    Non capisco bene la domanda, cerco di interpretarla. Immagino che tu debba con un comando di read da protocollo Hostlink, restituire il valore di variabili in memoria PLC.

    A questo scopo dovrai allocare le variabili nella memoria del PLC ad indirizzi noti, per uniformarsi al protocollo Modbus nativo di SlimLine, potremo dire che da protocollo HostLink andiamo a leggere variabili allocate in DB 100, magari interponendo un offset sull’indirizzamento. Per quanto riguarda la conversione del valore indirizzo e numero di variabili dalla stringa ricevuta in variabili nel formato esadecimale, consiglio questi semplici statements.

        Address:=TO_UINT(RxString[5]-16#30)*4096; (* Variable address *)
        Address:=Address+TO_UINT(RxString[6]-16#30)*256; (* Variable address *)
        Address:=Address+TO_UINT(RxString[7]-16#30)*16; (* Variable address *)
        Address:=Address+TO_UINT(RxString[8]-16#30); (* Variable address *)

        NrOfVars:=TO_UINT(RxString[9]-16#30)*4096; (* Numero variabili da leggere *)
        NrOfVars:=NrOfVars+TO_UINT(RxString[10]-16#30)*256; (* Numero variabili da leggere *)
        NrOfVars:=NrOfVars+TO_UINT(RxString[11]-16#30)*16; (* Numero variabili da leggere *)
        NrOfVars:=NrOfVars+TO_UINT(RxString[12]-16#30); (* Numero variabili da leggere *)

    Per ottenere il valore in decimale, dovrai moltiplicare per 1000, 100, 10 al posto di 4096, 256, 16.
    Per inviare su seriale i dati letti dalla memoria consiglio questi statements:

        Ptr:=ADR(%MX100.0)+Address; (* Pointer *)
        FOR i:=0 TO TO_INT(NrOfVars) DO
            Ch:=Sysfputc(TO_INT(@Ptr), Fp); (* Character *)
            Ptr:=Ptr+1; (* Pointer *)
        END_FOR;

    Allego un programma di esempio per il download.

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