WinCC Unified Taste mit bestimmter Rolle einblenden

Supermario73

Level-2
Beiträge
126
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen
im Unified Panel möchten wir, wenn sich jemand mit der Rolle "HMI Administrator" einloggt bestimmte Tasten Einblenden.
Darum haben wir eine Funktion geschrieben, welche durch den Aufgabeplaner alle 5s angestossen wird.

Die Funktion sieht folgendermassen aus:

Code:
export function Admin() {
 // Überprüfen, ob der angemeldete Benutzer die Rolle "Admin" hat
let roleName = "HMI Administrator";
let retVal = HMIRuntime.UserManagement.HasUserRole(roleName);
if(retVal){
  HMIRuntime.Trace("The current user is in role: " + roleName);
Tags("Admin").Write(1);   
  } else {
   Tags("Admin").Write(0);
  }
}

Ziel ist es, sobald sich jemand mit der Rolle "HMI Administrator" einloggt, die interne Variable "Admin" auf 1 gesetzt wird. (Mit der Variable "Admin" wird dann die Taste eingeblendet)

Hat jemand eine Idee was am Skript falsch sein könnte oder hat jemand eine bessere Idee?
Besten Dank für Eure Hilfe!
 
Hast du mal versucht deine Variable in die SPS zu legen?
Meine mal gehört zu haben, dass interne HMI-Variablen nicht für alles benutzt werden können. Vielleicht gehört der Aufgabenplaner ja auch dazu.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat jemand eine Idee was am Skript falsch sein könnte oder hat jemand eine bessere Idee?
Auf den ersten Blick sieht es OK aus....
Pack es doch mal in eine try..Catch Struktur & lass dir per Trace die Fehlermeldung ausgeben.

Meine mal gehört zu haben, dass interne HMI-Variablen nicht für alles benutzt werden können. Vielleicht gehört der Aufgabenplaner ja auch dazu.
Kommt drauf an ob er die interne Variable global oder spezifisch für jeden Client eigenständig angelegt hat.
Hat was mit den separaten Ausführungs-Kontexten zwischen Server und Client zu tun.
Das Tag-Objekt an sich sollte im Aufgabenplaner funktionieren.
 
Hallo zusammen
habe nun SPS Tags verwendet und es funktioniert nicht.
Habe das Script erweitert um zu schauen was in "Anlagen_DB_TempString" steht. Leider wird da nichts geschrieben. Das Script wird aber bearbeitet, setze ich das Bit "Anlagen_DB_Kommando_test" von Hand, wird es wieder auf 0 geschrieben.
Hat jemand noch eine Idee?

Javascript:
export function Admin() {
 // Überprüfen, ob der angemeldete Benutzer die Rolle "Admin" hat
let roleName = "HMI Administrator";
let retVal = HMIRuntime.UserManagement.HasUserRole(roleName);
 Tags("Anlagen_DB_TempString").Write(retVal);   
if(retVal){
HMIRuntime.Trace("The current user is in role: " + roleName);
  Tags("Anlagen_DB_Kommando_test").Write(1);   
 } else {
 Tags("Anlagen_DB_Kommando_test").Write(0);
}
}

Besten Dank für Eure Hilfe
 
Hallo, wie sieht deine Auswertung für die Sichtbarkeit an der Taste aus?

Kleiner Tipp noch:
Du musst das Skript nicht alle 5sek Triggern, besser wäre wenn du in diesem Skript zusätzlich den Benutzer mit Tags("@UserName").Read(); abfragst. Anschließend noch den Trigger auf die Variable UserName setzen.
Dann wird das Skript immer bei Benutzeränderung abgearbeitet, also nur dann wenn es wirklich notwendig ist.
 
Javascript:
let retVal = HMIRuntime.UserManagement.HasUserRole(roleName);
 Tags("Anlagen_DB_TempString").Write(retVal);

Die Funktion
Javascript:
HMIRuntime.UserManagement.HasUserRole("HMI Administrator");
Gibt dir ein Bool zurück.
Vielleicht wird das Skript abgebrochen weil du das Bool in einen String schreiben willst?
->
Javascript:
Tags("Anlagen_DB_TempString").Write(retVal);

Teste mal:

