# WinCCflexible - In Text Datei schreiben



## Fluffi (7 Februar 2008)

*WinCCflexible - In Text bzw. CSV  Datei schreiben ?*

hallo

da CreateObject("excel.sheet") nicht funktioniert in WinCCflex 2007, muss ich wohl einen anderen Weg suchen um Daten aus WinCC flex in eine "excel"-Datei zu speichern.
Eine Möglichkeit wäre die Daten getrennt mit ";" in eine leere Datei zu speichern ( also csv Datei). 
Wie geht sowas mit Visaul basic ?


----------



## volker (7 Februar 2008)

findest du in der FAQ


----------



## Larry Laffer (7 Februar 2008)

... das benutzt aber auch die Funktion "CreateObject" ...

Aber das Beispiel in der FAQ von Volker ist schön gemacht ...


----------



## volker (7 Februar 2008)

du hast recht.
ich dachte es läge speziell am objekt excel.application.
dem ist aber nur bedingt so. es liegt wohl am crateobjekt.

Set fso = CreateObject("Scripting.FileSystemObject") scheint zunächst auch abzustürzen. hat bei mir jetzt 2 minuten gedauert bis es bei flex weiterging. ist aber nicht abgestürzt.

das ist für mich mehr als tragisch. fast schon der supergau. ich muss in kürze was an einem op277 ändern wo ich auf diese art wichtige prozessdaten schreibe. wenn das mal gut geht. :twisted:


----------



## Fluffi (7 Februar 2008)

also bei mir stürzt es zum glück nicht ab. 

aber eines muss ich noch wissen :
wie kann ich festlegen dass die datei immer von oben überschrieben wird und nicht bei nächsten mal die neu reingeschriebenen Daten unten an die alten angefügt werden , bzw wie kann ich eine datei löschen um so ein problem zu vermeiden?


----------



## Fluffi (7 Februar 2008)

kann mir keiner helfen?
so sieht der code aus:

################################
Dim datei,fso,fs,textfile1,

Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = CreateObject("WScript.Shell")

datei="C:\test.csv"


If Not fso.FileExists (datei) Then 

    Set textfile1 = fso.CreateTextFile(datei, True,True)
    textfile1.WriteLine ...usw
textfile1.Close
End If


If fso.FileExists (datei) Then 
    Set textfile1 = fspenTextFile(datei, True,True)
     textfile1.WriteLine usw...
textfile1.Close
End If

##########

wenn die datei nicht existiert wird sie erstellt und beschrieben
wenn die datei existiert passiert jedoch garnichts ,sie wird nicht mal überschrieben. 
was ich möchte ist :
egal ob die datei existiert oder nicht , möchte ich sie anlegen und überschreiben


----------



## volker (7 Februar 2008)

kommt auf den dateimodus an.

fso.createtextfile erzeugt eine datei true wird die datei überschrieben.
fso.opentextfile öffne eine datei entweder zum lesen oder zum anhängen.

schau dir die vbscript sprachdokumentation zu diesen befehlen an.


----------



## Larry Laffer (7 Februar 2008)

Hallo,
hier mal ein Beispiel zum "Scripting.FileSystemObject"
Das sollte dir auf jeden Fall weiterhelfen ...


```
[SIZE=2][COLOR=#0000ff]Dim[/COLOR][/SIZE][SIZE=2] fs , f , i , Verzeichnis , Ziel , Datei , Werte_String_1 , Werte_String_2[/SIZE]
[SIZE=2][COLOR=#0000ff]Const[/COLOR][/SIZE][SIZE=2] ForReading = 1, ForWriting = 2, ForAppending = 8[/SIZE]
 
[SIZE=2]...[/SIZE]
 
[SIZE=2][COLOR=#008000]' Ziel-Verzeichnis schon vorhanden ?[/COLOR][/SIZE]
[SIZE=2][COLOR=#008000]' ... wenn nein, dann erst erzeugen ...[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]Set[/COLOR][/SIZE][SIZE=2] fs = CreateObject("Scripting.FileSystemObject")[/SIZE]
[SIZE=2][COLOR=#0000ff]If [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Not[/COLOR][/SIZE][SIZE=2] fs.FolderExists (Verzeichnis) [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[SIZE=2]   fs.CreateFolder (Verzeichnis)[/SIZE]
[SIZE=2][COLOR=#0000ff]End[/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
[SIZE=2][COLOR=#008000]' Ziel-Datei schon vorhanden ?[/COLOR][/SIZE]
[SIZE=2][COLOR=#008000]' ... wenn nein, dann erst erzeugen ...[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]If [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]Not[/COLOR][/SIZE][SIZE=2] fs.FileExists (Ziel) [/SIZE][SIZE=2][COLOR=#0000ff]Then[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]   Set[/COLOR][/SIZE][SIZE=2] f = fs.OpenTextFile(Ziel , ForWriting, [/SIZE][SIZE=2][COLOR=#0000ff]true[/COLOR][/SIZE][SIZE=2])[/SIZE]
[SIZE=2]   f.WriteLine "Messdaten Anlage 198"[/SIZE]
[SIZE=2][COLOR=#0000ff]Else[/COLOR][/SIZE]
[SIZE=2][COLOR=#0000ff]   Set[/COLOR][/SIZE][SIZE=2] f = fs.OpenTextFile(Ziel , ForAppending)[/SIZE]
[SIZE=2][COLOR=#0000ff]End [/COLOR][/SIZE][SIZE=2][COLOR=#0000ff]If[/COLOR][/SIZE]
 
[SIZE=2]...[/SIZE]
 
[SIZE=2]f.Close [/SIZE]
```


