WinCC ca.100 Variablen mit VBS als *.csv ausgeben

max1de

Level-1
Beiträge
45
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag SPS Gemeinde,

eine kleine Frage für einen VBS Experten. Leider sind meine Script Erfahrungen eher dürftig .

Ich lese aus einer 1515er Steuerung alle 15 Minuten ca. 100 Realwerte in die Variablentabelle der WinCC V7.5 ein.
Wert[10] /Real
Wert[11] /Real
Wert[n] /Real
... /Real

Jetzt möchte ich dies Werte in einer *.csv Datei in einer Zeile ablegen
Energiewert[1] ; Energiewert[2] ; Energiewert[n] ,....

Die Erstellung der Ordner etc. habe ich hier im Forum gefunden und funktioniert sehr gut.
Nur ich bekomme es zum verrecken nicht hin, die Werte über eine Schleife einzulesen und dann nebeneinander auszugeben.

Mein Versuch 1: --> bei 100 Variablen ... sehr langer Code
If fso.FileExists (datei) Then
Set f = fso .OpenTextFile(datei, 8)
f.WriteLine ("Wert[10]") & ";" ("Wert[11]") & ";" ("Wert[n]") & ";"
f.Close
End If

Mein Versuch 2: mit Schleife...geht leider nicht

Dim i

For i=10 To 100

If fso.FileExists (datei) Then
Set f = fso .OpenTextFile(datei, 8)
f.WriteLine Wert("Wert") & ";"
f.Close
End If

Next
i=10

Vielen Dank für eure Hilfe!
 
ich würde es so wie bei beispiel 1 machen, aber zuerst die auszugebende Zeile zusammenfügen.

Code:
Outline=""
for i=10 to 100

 Outline = Outline & Wert[i] & ";"

next
danach dem Writeln übergeben.

Bei den Scriptsprachen bin ich bezüglich Syntax etwas schwach. Muss immer wieder selbst nachsehen.
 
Du könntest statt
Code:
f.WriteLine
mal
Code:
f.Write
versuchen.
In früheren vbs-Scripten konnte ich die newline damit umgehen.
Ja, aber dauerhaft umgehen.
Vermutlich ist aber ein gelegentliches newline dennoch erwünscht (wenn nämlich alle Daten einer Zeile ausgegeben sind).
Also für die ersten Ausgaben in einer Zeile f.Write und für die letzte Ausgabe in der Zeile weiterhin f.WriteLine
 
Insgesamt würde ich es eher in diese Richtung abändern, alleine schon weil ich nicht in jeder Schleife die Datei öffnen und schliessen wollen würde.

Code:
// Die Deklarationen fso, f, datei geschehen woanders?
Dim i

// Datei öffnen wenn vorhanden oder erstellen wenn nicht vorhanden
If fso.FileExists (datei) Then
    Set f = fso.OpenTextFile(datei, 8)
    f.Write vbCrLf
Else
    Set f = fso.CreateTextFile(datei, true) 
End If

// Daten In die Datei schreiben ohne Zeilenumbruch
For i=10 To 100
    f.Write Wert(i) & ";"
Next

// Datei schliessen
f.Close

// Warum? Die Schleife fängt auf jeden Fall bei 10 an oder kommt nun noch was?
i=10
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich lese aus einer 1515er Steuerung alle 15 Minuten ca. 100 Realwerte in die Variablentabelle der WinCC V7.5 ein.
Wert[10] /Real
Wert[11] /Real
Wert[n] /Real
... /Real
Sind das 100 Variablen die in WinCC so heißen, oder ist das ein Array? In VBS werden Array-Elemente so adressiert: SmartTags("Wertarray")(i) oder Wert(i)

Achtung, die Trennzeichen ";" sind Trennzeichen und gehören nur zwischen Werte, aber nicht generell hinter jeden Wert ...
Wenn hinter dem letzten Wert noch ein ";" kommt, dann macht das Probleme beim späteren Einlesen der csv-Datei, da erzeugt Split() am Ende noch ein leeres Element.

Harald
 
Sind das 100 Variablen die in WinCC so heißen, oder ist das ein Array? In VBS werden Array-Elemente so adressiert: SmartTags("Wertarray")(i) oder Wert(i)

Achtung, die Trennzeichen ";" sind Trennzeichen und gehören nur zwischen Werte, aber nicht generell hinter jeden Wert ...
Wenn hinter dem letzten Wert noch ein ";" kommt, dann macht das Probleme beim späteren Einlesen der csv-Datei, da erzeugt Split() am Ende noch ein leeres Element.

Harald
Insgesamt würde ich es eher in diese Richtung abändern, alleine schon weil ich nicht in jeder Schleife die Datei öffnen und schliessen wollen würde.

Code:
// Die Deklarationen fso, f, datei geschehen woanders?
Dim i

// Datei öffnen wenn vorhanden oder erstellen wenn nicht vorhanden
If fso.FileExists (datei) Then
    Set f = fso.OpenTextFile(datei, 8)
    f.Write vbCrLf
Else
    Set f = fso.CreateTextFile(datei, true)
End If

// Daten In die Datei schreiben ohne Zeilenumbruch
For i=10 To 100
    f.Write Wert(i) & ";"
Next

// Datei schliessen
f.Close

// Warum? Die Schleife fängt auf jeden Fall bei 10 an oder kommt nun noch was?
i=10
Hallo Esccride
i=10 hat sich so ergeben, da es in Anlehnung an die dazugehörige IP Adresse des Zählers ist
 
Sind das 100 Variablen die in WinCC so heißen, oder ist das ein Array? In VBS werden Array-Elemente so adressiert: SmartTags("Wertarray")(i) oder Wert(i)

Achtung, die Trennzeichen ";" sind Trennzeichen und gehören nur zwischen Werte, aber nicht generell hinter jeden Wert ...
Wenn hinter dem letzten Wert noch ein ";" kommt, dann macht das Probleme beim späteren Einlesen der csv-Datei, da erzeugt Split() am Ende noch ein leeres Element.

Harald
Hallo Harald,
Es ist kein Array. Wobei ich mir nun die Frage stelle, ob man nicht besser das Array aus der SPS auslesen sollte und in einem Rutsch als CSV Datei (in einer Spalte) ausgeben kann.
 
Es ist kein Array. Wobei ich mir nun die Frage stelle, ob man nicht besser das Array aus der SPS auslesen sollte und in einem Rutsch als CSV Datei (in einer Spalte) ausgeben kann.
Kannst du den Datenbereich von der Visu her auch als Array adressieren ? Also liegen die Variablen alle schön hintereinander in einem DB (nicht optimiert) ?

Ansonsten müsstest du in deinem Script alle Variablen einzeln adressieren - das ist bei 100 Stück natürlich nicht witzig ...
Die andere Frage dazu : weißt du denn beim Einlesen welche Variable an welcher Stelle in deiner CSV steht ? Oder anders : wie weiß es das einlesende Programm ?
 
Hallo Larry
auf der SPS Seite bin ich flexibel. Also könnte ich dort ein Array in einem nicht optimierten DB anlegen. Die Real-Werte laufen dort immer identisch ein. Also ArrayFeld 1 = Wert 1 ; ArrayFeld 2 = Wert 2 ; ArrayFeld n = Wert n
In der CSV sollen diese dann auch in dieser Reihenfolge geschrieben werden Wert1; Wert2 ; Wert 3; Wert n
 
Zurück
Oben