WinCC Unified Sprachumschaltung via Toggle Button und angezeigter Fahne

L4s3r73k

Level-2
Beiträge
131
Reaktionspunkte
31
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich mache gerade mein erstes Projekt mit Unified als solches. Dabei ist mir das Thema schon fast zu peinlich um es hier zu stellen, aber ich komme nicht weiter.

Zur Zielsetzung und was bisher unternommen wurde:
  • Button, der die verfügbaren Sprachen durchtoggelt.
    • Button mit ToggleLanguage() Befehl bzw. Nutzung der "WechsleSprache" Funktion.
  • Button soll die aktuelle Fahne der Sprache anzeigen.
    • Grafikliste mit Fahnen.
  • Projektunabhängige Benutzbarkeit.
    • Fahnengrafiken bekommen die Indizes der LCIDs der Sprachen
    • 1. Versuch die HMI Systemvariable "@CurrentLanguage" zu verwenden
      • Resultat: Der Inhalt der Variable lässt sich zwar als IO Wert anzeigen, die Nutzung der Variable zur Dynamisierung der Fahne/des Buttons taugt nicht.
    • 2. Versuch: Arbeiten mit Hilfsvariablen:
      • Hilfsvariablen im HMI angelegt für den LCID-Code als interne Variable und als PLC-Variable angelegt.
      • Java-Skript Code geschrieben um zuerst bei Tastendruck die Sprache umzuschalten um dann die Werte in den angelegten Variablen zu speichern.
      • Resultat: Funktioniert auf manchen Geräten ganz gut (9/10 Versuche), bei anderen eher schlecht (1/2 Versuche). Sprache wird weitergeschaltet, aber die Variablen übernehmen den Wert der vorherigen Sprache.
      • Code weiter unten.
  • HMI soll aufstarten/Browserfenster neu laden mit zuletzt eingestellter Sprache - was zumindest standardmäßig nicht tat.
    • Nutzung der internen HMI-Variable bzw. der PLC-Variable zur Widerherstellung der letzten Sprache via Java-Skript
      • Funktioniert soweit. Nutztung bei "Bild aufgebaut".
      • Code weiter unten.

Code zur Umschaltung.
Java:
export function Funktion_LCID_() {

// 1. Toggle Language.
HMIRuntime.UI.SysFct.ToggleLanguage();

// 2. Mirror back from system tag to HMI/PLC tag.

let LCID = Tags("@CurrentLanguage").Read();

Tags("HMI_LanguageLCID_HMI").Write(LCID);
Tags("HMI_LanguageLCID_PLC").Write(LCID);

}

