OSCAT Forum

network.lib => Codesys 2 => Thema gestartet von: Christian am 21. Dezember 2011, 18:28:21

Titel: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 21. Dezember 2011, 18:28:21
Hallo,


ich bin neu hier und hoffe dass ihr mir weiter helfen könnt.

Mit Hilfe einer SPS (MOVIplc) lese ich verschiedene Motordaten aus mehreren Umrichtenr aus (Motortemperatur, Drehzahl usw...)
Diese werden in einem XML-File abgespeichert, da ich zu viele Daten habe, um Sie in einem Array zu Speichern.


Auf der OSCAT-Homepage bin ich auf den XML_READER gestoßen, der ja einzelne Tags der Datei auslesen kann. In der Dokumentation der Bibliothek ist dieser Baustein jedoch nur in Verbindung mit dem HTTP_GET Baustein verwendet, welcher den Anfang und das End der Daten angibt.

Um eine Datei zu öffnen habe außerdem den SYSTEM_FILE Baustein gefunden.

Meine Frage(n) ist (sind) nun:
1. Habe ich über haupt die richtigen Bausteine ausgesucht??
2. Wenn ja, wie kann ich die beiden Verbinden, sodass es funktioniert??


Grüße
Christian
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 21. Dezember 2011, 18:42:10
1. du hast die richtigen bausteine ausgesucht

2. mit dem file_server liest du die xml_daten in den network_buffer ein

3. dann kannst du mit dem xml_reader die daten auswerten !

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 22. Dezember 2011, 09:39:15
Vielen Dank für die schnelle Antwort.

Ich habe aber noch Fragen zur Anwendung der Bausteine:

1. Werden die Daten automatisch in den Buffer geladen?
2. Wie greife ich auf den Buffer zu??
    Die Variable "PT" ist ja ein Pointer auf ein Byte-Array. Um jetzt auf die Daten zugreifen zu können brauche ich ja zumindest
    die erste Adresse des Byte-Arrays. woher bekomme ich die??
3. Der Baustein XML_READER velangt ja ein Anfang und ein Ende der Daten. Im Beispiel der Dokumentation ist die mit     
    HTTP_GET.BODY_START bzw. .BODY_STOP realisiert.
    Wie würde das bei diesen beiden Bausteinen aussehen?


Grüße Christian

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 22. Dezember 2011, 18:15:21
hallo

wenn du den file_server mit den parametern versorgst, dann liest dieser die xml_datei automatisch in den network_buffer ein

der file_server und der xml_reader arbeiten beide mit dem gleichen datenarray
dieses datenarray ist vom type network_buffer

der zugriff auf die daten erfolgt nicht über pointer auch wenn so manche namensgebungen dies vermuten lassen
sondern mit simplen buffer_array index

wenn du daten mit den file_server in den network_buffer einliest, dann sind die daten im network_buffer folgend abgelegt

TYPE NETWORK_BUFFER :

NETWORK_BUFFER.SIZE = Anzahl der im buffer enthaltenen bytes
NETWORK_BUFFER.BUFFER[index] = zugriff auf die enthaltenen byte (achtung ! beginn ist bei index 0)


