WinCC V6.0 SP4 "SilentLogin" und "printf"

Approx

Level-1
Beiträge
1.180
Reaktionspunkte
427
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich bastel gerade an einem Script für SilentLogin herum. Da ich nicht so viel mit Hochsprachen zu tun habe, will ich einfach ein Script von einer bestehenden Anlage nutzen und umschreiben.
Folgender Code funktioniert

Code:
PHP:
  #pragma code ("UseAdmin.DLL")     // Aufruf der benötigten DLL
  #include "pwrt_api.h"    // Aufruf der Header-Datei
  #pragma code ()
   
  void SetInitUser()
  {
  #define LOCALMASCHINE "@LocalMachineName"
  char* pcname;
  int pcnummer;
  DWORD ebene;
  struct    // Aufbau der Struktur bestehend aus User und Passwort
  {
  char* user;
  char* password;
  } 
  LoginList[] =              // Struktur-Liste
  {
  {"",""},                               // Passwort für den Wert 0       
  {"User1","Passwort1"},          // Passwort für den Wert 1
  {"User2","Passwort2"},          // Passwort für den Wert 2
  {"User3","Passwort3"},          // Passwort für den Wert 3
  {"User4","Passwort4"}           // Passwort für den Wert 4
  };
  printf("Rechnernamenabhängiges EInloggen Start");
   pcname = GetTagChar(LOCALMASCHINE);
  pcnummer = 0;
  if (strcmp(pcname,"CLIENT1")==0) pcnummer = 1; 
  if (strcmp(pcname,"CLIENT2")==0) pcnummer = 2;
  if (strcmp(pcname,"CLIENT3")==0) pcnummer = 3;
  if (strcmp(pcname,"CLIENT4")==0) pcnummer = 4;
  if (strcmp(pcname,"CLIENT5")==0) pcnummer = 5;
  if (strcmp(pcname,"CLIENT6")==0) pcnummer = 6;
  if (strcmp(pcname,"CLIENT7")==0) pcnummer = 7;
  if (strcmp(pcname,"CLIENT8")==0) pcnummer = 8;
  if (strcmp(pcname,"CLIENT9")==0) pcnummer = 9;
  if (strcmp(pcname,"SERVER1")==0) pcnummer = 10;
  if (strcmp(pcname,"SERVER2")==0) pcnummer = 11;
  printf("PC Nummer %d",pcnummer);
  if (!(pcnummer==0))
  {
    switch( pcnummer ) {
       case 1:  ebene = 1; break;
       case 2:  ebene = 1; break;
       case 3:  ebene = 1; break;
       case 4:  ebene = 1; break;
       case 5:  ebene = 0; break;
       case 6:  ebene = 2; break;
       case 7:  ebene = 2; break;
       case 8:  ebene = 2; break;
       case 9:  ebene = 4; break;
       case 10: ebene = 2; break;
       case 11: ebene = 2; break;
      default : ebene = 0;
  } 
printf("Ebene %d",ebene);
  if ( ebene >= 1 && ebene <= 4 )         // if-Anweisung, bei Wert 1-4 wird das Passwort übergeben 
  {
  printf("Automatische Anmeldung User%s",LoginList[ebene].user);
  PWRTSilentLogin(
  LoginList[ebene].user,                          // Je nach Wert wird aus LoginList User und  Passwort übergeben 
  LoginList[ebene].password);}
  else
  {
  PWRTLogout();                                                         // Bei Wert 0 oder >=4 wird das letzte Passwort gesperrt
  }
  }
  }
Die Rechnernamen und die User mit den zugeh. Passwörtern habe ich angepasst. Ich habe auch herausgefunden, dass er die Variable "pcnummer" nicht zuweist. Wenn beim Deklarieren nicht "pcnummer = 0" sondern "pcnummer = 1" zugewiesen wird, dann ist der User 1 angemeldet.

Meine Fragen lauten:
1. was bedeutet printf? Falls es um Meldungserzeugung geht - wo kann ich die betreffende Meldezeile lesen?
2. Die Rechnernamen der neuen Anlage sind etwas länger als bei der funktionierenden Anlage, ist die Variable "pcname" vom Typ char korrekt? Bei der S7 belegt ein char ja nur ein byte...
3. was bedeutet der Befehl "if (strcmp("? Stringvergleich?
4. Last but not least: Kann jemand mit dem Finger drauf zeigen, warum es nicht funzt?? ;)

vielen Dank und Greez
Approx
 
Hi,

den Satz verstehe ich nicht so ganz: "Ich habe auch herausgefunden, dass er die Variable "pcnummer" nicht zuweist. Wenn beim Deklarieren nicht "pcnummer = 0" sondern "pcnummer = 1" zugewiesen wird, dann ist der User 1 angemeldet." Laut deinem Skript wird die pcnummer erst 0 gesetzt und danach wird die Nr genommen anhand des PC Namen.
Am besten du guckst mal was er im Debug ausgibt, da schreibt er ja alles hin mit printf. wenn für PC nummer immer noch 0 ist dann ist dein pc name nicht in der liste. Das Fenster für Debug findest du unter Smart-Objekte Applikationsfenster und dann Global skript auswählen.
Ach ja zu deiner anderen Fragen strcmp ist Stringvergleich, stimmen die genau überein wird 0 zurückgeliefert

Gruß sunny79
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal danke für die schnelle Antwort!
Ich habe beim Deklarieren und Zuweisen statt einer 0 mal probehalber eine 1 eingegeben -> da war User1 angemeldet.
(Name und Passwort geänd. die Red. :cool: )

Werd gleich mal nachgucken, was die Meldungen so sagen.

Gruß Appro
 
Code:
pcname = GetTagChar(LOCALMASCHINE);

Steht denn in LOKALMASCHINE bei dir der richtige Wert drin?
Denn nur dann wird der strcmp ja erfolgreich sein und pcnummer auch ein wert <> 0 zugewiesen.

Sie dir dazu in der Vorlage mal die Definition und die Zuweisung von LOCALMASCHINE an!

PS: @Approx: Bitte keine Doppelposts!
 
Zuletzt bearbeitet:
Hallo Ralle,
also in der Internen Variable @LocalMaschineName steht der Rechnername korrekt drin. (zumindest, wenn ich im Variablenhaushalt mit dem Mauszeiger auf die Variable gehe, um den Aktualwert anzuzeigen)

Anm.: in den Rechnernamen sind Unterstriche enthalten. Dies ist bei der funktionierenden Anlage nicht der Fall. Kann es daran liegen?

Doppelpost: ok-ok, ich wusste nicht, wohin mit meiner Frage...:rolleyes:
 
Zuletzt bearbeitet:
Soooo, heute konnte ich mal wieder etwas fummeln.
Anlage läuft jetzt! Es stand zwar der richtige Rechnername in der Variable @LocalMachineName drin, aber mit einem Qualitycode 4c. Ich hab mit dem GSC-Diagnose-Applikationsfenster gut herausbekommen, das die Variable als "unknown" angemeckert wurde. Hab dann einfach ne andere Variable (@Computername) genommen. Die hatte den gleichen Inhalt wie @LocalMaschineName, jedoch mit dem Qualitycode 80.
Wie auch immer - kaum macht mans richtig, da läufts!!! ;)

Danke nochmal für den Tipp mit dem GSC-Fenster!! Supi!

greez Approx
 
Zurück
Oben