Step 7 Char in String wandeln

dentech

Level-2
Beiträge
577
Reaktionspunkte
39
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich komme im Moment nicht weiter, ich habe in einem DB mehrere zusammenhänge Chars (kein Array), ich möchte nun diese Chars zu einem einzelnen String zusammensetzen. Gibt es dafür eine Funktion die ich noch nicht gefunden habe.

String := Char(1)+Char(2)+Char(3) ...usw.

Es wäre gut, wenn ich die Anzahl der Chars eingegeben könnte.
 
Zuletzt bearbeitet:
Du kannst das mit einem SCL Baustein über die AT Funktion erledigen. Dabei fügst du in eine Stringvariable Stelle für Stelle ein.

Als Baustein kenne ich nur ConCat, der aber nur funktioniert wenn du schon Strings hast, wenn ich mich richtig erinnere
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Lade/Transferiere in AWL, MOVE in KOP/FUP.... um wieviele CHARs geht es denn ? Und musst du das an mehreren Stellen im Programm machen ? Dann könnte man natürlich eine Funktion dafür schreiben....
 
Einfach mal den Aufbau eines Strings sich anschauen, dann sieht man wie man es einfach selbst machen kann, Alternativ könnte man es mit der Funktion aus der StandardLibs machen.

Aufbau vom Sting wie folgt:

1.Byte: max. Länge (254)
2.Byte: Aktuelle Länge (Anzahl der enthaltenen Zeichen)
3.Byte: 1 Zeichen
4.Byte: 2 Zeichen
...
256. Byte: 254 Zeichen

Also kann man sich damit ganz einfach ein Array mit den Char Werten füllen und dann die beiden "Steuer Byte" beschreiben.
Daher kann man nicht nur einfach die Chars in ein Array kopieren, sondern muss auch die aktulle Datenlänge dann ins Byte 2 mit schreiben.
Im Prinzip Array mit 256 Byte anlegen und im 1.Byte die max Länge (254) eintragen und dann die Chars ab 3. Byte hinein kopieren und am Ende die Anzahl der Zeichen ins 2. Byte schrieben --> fertig!
--> Stichwort Schleife, da der TE ja die Anzahl der Char eingeben können möchte. Somit ist die Laufweite (und damit das Byte 2) auch bekannt!

Somit sieht man wie einfach dies ist, wenn man sich einmal die Grundlage als Verständnis erarbeitet hat (zB. Google Aufbau String S7).
Ist wie mit dem Ohmsche Gesetz. Das ist auch die Grundlage für die E-Technik ;)

Ps. hätte man die Bardsuche etwas genutzt wäre man auch auf die Antwort gekommen (wie ich selbst gerade gesehen habe)
CHAR zusammenfassen zu einer String


Du kannst das mit einem SCL Baustein über die AT Funktion erledigen. Dabei fügst du in eine Stringvariable Stelle für Stelle ein.

Auch hier würde dann eigentlich das 2. Byte nicht beschrieben und wäre IMHO nicht richtig (siehe oben)
Er müsste ja ebenfalls ein String anlegen (Array) und auch hier sind die beiden Byts (1,2) zu berücksichtigen ;)
 
Zuletzt bearbeitet:
Hallo Leute,

ich komme im Moment nicht weiter, ich habe in einem DB mehrere zusammenhänge Chars (kein Array), ich möchte nun diese Chars zu einem einzelnen String zusammensetzen. Gibt es dafür eine Funktion die ich noch nicht gefunden habe.

String := Char(1)+Char(2)+Char(3) ...usw.

Es wäre gut, wenn ich die Anzahl der Chars eingegeben könnte.

Mein Ansatz wäre auch, das in SCL zu machen und mit einer AT-Sicht auf den Ziel-String zu arbeiten. Die AT-Sicht stellt dann hierbei den Ziel-String als Array_of_Char dar und du könntest die einzelnen Teilelemente dann einfach zuordnen.

