Erkennen wann Projekt geschlossen ist

Tuc_Tuc

Level-1
Beiträge
21
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Community,

Mein WinnCC-Projekt wird mit dem ODK Befehl "DMExitWinCCEx()" geschlossen. Danach würde ich das Projekt gerne .zip verpacken. Projekt schließen und packen geht auch beides einzeln sehr gut. Nur liefert mir der Befehl "DMExitWinCCEx()" direkt nach Ausführung ein „true“ zurück. Das Projekt benötigt aber Zeit bis es geschlossen ist. Wenn ich hier das packen starte sind noch einige Dateien in Gebrauch und es schlägt darum fehl.

Meine Frage: Wie kann ich herausfinden ob das Projekt wirklich geschlossen ist?

Vielen Dank für eure Hilfe!
 
Ich habe mal über die CCMcpAutServer-Schnittstelle aus einer C-Anwendung heraus WinCC-Variablenwerte gelesen. Wenn das Projekt geschlossen ist kommt natürlich nichts zurück. Das ließe sich bestimmt dazu "missbrauchen".
Evtl. gibt es aber auch eine bessere Schnittstelle um den Projektzustand abzufragen. Ich würde mal in die diversen CCM... Module von WinCC reinschauen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, ich schließe das Projekt ja schon mit "DMExitWinCCEx(DM_SDMODE_WINCC)". Wie gesagt es schließt sich auch. Nur benötigen WinCC Projekte ja etwas länger um alle Dateien freizugeben und mir wird sofort "true" zurückgegeben. Die Dateien sind aber noch besetzt und ich weiß nicht wie lange.

Habe jetzt einen ODK Befehl gefunden der mir in einer Methode die Anzahl der geöffneten Projekte anzeigt. Leider schaffe ich es nicht mehr, das heute zu testen. Ich gebe am Montag nochmal Rückmeldung.

Vielen Dank für die Hilfe!
 
Mit der Funktion DMGetRuntimeProject lässt sich feststellen ob noch ein Projekt geöffnet ist.
Ist kein Projekt geöffnet, so gibt die Funktion false zurück. Bei true lässt sich damit das aktuell geöffnete WinCC-Projekt herausfinden.

Wenn du das Beispiel zum Herunterfahren von WinCC aus diesem FAQ:
https://support.industry.siemens.com/cs/ww/de/view/89257244

verwendest, lässt es sich mit folgenden Zeilen eingefügt vor DMDisConnectA so erweitern, dass es so lange wartet bis das Projekt geschlossen ist.
Ich habe noch eine Maximalzeit eingebaut die gewartet wird, da es ja gelegentlich vorkommt dass ein Projekt beim Schließen hängen bleibt.

Code:
DMGETRUNTIMEPROJECTFCTA DMGETRUNTIMEPROJECTFCT = NULL;
DM_PROJECT_INFO dmInfo;

DMGETRUNTIMEPROJECTFCT = (DMGETRUNTIMEPROJECTFCTA) GetProcAddress(hDMClient, "DMGetRuntimeProjectA");
if(DMGETRUNTIMEPROJECTFCT) { 
    for(int maxWait = 0; maxWait < 180; maxWait++) {
        bRetVal = DMGETRUNTIMEPROJECTFCT(dmInfo.szProjectFile, _MAX_PATH, &Error);
        if (bRetVal) {
            if (maxWait == 0) {
                t = time(NULL);
                tl = localtime(&t);
                printf("Waiting until WinCC-Project '%s' is closed.\n", dmInfo.szProjectFile);
                fprintf(fp,"%s; Waiting until WinCC-Project '%s' is closed.\n",asctime(tl), dmInfo.szProjectFile);
            }
            printf(".");
            Sleep(1000); 
        } else {
            break;
        }
    }
    t = time(NULL);
    tl = localtime(&t);
    printf("WinCC-Project closed!\n");
    fprintf(fp,"%s; WinCC-Project closed!\n", asctime(tl));
}
 
