winncc flex scripte datum suchen

Fanta-Er

Level-2
Beiträge
198
Reaktionspunkte
16
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich soll das letzte Datum aus einer XML-Datei finden.
info XML: http://www.sps-forum.de/showthread.php/41294-Wie-kann-ich-in-WinCC-Daten-im-exportieren-mit-XML

Das Datum steht in diesem Format in der Datei: <usDatum>2012-11-13T18:03:00</usDatum> Aber davon gibt es mehrere.
Nach diesem Datum müssen 5 Werte ausgelesen werden. Das ist nicht wirklich das Problem. Aber mir fehlt im Moment eine Sinnvolle Schleife um das LETZTE DATUM zu finden.
Hat jemand eine Idee oder kann mich in die richtige richtung schubsen? Theoretisch sollte das letzte Datum am Ende stehen (Anfang letzten Datenblock). Eine Schriftliche bestätigung dafür habe ich nicht bekommen. :)


System:
PC477 mit Flex 2008 SP3 und RTX

Danke im vorraus.....
 
Hallo,
wenn das Such-Datum nicht das "Letzte" ist dann mußt du ggf. in 2 Schleifen arbeiten. Als Erstes scannt du dein File nach der Index-Position des letzten (höchsten) Datums-Stempels und merkst dir den. Danach lädst du dir den raus.
Ich würde nicht versuchen, alle Einträge im Arbeitsspeicher der Visu vorzuhalten und daraus dann den Richtigen auszugeben - ich glaube, das gibt die Visu nicht her ... und so viel Zeit sollte das ggf. 2malige Lesen auch nicht verbrauchen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Geht auch mit nur 1x lesen:
Nach dem Finden eines Datums die 5 Werte zunächst nur temporär zwischenspeichern und weiterlesen. Wird ein weiteres Datum gefunden, dann wieder 5 Werte in die selben Variablen lesen. Am Dateiende die 5 Werte ausgeben - es sind die, welche zuletzt gefunden wurden.

Harald
 
danke euch.........
die idee mit den zwischenspeichern ist nicht schlecht.

mein ansatz:
X_datum = 0
X_zeit = 0
X_zeile = 0

- datei öffnen
x:kontrolle ob dateiende ereicht
- position (zeile) speichern
- zeile einlesen und speichern
- mit split in array zerlegen trennzeichen > "<usDatum>2012-11-13T18:03:00</usDatum>"
- kontrole ob <usDatum = array[1]
wenn nein dann sprung x
ja: Datum in DINT(long) speichern "20121113"
Zeit in DINT(long) speichern "180300"
-kontrolle ob größe zahl schon in X_datum,X_zeit gespeichert ist
nein: datum,zeit und zeile in X_datum,X_zeit und X_zeile speichern und sprung x
ja: sprung X

gehe zu position zeile und die nächsten 15 zeilen speichern und bearbeiten.

daraus ergeben sich nur zwei fragen:
1) mit len kann ich mit die position der zeile einlesen ABER wie kann ich wieder dahin springen? muss ich wirklich jede zeile einlesen bis ich im loop auf meiner position gelandet bin?
2) ist da mit ein 50kb datei noch machbar oder anklicken und kaffee holen?

fals ich einen fehler in dem gedankengang habe bitte berichtigen antworten.

dicks danke an euch beide.....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
daraus ergeben sich nur zwei fragen:
1) mit len kann ich mit die position der zeile einlesen ABER wie kann ich wieder dahin springen? muss ich wirklich jede zeile einlesen bis ich im loop auf meiner position gelandet bin?
2) ist da mit ein 50kb datei noch machbar oder anklicken und kaffee holen?

fals ich einen fehler in dem gedankengang habe bitte berichtigen antworten.

Hallo,
deine Ablauf-Realisierung liest sich auf den ersten Blick ganz logisch ... :)
Ob ich hier mit Split arbeiten würden weiß ich nicht - meine erste Wahl wäre InStr bzw. InStrRev ...
Mit deiner Frage 1 kann ich so gar nichts anfangen - erklär das noch mal bitte ...
Wegen der 50 kByte würde ich mir erstmal gar keine Gedanken machen. Dennoch wäre hier wichtig zu wissen, wie schnell das denn sein soll und in welchem Zeitraster das wiederholt werden soll ...