Nun schreibst du auch, dass es gut wäre, wenn du die Anzahl der Einzel-Chars eingeben könntest - wie meinst du das ? Prinzipiell würde so etwas funktionieren, wenn du eine Quelle hast, in der diese Einzel-Char (Array-like) in einem festen Raster abgelegt sind. Dann könntest du dir die jeweilige Adresse ggf. errechnen.

Du solltest also doch noch etwas mehr zu deiner Problemstellung schreiben ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

SCL wäre auch mein Favorit, die Chars im DB sind so abgelegt:

z.B.:

Char 1
Char 2
Char 3
Char 4 usw...

Gibt es irgendwo nähere Informationen wie das mit der AT Sicht genau funktioniert?
 
Das Thema AT-Sicht haben wir hier schon sehr oft behandelt. Im Grunde so :
Code:
[
VAR
   myString : string[80] ;
   atString AT myString : struct
      Groesse : Byte ;
      Anz_Zeichen : Byte ;
      Inhalt : Array [1..80] of Char ;
   End_Struct ;

im Code dann :

myString := '' ;   // Initialisieren des Strings !!!
atString.Inhalt[1] := Char1 ;
atString.Inhalt[2] := Char2 ;
atString.Inhalt[3] := Char3 ;
atString.Anz_Zeichen := 3 ;

vielleicht aber als Erstes : S7-Classic oder TIA ?
Dann könntest du mal deinen gedachten Baustein (hier vor Allem die Schnittstelle des Bausteins) hier als SCL-Code posten.

Gruß
Larry
 
Habe es jetzt so gelöst:

Code:
FUNCTION FC1373 : VOID
TITLE = 'FC_Char_To_String'
VERSION : '1.0'
AUTHOR  : HeD
VAR_INPUT
    Chars : ARRAY[1..64]OF CHAR;
    Anzahl : INT;
END_VAR
VAR_TEMP
    Zaehler : INT;
    Anzahl_Byte : BYTE;
    Zeichenkette_AT : STRING;
    _Byte AT Zeichenkette_AT : ARRAY[0..1]OF BYTE;
    _Chars AT Zeichenkette_AT : ARRAY[0..255] OF Char;
END_VAR
VAR_OUTPUT    
Zeichenkette : STRING;
END_VAR
//Variable initialisieren
Zeichenkette_AT := '';
//Größe der Nutzdaten festlegen
Anzahl_Byte:=INT_TO_BYTE(Anzahl);
_Byte[0] := Anzahl_Byte;
_Byte[1] := Anzahl_Byte;
//Die Chars dem String zuweisen
    FOR Zaehler := 1 TO 64 BY 1 DO
        _Chars[Zaehler+1] := Chars[Zaehler];
    END_FOR;
//Temp in Out kopieren    
Zeichenkette := Zeichenkette_AT;
END_FUNCTION

Danke für eure hilfe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch hier würde dann eigentlich das 2. Byte nicht beschrieben und wäre IMHO nicht richtig (siehe oben)
Er müsste ja ebenfalls ein String anlegen (Array) und auch hier sind die beiden Byts (1,2) zu berücksichtigen ;)
Du hast viel geschrieben, aber vergessen, dass man mit AT auch ein Struct als Sicht auf einen String anlegen kann. Dabei kann ich die beiden Bytes zu beginn ebenfalls anlegen und beschreiben.
Ist alsodoch irgendwie richtig. ;)

Code:
_String AT isString :Struct
Max_Len :Byte;
Act_Len :Byte;
Cont :Array[1..10] of Char;
End_Struct;
€: Larry war mal wieder schneller im korrigieren
 
Zuletzt bearbeitet:
Du hast viel geschrieben, aber vergessen, dass man mit AT auch ein Struct als Sicht auf einen String anlegen kann. Dabei kann ich die beiden Bytes zu beginn ebenfalls anlegen und beschreiben.
Ist alsodoch irgendwie richtig. ;)

Code:
_String AT isString :Struct
Max_Len :Byte;
Act_Len :Byte;
Cont :Array[1..10] of Char;
End_Struct;
€: Larry war mal wieder schneller im korrigieren

