TIA TCON_IP_v4 ADDR Array in STRING umwandeln

R_TRIG

Level-2
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin moin,

ich möchte gerne die vier Bytes des TCON_IP_v4 Datentyps: RemoteAddress.ADDR[1..4] in ein STRING umwandeln.

Heißt aus:
ADDR[1] := 16#C0
ADDR[2] := 16#A8
ADDR[3] := 16#00
ADDR[4] := 16#05

Soll werden:

MyString := '192.168.0.5'

Dazu habe ich mir was zusammen geschrieben, was auch soweit zu funktionieren scheint, aber irgendwie extrem unschön als Code wirkt:

Code:
MyString := ''
FOR #tCtr := 1 TO 4 DO         
                #tIP := USINT_TO_STRING((BYTE_TO_USINT(IN := #CONNECT.PLC.RemoteAddress.ADDR[#tCtr]))); //Wandel BYTE zu STRING
                #tIP := DELETE(IN := #tIP, L := 1, P := 1); //Entferne Vorzeichen
                #MyString:= CONCAT(IN1:= #MyString,IN2 :=CONCAT(IN1:=#tIP, IN2:='.')); //Setze STRING zusammen
END_FOR;

Jemand ein Vorschlag, wie es eleganter gehen kann?

Danke und Gruß
R_TRIG
 
Moin R_TRIG,

ob meine Idee eleganter ist, weiß ich nicht, aber so könnte man vorgehen (Allerdings resultiert daraus eine fixe String-Länge):

Code:
VAR
    Tac_IP : Array[0..11] of char;
    Ts_string : string;
    Tui_cnt : uint;
END__VAR


---


Tac_IP[0] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_ersteOktett / 100 MOD 10) + 16#30);
Tac_IP[1] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_ersteOktett / 10 MOD 10) + 16#30);
Tac_IP[2] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_ersteOktett / 1 MOD 10) + 16#30); // das Teilen durch 1 dient nur optischen Zwecken

Tac_IP[3] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_zweiteOktett / 100 MOD 10) + 16#30);
Tac_IP[4] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_zweiteOktett/ 10 MOD 10) + 16#30);
Tac_IP[5] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_zweiteOktett/ 1 MOD 10) + 16#30);// das Teilen durch 1 dient nur optischen Zwecken

Tac_IP[6] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_dritteOktett / 100 MOD 10) + 16#30);
Tac_IP[7] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_dritteOktett/ 10 MOD 10) + 16#30);
Tac_IP[8] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_dritteOktett/ 1 MOD 10) + 16#30);// das Teilen durch 1 dient nur optischen Zwecken

Tac_IP[9] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_vierteOktett / 100 MOD 10) + 16#30);
Tac_IP[10] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_vierteOktett/ 10 MOD 10) + 16#30);
Tac_IP[11] := BYTE_TO_CHAR(DINT_TO_BYTE(#IP_vierteOktett/ 1 MOD 10) + 16#30);// das Teilen durch 1 dient nur optischen Zwecken


Chars_TO_Strg(Chars := Tac_IP,
                        pChars := 0,
                        Cnt => Tui_cnt,
                        Strg => Ts_string);

Hinweis: ich habe in einem anderen Zusammenhang festgestellt, dass "CONCAT" recht ressourcenfressend (Zykluszeit) ist.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier mal ein Versuch euere beiden Vorschläge zu kombinieren:
Code:
    #myString := 'xxx.xxx.xxx.xxx';   // Platzhalterstring, der überschrieben wird
    #c := 1;                          // Schreibposition im String
    FOR #i := 1 TO 4 DO
       
        // IP-Oktett als Integer
        #value := BYTE_TO_INT(#Ip.ADDR[#i]);
       
        // Hunderterstelle berechnen und als ASCII-Zeichen eintragen
        #myString[#c] := DINT_TO_CHAR((#value / 100) + 16#30);
        #c := #c + 1;
       
        // Zehnerstelle berechnen
        #myString[#c] := DINT_TO_CHAR((#value / 10 MOD 10) + 16#30);
        #c := #c + 1;
       
        // Einerstelle berechnen
        #myString[#c] := DINT_TO_CHAR((#value MOD 10) + 16#30);
        #c := #c + 1;
       
        // Nach jedem Oktett eine Position für den Punkt überspringen
        #c := #c + 1;
       
    END_FOR;
   
    // Ausgabe der fertigen IP-Adresse
    #TCON2Str := #myString;
 
Zurück
Oben