Gruß
Larry
 
morgen/mahlzeit.....

Habe mich wirklich eine wenig schlecht ausgedrück.


Set Datei = FSO.OpenTextFile(Dateiname, ForReading, False)
Zeile = 1
While Not Datei.AtEndOfStream ' Datei bis zum Ende durchlaufen
TextZeile = Datei.ReadLine ' Lesen einer Zeile

TextFeld = Split(TextZeile,";") ' Zeile an Semikolon trennen und die Werte in einem ' Array speichern

SmartTags("Text_" & Zeile & "1") = TextFeld(0) ' Werte aus dem Array in Variablen speichern
SmartTags("Text_" & Zeile & "2") = TextFeld(1) ' Werte aus dem Array in Variablen speichern
SmartTags("Text_" & Zeile & "3") = TextFeld(2) ' Werte aus dem Array in Variablen speichern

Zeile = Zeile + 1
Wend

Das Beispiel ist nur zur Verdeutlichung da.
Auf diese Art weis ich in welcher Zeile ich bin und was drin steht (meine datumsüberprüfung von oben statt nur split).
Wenn ich jetzt das letzte Datum gefunden habe, weis ich auch an welcher Position es im Textfile(xml) steht und ich müste nur dorthin springen.
Ich habe nur keinen Befehl oder Syntax gefunden, beidem ich sage: Lese Zeile 16 und kopiere Inhalt in VariableSpeicher.

Gib es so einen Befehl oder muss ich Spalte für Spalte einlesen bis ich an Position Zeile-1 bin?

Geschwindigkeit ist erstmal nicht so wichtig. Sollte aber 5sec nicht überschreiten. Ich hoffe Flex läuft schnell genug auf dem PC477.

MfG
Fanta

p.s. danke für den Tipp mit InStr bzw. InStrRev. Werde mir die Befehle mal genauer anschauen.
 
Zuletzt bearbeitet:
... dann hast du den Beitrag von Harald nicht richtig verstanden.
Du mußt nicht zurückspringen oder noch einmal lesen. Du liest dir ja in jedem Fall jede Zeile ein. Nun speicherst du sie zwischen wenn der Datums-Eintrag dieser Zeile > ist als der der letzt-gespeicherten (also des Zwischen-Speichers). Am Ende hast du dann den gewünschten Datensatz im Zwischenspeicher stehen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort.
Doch habe ich. Das Problem ist nur, das meine Datenpaket in dem File verschieden groß sind.
D.H. ich kann nicht einfach sagen: Datum + nächsten 15 Zeilen. Jehe nach Datenpaket ist meine Information an Stelle 10, 13 und 19 oder 5, 9 und 15 usw. Die Suchroutine von wem das Datenpacket ist wollte ich nicht noch in die Schleife einbauen. Wenn dann eine Störung oder Fehler von mir drin ist/sind, suche ich mir einen Wolf. Die Hoffnung war/ist die Funktionen Trennen zu können.

Hintergrund:
Ich sende einen Prüflings-DMC und Auftragsnummer mit meiner Maschinen ID an Leitsystem.
Danach bekomme ich alle Ergebnisse von dem Prüfling zurück. Da drin können verschiedene Maschinen oder ich selber die Ergebnise abgelegt haben. Das besondere ist eben, dass wir alle verschieden Mengen von Ergebnissen(Spaltenanzahl) haben.
Mein eigenes Ergebnis kann die Prüfung freigeben(jeh nach Zählerstand) aber auch zwei andere Maschinen.

Frag mich nicht warum es so ist. Die Wege des Kunden sind unergründlich.

Fanta
 
Kannst du das einfach mal mit ein bis drei Beispielen verdeutlichen ?
Schön wäre, wenn man den kompletten XML-Block sehen könnte ...
 
