TIA Idéen gesucht - WinCC Advanced Runtime, wie Laufwerk von gesteckte USB auslesen ?

Beiträge
9.091
Reaktionspunkte
2.228
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

WinCC Advanced Runtime V17, Windows 10.

Ich habe ein Skript zum Sichern von Dateien auf einem USB-Stick. Das Skript geht davon aus, dass dem USB-Stick ein bestimmter Laufwerk zugewiesen ist, z. B. "H:".
Mein Problem ist dass einem USB-Stick beim Einsatz an einem anderen PC möglicherweise schon ein Laufwerk zugewiesen wurde, z. B. "K:". Dieser Laufwerksbuch bleibt auch dann erhalten, wenn ich den Stick aus dem anderen PC entnehme und in die WinCC PC einstecke.
Daher ist der Laufwerk nicht "H:" sondern ein anderer, und das Skript funktioniert nicht.
Was kann ich tun?
Momentan checke ich ob "H:" eksistiert, und wenn nicht zeige ich eine Fehlermeldung. Ich möchte aber dass es eleganter hantiert wurde.
edit:
Die Meldung an den Benutzer wird unklar und verwirrend.
Das Skript kann nicht erkennen, ob das Problem darin liegt, dass der USB-Stick nicht eingesteckt ist oder ob er zwar eingesteckt ist, aber den falschen Laufwerk zugewiesen ist.
Am besten wäre es, wenn der Benutzer einfach den USB-Stick einstecken und die Funktion aktivieren könnte, woraufhin alles automatisch abläuft.

Idéen:
1. Den tatsächlichen Laufwerk eines Mediums an einem bestimmten USB-Port ermitteln und das Skript den Laufwerks dann dynamisch anpassen lassen?
2. Einem USB-Stick, der an einen bestimmten USB-Port angeschlossen ist, einen bestimmten Laufwerksbuchstaben zuweisen lassen, sprich 'forzieren' ?

In beiden Fällen bin ich ratlos, wie ich das erreichen soll.
Hat jemand Ideen, vielleicht sogar sehr kreative?
 
Zuletzt bearbeitet:
Du hast sicher eine Datei oder einen Ordner auf dem Stick, die immer gleich bleiben.

Idee wäre also:

Prüfen ob H existiert -> Wenn nein -> Kein USB Stick.
Prüfen ob H:\MeineDatei existiert -> Wenn ja -> Dein USB-Stick

Das ganze dann ggf. mit mehreren Laufwerksbuchstaben durchspielen.

Grüße

Marcel
 
Guten Morgen.

Ich denke, du wirst um die "BruteForce"-Methode "Ansprache jedes möglichen Laufwerksbuchstabens durch Schreiben/Lesen einer Testdatei mit Auswertung der Fehlerreaktion" nicht herumkommen, wenn du dies skriptbasiert im HMI lösen willst.
Ich glaube, zu diesem Thema gibt es bereits einen/mehrere Thread(s).

Wobei ich mich etwas wundere:
Ich habe ebenfalls eine Datensicherungsroutine unter Verwendung von USB-Speichermedien projektiert, bin bis jetzt aber noch nie in die Falle gelaufen, dass ein gesteckter USB-Stick quasi "seinen eigenen Laufwerksbuchstaben mitbringt". Das würde ja Konflikte bei jedem Rechner erzeugen, der diesen Laufwerksbuchstaben bereits in aktiver Verwendung hat ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Screenshot 2025-07-10 215818.jpg

So enumerieren wir alle eingesteckten USB Laufwerke in einer Runtime Advanced. Bei uns geht es aber darum eine Datei zu finden. Mein Tipp wäre hier jetzt die Volumeseriennummer des USB Sticks herauszufinden und mit Drive.SerialNumber zu vergleichen. Alternativ könnte man auch einfach den Namen mit Drive.VolumeName vergleichen
 
Ich denke, du wirst um die "BruteForce"-Methode "Ansprache jedes möglichen Laufwerksbuchstabens durch Schreiben/Lesen einer Testdatei mit Auswertung der Fehlerreaktion" nicht herumkommen, wenn du dies skriptbasiert im HMI lösen willst.
Ich kann viele Laufwerken durchlaufen, aber wie weiss ich dass eine gefundene Laufwerk die USB Stick ist ?
Es kann auch eine Partition auf die PC sein welche der Bediener für eine anderen Zweck erzeugt hat. Oder eine andere Medie.

