# WinCC Daten in Excel schreiben



## mg1382 (16 Januar 2006)

Hallo,

ich hab eine S7-Steuerung und WinCC 6 dran.
Nun möchte ich bestimmte Werte entweder aus dem S7 DB oder aus WinCC in eine Excel Tabelle speichern.
Wie geht das?
Was muß ich da machen?


----------



## Praktikant (16 Januar 2006)

*excel*

willst du direkt in excel schreiben oder reicht eine csv-datei ?


----------



## mg1382 (16 Januar 2006)

csv Datei???


----------



## maxmax (17 Januar 2006)

> csv Datei???



guckst Du hier:
http://de.wikipedia.org/wiki/CSV-Datei


----------



## mg1382 (17 Januar 2006)

So jetzt weiß ich was ne csv Datei ist!! ->Danke!
MIr ist es egal im prinzip reicht mir eine csv Datei!


----------



## Praktikant (17 Januar 2006)

hi,
anbei ein kleines beispiel :

```
Dim TPFile
Dim TPFileName
Dim fso
Dim Zeile
Dim Tag_1
Dim Tag_2
Dim Datei_Schreiben   <--- NEU

Set Tag_1 = HMIRuntime.Tags("Tag_1")
Set Tag_2 = HMIRuntime.Tags("Tag_2")
Set Datei_Schreiben = HMIRuntime.Tags("Datei_Schreiben") <---NEU

Datei_Schreiben.Read(1)  <---NEU

If Datei_Schreiben.Value = 1 then <--- NEU

Tag_1.Read(1)
Tag_2.Read(1)

TPFileName = "d:\daten\daten.csv"
Set fso = CreateObject("Scripting.FileSystemObject")
Set TPFile = fso.OpenTextFile(TPFileName, 8,True)
Zeile = Tag_1.Value &";"& Tag_2.Value

TPFile.WriteLine(Zeile)
TPFile.Close
End If   <---NEU
```


----------



## mg1382 (17 Januar 2006)

Das ganze hört sich vernünftig an, habs aber noch nicht getestet!
Wie kann ich es machen das die Werte nur bei einer Flanke abgespeichert werden!
Seh ich das richtig das in das Dokument die Werte alle nacheinander eingetragen werden, das heist endlos viele!
Kann ich das auch begrenzen z.B. auf 100 Stück??


----------



## Praktikant (17 Januar 2006)

ich habe das beispiel etwas erweitert.

wenn du den trigger des scripts auf datei_schreiben setzt, wird beim setzen der variable die datei geschrieben.

die werte werden hintereinander in die datei geschrieben.
pro aufruf des scripts eine zeile:

z.bsp.:
1025;125
2897;784
5697;899

um die datei zu begrenzen, könntest du vorher die datensätze zählen und ab 100 eine neue datei erzeugen. du müsstest die nur geadanken zu den dateinamen machen


----------



## mg1382 (17 Januar 2006)

Mein Signal steht aber länger Zeit an und ich möcht nur die Werte 1mal ablegen und dann erst wieder das Signal ein 2.mal kommt!
Die Variante mit der neuen Datei ist nicht ganz das was ich möchte, denn da müll ich mir den PC zu!
Brauh wie schon geschrieben nur ne Bestimmte Anzahl!


----------



## Praktikant (17 Januar 2006)

da script wird bei einer änderung deiner triggervariable aufgerufen,
egal wie lange das signal ansteht.

sollen die werte archiviert werden oder kannst du sie überschreiben ?


----------



## mg1382 (17 Januar 2006)

Die Werte können dann wieder Überschrieben werden, halt der älteste immer zuerst


----------



## mg1382 (18 Januar 2006)

Mir ist gerade noch was eingefallen, es würde auch gehen wen ich montags in eine Datei schreibe, di in ne andere.......und ne woche später die mo. Datei wieder überschreib!
Vielleicht hat ja da einer idee dafür?


----------



## argv_user (19 Januar 2006)

Wir machen das so, dass wir täglich eine neue Datei erzeugen nach dem Schema: yyyymmdd.

Also heute heißt das File "20060119.txt", morgen dann "20060120.txt"


----------



## Praktikant (19 Januar 2006)