Übrigens, von Siemens gibt es ein leider kostenpflichtiges Tool um ein WinCC-Projekt in Runtime zu sichern. Hat sich das schonmal jemand angesehen?
Ich finde es etwas störend zur Sicherung ein Projekt beenden zu müssen, vor allem wenn es allem Anschein nach auch ohne Beendigung funktioniert.
Ich benutze zur reinen Projektsicherung eigentlich immer den Projekt-Duplikator, damit ich die Runtime-Datenbank nicht mitsichere. Aber der sichert eben leider nicht wenn das Projekt in Runtime ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wir haben einmal so etwas ähnliches gemacht, da haben wir extern von einer C++ Appl. einen Prozess im TaskManager abgefragt und gewartet bis der nicht mehr da war -> RT war beendet -> externe Appl. ausgeführt und RT wieder gestartet. Den genauen Namen des Prozesses weiß ich jetzt nicht mehr, kann dir aber gegebenenfalls nachsehen.


Übrigens, von Siemens gibt es ein leider kostenpflichtiges Tool um ein WinCC-Projekt in Runtime zu sichern. Hat sich das schonmal jemand angesehen?

An diesem Tool wäre ich auch sehr interessiert. Hat jemand Erfahrung damit wie das gemacht wird?

Grüße
 
@mystone: Wäre bestimmt interessant. Würde empfehlen hierfür ein neues Thema aufzumachen.

@Thomas weiterhin vielen Dank für deine Hilfe. Leider überprüfe ich mit dem Befehl "getRuntimeProjekt" nur ob ein Projekt in der Runtime geöffnet ist. Ich möchte ja aber wissen ob das Projekt beendet ist und WinCC bzw. der SQL Server keine Daten vom Projekt mehr benutzt.

Ich werde jetzt versuchen über C Hausmittel den Zustand der Dateien zu überprüfen. Vielleicht komme ich ja so zum Erfolg.

Für weitere Ideen bin ich sehr Dankbar!

nur ob die Runtime geschlossen oder geöffnet ist
 
@Thomas weiterhin vielen Dank für deine Hilfe. Leider überprüfe ich mit dem Befehl "getRuntimeProjekt" nur ob ein Projekt in der Runtime geöffnet ist. Ich möchte ja aber wissen ob das Projekt beendet ist und WinCC bzw. der SQL Server keine Daten vom Projekt mehr benutzt.

Du hast doch geschrieben, dass du schon über die dmclient.dll und die Funktion DMExitWinCCEx das Projekt schließt. Wenn ich das bei mir aufrufe, wird nicht nur die Runtime beendet, sondern auch ein ggf. geöffneter WinCC-Explorer oder der Graphics-Editor geschlossen. Zumindest macht es die Funktion wenn ich diese mit dem Parameter DM_SDMODE_WINCC aufrufe. Und wenn die Runtime nicht läuft, wird auch nur der Explorer beendet.
Das was dauert ist ja immer das Beendigen der Runtime, der Rest ist mehr oder weniger unmittelbar beendet.

Es gibt aber auch noch eine Funktion Namens "DMEnumOpenedProjects", vielleicht kommtst du damit weiter.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Auch direkt nach dem schließen Befehl benutzt der SQL Server noch die Dateien. Deshalb kann ich sie nur mit Fehler zippen.
Ich frage jetzt einfach alle SQL Dateien mit 'fopen (Dateiname, "a") ab. Und wenn ich bei allen Schreibrechte habe starte ich das zippen. Finde ich zwar sehr unsauber, habe bis jetzt aber noch keine andere Lösung.
 
Hm, das ist ja etwas unpraktisch. Ich denke da müsste man schon direkt den SQL-Server befragen, ob der noch irgendwelche ausstehenden Transaktionen hat die erst zu Ende bearbeitet werden müssen.
Aber wenn fopen seinen Dienst tut, wieso nicht.
 
Zurück
Oben