# WinCC per Batch Datei beenden?



## Jennsy (28 Januar 2014)

Hallo,

ich habe eine USV an meinem WinCC Server hängen, und möchte nun, bevor sich bei Stromausfall alles abschaltet, eine Batch-Datei ausführen, welche mir die RT und ggf. den WinCC Explorer geregelt schließen. (also nicht reset_wincc.vbs, bzw. kill pdlrt.exe).
Gibt es evtl. eine schönere Lösung wie man so etwas machen könnte?

Vielen Dank im Voraus,

mfG


----------



## ducati (28 Januar 2014)

also die Suche ergab in 10 sek mit den Suchbegriffen: WinCC beenden
dieses Ergebnis:

http://www.automation.siemens.com/WW/forum/guests/PostShow.aspx?PostID=05801&language=de

Gruß.


----------



## Jennsy (28 Januar 2014)

ducati schrieb:


> also die Suche ergab in 10 sek mit den Suchbegriffen: WinCC beenden
> dieses Ergebnis:
> 
> http://www.automation.siemens.com/WW/forum/guests/PostShow.aspx?PostID=05801&language=de



Danke, aber das ist nicht wirklich was ich suche... (bin auf dieses Thema auch selbst schon gestoßen)
Jedoch möchte ich weder das kostenpflichtige Tool "shutdown WinCC" verwenden, noch bekomme ich von der Steuerung die Meldung, dass mein Server nur noch über die USV läuft...
Ich würde nur gerne wissen, ob es eine Befehl für "RT beenden" gibt, den ich in meine .bat-Datei schreiben kann?

mfG


----------



## Approx (28 Januar 2014)

Es gäbe da noch die Möglichkeit, die "Reset_WinCC.vbs" auszuführen.
Damit killst Du alles, was mit WinCC zu tun hat.
Zu finden ist die Datei unter dem Installationsverzeichnis ..SIEMENS\WinCC\bin\
Gruß Approx

Upps, gerade gelesen das kein Reset_WinCC.vbs gewünscht ist...


----------



## holgermaik (28 Januar 2014)

> noch bekomme ich von der Steuerung die Meldung, dass mein Server nur noch über die USV läuft...


Wann willst du den dann die Action durchführen, wenn du den Zustand deiner Stromversorgung nicht weist?
Grüsse Holger


----------



## Jennsy (28 Januar 2014)

Hallo Approx,
danke für deinen Beitrag, und ja, wenn ich nichts anderes finde, werde ich wsl. eh dazu greifen müssen, denn damit ist dann WinCC-seitig wenigstens alles geschlossen.

Hallo holgermaik,
ich habe die Möglichkeit, bevor die USV den Server abdreht, eine batch-datei auszuführen, und mit dieser würde ich dann WinCC gerne schließen.

mfG
Jenny


----------



## holgermaik (28 Januar 2014)

Mit einer *.bat geht es nur auf die brutale Tour.
Wenn dein Server runter fahren will, wird an alle Anwendungen die Nachricht "WM_ENDSESSION" gesendet. Theoretisch müsste es möglich sein diese Nachricht abzufragen. (Habe ich allerdings in WinCC noch nie gemacht). Dann kannst du DB schliessen oder sonstiges. Da es eine Call Back Message ist wartet das System auf eine Antwort von allen Anwendungen bis es endgültig runter fährt.
Grüsse Holger


----------



## Jennsy (28 Januar 2014)

Ok, danke. Naja, in dem Fall, kann ich dann reset_wincc.vbs auch nutzen.  ...da es normalerweise nicht zu häufigen Stromausfällen in der Anlage kommt, dürfte das wohl kein Problem sein.

mfG


----------



## marlob (28 Januar 2014)

http://www.sps-forum.de/hmi/46845-wincc-shutdown-fuer-usv.html


----------



## Jennsy (28 Januar 2014)

Hallo marlob,

danke für deinen Beitrag, habe ich auch schon gesehen, aber diese zyklischen Abfragen (ob dieses file/diese datei nun geöffnet ist, oder nicht), möchte ich weitestgehend vermeiden (vor allem, da ein shutdown, hier generell eine Ausnahme sein sollte)

