WinCC VB-Skript - Dateisuche nach Dateinamenkürzel und Datum

SPS-EK

Level-1
Beiträge
68
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Forenmitglieder,

ich habe das Problem, dass ich ein VB-Skript in WinCC über eine Tastenbelegung starten will und dieses entsprechend ausführen soll.

Das VB-Skript soll auf der SD-Karte eine Datei suchen und den Namen der Datei in eine HMI-Variable schreiben.
Das Problem dabei ist, dass diese Datei mehrmals vorkommen kann nur entsprechend mit anderen Versionen und demnach immer die neuste Datei ausgewählt werden soll.
Weiteres Problem ist, dass ich nicht den genauen Namen suchen kann sondern nur ein Kürzel im Namen da die Datein mit verschiedenen Versionen auftreten.
Mit VB-Skript kenn ich mich bis dato nur sehr beschränkt aus und habe folgenden Ansatz bisher:

Code:
Dim Dateiname, Dateidatum, Verzeichnis, fs   'Lokale Variablen deklaration

' oder Const Verzeichnis =  "\Storage Card SD\*.*"

Verzeichnis = "\Storage Card SD\*"
Set fs = CreateObject("FileCtl.FileSystem")
Dateiname = fs.dir(Verzeichnis)
If Dateiname = "ABC" Then ' Beispielabfrage auf das Kürzel im Namen, nur mit welchem Befehl geht das?
    If Dateidatum = NeustesDatum der Datei Then ' Beispielabfrage auf das neuste Datum der gefundenen Datei
        SmartTags("Var_filename") = Dateiname
    End
End


Gerade die Abfragen und die korrekten Befehle bereiten mir Kopfzerbrechen, hat da jemand ein Denkanstoss und Tipp parat?

VG und Danke im Voraus
 
In einer Schleife mit der Dir-Methode alle Dateien (oder "ABC*.*") im Verzeichnis auflisten lassen, und ggf. mit Stringvergleichen untersuchen, ob das "Kürzel" im Dateiname vorkommt und dann nach Datum sortieren. (Beispiel Schleife mit Dir)

Kann Dein "Kürzel" irgendwo im Dateiname vorkommen oder nur am Anfang des Dateinamens?
Wie ist das Datum codiert? Im Dateiname oder nur im Datei-Zeitstempel?

Vorher durchdachte systematische Dateinamensvergabe kann die Suche ungemein vereinfachen.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald und vielen Dank für deine zügige Antwort.

Das schaue ich mir gleich mal an...

Mein Kürzel bzw. das Kürzel kommt irgendwo im Dateinamen vor, da nun aber mehrere daraufzugreifen kann sich der ganze Name verändern, aber das Kürzel bleibt immer enthalten. Daher kann ich leider nur danach suchen.
Das Datum wäre das Datum aus dem Zeitstempel der Datei. Die Datei muss nicht geöffnet werden und im Dateinamen steht auch kein Datum, nur zusätzlich eine Versionsnummer aber leider variiert auch diese.
 
Hallo Harald,

danke dir schon mal für die Hilfe und Tipps.

Ich habe den Code weiter geschrieben, nur funktioneirt es immernoch nicht und ich weiß nicht woran es liegen könnte.
Hier der momentane Code:
Code:
Sub Suchen()

Dim Dateiname, Datei(100), Dateidatum(100), Verzeichnis, Dateikuerzel, fs, index, index_date  'Lokale Variablen Deklaration

Verzeichnis = "Storage Card SD"
Dateikuerzel = "ABC"

Set fs = CreateObject("FileCtl.FileSystem")