klar...
Beispiel vorrangegange Maschine:
<usDatum>2012-10-29T23:15:00</usDatum>
<usNrHistPB>5</usNrHistPB>
<usPfAbsch>12</usPfAbsch>
<usPfStatus>IO</usPfStatus>
<usPfBankNr>DH01</usPfBankNr>
<uszaehler>1234</uszaehler>
<usSAVID>T54</usSAVID>
<usChgnrgeh>GEH11</usChgnrgeh>
<usChgnrsav>F32Q2</usChgnrsav>
<uswertmpfvs>23.000000</uswertmpfvs>
<usWertmpfhs>1001.000000</usWertmpfhs>
<usWertmpfsav>2034.000000</usWertmpfsav>
<uswertfdpf>45.000000</uswertfdpf>
<usFdio>IO</usFdio>
<usMio>IO</usMio>
<usSav0ab>2789.000000</usSav0ab>
<usAdruck1>999.000000</usAdruck1>
<usDspoeffGMS>11.000000</usDspoeffGMS>
<usSchDruck>22.000000</usSchDruck>
<usKschdruck>33.000000</usKschdruck>
<usLpfdurch>44.000000</usLpfdurch>
<usLpfpd>55.000000</usLpfpd>
<usSpunktGMS>66.000000</usSpunktGMS>
<usUebstroemGMS>77.000000</usUebstroemGMS>
<usOepunktGMS>3455.000000</usOepunktGMS>
<usAdruck2>3434.000000</usAdruck2>
<usGsausl>233.000000</usGsausl>
<usSAVSchalt1>3333.000000</usSAVSchalt1>
<usSAVSchalt2>4444.000000</usSAVSchalt2>
<usReserve>TEST123</usReserve>
<usSN/>
<usEigenNr/>
<usZuliefNr/>
<usAnfSN>1</usAnfSN>
<usPrfStatus>IO</usPrfStatus>

Mein eigener:
<usDatum>2012-09-23T07:47:22</usDatum>
<ANr>K00010000-001</ANr>
<MNr>101N0578</MNr>
<RNr>1852</RNr>
<usGID>22552255</usGID>
<usNrHistPB>5</usNrHistPB>
<usPfAbsch>12</usPfAbsch>
<usPfStatus>IO</usPfStatus>
<usPfBankNr>DH01</usPfBankNr>
<uszaehler>1234</uszaehler>
<usSAVID>t54</usSAVID>
<usChgnrgeh>geh11</usChgnrgeh>
<usChgnrsav>f32q2</usChgnrsav>
<uswertmpfvs>23</uswertmpfvs>
<usWertmpfhs>1001</usWertmpfhs>
<usWertmpfsav>2034</usWertmpfsav>
<uswertfdpf>45</uswertfdpf>
<usFdio>IO</usFdio>
<usMio>IO</usMio>
<usSav0ab>2789</usSav0ab>
<usAdruck1>999</usAdruck1>
<usDspoeffGMS>11</usDspoeffGMS>
<usSchDruck>22</usSchDruck>
<usKschdruck>33</usKschdruck>
<usLpfdurch>44</usLpfdurch>
<usLpfpd>55</usLpfpd>
<usSpunktGMS>66</usSpunktGMS>
<usUebstroemGMS>77</usUebstroemGMS>
<usOepunktGMS>3455</usOepunktGMS>
<usAdruck2>3434</usAdruck2>
<usGsausl>233</usGsausl>
<usSAVSchalt1>3333</usSAVSchalt1>
<usSAVSchalt2>4444</usSAVSchalt2>
<usReserve>Test123</usReserve>
<usSN></usSN>
<usEigenNr></usEigenNr>
<usZuliefNr></usZuliefNr>
<usAnfSN>1</usAnfSN>
<usPrfStatus>IO</usPrfStatus>

Sind jetzt nur Beispiele. Der Dateninhalt ist noch nicht richtig.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ist nicht schlimm ... Auf den Inhalt kam es mir nicht an.

Ich hatte die XML-Struktur ein wenig verschachtelter erwartet ... aber nun gut.
Wenn ein Datenblock immer mit <usDatum> beginnt dann ist es doch ziemlich einfach (nach meiner Meinung).
Du machst dir für den Zwischenspeicher ein Array (in VB), dass du großzügig dimensionierst. Alle Zeilen nach dem Datum schreibst du da rein (oder ggf. sogar das). Alle nicht benötigten Array-Elemente bis zum Ende schreibst du auf "". Beim späteren Verwenden ist dann dein Datenblock eben das, bis zum ersten Leer-Element.
Kannst du mir folgen ?