Code zur Widerherstellung der Sprache beim "Bild-Aufgebaut-Ereignis".
Javascript:
export function Funktion_Restore_LCID() {


if (HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_PLC") != 0)
{
HMIRuntime.UI.SysFct.SetLanguage(HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_PLC"));
}
else if (HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_PLC") != 0)
{
HMIRuntime.UI.SysFct.SetLanguage(HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_HMI"));
}

}

Meine Fragen:

1. Was kann ich machen, dass dieser Button für seine Grafikliste die Systemvariable "@CurrentLanguage" akzeptiert?

2. Wie muss ich diese Code(s) ändern, dass der Vollzug des Sprachwechsels und die damit verbundene Änderung der Variabel "@CurrentLanguage" zwingend vor dem Schreiben der PLC/HMI Variablen passiert?

Ich bedanke mich für Eure Aufmerksamkeit.
 
1. Was kann ich machen, dass dieser Button für seine Grafikliste die Systemvariable "@CurrentLanguage" akzeptiert?
Bei mir wuppt das wunderbar ¯\_(ツ)_/¯
1753961722146.png
(TIA V20 Update 3)

Welche TIA-Version verwendest du?
Bitte generell immer TIA-Version / Runtime Version dazu schreiben.
Ist grade bei Unified wichtig, da sich über die einzelnen Versionen bisher viel getan hat.

2. Wie muss ich diese Code(s) ändern, dass der Vollzug des Sprachwechsels und die damit verbundene Änderung der Variabel "@CurrentLanguage" zwingend vor dem Schreiben der PLC/HMI Variablen passiert?
Thema: synchrone/asynchrone Scripte.
Teste mal ob sich mit nem asynchronen Script und await HMIRuntime.UI.SysFct.ToggleLanguage(); was machen lässt.
Ansonsten im Hauptbild Aufgebaut-Ereignis eine Subscription auf @CurrentLanguage starten & dort auf die Wertänderung reagieren.

Beachte wenn du den Webclient verwendest:
dann hast du für den jeweiligen Runtime-Server mehrere Clients, die mit jeweils unterschiedlicher Spracheinstellung auf die gleiche SPS-Variable schreiben würden. Das beißt sich...

HMI soll aufstarten/Browserfenster neu laden mit zuletzt eingestellter Sprache - was zumindest standardmäßig nicht tat.
  • Nutzung der internen HMI-Variable bzw. der PLC-Variable zur Widerherstellung der letzten Sprache via Java-Skript
    • Funktioniert soweit. Nutztung bei "Bild aufgebaut".
Das funktioniert nicht, wenn du beim Runtime-Start keine Verbindung zur SPS hast (wie du der Abfrage auf != 0 nach vermutlich schon festgestellt hast).
Schau dir vllt. mal das an:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Botimperator
Mahlzeit und schönen Samstagnachmittag. Auf dem Panel bzw. in der Simulation wird Version 19.0.0.0 benutzt. TIA / Unified ist V19 Update 4.
Interessant, ich dachte nicht, dass das mit einer TIA/Unified Version weiter doch geht mit @CurrentLanguage. Aktuell sieht meine Lösung so aus:

1754041474719.png

Damit geht es zwar, aber mit Umwegen.
Ich habe meinen Code angepasst, da ich keine extra Datei erzeugen wollte. So klappt es doch ganz gut.
Code:
Javascript:
export function Funktion_Restore_LCID() {

//HMIRuntime.Tags.SysFct.SetTagValue("HMI_LanguageLCID_HMI", HMIRuntime.Tags.SysFct.GetTagValue("@CurrentLanguage"));
//HMIRuntime.Tags.SysFct.SetTagValue("HMI_LanguageLCID_PLC", HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_HMI"));

let tagPLC = HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_PLC");
let tagHMI = HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_HMI");
let tagSystem = HMIRuntime.Tags.SysFct.GetTagValue("@CurrentLanguage");


if (tagPLC != 0)
{
if (tagPLC == tagHMI)
{
HMIRuntime.UI.SysFct.SetLanguage(tagPLC);
Tags("HMI_LanguageLCID_HMI").Write(tagPLC);
}
else
{
HMIRuntime.UI.SysFct.SetLanguage(tagHMI);
Tags("HMI_LanguageLCID_PLC").Write(tagHMI);
}
}
else if (tagHMI != 0)
{
HMIRuntime.UI.SysFct.SetLanguage(tagHMI);
Tags("HMI_LanguageLCID_PLC").Write(tagHMI);
}

}

Leider kann ich aktuell wieder nicht unter realen Bedingungen testen. Weil mein Test-Rack woanders steht. Das mit dem await werde ich ausprobieren. Kommt diese Zeile Code ergänzend zur Zeile mit ToggleLanguage() oder wird einfach nur das Wort "await" vor diese Zeile gesetzt.

Vielen Dank bis hier hin.
 
Interessant, ich dachte nicht, dass das mit einer TIA/Unified Version weiter doch geht mit @CurrentLanguage.
Deswegen bei Unified möglichst immer die neuste TIA-Version nehmen.
Ist irre wie viel sich zwischen den Versionen, und teilweise auch den Updates einer Hauptversion, tut.
(bzw. wie unfertig Siemens diese 💩 auf den Markt geworfen hat)

Dass du ältere Projekte in neuere Runtimes laden kannst, hast du aber auf dem Schirm?
Also z.B. V19 Projekt in eine V20 Runtime.
Gibt dann zwar nicht mehr Funktionen, aber zumindest die Bugfixes der neueren Version.

Damit geht es zwar, aber mit Umwegen.
Ich habe meinen Code angepasst, da ich keine extra Datei erzeugen wollte. So klappt es doch ganz gut.
Klappt das wirklich, wenn die Runtime startet ohne die SPS-Verbindung bereits aufgebaut zu haben?

Tipp, der dir Nerfen sparen wird:
Pack deinen Code IMMER in eine try/catch Struktur und gib per HMIRuntime.Trace() zumindest eine grundlegende Fehlermeldung raus.
Ansonsten wird dein Script bei einem Fehler ohne Feedback/Meldung an der Fehlerstelle abgebrochen.

Das mit dem await werde ich ausprobieren. Kommt diese Zeile Code ergänzend zur Zeile mit ToggleLanguage() oder wird einfach nur das Wort "await" vor diese Zeile gesetzt.

Wird aber nicht funktionieren, hab eben nachgeschaut.
ToggleLanguage() gibt lediglich einen Fehlercode zurück, kein Promise.
Also nichts um nen Callback dranzuhängen ¯\_(ツ)_/¯
Ich vermute mal ToggleLanguage() und die Funktion, die @CurrentLanguage beschreibt, sind Runtime-intern zwei getrennte Funktionen/Dienste.


Und schau dir wegen deinem Codestyle mal das hier an:
Alternativ tuts auch Notepad++ mit dem JSTools-Plugin zum automatischen Formatieren des Codes.
Mit dem Siemens-Editor verliest du zu schnell die Übersicht, sobald das Script aus mehr als ein paar Zeilen besteht.
 
Also ich fasse zusammen.
  • Mit TIA V19 Update 4 und projektierter V19.0.0.0 Runtime kann ich eine V20 Runtime bespielen!?
  • Ich habe meinen Code dahingehend getestet, dass ich Page-Reload mal ja, mal nein die SPS verbunden habe. Den Vorschlag von Siemens hab ich mir aber gespeichert.
  • Schade. dass await nicht funktionieren wird.
  • Ich weiß, der Code sieht grauenhaft aus. Aber sagen wir mal so, JS find ich jetzt so oder so nicht besonders sexy.

Schönes Wochenende.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit TIA V19 Update 4 und projektierter V19.0.0.0 Runtime kann ich eine V20 Runtime bespielen!?
Jup, sind (bisher) voll abwärtskompatibel.

Ich weiß, der Code sieht grauenhaft aus. Aber sagen wir mal so, JS find ich jetzt so oder so nicht besonders sexy.
Geht eigentlich...der TIA-eigene Editor ist halt 💩
Dein Code einmal durch den JSTool-Autoformatierer gejagt sieht so aus:
Javascript:
export function Funktion_Restore_LCID() {

    //HMIRuntime.Tags.SysFct.SetTagValue("HMI_LanguageLCID_HMI", HMIRuntime.Tags.SysFct.GetTagValue("@CurrentLanguage"));
    //HMIRuntime.Tags.SysFct.SetTagValue("HMI_LanguageLCID_PLC", HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_HMI"));

    let tagPLC = HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_PLC");
    let tagHMI = HMIRuntime.Tags.SysFct.GetTagValue("HMI_LanguageLCID_HMI");
    let tagSystem = HMIRuntime.Tags.SysFct.GetTagValue("@CurrentLanguage");

    if (tagPLC != 0) {
        if (tagPLC == tagHMI) {
            HMIRuntime.UI.SysFct.SetLanguage(tagPLC);
            Tags("HMI_LanguageLCID_HMI").Write(tagPLC);
        } else {
            HMIRuntime.UI.SysFct.SetLanguage(tagHMI);
            Tags("HMI_LanguageLCID_PLC").Write(tagHMI);
        }
    } else if (tagHMI != 0) {
        HMIRuntime.UI.SysFct.SetLanguage(tagHMI);
        Tags("HMI_LanguageLCID_PLC").Write(tagHMI);
    }

}

Schönes Wochenende.
Gleichfalls (✿◠‿◠)
 
Zurück
Oben