WinCC Flex VBS Skript zum verschieben von Dateien

PLC_Freak

Level-2
Beiträge
124
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich möchte in WinCC flex 2008 ein Skript laufen lassen, welches, nachdem es getriggert wurde, 2 Dateien von einem Ordner in einen anderen kopiert, diese Dateien umbenennt und anschließend die Dateien in der Quelle löscht.
Leider wird nicht kopiert oder gelöscht. Der Triggger sitzt auf einer Variabel, welche bei Wertänderung das Skript laufenlassen soll.
Könnt ihr mir helfen den Fehler zu finden?


Code:
' Variabeln deklarieren
Dim fs, SourceFile, DestFile


' Variabeln definieren
SourceFile = "F:\TEST\CSV\"
DestFile   = "F:\TEST\Sicherung\"


Set fs = CreateObject("filectl.filesystem")


fs.FileCopy SourceFile & "\Analog.csv", DestFile & "\Test.csv"


fs.Kill ("F:\TEST\CSV\Analog.csv")

Danke!
 
Moin LOBBE1,

ich bin gerade an einem ähnlichen Fall dran (Archiv von SD-Card auf UCB-Stick kopieren). Das klappt auch ganz gut.
Läuft das Skript überhaupt?
Ich benutze für die Funktionsparameter immer nur eine Variable, deren Inhalt ich vorher "zusammenbaue". Ich bin aber nicht sicher, ob das relevant ist.
Hinweis: Um das Skript zu debuggen, benutze ich einfach Textfelder, in denen ich reinschreibe, was ich wissen will (Fehlertext, Variableninhalt, Läuft das Skript?, etc.).
Hier dazu der Codeteil:

Code:
'*** Datei kopieren ***

pathsrc = "\Storage Card SD"
pathdst = "\Storage Card USB"

filesrc = "Meldearchiv_csv0"
filedst = "Meldearchiv_csv0" & "_" & myDate
appendix = ".csv"
filepathsrc = pathsrc & "\" & filesrc & appendix
filepathdst = pathdst & "\" & filedst & appendix

'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_2").text = filesrc
'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_3").text = pathsrc
'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_4").text = filepathsrc
'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_5").text = filedst
'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_6").text = pathdst
'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_7").text = filepathdst
'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_9").text = fs.getattr(filepathsrc)

fs.setattr filepathsrc, 0
'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_10").text = "fs.setattr" & Err.Description
'Err.Clear

fs.FileCopy filepathsrc, filepathdst
'HmiRuntime.ActiveScreen.ScreenItems("Textfeld_13").text = "fs.filecopy" & Err.Description
'Err.Clear

' Verwendeten Speicher wieder freigeben
Set f = Nothing
Set fs = Nothing

VG
MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier sind gleich mehrere fehler drin. da du kein on error resume next verwendest sollten dir eigentlich fehler bei ausführen des scripts angezeigt werden.

schau mal hier Protool/WinCCflex/TIA Daten lesen / schreiben mit VB-Script
Hallo Leute,
Code:
' Variabeln deklarieren
Dim fs, SourceFile, DestFile


