SCL Stringzerlegung

Zuviel Werbung?
-> Hier kostenlos registrieren
Yep, geht wie Butter! :ROFLMAO:

@Aslof
Oh oh, dein XML ist 2663 Zeichen lang, wenn ich das richtig sehe.
S7-Strings sind max. 255 Zeichen lang, also mußt du das ankommende Paket sinnvoll zerlegen, um mit den Stringfunktionen zu arbeiten.

Es gibt noch eine Alternative, die habe ich mal irgendwann genutzt.
Die Daten kommen ja sicher per Ethernet oder so in einem DB bei dir an. Dort liegt dann ein Array of Byte o.ä.

Nun könnte man diese Array nach dem ersten Vorkomen von "<" durchsuchen, hat man das, schaut man, ob das zweite Zeichen "V" ist, wenn ja, das dritte Zeichen und so weiter, wenn nein, dann wieder nach "<" suchen. Das ist kein so großes Problem in SCL. So findest du ebenfalls deine Werte und kannst dann die betreffenden Byte ausschneiden.

Ich dachte das kann man umgehen indem man z.B. sagt Test : String[30000]?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein ...
der String hat einen Header, der die deklarierte und die tatsächliche Länge beinhaltet - für jede der Positionen ist ein Byte reserviert und so hast du dann auch die Stringgröße. Die Routinen FIND, DELETE, MID etc. arbeiten alle mit diesem Header.
Willst du das anders machen so wäre die Alternative (wie schon von Ralle erwähnt) das Array of Byte (oder Char). Da müßtest du dir deine Teilstrings dann aber selber bilden und auch die Such-Routinen selber erschaffen.

Wenn du dir mit deiner Routine Daten erzeugst so könntest du sie, vorausgesetzt du hast vor einen FB zu bauen, auch im STAT-Bereich desselben speichern. Ich denke mal, dass du damit ja ggf. noch weitere Dinge vorhast.

Gruß
Larry
 
Nein ...
der String hat einen Header, der die deklarierte und die tatsächliche Länge beinhaltet - für jede der Positionen ist ein Byte reserviert und so hast du dann auch die Stringgröße. Die Routinen FIND, DELETE, MID etc. arbeiten alle mit diesem Header.
Willst du das anders machen so wäre die Alternative (wie schon von Ralle erwähnt) das Array of Byte (oder Char). Da müßtest du dir deine Teilstrings dann aber selber bilden und auch die Such-Routinen selber erschaffen.

Wenn du dir mit deiner Routine Daten erzeugst so könntest du sie, vorausgesetzt du hast vor einen FB zu bauen, auch im STAT-Bereich desselben speichern. Ich denke mal, dass du damit ja ggf. noch weitere Dinge vorhast.

Gruß
Larry

Was wäre deiner Meinung nach Einfacher, einen Char Array zu Initialisieren (In der Form liegt das XML File in dem DB vor) und den dann in lauter kleine Strings umzuwandeln (falls das den geht?). Oder aber eigene Suchroutinen schreiben und die dann auf den Char Arrays ausüben.

Zu der Funktion des Systems. Ich krieg die Daten über einen CP vom SAP System und soll dann da die Lagerplätze raussuchen und die dann in einem "Hochregallager" anfahren.
Deshalb muss ich die Daten also alles was zwischen <VLPLA> und </VLPLA> finde raussuchen und in einem DB speichern, so dass Ich die nacheinander aus dem System ziehen kann und dann dem System angeben kann welche Teile ausgelagert werden sollen.

Thx
 
Ich glaube ich würde auch so vorgehen, wie schon von Ralle skizziert :
Ich würde das komplette Char-Array durchsuchen und mir dann passende Einzel-Strings bilden. Das ist allerdings nicht un-aufwändig. Einen Vergleich auf Inhalte kannst du hier dann nur Byteweise durchführen - also wenn akt_Char = '<' dann Beginn_einer_Sequenz und dann weiterprüfen ob die weiteren Zeichen auch passen. Hier kannst du dir dann natürlich das MID und auch das DELETE etc. sparen und einfach ab dem Ende von <VLPLA> die nächsten Zeichen (soviel es maximal sein können - vielleicht kann es ja auch 1001-09 heißen) in einen Hilfsstring schreiben und den dann schließen (oder auch gleich) weiter verarbeiten.
Wie schon geschrieben würde ich hier mit einem FB arbeiten - somit würde ich hier auch erstmal alle sinnvoll gefundenen Einzel-Ergebnisse in diesem abbilden und ggf. am Schluß alles in Summe nach irgendwohin zur Verfügung stellen.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok hört sich vernünftig an.