xml_reader.start = 0;
xml_reader.stop = NETWORK_BUFFER.SIZE - 1;

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 27. Dezember 2011, 16:21:47
Vielen Dank für die Antwort, aber ganz klar ist mir die sache noch nicht... :(

Vielleicht erkläre ich mal was ich eigentlich machen  will und füge mal meinen bisherigen Quelltext hinzu.

Ich habe einen Funktionsbaustein FB_XMLread, den ich in meinem Programm aufrufe und einige Werte übergebe.

Inenrhalb des Funktionbausteins rufe ich sowohl den Baustein XML_READER als auch den Baustein FILE_SERVER auf.
Mein größtes Problem liegt darin, dass ich mit den internen Variablen der beider Bausteine nicht zurechtkomme.

Mein bisheriger Quellcode sieht wie folgt aus:

VAR_INPUT
   Element:STRING(255);
   Attribute:STRING(255);
   Value:STRING(255);
   yFileName:STRING;
END_VAR
VAR_OUTPUT
END_VAR
VAR
   fbXMLread: XML_READER;
   fbFileOpen: FILE_SERVER;
   Path:STRING(255);


   (*fileOpen*)
   FSD : FILE_SERVER_DATA;
   PT : NETWORK_BUFFER;
   (*xml-Read*)
   CTRL : XML_CONTROL;
   BUF : NW_BUF_LONG;


   BufSize: UINT;
END_VAR
(*VAR_IN_OUT

END_VAR*)

yFileName := CONCAT(sCurrentFilenameMonitor,'.xml');
(*Dateikonfigurationen zum öffnen*)
FSD.FILENAME := yFileName;(*Dateiname an FILE_SERVER übergeben*)
FSD.MODE:= 1;(*Datei wird für Lesezugriff geöffnet*)
FSD.OFFSET:=0;(*Kein Offset beim öffnen der Datei*)


BufSize:= PT.SIZE;

fbFileOpen();


BufSize:= PT.SIZE;



CTRL.START_POS:= 0;
CTRL.STOP_POS := BufSize-1;
CTRL.ATTRIBUTE := Attribute;
CTRL.ELEMENT:= Element;
CTRL.VALUE:= Value;
fbXMLread.CTRL:=1;
fbXMLread.BUF:= BufSize;
fbXMLread();
Ctrl_1 := fbXMLread.CTRL;


Um schnelle Antwort wäre ich sehr dankbar.

Grüße Christian
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 27. Dezember 2011, 17:56:48
das ganze solltest du in einen ablauf verpacken (CASE OF x)

1. zuerst den file_server mit daten versorgen
2. dann auf ergebnis warten
3. xml_reader parameter übergeben
4. ergebnis verarbeiten
5. weiter in schritt 3

die rufst den file_Server auf ohne parameterübergabe ?
zyklisches berschreiben der schnittstelle bringt auch nichts
der xml_reader wird benutzt obwohl noch keine daten vorhanden sind
beachte das der xml_reader auch immer nur ein element der xml_daten pro aufruf zurückgibt
also ohne abfrage schleife etc... geht das sowieso nicht.

so einfach wie in deinem programm gehts auf keinen fall




ohne einen programmierten ablauf kommt da nichts sinnvolles raus

!!! wichtig !!!
schau dir doch mal die demo programme in der bibliothek an
dann siehst du wie man sie verwendet (z.b. yahoo_weather .... file demo bausteine)

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 28. Dezember 2011, 15:35:57
Hallo ich bins schon wieder - auch auf die Gefahr hin dass ich nerve.


Auf die Idee mit den Beispielprogrammen hätte ich auch selber kommen können.
Dabei habe ich zwei Beispiele für den XML-reader gefunden (einmal das yahoo-Beispiel und einmal das World-Weather-Beispiel).

Das Yahoo-Beispiel ist weitaus weniger komplex und ich denke für meine Zwecke ausreichend. Außerdem habe ich mir die Schrittkette in der Dokumentation angeschaut.

Mein Baustein habe ich verändert und wollte fragen, ob man da so machen kann. Meine Meinung nach müsste das jetzt so passen:
FUNCTION_BLOCK FB_XMLread
VAR
   (*Blockinstanzen*)
   fbXMLreader:XML_READER;(*Instanz von XML_READER*)
   fbFileOpen:FILE_SERVER;(*Instanz von FILE_SERVER*)
   (*definierte Datenstrukturen*)
   CTRL:XML_CONTROL;(*Control XML-reader*)
   FSD : FILE_SERVER_DATA;(*Contol File-open*)
   BUF_O:NETWORK_BUFFER;(*Buffer für XML-open*)
   BUF_R:NW_BUF_LONG;

   (*Variablen*)
   Mode:INT;(*Hauptmodus*)
   Mode_intern:INT;(*Modus für XML-analyse*)
   index:INT;(*Index 1 für BufferArray*)
   index2:INT;(*Index 2 für BufferArray*)
   stop:INT;(*StopIndex für BufferArray*)
   CommandRead:WORD;(*Kommando für XML-read*)
   CommandOpen:BYTE;(*Kommando für XML-open*)
   BufSize:INT;(*Buffergröße*)
   path_overflow: BOOL;
   RetVat:INT; (*Rückgabewert von XML-read*)

   (*Watchdog timer*)
   watchdog:TON;
END_VAR
VAR_INPUT
   yFileName:STRING;
   Attribute:STRING;
   Element_Level1:STRING;(*suchen nach axisID und BlockType*)
   Element_Level2:STRING;(*Suchen nach BlockID*)
   Element_Level22:STRING;(*Suche nach Value*)
   Value:STRING;
END_VAR
Mode:= 000;

CASE Mode OF
   000:(*Init FileOpen*)
      Init_FileOpen();
   010:(*Init FileRead*)
      Init_XMLread();
   100:
      IF index < 0 THEN
         CTRL.BLOCK1_START:= UINT#0;
         CTRL.BLOCK1_STOP := UINT#0;
         CTRL.BLOCK2_START:= UINT#0;
         CTRL.BLOCK2_STOP := UINT#0;
         watchdog(IN:=FALSE); (*Timer stoppen*)
      END_IF
      Mode := 200;
   200:(*XML auswerten*)
      Mode_intern := 10;
      WHILE CTRL.TYP < 98 DO
         fbXMLreader(CTRL:= CTRL, BUF:= BUF_R);
         CASE Mode_intern OF
            10:
               IF CTRL.ELEMENT = Element_Level1 THEN
                  Mode_intern := 20;
               END_IF
            20:
               IF CTRL.ELEMENT = Element_Level2 THEN
                  Mode_intern := 30;
               END_IF
            30:
               IF CTRL.ELEMENT = Element_Level22 THEN
                  Value := CTRL.VALUE;
                  RETURN;
               END_IF
         END_CASE
         CTRL.COUNT := CTRL.COUNT + 1;


      END_WHILE



END_CASE

Die beiden Init-Bausteine sehen wie folgt aus:
Init_FileOpen
-----------------
REPEAT (*solnge file NICHT geöffnet ist*)
   FSD.FILENAME:= CONCAT(yFileName , '.xml');
   FSD.MODE:=1;(*vorhandene Datei zum lesen öffnen*)
   FSD.OFFSET:= 0;(*start bei Dateianfang*)
   FSD.AUTO_CLOSE := T#0s; (*kein auto close verwenden*)
   BUF_O.SIZE:= 65535;(*Maximale Länge einlesen*)
UNTIL FSD.MODE = 0
END_REPEAT
BufSize :=  SIZEOF(BUF_O.BUFFER);
Mode := 010;

Init_XMLRead
-----------------
CommandRead :=  CTRL.COMMAND;
CTRL.COMMAND := WORD#0;

CTRL.START_POS:= 0;(*Übergebe die Startposition an den XML-reader*)
CTRL.STOP_POS := BufSize-1;(*Übergebe Endposition an XML-reader*)

index:= UINT_TO_INT(CTRL.START_POS);
stop:= UINT_TO_INT(CTRL.STOP_POS);
path_overflow:= FALSE;

CTRL.TYP := 0;(*Type-Code des aktuellen elements*)
CTRL.COUNT := UINT#00;(*Elementnummer 0*)
CTRL.LEVEL := UINT#00; (*Ebene 0*)
CTRL.ATTRIBUTE := ' ';(*Keine Ergebniswerte für Attribute*)
CTRL.ELEMENT :=  ' ';(*Keine Ergebniswerte für Element*)
CTRL.PATH := ' ';(*Kein Hierarchie als Text vergeben*)
CTRL.VALUE:= ' ';(*Kein Wert*);

BUF_R:= BUF_O.BUFFER;(*Übergabe der File-Open Buffer an read-Buffer*)

watchdog.PT :=  CTRL.WATCHDOG;



Mode := 100;




Vielen Dank schonmal für die Antwort

Grüße Christian
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 28. Dezember 2011, 16:17:32
hallo

das programm so im kopf durchzutesten wird schwierig

den file_server musst du auf jedenfall immer zyklisch aufrufen, da er auch noch dann dinge machen möchte wenn du
nichts mehr von ihm erwartest (so wie in allen beispiel programmen !!!)
du wirst überall das gleiche finden, also warum etwas neues erfinden

etwas mit repeat zu machen , ist sowieso selbstmord
solange die daten nicht fertig gelesen sind, hängt deine sps in dieser schleife

sowas machen normalerweise nur pc-programmierer, weil das ist es meistens egal
aber bei einer sps ist das sehr schlecht

schau dir doch auch die demo programm zum thema dateizugriff an !




Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 29. Dezember 2011, 16:41:45
Hallo,

Zunächst... natürich hast du mit der Repeat-Sache recht gehabt, das ist grober Unfug zumal das ganze ein wenig zeitkritisch ist - das habe ich nicht bedacht.

Das mit dem Öffenen der XML-Datei hat jedoch auf anhieb super geklappt - ich bin echt begeistert und die Demo-Programme ist klasse.

Jetzt ist mir aufgefallen, dass bei einmaligem Aufrufen des Funktionsbausteines sofort der WATCHDOG zuschlägt (watchdog-time beträgt 100ms).
Initialistiert habe ich den Baustein wie im DEMO-Programm, bzw. CTRL wie in der Dokumentation 0xFF.
Außderdem sind beide NETWORK_BUFFER-Variablen (ich habe eine zum Öffnen und eine zum Lesen angelegt gleich).
An was kann das liegen??


Dabei fällt mir noch eine Frage ein: Kann der XML_READER foglendes lesen bzw. wie liest er das ein:
            <Mblock axisid="1" type="1">
Hierbei ist ja "Mblock" ein Element, "axisid" ein Attribut und "1" ein Value;  "type" ein weiteres Attribut und "1" wiederum ein Wert.

Meinem Funktionsbaustein übergebe ich 4 Variablen, für jeweils einen Teil dieses Tags. Also Eine für das Element, jeweilt zwei für ein Attribut und einen Wert.
Kann der XML-reader auch den gesamten Tag lesen??


Vielen Dank schon mal für die Hilfe
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 29. Dezember 2011, 21:02:28
hallo

freud mich wenn sich jemand mal selber über meinen xml_reader drübertraut
das war ein ziemliche arbeit bis das ding richtig lief.

------------------
erklärung der watchdog:

es kann eine unbestimmte (lange) zeit dauern bis der xml_reader etwas passendes gefunden hat und somit die interne suchschleife wieder verlässt.

damit das sps programm hier nicht unnötig belastet wird und sein echtzeitverhalten verliert, habe ich den watchdog eingebaut.

es wird ein xml element ausgewertet , und wenn das kein erwünschtes ist und die watchdog time noch nicht abgeaufen ist
wird sofort das nächste element gesucht. der xml_reader bleibt solange im baustein hängen bis dieser ein element zum übergeben gefunden hat, oder die watchdog eine unterbrechung erzwingt.

wenn du bei CTRL.WATCHDOG eine zeit vorgibst dann kannst du die zeit beschränken
dann musst du aber aufpassen denn dann bekommst du nicht immer ein element zurück sonder manchmal auch den
typ 98 (watchdog) , was aber eine ganz normale sache ist.

wenn CTRL.WATCHDOG = 0 ist , dann können natürlich die 100ms oder mehr auftreten, da ja die watchdog
inaktiv ist.

---------------------
deine frage ob das auch geht   <Mblock axisid="1" type="1">
ja natürlich

schau dir mal die doku des baustein yahoo_weather an dort habe ich eine beispiel-xml datei reingegeben
da kannst du sehen was alles vom xml_reader verarbeitet werden kann.

------------------
tip !
wenn du eine immer gleiche xml_struktur hast und die elemente immer die gleiche position haben, dann kannst
du die auswertung so machen, wie ich es beim yahoo_weather baustein gemacht habe
hier wird einfach aufgrund der elementenummer eine zuordnung gemacht.
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 30. Dezember 2011, 11:05:27
Hi,


also ich habe meinen Feher gefunden: 0xFF ist KEIN Wort, wie es die Variable COMMAND verlangt sondern lediglich ein BYTE - ein Elend mit diesen binären Operationen ;D
Die Suche funktioniert wunderbar  :) - so kann das neue Jahr starten !!