' Variabeln definieren
SourceFile = "F:\TEST\CSV\"
DestFile   = "F:\TEST\Sicherung\"
[COLOR=#ff0000]das deutet auf ein windows-System hin[/COLOR]

Set fs = CreateObject("filectl.filesystem")
[COLOR=#ff0000]das wäre für win-ce
Set fso = CreateObject("Scripting.FileSystemObject") 'so für Windows

[/COLOR]
fs.FileCopy SourceFile & "\Analog.csv", DestFile & "\Test.csv"
[COLOR=#ff0000]hier würde als scource stehen  "F:\TEST\CSV\[/COLOR][COLOR=#0000ff][B]\[/B][/COLOR][COLOR=#ff0000]Analog.csv". gleiche gilt für dest...
fs.filecopy ist auch wieder win-ce. für Windows heißt das copyfile
[/COLOR]
fs.Kill ("F:\TEST\CSV\Analog.csv")

Danke!
 
Code:
' Variabeln deklarieren
Dim fs, SourceFile, DestFile


' Variabeln definieren
SourceFile = "F:\TEST\CSV\"
DestFile   = "F:\TEST\Sicherung\"


Set fs = CreateObject("[COLOR="#FF0000"]filectl.filesystem[/COLOR]")


fs.[COLOR="#FF0000"]FileCopy[/COLOR] SourceFile & "[COLOR="#FF0000"]\[/COLOR]Analog.csv", DestFile & "[COLOR="#FF0000"]\[/COLOR]Test.csv"


fs.[COLOR="#FF0000"]Kill[/COLOR] ("F:\TEST\CSV\Analog.csv")
Vermutlich bei der CreateObject-Anweisung wird Dein Skript mit einem Runtime-Error abgebrochen, weil die Anweisung nur auf Windows CE Geräten funktioniert, Deine WinCC flex Runtime aber anscheinend auf einem normalem Windows PC läuft.

1. Schaue Dir in der in WinCC flexible 2008 vorzüglich integrierten VBS-Hilfe die Hilfe zu "CopyFile" an und gehe in dem Hilfethema auf den Link "Betrifft" > FileSystemObject-Objekt, da findest Du wie das FileSystemObject erzeugt wird:
Set fso = CreateObject("Scripting.FileSystemObject")

2. Mache Dir in ein Bild eine Meldeanzeige 'rein, welche (auch) Meldungen der Meldeklasse "System" anzeigt, damit Du die Runtime-Error-Meldungen sehen/lesen kannst.

3. Als Debug-Hilfe kann man mit der Systemfunktion "ShowSystemAlarm" Testmeldungen an interessierenden Programmstellen ausgeben.

PS: 4. Außerdem hast Du beim Zusammenbasteln von SourceFile und DestFile zu viele Backslash drin - das ergibt bei Dir zwei aufeinanderfolgende Backslash, was nicht funktioniert.

PS: 5. Die Methode zum Datei löschen heißt unter PC-Windows "DeleteFile". Hilfe siehe z.B. bei CopyFile der Link "Siehe auch"

Harald
 
Zuletzt bearbeitet:
Danke Volker.

Habe das Skript nun wie folgt geändert (für Windows-System)

Code:
' Variabeln deklarieren
Dim fso, SourceFile, DestFile


' Variabeln definieren
SourceFile = "F:\TEST\CSV\"
DestFile   = "F:\TEST\Sicherung\"


Set fso = CreateObject("Scripting.FileSystemObject")


fso.CopyFile SourceFile & "Analog.csv", DestFile & "Test.csv"


fso.Kill ("F:\TEST\CSV\Analog.csv")

Ich habe einen eine Schaltfläche mit einer internen Variabel bestückt, welche bei Wertänderung das Skript ausführen soll. Leider passiert aber nichts. Woran kann das denn noch liegen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren


2. Mache Dir in ein Bild eine Meldeanzeige 'rein, welche (auch) Meldungen der Meldeklasse "System" anzeigt, damit Du die Runtime-Error-Meldungen sehen/lesen kannst.

3. Als Debug-Hilfe kann man mit der Systemfunktion "ShowSystemAlarm" Testmeldungen an interessierenden Programmstellen ausgeben.

PS: 4. Außerdem hast Du beim Zusammenbasteln von SourceFile und DestFile zu viele Backslash drin - das ergibt bei Dir zwei aufeinanderfolgende Backslash, was nicht funktioniert.

PS: 5. Die Methode zum Datei löschen heißt unter PC-Windows "DeleteFile". Hilfe siehe z.B. bei CopyFile der Link "Siehe auch"

Hast du dir dass einmal durchgelesen?
 
...

2. Mache Dir in ein Bild eine Meldeanzeige 'rein, welche (auch) Meldungen der Meldeklasse "System" anzeigt, damit Du die Runtime-Error-Meldungen sehen/lesen kannst.

3. Als Debug-Hilfe kann man mit der Systemfunktion "ShowSystemAlarm" Testmeldungen an interessierenden Programmstellen ausgeben.

...

Harald

zu 2. --> Habe nun eine Meldeanzeige mit Meldeklasse "System" integriert.

Nun bekomme ich einen Fehler zu meinem zweiten Skript, welches aber funktioniert. "Fehler, Erlaubnis verweigert, in Skript ..."

2.jpg

Code:
'////////////////////////////////////////////////////////////////' en: Script for the readout of a text file
' de: Script zum Auslesen einer Textdatei
' Created: 14-05-2007
' Version: v0.1
' Author:  ZW
'////////////////////////////////////////////////////////////////


Const ForAppend = 8
'Declaration of local tags - Deklaration von lokalen Variablen
Dim fso, f, ts, Path, field, myfile, file, i


'Definition of local tags - Definition von lokalen Variablen


myfile = "testfile"
Path = "F:\TEST\Skript\"
file = Path & myfile & ".csv"


'Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")


'Abfrage Ordner vorhanden, wenn nicht dann erzeugen
If Not fso.FolderExists("F:\TEST\Skript\") Then 
    fso.CreateFolder("F:\TEST\Skript\")
End If


If Not fso.FileExists (file) Then 
    Set f = fso.CreateTextFile(file, True)
    f.WriteLine(" Dateiname :  ; " & ("testfile")) & ";"
    f.WriteLine(" Datum     :  ; " & Date & ";")   
    f.WriteLine("Kommentar1") & ";"
    f.WriteLine("Kommentar2") & ";"
    f.WriteLine(" ; " & ";")
    f.WriteLine(" Datum ; " &" Uhrzeit ; " &" Druck [ mbar ]; " & " Temperatur [ °C ]; " & " Material ;")
End If


If fso.FileExists (file) Then
    Set f = fso.OpenTextFile(file, ForAppend)
    f.WriteLine Date & ";" & Time & ";" & SmartTags("WinCC_Ausgang.nPressure") & ";" & SmartTags("WinCC_Ausgang.nTemperature") & ";" & SmartTags("WinCC_Ausgang.szMaterial") 
    f.Close
End If

zu 3. --> Wie kann ich mit der Systemfunktion "ShowSystemAlarm" arbeiten?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
zu 2. --> Habe nun eine Meldeanzeige mit Meldeklasse "System" integriert.

Nun bekomme ich einen Fehler zu meinem zweiten Skript, welches aber funktioniert. "Fehler, Erlaubnis verweigert, in Skript ..."

Anhang anzeigen 36820
Welche Zeile ist Zeile 38? Welcher Programmcode steht da?


zu 3. --> Wie kann ich mit der Systemfunktion "ShowSystemAlarm" arbeiten?
Code:
'Abfrage Ordner vorhanden, wenn nicht dann erzeugen
folder = "F:\TEST\Skript\"
If Not fso.FolderExists(folder) Then 
    [COLOR="#0000FF"]ShowSystemAlarm "Ordner '" & folder & "' existiert nicht und wird angelegt"[/COLOR]
    fso.CreateFolder(folder)
End If

Harald
 
38: Set f = fso_OpenTextFile(file, ForAppend)
Die Datei ist vermutlich schon geöffnet durch das CreateTextFile im Anweisungsblock vorher - da fehlt ein "f.Close", oder es fehlt eine Logik, die bei "CreateTextFile" das "OpenTextFile(file, ForAppend)" verhindert/überspringt.

PS: nach CreateFolder sollte (erneut) geprüft werden, ob der Ordner existiert/ob das Anlegen erfolgreich war.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Datei ist vermutlich schon geöffnet durch das CreateTextFile im Anweisungsblock vorher - da fehlt ein "f.Close", oder es fehlt eine Logik, die bei "CreateTextFile" das "OpenTextFile(file, ForAppend)" verhindert/überspringt.

PS: nach CreateFolder sollte (erneut) geprüft werden, ob der Ordner existiert/ob das Anlegen erfolgreich war.

Harald

Das hört sich ganz plausibel an. Werde das mal testen.

Danke!

Ein f.Close ist schon enthalten

Code:
If fso.FileExists (file1) Then    
Set f = fso.OpenTextFile(file1, ForAppend)
    f.WriteLine Date & ";" & Time & ";" & SmartTags("Analog_IN_1") & ";" & SmartTags("Analog_IN_2")
    f.Close
End If
 
Zuletzt bearbeitet:
Ein f.Close ist schon enthalten

Code:
If fso.FileExists (file1) Then    
Set f = fso.OpenTextFile(file1, ForAppend)
    f.WriteLine Date & ";" & Time & ";" & SmartTags("Analog_IN_1") & ";" & SmartTags("Analog_IN_2")
    f.Close
End If
Ja, aber an der falschen Stelle. Die Datei ist beim neu Anlegen mit CreateTextFile schon vor dem OpenTextFile geöffnet:

Code:
If Not fso.FileExists (file) Then 
    Set f = fso.CreateTextFile(file, True)
    f.WriteLine(" Dateiname :  ; " & ("testfile")) & ";"
    f.WriteLine(" Datum     :  ; " & Date & ";")   
    f.WriteLine("Kommentar1") & ";"
    f.WriteLine("Kommentar2") & ";"
    f.WriteLine(" ; " & ";")
    f.WriteLine(" Datum ; " &" Uhrzeit ; " &" Druck [ mbar ]; " & " Temperatur [ °C ]; " & " Material ;")
                    [COLOR="#FF0000"]<---- hier fehlt f.Close[/COLOR]
End If


If fso.FileExists (file) Then
    Set f = fso.OpenTextFile(file, ForAppend)
    f.WriteLine Date & ";" & Time & ";" & SmartTags("WinCC_Ausgang.nPressure") & ";" & SmartTags("WinCC_Ausgang.nTemperature") & ";" & SmartTags("WinCC_Ausgang.szMaterial") 
    f.Close
End If

Harald
 
So, in meiner Test-Simulation funktioniert jetzt alles in der folgenden Form:
Code:
Const ForAppend = 8'Declaration of local tags - Deklaration von lokalen Variablen
Dim fso, f, ts, Path, field, myfile1, myfile2, file1, file2, i


'Definition of local tags - Definition von lokalen Variablen


myfile1 = "DK1"
myfile2 = "DK2"
Path = "F:\TEST\CSV\"
file1 = Path & myfile1 & ".csv"
file2 = Path & myfile2 & ".csv"


'Objekt erstellen
Set fso = CreateObject("Scripting.FileSystemObject")


'Abfrage Ordner vorhanden, wenn nicht dann erzeugen
If Not fso.FolderExists("F:\TEST\CSV\") Then 
    fso.CreateFolder("F:\TEST\Sicherung\")
End If


If Not fso.FileExists (file1) Then 
    Set f = fso.CreateTextFile(file1, True)
    f.WriteLine(" Dateiname :  ; " & (myfile1)) & ";"
    f.WriteLine(" Datum     :  ; " & Date & ";")   
    f.WriteLine(" ; " & ";")
    f.WriteLine(" Datum ; " &" Uhrzeit ; " &" Temperatur unten DK1 [°C]; " &" Temperatur oben DK1 [°C]; " &" Druck DK1 [bar]; " &" Wasser DK1; " &" Dampf DK1; "&" L1 DK1; " &" L2 DK1;" &" L3 DK1;" &" Wasserpumpe;")
    f.Close
End If


If fso.FileExists (file1) Then
    Set f = fso.OpenTextFile(file1, ForAppend)
    f.WriteLine Date & ";" & Time & ";" & SmartTags("Temp_u_DK1_ska") & ";" & SmartTags("Temp_o_DK1_ska")& ";" & SmartTags("Druck_DK1_ska")& ";" & SmartTags("Wasser_DK1_offen") & ";" & SmartTags("Dampf_DK1_offen")& ";" & SmartTags("L1_DK1_HMI") & ";" & SmartTags("L2_DK1_HMI") & ";" & SmartTags("L3_DK1_HMI")& ";" & SmartTags("WaPu_eingesch")
    f.Close
End If


If Not fso.FileExists (file2) Then 
    Set f = fso.CreateTextFile(file2, True)
    f.WriteLine(" Dateiname :  ; " & (myfile2)) & ";"
    f.WriteLine(" Datum     :  ; " & Date & ";")   
    f.WriteLine(" ; " & ";")
    f.WriteLine(" Datum ; " &" Uhrzeit ; " &"  Temperatur unten DK2 [ °C ];" &" Temperatur oben DK2 [°C];" &" Druck DK2 [bar];" &" Wasser DK2;" &" Dampf DK2; " &" L1 DK2; " &" L2 DK2; " &" L3 DK2;" &" Wasserpumpe;" )
    f.Close
End If


If fso.FileExists (file2) Then
    Set f = fso.OpenTextFile(file2, ForAppend)
    f.WriteLine Date & ";" & Time & ";" & SmartTags("Temp_u_DK2_ska") & ";" & SmartTags("Temp_o_DK2_ska") & ";" & SmartTags("Druck_DK2_ska") & ";" & SmartTags("Wasser_DK2_offen") & ";" & SmartTags("Dampf_DK2_offen")& ";" & SmartTags("L1_DK2_HMI") & ";" & SmartTags("L2_DK2_HMI")& ";" & SmartTags("L3_DK2_HMI")& ";" & SmartTags("WaPu_eingesch") 
    f.Close
End If

bzw. zum kopieren

Code:
' Variabeln deklarieren
Dim fso, SourceFile, DestFile, Zeit, hr, min, sek, ZeitNeu


' Variabeln definieren
Zeit       = Time
hr           = Left(Zeit, 2)
min           = Mid(Zeit, 4, 2)
sek           = Right(Zeit, 2)
ZeitNeu       = hr & "-" & min & "-" & sek
SourceFile = "F:\TEST\CSV\Analog.csv"
DestFile   = "F:\TEST\Sicherung\" & "PCK_A" & "_" & Date & "_" & ZeitNeu & ".csv"


Set fso = CreateObject("Scripting.FileSystemObject")


fso.CopyFile SourceFile, DestFile


fso.DeleteFile ("F:\TEST\CSV\Analog.csv")

Vielen Dank an alle!
 
Zurück
Oben