TIA SCL Char in ein String wandeln *Brauche dringend Hilfe*

Case52

Level-2
Beiträge
58
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
leider komme ich gerade nicht weiter und der Kollege wo das macht ist Krank.
Ich muss in SCL einen String in Char konvertieren. das klappte auch soweit. Aber nun habe ich Probleme in SCL Char wieder umzuwandeln in ein String.
Ich dachte ich müsste nur die Formel drehen, ist aber wohl nicht so. Kann mir hier vielleicht jemand kurz helfen?
Das auf dem Bild ist der String zum Char, aber wie muss ich es auf der anderen Seite machen? Einfach #I und Len wechseln klappte nicht.

Vielleicht kann jemand kurz ein Screenshot machen von dem ganzen so wie ich es aufgebaut habe, man kann nur dazu lernen

Die CPU ist eine integrierte 317-F die leider Chars_to_Strg nicht kann.

Der String hat max. 54 Zeichen

Char.jpg
 
Zuletzt bearbeitet:
Ich dachte ich müsste nur die Formel drehen, ist aber wohl nicht so. Kann mir hier vielleicht jemand kurz helfen?
Prinzipiell, da du ja eine AT-Sicht hast, kann man das fast schon so machen ... also poste doch mal wie du es gemacht hast. Dann bekommen wir die Kuh schon vom Eis ...
 
Ich dachte ich müsste nur die Formel drehen, ist aber wohl nicht so.
Im Prinzip fast richtig, Aber Problem: woher soll der Code erfahren, wie viele Zeichen aus dem CharArray in den String kopiert werden müssen? Also wie lang der String dann werden muss?
Entweder du spendierst noch einen Input, in dem die Soll-Länge übergeben wird, oder der Code kopiert generell das gesamte CharArray in den String (max 254 Zeichen), oder das String-Ende wird in dem CharArray durch ein 0-Char signalisiert (null-terminated string).

Hier mal 3 schnell getippte ungetestete Code-Varianten:

(A) mit Stringlänge aus einem zusätzlichen Input-Parameter "Len" (0 .. 254 !):
Code:
#StringArray := ''; //String-Header maxLen initialisieren

FOR #i := 0 TO #Len - 1 DO
  #StringArray[#i + 2] := #CharArray[#i];
END_FOR;

#StringArray[1] := #Len; //String-Istlänge in String-Header eintragen
oder
(B) komplettes Char-Array in String kopieren:
Code:
#StringArray := ''; //String-Header maxLen initialisieren

//#temp_maxLen := #StringArray[0]; //nicht gut, weil aus Output gelesen wird!
//besser:
#temp_maxLen := 254; //Wert entsprechend String-Deklaration!

FOR #i := 0 TO #temp_maxLen - 1 DO
  #StringArray[#i + 2] := #CharArray[#i];
END_FOR;

#StringArray[1] := #temp_maxLen; //String-Istlänge in String-Header eintragen
oder
(C) bis zu einem Char = 0 kopieren (null-terminated string):
Code:
#StringArray := ''; //String-Header maxLen initialisieren

//#temp_maxLen := #StringArray[0]; //nicht gut, weil aus Output gelesen wird!
//besser:
#temp_maxLen := 254; //Wert entsprechend String-Deklaration!
#StringArray[1] := #temp_maxLen; //String-Header Istlänge initialisieren falls kein 0-Char enthalten ist

FOR #i := 0 TO #temp_maxLen - 1 DO
  IF #CharArray[#i] = CHAR#0 THEN
    #StringArray[1] := #i; //String-Istlänge in String-Header eintragen
    EXIT; //FOR-Schleife verlassen
  END_IF;  // (ELSE nicht nötig wegen EXIT)
  #StringArray[#i + 2] := #CharArray[#i];
END_FOR;

Anmerkungen:
Es ist nicht gut, dass in dem FC direkt in das Array in Output geschrieben wird (Probleme, wenn eine andere Task auf das am Output angeschlossene Array zugreift, z.B. ein HMI) oder wenn aus dem Output gelesen wird. Besser ist, den Code in einen FB zu packen (geht da AT ?), dann sollte auch die erzeugte Codegröße kleiner sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
PS: was soll mit dem vom String aktuell nicht benutzten Speicherplatz passieren, wenn die Ist-Länge des Strings kürzer als die max-Länge ist? Mit einem bestimmten Zeichen auffüllen/ablöschen?
Das ist übrigens ebenfalls ein Problem bei FC, wenn das Output-Array nicht komplett beschrieben wird, dann ist dieser Speicherplatz unbestimmt/hat quasi zufälligen Inhalt.
 
SCL Char in ein String wandeln *Brauche dringend Hilfe*
Hallo, war meine Hilfe innerhalb 4 Stunden schnell genug? ;)
Haben dir meine Codevorschläge geholfen? Für welche Lösung hast du dich entschieden und was hast du mit dem vom String nicht benutzten Speicherplatz hinter der Ist-Länge gemacht?
 
