# WinCC Flex. Daten per VBS ins Netzwerk kopieren



## Feldmann

Guten Morgen,

ich habe mal eine Frage.
Ich habe ein MP277 in dem ich eine Protokolldatei (.csv) zusammenbaue.
Diese möchte ich gerne mit einem Trigger an einen Netzwerkpartner schicken.

Wie heißt der Befehl dazu? Hab nichts gefunden

Danke für eure Unterstützung


----------



## Larry Laffer

Hallo,
die Methode, die du verwenden müßtest heißt FILECOPY.
Wie das verwendet wird findest du in der VB-Script-Sprachreferenz von WinCE oder in der FAQ hier .
Den Trigger, der das Ganze startet, mußt du dir schon selbst erzeugen - vielleicht ein Bit, das gesetzt wird und bei dem du "bei Wertänderung" desselben das Copy-Script startest ...

Gruß
LL


----------



## PN/DP

Hallo,
falls Du grundsätzliche Probleme beim Zugriff auf Deinen Netzwerkpartner hast, dann siehe diesen FAQ:
Von Panel auf PC über LAN zugreifen

Gruß
Harald


----------



## Feldmann

Hallo,

danke für die Antworten,

die Funktion FileCopy klappt nicht.

die funktion wird nicht durchlaufen. Was kann das für gründe haben?

Hier mal der Funktionsinhalt

If SmartTags("MP 277.Bool_Variablen.Daten_Senden") = True Then    

Dim Dateiname, Ablageort, Zielordner, Jahrestag
Dim fso

Set Jahrestag = SmartTags("MP 277.Seriennummer.Tag_im_Jahr")
Dateiname = "Tabelle Tag_" & Jahrestag
Ablageort = "\My Dokuments\OrdnerX\" & Dateiname & ".csv"
Zielordner = "\\NotebookXY\OrdnerX\"

Set fso = CreateObject("Scripting.FileSystemObject")
fso.MoveFile Ablageort, Zielordner

SmartTags("MP 277.Bool_Variablen.Daten_Senden") = False    

End If


----------



## PN/DP

Mach Dir mal in das Vorlage-Bild ein Meldefenster rein für die Meldeklasse System, damit Du die 
Runtime-Errors angezeigt bekommst.
Zum Debuggen empfiehlt es sich auch, im Programmablauf Panelvariablen (SmartTags) zu beschreiben
und/oder Systemmeldungen auszugeben.

Da Dein Script auf dem MP277 laufen soll, mußt Du die Filefunktionen für WinCE benutzen.



		Code:
	

[COLOR="green"]'MP277 WinCE[/COLOR]
    [COLOR="RoyalBlue"]Set fso = CreateObject("FileCtl.FileSystem")[/COLOR]
    ShowSystemAlarm "Filesystem-ActiveX-Objekt wurde erstellt"
    [COLOR="RoyalBlue"]fso.FileCopy "\FLASH\meinedatei.csv", "\\computername\sicher\"[/COLOR]
    ShowSystemAlarm "meinedatei.csv wurde kopiert"




		Code:
	

[COLOR="Green"]'Simulation unter PC-Windows[/COLOR]
    [COLOR="royalblue"]Set fso = CreateObject("Scripting.FileSystemObject")[/COLOR]
    ShowSystemAlarm "Filesystem-ActiveX-Objekt wurde erstellt"
    [COLOR="RoyalBlue"]fso.CopyFile "C:\FLASH\meinedatei.csv", "D:\sicher\"[/COLOR]
    ShowSystemAlarm "meinedatei.csv wurde kopiert"

Gruß
Harald


----------



## Feldmann

folgende Meldung erscheint:
"The system cannot find the path specified
'in skript <Daten_Senden> in Zeile 14

Zeile 14: fso.filecopy "\My Documents\Ordner\Datei.csv", "\\MeinRechner\Ordner"

was ist hier falsch?


----------



## volker

es fängt schon mal damit an, das du mit wince arbeitest.
da ist das anders. das steht aber auch FAQ -----> hier 

Set f= CreateObject("filectl.file")
Set fs = CreateObject("filectl.filesystem")

der copierbefehl sollte dann so aussehen
 fs.filecopy t_root_path & "\"&zs_jahr&"\BS_"&zs_jahr&"-"&zs_monat&".csv", t_net_path &"\Betriebsstunden\"&zs_jahr&"\BS_"&zs_jahr&"-"&zs_monat&".csv"


----------



## PN/DP

Feldmann schrieb:


> "The system cannot find the path specified
> 'in skript <Daten_Senden> in Zeile 14
> 
> Zeile 14: fso.filecopy "\My Documents\Ordner\Datei.csv", "\\MeinRechner\Ordner"


Die Meldung ist doch eindeutig, entweder wird "\My Documents\Ordner\Datei.csv" oder "\\MeinRechner\Ordner" nicht gefunden.

Das MP277 hat einen Windows Explorer (Start > Programs > Windows Explorer). Damit kannst Du die Pfade überprüfen.

Ich vermute, der Netzwerkpfad wird nicht gefunden. Wenn das so ist, dann siehe die in meinem Beitrag #3 verlinkte FAQ.

Oder Dein tatsächliches "Datei.csv" enthält irgendwelche unzulässigen Sonderzeichen im Dateiname.
Versuche doch erst einmal, eine ganz einfache Datei "Test.txt" (oder so) innerhalb des Panels zu kopieren.

Gruß
Harald


----------



## PN/DP

*VBS-Skript FileCopy*

Aus meinem WCCF/VBS-Fundus:


		Code:
	

[COLOR="Green"]' Sub FileCopy(SourceFile, DestFile) kopiert eine Datei
' Skript kann unter Panel-WinCE und PC-Windows laufen
'[/COLOR]
[COLOR="Blue"]Dim[/COLOR] fso
[COLOR="blue"]If[/COLOR] SmartTags([COLOR="Sienna"]"_System\!_RT-Sim_!"[/COLOR]) [COLOR="blue"]Then[/COLOR] [COLOR="Green"]'PC-Windows[/COLOR]
    [COLOR="blue"]Set[/COLOR] fso = [COLOR="blue"]CreateObject[/COLOR]([COLOR="sienna"]"Scripting.FileSystemObject"[/COLOR])
    fso.CopyFile SourceFile, DestFile
[COLOR="blue"]Else[/COLOR] [COLOR="green"]'WinCE[/COLOR]
    [COLOR="blue"]Set[/COLOR] fso = [COLOR="blue"]CreateObject[/COLOR]([COLOR="sienna"]"FileCtl.FileSystem"[/COLOR])
    [COLOR="green"]'fso.FileCopy erzeugt Runtime-Error, wenn DestFile schon existiert[/COLOR]
    [COLOR="blue"]If[/COLOR] fso.Dir(DestFile) <> [COLOR="sienna"]""[/COLOR] [COLOR="blue"]Then[/COLOR] fso.Kill DestFile
    fso.FileCopy SourceFile, DestFile
[COLOR="blue"]End If[/COLOR]

Damit ich meine Panel-Projekte komplett unter Windows XP testen/simulieren kann, 
habe ich im WCCflexible-Projekt eine interne Panel-Variable "_System\!_RT-Sim_!"
vom Typ Byte, deren Startwert ich auf 0 oder 1 festlege, je nachdem, ob die Runtime 
auf dem Panel oder auf dem WinXP-Testsystem laufen soll: 
0 = RT auf WinCE-Panel / >=1 = RT auf PC (Simulation/Test)

Gruß
Harald


----------



## Feldmann

Moin,

Tausend Dank noch mal für die hilfreichen Antworten.

Mittlerweile hab ich es auch geschafft. Es funzt!! 

Jetzt wäre halt noch interessant, vor dem Senden zu prüfen, ob der Netzwerkteilnehmer erreichbar ist. Ansonsten macht das Senden keinen sinn.

Auch hier eine Frage an die Gemeinschaft.


----------



## volker

du kannst doch lesen, oder ?
hier zum *3ten* mal der link wo alles steht hier


----------



## PN/DP

*Lesehilfe*

Zitat aus der hier schon mehrfach verlinkten FAQ:


> Code:
> 
> 
> ' Function FolderExist(Path) prüft, ob ein angegebener Ordner existiert
> ' z.B. ob eine MemoryCard im angegebenen Slot steckt
> ' oder der angegebene Netzwerk-Pfad erreichbar ist


Das Prüfen der Erreichbarkeit eines Netzwerkpfades kann aber mehrere Sekunden dauern.

Gruß
Harald


----------



## Feldmann

*Hallo noch mal*

@ Volker: Ich brauche eine Funktion "CopyFile" für Win CE. Die Befehle die in deinem Link stehen sind nicht für CE.

Da habe ich "*set fso = createobject("SCRIPTING.FileSystemObject")*"
In Win CE ist das nicht SCRIPTING sondern FILECTL.

Das haut nicht hin. Bin mir nicht mal sicher, ob FileSystemObject überhaupt klappt.

Die Hilfe von WinCC Flex. beschränkt sich dort auch nur auf die Scripting-Variante. 

Was mache ich falsch??


----------



## PN/DP

Feldmann schrieb:


> Ich brauche eine Funktion "CopyFile" für Win CE.


Dann blättere doch einfach mal in diesem Deinem Thread eine Seite zurück und schau Dir den Beitrag #9 an:
(Ich hatte mir damals extra Mühe mit dem Syntax-Highlightning gegeben.)


> *VBS-Skript FileCopy*
> Aus meinem WCCF/VBS-Fundus:
> 
> 
> Code:
> 
> 
> [COLOR="Green"]' Sub FileCopy(SourceFile, DestFile) kopiert eine Datei
> ' Skript kann unter Panel-WinCE und PC-Windows laufen[/COLOR]
> ...





Feldmann schrieb:


> Was mache ich falsch??


Was hat Volker Dich im Beitrag #11 gefragt?
Lesen können ist echt ein Vorteil. 

Gruß
Harald


----------



## Feldmann

Moin,

ich bekenne mich schuldig in allen Punkten.
hab noch nicht so viel erfahrung mit skripten in WinCC Flex.

ich habe auch mal versucht mir den Microsoft Script Debugger herunterzuladen.
Achtung: Installation hat funktioniert.
Jetzt das Problem: ich verstehe nicht ganz, wie ich den Debugger in WinCC Flex verwende? 

Nehme auch gerne zu diesem Thema euren Rat in Anspruch...

Danke und schönes Wochenende


----------



## PN/DP

Feldmann schrieb:


> ich bekenne mich schuldig in allen Punkten.


Na gut, Hauptsache Du hast nun gefunden was Du brauchst. :-D

Zum Microsoft Script Debugger gibt es im WinCC flexible Information System (Hilfe) ein paar Kapitel:
Arbeiten mit WinCC flexible > Systemfunktionen und Runtime Scripting > Debuggen
(oder im Index nach Debuggen suchen).

Zum Debugger bedienen


> Wie Sie den Debugger bedienen, erfahren Sie in der Dokumentation des verwendeten Debuggers.


Detaillierter kann ich Dir da nicht helfen, ich habe noch keinen Debugger in WCCf benutzt 
(und auch nicht gebraucht).



Feldmann schrieb:


> Nehme auch gerne zu diesem Thema euren Rat in Anspruch...


Das kannst Du gerne machen, Du brauchst nur konkrete Fragen stellen. Dann wird sicher jemand antworten.

Gruß
Harald


----------



## Feldmann

*Brauche noch mal hilfe*

Hallo Harald,

vielleicht kannst du mir noch mal helfen.

ich habe folgendes Problem. Es kann sein, dass eine zeit lang das Netzwerk nicht vorhanden ist, dann schreibe ich die Daten zur zeit unter My Documents\... ab. Wenn das Panel dann einmal abgeschaltet wurde, sind alle Daten verloren.
Jetzt habe ich es so gemacht, dass ich die Daten auf der Storage Card MMC speicher. Das klappt sogar 
nur bekomme ich jetzt beim Verschieben der Daten folgende Meldung:
"The System cannot move the File to a different disk drive". Wie gehe ich jetzt damit um?
ich habe folgendes:
dim fs
set fs = createobject("FileCtl.FileSystem")
fs.MoveFile "\Storage Card MMC\Ordner\Datei.csv", "\\MeinNotebook\Protokoll\"

was mache ich denn jetzt schon wieder falsch?


----------



## SevenBit

Schönen guten Morgen,

*MoveFile*​Function:​​This method *renames* an existing file or a directory, including all its subdirectories.​
Syntax:​​filesystem.MoveFile PathName, NewPathName

daher Funktion FileCopy verwenden! Wenn man die Source-Datei nicht mehr benötigt, kann man diese mit "Kill" löschen.
​
*FileCopy*​Function:​​This method copies an existing file to a new file.​
Syntax:​​Filesystem.FileCopy PathName, NewPathName
​
*Kill*​Function:​​This method deletes files from a disk.​
Syntax:​​filesystem.Kill pathname

Wenn ich mich nicht täusche, findest du die Beschreibungen der Scriptfunktionen in Volkers Link in der Datei "VBScript für Windows CE"
​


----------



## Feldmann

Danke,

ich habe das mal ausprobiert. Jetzt bekomme ich eine andere MEldung.
Access is denied.

warum wird der Zugriff verweigert?


----------



## Larry Laffer

Hallo,
existiert die Datei vielleicht schon an der Zieladresse ?

Gruß
Larry


----------



## Feldmann

Hallo,

folgendes Skript versuche ich ans Laufen zu bekommen.

Meldung: "The system cannot move the file." 

Wo liegt der fehler?


----------



## Larry Laffer

Hallo,
also erstmal hat SevenBit da ja was von FileCopy geschrieben - ich würde vom Verständnis des Sachverhalts auch erstmal dazu tendieren. Und dann ... würdest du bitte meine Frage aus Beitrag #20 beantworten ?

Gruß
Larry


----------



## Feldmann

aber gerne, der Zielordner ist bis auf eine Datei, die nicht diesen Namen hat, komplett leer.

und es macht keinen unterschied, ob ich filecopy oder movefile nehme. es geht nicht.


----------



## Larry Laffer

... und was ist mit FileCopy ? Was bekommst du da für eine Meldung ?


----------



## Feldmann

wieder die mit der Zugriffsverweigerung.

Habe mein skript etwas geändert

If fs.dir(Ablageordner) <> "" Then
            ShowSystemAlarm "Ablagedatei: " & Ablagedatei

            'ShowSystemAlarm "Zieldatei: " & Zielort
            If fs.dir(Zielort) <> "" Then
                fs.kill(Zielort)
            ElseIf fs.dir(Zielort) = "" Then
                fs.mkdir(Zielort)
                fs.filecopy Ablageordner, Zielort 
            End If
End If

der Zielordner wird erstellt. aber kopiert wird nicht. Wieder "Access is denied"


----------



## Larry Laffer

Also dann im Einzelnen :
Was ist der exakte Inhalt von "Ablageordner" und "Zielort" ?
Endet Zielort mit einem "\" ?
Beinhaltet Ablageordner den Dateinamen ganz oder teilweise ?

Gruß
Larry


----------



## Feldmann

For a = Jahr - 1 To Jahr
    For d = 0 To 365


        Dateiname = "Anlage_" & a & "_" & d 
*ergibt: "Anlage_10_263"*
        Ablageordner = "\Storage Card MMC\" & Dateiname
*ergibt: "\Storage Card MMC\Anlage_10_263*"
        Ablagedatei = Ablageordner & "\" & Dateiname & ".csv"
*ergibt: "\Storage Card MMC\Anlage_10_263\Anlage_10_263.csv*"
        Zielort = "\\Notebook23\Protokoll\" & Dateiname
*ergibt: "\\Notebook23\Protokoll\Anlage_10_263*"
        Zieldatei = Zielort & "\" & Dateiname & ".csv"
*ergibt: "\\Notebook23\Protokoll\Anlage_10_263\Anlage_10_263.csv*"

        If fs.dir(Ablageordner) <> "" Then
*hier überprüfe ich, ob der Quellordner (damit die Datei) vorhanden ist*
            If fs.dir(Zielort) <> "" Then
