XML-Datei öffnen und bestimmten Eintrag suchen

Begonnen von Christian, 21. Dezember 2011, 18:28:21

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

Christian

So.... schon wieder ich.

Die Sache mit der STRING_TO_BUFFER-Funktion ist soweit ok, die Daten kommen an der richtigen Stelle im Buffer an.

Jetzt habe ich aber ein neues Problem mit dem Schreiben der Daten:
  Das XML-file ändert sich nicht. Muss ich irgendetwas beachten, wenn ich das öffnen der Datei vorbereite?? Aus der Dokumentation geht das für mich irgendwie nicht klar hervor.
Bislang mache ich die Initialisierung wie folgt:
     FSD.FILENAME:= CONCAT(yFileName , '.xml');
   FSD.MODE:=2;(*vorhandene Datei zum schreiben öffnen*)
   FSD.AUTO_CLOSE := T#0s; (*kein auto close verwenden*)
   BUF_O.SIZE:= 65535;(*Maximale Länge einlesen*)

   FSD.OFFSET:= Offset_1;(*Start des Öffnens beim OFFSET*)
   OpenDone:= FALSE;
   Mode := 001;

In der Doku steht nun "Sollen Daten geschrieben werden, so müssen vor Aufruf, die zu
schreibenden Daten in PT.BUFFER und bei PT.SIZE die Anzahl der Bytes
eingetragen werden". Das habe ich so realisiert:
         WriteDone:= _STRING_TO_BUFFER(Data,Offset_1 , ADR(BUF_O.BUFFER),SIZEOF(BUF_O.BUFFER));(*String in den Buffer BOF_O übertragen*)
      BUF_O.SIZE:= LenGes;(*Standartmäßig auf 8 gesetzt*)
      IF WriteDone THEN
         Mode:= 010;
      END_IF

Nun folgt der Funktionsaufruf:
         fbFileOpen(FSD:= FSD, PT:=BUF_O);
                               IF FSD.FILE_OPEN AND fbFileOpen.error = FALSE THEN
         Mode:= 020;
         OpenDone:=FSD.FILE_OPEN;
      ELSE
         OpenErrorID:= fbFileOpen.error_code;
      END_IF


Zu nächsten schritt (Schließen der Datei mit FSD.Mode := 5) gehe ich also erst, wenn die Datei geöffnet ist (FSD.FileOpen := TRUE).

Meine Frage wäre nun, ob man das so machen kann oder ob ich noch irgendetwas vergessen habe (zum Beispiel nach dem Öffnen)??


Grüße Christian

peewit

das einfachste ist wenn du deinen baustein online stellst, ansonsten kann ich schwer dein problem lokalisieren
die codeschnipsel sind zuwendig, das ganze ansich muss ja zusammen passen




Christian

Hallo,


hier mein kleines Beispielprogramm.


Vieln Dank für eine Hilfe schon im Voraus.

Grüße
Christian

[gelöscht durch Administrator]

Christian

... und nun noch die XML-Datei, die ich verwendet habe.

[gelöscht durch Administrator]

peewit

hallo

nachdem jeder seinen eigenen programmiertstil hat, und es oft relativ aufwendig ist, sich in andere programme hineinzudenken
habe ich dir aus zeitgründen einfach ein kleines demoprogramm runtergetippt

das öffnet deine xml datei
macht eine veränderung im datenbuffer (hier muss dein xml parsing hinein, damit du die richtige position modifizierst)
und schreibt diese daten wieder in die datei
fertig.

damit hast du mal etwas was in sachen dateihandling funktioniert
ich habe es auch absichtlich in einfachen und verständlichen schritten dargestellt (ohne tricksereien !)

siehe anhang


[gelöscht durch Administrator]

Christian

Hallo peewit,


wenn ich dein Demo-Programm richtig verstanden habe, liest du das gesmte File ein und veränderst ihn ab einem gewissen OFFSET.
Danach schreibst du den gesamten Buffer wieder in das File.

Wird dann der Inhalt der Datei überschrieben, oder wird der veränderte Buffer an das Ende angehängt??


Grüße Christian

peewit

1. demo liest die gesamt datei in den buffer
2. dort kannst du bestende teile verändern aber auch teile verschieben und einfügen
3. am ende musst du die neue und korrekte datenlänge angeben, und die datei wird quasi neu beschrieben


Christian

Hi,



prinzipiell funktioniert die Sache mit dem Ändern der Werte.
Ich bekomme jetzt aber den Effekt, dass die veränderten Daten wieder direkt hinter die bereits bestehenden Daten geschrieben werden, wodurch sich meine Datei vergrößert - ich bin also im APPEND-Mode, was ich jedoch vermeiden möchte da  sich die Datenmenge immer verdoppelt.

