WinCCflexible RT - Dateiauswahl als Parameter für externen Programmaufruf

Onkel Dagobert

Level-3
Beiträge
5.793
Reaktionspunkte
1.429
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich brauche mal wieder eine Idee.

Ich stehe mit der Flexible-Kurvenanzeige von archivierten Variablen nach wie vor auf auf Kriegsfuß. Mir geht es darum, mehrere (viele) Kurven in einer Anzeige über einer einheitlichen Zeitachse darstellen zu können. Flexible ist mir dabei nicht flexible genug. Ich schreibe daher per Skript meine Variablen in eine csv-Datei und zeige sie auf einem externen csv-viewer an. Das funktioniert soweit auch sehr gut. Jetzt möchte ich jedoch für jeden Tag eine neue csv-Datei anlegen. Auch das ist kein Problem. Der Dateiname enthält das Datum in Form von "yyyy.mm.dd.csv". Eventuell strukturiere ich den Dateipfad noch in Jahr und Monat. Aber wie ermögliche ich es dem Bediener, eine beliebige Datei aus zu wählen? Ich denke an eine Kalenderdarstellung in der man den jeweiligen Tag anwählt. Oder ein einfacher Datei-Browser? Hat jemand dazu eine Idee?

Vielen Dank an Ingo Wendler für den pfiffigen csv-viewer


Gruß, Onkel


Zusatzfrage:
Ich stehe kurz davor, mich mit dem TIA-Portal beschäftigen zu dürfen. Ist die Kurvenanzeige dort besser gelöst geworden als in Flexible?
 
Zuletzt bearbeitet:
Ich wurde es in mehrere VBS Skripte aufteilen.

Datei mit ältere Zeitstempel finden:
Für jeden Tag+Monat+Jahr testen ob Datei eksistiert.
In eine Schleife:
Tag Variabel dekrementien, bis 0ten Tag, dann Tag auf 31 einstellen und Monat dekrementieren bis 0ten Monat, dann Monat auf 12 einstellen und Jahr dekrementieren, bis Jahr=2012.
Wenn Datei gefunden, Schleife abbrechen und an Benutzer Melden "Datei von xxx Datum gefunden, öffnen ?"
Wenn keine Datei gefunden, an Benutzer Melden "Kein ältere Datei gefunden."

Datei mit neuere Zeitstempel finden:
Für jeden Tag+Monat+Jahr testen ob Datei eksistiert.
In eine Schleife:
Tag Variabel inkrementien bis 31ten Tag, dann Tag auf 1 einstellen und Monat inkrementieren bis 12ten Monat, dann Monat auf 1 stellen und Jahr inkrementieren bis Jahr=aktuellen Jahr.
Es ist egal ob es 31 Tage in ein Monat gibt.
Wenn Datei gefunden, Schleife abbrechen und an Benutzer Melden "Datei von xxx Datum gefunden, öffnen ?"
Wenn keine Datei gefunden, an Benutzer Melden "Kein neuere Datei gefunden."

Um schneller zu suchen, kannst du auch Eingabefelder konfigurieren wo man Tag, Monat und Jahr direkt wählen kann.

Wenn es schöner gemacht werden kann wurde es mir auch interessieren.
 
1. Das Du -zumindest in der PC-Visu- einen normalen "DateiÖffnen-Dialog" aufmachen kannst, weißt Du aber? Wenn man dann beim Archivieren z.B. noch Ordner für Jahre und Monate anlegt, sollte das doch reichen?

2. Meiner Meinung nach hat TIA bei der Kurvenanzeige keine Quantensprünge gemacht...

Gruß
StGo
 
Hallo StGo,

1. Das Du -zumindest in der PC-Visu- einen normalen "DateiÖffnen-Dialog" aufmachen kannst, weißt Du aber? ..
Nein, das wußte ich nicht. Das geht sicherlich nur über ein Script, oder?

.. Wenn man dann beim Archivieren z.B. noch Ordner für Jahre und Monate anlegt, sollte das doch reichen? ..
Das wäre perfekt.

.. 2. Meiner Meinung nach hat TIA bei der Kurvenanzeige keine Quantensprünge gemacht ..
Warum überrascht mich das jetzt nicht?


Gruß, Onkel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
PC-Windows!

Code:
Dim strFilename, Dialog, fso
Dim Filename
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set Filename = HmiRuntime.SmartTags("FremddatenLesenDateiname")   

Dialog = "UserAccounts.CommonDialog"                 
'Damit Dateiauswahl erfolgen kann (Windows-Explorer)
Set Dialog = CreateObject(Dialog)
'Explorer-Dialog zum Speichern von Dateien
'Titelzeile
Dialog.Flags = &H0004 ' datei muss nicht vorhanden sein
Dialog.Filter = "All Files (*.*)|*.*|"  & "TAB Files (*.tab) |*.tab| "'Filter setzen
' Filter auf den Eintrag All Files setzen  TAB=2
Dialog.FilterIndex = 1
'Flags setzen: Explorer-Dialog mit langen Dateinamen
Dialog.Flags = &H1814
Dialog.ShowOpen
'Dateiname in die variable schreiben
Filename.Value = Dialog.FileName 
HmiRuntime.SmartTags("FremddatenLesenDateiname") = Filename.Value
Set Dialog = Nothing


Gruß
StGo
 
Diese Verfahren wird doch weitere VBS Skripte blokieren so lange das den File Dialog offen ist, oder ?
PC-Windows!

Code:
Dim strFilename, Dialog, fso
Dim Filename
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set Filename = HmiRuntime.SmartTags("FremddatenLesenDateiname")   