----------



## Fluffi (7 Februar 2008)

Echt vielen Danke euch beiden . Das bringt micht schon wieder sehr viel weiter


----------



## Fluffi (7 Februar 2008)

wie kann ich eigentlich einen Wert aus einer csv datei einlesen und in variablen speichern

ich hab das mal so gemacht (gemäß dem beispiel hier) :
zuerst liesst das skript jeden wert der in einer zeile steht in name(x)
x steht für zeilennummer.
und am ende  geb ich eine entsprechende zeile zu einer bestimmten SPSvariablen .
Warum klappt das nicht?
TempRestore.csv existiert natürlich und hat pro zeile ein paar zahlen.


Dim fso,fs,datum,zeit,datei,textfile2,x,name

Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = CreateObject("WScript.Shell")

datei = "C:\TempRestore.csv" 

    Set textfile2 = fspenTextFile(datei, 1)
    x = 0

    Do While textfile2.AtEndOfStream <> True
        x = x + 1
         name(x) = textfile2.ReadLine

    Loop


    SmartTags("SPSvar1") = name(1)
    SmartTags("SPSvar2") = name(2)
     ...usw


    textfile2.Close


----------



## Larry Laffer (7 Februar 2008)

was klappt den konkret nicht ...?
Du bekommst doch ggf. eine Fehlermeldung, oder nicht ?

Was ist name ? Ein ARRAY innerhalb des Scriptes ?
Wie lang ist eine Zeile, die du einliest ? Mehr als 254 Zeichen ?

Gruß
LL


----------



## Fluffi (7 Februar 2008)

wenn ich das Skript ausführe und die Variablen beobachte werden die Werte einfach nicht übernommen. fehlermeldungen gibts keine. 
das skript wurde auch erfolgreich kompiliert.

name soll ein array sein. Er ist jedoch nur mit Dim name deklariert
ein dim name AS ...  wie unter VB zb in Excel geht ja leider nicht unter WinCC.
in einer zeile stehten nur ein paar zahlen höchstens 8 :zb 1234


gibts eigentlich ùnter VB WinCC irgendeine kleine funktion die mir zb ein meldefenster aufmacht oder den PC Speaker kurz anmacht um zu testen ob das Programm eine gewisse Codestelle erreicht hat ?


----------



## Larry Laffer (7 Februar 2008)

Eine MessageBox oder so gibt es nicht ...

Versuch doch mal die Zeilen direkt einzulesen. Meine Vermutung wäre, dass deine "     Do While textfile2.AtEndOfStream <> True"-Schleife so nicht funktioniert. Das habe ich bisher nicht eingesetzt ... Alles andere sieht bei mir so ähnlich aus ...

Gruß
LL


----------



## volker (7 Februar 2008)

Fluffi schrieb:


> ... fehlermeldungen gibts keine.
> das skript wurde auch erfolgreich kompiliert.


ich behaupe mal, es gibt eine fehlermeldung. und zwar 'typen unverträglich'

definiere die var: name mal so-> name(1000) wobei 1000 die grösse des arrays angibt.

das funzt (getestet mit protool)

```
Dim datei,fso,textfile2,name(100),x

Set fso = CreateObject("Scripting.FileSystemObject")

datei="E:\s7_daten\protool\test.txt"
Set textfile2 = fso.OpenTextFile(datei, 1)
x = 0
Do While textfile2.AtEndOfStream <> true
x = x + 1
name(x) = textfile2.ReadLine
Loop
VAR_1=name(1)
VAR_2=name(2)
VAR_3=name(3)
```


----------



## Fluffi (8 Februar 2008)

danke , mit name(100) funktionierts !!
ich schreib das alles im  winCC VB editor und der gibt bei Typen unverträglich leider keine Meldung heraus. Auch sonst generiert das Teil oft ohne Fehlermeldung einen Code auch wenn etwas nicht ganz passt.


----------



## Rafaelius (5 Mai 2015)

Hallo,

also ich habe mit diesen Beispielen meine Probleme:

Dim datei,fso,fs,textfile1

Set fso = CreateObject("Scripting.FileSystemObject")
Set fs = CreateObject("WScript.Shell")

datei="C:\test.csv"

If Not fso.FileExists (datei) Then