Wobei ich mich etwas wundere:
Ich habe ebenfalls eine Datensicherungsroutine unter Verwendung von USB-Speichermedien projektiert, bin bis jetzt aber noch nie in die Falle gelaufen, dass ein gesteckter USB-Stick quasi "seinen eigenen Laufwerksbuchstaben mitbringt". Das würde ja Konflikte bei jedem Rechner erzeugen, der diesen Laufwerksbuchstaben bereits in aktiver Verwendung hat ...
Wenn ein Medie gesteckt wird, welche eine Laufwerkbuchstaben hat der schon in Verwendung ist, dann bekommt es von Windows eine andere freie Laufwerkbuschstabe.

@312C dass ist fast wie den Brute Force Verfahren wie von faust vorgeschlagen. Nur es wird erkennt dass es eine Wechselträgermedie ist.
Wass wenn auf irgendein Grund andere Wechselträgermedien gesteckt ist. edit: In die IPC gibt es 4 USB ports.
Mein Tipp wäre hier jetzt die Volumeseriennummer des USB Sticks herauszufinden und mit Drive.SerialNumber zu vergleichen. Alternativ könnte man auch einfach den Namen mit Drive.VolumeName vergleichen
Der Bediener kann eine beliebige USB Stick stecken.

Das einzigste was konstant ist, ist die USB Port. Diese wird mittels eine Adapterkabel an die Schranktür gebracht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hmmmm....
Vielleicht gib es ein weg mit Bordmitteln.

Ich weiss welche Laufwerke in System konfiguriert sind, "C:"-"D:"-"E:"-"F:" sind Partitions auf Systemflashkarte.
"G:" ist die SD Karte in SD Slot welche immer gesteckt werden muss, weil für Archivdaten verwendet wird.
Ich konnte eine Liste mit aktuelle Laufwerke mittels objFSO.Drives erstellen und wenn eine 'neue' Laufwerkbuchstab gefunden ist, und es ein Wechselträgermedie ist, dann konnte ich davon ausgehen es ist die neu gesteckte USB Stick.
Und ich konnte sicherheitshalber eine Meldung anzeigen lassen, etwa wie "Wechselträgermedie XX gefunden. Daten auf diese Medie kopieren ?".
 
Und ich konnte sicherheitshalber eine Meldung anzeigen lassen, etwa wie "Wechselträgermedie XX gefunden. Daten auf diese Medie kopieren ?".
Kannst Du denn nicht einen "Wähle Ordner" Dialog öffnen, so dass der Bediener selber das Speicher-Ziel wählt?
Wenn Du schreibst, dass der Bediener seinen eigenen USB-Stick bringt, mag ich es immer nicht, wenn Programme selbsttätig Daten "irgendwo" auf meinem Stick ablegen. Ggf. möchte ich einen eigenen Zielordner anlegen.
Damit hättest Du auch das Problem der automatischen Erkennung umgangen.
 
Ich kann viele Laufwerken durchlaufen, aber wie weiss ich dass eine gefundene Laufwerk die USB Stick ist ?
Es kann auch eine Partition auf die PC sein welche der Bediener für eine anderen Zweck erzeugt hat. Oder eine andere Medie.
Reden wir hier über ein maschinennahes HMI?
Wenn ja, dann hoffe ich doch, dass nicht jeder an der Partitionierung der Festplatte "rumschrauben" darf!? ;)

Wenn ein Medie gesteckt wird, welche eine Laufwerkbuchstaben hat der schon in Verwendung ist, dann bekommt es von Windows eine andere freie Laufwerkbuschstabe.
Wie gesagt: ist mir so noch nicht untergekommen.
Wenn ich (m)einen USB-Stick, der auf meinem Rechner den LW-Buchstaben H bekommt, an einen anderen PC anschließe, bekommt er dort IMMER den nächsten freien Buchstaben :unsure:

Die von JSE vorgeschlagene Lösung stellt m.M.n das Optimum dar, wenn tatsächlich alle möglichen Situationen abgefangen werden sollen.
Ist allerdings meines Wissens dann auf PCs beschränkt, weil es einen entsprechenden Systemdialog nicht auf WinCE-Geräten gibt. (Oder?)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Haha ! Es funktioniert.

Hier ohne gesteckte USB stick:
1752236925351.png

Mit gesteckte USB stick:
1752236955374.png

Code:
Sub Find_drives()

Dim objFSO, colDrives, objDrive
Dim dletter, dtype, dfreespace, dserialno, dsize, dvolumename
Dim drive_found

On Error Resume Next

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives

drive_found = False

