# Benutzer mit SPS-Variable anmelden VB-Script



## PeterGötz (25 Oktober 2011)

Hallo Kollegen,

normalerweise geht im WinCC felxible ein Anmeldefenster auf, wo ich bei Bedarf den Username und das kennwort eingeben kann, falls es durch die Benutzerverwaltung z.B. bei einem Bildaufruf verlangt wird.

Ich habe 10 Benutzer welche sich 5 Benutzergruppen teilen. Nun will ich aber in der SPS eine Bytevariable (Nummer 1 bis 10) anlegen welche mir meine 10 Benutzer symbolisieren. Über einen Transponder meledet sich der User an der SPS an. In der SPS wird die Bytenummer entsprechend eingestellt.
WinCC-felxibel scripting kennt nun leider nur:
- GetGroupNumber und 
- GetUserName also "lesender Zugriff".

ich hätte aber gerne -SetUserName um den Benutzer von der SPS aus setzen zu können. 
Gibt es da einen machbaren Weg? von der SPS aus im Panel (WinCCFelx) den Benutzer zu setzen bzw. zu löschen mit oder ohne Script egal. Ich habe noch keine Idee wie.

Gruß Peter Götz


----------



## Larry Laffer (25 Oktober 2011)

Hallo,
wie wäre es, wenn du die Flex-eigene Benutzer-Verwaltung einfach ignorierst und dir eine eigene baust. Habe ich bei uns so gemacht und geht wunderbar. Dafür muß man auch nicht groß rum-scripten. Das einzige Pronlem ist die Transponder-Abfrage in eine Flex-Variable zu bekommen. Das geht nur über ein Eingabefeld und ist somit die Schwachstelle des Systems (weil man eine Eingabe auch manuell machen kann).

Gruß
Larry


----------



## PeterGötz (25 Oktober 2011)

Es handelt sich um ein bestehendes Projekt mit 60 Masken auf eine MP370  15Zoll Schirm mit ganz vielen Eingabefeldern.
Wie sieht deine Benutzerverwaltung aus.  Wenn diese selbst geschrieben ist, dann sollte es kein Problem sein die Benutzer(umschaltung) an eine Variable zu koppeln.
Wie sieht so eine Benutzerverwaltung ohne die WinCC eigene zu benutzen denn aus? Habe keine Ahnung.  Wie blockst du einzelne eingabefelder oder Bildmasken?  Wie machst du ein Eingabefeld zwar sichtbar, sperrst es aber bei Benutzer X gegen eine Eingabe?     Danke.


----------



## rostiger Nagel (25 Oktober 2011)

Blocken kann Mann Eingabefelder oder Buttons ganz einfach über den
Parameter 'Bedienbarkeit', dort kannst du über eine Variabel steuern.


----------



## PeterGötz (25 Oktober 2011)

Ja bei einem Eingabefeld geht das einfach.  Wie kann ich über die Siemens Bildnavigation verhindern, dass eine Bildmaske aufgeblättert wird.

Aber meine eigentliche Frage lautete nicht eine Benzterverwaltung selbst zu basteln, sondern die Siemens eigene von der SPS aus zu steuern.  Hat da jemand zu Thema  bzw. Frage passend eine Idee?   Gruß Peter Götz


----------



## Larry Laffer (25 Oktober 2011)

Hallo,
ich mache es so, dass eine Variable mit der Funktion eines Benutzer-Levels je nach Benutzer mit Zahlenwerten zwischen 0 ..9 beschrieben wird. 0 entspricht hier "Maschinenführer" und 9 ist dann Admin (oder wie auch immer).

Die Eingaben sperre ich über die "Bedienbarkeit", wie von Helmut geschrieben. Wenn ich auf bestimmten Seiten bestimmte Objekte nicht anzeigen möchte, so wäre das ein Fall für die "Sichtbarkeit". Das Aufrufen von Seiten oder Alternativ-Seiten mache ich über Scripte.

Mein Umfeld ist allerdings eine PC-Runtime.
Bekommst du einen Code-Leser auf einem MP zum Laufen ?

Gruß
Larry


----------



