[WinCC flex] Werte aus DB-Array in Datei schreiben

xXyYzZ

Level-1
Beiträge
67
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen,

ich verwende WinCC flexible, vorab.

Ich hab in einem DB eine Array[1..25] mit 8 Einträgen. Über mulitplexen kann ich durch das Array blättern und sehe dementsprechend die Einträge auf dem Panel:

IndexVariable wird gesetzt (z.B. 3)
Aus der IndexVariable werden die Adressen innerhalb des DBs für die Einträge im Array berechnet
z.B mit IndexVariable = 3
Eintrag_1_index = 4
Eintrag_2_index = 8
Eintrag_3_index = 16
Eintrag_4_index = 20
z.B mit IndexVariable = 4
Eintrag_1_index = 38
Eintrag_2_index = 42
Eintrag_3_index = 50
Eintrag_4_index = 54

und damit dann: DB ??? DBW [Eintrag_?_index]

Denke das Prinzip wird deutlich.

Ich möchte die Werte jetzt gerne in eine CSV-Datei schreiben. Schaltfäche ---> Skript.

In WinCC möchte ich ungerne alle 200 (8*25) Variablen anlegen um diese dann in die Datei schreiben zu können. Gibt es die Möglichkeit innerhalb des Skriptes die IndexVariable in einer Schleife zu setzen (1...25) und dann dort die Werte aus dem DB auszulesen? Denke das Problem ist, dass der Wert für die IndexVariable erst am Ende des Skriptes in die Steuerung geschrieben wird, richtig?

Danke für eure Hilfe!
 
Hallo,
du könntest das auch in Flex als Array anlegen (allerdings nur 1D). Dann kannst du es im Script auch wie gewünscht verwenden.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Idee, versteh aber noch nicht ganz wie ich das machen soll.
Kannst du mir noch einen Tipp geben.

Für jede Variable im DB-Array eine Array-Variable in Flex. Wie mache ich das denn mit der Datenlänge? Habe im DB-Array unterschiedliche Typen...
 
... jetzt verstehe ich dich nicht ganz. Ein Array [1..25] of REAL (z.B.) kannst du auch genau so in Flex abbilden - du browst dich auf die Array-Variable und fertig ...
Das funktioniert allerdings nur mit Reintyp-Array's - mit einem Array of Struct leider nicht.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da weiß ich jetzt (außer der Einzel-Variablen) kein Lösung. Ein Adress-Muxen zum Zweck des Abspeicherns geht ganz sicher "in die Hose".

Vielleicht schreibst du doch mal etwas genauer über dein Vorhaben ...
 
Kann ich gerne machen: Ich ein "Array of Struct" mit acht Variablen (Datenlänge: 34). Das Array hat bislang eine Länge von 25.
Diese Array of Struct würde ich gerne in eine Datei auf dem HMI schreiben. Bislang zeige ich mir auf dem HMI immer nur die Werte der Variablen zum entsprechenden Index an. Da das Array noch wachsen wird, will ich ungerne alle Variablen von Hand in WinCC eintragen...
 
- Brauchst du immer alle Variablen in der SPS ... oder ist das eine Art Rezeptur-Anwahl ?
- Wenn du alle in der SPS brauchst ... ist es dann auch vorstellbar, mit Einzel-Array's zu arbeiten ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich gehe mal davon aus dass es um die Struktur aus diesen Thread geht, oder?
http://www.sps-forum.de/showthread.php/53979-WinCC-durch-Array-blättern

Prinzipiell ist es natürlich möglich den Multiplex-Index in einem Skript hochzählen zu lassen.
Das Problem ist dann aber an anderer Stelle. Denn du musst in dem Skript wissen, wann die Variablenwerte in der Struktur den aktuellen Wert gültig zum angewählten Index haben.
Das hängt zum einen von der Aktualisierungsrate der Variablen ab, zum anderen in welchen Abfragezyklus die Variablen einsortiert wurden. Denn man kann sich nur bei Array-Variablen sicher sein, dass diese in einem Rutsch abgeholt werden (und auch dann nur wenn sie in eine PDU passen). Das Array scheidet aber aus, da bei dir die Struktur veschiedene Datentypen beinhaltet.

Du musst auf jeden Fall eine Koordinierung zwischen Runtime und SPS schaffen, sodass die Runtime weiß dass alle Werte aktuell sind. Ich glaube aber nicht dass es da eine Systemfunktion gibt mit der man das abfragen kann. Und z.B. nur auf Änderung einer Variable in der Struktur zu reagieren reicht wegen dem oben geschilderten Problem - man kann sich nicht sicher sein dass die anderen auch schon aktuell sind - nicht aus.
 
Danke für die Anregungen, hab mal drüber nachgedacht.

