TIA WinCC Advanced Shell.Run variabel gestalten

Zombie

Level-2
Beiträge
735
Reaktionspunkte
120
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich habe ein Skript geschrieben, das mir von der SPS gesteuert aktuelle Werte aus der Bearbeitung in eine Textdatei auf die Festplatte der Visu speichert. Das funktioniert sehr gut.
Nun müsste man aus Wartungsgründen in die Datei reinschauen können, der Kunde möchte dafür gerne ein Interface in der Visu dafür, damit seine Mitarbeiter nicht auf dem Rechner rumsuchen müssen.
Dazu möchte ich auf der Visu ein weiteres Skript starten, das die Textdatei kopiert und dann die Kopie in Notepad öffnet. So kann das Original weiter beschrieben werden, auch wenn die Datei mal für ein paar Stunden angezeigt wird.

Es wird dann alle 14 Tage eine neue Datei erstellt. Die Datei heißen "LOG_" gefolgt von einer dreistelligen Zahl.
Das kopieren der aktuellsten Datei hab ich bereits hinbekommen, leider gestaltet sich das Anzeigen ebendieser Datei, als komplizierter wie gedacht.

Code:
myShell = CreateObject("WScript.Shell")

myshell.Run "C:\Windows\notepad.exe"

Der Code öffnet Notepad, aber wie bekomme ich nun die Datei da rein?
Schwerer noch immer die aktuellste?

Code:
myshell.Run "C:\Users\Kairo\Log_001.txt"
öffnet mir diese eine Datei
Code:
myshell.Run "C:\Users\Kairo\Log_" & HmiRuntime.Smarttags("LogCount") & ".txt"
funktioniert auch nicht.

Zusätzlich hätte ich das Notepad gerne von Anfang an Maximiert, falls da jemand weiß wie das geht, würde er mir das rumprobieren ersparen.

Danke
 
Hallo Zombie,

die Shell kann nicht mit Parametern umgehen, das wird nix...

Probier doch mal die "Shell.Application" mit der ShellExecute Methode!
mit der folgenden Syntax:
.ShellExecute "application", "parameters", "dir", "verb", window

wobei:
application The file to execute (required)
parameters Arguments for the executable
dir Working directory
verb The operation to execute (runas/open/edit/print)
window View mode application window (normal=1, hide=0, 2=Min, 3=max, 4=restore, 5=current, 7=min/inactive, 10=default)

Beispiel im VBS Script:


Code:
[COLOR=#0000cd][B]Dim objShell

[/B][/COLOR][B][COLOR=#0000cd]Set objShell = CreateObject("Shell.Application")
[/COLOR][COLOR=#0000cd] objShell.ShellExecute "notepad.exe", "D:\Export\S120_es.txt", "", "open", 1[/COLOR][/B]

klappt bei mir unter WinccFlex prima :cool:

Grüße
Aweeller
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, danke, das funktioniert bestens

Kleiner Fehler ist dir in der Zeile passiert
.ShellExecute "application", "parameters", "dir", "verb", window
"parameters" und "dir" müssen vertauscht werden, dann klappts


Hatte heute Morgen auch rausgefunden wie das mit .Run geht.

Code:
myShell.Run Verzeichnis,3,False

öffnet Notepad Bildschirmfüllend und gleich mit der Datei die im Verzechnis steht.
Das Verzeichnis erhalte ich aus der Routine die die Datei kopiert

Mit der Shell.Execute kann man aber auch Excel öffnen und trotzdem die Textdatei anzeigen lassen.
Ist viel besser, denn so könnte man gleich ein Makro nutzen und die Auswertung machen.

Vielen Dank
 
es gibt auch eine funktion in wcc im script mit der du das machen könntest. genauer name fällt mir gerade nicht ein
programm starten oder so.

und damit die datei nicht mehrfach geöffnet wird (vergessen die mitarbeiter immer gerne das zu schliessen) könntest du das anzeigeprogramm vorher mit taskkill schliessen.
 
Das mit dem Taskkill ist ne gute Idee, denn das mit den 20 Instanzen von Notepad war eben schon beim testen aufgetreten :ROFLMAO::ROFLMAO:
Jetzt wüsste ich nur gerne wie man aus WinCC Advanced eine Windows Kommandozeile öffnet um Taskkill zu nutzen

Zum Thema schließen eines Programms aus VBSkript hab ich jetzt das hier im Forum gefunden:

https://www.sps-forum.de/hmi/37396-...ngen-winccflex-2007-auf-mp377.html#post532231

Erscheint mir zumindest einfacher das direkt aus VB zu machen anstatt über CMD.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
durch HMIYes sollte das öffnen von notepad solange verhindert werden bis taskkill fertig ist.
sollte das nicht klappen das script warte verwenden

Code:
'warte
'zs_wartezeit ist eine interne variable vom typ int

Dim t1,t2,t1a
t1=Timer
Do
    t2=Timer
    If t2-t1 > zs_wartezeit Then
        Exit Do
    End If
    If t1>t2 Then
        t1a=86400-t1
        t1=0
        zs_wartezeit=zs_wartezeit-t1a
    End If
    zs_restzeit=zs_wartezeit+t1-t2
Loop
 

Anhänge

  • Zwischenablage03.jpg
    Zwischenablage03.jpg
    30,5 KB · Aufrufe: 6
Zuletzt bearbeitet:
Zurück
Oben