Gruß
Larry
 
klar:
sieht etwa so aus:
<usDatum>2012-10-29T23:15:00</usDatum>
<usNrHistPB>5</usNrHistPB>
<usPfAbsch>12</usPfAbsch>
<usPfStatus>IO</usPfStatus>
<usPfBankNr>DH01</usPfBankNr>
<uszaehler>1234</uszaehler>
<usSAVID>T54</usSAVID>
<usChgnrgeh>GEH11</usChgnrgeh>
<usChgnrsav>F32Q2</usChgnrsav>
<uswertmpfvs>23.000000</uswertmpfvs>
<usWertmpfhs>1001.000000</usWertmpfhs>
<usWertmpfsav>2034.000000</usWertmpfsav>
<uswertfdpf>45.000000</uswertfdpf>
<usFdio>IO</usFdio>
<usMio>IO</usMio>
<usSav0ab>2789.000000</usSav0ab>
<usAdruck1>999.000000</usAdruck1>
<usDspoeffGMS>11.000000</usDspoeffGMS>
<usSchDruck>22.000000</usSchDruck>
<usKschdruck>33.000000</usKschdruck>
<usLpfdurch>44.000000</usLpfdurch>
<usLpfpd>55.000000</usLpfpd>
<usSpunktGMS>66.000000</usSpunktGMS>
<usUebstroemGMS>77.000000</usUebstroemGMS>
<usOepunktGMS>3455.000000</usOepunktGMS>
<usAdruck2>3434.000000</usAdruck2>
<usGsausl>233.000000</usGsausl>
<usSAVSchalt1>3333.000000</usSAVSchalt1>
<usSAVSchalt2>4444.000000</usSAVSchalt2>
<usReserve>TEST123</usReserve>
<usSN/>
<usEigenNr/>
<usZuliefNr/>
<usAnfSN>1</usAnfSN>
<usPrfStatus>IO</usPrfStatus>
</results></Request></ResponseGetTestResults>


Dann eben von verschiedenen Maschinen oder mein eigener.

p.s. von der Sorte hängen in der Datei nur eben viele so das die datei auf etwa 30-50kb kommt. Jeh nach dem wieviele wiederholungen in den Maschinen gemacht worden sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
jup...kapiert.
sry für den doppelpost (xml-auszug). dachte mein erster beitrag wäre nicht angekommen.
hast eigentlich absolut recht die variablen liegen ja nur kurzzeitig im script und die datumssuche ergänze ich einfach mit der suche nach "<results>".
hab mal eine komplette datei mit dran gehängt.
Kostenlos und ohne Anmeldung Dateien und Bilder hochladen!
nicht speichern, sonder mit editor öffnen.

Danke euch beiden......:ROFLMAO:

p.s. wollt ihr das fertige ergebnis sehen?
 
Zuletzt bearbeitet:
@ Larry Laffer & @ rostiger Nagel

danke nochmal an euch beiden. hab die aufgabe gelöst und die vorschläge haben sehr geholfen. das ganze ist dann noch ein wenig angewachsen und ich habe etwa 10 scripte gebraucht und diese teilweise nochmal in einander verschachtelt.
gab noch ein paar überraschungen wie: alle maschinen schreiben in den gleichen ordner und sie dürfen sich ihre datei raussuchen und danach wieder löschen. ignorieren sie einfach die zahlen in ihrem dateinamen. kommas mögen wir in xml garnicht nur punkte. die variablen stehen nicht immer in der reihenfolge. suchen sie sich ihre raus, name steht ja vorne usw usw.

naja..... leben geht weiter.

kleine randinfo: die scripte werden von flex aus direkt im windoofs ausgeführt. der befehlsvorrat ist beschnitten, damit siemens die projekte einfacher vom CE (z.b. mp377) auf xp (pc477) wandeln kann (änderung des panels im flexible).
theoretisch steht einem der übrig gebliebene ram des gerätes zur verfügung (aussage siemens). es ist also möglich sogar mb im script zu verarbeiten.

sollte jemand fragen zu diesem thema haben, anschreiben oder thread aufmachen :)

die endgültige lösung würde hier den rahmen sprengen.
 
Zurück
Oben