WinCC flex: DB archivieren

SeSi

Level-1
Beiträge
12
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich beschäftige mich gerade mit der Möglichkeit den Inhalt eines Datenbausteins (S7-319) in WinCC zu archivieren und später, mit Hilfe der Kurvenanzeige auszuwerten.
Der Datenbaustein beinhaltet den zyklisch abgespeicherten Wert einer Variable.
Da die Variablenarchivierung in WinCC, mir nicht gestattet den Inhalt des gesamten DB's mit einmal zu archivieren, wollte ich mir den Inhalt über ein Skript selbst in eine *.csv Datei speichern.
Hier mal mein erster Versuch, eine Zeile ab zuspeichern:

Code:
Dim fso, f1
Set fso = CreateObject ("Skripting.FileSystemObjekt")     
Set f1 = fso.CreateTextFile("C:\Logs\test.txt", True) 
Set f1 = fso.OpenTextFile("D:\test.txt",ForWriting , True) 
f1.WriteLine("In Sack und Tüten. :-)")
f1.close

geht net :(
gestarte wird das skript über die Betzätigung einer Schaltfläche in Runtime
Vieleicht kann mir ja wer helfen
System: WinCC flexible advanced
MfG
 
Zuletzt bearbeitet:
Hallo,

suche mal im siemens Support nach der Beitrags-ID 23235548. Dort gibt es ein Beispiel für Protool. Das sollte sich aber in WinC flex gleich verhalten.

mfg
marlob
 
Zuviel Werbung?
-> Hier kostenlos registrieren
natürlich funktioniert das nicht. dein set fso ist falsch.

das hatten wir alles schon tausendmal.

ich hab jetzt mal was in die FAQ gelegt
 
natürlich funktioniert das nicht. dein set fso ist falsch.

das hatten wir alles schon tausendmal.

ich hab jetzt mal was in die FAQ gelegt

Erst mal Danke für die Antworten!

Wie mein set fso ist falsch, du benutzt doch das selbe in deinem Bsp?!
Ich werde mir das Bsp. mal genauer anschauen!

MfG
 
So hier mal meine Lsg., Danke für die Hilfe!

Code:
Const ForReading = 1, ForWriting = 2 
Dim fso, f1, datei, csvfile
 
Set fso = CreateObject("Scripting.FileSystemObject") 
 
datei = "D:\DBArchiv01.csv" 
 
If Not fso.FileExists(datei) Then
 Set f1 = fso.CreateTextFile(datei,True)
 f1.WriteLine "Varname;"&"Varwert;"&"Zeitstempel;"
 f1.Close
End If
 
If fso.FileExists (datei) Then
 Set f1 = fso.OpenTextFile(datei, 8)
 f1.WriteLine
 f1.WriteLine "Name;"&"Wert:" 'usw
 f1.Close
End If
 
re

Hi,
ich habe mein Skript nun weiter "verfeinert" und stoße da auf neue Probs..:confused:

hier mal der Auszug:
Code:
Dim fso, fs, csvFile, Datei, i
Set fso = CreateObject("Scripting.FileSystemObject") 
 
Datei = "D:\DBArchiv01.csv"
 
If Not fso.FileExists(Datei) Then
 Set csvFile = fso.CreateTextFile(Datei,True)
 csvFile.WriteLine "Varname;"&"Varwert;"&"Zeitstempel;"&"Datum"
 csvFile.Close 
End If
 
If fso.FileExists (Datei) Then
 Set csvFile = fso.OpenTextFile(Datei, 8)  
 For i = 8 To 208 Step 1
  csvFile.WriteLine "Speicher;" & SmartTags("ArraySp1")(i) &";" & Time &";"  
Next 
 csvFile.Close  
End If

Das Problem besteht darin das:
Das Programm steigt nach der For-Schleife (hinter next) aus, was wohl direkt mit der Verwendung des "ArraySp1" in Verbindung steht.
Durch den Ausstieg wird die Datei nicht geschlossen und bei Beendigung des Runtime gibs dann ne satte Fehlermeldung.:mad:

Vieleicht hat wer da noch mal nen Tipp?!

MfG
 
Zuletzt bearbeitet:
grundsätzlich erkenne ich hier keinen fehler im script.

wie ist die variable denn definiert?
welcher fehler?

normalerweise ist es so, dass eine datei geschlossen wird sobald das script beendet wird.
z.b. mit wscript.quit (auch wenn kein .close erfolgt)

um den fehler zu ignorieren kannst da aber noch
on error resume next
in dein script aufnehmen. evtl auch noch den fehler auswerten.
dann läuft das script in jedem fall bis zum ende.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich schilder mal kurz die gasamte Lage.:

Ich habe zwei DB's 301 und 302, in denen jewals ein
Array [0..208] of byte angelegt ist(db301.dbb0-db301.dbb20).

Jeden Zyklus speicher ich die durch ein Any-Pointer "anwisierte" Variable
(z.B. Mb0) in einem Instansdatenbaustein.
Ist dieser voll werden die gesamten 208bytes=200Zyklen + Zeitstempel DT 8byte mit blockmove abwechselnd in die db's gespeichert.

In WinCC, externe Variable: "Arraysp1" Array vom Typ: Byte Länge: 208 Adr. db301 dbb0

Im Skript möchte ich nun die daten 8-208 des DB301 in ein Archiv speichern um sie später mit der Kurvengrafik an zu zeigen.

Wenn ich den Teil mit dem Arraymal auskommentiere, läuft das Programm.
Code:
& SmartTags("arraysp1")(i) &";"


Wie kann man sich den Fehler anzeigen lassen?
 
das ist irgendwie ermal verwunderlich.

schreib mal zum testen nur den index
csvfile.writeline i

normal sollte der fehler aufgeblendet werden wenn er auftritt.
oder
projektiere ein meldearchiv und schreibe dort die systemmeldungen rein.
dann eine meldeanzeige wo dieses meldearchiv genutzt wird. dann kannste dir die meldungen auch nachträglich noch ansehen.

Im Skript möchte ich nun die daten 8-208 des DB301 in ein Archiv speichern um sie später mit der Kurvengrafik an zu zeigen.
als normale kurvengrafik im panel?
dann musst du aber die daten so schreiben, wie das für eine kurvengrafik erforderlich ist. hast du dir mal ein kurvenarchiv angesehen?
 
Hab den Fehler gefunden. Mein DB entsprach wohl net ganz der Größe der Schleife.....:rolleyes:

Hab mir jetzt nen super Archiv programmiert und festgestellt, das ich es garnicht in die Kurvengrafik einbinden kann(siehe Quelleinstellung+Kurventyp Kurve).

Muss mir wohl was anderes einfallen lassen...am besten ne eigene Kurvengrafik anfertigen...nur wie...egal:confused: :confused: :confused:

Herzlichen dank für deine Hilfe, Volker!!!

MfG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Timestring für eine Archivdatei berechnen

du kannst dir deine cvs so aufbauen, das es einem kurvenarchiv entspricht.
was man wissen muss ist wie der timestring aufgebaut ist. der rest sollte kein problem darstellen.

hier mal ein script um den zu berechnen
Code:
'zu testen anfang
datum = InputBox("datum",,datum1)
zeit = InputBox("zeit",,zeit1)
'zu testen ende

'extrahieren
stunden=left(zeit,2)
'minuten=right(zeit,2)
minuten=mid(zeit,4,2)
sekunden=right(zeit,2)

'berechnen
tage_bis_datum=datediff("d","31.12.1899",datum)
nach_dem_komma3=(sekunden/60)
nach_dem_komma2=(minuten + nach_dem_komma3) / 60
nach_dem_komma1=(stunden + nach_dem_komma2) / 24
archivdatum=(tage_bis_datum + 1 + nach_dem_komma1) *1000000

msgbox archivdatum
gehe in etwa so vor
erstelle eine kurvengrafik mit zeitachse.
datenquelle archiv (z.b. kurve1)
laden wie in deinem script die daten und wandel die entsprechend um und speicher die in die datei kurve10.csv. (0.csv hängt ptp bzw flex automatich an)
um die kurve dann darzustellen, ohne evtl kilometerweit zurückzuscrollen musst du für die zeitachse eine variable nehmen. (habe ich noch nie getestet).
diese beschreibst du auch in dem script.
 
So hatte ich mir das auch gedacht, mit der Archivdatei.:D
Erst die datei im WinCC "Archivdateiformat"
(in *.csv "VarName";"TimeString";"VarValue";"Validity";"Time_ms")
aufbauen, dann im Kurvenmodul Archiv auswählen und die eigene Archivdatei = Archiv auswählen.
Die Datei hab ich ja auch schon erstellt.

Mir is nur net klar gewesen das man WinCC in dem Sinne austricksen kann,
werd es morgen mal versuchen. (siehe nächsten Schritte)?!?!

1. Variablenarchiv erstellen Kurve1
-> Ablageort Datei und Pfad auswählen
-> Archivierung blockieren (Da im Kurvenmodul ja ne Variable zum archivieren angegeben werden muss)

2. Eigenschaften -> Kurven ...neue Kurfe erstellen
-> Kurventyp Archiv
-> Quelleinstellungen Archiv Kurve1
Archiveintrag ??? (irgent eine Variable wird ja
eh net archiviert)

eine andere Variante währe die Archivdatei wieder aus zulesen und die werte nach einander an eine interne Var zu übergeben und anzeigen zu lassen.
Aber mit dem ... VBS und dem ... Kompiler von WinCC bekommt ich hier nochmal ne ..... sry!

hier mal meine andere Idee, die aber nicht funktionniert, irgentwie, ka:confused:

Code:
Set fso = CreateObject("Scripting.FileSystemObject")  
Datei = "D:\DBArchiv01.csv"         
 
If Archiv = True Then
 
'Auslesen und aufspalten zwischen ;----------------------------------
 Set csvFile = fso.OpenTextFile(Datei) 
 Auslesen = Split(csvFile.ReadAll, ";", -1, 1) 
 csvFile.Close 
 
'Akt. Sekunde einlesen----------------------------------------------- 
 RealSec = Second(Now)
 
'mit alter Sekunde vergleichen---------------------------------------- 
 If StartSec < RealSec Then 
 
'Index i verwalten----------------------------------------------------
     If i = 9 Then 
        i = 0
     End If
     Archiv_Value = Auslesen(i)   
     i = i + 1
     StartSec = RealSec  
 End If
End If

Konnte den Inhalt der Datei schon anzeigen doch die CPU ließt natürlich schneller aus als die Grafik das dastellt. Daher wollte ich zur Probe mal jede Sekunde eine Wert aus dem "TextfileArray" auslesen aber naja....bin wohl zu unerfahren...bin ja erst zwei drei Wochen an VBS dran.

zählt net...heut morgen hab ich mal (is ja easy) die sekunden durchzählen lassen aber seit 10Uhr kein Mugs mehr!!!!!! Hab mir auch mal die StartSec anzeigen lassen alles ok aber irgent wo macht er mir mein i zu 0 und dann gehts wieder von vorne los.

Und was mich am meißten ärgert...probiere das immer gleich in Runtime aus....es geht einfach net und ich seh net warum, stocher nur wie wild in meinem eigenen Code rum.
Man heut bin ich echt geladen wegen dem Zeugs^^


MfG
 
Zuletzt bearbeitet:
Hiho,
habe den Fehler gerade gefunden, kann ihn mir nur nicht erklären...so richtig.

Für die erprobung meiner Skripte habe ich mir ein Mainskript geschafen, welches in einer while-Schleife die Skripte abarbeitet(damit ich nicht ständig Tasten und Knöpfe drücken muss).

Main:
Code:
Dim TWert, Uhr, x
 
While (SmartTags("Sp_Start") = True)
 
 TWert = Umrechnung (SmartTags("ArraySp1")) 
  ' SchreibeInDatei   SmartTags("ArraySp1"),SmartTags("ArraySp2"), TWert 
 Call VisuArchiv 
 
Wend

Das Problemprogramm ist VisuArchiv.

Ich hatte es erst als Funktion geschrieben und aufgerufen und aber keine Parameter deklariert.
Code:
Function VisuArchiv()
dim x
VisuArchiv = x
End funktion
und der Aufruf dazu:
Code:
Dim TWert, Uhr, x
 
While (SmartTags("Sp_Start") = True)
 
 TWert = Umrechnung (SmartTags("ArraySp1")) 
  ' SchreibeInDatei   SmartTags("ArraySp1"),SmartTags("ArraySp2"), TWert 
x = VisuArchiv '<--ist das Richtig????????
 
Wend

Oder die andere Möglichkeit, deklaration als Sub und Aufruf über Call, geht das?

Code:
Dim TWert, Uhr, x
 
While (SmartTags("Sp_Start") = True)
 
 TWert = Umrechnung (SmartTags("ArraySp1")) 
  ' SchreibeInDatei   SmartTags("ArraySp1"),SmartTags("ArraySp2"), TWert 
 Call VisuArchiv <---ist das Ok?????
 
Wend
 
Zurück
Oben