mfG


----------



## marlob (28 Januar 2014)

Mit der Lösung kannst du WinCC aber sauber runter fahren. Du brauchst das Script ja nicht alle 500 ms aufrufen, abhängig davon wie lange deine USV durchhält, reicht es doch wenn du das Script alle x Minuten aufrufst.


----------



## ducati (28 Januar 2014)

evtl. bist Du hiermit zufrieden 

https://www.automation.siemens.com/forum/guests/PostShow.aspx?PostID=88616&Language=en&PageIndex=2

Gruß.


----------



## holgermaik (28 Januar 2014)

"Reset_WinCC.vbs" geht recht brutal vor beim Beenden. Wenn du mit SQL Datenbanken arbeitest solltest du davon absehen.
Der Beitrag von marlob ist dann die bessere Alternative.
Grüsse Holger


----------



## ducati (28 Januar 2014)

holgermaik schrieb:


> "Reset_WinCC.vbs" geht recht brutal vor beim Beenden. Wenn du mit SQL Datenbanken arbeitest solltest du davon absehen.
> Der Beitrag von marlob ist dann die bessere Alternative.
> Grüsse Holger



sehe ich auch so, m.M. schiesst reset_wincc einfach alles ab, das ist auch nichts anderes, als den Rechner einfach runterzufahren.

Für "ShutDown WinCC" (2XV9450-1WC05) verlang Siemens aktuell 500€ Liste... die nehmen's auch wo immer sie's kriegen können...

Irgendwo gab's noch nen Beitrag, wo grob beschrieben war, was das macht, aber find ich im Moment nicht.

o.g. Siemensforumsbeitrag ist aber schon ne akzeptable Lösung mit der internen WinCC-Variable.

Gruß.


----------



## Jennsy (28 Januar 2014)

ducati schrieb:


> evtl. bist Du hiermit zufrieden
> 
> https://www.automation.siemens.com/forum/guests/PostShow.aspx?PostID=88616&Language=en&PageIndex=2
> 
> Gruß.