```
TPFileName = "d:\daten\daten"& CStr(DatePart("w",Date))&".csv"
```


----------



## mg1382 (19 Januar 2006)

Die Fariante kenn ich auch, diese möcht ich aber nicht.
Denn wenn du die Datein nicht löschst, müllst du dir dein pc zu!
Hab schon erlebt das bei einem PC der Speicher durch sowas voll war und der nur noch macken gemacht hat!
Die daten sollen nur einpaar tag da sein, also würde es reichen nach Wochentagen!
Weiß einer wie das geht?


----------



## argv_user (19 Januar 2006)

Also das mit dem Zumüllen kann man in der Regel vorab berechnen, in dem man pessimistische Annahmen bezüglich des Datenaufkommens macht, und mit der Anzahl der zu erwartenden Dateien multipliziert. Vorausgesetzt, das Filesystem spielt dabei mit.

Aber wenn Du keine historischen Daten brauchst:

Wenn Du nur zB sieben Tage aufheben willst, so nummerier sie einfach durch und wenn Du bei sieben angekommen bist, einfach bei eins weitermachen. Wo Du gerade bist, kannst Du Dir in einer extra Datei merken.


----------



## mg1382 (19 Januar 2006)

Hört sich vernünftig an!
UNd wie mach ich das, dass die Datei nach 24h wechselt?


----------



## mg1382 (20 Januar 2006)

Kann mir jemand sagen wie ich eine Zählschleife programmier!
Bin noch auf die idee gekommen, das ich es einfach so mach ich schreibe 100 Datensätze in Datei A, wechsle dan und schreib 100 in Datei B und dann wieder von vorne.
Wär ja auch noch ne möglichkeit!


----------



## Praktikant (20 Januar 2006)

```
Dim i
For i = 1 To 100
	' deine Aktionen

Next
```


----------



## mg1382 (29 Januar 2006)

Hallo zusammen,

hab das ganze probiert und ich kann jetzt die Werte in csv Datei schreiben - DANKE!

Hab nur noch ein Problem mit dem Wechseln der Dateien.
Hab folgendes geschrieben:


Dim i=0
.
.
.
.

	If .........Read = 0 Then
	.
	.
	.

	i = i+1

		If i <100 Then

		.
		.

		Exit Function
		End If


		If i >100 Then

		.
	.

		Exit Function
		End If

			If i > 200 Then
			i = 0

			Exit Function
			End If

Exit Function
End If

End Function

Was ist daran falsch??
Kenn mit Basic nicht aus....


----------



## Markus (30 Januar 2006)

sicher hast du date_time irgendwo in deiner visu eingesetzt.
ansonsten findest du die daten auch byteweise im lokaldatenbereich vom ob1.


werte das byte das die nummer des wochentage enthält aus und mache davon den pointer auf die datei abhängig.


mehr zum aufbau von date_time (welcher werte steht für welchen tag) findest du in der s7 hilfe.


----------



## mg1382 (30 Januar 2006)

hab date_and_time eingesetzt!
Hab aber den Wochentag nicht verarbeitet!
HAb einen fertigen Baustein der mir dort nur das Datum und die Uhrzeit rausholt!
Was muß ich machen das er mir auch noch den Wochentag rausholt?


----------



## Markus (30 Januar 2006)

wie bereits geschrieben hast du das ganze geraffel bereits byteweise im ob1 stehen. schau dir dort die lokaldaten an...

wenn du die date_time zerplücken willst muss du ihren aufbau kennen.
schau das bitte in der step7 hilfe nach, ist dort gut beschrieben.

grob gesagt besteht date_time nur aus zusammengesetzten bytevariablen.
in jedem byte stehn entweder sekunden, stunden, minuten,...

ist eigentlich recht simpel...


----------



## mg1382 (31 Januar 2006)

Könnt ihr mir helfen!
Schreib jetzt pro Signal 10Werte weg, nicht nur einen!
Wie kann ich eine positive Flanke auswerten?
In meinem oberen Prog. wird i immer wieder auf 1 gesetzt und nicht erhöht!
Will i pro durchlau erhöhen und der Wert soll gespeichert werden!

Danke im vorraus!


----------

