# WinCC Flex 28000 Datensätze auslesen



## Krumnix (5 November 2009)

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


----------



## Blockmove (5 November 2009)

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


----------



## Krumnix (5 November 2009)

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.


----------



## rostiger Nagel (5 November 2009)

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.


```
'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


----------



## Larry Laffer (5 November 2009)

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


----------



## Krumnix (6 November 2009)

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


----------



## Larry Laffer (6 November 2009)

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


----------



## santero (9 September 2010)

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


----------



## JoeJo (10 September 2010)

Hallo,
wie währe es  mit folgender Software:
ACCON-S7-Backup
http://www.deltalogic.de/component/option,com_virtuemart/page,shop.browse/category_id,49/Itemid,32/

Gruß
Joe


----------



## santero (13 September 2010)

ja danke aber scheint kostenpflichtig zu sein.

aber geiz iss geil wo ich arbeite *ROFL*


das muss doch mit VBS irgednwie gehen verdammt


----------



## JesperMP (13 September 2010)

1. Wie oft sollen die Daten gespeichert werden ?

2. Kannst du gar keine Änderungen in S7 Program machen ?


----------



## PN/DP (13 September 2010)

santero schrieb:


> 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.



santero schrieb:


> das muss doch mit VBS irgednwie gehen verdammt


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.
> 
> ...




```
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


----------



## JesperMP (13 September 2010)

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.


----------