Ich hab jetzt also ein Array z.B.

IDOC : ARRAY[0..3000] OF Char;

Wie weise ich dem jetzt den Array aus dem Datenbaustein zu (ist auch ein Char array & gleich groß).

Wenn ich jetzt sage

IDOC := DB50.Lagerplatz;

Dann schreit der Compiler jedes mal "Ungültiger Datentyp"

Habt Ihr da einen Tipp für mich?
 
Ich hänge dir mal 2 Quellen an. Das .txt mußt du löschen, dann kannst du das in ein Step7-Projekt importieren. In dem SCL-Code (Weiß nicht mehr, ob ich das war oder mir den mal jemand gegeben hat, schon zu lange her ;) ) werden bestimmte Zeichen gesucht und dann die folgenden Zeichen verkettet und abgelegt. So ähnlich würde das bei dir auch laufen, aber im vorliegenden Code wird immer nur ein "Trennzeichen" verwendet und folglich gesucht. Bei dir müßte die Suche ja nach dem ersten gefundenen Zeichen noch mit den weiteren Zeichen fortgesetzt werden. Aber als Beispiel zeigt es schon einiges. Du brauchst nichts in Statische Daten umzukopieren, es wird direkt mit einem Quell- und einem Ziel-DB gearbeitet. Leider ohne Kommentare ...

PS: Wenn 3000 Byte durchsucht werden und das Ganze zu lange dauert (SPS-Zykluszeit!!!), dann kann es sein, dass man das später auch noch in mehrere "Durchläufe" aufteilen muss!
 

Anhänge

  • DB200_201.AWL.txt
    12,7 KB · Aufrufe: 7
  • FC200 Ascii.SCL.txt
    2,5 KB · Aufrufe: 20
Ich hab das Beispiel mal so abgeändert, dass es mit deinen Daten funktioniert.
Was noch offen ist, es werden nur 200 Byte durchsucht, das kann man ja vergrößern, aber wie gesagt u.U. wirkt sich das auf die Zykluszeit negativ aus. Wenn das so ist, muss man das so machen, dass man z.Bsp. je Zyklus 200 oder 500 Byte durchsuchen läßt, dann die Schleife verläßt und beim nächsten Mal dort wieder einsetzt, wo man aufgehört hat. Dann wäre es wohl sinnvoll, das Ganze in einem FB zu machen und die Variablen die jetzt Temp sind im Stat-Bereich anzulegen. Es ist weiterhin noch keinerlei Fehlerprüfung realisiert, Also z.Bsp., wenn die XML-Datei Fehler enthält. Auch ist natürlich der Ergebnis-DB im Moment auf 100 Fundstellen begrenzt. Er sollte so groß sein, dass alle Fundstellen hineinpassen u.U. ist eine Abbruchbedingung inkl. Fehlermeldung bei möglichen Überschreitungen sinnvoll.
 

Anhänge

  • DB300_301.AWL.txt
    13,1 KB · Aufrufe: 10
  • FC300 Ascii_XML.SCL.txt
    3 KB · Aufrufe: 24
Zuviel Werbung?
-> Hier kostenlos registrieren
Gehört es zu den Don'ts die Zyklen der CPU zu verlängern?
Der Packt so nur 2850 Zeichen pro Zyklus.

Ansonsten fällt mir nur noch ein die derzeite Position des For index in ner DB zu speichern und dann anschließend im nächsten Zyklus wieder auszulesen.
Hat jemand ne andere Idee?