## PeterGötz (25 Oktober 2011)

Nein,  der Transponder wird von der SPS gelesen.
Würde ich diesen Weg - eigene Userverwaltung mit Passwortfreischaltungen, neue User anlegen usw. - beschreiten, so müsste vieles ändern.  
Die Eigenschaft Bedienbarkeit nutze ich bereits an mehrern Stellen via Scriptvariable bzw. blockiere ich hiermit bereits eingaben bei bestimmten Schrittkettenzuständen in der SPS.

Wesentlich lieber wäre mir direkt eine Userumschaltung via Script wie Set User...
Ist seitens Siemens wahrscheinlich nicht erwünscht vielleicht Sicherheitsgedanken.
Gibt es denn da nichts um einen Benutzer/User aus- oder einzuloggen?

Gruß Peter Götz


----------



## Larry Laffer (25 Oktober 2011)

... ist mir nicht bekannt ...

Wenn du den Transponder mit der SPS einliest dann ist das doch umso besser. Du hast doch hier eine neutrale Variable, die du direkt verwenden kannst. Bei mir geht das aufgrund der eingesetzten Codeleser (Kaba) leider nicht.

Es gibt aber immer einen Weg ...


----------



## al3x (26 Oktober 2011)

geht ganz einfach über ein kleines Script:


```
SmartTags("BN") = "Benutzer"
SmartTags("PW") = "Test"

Logon SmartTags("PW"),SmartTags("BN")
```

das Script führst du bei Wertänderung der Variable aus.
Dann kannst das ganze noch in eine Switch-Case Funktion packen, welches dann den entsprechenden Benutzer auswählt und anmeldet...


----------



## PeterGötz (3 November 2011)

Ja vielen Dank.  Pfunst so super.  Dieses VB-Kommando habe ich einfach übersehen.   Gruß von Peter Götz bei Heidelberg.


----------



## J36 (14 Mai 2019)

PeterGötz schrieb:


> Ja vielen Dank.  Pfunst so super.  Dieses VB-Kommando habe ich einfach übersehen.   Gruß von Peter Götz bei Heidelberg.



Hallo Peter Götz,
vor einigen Jahren hat al3x dir einen Tip gegeben, wie man über ein kleines Skript entsprechende Benutzer auswählen und anmelden kann.
Ich stehe gerade vor einem ähnlichen Problem und soll mit dem Euchner EKS einen vorhandenen Benutzer anmelden, der bereits in der vorhandenen Siemens Benutzerverwaltung existiert. Hab schon was versucht, bin aber mit VB Skript noch nicht so bewandert und wollte Fragen, ob du nicht nen Beispiel Code einstellen könntest, mit dem es bei dir damals funktioniert hat...

Wäre dir sehr dankbar.
Beste Grüße


----------



## Larry Laffer (14 Mai 2019)

Eiegentlich ist in diesem Thread schon alles zu dem Thema gesagt.
An welcher Stelle hängst du denn genau ?
Was hast du für ein Bediengerät / HMI ?

Gruß
Larry


----------



## J36 (14 Mai 2019)

Hallo, habe das TP1200 Comfort. Hänge an der Stelle, dass der vorhandene Benutzer in der fertigen Benutzerverwaltung über den Befehl Logon nicht aktiviert wird.
Danke


----------



## Larry Laffer (14 Mai 2019)

Du mußt hier berücksichtigen, dass sich die Syntax, aber auch der Name des Befehls von WinCCFlexibel nach TIA möglicherweise geändert hat. Das müßtest du aber über die TIA-Hilfe herausbekommen ...
Darüber hinaus muß der Benutzername, den du übergibst, identisch sein mit einem aus der Liste in der Benutzerverwaltung deiner HMI - gleiches gilt für das Passwort - ist dem ganz sicher so ?
Dann : wird dein Script ganz sicher aufgerufen ?

Gruß
Larry


----------



## Onkel Dagobert (14 Mai 2019)

Bei mir sieht das Skript ein ganz klein wenig anders aus. Und ich meine, so funktioniert es bei mir auch.