Set textfile1 = fso.CreateTextFile(datei, True,True)
textfile1.WriteLine
textfile1.Close
End If

Darf ich hier erwarten, dass WinCC Flexible 2008 mir eine Datei erzeugt?
Ich warte vergebens auf diese Datei beim Ausführen des Skripts.
Bediengerät ist "WinCC flexible Runtime 1.4.0.0"

Wenn ich nach jeder Zeile ein Bit auf true setze (soll Debug-Modus sein), dann fällt mir auf das Skrit hat Schwierigkeiten bei --> datei="C:\test.csv" <--

Ich bitte um Hilfe


----------



## Rafaelius (5 Mai 2015)

klappt doch, aber nur nicht auf C:\, sonder auf allen anderen. wieso auch immer


----------



## volker (5 Mai 2015)

möglicherweise ein rechteproblem von win. kannst du auf c:\ über explorer eine datei erstellen?


----------



## Rafaelius (5 Mai 2015)

Das wird es wohl sein, also direkt unter C:\ geht es nicht, außer ich erstelle Unterordner.
Was auch nicht geht ist Beispielsweise D:\Test\Test.txt -> wenn der Unterordner bereits nicht angelegt ist, wird es unter D:\ abgelegt.

Ein anderes Problem. Wenn ich die Datei habe, dann will ich sie zu festen Zeitpunkten öffnen und an die letzt Zeile die neuen Daten reinschreiben:

Set fout = fspenTextFile(Dateiname,8 )     'Adresse, wo Datei liegt
    fout.WriteLine SmartTags("Ein_Wert")

Das Problem ist, dass er das nicht Zeile für Zeile hintereinander wegschreibt. Nur 1 zeile. Ich nehme an ich verwende den falschen Befehl?


----------



## RONIN (5 Mai 2015)

Rafaelius schrieb:


> Set fout = fspenTextFile(Dateiname,8) 'Adresse, wo Datei liegt
> fout.WriteLine SmartTags("Ein_Wert")
> 
> Das Problem ist, dass er das nicht Zeile für Zeile hintereinander wegschreibt. Nur 1 zeile. Ich nehme an ich verwende den falschen Befehl?


 Ich empfehle dir die Paramter der Methode OpenTextFile mal anzusehen. Parameter 2 mit Wert 8 - Open for Appending. https://msdn.microsoft.com/en-us/library/314cz14s(v=vs.84).aspx

Des weiteren kannst du dir auch Volkers FAQ zu dem Thema durchlesen. Da si d auch viele Codeschnipsel drin. Pass nur auf dass du WinCE (Touchpanel) und Windows (PC-Runtime) nicht verwechselst.
http://www.sps-forum.de/faq/15348-protool-winccflex-daten-lesen-schreiben-mit-vb-script.html

Wenn du die Exceptions in deine  Skripten sehen willst kannst du folgendermaßen vorgehen.

```
On Error Resume Next

'Code der Fehler verursacht...
If Err.Number <> 0 Then
     ShowSystemAlarm("Mein Fehler: " & Err.Description)
End If
```
Den SystemAlarm bekommst du dann angezeit wenn du ein WinCC-Alarmcontrol einfügst, die Systemmeldungen anhakst und Anzeigeart Meldeereignisse verwendest. 0 Then
     ShowSystemAlarm(


----------



## Rafaelius (6 Mai 2015)

RONIN schrieb:


> Ich empfehle dir die Paramter der Methode OpenTextFile mal anzusehen. Parameter 2 mit Wert 8 - Open for Appending. https://msdn.microsoft.com/en-us/library/314cz14s(v=vs.84).aspx
> 
> Des weiteren kannst du dir auch Volkers FAQ zu dem Thema durchlesen. Da si d auch viele Codeschnipsel drin. Pass nur auf dass du WinCE (Touchpanel) und Windows (PC-Runtime) nicht verwechselst.
> http://www.sps-forum.de/faq/15348-protool-winccflex-daten-lesen-schreiben-mit-vb-script.html
> ...



-----------------------------
Alles richtig, muss mich entschuldigen, war gestern nach 9Std VBS nicht mehr in der Lage den Fehler zu sehen. Den Ablageort erstelle ich Bitgetriggert, das heißt im nächsten Aufruf vom Skript ist der Order+Datei erstellt, aber der "OpenTextFile (*ABLAGEORT* ,8,True)" --> Ablageort ist ja unbekannt, er weiß ja nicht wo er drauf zugreifen soll.
Alles funktioniert jetzt bestens.

Besten Dank.


----------



## Larry Laffer (6 Mai 2015)

Bitte hier beachten :
Das mit dem "Append" funktioniert nur dann, wenn die Zieldatei selbst schon vorhanden ist. Du mußt im Script also richtigerweise erst checken, ob es die Datei schon gibt. Wenn ja, dann "Append" ansonsten "Create" als Modus.

Gruß
Larry


----------