Darum schrieb ich ja IMHO mit dem Hinweis aufs 2'te Byte ;)
Das war meine Anmerkung zum "Dabei fügst du in eine Stringvariable Stelle für Stelle ein."

Ich wollte ihm eh keine Lösung präsentieren, er sollte durch die Beschriebung und Hinweise selbst daraus lernen auch wie Strings aufgebaut sind!
 
@Boxy:
Naja ... das Beispiel, wie man eine AT-Sicht auf einen String (z.B.) macht (oder irgend etwas komplett anderes) ist ja noch nicht das Endresultat - von daher kann ich diese Anmerkung nicht so richtig nachvollziehen. Wir sind ja hier am Start um uns gegenseitig zu helfen ... und es wurde ja auch gar nicht nach DER vollständigen Lösung gefragt ...

Gruß
Larry
 
Was spricht eigentlich gegen die Nutzung von Concat?
Wurde mal kurz am Anfang erwähnt, aber nachdem dann gleich wieder das AT Geschütz aufgefahren wurde, schnell wieder fallen gelassen.
Also etwa so:
FUNCTION "charToString" : Void
VERSION : 0.1
VAR_INPUT
a : Array[0..18] of Char;
END_VAR
VAR_OUTPUT
result : String;
END_VAR
VAR_TEMP
i : Int;
END_VAR

FOR i := 0 TO 13 DO
result := CONCAT(IN1 := result, IN2 := a);
END_FOR;

END_FUNCTION

Dann braucht man sich keine Gedanken mehr über den Aufbau des String zu machen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es spricht nichts gegen die Verwendung von Concat - außer vielleicht der damit automatisch verbundene hohe Verbrauch / Gebrauch von Lokaldaten.
Vielleicht wäre irgendwann einmal auch die Laufzeit ein Thema - bei dieser Anwendung allerdings sicherlich nicht.

Concat baut im Unterschied zu der dargestellten AT-Variante (die bei mir immer wieder so oder ähnlich zum Einsatz käme) aus dem übergebenen String und dem übergebenen Char einen neuen String zusammen und gibt den dann zurück. Darüber hinaus kann Concat aber auch 2 Strings verbinden - das heißt, es findet auch noch eine Prüfung intern statt.

In der .Net-Welt würde ich dir hier aber Recht geben und auch gar nicht versuchen, unbedingt einen Work-Around zu basteln. Bei .Net wäre die .Net-Methode aber auch oft schneller als etwas selbst erstelltes ...
Bei der SPS hingegen schaue ich (das ist vielleicht auch schon eine Art Tick) immer gerne zuerst auf die Resourcen ...

Gruß
Larry
 
So ganz kann ich deine Antwort nicht nachvollziehen.
Zumindest nicht für die 1500.

Zum einen braucht der Concat Vorschlag weniger Arbeitsspeicher (mit der ergänzten im Beispiel fehlenden Initialisierung des Ergebnisstrings) zum anderen werden im Gegensatz zur Lösung mit AT auch keine definierten Lokaldaten genutzt.

Du vermutest also, dass die interne Prüfung des Concat die Laufzeit in die Höhe treibt?

Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stimmt, das auch noch. :-)
Aber die ursprüngliche Aufgabenstellung war ja, characters zu einem String zusammen zu setzen.
Das Array kam erst später ins Spiel
Deshalb der concat.
 
Ist etwas OT aber im .net sollte man den Stringbuilder nehmen, gerade wenn große Schleifen durchlaufen werden. Ein Kollege hat das mal ausprobiert und der Builder hat da von der Zeit her alles andere geschlagen.
 
Hallo,

ich habe auch dieses Problem und möchte vom CHAR >10 Zeichen in Richtung String konvertieren.
Wie kann man das machen ?

Geht es auch nicht generell auch über AWL?

Bei CODESYS oder auch im TIA...gibt es ja genug Bsp. aber im Step7 habe ich noch nichts gefunden.

Ich danke euch, für eure Unterstützung.

Grüße
Step7Neuling
 
Zurück
Oben