Home › Forum › Programmazione IEC 61131 (LogicLab) › Conversione da formato esadecimale a decimale (Hex to Dec)
- Questo topic ha 1 risposta, 2 partecipanti ed รจ stato aggiornato l'ultima volta 15 anni, 4 mesi fa da
Sergio Bertana.
-
AutorePost
-
Maggio 27, 2011 alle 9:21 am #35017
Anonimo
InattivoE’ 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 XORIl 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.Maggio 27, 2011 alle 12:32 pm #36753Sergio Bertana
Amministratore del forumNon 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.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.