Mein nächster Schritt wäre jetzt, zu einem späteren Zeitpunkt gezielte Daten zu verändern.
Wenn ich dich richtig verstanden habe, muss ich mir lediglich den CTRL.COUNT - Stand merken, das XML-File im WRITE-Modus öffnen und dann direkt den Werte darin Verändern und danach die Datei wieder schließen, oder??
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 30. Dezember 2011, 11:49:39
das mit den werte ändern ist ein problem

der xml_reader kann nur elemente lesen und nicht schreiben

ich habe schon öfters darüber nachgedacht, aber dabei keine einfache lösung gefunden
man müsste dann noch unterscheiden zwischen elemente ändern , einfügen und löschen

du musst das byteoffet herausfinden wo genau im buffer die daten stehen (das ist ja momentan schon gegeben)
dann können sich die daten verkürzen oder verlängern, somit müsstest du alle nachfolgenden byte verschieben
und dann den neuen wert eintragen...
zuletzt dann den buffer wieder auf die datei schreiben (wäre auch kein problem)

keine einfache sache...
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 30. Dezember 2011, 14:13:47
Soweit so gut...

ich habe mir da heute auch schon Gedanken gemacht und habe da auch eine Idee.

Ich verwende ja zum Öffnen der Datei den FILE_SERVER. Dieser kann ja sowohl Dateien im Read-Modus als auch im Write-Modus öffnen.

