WinCC Flex 28000 Datensätze auslesen

Krumnix

Level-3
Beiträge
1.454
Reaktionspunkte
190
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.

Ich hab hier im Forum rumgesucht, aber hab nix gefunden, was mich bei meinem letzten Problem weiterhilft.

Ich hab 4 DBs in einer CPU-315. Der eine DB110 hat 6.000 Int-Werte,
der 2. DB120 hat 7.000 Int-Werte, DB130 hat 7.000 und DB140 hat
8.000 Int-Werte gespeichert.

Nun sollen diese Werte aus der SPS ausgelesen werden und in einer Datei
gespeichert werden. Das Auslesen und Speichern ist schon fertig. Aber ich
lese nur die Variable aus, die ich vorher definiert habe in WinCC Flex.

Nur ist der Aufwand 28.000 Variablen zu erstellen und dann in dem Script
jeweils zu schreiben einfach zu hoch und unnötig ;)

Kann ich nicht die Variable in VB-Script generieren und dort dann abrufen?

Danke
 
Du kannst in Flex. auch Arrays definieren. Allerdings ist die Anzahl der Elemente begrenzt. Ich meine irgendwo unter 2000 Int pro Array.

In wie weit allerdings das Einlesen von zig Tausenden Werten über ein OP sinnvoll ist, lass ich mal dahingestellt. Ich würd mir hier eher mal die Archiv-Funktionen anschauen.

Gruß
Dieter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich benutze nur die WinCC Flex Runtime. Das System läuft aber auf einem
Laptop dann. Der Kunde will mit dem dann von Anlage zu Anlage rennen.
Sind 4 Anlagen, wo diese DBs Ausgelesen werden sollen.

Die Speicherung erfolgt in einer Datei auf dem Rechner.
 
Hallo Krumnix,
mann kann sich die Variablen aus Strings zusammen setzen
Hier ein Beispiel wie ich mir eine Bildnavigation in Flexibel je
nach Maschinenbestückung automatisiere.

Code:
'Aggregat 141
i = SmartTags("Parameter\P._141.Nr")
If i = -1 Or  i > 10 Then
...
...
Else
'Bildnavigation einstellen
 SmartTags("Parameter\P._141.Blatt_zurueck") = Blatt_zurueck
 Blatt_zurueck   = 1411
 SmartTags(Blatt_vor) = 1411
 Blatt_vor    = "Parameter\P._141.Blatt_vor"
End if
 
 
'Aggregat 142
i = SmartTags("Parameter\P._142.Nr")
If i = -1 Or  i > 10 Then
...
...
'Bildnavigation einstellen
 SmartTags("Parameter\P._142.Blatt_zurueck") = Blatt_zurueck
 Blatt_zurueck   = 1421
 SmartTags(Blatt_vor) = 1421
 Blatt_vor    = "Parameter\P._142.Blatt_vor"
End if

gruß helmut
 
Hallo,
ich würde hier auch den Weg über Array's wählen. Wozu ich im Augenblick nichts sagen kann ist die Sache mit der Aktualisierung der Variablen. Anscheinend fordert Flex zwar bei Array's die Aktualisierung auch im Script an, dass kann dann aber "ein bißchen" dauern.
Die Verwendung von Array's setzt natürlich auch für alle Elemente den gleichen Datentyp (oder einen kompatiblen) voraus.

Was mich hier aber interessieren würde ... Was steht denn in den 28000 Variablen alles Tolles drin, dass das unbedingt gesichert werden muß ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, irgendwelche Messung, Berechung, etc.
Das Programm in der CPU ist nicht von mir ;)

Der Kunde möchte halt gerne einmal die Woche (am Wochenende) die
Daten aller DBs sichern, wo was wichtiges drin stehen könnte.

Ich habe das nun über ein Array gemacht. Das funktioniert sogar recht gut.
Muss nur für jeden DB ein Script starten lassen, da sonst WinCC Flex sich
aufhängt, wenn ich in einer Schleife mehrere große DBs auslese ;)

