TIA CSV Datei in DB einlesen

Zuviel Werbung?
-> Hier kostenlos registrieren
Siehe #11:
Dein VBS-Code liest zuerst Zeile für Zeile alle Zeilen der csv-Datei in immer den selben Puffer (data) ein und nachdem das Ende der Datei erreicht wurde wird die zuletzt eingelesenen Zeile (die letzte Zeile der Datei) in hoffentlich 15 Werte gesplittet und 15 HMI-Variablen zugewiesen. Willst Du tatsächlich immer nur den allerletzten Datensatz/Zeile aus der csv-Datei in die SPS übernehmen? Oder müsstest Du nicht vielmehr nach jeder Zeile den Datensatz in die SPS schreiben? (dann ist Deine Schleife falsch/das "Wend" steht an falscher Stelle, das Daten splitten und in die SPS schreiben müsste innerhalb der Schleife stehen)
 
Im Endeffekt ja ich würde gerne Maximal 5000 Werte auf einzelne Variable schreiben.

Das Skript mit den 15 Variablen ist Beispielhaft denn ich Schreibe kein Skript mit 5000 Variablen wenn ich nicht weiß ob es klappt.

Das Problem ist folgendes: Ich Teste das gerade und lese mit dem geposteten Skript eine CSV Datei ein mit 5 Spalten und 4 Zeilen. das lasse ich mir auf meinem Panel in 20 E/A Feldern anzeigen also Jeder wert der CSV eine Variable. Beim einlesen liest das Skript die Daten ein überschreibt aber die Werte mit den Werten aus der letzten Zeile. Das heißt ich hab zum Schluß 5 Werte aus der vierten Zeile abwechselnd in den 20 E/A Feldern stehen und nicht alle 20 Werte. Und nochmal Die 15 oder 20 Werte sind Beispielhaft um zu Testen ohne ein Skript für 5000 Werte zu schreiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In deiner Scleife zum Auslesen der Daten zählst du ja nichts hoch was dir hilft das die Daten an einer anderen Stelle des Arrays landen.
Du schreibst ja immer fest auf die gleiche Variable und überschreibst damit die Daten von vorher logischerweise.
Es ist doch unerheblich ob 15 oder 5000 Werte in der Datei stehen.
dann läuft die Schleife halt länger aber das Ändert doch am Code nichts.
Solltest du das alles einzeln Zuweisen wollen dann überdenk besser mal deinen Ansatz.

Ich würde es eher so machen:

i=0
while
smartTags("Biegen")(i)=splitdata(0)
smartTags("Biegen")(i+1)=splitdata(1)
i=i+1
wend

Gruß

Jens
 
Das Skript mit den 15 Variablen ist Beispielhaft denn ich Schreibe kein Skript mit 5000 Variablen wenn ich nicht weiß ob es klappt.

Das Problem ist folgendes: Ich Teste das gerade und lese mit dem geposteten Skript eine CSV Datei ein mit 5 Spalten und 4 Zeilen. das lasse ich mir auf meinem Panel in 20 E/A Feldern anzeigen also Jeder wert der CSV eine Variable.
Also wenn Du schon nicht das Einlesen von 20 Variablen aus 4 Zeilen mit je 5 Werten logisch auf die Reihe bekommst - wie soll das erst mit 5000 Variablen aussehen?

Das Einlesen Deiner 4 Zeilen mit je 5 Werten in 20 Variablen müsste etwa so aussehen:
Code:
fo.open path, mode
If Err.Number <> 0 Then
...
End If

data = fo.LineInputString [COLOR="#008000"]'1. Zeile mit 5 Werten[/COLOR]
data = Replace(data, vbTab & vbTab, delimiter)
splitdata = Split(data, delimiter)
[COLOR="#008000"]'hier sollte UBound(splitdata) geprüft werden! Mit Ausgabe Fehlermeldung mit Zeilennummer![/COLOR]
SmartTags("Variable_01") = splitdata(0)
SmartTags("Variable_02") = splitdata(1)
SmartTags("Variable_03") = splitdata(2)
SmartTags("Variable_04") = splitdata(3)
SmartTags("Variable_05") = splitdata(4)

data = fo.LineInputString [COLOR="#008000"]'2. Zeile mit 5 Werten[/COLOR]
data = Replace(data, vbTab & vbTab, delimiter)
splitdata = Split(data, delimiter)
[COLOR="#008000"]'hier sollte UBound(splitdata) geprüft werden! Mit Ausgabe Fehlermeldung mit Zeilennummer![/COLOR]
SmartTags("Variable_06") = splitdata(0)
SmartTags("Variable_07") = splitdata(1)
SmartTags("Variable_08") = splitdata(2)
SmartTags("Variable_09") = splitdata(3)
SmartTags("Variable_10") = splitdata(4)