Dialog = "UserAccounts.CommonDialog"                 
'Damit Dateiauswahl erfolgen kann (Windows-Explorer)
Set Dialog = CreateObject(Dialog)
'Explorer-Dialog zum Speichern von Dateien
'Titelzeile
Dialog.Flags = &H0004 ' datei muss nicht vorhanden sein
Dialog.Filter = "All Files (*.*)|*.*|"  & "TAB Files (*.tab) |*.tab| "'Filter setzen
' Filter auf den Eintrag All Files setzen  TAB=2
Dialog.FilterIndex = 1
'Flags setzen: Explorer-Dialog mit langen Dateinamen
Dialog.Flags = &H1814
Dialog.ShowOpen
'Dateiname in die variable schreiben
Filename.Value = Dialog.FileName 
HmiRuntime.SmartTags("FremddatenLesenDateiname") = Filename.Value
Set Dialog = Nothing


Gruß
StGo
 
Hallo StGo,

..Datei öffnen:
Code:
Dim strFilename, Dialog, fso
Dim Filename
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set Filename = HmiRuntime.SmartTags("Variable")   
Dialog = "UserAccounts.CommonDialog"                 
'Damit Dateiauswahl erfolgen kann (Windows-Explorer)
Set Dialog = CreateObject(Dialog)
'Explorer-Dialog zum Speichern von Dateien
'Titelzeile
Dialog.Flags = &H0004 ' datei muss nicht vorhanden sein
Dialog.Filter = "All Files (*.*)|*.*|"  & "TAB Files (*.tab) |*.tab| "'Filter setzen
' Filter auf den Eintrag All Files setzen  TAB=2
Dialog.FilterIndex = 1
'Flags setzen: Explorer-Dialog mit langen Dateinamen
Dialog.Flags = &H1814
Dialog.ShowOpen
'Dateiname in die variable schreiben
Filename.Value = Dialog.FileName 
Set Dialog = Nothing
..

Irgendwie tut sich bei mir nichts. Ich rufe das Skript über eine Schaltfläche auf und nichts passiert. Ich bin mit Skripten auch nicht so firm. Ich probiere morgen weiter.


Gruß, Onkel
 
Hallo Onkel,
ich hatte den Code gestern Abend noch unter WinXPProf. (SP3) in einer FlexibleRuntime 2008 genau wie Du direkt an einer Schaltfläche getestet da ging es. Dabei habe ich aber das Projekt aus WinCCflex. 2007 konvertieren müssen --> d.h. da ging es auch (ebenfalls WinXP). Welches Betriebssystem verwendest Du, vielleicht hat sich ja am WindowsScriptHost etwas geändert?

@Jesper
Möglicherweise werden bei geöffnetem Dialog andere Scripte nicht mehr ausgeführt, habe ich nie probiert...

Gruß
StGo

PS: Scripte für die PC-Runtime lassen sich sehr gut extern testen (hilfreich ist ein Editor, z.B. Scite, ein Texteditor tut es aber auch).
Anhang umbenennen in *.vbs und Doppelklicken.
Anhang anzeigen DateiÖffnen.txt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo StGo, hallo Jesper

danke für eure Mühe. Das Script hatte ich auf meinem Notebook unter Win7 getestet. Auf dem Zielsystem läuft jedoch WinXP. Dort habe ich es noch nicht probiert. Ich habe mir erst einmal damit geholfen dass ich einen externen Dateimanager starte, mit dem ich Zugriff auf meine Dateien habe. Die VBS-Lösung ist für mich jetzt erst einmal aufgeschoben. Wie viele Basic-Dialekte gibt es eigentlich?


Gruß, Onkel
 
Ich habe inzwischen im Netz verschiedene Scripte gefunden. Das folgende ist mein Favorit, die Fundstelle habe ich im Quelltext angegeben. Es werkelt unter Win7 und ich denke auch unter WinXP (noch nicht getestet).

Code:
'Quelle: http://www.visualbasicscript.com/Browse-For-File-Dialog-in-Vista-m85740.aspx

'Function BrowseForFile() 
 Dim shell : Set shell = CreateObject("WScript.Shell") 
 Dim fso : Set fso = CreateObject("Scripting.FileSystemObject") 
 Dim tempFolder : Set tempFolder = fso.GetSpecialFolder(2) 
 Dim tempName : tempName = fso.GetTempName() 
 Dim tempFile : Set tempFile = tempFolder.CreateTextFile(tempName & ".hta") 
 tempFile.Write _ 
 "<html>" & _ 
 "    <head>" & _ 
 "        <title>Browse</title>" & _ 
 "    </head>" & _ 
 "    <body>" & _ 
 "        <input type='file' id='f'>" & _ 
 "        <script type='text/javascript'>" & _ 
 "            var f = document.getElementById('f');" & _ 
 "            f.click();" & _ 
 "            var shell = new ActiveXObject('WScript.Shell');" & _ 
 "            shell.RegWrite('HKEY_CURRENT_USER\\Volatile Environment\\MsgResp', f.value);" & _ 
 "            window.close();" & _ 
 "        </script>" & _ 
 "    </body>" & _ 
 "</html>" 
 tempFile.Close 
 
 shell.Run tempFolder & "\" & tempName & ".hta", 1, True 
 
 BrowseForFile = shell.RegRead("HKEY_CURRENT_USER\Volatile Environment\MsgResp") 
 shell.RegDelete "HKEY_CURRENT_USER\Volatile Environment\MsgResp" 
'End Function

Allerdings gefällt mir die Lösung mit dem Dateimanager besser. Ich hatte nach einem ganz einfachen gesucht, und babei diesen hier gefunden. Der hat was, finde ich.


Gruß, Onkel
 
Zurück
Oben