# HEX in ASCII, ILC ETH150



## WinniePooh (27 Februar 2012)

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


----------



## Mobi (28 Februar 2012)

Ich würde das ganze in ST machen ist wesentlich einfacher, unzwar in einer For-Schleife. Bekommst du die 8 Bytes als Array?


----------



## WinniePooh (28 Februar 2012)

OK.... habe ich mir auch gedacht... aber hat jemand eine idee wie ich die hex werte in ascii Zeichen umwandeln kann und umgekehrt???


----------



## KvT (28 Februar 2012)

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 ..._


----------



## WinniePooh (28 Februar 2012)

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'


----------



## KvT (28 Februar 2012)

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.


----------



## Mobi (28 Februar 2012)

*Mein Vorschlag*

So hier wäre dann mal mein Vorschlag:


```
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
```


```
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;
```


----------



## WinniePooh (7 März 2012)

Ich möchte mal, wenn jemand braucht den Code online stellen:


```
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;
```


----------



## Mobi (7 März 2012)

Hat meins nicht funktioniert???


----------



## WinniePooh (7 März 2012)

> 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...


----------



## Mobi (7 März 2012)

Also dein Code ist aber schon trotzdem ziemlich viel oder nicht?


----------