Meine Vorgehensweise sieht bislang wie folgt aus (Man sollte wissen dass das Öffnen und schreiben der Dateien nicht zyklisch ausgeführt wird, sondern über einen Systemzustand getriggert):
Funktionsblock1
1. Ich öffne die Dateien mit dem FILE_SERVER im Write-Modus
2. Ich Suche mir einen bestimmten Tag mit dem XML_READER
3. Merke mir den Offset im BUFFER
4. Ich schließe das File
---------------------------------------------------------------------------------
Ist die Abarbeitung von Funktionsblock1 abgeschlossen wird Funktionsblock2 aufgerufen:
Hier werden folgende Daten übergeben
  - Dateiname
  - Offset
  - zu schreibender Wert (Value:BYTE)
------
Funktionsblock2:
1. Ich öffne den FILE_SERVER im Write-Modus
   => PT.Offset := Offset;
   => PT.SIZE := SizeOf(Value);
  Jetzt habe ich ein Problem:
  Wie kann ich Value dem PT.BUFFER übergeben?? Bei mir kommt immer der Fehler dass BYTE nicht in ein ARRAY... OF konvertiert werden kann
---------------------------------------------------------


Kann man das generell so machen?? Wenn ich die beiden Funktionsblöcke kombiniere??


Gruß und einen guten Rutsch ins neue Jahr
Christian

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 31. Dezember 2011, 10:40:29
du kannst es sicherlich so machen

