Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 31

Thema: SCL Stringzerlegung

  1. #21
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Ralle Beitrag anzeigen
    Yep, geht wie Butter!

    @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]?

  2. #22
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    ... die Frage verstehe ich gerade nicht ... wo hängt es da ?
    Die Frage ist wie das funktioniert.

    Ich muss die Daten aus dem XML File ja auch irgendwie speichern.

  3. #23
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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

  4. #24
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Larry Laffer Beitrag anzeigen
    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

  5. #25
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.710
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    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

  6. #26
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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?

  7. #27
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    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!
    Angehängte Dateien Angehängte Dateien
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  8. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Aslof (03.05.2011)

  9. #28
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    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.
    Angehängte Dateien Angehängte Dateien
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  10. #29
    Registriert seit
    30.03.2011
    Beiträge
    25
    Danke
    10
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Geändert von Aslof (03.05.2011 um 19:55 Uhr)

  11. #30
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Aslof Beitrag anzeigen
    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?
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •