Skript struktur auslesen

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
dann könntest du es so machen, dass du die 8 Variablen der Struktur UDT_Mess in der Visu als Variablen anlegst und sie über die entsprechende Hilfsvariable(n) durchschaltest (im Prinzip indirekte Adressierung). Dann hast du aber immer nur einen Datensatz gleichzeitig ...

Gruß
Larry
 
hmm.. an sich wäre das ja egal, ich muss nur aufpassen dass er dann immer die richtigen Felder beschreibt.
Mir ist da noch eine Idee gekommen beim rundoktern, aber ich weiß nciht ob das so überhaupt funktioniert. Ich müsste dafür via skript in einem Bildbaustein dynamisch in abhägigkeit von einem Wert den Prozesswert eines EA-Feldes ändern, jedoch glaube ich dass es da keinerlei möglichkeit gibt oder ? wenn das so funktionieren würde, könnte cih einfach meine bisherige Struktur beibehalten. das wäre dann am einfachsten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst auch bei WinCC flex Variablen multiplexen / indirekt adressieren.
Damit kannst du z.B. den DB oder das Startbyte der Variablen mit einer anderen Variablen (Zeiger) übergeben.
Die Zeigervariablen lasse ich immer in der S7 berechnen. Ist meist weniger Aufwand als im Panel.

Gruß
Dieter
 
:confused: ... ich bleibe bei Confusing - Nomen est Omen ?

Was willst du denn nun auf einmal anzeigen ? Alle 384 Werte oder nur die 8 Werte der jeweils angewählten Messung ? Das letzt genannte würdest du mit meinem Vorschlag (sogar relativ einfach) realisieren können. Etwas Anderes solltest du vielleicht doch noch mal beschreiben ...

Gruß
Larry
 
Ok. Die 8 paramter sind zusammengenommen ein Messergebnis (typ, datum, wert, usw...). Davon werden insg 48 Gespeichert (FiFo) es werden pro Stunde etwa 20-30 Messungen durchgeführt. Meine Aufgabe ist es nun, diese Ergebnisse an zu zeigen. Da ich nicht alle 48 ergebnisse auf eine Seite quetschen möchte aber auch nicht "plump" 4 Seiten mit 12 Messergebnissen erstellen möchte, wollte ich eine Art dynamische tabelle machen, mit zwei knöpfen daneben, einer zum hoch und einer zum runterscrollen, d.h. immer 3 gespeicherte Werte weiterspringen. Z.B. Start steht ja der erste Messwert ganz oben. (also werden insg. die werte 1 - 10 angezeigt) Dann "scrolle ich runter, sodass ich nun die Werte 3-13 in meiner Tabelle eingetragen sehe.
Meine "zeilen" meiner Tabelle sollen also immer entsprechend gefüllt werden. Hab mir eine Zeile mal als Bildbaustein angelegt, damit ist die Zuordnung von Feld und Prozessvariable ja recht einfach. Nun ist ja aber das Problem, dass ich nicht immer den gleichen Speicherbereich auslesen will, und da liegt das Problem.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Blockmove: habe ich schon probiert, nur bekomme ich irgendwie nie den Wert rasu den ich haben will. Habe ja verschiedene Datentypen in dem DB gespeichert. Welchen Datentyp soll ich dann nun bei der Variablen Deklaration angeben? Weil egal was ich mach, er ließt mir nicht den von mir (vermeintlich) angegebenen Speicherbereich aus.
 
Tja die Strukturen in WinCC flex. sind leider etwas "unflexibel".

Du legst dir im Prinzip für jedes Element / Variable deiner UDT eine Variable des entsprechenden Typs (int,real,...) und einen Zeiger (int) an.
Der Zeiger muß auf eben auf das entsprechende Byte im DB zeigen.
Damit klappt der Zugriff eigentlich problemlos.

Gruß
Dieter
 
Rein theoretisch bräuchte ich dann aber nur einen Zieger, den ich modifiziere oder? Das müsste doch reichen.. Geht das auch mit einem im UDT enthaltenen String ? (20 zeichen, also 22 byte)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habs mal ausprobiert (so wie ich dich verstanden habe):
Code:
Dim DB, db_rating, bbyte, textfeld
bbyte = 46
SmartTags("DB_Measurement_info_curr_data") = bbyte
Set db_rating = SmartTags("DB_measurement_info_Test")
Set textfeld = HmiRuntime.Screens("0210_Z2_MasterMeasurement_Info").ScreenItems("Textfeld_2")
    textfeld.Text = db_rating    
ShowSystemAlarm("Bereich DB_measurement_info_Test[" & bbyte & "] gelesen. Wert: " & db_rating)

DB_Measurement_info_cur_data ist dei Variable in "[ ]" bei der DB-definition. Wird auch richtig umgestellt, jedoch ließt er mir den Speicherbereich nciht aus ( in dem Fall byte 46 [Integer]).
Hab ich irgendwas falsch bedacht?
 
Deine Variable DB_Measurement_info_curr_data muß in der Definition auf zyklisch aktualisieren stehen.
Und selbst dann ist nicht sichergestellt, dass es zuverlässig funktioniert, da vor der Ausgabe im Textfeld 2 erst die Variable von der Steuerung gelesen werden muß.

Ich berechne meine Zeiger meist (zyklisch) in der SPS. Somit stelle ich sicher, dass die Daten beim Zugriff konsistent sind.
Wenn ich es dann doch mal in der Runtime mache, dann meist so, dass ich die Pointer mit dem Ereignis zum "Bildwechsel" (z.B. Taste gedrückt) und die Variablenwerte dann mit "Bild aufgebaut" ermittle. Das Zusammenspiel von Variablenzugriffen und Scripten birgt viele Stolperstellen :cry: Manchmal wäre es mir auch lieber, wenn man hier das vermeintliche Multitasking / Parallelverarbeitung der Runtime abschalten könnte und auf eine strikte sequentielle Verarbeitung umstellen könnte.

Gruß
Dieter
 
Die Variable geht nur auf "zyklisch bei Verwendung" kann da nichts umstellen.
Wegen dem zieger: Ich finde es seltsam, das anscheinend der gesamte DB leer ist, ich hab mir ne schleife geschrieben, die quasi bbyte von 0 auf 2256(letztes byte des DB) immer um 1 erhöht und auf einen Wert != 0 geprüft. Jedoch scheint er mir nirgens einen Wert auszulesen, obwohl ich diesen davor über den "Win CC flexible runtime simulator" festgelegt habe. Kann es sein dass es daran liegt, das ich das Projekt nur simuliere un nicht an einer richtigen sps laufen habe ? oO
Dadurch dass ich nur Simuliere sehe ich (nach einer woche knapp s7 erfahrung) keinen weg den zeiger in der sps berechnen zu lassen und auf anhieb erkenne ich da auch keinen unterschied (?).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nachdem sich mein Win cc nun schon zum 2 ten mal verabschiedet hat, diesmal wegen angeblcih unzureichendem arbeitsspeicher, obwohl noch 1 gb frei war, vertage ich weitere Versuche das Problem zu lösen auf Montag. Schönes Wochenende euch allen :p
 
Ich denke Du wirst nicht um die Deklaration der 10 Felder herumkommen, wenn Du 10 Messwerte gleichzeitig anzeigen willst. Bei 8 Elementen aus der Struktur sind das 80 Ausgabefelder. Sofern die von mir vorgeschlagene Lösung noch in Erwägung gezogen wird:

DB "Daten" enthält das UDT "Mess" 48x als array[1..48]
DB "HMI" enthält das UDT "Mess" 10x als array[1..10]

In SCL wird dann gemäß dem Zeiger umkopiert: (quick & dirty)

Code:
HM_Zeiger := Zeiger; // Umkopieren des Zeigers vom HMI auf einen Hilfsmerker

FOR ii := 1 TO 10 DO
     IF HM_Zeiger >= 1 AND HM_Zeiger <= 48 THEN // Grenzen prüfen
          Status_SFC20 := BLKMOV(SRCBLK := "Daten".Messwert[HM_Zeiger],DSTBLK := "HMI".Messwert[ii]); // Daten umkopieren
     END_IF;
     HM_Zeiger := HM_Zeiger + 1; // Zeiger inkrementieren
END_FOR;

Am HMI dann halt noch die 80 Felder deklarieren. Z.B. "HMI".Messwert[1].Datum usw.
 
Zuletzt bearbeitet:
Jedoch scheint er mir nirgens einen Wert auszulesen
Variablen indirekt adressiert in einem Skript auslesen funktioniert nicht, wenn die Variablen auf "zyklisch lesen bei Verwendung" eingestellt sind. Das Skript wartet nicht, bis die Variablen (erneut) von der SPS gelesen wurden, sondern arbeitet mit dem Wert von der letzten Lesung oder mit 0, wenn noch nie gelesen.

Du mußt dafür sorgen, daß Deine Variablen vor der Verwendung gelesen werden (vielleicht mußt Du sogar eine Konsistenz beachten?). Entweder über "Zyklisch fortlaufend lesen" oder benutze die Systemfunktion GetDataRecordTagsFromPLC. Suche mal in der Forumssuche nach "multiplex" oder siehe hier:
http://www.sps-forum.de/showthread.php/54079-WinCC-flex-Werte-aus-DB-Array-in-Datei-schreiben
http://www.sps-forum.de/showthread.php/47637-Prozessdaten-einer-CPU-317-auf-Speicherkarte-eines-TP277-6-speichern

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie gesagt, kann das auslesen der Variablen nciht beeinflussen. Wollte es jetzt gestern aus Zeitgründen erstmla statisch versuchen, was auch an sich recht einfach ist und auch einwandfrei funktioniert. Jedoch habe ich mein Win cc irgendwie geschossen (?) nachzulesen hier: http://www.sps-forum.de/showthread.php/54523-Win-cc-Flex-L%E4sst-mcih-keine-Dateien-Spoeichern-startet-erst-garnicht?p=398204#post398204
Bevor das nciht eht kann ich ersmal keine weiteren tests machen. Trotzdem danke für den Vorschlag ;)
 
Zurück
Oben