For Each objDrive In colDrives
   dletter = objDrive.DriveLetter
   dtype = objDrive.DriveType
   dfreespace = objDrive.FreeSpace
   dserialno = objDrive.SerialNumber
   dsize = objDrive.TotalSize
   dvolumename = objDrive.VolumeName

   If Not drive_found And Not dletter = "C" And Not dletter = "D" And Not dletter = "E" And Not dletter = "F" And Not dletter = "G" Then
       drive_found = True
       SmartTags("Driveletter") = dletter
       SmartTags("Drivetype") = dtype
       SmartTags("Drivefreespace") = dfreespace
       SmartTags("Driveserialno") = dserialno
       SmartTags("Drivesize") = dsize
       SmartTags("Drivevolumename") = dvolumename
   End If     
  
Next

If Not drive_found Then
       SmartTags("Driveletter") = "Not found"
       SmartTags("Drivetype") = "-"
       SmartTags("Drivefreespace") = "-"
       SmartTags("Driveserialno") = "-"
       SmartTags("Drivesize") = "-"
       SmartTags("Drivevolumename") = "-"
End If

If Err.Number <> 0 Then
    ShowSystemAlarm "Find drives error " & Err.Number & " " & Err.Description
    Err.Clear
End If   

objFSO.Close

End Sub
 
Kannst Du denn nicht einen "Wähle Ordner" Dialog öffnen, so dass der Bediener selber das Speicher-Ziel wählt?
Wenn Du schreibst, dass der Bediener seinen eigenen USB-Stick bringt, mag ich es immer nicht, wenn Programme selbsttätig Daten "irgendwo" auf meinem Stick ablegen. Ggf. möchte ich einen eigenen Zielordner anlegen.
Aber wie weiss der Bediener welche Laufwerk Windows den Stick zugeordnet hat ? Es taucht kurzlich ein Info auf "Laufwerk H gesteckt", aber dies verschwindet nach wenige Sekunden.

Reden wir hier über ein maschinennahes HMI?
Wenn ja, dann hoffe ich doch, dass nicht jeder an der Partitionierung der Festplatte "rumschrauben" darf!? ;)
Ja, aber es gibt für die Kunde eine Windows Administrator. Er kann machen was er will.
Die Standard Benutzer hat kein Zugang auf Windows oder die Systemsteuerung.

Wie gesagt: ist mir so noch nicht untergekommen.
Wenn ich (m)einen USB-Stick, der auf meinem Rechner den LW-Buchstaben H bekommt, an einen anderen PC anschließe, bekommt er dort IMMER den nächsten freien Buchstaben :unsure:
Ich habe diese Thema erstellt weil es ist mir passiert. Und das Verhalten ist unter 'Einstieg' hier gut beschrieben: https://www.uwe-sieber.de/usbdlm.html

Ist allerdings meines Wissens dann auf PCs beschränkt, weil es einen entsprechenden Systemdialog nicht auf WinCE-Geräten gibt. (Oder?)
WinCE ist sowiso fertig.
 
Code:
Sub Find_drives()
...
For Each objDrive In colDrives
   dletter = objDrive.DriveLetter
   dtype = objDrive.DriveType
   dfreespace = objDrive.FreeSpace
   dserialno = objDrive.SerialNumber
   dsize = objDrive.TotalSize
   dvolumename = objDrive.VolumeName

   If Not drive_found And Not dletter = "C" And Not dletter = "D" And Not dletter = "E" And Not dletter = "F" And Not dletter = "G" Then
       drive_found = True
       SmartTags("Driveletter") = dletter
       SmartTags("Drivetype") = dtype
       SmartTags("Drivefreespace") = dfreespace
       SmartTags("Driveserialno") = dserialno
       SmartTags("Drivesize") = dsize
       SmartTags("Drivevolumename") = dvolumename
   End If  
 
Next
...
End Sub
Wobei du hier strenggenommen trotzdem ALLE Laufwerke/Partitionen abfragst, lediglich bekannte/vorbelegte LW-Buchstaben von der weiteren Behandlung ausschließt und den eleganteren (hier möglichen, weil WinCE ausgeschlossen wird) Weg über FSO.Drives gehst. Es müsste also mindestens der LW-Typ noch berücksichtigt werden.

Nichtsdestotrotz:
Wenn ein Anwender jetzt mehrere mobile Datenträger gesteckt hat, dann stehst du vor immer noch vor deinem Ursprungsproblem.

Ich habe es jetzt gerade nicht griffbereit, aber auch zu diesem Thema gibt es meine ich mehrere Threads:
@JSEngineering meint wahrscheinlich den File- oder FolderBrowserDialog, den z.B. Office oder IE/Edge bereitstellt und der in VBScript als Objekt angesprochen/verwendet werden kann.