n
Hallo, war meine Hilfe innerhalb 4 Stunden schnell genug? ;)
Haben dir meine Codevorschläge geholfen? Für welche Lösung hast du dich entschieden und was hast du mit dem vom String nicht benutzten Speicherplatz hinter der Ist-Länge gemacht?
Variante B habe ich genommen, jedoch in AWL geschrieben. Da ich erst jetzt den Vorschlag lesen konnte. Aber im Prinzip das Gleiche raus kam.
Die Länge habe ich auf 54 reduziert.
Durch AWL ist es zwar viel mehr Arbeit, aber so können es die älteren Kollegen sehr gut lesen, falls es hier einmal zu Problemen oder Erweiterungen kommt.
Ein vergleich kam noch hinzu, nun frage ich ab ob der String dem Byte Muster entspricht. Falls dies nicht der fall sein sollte, sprich in beiden String liegen unterschiedliche Datensätze, dann lösche ich den Char Array und schreibe eine Null, danach wird der zu versendende String einfach nochmals eingelesen.

Alles in einem Funktioniert es ganz gut
 
Zuletzt bearbeitet:
Ein vergleich kam noch hinzu, nun frage ich ab, ob der String dem Byte Muster entspricht. Falls dies nicht der fall sein sollte, sprich in beiden String liegen unterschiedliche Datensätze, dann lösche ich den Char Array und schreibe eine Null, danach wird der zu versendende String einfach nochmals eingelesen.
:unsure: ???
Mit PlausibilitätsPrüfungen gezielt mögliche/denkbare FehlFunktionen aufzudecken, finde ich sehr gut.
Aber hier gelingt es mir leider nicht, den Sinn bzw. die FunktionsWeise der Massnahme zu erkennen.

PS: was soll mit dem vom String aktuell nicht benutzten Speicherplatz passieren, wenn die Ist-Länge des Strings kürzer als die max-Länge ist? Mit einem bestimmten Zeichen auffüllen/ablöschen?
Der eigentliche Sinn ist doch, dass nichts mit dem unbenutzten Speicherplatz passiert, damit man sich die Zeit für die "Pflege" des aktuell nicht benutzten Speicherplatzes esparen kann.
Das ist übrigens ebenfalls ein Problem bei FC, wenn das Output-Array nicht komplett beschrieben wird, dann ist dieser Speicherplatz unbestimmt/hat quasi zufälligen Inhalt.
Eigentlich sollte es nicht zu einem Problem werden, wenn man das unbenutzte Ende eines Strings in einem unbenutzten Zustand belässt.
Oder den benutzten Bereich kürzer macht. Oder man so mutig/leichtsinnig ist, ihn zu verlängern.
Nun gut, ein wenig GehirnSchmalz muss man schon investieren. Aber damit sollte ein Programmierer nicht überfordert sein, nicht einmal ein SPS-Programmierer. Ein ProgrammierFrischling sollte allerdings bereits in der Lage sein (oder noch bewusst üben), diese lauernde FehlerQuelle als solche zu erkennen. ;)
 
Eigentlich sollte es nicht zu einem Problem werden, wenn man das unbenutzte Ende eines Strings in einem unbenutzten Zustand belässt.
Bei PC führen solche Überlegungen regelmässig später zur Entdeckung von Sicherheitslücken, wenn z.B. in vermeintlich ungenutztem TEMP-Speicher z.B. Passwörter im Klartext lesbar werden oder Malcode in Programmspeicher eingeschmuggelt werden kann. Bei SPS sollte man vorsichtshalber auch nicht sorglos mit gemeinsam genutztem TEMP-Speicher umgehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei PC führen solche Überlegungen regelmässig später zur Entdeckung von Sicherheitslücken, wenn z.B. in vermeintlich ungenutztem TEMP-Speicher z.B. Passwörter im Klartext lesbar werden oder Malcode in Programmspeicher eingeschmuggelt werden kann. Bei SPS sollte man vorsichtshalber auch nicht sorglos mit gemeinsam genutztem TEMP-Speicher umgehen.
Hmmm.
Es leuchtet mir unmittelbar ein, dass man das unbeabsichtigte Entstehen von SicherheitsLücken im Auge behalten und tunlichst vermeiden muss.
Aber z.B. das "Ablöschen" von vorübergehend nicht mehr benutzten Teilen in StringVariablen, wenn der belegte Bereich verkürzt wird, liesse sich noch recht gut automatisch vom BetriebsSystem erledigen. Gibt es bereits Erkenntnisse, was (wenn überhaupt) die SPS-BetriebsSysteme evtl. schon jetzt dazu beitragen?
 
Zurück
Oben