Javascript:
let isAdmin = HMIRuntime.UserManagement.HasUserRole("HMI Administrator");
if(isAdmin){
  Tags("Anlagen_DB_TempString").Write("Admin");
}
else{
  Tags("Anlagen_DB_TempString").Write("Unberechtigt");
}

Das kannst du als Skript in irgendeinem unsichbaren Textfeld am HMI testen.
Ich meine mich zu erinnern das man auf Benutzername und Benutzergruppe nicht aus dem Aufgabenplaner zugreifen kann!
Weil dieser auf dem Gerät läuft, aber mehrere Benutzer gleichzeitig angemeldet sein könnten.....

Screenshot 2025-08-12 093624.png

Javascript:
export function BenutzerdatenLesen() {
// Aktuellen Benutzernamen aus HMI Systemvariable lesen
let panelBenutzername = Tags("@UserName").Read();

// Aktuellen Benutzernamen aus Steuerung lesen
let steuerungsBenutzername = Tags("Panel_Benutzername").Read();

// Wenn ungleich dann Benutzername und Benutzerlevel aktualisieren
if (panelBenutzername !== steuerungsBenutzername) {

   // String initialisieren
  let panelBenutzerlevel = '';
 
  // Liste der aktivierten Benutzergruppen lesen
  let levels = HMIRuntime.UserManagement.GetRolesFromUser();
 
  // Listeneintrag [0] lesen (höchstwertige Benutzerrolle)
  // Wenn es mehr als 0 aktivierte Benutzerrollen gibt
  if(levels.length > 0){
    panelBenutzerlevel = levels[0];
  }
  else{
    // Weniger als 0 aktivierte Benutzerrollen = Keine Benutzergruppe aktiviert
    panelBenutzerlevel = 'Unberechtigt';
  }
 
  // Benutzername in SPS speichern
  Tags("Panel_Benutzername").Write(panelBenutzername);
 
  // Benutzergruppe in SPS speichern
  Tags("Panel_Benutzergruppe").Write(panelBenutzerlevel);
}
}
 
Zuletzt bearbeitet:
Es wird jetzt immer unberechtigt geschrieben. Auch wenn ich mit dem Benutzer, welche die "HMI Administrator" Rolle hat.
Das heisst die Abfrage der Rolle scheint nicht zu funktionieren.
Javascript:
HMIRuntime.UserManagement.HasUserRole("HMI Administrator")

1754984265505.png
 
Danke, nun funktioniert das Skript beim Tasten drücken. Es wird Admin in den String geschrieben. Heisst es geht NICHT aus dem Aufgabenplaner. Was ich nicht verstanden habe ist wie kann das Script nun getrieggert werden, wenn der Benutzer wechselt? An der @UserName Variable kann ich kein Ereigniss auf Änderung projektieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe es wie im Bild zu sehen einfach alle 100ms laufen lassen

Screenshot 2025-08-12 100524.png


Das ist eben so entstanden weil ich für die Zukunft unseren WinCC "normal" auf "unified" umgebaut habe.
Vielleicht gibt es mittlerweile bessere Lösungen.
 
Sobald du die Variable @UserName in deinem Skript benutzt (natürlich nicht über den Aufgabenplaner), kannst du auf dem blauen Wecker/Trigger "Variablen" und @UserName auswählen.

Das ist viel besser, als jede 100ms das Skript aufzurufen.
 
Also wenn ich den Knopf Drücke, dann funktioniert es:
1754987090233.png

Habe wie beschrieben den Trigger bei mir auf 5s gestellt, aber es wird nicht abgearbeitet:
1754987280569.png
Nun Frage ich mich, was habe ich übersehen?
Habe die 2 Zeilen von Hand geschrieben:
GlobalesModul.Admin();
return "";
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also wenn ich den Knopf Drücke, dann funktioniert es:

1754988004361.png
Habe wie beschrieben den Trigger bei mir auf 5s gestellt, aber es wird nicht abgearbeitet:
1754987989813.png
Nun Frage ich mich, was habe ich übersehen?
Habe die 2 Zeilen von Hand geschrieben:

GlobalesModul.Admin();
return "";
 
Ja, genau, das wars, der globale Teil habe ich nicht definiert:
import * as GlobalesModul from "GlobalesModul"

Nun funktioniert es einwandfrei. Besten Dank Euch allen für Eure Hilfe!
 
Zurück
Oben