Aber wie weiss der Bediener welche Laufwerk Windows den Stick zugeordnet hat ? Es taucht kurzlich ein Info auf "Laufwerk H gesteckt", aber dies verschwindet nach wenige Sekunden.
Der Bediener/Verwender deiner Datensicherungsfunktion sollte den Inhalt seines USB-Stick schon kennen, und mit dem o.g. Dialog könnte er diesen Inhalt ja sogar sehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wobei du hier strenggenommen trotzdem ALLE Laufwerke/Partitionen abfragst, lediglich bekannte/vorbelegte LW-Buchstaben von der weiteren Behandlung ausschließt und den eleganteren (hier möglichen, weil WinCE ausgeschlossen wird) Weg über FSO.Drives gehst.
Kann gut sein man kann es optimieren.
Die Code war nur schnell getippt um ein Test zu machen.

Es müsste also mindestens der LW-Typ noch berücksichtigt werden.
Für die realen Funktion will ich auch die DriveType in Bezug nehmen.

Wenn ein Anwender jetzt mehrere mobile Datenträger gesteckt hat, dann stehst du vor immer noch vor deinem Ursprungsproblem.
Korrekt.
In bin soweit zufrieden, ich hoffe die Dialog den Bediener warnen wird wenn etwas nicht passt.
Vielleicht konnte man die Code erweitern, so dass man den Anzahl gesteckte Medien erkennt, und wenn >1 eine Warnung ausgeben.

Ich habe es jetzt gerade nicht griffbereit, aber auch zu diesem Thema gibt es meine ich mehrere Threads:
@JSEngineering meint wahrscheinlich den File- oder FolderBrowserDialog, den z.B. Office bereitstellt und der in VBScript als Objekt angesprochen/verwendet werden kann.
Interessant. Wie integriert man es mit die WinCC HMI ? Muss MS Office installiert werden ?

Der Bediener/Verwender deiner Datensicherungsfunktion sollte den Inhalt seines USB-Stick schon kennen, und mit dem o.g. Dialog könnte er diesen Inhalt ja sogar sehen.
Problem ist die Zuordning von den Laufwerksbuchstab, welche der Bediener nicht selber wissen kann.
 
Kann gut sein man kann es optimieren.
Die Code war nur schnell getippt um ein Test zu machen.
(y)

Interessant. Wie integriert man es mit die WinCC HMI ? Muss MS Office installiert werden ?
Wenn man den Office-Dialog nutzen möchte: ja. Es sollte aber auch der InternetExplorer bzw. Edge ausreichen.
Wie man dies GENAU macht, kann ich dir nicht sagen; ich habe auf eine Nutzung verzichtet, weil man dabei den Vollbild- bzw. Kioskmodus der Runtime verlässt, und das wollte ich den Bedienern nicht erlauben.

Ich habe aber noch einen anderen Hinweis bzw. eine andere Idee:
HMI-Toolbox, hier ist ein FileBrowser beispielhaft projektiert (https://support.industry.siemens.com/cs/document/106226404/toolbox-für-hmi-projekte?dti=0&lc=de-DE)
Es gibt auch einen Thread dazu (SUFU).

Problem ist die Zuordning von den Laufwerksbuchstab, welche der Bediener nicht selber wissen kann.
Muss er ja auch nicht: Er bekommt einfach alle (ggf. restriktierbar nur die zugelassenen) Laufwerke angezeigt.
 
Ich habe aber noch einen anderen Hinweis bzw. eine andere Idee:
HMI-Toolbox, hier ist ein FileBrowser beispielhaft projektiert (https://support.industry.siemens.com/cs/document/106226404/toolbox-für-hmi-projekte?dti=0&lc=de-DE)
Es gibt auch einen Thread dazu (SUFU).
Ich habe eine schwache Erinnerung, dass es vor nicht allzu langer Zeit ein Thema gab, in dem der Toolbox-Dateibrowser besprochen wurde.Aber ich kann das Thema jetzt nicht finden.

Er bekommt einfach alle (ggf. restriktierbar nur die zugelassenen) Laufwerke angezeigt.
Das mit eine Dateibrowser wäre einen alternativen Weg.
Aber da ich eigentlich mein Problem gelöst habe denke ich es bleibt bei den schon genannte Skript.
(Ich habe viele andere Aufgaben, hätte nicht erwartet das ich mich mit diese Problem den Zeit verschwenden musste).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
(Ich habe viele andere Aufgaben, hätte nicht erwartet das ich mich mit diese Problem den Zeit verschwenden musste).
Nebenkriegsschauplätze fressen immer gut Zeit, habe letztens eine Software geschmiedet die mir die lästigen Arbeitsschutzbelehrungen abnimmt. Am Ende habe ich mehr Zeit investiert für das Reengineering als ich für alle Belehrungen in einem Jahr gebraucht hätte, aber der Spaß an der Freude treibt einem an.
 
Zurück
Oben