Ich möchte nur einen bestimten Wert ändern, an sonsten alles beim alten belassen, um das File nicht aufzublähen.
Wie kann ich das Anstellen?? Oder sollte das dein Programm bereits können??

Ich weis nicht, was ich falsch mache, da ich dein Demo-Programm quasi 1:1 übernommen habe.

peewit

du hast es quasi 1:1 übernommen ?

so wie es ausseht nur zu 1:0,9   :-)

wenn du daten schreibst und diese werden hintern angehängt dann hast du vor dem schreiben
das offset nicht neu vorgegeben.

nachdem lesen der daten zeigt file_offset auf das ende der datei
wenn du die daten im buffer wieder in die datei schreiben willst (beginn bei byte 0 der datei)
musst du x.fileoffset = 0 machen, also genau so wie in meinem beispielprogramm


Christian

Also ich komm nicht dahinter...

Ich habe heute nochmal den halben tag probiert und versucht das Problem zu beheben... ich bekomme es nicht weg.

Der Baustein ist exakt der gleiche wie bei dir.

Im Anhnang habe ich dir das Projekt nochmal angehängt.
Wäre super wenn du dir das nochmal anschauen könntest. Ich bin mit meinem Latein am Ende. :-[

[gelöscht durch Administrator]

peewit

hallo

habe dein programm auf beckhoff-plattform getestet und dort gibt es auch das erwünschte ergebnis
der wert 789 wird auf 123 geändert

beschreibe mal deine plattform ganz genau
software,hardware

alternativ kannst du mal ansatt mode 2 den mode 3 benutzen
bei mode 3 wird die datei neu erzeugt, somit kannst du glück haben um damit deinen "append" effekt los zu werden
warum bei dir das so ist, müssen wir erst rausfinden...



Zitat<?xml version="1.0"?>
<Recording>
<Timestamp>DT#2012-01-13-14:17:37</Timestamp>
<Mblock axisid="1" type="5 ">
<Id>2</Id>
<Value1>123</Value1>
</Mblock>
<Timestamp>DT#2012-01-13-14:17:38</Timestamp>
<Mblock axisid="9" type="8 ">
<Id>3</Id>
<Value1>456</Value1>
<Value2>123</Value2>
</Mblock>
</Recording>
<?xml version="1.0"?>
<Recording>
<Timestamp>DT#2012-01-13-14:17:37</Timestamp>
<Mblock axisid="1" type="5 ">
<Id>2</Id>
<Value1>123</Value1>
</Mblock>
<Timestamp>DT#2012-01-13-14:17:38</Timestamp>
<Mblock axisid="9" type="8 ">
<Id>3</Id>
<Value1>456</Value1>
<Value2>123</Value2>
</Mblock>
</Recording>

Christian

Hallo,


zunächst die Idee mit
       FSD.MODE:= 3
hat funkrioniert. Jetzt habe ich das gewünschte Ergebnis - Vielen Dank.

Mich würde jetzt aber trotzdem interessieren, wie das append-ereignis zu Stande kommt, deswegen hier mal meine Voraussetzungen:
   -Controller: MOVIplc  DHR41B
   -Hersteller: SEW-Eurodrives
   -Software: MOVITOOLS MotionStudio
   -Sprache: CoDeSys2


Grüße Christian

peewit

also meiner meinung nach funktioniert die implementierung der SysLibFile.lib auf deiner sps nicht so wie erwartet

hast du zu deiner sps eine dokumentation für die file-bausteine


ich werde ein kleines testprogramm auf basis der originalbibliothek machen, damit man den systemfehler gezielt nachweisen kann.




Christian

Hi,


also ich hab jetzt mal rumgefragt, ob wir eine dokumentation haben.... bin aber nicht fündig geworden... tut mir leid.

peewit

hallo

ich habe nochmals alles gecheckt

im file_server habe ich einen kleinen trick bisher angewendet
nähmlich das ich die files zum schreiben im append mode öffne und dann aber den schreib-zeiger per software nachträglich verstelle.

den modus habe ich deshalb genommen, weil es egal ist ob eine datei vorhanden ist oder nicht

das hat auf den von mir getesteten system immer funktioniert
aber dann bist du gekommen :-)

das heisst ich muss nochmals alle verfügbaren modi prüfen, und es anders lösen , damit es auch auf deine sps läuft
leider stimmt die doku mit der realität nicht ganz zusammen, so das man auf mehreren systemen alles testen muss.