Step 7 S7-SCL: Direkter Zugriff auf Element in ARRAY OF STRING

Rudelz

Level-1
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich stehe grad auf dem Schlauch...

Ich habe in einem globalen DB folgendes deklariert:
Code:
Zeile  ARRAY[1..60] OF STRING[254]

Per AWL kann ich auf einzelne Zeichen folgendermaßen zugreifen (der Inhalt passt auch):
Code:
L DBxxx.Zeile[1, 5] // 5. Zeichen im 1. string

Wie mache ich das in SCL? Derselbe Zugriff verursacht den Fehler "Zahl der ARRAY-Dimensionen wurde überschritten (max. 6)". Es sind doch nur 2 Dimensionen?! Hat SCL ein Problem, weil es nicht als klassisches 2-dimensionales Array deklariert wurde (array[1..60, 0..254])?

Hintergrund: Da ich nach dem Anlegen viele einzelne Zeichen in den Strings manipulieren will, möchte ich ungern die IEC-Bausteine verwenden (wären ca. 200 Aufrufe)...


MfG
Stefan
 
Spontan fällt mir da nur die "Krücke" über einen Anwenderdatentyp ein:

Erstelle einen Datentyp XY der einen String [254] enthält, dann ändere dein Array im DB auf Array[1..60] of XY um. Anschließend lässt sich auf den String direkt zugreifen:

Code:
#tempChar := "Datenbaustein".Zeile[1]."String"[5];

Nicht schön aber selten...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Spontan fällt mir da nur die "Krücke" über einen Anwenderdatentyp ein:

Erstelle einen Datentyp XY der einen String [254] enthält, dann ändere dein Array im DB auf Array[1..60] of XY um. Anschließend lässt sich auf den String direkt zugreifen:

Code:
#tempChar := "Datenbaustein".Zeile[1]."String"[5];

Nicht schön aber selten...

Also gibt es wirklich keinen direkten Weg? Sehr seltsam...
Deine Lösung hatte ich auch schon im Kopf, aber habe sie nicht zuende gebracht. Also danke dafür!
Das ist aber leider auch nicht viel "schöner" als mit CONCAT/INSERT/DELETE/etc...
 
Ein anderer Weg wäre eine AT-Sicht (z.Bsp. Array[1..256] of Byte/Char) auf den jeweiligen String. Vorher müsste man wahrscheinlich den jeweiligen String aus dem Array in eine temporäre String-Variable kopieren.
 
Also gibt es wirklich keinen direkten Weg? Sehr seltsam...
Wenn man ein Array als 1-dimensionales deklariert, darf man sich eigentlich nicht darüber wundern, wenn das Array dann tatsächlich 1-dimensional ist.
Man darf sich aber natürlich darüber freuen, dass das Array in AWL trotzdem wie ein 2-dimensionales den Zugriff auf die einzelnen Zeichen der Strings erlaubt.
Das dürfte wohl ein Zugeständnis sein, die Lücke der AWL-Möglichkeiten zur HochSprachenErwartungsHaltung der heutigen SPS-Programmierer zu schliessen.

Gruss, Heinileini

PS:
In einigen BASICs (z.B. VB/VBA/VBS) gibt es die Möglichkeit, MID nicht nur beim Lesen, sondern auch beim Schreiben zu verwenden:
char = mid(string, x, 1) extrahiert das x. Zeichen - entspricht in Excel TEIL(QuellString; x. Zeichen; Anzahl Zeichen),
mid(string, x, 1) = char überschreibt das x. Zeichen - entspricht in Excel ERSETZEN(String; x. Zeichen; Anzahl Zeichen; neues Zeichen bzw. neuer String).
Könnte mir vorstellen, dass in einigen anderen Sprachen auch so grosszügig damit umgegangen werden kann - auch wenn es womöglich nirgends ausdrücklich so beschrieben ist?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn man ein Array als 1-dimensionales deklariert, darf man sich eigentlich nicht darüber wundern, wenn das Array dann tatsächlich 1-dimensional ist.
Man darf sich aber natürlich darüber freuen, dass das Array in AWL trotzdem wie ein 2-dimensionales den Zugriff auf die einzelnen Zeichen der Strings erlaubt.
So kann man es auch sehen. Ich sehe es eher so: Es gibt keine Möglichkeit, symbolisch direkt auf strings im Array zuzugreifen. Die "logische" Syntax wäre wohl
Code:
DBxx.Zeile[i].[j]
Da fehlt natürlich der nicht vorhandene Bezeichner...
 
Ich verstehe Dein Ansinnen sehr gut … wäre schon sehr praktisch!
Auch das DauerbrennerThema in diesem Forum "wie adressiere ich ein Bit in einem Byte, Wort, Doppelwort, …" gehört zweifellos in diese Rubrik.
Es gibt durchaus noch Wünsche, wie man heutige ProgrammierSprachen Praxis-orientiert aufbohren könnte …
Aber wahrscheinlich klaffen der Praxis-orientierte Bedarf und die hochwissenschaftliche Theorie der CompilerBastler einfach zu weit auseinander?
 
Ich lege die Strings mittlerweile nur noch als Array of Char an, und wandle sie dann vor Benutzung in Strings um, mit der Funktion um Array of Char in String zu wandeln.
Chars_to_Strg heißt die glaube ich. So kann ich symbolisch jedes Zeichen wandeln, wenn ich es benötige.
Ob das hier geht, weiß ich ebenfalls nicht, habe noch nie zwei Arrays verschachtelt.
"dbwhatever".Array.Zeichen[j] := 'B';
Array of Array of Char. So kannst du jeden String aufrufen und jedes Zeichen wandeln. Und wenn du für irgendwas Strings brauchst, musst die sie dann halt erst wandeln.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch das DauerbrennerThema in diesem Forum "wie adressiere ich ein Bit in einem Byte, Wort, Doppelwort, …" gehört zweifellos in diese Rubrik.
Es gibt durchaus noch Wünsche, wie man heutige ProgrammierSprachen Praxis-orientiert aufbohren könnte …
Aber wahrscheinlich klaffen der Praxis-orientierte Bedarf und die hochwissenschaftliche Theorie der CompilerBastler einfach zu weit auseinander?
Für sowas gibt es in der TIA-Welt schon Lösungen, nennt sich Slice-Zugriff (Byte.%X0).
Ich habe mich auch mittlerweile sehr gut in TIA eingelebt und das dortige SCL. Wenn man wie jetzt wieder zurück in der 300er Welt muss, vermisst man einiges...
 
Slice ist aber leider auch eine Krücke, weil man da u.U. keinen "selbsterklärenden" Variablennamen hat. (#Handling.Servo[1].Zustandswort.%X0 sagt einem ja eher nicht viel)
Dann lieber AT-Ansicht und/oder ordentliche Structs, damit kommt man in eingen Jahren auch noch gut klar.
Oder hinter jeden Slice-Zugriff einen Text ;-)
 
ich weiß, der Thread is schon alt, aber da ich hier auch gehadert habe, hier meine Krückenlösung:

Ein Array of Struct mit je einem String darin. So lässt sich auch auf jeden Buchstaben im String zugreifen und z.B. in ein char schreiben. Im Beispiel auf den 2ten Buichstaben in Array Element 1

array of string Zugriff.png
 
Zuletzt bearbeitet:
Zurück
Oben