danke für die Antwort, ja das wäre schon in etwa was ich mir vorgestellt habe, nur leider habe ich keinen blassen Schimmer, wie ich über VB auf meine WinCC Variablen zugreifen kann? (habe jetzt eine VB Konsolenanwendung erstellt und dann mal angefangen herumzubasteln...doch wie genau das funktionieren sollte weiß ich nicht so recht...hat das vielleicht schon mal jemand ausprobiert?
Weil wenn ich mein Programm mal versuchsweise starte, stürzt einzig und allein das Konsolenfenster ab:|


```
Module Module1

    Dim lblCheckWinCC As Object

    Private Property szMcp As Object

    Sub Main()
        szMcp = CreateObject("WinCC-Runtime-Project") 'hier gebe ich mein Projekt an (inkl. Pfad) 
        If (szMcp.RuntimeProject <> "") Then
            Call szMcp.SetValue("ShutDown", 1) 'Hier den WinCC VariabelnName angeben
            lblCheckWinCC.Caption = "WinCC ShutDown: gesendet"
        End If
    End Sub


End Module
```

mfG


----------



## hucki (28 Januar 2014)

Schau Dir mal das Freeware-Tool AutoIt an!

Damit kannst Du Deine Maus- und Keyboardaktionen beim manuellen Beenden von WinCC aufzeichnen und daraus eine selbständige .exe-Datei erstellen. Die kannst Du in der Batch mit start /wait aufrufen. Dann führt die .exe die zuvor aufgezeichneten Aktionen aus und die Batch wartet auf die Beendigung der .exe.

AutoIt sind einfache Script-Dateien, so dass Änderungen am Ablauf leicht vorzunehmen sind.


----------



## Jennsy (28 Januar 2014)

So, hier nun "meine Lösung" des Problems (ein bisschen was von all den Vorschlägen, die ich bekommen habe), falls sich jemand auch mal etwas Ähnliches zusammenbasteln möchte:
 Im WinCC:


Binäre interne Variable 'ShutDown' erstellen (Startwert = 0) 
Globales C-Script, welches bei Änderung der Variable 'ShutDown' getriggert wird

```
int gscAction( void )
{
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END

// WINCC:PICNAME_SECTION_START
// syntax: #define PicNameInAction "PictureName"
// next PicID : 1
// WINCC:PICNAME_SECTION_END
int i;
if (GetTagBit("ShutDown"))
{
for (i=0; i<=25000;i++) //Schleife, während ein Bildfenster mit einem Warntext ausgegeben wird
{
SetVisible("Home.pdl","BF_Stromausfall",1);    //Return-Type: BOOL 
}
DeactivateRTProject ();    //Return-Type: BOOL 
ExitWinCC ();    //Return-Type: BOOL 
}
return 0; 
}
```




VB Konsolenanwendung im Visual Studio erstellen (WinCC_Close.exe) und Verweis (siehe Anhang) einfügen (geht nur am Rechner, auf dem WinCC installiert ist) und _CCMCPAUTSERVERLib_ importieren 


```
Imports CCMCPAUTSERVERLib

Module Module1

    Sub Main()

        Dim WinCC As CCMcpAut
        Dim Project As String
        Dim Value As Long
        WinCC = New CCMcpAut
        Project = WinCC.RuntimeProject
        Value = WinCC.SetValue("ShutDown", 1)
    End Sub

End Module
```




diese *.exe Datei dann aus einem *.bat-File heraus starten: (das *.bat-File habe ich in meiner USV-Konfig hinterlegt, und wird ausgeführt, bevor der Server heruntergefahren wird.) 


```
@echo off
     start "" "C:\Dokumente\WinCC_Close.exe"
```


mfG Jenny


----------



## ducati (29 Januar 2014)

kannst Du die exe hier noch irgendwie hochladen, nicht jeder hat ja Visual Studio.


```
for (i=0; i<=25000;i++) //Schleife, während ein Bildfenster mit einem Warntext ausgegeben wird
{
SetVisible("Home.pdl","BF_Stromausfall",1);    //Return-Type: BOOL 
}
```
finde ich nicht so glücklich, da in dieser Zeit keine anderen Scripte ausgeführt werden können und sich WinCC sozusagen aufhängt. 

Gruß.


----------



## Jennsy (29 Januar 2014)

ja, natürlich, ist im Anhang.
naja, das sollte ja eigentlich auch Sinn und Zweck des Ganzen sein, dass keine Bedienung mehr möglich ist und der Bediener aber noch eine kurze Vorwarnung erhält, dass sich WinCC nun herunterfahren wird. (Skripts, werden ansonsten nur durch User Interaktionen ausgeführt, stellt deshalb auch kein Problem dar)

Aber wie könnte man es deiner Meinung nach besser lösen, dass dieses Fenster noch ~5 sek. bevor sich WinCC beendet angezeigt wird?

mfG


----------



## ducati (29 Januar 2014)

Jennsy schrieb:


> Aber wie könnte man es deiner Meinung nach besser lösen, dass dieses Fenster noch ~5 sek. bevor sich WinCC beendet angezeigt wird?



Du rufst Dein Script zyklisch alle 1sek auf. In dem Script zählst Du wenn Shutsown==1 eine weitere interne Variable zaehler=zaehler+1 
wenn zaehler==5 dann schliesst Du erst WinCC

Gruß.


----------



## holgermaik (30 Januar 2014)

*Lösung leider nur bedingt verwendbar*

Hallo 
Habe mich interessehalber noch ein wenig mit dem Problem beschäftigt.
In iNet gibt es leider nur unvollständige Lösungen.
Damit dieser Beitrag nicht auch so endet möchte ich noch etwas anmerken.

Die Lösung mit dem Verändern von WinCC Variablen ist meiner Meinung nach die beste Lösung. Leider auch etwas umständlich.

Um Zugriff auf die WinCC Variablen zu bekommen ist die Datei "_CCMCPAUTSERVERLib.dll" _notwendig. Diese ist allerdings in der WinCC Installation nicht vorhanden sondern muss erst aus der Datei "_CCMCPAUTSERVER.tlb" _erstellt werden. Dies ist z.B. mit dem Verweis aus Visual Studio oder dem Tool "TLBimp" möglich. Leider sind beides Microsoft Produkte und bedürfen einer Lizenz. 
Ob eine Weitergabe der "_CCMCPAUTSERVERLib.dll"_ möglich ist kann ich nicht sagen, da das Copyright der "_CCMCPAUTSERVER.tlb" _bei Siemens liegt. 

Fazit: Sehr guter Ansatz. Leider muss man sich zur Zeit noch das Visual Studio und mit dem Windows SDK installieren.

Hier ein Auszug der Supportantwort


> Je nach verwendeten Funktionen benötigen Sie eine WinCC RT oder CS Lizenz, sowie  Lizenzen von ggf. genutzten Zusatz-Optionen


Damit ist ein öffentlicher UpLoad leider ausgeschlossen.


Grüsse Holger


----------



## Thomas_v2.1 (30 Januar 2014)

So ganz habe ich diesen COM Mechanismus auch noch nicht durchschaut, aber ich bin mir sehr sicher dass man aus einer tlb keine dll erstellen kann. Das läuft wenn dann eher andersherum, denn in der tlb ist nur eine Beschreibung der Schnittstelle und keine Programmcode.

In diesem Fall ist der COM-Server aber in keiner dll sondern in der CCMcpAutServer.exe. Darum würde ich der Siemens Support Antwort auch keine Bedeutung beimessen, da saß bestimmt jemand ohne einen blassen Schimmer worum es überhaupt geht (Standardantwort: sie brauchen natürlich eine Lizenz). Ein bereitgestellter Quellcode lässt sich nur mit einem lizensierten WinCC verwenden, andernfalls ist das daraus erstellte Programm nutzlos.

Mit dem OLE Viewer aus dem Visual Studio SDK kann man sich eine idl-Datei aus dem COM Objekt erzeugen lassen, sodass man die tlb überhaupt nicht benötigt. Eigentlich sollte man das COM-Objekt damit z.B. aus einem C++ Programm heraus ansprechen können. Ich habe das vor einiger Zeit bei der Plcsim-Prosim COM Schnittstelle versucht, aber immer nur mit dem Wizard des Visual Studios hinbekommen. Alle meine Versuche das nur mit der idl-Datei, ohne den Wizard oder mit einem Nicht-MS-Compiler (mingw) zu realisieren sind bisher gescheitert 

Was aber funktioniert ist das Anspechen der Schnittstelle mittels Python und pywin32.
Dazu muss mittels pythonwin.exe mit dem dort enthaltenen COM makepy utility aus der "CCMcpAutServer 1.0 Type Library" ein Modul erzeugt werden.
Dann kann man die Schnittstelle recht einfach mit:

```
import win32com.client
wincc = win32com.client.Dispatch("WinCC-Runtime-Project")
val = wincc.GetValue("TestFloat1")
print ("TestFloat1 = " , val)
```
verwendet werden.

Eine ausführbare exe Datei die man nur auf den WinCC-Rechner kopieren muss ohne weitere Programme installieren oder auszuführen zu müssen wäre natürlich schöner, aber eine Python Installation ist gegenüber dem Visual Studio ein Leichtgewicht, und verursacht keine weiteren Lizenzkosten.


----------



## hucki (30 Januar 2014)

Thomas_v2.1 schrieb:


> Eine ausführbare exe Datei die man nur auf den WinCC-Rechner kopieren muss ohne weitere Programme installieren oder auszuführen zu müssen wäre natürlich schöner, ...


Genau das macht AutoIt!

Ich kenne es von benutzerdefinierten Programm-Installationen beim unattended Windows-Setup, die das Setup-Programm so nicht automatisch ermöglichen würde. Einmal aufzeichnen, was man manuell machen würde und voila ... 
(Notfalls kann man das Script auch noch mehr lassen machen.)

Und das Ganze ist Freeware!

Die erstellte Datei läuft auf jedem Win-Rechner, auch ohne das Aufzeichnungs-/Programmierprogramm. Aufgezeichnete Absolut-Bildschirm-Adressen kann man z.B. auch berechnen lassen, um an unterschiedliche Graphikauflösungen anzupassen.


----------



## holgermaik (30 Januar 2014)

Hallo Thomas
Du hast mich falsch verstanden.
Jennsy hat seine/ihre ? Exe hochgeladen. Da diese aber keinen Schnittstellencode enthält ist so nicht brauchbar. Der Schnittstellencode für das COM Object befindet sich in der DLL. Ich wollte jetzt einfach die DLL und ein kleines Tool ins Forum laden um ein Gesamtpaket für alle die es brauchen bereit zu stellen.
 Dies ist aber aus Copyrightgründen nicht möglich (ich würde gegen den Lizenzvertrag verstossen), da sie dann jeder auch der der keine WinCC Lizenz hat runterladen könnte. Was zwar keinen Sinn macht aber ist halt so. Selbstverständlich darfst du ein Programm welches du geschrieben hast mit der DLL auf einem WinCC Rechner betreiben und auch an Kunden weitergeben. Denn diese haben ja mindestens eine gültige RT Lizenz erworben.



> aus der "CCMcpAutServer 1.0 Type Library" ein Modul erzeugt werden.


Genau das macht TLBimp. Diese erzeugte DLL kann man dann in einem Net Projekt zuweisen und die Funktionen nutzen. Funktioniert super. Variablen lesen und schreiben in einer WinCC RT. Könnte man sicherlich für vieles nutzen nicht nur zum ausschalten.


Grüsse Holger


----------



## Thomas_v2.1 (30 Januar 2014)

So, habs mit einer in C geschriebenen Standalone exe am laufen 
Es wird dabei keine dll, tlb oder was auch immer aus dem WinCC Projekt benötigt, und die exe kann auf einem beliebigen Rechner mit VC++ oder dev-cpp Compiler erstellt werden.
Das Programm benutzt das bei COM mögliche late binding. Das ist zwar etwas langsamer, aber um eine Variable zu lesen und schreiben reichts aus.

Mit Verwendung dieser
http://disphelper.sourceforge.net/

Bibliothek ist das relativ einfach.

Ein Auslesen einer WinCC Variable sieht ohne Fehlerbehandlung so aus:

```
void wincctest(void)
{
	DISPATCH_OBJ(winccrt);
	double value;
	dhCreateObject(L"WinCC-Runtime-Project", NULL, &winccrt);	
	dhGetValue(L"%e", &value, winccrt, L".GetValue(%S)", L"TestFloat1");
	printf("TestFloat1 = %e \r\n", value);
}
```

Ich bin begeistert! 
Denn ich habe mir genau wie beim TO bei dem Problem mit dem Runterfahren von WinCC über eine USV vor ein paar Monaten noch einen abgebrochen. Da habe ich es so gemacht dass die USV Software in eine Datei schreibt, und WinCC die Datei einliest und sich dann ggf. beendet.

Evtl. gehts ja auch in Autoit, dann bräuchte man keinen C-Compiler dafür.


----------



## hucki (30 Januar 2014)

Thomas_v2.1 schrieb:


> Evtl. gehts ja auch in Autoit, dann bräuchte man keinen C-Compiler dafür.


Ist halt, als ob man's manuell beendet.

Die Frage dabei ist: *Wie gut* ist das Script erstellt, um es von Rechner zu Rechner funktionsfähig weiter geben zu können?
Vor allem, wenn sich die Lage von Bedienelementen ändert.


----------



## Thomas_v2.1 (30 Januar 2014)

holgermaik schrieb:


> Jennsy hat seine/ihre ? Exe hochgeladen. Da diese aber keinen Schnittstellencode enthält ist so nicht brauchbar. Der Schnittstellencode für das COM Object befindet sich in der DLL. Ich wollte jetzt einfach die DLL und ein kleines Tool ins Forum laden um ein Gesamtpaket für alle die es brauchen bereit zu stellen.
> Dies ist aber aus Copyrightgründen nicht möglich (ich würde gegen den Lizenzvertrag verstossen), da sie dann jeder auch der der keine WinCC Lizenz hat runterladen könnte. Was zwar keinen Sinn macht aber ist halt so.



Ist das was du meinst sowas wie eine Interop dll die das Visual Studio bei der Verwendung von COM Objekten generiert? Das habe ich bei nettoplcsim auch drin, und wird von mir auch mit ausgeliefert. In der dll ist aber kein wirklicher Programmcode, sondern nur die Beschreibung der Schnittstelle die man so auch im Handbuch findet. Ohne Step7 kann damit aber keiner etwas anfangen, weil die dll mit den eigentlichen Funktionen dann fehlt.
Kennst du dazu offizielle Gerichtsentscheide ob das erlaubt ist oder nicht? Kann mir aber nicht vorstellen dass nicht, denn das wird doch gerade im Zusammenhang mit Office-Programmen massenhaft so (oder so ähnlich) verwendet.


----------



## holgermaik (31 Januar 2014)

> Ist das was du meinst sowas wie eine Interop dll


Jep genau das ist sie

http://msdn.microsoft.com/de-de/library/hfac4fky(v=vs.110).aspx

MSDN


> Wenn die Assembly auf Typen aus einer COM-Typbibliothek von Drittanbietern verweist, müssen Sie vom Herausgeber eine primäre Interop-Assembly erwerben, bevor Sie eine eigene primäre Interop-Assembly generieren können.





> müssen Sie vom Herausgeber eine primäre Interop-Assembly erwerben


Was man mit dem Erwerb von WinCC ja getan hat. Im Lizenzvertrag steht dann ungefähr "eine Vervielfälltigung ist nicht erlaubt"
Darum wollte ich sie nicht ohne Genehmigung von Siemens veröffentlichen.

Gerichtsurteile kenne ich nicht. 
Wie gesagt das weitergeben stellt auch kein Problem dar. Nur das veröffentlichen.

Grüsse Holger


----------



## Thomas_v2.1 (31 Januar 2014)

Also ich würde mal die Kirche im Dorf lassen.
In der tlb stehen die uuid und drei Funktionsnamen mit Parameterbezeichnungen. Ich möchte mal bezweifeln dass man nur auf diesen Metadaten ein Copyright beanspruchen kann, bzw. dass dieses vor einem Gericht stand hält. Die tlb wurde auch von Siemens mit dem Microsoft MIDL Compiler erzeugt, ist somit computergeneriert.

Wann man die mitgelieferte tlb nicht verwenden möchte, erstellt man sich mit dem COM Viewer aus der CCMcpAutServer.exe eine eigene IDL-Datei, und erzeugt sich daraus mit dem MIDL nochmal eine eigene tlb.

In diesem konkreten Fall hätte ich keine Bedenken die Interop dll weiterzugeben, das muss natürlich jeder für sich entscheiden.


----------



## ducati (3 März 2014)

Es gibt jetzt einen FAQ von Siemens zu dem Thema:

http://support.automation.siemens.com/WW/view/de/89257245

zufällig einen Monat, nachdem wir das hier diskutiert haben...


----------



## ducati (27 Juni 2014)

ducati schrieb:


> Es gibt jetzt einen FAQ von Siemens zu dem Thema:
> 
> http://support.automation.siemens.com/WW/view/de/89257245
> 
> zufällig einen Monat, nachdem wir das hier diskutiert haben...



hier gibt's auch das fertig compilierte Programm für alle die kein Visual Studio haben: 

http://www.wincc.it/public/StopWinCCRT.zip

http://www.wincc.it/2014/03/31/stopwinccrt-arrestare-wincc-runtime-da-eseguibile/

https://translate.google.de/transla...estare-wincc-runtime-da-eseguibile/&edit-text=

Gruß.


----------