!Nun habe ich eine weitere Frage!
Da ich zum Auslesen ein Array des Types Int gewählt habe, sind natürlich alle
Daten als Int vorhanden.

Jetzt sind aber (weiß ich erst seit heute -.-) in einem DB an jeder 30.
Stelle 6 Chars vorhanden. Also ein String aus 6 Zeichen sozusagen.
Wenn ich aber das als int auslese, bekomme ich ja keine Möglichkeit, den
int in string zu wandeln, so das der Wert stimmt.
AC wäre dann 16707. Wenn ich dann CStr mache, steht später nicht AC, sondern
logischer weise 16707 drin.

Wie kann ich jetzt aus dem Intwert ein AC z.b. bekommen, ohne eine riesige
eigene Auswerte-Funktion zu programmieren?
Gibs da einen Trick oder schon ne Funktion in VBS bei WinCC Flex?

Danke
 
Hallo,
um die "riesige eigene Auswertefunktion" kommst du m.E. nicht herum (außer mit Einzel-Variablen oder einer Struktur - was ja wieder Einzel-Variablen wären).
Für einen STRING geht das ja aber noch. Richtig lustig wird das, wenn du einen REAL dazwischen hast. Hier kann dir nur helfen, wenn es dir gelingt sinnvoll Blöcke zu bilden - 1 DB muß ja nicht unbedingt 1 Array sein ...

Gruß
LL
 
Hallo zusammen,

hab da ien ähnliches Problem.Habe in der Steurung ein paar DBs mit Messwerten.Möchte diese jetzt mittels PC run time und VBS in eine Datei schreiben.Das Schreiben läuft soweit.

wenn ich mir mit alt + -> mien array ins programm hole sieht das so aus

SmartTags("DB4.Meinarray")

Die große Frage ist jetzt wie ich an die einzellnen elemente drannkomme z.b. in einer Schleife:confused::confused:
 
ja danke aber scheint kostenpflichtig zu sein.

aber geiz iss geil wo ich arbeite *ROFL*


das muss doch mit VBS irgednwie gehen verdammt :confused:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
aber geiz iss geil wo ich arbeite *ROFL*
Vielleicht ist dieses kostenlose Tool von MHJ für Deine Aufgabe geeignet:
BUDdy for S7-PLCs (Block Up- and Download for S7-PLCs)

Wenn Arbeitszeit "nichts" kostet, kann man sich mit Excel/VBA und LibNodave ein eigenes Tool schreiben.
Dann kann man auch das Dateiformat vollkommen selbst bestimmen.

das muss doch mit VBS irgednwie gehen verdammt :confused:
Auszug aus der WinCC flexible Hilfe:
Grundlagen zu Arrays

Bei einem Lesezugriff oder Schreibzugriff auf ein einzelnes Arrayelement werden immer alle Arrayelemente der Arrayvariablen gelesen oder geschrieben. Daher dauert bei großen Arrays die Datenübertragung von und zur Steuerung generell länger als bei einem elementaren Datentyp. Dies kann die Kommunikation überlasten und dadurch stören.

Verwendung in Skripten

Aus den gleichen Performancegründen verwenden Sie in Skripten zum Ändern von Arrays immer interne, temporäre Arrays.
1. Am Anfang des Skripts kopieren Sie das PLC-Array in das interne Array.
2. Während das interne Array durch das Skript bearbeitet wird, belasten Sie dadurch nicht die Datenübertragung zur Steuerung.
Code:
Dim i, value, MeinArray(13) ' Array mit 14 Elementen, Größe anpassen!

MeinArray = SmartTags("DB4.Meinarray")

For i = 0 To 13
  value = MeinArray(i)
  ' ...
Next
Harald
 
Ganz einfach wird es nicht. Auch nicht mit Arrays und Skripte.

Bei S7-300 kann der HMI nicht 12000 bis 16000 Bytes auf einmal holen.
Ein polling von so viele Daten wird in Teilen von 222 Bytes augeteilt (PDU Grösse von S7-300 CPU).
Also muss man irgendwie erkennen das alle Daten transferiert wurde. Sonnst speichert man teilweise alte Daten.
 
Zurück
Oben