Bzw. Ich hab gerade erst deinen Beitrag gelesen Ralle, wie funktioniert das mit den statischen Variablen in den FBs? und thx für die Lösung aber ich muss noch dazu sagen, das Xml File von mir war nur für 3 Produkte. Um das für meine Zwecke zu missbrauchen brauch ich c.a. Platz für 10 Produkte d.h. ~10000Zeichen :) zu verarbeiten.
mfg Alex
 
Zuletzt bearbeitet:
Gehört es zu den Don'ts die Zyklen der CPU zu verlängern?
Der Packt so nur 2850 Zeichen pro Zyklus.

Ansonsten fällt mir nur noch ein die derzeite Position des For index in ner DB zu speichern und dann anschließend im nächsten Zyklus wieder auszulesen.
Hat jemand ne andere Idee?

Bzw. Ich hab gerade erst deinen Beitrag gelesen Ralle, wie funktioniert das mit den statischen Variablen in den FBs? und thx für die Lösung aber ich muss noch dazu sagen, das Xml File von mir war nur für 3 Produkte. Um das für meine Zwecke zu missbrauchen brauch ich c.a. Platz für 10 Produkte d.h. ~10000Zeichen :) zu verarbeiten.
mfg Alex

Die Zwischenergebnisse sind ja bei einem FC Temporäre Variablen. Wenn man z.Bsp. nach 500 Zeichen die For-Schleife verläßt ist es am Besten, es bleibt alles erhalten, dann muß man nicht zu viel nachdenken. :)
Du erzeugst eine neue SCL-Datei und fügst dort einen Rumpf für FB ein. Dann kannst du das Meißte aus dem FC in den FB kopieren, die Temp-Variablen kommen aber in den Stat-Bereich.
Ich würde mit Start eine Flanke erzeugen (auch hier stat-Vat nutzen) und mit der Flanke die Variablen auf Null setzen, z.Bsp. den Index.
Dann Die For-Schleife, aber immer mit dem erhöhten Index neu einsteigen.
Bei Erreichen des endgültigen Endes (evtl. eine LEN-Variable an den FB) ein Fertig-Bit ausgeben. Dann kann der Start zurückgenommen werden und alles kann von vorne beginnen.

Zykluszeit: Du kannst das austesten, es ist abhängig von der Gesamtanwendung. Die Zykluszeit darf sich schon verlängern, aber es gibt Anwendungen, das sind 50ms schon zu viel. Am Besten, du nimmst einmal deine Daten in den DB, setzt den Wert in der For-Schleife dann Schrittweise hoch und schaust dir die Zykluszeit an. Für 10 Produkte wäre der Db ja dann mit 100 lang genug oder?
 
Die Zwischenergebnisse sind ja bei einem FC Temporäre Variablen. Wenn man z.Bsp. nach 500 Zeichen die For-Schleife verläßt ist es am Besten, es bleibt alles erhalten, dann muß man nicht zu viel nachdenken. :)
Du erzeugst eine neue SCL-Datei und fügst dort einen Rumpf für FB ein. Dann kannst du das Meißte aus dem FC in den FB kopieren, die Temp-Variablen kommen aber in den Stat-Bereich.
Ich würde mit Start eine Flanke erzeugen (auch hier stat-Vat nutzen) und mit der Flanke die Variablen auf Null setzen, z.Bsp. den Index.
Dann Die For-Schleife, aber immer mit dem erhöhten Index neu einsteigen.
Bei Erreichen des endgültigen Endes (evtl. eine LEN-Variable an den FB) ein Fertig-Bit ausgeben. Dann kann der Start zurückgenommen werden und alles kann von vorne beginnen.

Zykluszeit: Du kannst das austesten, es ist abhängig von der Gesamtanwendung. Die Zykluszeit darf sich schon verlängern, aber es gibt Anwendungen, das sind 50ms schon zu viel. Am Besten, du nimmst einmal deine Daten in den DB, setzt den Wert in der For-Schleife dann Schrittweise hoch und schaust dir die Zykluszeit an. Für 10 Produkte wäre der Db ja dann mit 100 lang genug oder?

Klar 100 Stellen würden gut ausreichen, vielen Dank für eure Hifle
 
Zurück
Oben