HEX in ASCII, ILC ETH150

WinniePooh

Level-1
Beiträge
102
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS- Gemeinde,
ich bin blutiger Anfänger mit der Phoenix Contact und muss eine Übung für die Schule mit meiner Phoenix Contact über RS485 ein Motor ansprechen. Dieser fordert von mir eine komische Ansteurungssenderahmen.
Für die Kommunikation soll ein HEX- Wert von 8 BYTE in ein ASCII- Wert von 16 BYTE (plus 1BYTE CR).

BSP.:

HEX: 84 01 22 01 45 32 12 01h -> entspricht 8 BYTE

umwandlung nach ASCII

ASCII: 8 4 0 1 2 2 0 1 4 5 3 2 1 2 0 1 ->entspricht 16 BYTE abgeschlossen wird der Rahmen mit noch einem CR.

tatsächlich gesendet wird über die Schnittstelle die HEX Werte der ASCII Zeichen also
HEX: 38 34 30 31 32 32 30 31 34 35 33 32 31 32 30 31 0D

Kann mir da jemand helfen wie man das mit der Phoenix programmieren kann.
Kann man den die Umwandlung im FBD machen oder muss man mit dem ST arbeiten??
Hat jemand ein Beispiel?

mfg
Winnie
 
Ich würde das ganze in ST machen ist wesentlich einfacher, unzwar in einer For-Schleife. Bekommst du die 8 Bytes als Array?
 
Wie liegen denn die Daten vor? Als Array?

For i=0 to 8 DO
Ausgangssarry[2*i-1]:=Eingangsarray MOD 10 +30;
Ausgangssarry[2*i]:=(Eingangsarray DIV 10) +30;
END_FOR

oder so ähnlich ...
 
Zuletzt bearbeitet:
Ankommende Daten sind ARRAY [1..8] of BYTE;
Ausgehende Daten sind ARRAY [1..17] of BYTE;

ich muss ja irgendwie Chars von den einzelnen Hex bytes bilden 2Ah = '2' 'A'
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok! Bei meinem Beispiel bin ich davon ausgegangen, dass Deine Hex Zahl nur aus Zahlen besteht, also keine Buchstaben.

Schau mal in die Oscat.lib. Da gibt es Konvertierungsbausteine.

Ansonsten würde mir nur eine Case Anweisung einfallen, die jeweils eine Stelle abchecken.
 
Mein Vorschlag

So hier wäre dann mal mein Vorschlag:

Code:
IN    ARRAY_OF_BYTE_0_7    VAR_INPUT                0    0    0    0    0    0    
OUT    ARRAY_OF_BYTE_0_16    VAR_OUTPUT                0    0    0    0    0    0    
abTemp1    ARRAY_OF_BYTE_0_7    VAR                0    0    0    0    0    0    
abTemp2    ARRAY_OF_BYTE_0_16    VAR                0    0    0    0    0    0    
sTemp    STRING    VAR                0    0    0    0    0    0    
i    INT    VAR                0    0    0    0    0    0

Code:
abTemp1 := IN;
sTemp := '';

FOR i := 0 TO 7 BY 1 DO
    sTemp := CONCAT(sTemp, BYTE_TO_STRING(abTemp1[i], '%02x'));
END_FOR;

FOR i := 0 TO 15 BY 1 DO
    abTemp2[i] := INT_TO_BYTE(GET_CHAR(sTemp, i + 1));
END_FOR;

abTemp2[16] := BYTE#16#0D;

OUT := abTemp2;
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    41 KB · Aufrufe: 52
Ich möchte mal, wenn jemand braucht den Code online stellen:

Code:
xENO:=FAlSE;


IF    xENI
    THEN
    (*Convert the HEX- chars into a String*)
    i:=1;
    FOR i:=1 TO 8 BY 1
    DO
    (*Converting the byte into a string of HEX Chars*)
        BYTE_TO_STRH_1(
        IN:=HexFrame[i]
        );
        arrString[i]:=BYTE_TO_STRH_1.BYTE_TO_STRH;
    END_FOR;
    (*Initialization of odd to TRUE*)
    odd:=TRUE;
    ii:=1;
    i:=1;
    (*Seperate the Array of String into 2 chars and
      convert every Char intno a HEX value*)
    REPEAT
        IF odd
            THEN 
            CODE_1(
            STR:=arrString[i],
            POS:=1
            );
            arrStringHex[ii]:=CODE_1.CODE;
            odd:=FALSE;
            ii:=ii+1;
         ELSE
            CODE_2(STR:=arrString[i],
            POS:=2
            );
            arrStringHex[ii]:=CODE_2.CODE;
            odd:=TRUE;
            ii:=ii+1;
            i:=i+1;
        END_IF;  
    UNTIL i>iSetLength    
    END_REPEAT;
    (*Set the last Byte in the Array as <CR>*)
    arrStringHex[ii]:=BYTE#16#0D;
    xENO:=TRUE;
ELSE
    ii:=1;
    (*If the function not enable, then delete all bytes*)
    FOR ii:=1 to 17 BY 1
    DO
        arrStringHex[ii]:=BYTE#16#00;
    END_FOR;
END_IF;
 
Schau mal in die Oscat.lib. Da gibt es Konvertierungsbausteine.

KVT hat mir den Tipp gegeben mit der Bibliothek und habe Sie mir angeguckt und selber ausprobiert.

Habe dass dann selber schnell hingekriegt und nicht weiter aufs Forum geguckt...

Habe es nur so spät gepostet, weil ich keine Zeit hatte... aber habe so ein ähnliches Problem schon wieder ... kannst du mal gucken...
besser gesagt, kannst du mal gucken und erklären was ich da falsch mache.... würde mir mehr helfen...

gruß aber danke trotzdem...
 
Zurück
Oben