```
[FONT=Verdana]SmartTags("BENUTZER") = "MeinBenutzerName"
SmartTags("PASSWORT") = "MeinPasswort"
Logon "PASSWORT", "BENUTZER"[/FONT]
```


----------



## PN/DP (14 Mai 2019)

Onkel Dagobert schrieb:


> Bei mir sieht das Skript ein ganz klein wenig anders aus. Und ich meine, so funktioniert es bei mir auch.
> [...]
> 
> ```
> ...


Bist Du sicher mit den Hochkommas vor+hinter PASSWORT und BENUTZER? Das macht nämlich diese Angaben zu String-Literalen und die ersten beiden Zeilen wären unnötig, weil dann hätten die SmartTags("BENUTZER") und SmartTags("PASSWORT") überhaupt nichts mit der Anmeldung zu tun.
Und ich meine, zumindest das Passwort MUSS in einer Variable übergeben werden, weil die Logon-Systemfunktion das Passwort in der Variable löschen will. Gibt es da keinen Runtime-Error?

Harald


----------



## Onkel Dagobert (14 Mai 2019)

Ich hatte das Skript mal eben aus meinem aktuellen Projekt kopiert. In früheren Projekten hatte ich diese Funktionalität auch schon genutzt. Eine Fehlermeldung kommt nirgendwo. Ich gehe der Sache nachher mal auf den Grund.

Nachher:
Ok, der größte Skripter bin ich ganz sicher nicht, aber mein Dreizeiler funktioniert genau so wie ich es oben geschrieben habe. Die Variablen "BENUTZER" und "PASSWORT" sind als lokale Variablen vom Typ WString deklariert. Ich verwende das Skript z.Bsp. bei Bildwechsel im Aufgabenplaner während der Inbetriebnahme, oder auch wenn der Kunde letzten Endes gar keine Passwortfunktion nutzen möchte, ich sie aber vorgesehen habe.

Interessant, ich habe mal gerade die ersten beiden Zeilen auskommentiert und E/A-Felder für beide Variablen eingerichtet. Nach Ausführung des Skriptes, bzw. nach Ausführung der Logon-Funktion ist die Variable "PASSWORT" geleert. Zum Test einer erfolgreichen Anmeldung habe ich die Funktion "LeseBenutzername" über eine Schaltfläche verwendet.

Getestet habe ich im Simulator unter TIA V15.1. Im Projekt habe ich eine RT Advanced. Auf einem Comfort-Panel müsste es genau so funktionieren.

​


----------



## J36 (15 Mai 2019)

Hallo zusammen,
vielen Dank für eure schnellen Rückmeldungen. Habe versucht alle eure Tipps umzusetzen, doch irgendwie wird vermutlich das Skript nicht abgearbeitet, obwohl in der Variable eine Wertänderung stattfindet. 
Bin nun einem zweiten Hinweis gefolgt und hab es über die Steuerungsafträge 23 und 24 versucht. Hat auf Anhieb funktioniert. 
Besten Dank euch nochmals!


----------



## PN/DP (15 Mai 2019)

Onkel Dagobert schrieb:


> mein Dreizeiler funktioniert genau so wie ich es oben geschrieben habe.



Ohh, böse Falle von Siemens! :evil:
Vermutlich wegen dem gut gemeinten TIA-Schwachfug daß Namen von HMI-Variablen alle möglichen Zeichen und Satzzeichen und Leerzeichen enthalten dürfen, werden SmartTags-Variablennamen auch bei Verwendung in VBS-Skripts in doppelten Hochkomma geschrieben. Allerdings darf auf der rechten Seite von Zuweisungen das "SmartTags(...)" weggelassen werden (weil das da so schön mit String-Literalen verwechselt werden kann  ), auf der linken Seite darf es nicht weggelassen werden, weil da verwirrt das den Siemens-VBS-Compiler, obwohl gerade da klar ist daß das kein String-Literal sein kann 

```
SmartTags("HMI_Variable_1") = SmartTags("HMI_Variable_2") 'so ist es klar verständlich
SmartTags("HMI_Variable_1") = [COLOR="#008080"]"HMI_Variable_2"[/COLOR]            'so ist es bei Siemens TIA VBS auch zulässig!!!
[COLOR="#FF0000"]"HMI_Variable_1"[/COLOR] = SmartTags("HMI_Variable_2")            'so ist es nicht zulässig! Das frisst der Siemens TIA VBS Compiler nicht
```
Wenn ich in VBS globale HMI-Variablen anspreche, dann schreibe ich immer SmartTags("MeineHMIVariable") und fast nie nur "MeineHMIVariable". Es gibt allerdings Systemfunktionen, die hat Siemens in TIA nun so verhunzt, daß SmartTags("MeineHMIVariable") nicht mehr geschrieben werden darf - dann muß man leider die irreführende Schreibweise verwenden. (z.B. bei GetDataRecordTagsFromPLC darf bei der Angabe der Statusvariable nicht mehr SmartTags("StatusVariable") geschrieben werden)

 Schätzfrage:

```
[COLOR="#008000"]'Siemens TIA VBS[/COLOR]
Dim pwd, user