Dateiname = fs.dir("\" & Verzeichnis & "\" & Dateikuerzel & "*.pdf")    'Suche nach ersten Dateinamen in Verzeichnis
ShowSystemAlarm(Dateiname & " gefunden")

If Dateiname = "" Then
    ShowSystemAlarm("Keine Datei gefunden")    ' Meldung: Keine Datei gefunden
Else
    For index = 1 To 100
        Dateiname = fs.dir() 'Suche nach weiteren Dateinamen in Verzeichnis
        If Dateiname = "" Then
            Exit For
        Else
            Dateidatum(index) = fs.FileDateTime(Datei(index))            
            ShowSystemAlarm(Dateiname & " gefunden")
            
           ...
        End If
    Next
    
    If index >= 1 Then
        ShowSystemAlarm(index+1 & " Dateien gefunden")    'Meldung: X Dateien gefunden
    Else
        ShowSystemAlarm("1 Datei gefunden")    'Meldung: Eine Datei gefunden
    End If
    
    For index_date = 1 To 100
        ...
            Exit For
        End If
    Next    
End If

End Sub

Die Systemmeldungen habe ich eingefügt um zu sehen was während der Abarbeitung passiert.

Leider bekomme ich nur als Meldungen " gefunden" und anschließend "Keine Dateien gefunden".
Demnach gehe ich davon aus, dass die 1. Datei nicht mal gefunden wird.
Nur was ist falsch?

Ebenso bin ich mir bei der Auswertung des Datums unsicher wie ich es realisieren kann, dass wirklich nur die neuste Datei dargestellt wird.


Ich hoffe du oder jemand weiteres sieht mit seinem geschulten Auge den Fehler wieso keine Datei gefunden wird.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Befehl Fs.Dir gibt dir nur das Verzeichnis zurück. Das ist ja nicht das, was du willst. Für dich wäre die Files-Funktion relevant, die dir die gefundenen Dateien als Array zurückliefert.
So in etwa könnte das aussehen :
Code:
Set fs = CreateObject("scripting.FileSystemObject")
Set fVerz = fs.getFolder("D:\MP3s\A")
Set fdateien = fVerz.Files

For Each fDatei In fdateien
If InStr(fDatei, "") > 0 Then
   strDat = fDatei.Name & vbLf
    
End If
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ändert aber nichts daran, dass er mit Dir keine Dateiliste bekommt ...
Keine Liste, aber bei jedem Aufruf den nächsten Eintrag des Dateiverzeichnisses, so lange bis die Dir-Methode einen Leerstring "" zurückgibt. In dem von mir in #2 verlinkten FAQ-Beispiel wird die Dir-Methode entsprechend verwendet.
Unter WinCE gibt es nur die Dir-Methode, um Dateiverzeichnis-Einträge zu lesen, egal, ob es ein Dateiname oder ein Ordnername ist. Will man Datei/Ordner unterscheiden, dann kann man die Attribute des Eintrags auswerten.

Harald
 
Hallo Larry,

danke auch dir für dein Beitrag und deine Beteiligung.

Ihr habt beide Recht :D

Die Dir-Methode die Harald beschreibt funktioniert echt top und wirft mir jedesmal die Datei bzw. über die programmierte Schleife deren nächste raus.
Ebenso kann man damit Ordner suchen, habe es eben mit einem zweiten VB-Skript was ich geschrieben habe ausprobiert und funktioniert.
Auflistung funktioniert so natürlich nicht, sondern nur die Zuweisung über eine Schleife in die Felder eines Arrays.

Ich habe nochmal weiter ausprobiert und den Fehler, weshalb die Datei nicht gefunden wurde, gefunden. Es lag an den Sternchen.
Der Code muss an der Stelle wie folgt ausschauen:
Code:
Dateiname = fs.dir("\" & Verzeichnis & "\ *ABC*.pdf")

Mittlerweile funktioniert der Code gut, die Meldungen kommen alle und ich habe mir auch mal anzeigen lassen was gefunden wird.
Jedoch wird bei der Übergabe in die HMI-Variable die folgende Fehlermeldung auf dem HMI ausgegeben:

"Variable PDF_name: Länge des Strings überschritten. String wurde auf 10 Zeichen gekürzt."

PDF_name ist eine interne HMI-Variable als WString und sollte somit genug Zeichen besitzen für die Pfadangabe mit Datei.
Hat jemand eine Ahnung woran es liegt?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Harald, dass war es...
Wie blöd von mir :icon_rolleyes:...aber das Skript funktioniert echt sauber :s12:

Danke für die Hilfestellungen :)


Zwei Fragen habe ich gerade aber noch.
1. Ist es besser so ein Skript als Sub oder als Function zu nutzen? Und wo liegt der Unterschied?
2. Über den Befehl "SmartTags" gebe ich den Wert direkt an die HMI-Variable weiter, das macht ja in dem Fall sinn, aber wenn ich das Skript mal in einem anderen Script aufrufen möchte macht das wenig Sinn. Demnach wäre es wohl besser dies als Rückgabewert "ByVar Pfad_name" zu realisieren? Oder habt Ihr ein besseren Vorschlag?
 
Wenn das Skript nur einfach aufgerufen wird, von einem Ereignis oder aus einem anderen Skript, dann ist Sub OK.
Function benutzt man nur, wenn das Skript per Rückgabeparameter (für Mehrfachverwendung) parametrierbar sein soll.

Harald
 
Super, vielen Dank Harald!

Hab die Datumsauswertung nochmal bearbeitet, dass diese auch nach dem neusten Datum korrekt auswertet und das Skript läuft super! :s1:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Rückmeldung, daß der vorgeschlagene Weg die richtige Richtung war. :) :cool:
Und die Blumen für das super Skript gehören Dir, weil Du hast es komplett selber programmiert. :s12:

Harald
 
Zurück
Oben