---------
Frage: value dem buffer uebergeben !
der baustein "string_to_buffer" hilft dir hier

die länge kannst du auch so bestimmen
PT.SIZE := LEN(Value);
----------
problem ist aber wenn dein neuer wert nicht die gleiche länge wie der alte wert hat, bleiben alte zeichen über oder du überschreibst andere teile

du könntest du werte in einer fixen länge dort ablegen   Value1="0000456"
maxmale zahlengroesse mit nullen aufgefüllt, so würden sich keine datenverschiebung ergeben

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 31. Dezember 2011, 12:22:08
Hi das hört sich super an.

Ich werds im neuen Jahr gleich mal ausprobieren wenn ich wieder im Betrieb bin.

Dir eine frohes neues Jahr. Und vielen Dank für die Hilfe.
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 09. Januar 2012, 11:41:10
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
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 09. Januar 2012, 21:11:51
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



Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 10. Januar 2012, 13:42:00
Hallo,


hier mein kleines Beispielprogramm.


Vieln Dank für eine Hilfe schon im Voraus.

Grüße
Christian

[gelöscht durch Administrator]
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 10. Januar 2012, 13:42:34
... und nun noch die XML-Datei, die ich verwendet habe.

[gelöscht durch Administrator]
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 10. Januar 2012, 22:51:19
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]
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 11. Januar 2012, 17:44:09
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
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 11. Januar 2012, 17:53:01
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

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 12. Januar 2012, 12:09:01
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.
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 12. Januar 2012, 15:57:32
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

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 13. Januar 2012, 14:53:53
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]
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 13. Januar 2012, 18:29:46
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>
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 16. Januar 2012, 14:31:46
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
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 16. Januar 2012, 17:40:08
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.



Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 18. Januar 2012, 10:43:58
Hi,


also ich hab jetzt mal rumgefragt, ob wir eine dokumentation haben.... bin aber nicht fündig geworden... tut mir leid.
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 19. Januar 2012, 18:27:40
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.

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian am 24. Januar 2012, 14:13:16
Hi,




sorry war die letzen anderthalb wochen krank - sonst hätt ich früher geantwortet.

Also zunächst entschuldigung für die zusätzliche arbeit  ;)

aber trotzdem freut es mich, dass ich anstoss zur weiterentwicklung geben konnte :)


grüße
Christian
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 02. März 2012, 16:19:42
hallo christian

ich habe mir das alles nochmals angesehen
es gibt keine andere möglichkeit wenn man eine bestehende datei beliebig beschreiben möchte als das man den append mode benutzt.

darum kann ich die bibliothek gar nicht anpassen (verbessern)

