albertid Inserito: 4 settembre 2019 Segnala Inserito: 4 settembre 2019 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
acquaman Inserita: 4 settembre 2019 Segnala Inserita: 4 settembre 2019 (modificato) 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: 4 settembre 2019 da acquaman
albertid Inserita: 4 settembre 2019 Autore Segnala Inserita: 4 settembre 2019 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
acquaman Inserita: 4 settembre 2019 Segnala Inserita: 4 settembre 2019 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.
albertid Inserita: 4 settembre 2019 Autore Segnala Inserita: 4 settembre 2019 Ok ci provo, grazie per il consiglio
albertid Inserita: 4 settembre 2019 Autore Segnala Inserita: 4 settembre 2019 è 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.
acquaman Inserita: 4 settembre 2019 Segnala Inserita: 4 settembre 2019 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.
pigroplc Inserita: 4 settembre 2019 Segnala Inserita: 4 settembre 2019 ti crei una funzione che compone il dato da mandare, sfrutta la funzione AT per scrivere codice agevolmente, c'è un esempietto qui sotto:
albertid Inserita: 4 settembre 2019 Autore Segnala Inserita: 4 settembre 2019 Grazie mille a tutti e 2
albertid Inserita: 5 settembre 2019 Autore Segnala Inserita: 5 settembre 2019 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
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora