WinCC VBS fehlendes Netzlaufwerk schnell erkennen

Schurik

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe ein Skript geschrieben welches Daten aus der SPS auf ein Netzlaufwerk schreibt. Ist dieses Laufwerk nicht erreichbar dann werden die Daten auf ein USB-Stick gespeichert. Ist das Netztlaufwerk wieder erreichbar werden die Daten dann vom USB aufs Laufwerk kopiert. Alles funktioniert auch, bloss habe ich Probleme zu erkennen wenn das Netzlaufwerk ausfällt.
Ich habe es mit fs.Dir("\\TPPT3-PC\Data\USB-Daten",16) und Err.Number probiert. Wenn ich das Netztlaufwerk trenne dauer es ca 1-2 Min bis der Behfehl fs.Dir("\\TPPT3-PC\Data\USB-Daten",16) ein "" statt "USB-Daten" leifert und die Daten auf dem USB gespeichert werden. Starte ich die Runtime neu wird beim jedem Aufruf des Skriptes das Fehlen des Laufwerkes sofort erkannt, also fs.Dir("\\TPPT3-PC\Data\USB-Daten",16) liefert sofort "".

Beim USB-Stick ist es die gleiche Abfrage bloss da wird auch alles sofort erkannt.

Hat jemand eine Idee woran das liegen kann? Oder gibt es eventuell eine bessere/schnellere Methode zu erkennen ob das Laufwerk getrennt wurde?

Code:
Sub WriteData()
Dim f,fs,Path_USB,Path_Net,datum,D, T, n, i
SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_USB")=False
SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_Netzwerk")=False
SmartTags("Sichern_Fertig_1") = False
SmartTags("Sichern_Fertig_2") = False

D = Date
T = Time 
datum = Right("0" & Hour(T), 2) & Right("0" & Minute(T), 2) & Right("0" & Second(T), 2) & "_"  & Right("0" & Day(D), 2)  & Right("0" & Month(D), 2) & Year(D)
 
Set f= CreateObject("filectl.file")
Set fs = CreateObject("filectl.filesystem")
Path_USB = "\Storage Card USB\Messdaten\" & datum & "_USB.txt" 
Path_Net = "[URL="file://\\TPPT3-PC\Data\"]\\TPPT3-PC\Data\[/URL]" & datum & "_Netzwerk.txt" 

On Error Resume Next
 
 
If fs.Dir("[URL="file://\\TPPT3-PC\Data\USB-Daten",16"]\\TPPT3-PC\Data\USB-Daten",16[/URL]) = "" Or Err.Number <> 0 Then   
 SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_Netzwerk")=True
Else
 SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_Netzwerk")=False 
End If

If fs.dir("\Storage Card USB\Messdaten") = "" Or Err.Number <> 0 Then   
 SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_USB")=True
Else
 SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_USB")=False 
End If
 

' Daten vom USB auf Netzlaufwerk kopieren

Dim  Result, SourceFile, DestFile                 
If SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_Netzwerk") = False _
And SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_USB") = False Then
 
 Result = fs.Dir("\Storage Card USB\Messdaten\*.txt")         
 If Result = "" Then
 
 Else
  SourceFile = "\Storage Card USB\Messdaten" & Result
  DestFile   = "[URL="file://\\TPPT3-PC\Data\USB-Daten"]\\TPPT3-PC\Data\USB-Daten\[/URL]" & Result
  fs.FileCopy SourceFile,DestFile
  fs.SetAttr  SourceFile, 0                        
  For Index = 1 To 999
   Result = fs.Dir()    
   If Result = "" Then
    Exit For
   Else
    SourceFile = "\Storage Card USB\Messdaten" & Result
    DestFile   = "[URL="file://\\TPPT3-PC\Data\USB-Daten"]\\TPPT3-PC\Data\USB-Daten\[/URL]" & Result
    fs.FileCopy SourceFile,DestFile
    fs.SetAttr  SourceFile, 0  
   End If 
  Next                             
 End If                                
End If

If  SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_Netzwerk")=False Then 

 f.open Path_Net, 2
 
' Hier schreibe ich die Daten auf das Netzlaufwerk
  
 f.Close  
 SmartTags("Sichern_Fertig_2") = True
End If

If  SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_USB")=False _
And SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_Netzwerk")=True Then
 
    f.open Path_USB, 2
' Hier schreibe ich die Daten auf den USB-Stick   
    
 f.Close  
 SmartTags("Sichern_Fertig_1") = True
End If
End Sub

Danke
 
Hallo,

ich habe in WinCC V7.0 ein Netzlaufwerk mal mit folgendem Code überprüft:

Code:
Option ExplicitFunction action


On Error resume next
 
Dim fs 
Dim pfad


Set fs = CreateObject ("Scripting.FileSystemObject")


pfad = HMIRuntime.Tags("Default_Pfad").Read


If Not fs.FolderExists (pfad) Then


	HMIRuntime.Tags("Netzlaufwerk_OK").Write False
Else
	HMIRuntime.Tags("Netzlaufwerk_OK").Write True	
End If




Set fs = Nothing


End Function

hat super geklappt und war auch schnell.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast es wohl mit win7 gemacht. Bei mir läuft WinCE.

Hab bei Siemens SUpport nachgefragt und die haben das Verhalten bestätigt aber haben keine Lösung dafür.
 
Hallo Schurik

Eine Alternative wäre nicht nur mit fs.dir zu prüfen, ob das Verzeichnis existiert, sondern auch ob dein Schreibzugriff valide abläuft. Tut er dies ist alles in Ordnung, tut er dies nicht speicherst du weiter auf USB.

Grüße

M.
 
Alternativgedanke:

Immer auf USB speichern und eine Routine schreiben die dafür sorgt das Daten abgeholt werden, auf dem Netzlaufwerk geschrieben werden und dann vom USB löscht?

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Schurik

Eine Alternative wäre nicht nur mit fs.dir zu prüfen, ob das Verzeichnis existiert, sondern auch ob dein Schreibzugriff valide abläuft. Tut er dies ist alles in Ordnung, tut er dies nicht speicherst du weiter auf USB.

Grüße

M.

Hallo Mardonios,

hast du mir ein Beispiel wie ich das umsetzen kann?

Gruß
 
Hallo Schurik,

in deinem Code würde ich folgendes versuchen:
Code:
And SmartTags("DB1551_Schnittstelle_HMI_HMI_Fehler_USB") = False Then

Result = fs.Dir("\Storage Card USB\Messdaten\*.txt")         
If Result = "" Then

 Else
  SourceFile = "\Storage Card USB\Messdaten" & Result
  DestFile   = "[URL="file://tppt3-pc/Data/USB-Daten"][B][COLOR=#07466f]\\TPPT3-PC\Data\USB-Daten\[/COLOR][/B][/URL]" & Result
  [COLOR=#FF0000]On[/COLOR] [COLOR=#FF0000]Error GoTo 0                                         'Um sicher zu gehen, dass kein vorheriger Fehler mit rein spielt 
  On Error Resume Next 
  fs.FileCopy SourceFile,DestFile
  If Err.Number <> 0 then
            'Fehlerbehandlung
  End If[/COLOR]
  fs.SetAttr  SourceFile, 0                        
  For Index = 1 To 999
   Result = fs.Dir()    
   If Result = "" Then
    Exit For
   Else
    SourceFile = "\Storage Card USB\Messdaten" & Result
    DestFile   = "[URL="file://tppt3-pc/Data/USB-Daten"][B][COLOR=#07466f]\\TPPT3-PC\Data\USB-Daten\[/COLOR][/B][/URL]" & Result
    [COLOR=#FF0000]On[/COLOR] [COLOR=#FF0000]Error GoTo 0                                         'Um sicher zu gehen, dass kein vorheriger Fehler mit rein spielt 
    On Error Resume Next 
    fs.FileCopy SourceFile,DestFile
    If Err.Number <> 0 then
            [COLOR=#ff0000]'Fehlerbehandlung[/COLOR]
    End If[/COLOR]
    fs.SetAttr  SourceFile, 0  
   End If 
  Next

Ich konnte es leider nicht testen, da ich im Moment kein Gerät mit CE vorliegen habe. Versuche am besten die Fehlerbeschreibung auszulesen, ob dies soweit funktioniert hat. Damit sollten alle Zugriffsfehler erschlagen werden können.

Grüße

M.
 
Hallo,
vielleicht noch ein anderer Ansatz - bei meinen Applikationen realisiere ich das so :
Code:
Dim Server_vorhanden(3) , fs , d , xFolder , xDrive
Set fs = CreateObject("Scripting.FileSystemObject") 
Server_vorhanden(1) = False
xDrive = Left(SmartTags("Allgemein\my_Server_Verz_Daten") ,2)
If fs.DriveExists (xDrive) Then
   Set d  = fs.GetDrive (fs.GetDriveName (xDrive))
   Server_vorhanden(1) = d.IsReady
   
   If Server_vorhanden(1) Then 
      xFolder = SmartTags("Allgemein\my_Server_Verz_Daten") + SmartTags("Allgemein\my_Anlagen_Nummer") '+ "\"
      Server_vorhanden(1) = fs.FolderExists (xFolder)
   End If  
End If
SmartTags("Allgemein\my_Server_Verz_Daten_OK") = Server_vorhanden(1)
Von dem etwas anderem Objekt abgesehen sollte der Rest eigentlich bei dir auch funktionieren können ...

Gruß
Larry
 
Zurück
Oben