Das mit dem Array scheidet aus, es sei denn, ich zerlege meine Array of Struct in die Dtentypen (Bool, Real, Int, Date_Time). Wobei ich die Bool Variablen dann als Int nehme, vllt. käme ich anstelle des Integers auch mit nem Byte aus. Müsste ich mir anschauen. Dann hätte ich zwei bis drei Array (of Int, of Real, of Date_And_Time) und könnte dann loslegen. Dann hätte ich die Einzel-Arrays. Wobei das zu viel Aufwand ist, ich hab gerade alles fertig an der Stelle (Array löschen, Arrayeintrag löschen, Multiplexen aus WinCC)

Für mich zum Verständis, da ich noch nie Skripte in WinCC flex verwendet:
  1. Während das Skript läuft kann ich jederzeit die Variablen von WinCC flex (und Wincc flex damm von der Steuerung abfragen), richtig?
  2. Ich kann aus dem Skript jederzeit Variable beschreiben und diese werden dann in die Steuerung geschrieben, richtig?
  3. Änderungen sind daher aus dem Laufendem Skript möglich.
Ich ändere also die MutliplexIndex und der FC in der SPS schiebt dann irgendwann die Daten zur Steuerung.

Mal angenommen ich schreibe den Index in den DBXX.DBW0.
Der FC rechnet rum und packt den Index nochmal in den DBXX.DBW20.
Die Daten landen im HMI und ich loope solange im Skript, bis ich meinen Index im DBW20 sehe. Danach lese ich die Daten und erhöhe meinen Index usw.

Du schreibst von der Rezepter-Anwahl, hab ich noch nie mit gearbeitet. Es werdem Prozessdaten aufgezeichnet, berechnet und in mein Array geschrieben.
Dies geschieht über bestimmte Triggerevents. Skriptbearbeitung nicht zu starten wenn die Daten aufgezeichnet werden, ist kein Problem.

Entschuldige wenn ich etwas wirr geschrieben, ein langer Tag heute und das musste noch aus meinem Kopf :D
 
Mal angenommen ich schreibe den Index in den DBXX.DBW0.
Der FC rechnet rum und packt den Index nochmal in den DBXX.DBW20.
Die Daten landen im HMI und ich loope solange im Skript, bis ich meinen Index im DBW20 sehe. Danach lese ich die Daten und erhöhe meinen Index usw.

Das geht so nicht.
1.) Man macht es nicht in einem Skript mit irgendwelchen Schleifen Zeit zu verbraten. Wenn dein Array 100 Datensatze hält dauert das Lesen mit dem Adressmultiplexen seine Zeit. Und so lange wäre das Panel nicht bedienbar. Außerdem ist es schlechter Stil.
2.) Auch wenn du in der einen Datensatz-Variable den Index von der SPS zurückgemeldet bekommst, heißt das noch lange nicht dass auch alle anderen Variablen aus der Struktur schon aktualisiert wurden. Es ist durchaus möglich dass die Daten des Datensatzes in verschiedenen Telegrammen abgefragt werden. D.h. die Daten sind unter Umständen nicht konsistent.

Wenn ich die Aufgabe hätte, würde ich über einen Datensatz eine Blockprüfsumme zu bilden.

Dazu bildet einmal die SPS eine Blockprüfsumme über den aktuell angefragten Datensatz. Die WinCC flexible Runtime liest die SPS-Prüfsumme, und berechnet aus dem Datensatz die eigene Prüfsumme. Stimmen beide Prüfsummen überein, so ist der ganze Datensatz aktuell und kann exportiert werden.

Damit man keine Warte-Schleifen benötigt kannst du Variablen-Änderungs-Skripte anlegen. Diese kann man an eine Variable "hängen" und werden bei Änderung dieser angestoßen. Konkret würde sich hierfür die SPS-Blockprüfsumme anbieten, denn diese wird ja in der SPS berechnet. Die Zuweisung des Ergebnisses kannst du in der SPS ggf. um einen Aktualisierungszyklus (z.B. 1s) verzögern. Dann kannst du fast sicher sein dass die Daten dann schon komplett sind. Wenn nicht, dann wird der Vorgang für den aktuellen Datensatz nochmal angestoßen.

Etwas Fehlerhandling drumherum, und dann sollte das so funktionieren.


Vielleicht geht es mit Rezepturen aber auch. Ich habe die immer umgangen, weil man oft auf Probleme stößt damit doch nicht lösbar sind.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Hinweise zur Programmierart - dass das Panel stoppt wusste ich z.B. nicht.

Find es klingt alles dehr kompliziert bis aufwendig, nur um ein paar Daten aus der SPS im HMI zu schreiben. Ich kann doch nicht der erste sein, der mit einer solchen Anforderung kommt, oder?

Was wäre denn mit einem String? Werte meines Arrays in ein String schreiben, senden. Der String wird komplett übertragen und ich kann auf änderung ein script aufrufen, dass den String in die datei schreibt.
Die Datei hinterher am PC auszuwerten und präsentieren wird kein Problem...
 
Nachdem ich mir das alles mal angesehen habe, werde ich es eine Nummer einfacher machen. Die Prozessdaten lasse ich ereignisgesteuert direkt in die Datei schreiben. Ist zwar nicht das optimale, aber nun ja - für ein nict-to-have-feature mache ich auch mal Abstriche!
 
Zurück
Oben