SmartTags("password") = "1234"
pwd = SmartTags("password")    [COLOR="#008000"]'pwd enthält danach "1234"[/COLOR]
pwd = "5678"                   [COLOR="#008000"]'pwd enthält danach "5678"[/COLOR]
pwd = "password"               [COLOR="#FF0000"]'pwd enthält danach ......?[/COLOR]

user = "Meier"
Logon pwd, user
```




Onkel Dagobert schrieb:


> Die Variablen "BENUTZER" und "PASSWORT" sind als lokale Variablen vom Typ WString deklariert.


Was meinst Du mit "lokale Variablen"? HMI-Variablen des Panels? Die sind nicht lokal sondern panelweit global. Skript-lokalen Variablen kann man in VBS keinen Datentyp zuordnen.
Warum verwendest Du in dem Skript globale HMI-Variablen und nicht lokale Skript-Variablen?


```
[COLOR="#008000"]'Siemens TIA VBS[/COLOR]
Dim pwd, user

[COLOR="#008000"]'so macht es Sinn (User und Password als Konstanten im Skript)[/COLOR]
user = "Meier"
pwd = "1234"
Logon pwd, user

[COLOR="#008000"]'geht auch so (dann steht nach dem Logon "Meier" in der HMI-Variable "Benutzer")[/COLOR]
SmartTags("Benutzer") = "Meier"
pwd = "1234"
Logon pwd, SmartTags("Benutzer")

[COLOR="#008000"]'so macht es auch Sinn (User und Password werden aus HMI-Variablen (z.B. aus EA-Feldern) entnommen)[/COLOR]
user = SmartTags("Benutzer")
pwd = SmartTags("Password")
Logon pwd, user
[COLOR="#008000"]
'so geht es auch (etwas kürzer)[/COLOR]
pwd = SmartTags("Password")
Logon pwd, SmartTags("Benutzer")

[COLOR="#008000"]'so ist es weniger sinnvoll (weil SmartTags("Password") enthält nach dem Logon "" )[/COLOR]
SmartTags("Benutzer") = "Meier"
SmartTags("Password") = "1234"
Logon SmartTags("Password"), SmartTags("Benutzer")

[COLOR="#008000"]'und so sieht das von Siemens erfundene Verwirrspiel aus:
'(was man nur richtig versteht, wenn man weiß daß die Parameter von Logon zwingend Variablen sein müssen)[/COLOR]
Logon "Password", "Benutzer"
```

Harald


----------



## Onkel Dagobert (15 Mai 2019)

PN/DP schrieb:


> .. Was meinst Du mit "lokale Variablen"? ..


"Interne Variablen" wäre der korrekte Begriff gewesen, sorry.




PN/DP schrieb:


> Warum verwendest Du in dem Skript globale HMI-Variablen und nicht lokale Skript-Variablen? ..



Harald, ich weiß gar nicht, wie ich dir diese Frage hinreichend beantworten könnte. Möglicherweise hatte ich mit den Variablen noch mehr vor. Du kannst ja mal alle Eventualitäten erörtern  .

​


----------