data = fo.LineInputString [COLOR="#008000"]'3. Zeile mit 5 Werten[/COLOR]
data = Replace(data, vbTab & vbTab, delimiter)
splitdata = Split(data, delimiter)
[COLOR="#008000"]'hier sollte UBound(splitdata) geprüft werden! Mit Ausgabe Fehlermeldung mit Zeilennummer![/COLOR]
SmartTags("Variable_11") = splitdata(0)
SmartTags("Variable_12") = splitdata(1)
SmartTags("Variable_13") = splitdata(2)
SmartTags("Variable_14") = splitdata(3)
SmartTags("Variable_15") = splitdata(4)

data = fo.LineInputString [COLOR="#008000"]'4. Zeile mit 5 Werten[/COLOR]
data = Replace(data, vbTab & vbTab, delimiter)
splitdata = Split(data, delimiter)
[COLOR="#008000"]'hier sollte UBound(splitdata) geprüft werden! Mit Ausgabe Fehlermeldung mit Zeilennummer![/COLOR]
SmartTags("Variable_16") = splitdata(0)
SmartTags("Variable_17") = splitdata(1)
SmartTags("Variable_18") = splitdata(2)
SmartTags("Variable_19") = splitdata(3)
SmartTags("Variable_20") = splitdata(4)

Bemühe mal Deine Fantasie wie das Skript wohl aussieht wenn Du mal wirklich 5000 Werte einliest. Bei 5000 Werten ist es essentiell wichtig sich vorher Gedanken und ein Konzept zu machen, bevor man den kompletten Code eintippt und dann feststellt, daß das ganze Konzept untauglich ist...

Willst Du wirklich 5000 HMI-Variablen (PowerTags) nur für das Einlesen der Variablen aus der csv-Datei "verballern"? Willst Du wirklich Deinem Kunde 2000 oder 3000 EUR Mehrkosten für die WinCC-Runtime-Lizenz aufbürden nur weil Du anscheinend fast keine Ahnung von VBS hast? Lassen sich Deine 5000 Daten wirklich nicht irgendwie als Array strukturieren und in mehreren Blöcken einlesen? Oder wenigstens die Namen der 5000 HMI-Variablen irgendwie Schleifen-/Index-/bastelfreundlich machen? Die von Dir standhaft ignorierten mehrfachen Hinweise und Nachfragen nach Strukturierbarkeit der Daten als Array waren nicht grundlos...

Hast Du schon mal überschlagen, daß Dein Monster-Skript zum linearen Einlesen von 5000 einzelnen Werten ca. 500 kByte groß wird?!! (und da ist noch nichtmal eine Fehlerprüfung dabei)
(Wie groß darf überhaupt ein VBS-Skript in WinCC Adv. sein??)
Graust es Dir nicht ein bisschen bei dem Gedanke, daß Du ein Skript mit 8000...10000 Zeilen für die 5000 Variablen fehlerfrei eintippen mußt?

Hast Du Dir schon Gedanken gemacht, wie Deine SPS erkennen kann, wann alle 5000 Werte komplett im DB angekommen sind? Dafür bräuchtest Du eine geeignete Prüfsumme und ein Handshake, oder Du müsstest die Daten als Rezeptur in die SPS schreiben. Das Handling zum Sicherstellen der kompletten Übertragung sollte auch mit 20 Werten schon funktionieren und ausgetestet sein, bevor es auf 5000 Werte erweitert wird.

Wie lange darf das Einlesen der 5000 Werte in die SPS dauern?

Wie/wann soll das Skript zum Einlesen der csv-Datei aufgerufen werden? Mit einem Button in einem Bild? Weißt Du von der Eigenart, daß die WinCC Adv. Runtime beim Aufruf des Bildes mit dem Button (unnötigerweise) zunächst alle erkennbar im Skript verwendeten HMI-Variablen aus der SPS ins HMI einliest? Das gibt dann jedesmal beim Bildaufruf eine schöne Kommunikationslast, vielleicht sogar eine Kommunikationsüberlastung.

Weißt Du daß bei jedem Schreiben auf ein Element einer Array-HMI-Variable das Schreiben des gesamten Arrays ausgelöst wird? Spätestens hier wird es Kommunikationsüberlastungen geben.

Harald
 
Willst Du wirklich Deinem Kunde 2000 oder 3000 EUR Mehrkosten für die WinCC-Runtime-Lizenz aufbürden
OK, das Lizenz-Problem stellt sich hier nicht, weil keine PC Runtime verwendet werden soll, sondern:
Wir haben eine Siemens S7 1200 (1214c) kombiniert mit einem TP 900 Comfort HMI.
Das Ziel ist es eine CSV Datei mit hilfe eines USB Sticks auf das HMI zu Speichern und die Werte der CSV Datei in einen Datenbaustein Zu schreiben.
Das TP900 Comfort kann nur 2048 Variablen. Dein Konzept mit den 5000 Variablen ist mit dem TP900 überhaupt nicht machbar.

Woher kommt die csv-Datei? Man könnte einfacher und sicher die Daten mit z.B. Libnodave (und z.B. Excel) von einem PC direkt in die S7-1200 laden. Der DB darf dann nicht "optimiert" sein und S7/PUT/GET-Kommunikation muß freigegeben sein.

Harald
 
Zurück
Oben