Vai al contenuto
PLC Forum


Conversione da HEX a DEC


albertid

Messaggi consigliati

Buongiorno,

 

ho provato ad eseguire una ricerca a riguardo ma non ho trovato nulla,

anche se mi sembra strano che l'argomento non sia mai stato affrontato,

quindi chiedo scusa in anticipo per l'eventuale doppione.

 

Ho la necessità di convertire un numero esadecimale contenuto in una variabile di tipo ULINT in un numero decimale.

c'è una funzione utilizzabile o devo scriverla in SCL?

 

Grazie mille

Link al commento
Condividi su altri siti


Esadecimale o decimale è un modo diverso di codificare e visualizzare un numero, non c'è la conversione tra i 2 formati perchè è sempre la stessa quantità solo visualizzata in modo differente.

Potrebbe essere necessario cambiare il formato della variabile da ULINT a REAL o INT o WORD ecc.

Modificato: da acquaman
Link al commento
Condividi su altri siti

Grazie mille per la risposta,

e mi scuso per la domanda poco chiara,

espongo meglio il mio problema.

 

Ho un convertitore Profinet/Can, devo partire da una stringa che contiene già il valore in esadecimale ("52 00 00 00 00 00 00 00").

Sto provando ad utilizzare la funzione "STRG_VAL" per convertire la stringa dentro un ULINT,

Il valore che visualizzo in uscita è "52 00 00 00 00 00 00 00" in decimale, ma poi il convertitore profinet/can mi genera un messaggio con il dato convertito in esadecimale.

 

Per questo pensavo di convertire il valore in decimale, in modo che poi nella riconversione venisse trasmesso il valore corretto.

 

Come posso procedere? 

Grazie

Link al commento
Condividi su altri siti

E' un casino, la stringa è rappresentata in esadecimale ma la funzione la legge come se fosse decimale, inoltre se nel numero ci fosse contenuta una lettera es FF la funzione non la converte.

Io farei un ciclo for next con cui vado a scorrere i caratteri e per ogni carattere vedo cosa contiene. Praticamente fai una decodifica manuale.

Link al commento
Condividi su altri siti

è il dato da mandare via CAN, è composto da una parte fissa che indica la funzione e da una parte variabile che è il valore.

Un esempio potrebbe essere impostare la velocità di un motore, ci sarà un codice che indica che si vuole modificare la velocità + il dato di velocità da applicare.

Link al commento
Condividi su altri siti

Secondo me devi costruirti la stringa caso per caso, puoi creare delle stringe standard con i vari parametri, e all'occorrenza compili la tua stringa trasferendo la parte del comandi con il valore convertito  nella stringa di controllo.

non ho mai usato il CAN BUS non saprei cosa altro dirti.

Link al commento
Condividi su altri siti

Ho seguito il consiglio di Aquaman facendo una decodifica "manuale", convertendo ogni 2 char in un byte.

 

Chiedo scusa in anticipo per il codice sicuramente migliorabile ma non sono molto esperto, spero che possa comunque tornare utile come input. 

Se avete consigli per migliorarlo, o notate errori, fatemi sapere.

 

FUNCTION "65002_2Char_To_1ByteHex" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      InpChar1 : Char;
      InpChar2 : Char;
   END_VAR

   VAR_OUTPUT 
      outByte : Byte;
   END_VAR

   VAR_TEMP 
      halfByte1 : Byte;
      halfByte2 : Byte;
   END_VAR


BEGIN
	IF (#InpChar1 < 'a')
	    
	THEN
	    #halfByte1 := #InpChar1;
	    #halfByte1 := #halfByte1 - 16#30;
	    
	ELSIF (#InpChar1 > '9')
	    
	THEN
	    #halfByte1 := #InpChar1;
	    #halfByte1 := #halfByte1 - 16#37;
	    
	END_IF;
	
	
	IF (#InpChar2 < 'a')
	    
	THEN
	    #halfByte2 := #InpChar2;
	    #halfByte2 := #halfByte2 - 16#30;
	    
	ELSIF (#InpChar2 > '9')
	    
	THEN
	    #halfByte2 := #InpChar2;
	    #halfByte2 := #halfByte2 - 16#37;
	    
	END_IF;
	
	#outByte := #halfByte1 + (SHL(IN := #halfByte2, N := 4));
	
	
	
	
END_FUNCTION

FUNCTION "65003_String_To_Ulint" : Void
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      InStr : String;
   END_VAR

   VAR_OUTPUT 
      OutVal : ULInt;
   END_VAR


BEGIN
	"65002_2Char_To_1ByteHex"(InpChar1:=#InStr[16],
	                          InpChar2:=#InStr[15],
	                          outByte => #OutVal.%B0);
	
	"65002_2Char_To_1ByteHex"(InpChar1 := #InStr[14],
	                          InpChar2 := #InStr[13],
	                          outByte => #OutVal.%B1);
	
	"65002_2Char_To_1ByteHex"(InpChar1 := #InStr[12],
	                          InpChar2 := #InStr[11],
	                          outByte => #OutVal.%B2);
	
	"65002_2Char_To_1ByteHex"(InpChar1 := #InStr[10],
	                          InpChar2 := #InStr[9],
	                          outByte => #OutVal.%B3);
	
	"65002_2Char_To_1ByteHex"(InpChar1 := #InStr[8],
	                          InpChar2 := #InStr[7],
	                          outByte => #OutVal.%B4);
	
	"65002_2Char_To_1ByteHex"(InpChar1 := #InStr[6],
	                          InpChar2 := #InStr[5],
	                          outByte => #OutVal.%B5);
	
	"65002_2Char_To_1ByteHex"(InpChar1 := #InStr[4],
	                          InpChar2 := #InStr[3],
	                          outByte => #OutVal.%B6);
	
	"65002_2Char_To_1ByteHex"(InpChar1 := #InStr[2],
	                          InpChar2 := #InStr[1],
	                          outByte => #OutVal.%B7);
	
END_FUNCTION

 

 

Grazie di nuovo,

ciao

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...