deswegen habe ich die Fa. SEW-Eurodrives kontaktiert und sie von dem Problem informiert

inzwischen habe ich auch schon eine rückmeldung erhalten

der fehler in der syslibfile.lib bei deiner SPS wurde mir bestätigt, und wird auch höchstwahrscheinlich mit erscheinen der nächsten firmware-release behoben sein.

du solltest deshalb in ein paar wochen nachschauen ob es eine neue firmware für deine sps gibt.

die aktuelle firmware deiner sps lautet "1820 7588.15 Build 1081" diese hat aber noch diesen besagten "schönheitsfehler"
sobald du eine neuere version findest, solltest du diese ausprobieren !


einen schönen dank noch an den netten techniker von SEW-Eurodrives !

Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Christian@SEW am 05. März 2012, 14:07:54
hallo christian

ich habe mir das alles nochmals angesehen
es gibt keine andere möglichkeit wenn man eine bestehende datei beliebig beschreiben möchte als das man den append mode benutzt.

darum kann ich die bibliothek gar nicht anpassen (verbessern)

deswegen habe ich die Fa. SEW-Eurodrives kontaktiert und sie von dem Problem informiert

inzwischen habe ich auch schon eine rückmeldung erhalten

der fehler in der syslibfile.lib bei deiner SPS wurde mir bestätigt, und wird auch höchstwahrscheinlich mit erscheinen der nächsten firmware-release behoben sein.

du solltest deshalb in ein paar wochen nachschauen ob es eine neue firmware für deine sps gibt.

die aktuelle firmware deiner sps lautet "1820 7588.15 Build 1081" diese hat aber noch diesen besagten "schönheitsfehler"
sobald du eine neuere version findest, solltest du diese ausprobieren !


einen schönen dank noch an den netten techniker von SEW-Eurodrives !



Hallo

Ich habe mich, wie versprochen, dem Thema angenommen.
Aus unserer IEC-Doku geht folgende Zuordnung der Mode-Argumente für den fOpen-Baustein hervor:

PrioritätIEC-ModusC-fopen Umsetzung
1 (höchste)     â€žrw“ (oder „wr“)     â€žw+b“
2„r"„rb“
3„w"„wb“
4 (geringste)„a"„ab“


Umsetzung laut
http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html (http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html)

Zitat
Opening a file with append mode (a as the first character in the mode argument) shall cause all subsequent writes to the file to be forced to the then current end-of-file, regardless of intervening calls to fseek().

Das Setzen des Filepointers ans Ende der Datei ist somit keine Fehlfunktion.
Nach Rücksprache mit unserer Firmwareentwicklung wird die Funktion, auch aus Gründen der Abwärtskompatibilität, nicht geändert.

Sie haben trotzdem die Möglichkeit die Funktion ohne Firmwareänderung wie gewünscht zu verwenden.
Sie müssen statt der Funktion "SysFileOpen" aus der "SysLibFile.lib" die Funktion "SysFileStreamFOpen" aus der "SysLibFileStream.lib" nutzen.

An diesem Baustein können die Argumente wie in C üblich übergeben werden.
FUNCTION SysFileStreamFOpen : DWORD
(* wrapper for ANSI C function
FILE *fopen( char *filename, char *mode );
*)
VAR_INPUT
FileName: STRING;
Mode: STRING [20]; (* can contain 'w' (write), 'r' (read), 'a' (append), '+', 'b', 't' *)
END_VAR
VAR
END_VAR




mfg
Christian@SEW


Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: Peter87 am 09. April 2014, 09:17:34
Hallo,

ich habe eine Frage zu dem XML_Reader: Wie kann ich die einzelnen Variablen aus der XML auslesen und deren Werte in CoDeSys-Variablen schreiben?


Grüße
Peter
Titel: Re: XML-Datei öffnen und bestimmten Eintrag suchen
Beitrag von: peewit am 09. April 2014, 13:42:55
das ist einfache frage aber eine sehr komplexe aufgabe das zu erklären

1. man muss wissen wie xml daten aufgebaut sind
2. verstehen wie der xml baustein funktioniert und angewendet wird (dokumentation lesen !!!!!!)
3. zum lernen und testen mit einer einfachen xml datei herumprobieren
4. optional kann man sich die wetter bausteine ansehen, da hier auf einer groesseren xml datei gewisse daten ausgelesen werden.

eine einfache antwort gibt es nicht....

trail and error.....