*hier überprüfe ich, ob am Ziel bereits die Datei vorhanden ist*
                fs.kill(Zieldatei)
*wenn ja, dann löschen*
            ElseIf fs.dir(Zielort) = "" Then
                fs.mkdir(Zielort)
*wenn nein, dann Ordner erstellen*
                fs.Movefile Ablagedatei, Zielort 
*und dann die Datei kopieren/verschieben*
            End If

            ShowSystemAlarm (Err.Description)
        End If
    Next
Next

*Mit dem Verschieben hab ich den Vorteil, dass ich danach nicht löschen muss. Das soll später voll automatisch in der Anlage laufen. Wenn Netzwerk vorhanden und Daten senden = True, dann Datei verschieben und gut ist die Sache.

Nur habe ich halt das Problem mit dem Zugriff.
*


----------



## Larry Laffer

OK ... dann weiter ...
das Ziel "\\Notebook_23" ist im Netzwerk zu erreichen ? - Ach ... das ist Blödsinn ... du hast ja geschrieben, dass du das Zielverzeichnis erzeugen kannst.
Hast du volle Zugriffsrechte darauf ? Also "Read, Write, Modify, Create" etc. ?

In deinem vorletzen Beitrag kopierst du den Ablageordner und nicht die Ablagedatei - war das ein Schreibfehler oder ist das ggf. wirklich so ? Sowohl MoveFile wie auch CopyFile wollen m.E. mit einer datei arbeiten und nicht mit einem Ordner ...

Gruß
Larry


----------



## Feldmann

Hallo,

du hast recht, es ist mir auch aufgefallen. 

Scheinbar geht es jetzt. Ich habe es heute noch 2 oder 3 mal probiert. ich teste das morgen noch mal ausgiebig.

Aber 1000 Dank!!!!!

Manchmal hilft es, wenn man drüber spricht...


----------



## Feldmann

Moin Larry,

ich habe es jetzt so gemacht, dass ich die Daten auf der MMC in einen Ordner schreibe.
Beim Senden suche ich den Ordner und schiebe die Datei auf mein Notebook.

Jetzt brauche ich den Ornder nicht mehr. Wenn ich mit fs.kill("\Storage Card MMC\Ordner") den Ordner löschen will, dann zeigt mir das Panel an, dass der Zugriff verweigert wird.

For A = Jahr - 1 To Jahr
    For d = 0 To 365

        Dateiname = "Anlage_" & A & "_" & d

         If Dateiname <> "Anlage_" & A & "_" & Jahrestag Then
*die akutelle datei finden und dann rest überspringen* 
             Ablageordner = "\Storage Card MMC\" & Dateiname
            Ablagedatei = Ablageordner & "\" & Dateiname & ".csv"
            'ShowSystemAlarm Ablagedatei
            Zieldatei = "\\Notebook23\Protokoll\" 

           If fs.dir(Ablageordner) <> "" Then
                fs.MoveFile Ablagedatei, Zieldatei & Dateiname & ".csv"
                SmartTags("DB Allgemein.Letztes_Senden_Tag") = Jahrestag
                ShowSystemAlarm "Datenübertragung erfolgreich"
                'fs.kill(Ablageordner) *Funzt nicht!!*
            End If        
            ShowSystemAlarm (Err.Description)
        End If
    Next
Next

vielleicht kannst du mir hier auch noch weiterhelfen


----------



## Feldmann

Moin,

hat sich erledigt. ICh schreibe die Dateien jetzt direkt in das Verzeichnis Storage Card MMC.
Mit movefile ist die datei dann weg.

es klappt.


----------



## Larry Laffer

Hallo,
schön, wenn es nun funktioniert ... 



Feldmann schrieb:


> 'fs.kill(Ablageordner) *Funzt nicht!!*
> ...
> vielleicht kannst du mir hier auch noch weiterhelfen


Ich denke, dass das hier auch funktionieren würde, wenn du eine Datei und nicht einen Ordner "killen" würdest. Ohne es jetzt nachgesehen zu haben ... aber ich vermute, das der Ordner mit RmDir oder ähnlich gelöscht werden kann ...

Gruß
Larry


----------

