WinCC Unified Runtimesprache auf letzte Sprache setzen Unified V20

buffi4711

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



ich würde gerne die zuletzt am Panel eingestellte Sprache nach Hochlauf des Panels bzw auf Anforderung durch die PLC setzen.
Ich habe drei Buttons definiert, die die Sprache umstellen und die angewählte Sprache in eine PLC Variable schreiben, was auch funktioniert



export function Schaltfläche_1_OnTapped(item, x, y, modifiers, trigger) {

HMIRuntime.Language = 1031;

Tags("DB_PANEL_Sprache").Write(1031);

}



Als Beispiel für Deutsch.



Aber wie bekomme ich jetzt das Rückwärts hin. Also das ich die PLC-Variable auslese z.B. über Aufgabenplaner alle 10sek und dann die Sprache auf den Wert in der PLC setze?
 
Damit hatte ich mich diese Woche auch beschäftigt.
Ich wollte einfach per Knopfdruck alle Sprachen durchschalten.

Für den Knopf verwende ich folgenden Code:
Javascript:
export function UpdateLang() {
  UI.SysFct.ToggleLanguage();
  Tags("LangIndex").Write(HMIRuntime.Language);
}

Zur Anzeige nutze ich eine Grafikliste, die dann die entsprechenden Länderflaggen zugeordnet ist.


Wenn das Startbild aufgebaut wird (Ereignisse) soll folgendes Script ausgeführt werden:
Javascript:
export function LoadLastLang() {
  HMIRuntime.Language = Tags("LangIndex").Read();
}

Die Variable LangIndex ist in einem Datenbaustein. Dank deiner Nachfrage habe ich jetzt mein eigenes Programm erweitert.

Eine alternative Lösung bietet Siemens an: https://support.industry.siemens.co...uage-to-the-last-used-language?dti=0&lc=en-US

Dort wird die Nummer in einer Datei gespeichert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine alternative Lösung bietet Siemens an: https://support.industry.siemens.co...uage-to-the-last-used-language?dti=0&lc=en-US

Dort wird die Nummer in einer Datei gespeichert.
Ich würde die Siemens-Lösung mit der Datei empfehlen.
Nur weil das Startbild aufgebaut wurde, musst du noch lange nicht bereits eine Kommunikation zur SPS haben.
Schlimmstenfalls schreibst du irgendeinen Müll als neue Spracheinstellung.
 
Hallo und Danke für die Rückmeldungen.

die Lösung mit der datei benötigt dann aber einen USB Stick oder geht das auch im Speicher des HMI?. Wir verwenden Basic asl auch Comfort Panels
 
Nur weil das Startbild aufgebaut wurde, musst du noch lange nicht bereits eine Kommunikation zur SPS haben.
Schlimmstenfalls schreibst du irgendeinen Müll als neue Spracheinstellung.
Stimmt.

Ich werde das nochmal mit der Simulation testen. Dann muss ich wahrscheinlich den Windows-Pfad verwenden.
Die Sprachen für die Archivierung habe ich aber bis auf Deutsch deaktiviert. Ansonsten sollte man die Sprache auch bei der SPS freischalten.
Gibt sonst so viele Warnungen....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

habe das mit der version von Siemens ausprobiert.

Der erste Teil könnte gehen, also das speichern der Sprache

Beim zweiten Teil bekomme ich beim Übersetzen eine Fehlermeldung obwohl per Copy und Paste in Projekt übernommen
Im den im Beitrag agegebene Produkten sin die BasicPanel nicht aufgeführt. Unterstützen die BasicPanel wieder nur einen Teil der Funktionen?



DW_1_HMI_1,,1,1,15:13:54
,Übersetzen der Software gestartet.,,,15:13:54
Bilder,,1,0,15:13:55
Content,,1,0,15:13:55
01_MainCont,,1,0,15:13:55
,Ungültiges Object Member: Setimeout(() => {HMIRuntime.Language = parseInt(content);}, 50) in Zeile 5, in Spalte 21,,,15:13:55
Runtime-Einstellungen,,0,1,15:13:55
,Die projektierten Runtime-Sprachen des HMI-Gerätes entsprechen nicht den projektierten Sprachen der verbundenen PLC "DW_1_PLC_1".,,,15:13:55
,Übersetzen abgebrochen (Fehler: 1; Warnungen: 1),,,15:13:55
 
Ich habe jetzt für meinen Anwendungsfall eine Lösung gefunden.
Als Erstes habe ich bei "Skripte > Globales Modul > Globaler Definitionsbereich" folgende Konstante angelegt:

Javascript:
const lang_path = "/home/industrial/last_language.txt";

Danach habe ich 2 Skripte angelegt ("Skripte > Globales Modul"):
LoadLanguage
Javascript:
export function LoadLanguage() {
  function set_language(data) {
    let lcid = parseInt(data, 10) >>> 0;
    HMIRuntime.Trace("Set runtime language to " + lcid + "\n");
    HMIRuntime.Language = lcid;
    Tags("LangIndex").Write(lcid);
  }

  function error(err_msg) {
    HMIRuntime.Trace("Could not read file '" + lang_path + "'\n" + err_msg);
  }

  function read_file() {
      // it's an async function
      // use .then().catch()
      HMIRuntime.FileSystem.ReadFile(lang_path, "utf8").then(set_language).catch(error);
  }

  read_file();
}

UpdateLang
Javascript:
export function UpdateLang() {
  function error(err_msg) {
    HMIRuntime.Trace("Could not write to file '" + lang_path + "'\n" + err_msg);
  }

  function SaveNewLanguage() {
      HMIRuntime.FileSystem.WriteFile(lang_path, String(HMIRuntime.Language), "utf8").catch(error);
  }

  UI.SysFct.ToggleLanguage();
  Tags("LangIndex").Write(HMIRuntime.Language);
  SaveNewLanguage();
  HMIRuntime.Trace("Changed language to " + HMIRuntime.Language + "\n");
}

Die HMI-Variable LangIndex anlegen. Kann auch intern sein.

Damit die Funktion LoadLanguage geladen wird, muss für das Grundbild ein Ereignis angelegt werden:
Eigenschaften -> Ereignisse -> Aufgebaut > Globales Modul.LoadLanguage

Die Funktion UpdateLang dient zum toggeln. Dann benötigt man nur ein Button, um durch alle vorhandenen Sprachen durchschalten zu können. Jedes mal, wenn der Button betätigt wird, wird auch die LCID in der last_language.txt gespeichert.

Dazu ein Button anlegen und dann Eigenschaften -> Ereignisse > Drücken > Globales Modul.UpdateLang
(Taste Drücken ist falsch!)

Die Grafik des Buttons definiere ich über eine Ressourcen-Liste. Als HMI-Variable verwende ich LangIndex und die Ressource heißt bei mir Lang.

Folgende Sprache habe ich bis jetzt zugeordnet:
1031 - Deutsch
1033 - Englisch (US)
1045 - Polnisch

Dann ist mir noch aufgefallen, wenn HMIRuntime.Language = 0 gesetzt wird, wird die Standard-Sprache verwendet. Hilfreich ist das Tracing mit RTILtraceTool.exe und RTILtraceViewer.exe.

Ich habe ziemlich lange gebraucht, um zu verstehen, dass HMIRuntime.FileSystem.ReadFile und HMIRuntime.FileSystem.WriteFile asynchrone Funktionen sind, die ein Promise zurückgeben. Bei der Funktion zum Schreiben fällt das nicht auf, da der Wert entweder geschrieben wird oder nicht (Pfad z.B. falsch). Beim Lesen der Datei wird auch ein Promise zurückgeliefert und ich habe fälschlicherweise angenommen, dass es der gelesene Inhalt als string ist. Anstatt mit dem Rückgabewert der Funktion zu arbeiten, muss man nach dem Aufruf von HMIRuntime.FileSystem.WriteFile().then(daten_bereit).catch(error) delegiert werden. Die Funktion daten_bereit wird aufgerufen, wenn die Datei erfolgreich gelesen worden ist und bei einem Fehler wird nur die Funktion error aufgerufen.

Ich werde mich jetzt weiter mit WinCC Unified quälen. Schade, dass Siemens kein Python integriert hat. So hätte zumindest ich viel effizienter arbeiten können. Woran momentan exzessiv gearbeitet wird, ist PyScript mit Micropython als Runtime.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe das soeben versucht und Deien Scripte per Copy and Paste in mein Projekt übernommen.

beim Übersetzen erhalte ich im Script "UpdateLang" , bei mir in Zeile 13 den fehler:

,"ScheduledTasks" Modul referenziert das Modul "Globales Modul", das folgenden Fehler enthält: Object member: UI im aktuellen Umfang nicht unterstützt in Zeile 13, in Spalte 2,,,07:44:16

das ist wohl die der Befehl :

UI.SysFct.ToggleLanguage();

kann das sein das das von den Unifeid Basic-Panels nicht unterstützt wird?

Weiter habe ich drei Button erstelt mit denen ich die Spache umschalte :

HMIRuntime.Language = 1031;
Tags("DB_PANEL_Sprache").Write(1031);
Tags ("Schriftgroeße").Write(25);

Dabei schalte ich auch Schriftgröße um da deutsche Texte meist kürzer sind als in vielen anderen Sprachen.

Das mit dem Button zum umschalten der Sprache habe ich auch nicht ganz verstanden was gemeint ist.

Kannst Du mir das etaws genauer erklären?
 

Anhänge

  • Screenshot 2025-07-07 075525.png
    Screenshot 2025-07-07 075525.png
    32,4 KB · Aufrufe: 2
Zuviel Werbung?
-> Hier kostenlos registrieren
"ScheduledTasks" Modul referenziert das Modul "Globales Modul", das folgenden Fehler enthält: Object member: UI im aktuellen Umfang nicht unterstützt in Zeile 13, in Spalte 2,,,07:44:16
Scripte im Aufgabenplaner können in Unified prinzipiell nicht auf die UI zugreifen, da diese jeweils einen separaten Ausfürungskontext besitzen.
Der Aufgabenplaner ist ein serverseitiger Dienst, während die UI immer Client-Spezifisch läuft.
 
Ich nutze TIA Portal v20 + neuste Updates und MTP700 Comfort Panels.
UI.SysFct.ToggleLanguage();

Diese Funktion sollte bei dir eigentlich auch vorhanden sein.
Probier mal: HMIRuntime.UI.SysFct.ToggleLanguage();

UI ist nur ein Alias für HMIRuntime.UI



Dabei schalte ich auch Schriftgröße um da deutsche Texte meist kürzer sind als in vielen anderen Sprachen.
Ja, leider kann man die Schriftgröße der unterschiedlichen Sprachen in der Runtime nicht einstellen. Gute Idee. Mein Problem ist, dass es keine globale Liste von allen Objekten gibt. D.h. ich müsste alle Objekte dessen Schriftgröße ich anpassen will, einzeln adressieren (über eine Liste z.B.).


Das mit dem Button zum umschalten der Sprache habe ich auch nicht ganz verstanden was gemeint ist.

Kannst Du mir das etaws genauer erklären?
Ich habe in der Runtime 3 Sprachen definiert: 0 - Deutsch, 1 - Englisch, 2 - Polnisch
Die Funktion UI.SysFct.ToggleLanguage() schaltet durch die gesetzten Sprachen durch: Deutsch -> Englisch -> Polnisch -> Deutsch -> Englisch -> ...

Soweit ich weiß, wolltest du einzelne Buttons für jede Sprache haben.
Kann man auch machen, indem man z.B. wieder ein globales Script anlegt und einen Parameter (lcid) übergibt.

Die Funktion könnte dann so aussehen:
Javascript:
export function SetLanguage(lcid) {
  // lang_path in Globaler Definitionsbereich festgelegt
  function error(err_msg) {
    HMIRuntime.Trace("Could not write to file '" + lang_path + "'\n" + err_msg);
  }

  function success() {
    HMIRuntime.Trace("Written " + HMIRuntime.Language + " to file " + lang_path);
  }

  function SaveNewLanguage() {
      HMIRuntime.FileSystem.WriteFile(lang_path, String(HMIRuntime.Language), "utf8").then(success).catch(error);
  }

  HMIRuntime.Language = lcid;
  Tags("LangIndex").Write(HMIRuntime.Language);
  SaveNewLanguage();
  HMIRuntime.Trace("Changed language to " + HMIRuntime.Language + "\n");
}

Dann einem Button ein Ereignis zuordnen: Drücken > Globales Modul > SetLanguage (1045 == Polnisch).
Hier noch ein Screenshot:
SetLanguage_tia.png


Damit dann die zuvor selektierte Sprache beim Neustart des Panels geladen wird, muss man dem Grundbild ein Ereignis für "Aufgebaut" zuordnen. Dort dann das Globale Script LoadLanguage auswählen, dass die Sprache aus der Textdatei lädt und dann setzt.

Hier nochmal die letzte Version meines Scripts:
Javascript:
export function LoadLanguage() {
  function set_language(data) {
    let lcid = parseInt(data, 10) >>> 0;
    HMIRuntime.Trace("Set runtime language to " + lcid + "\n");
    HMIRuntime.Language = lcid;
    Tags("LangIndex").Write(lcid);

    // Not used here
    // setFontSize(hmi_objects, lang_font_sizes[HMIRuntime.Language]);
  }

  function error(err_msg) {
    HMIRuntime.Trace("Could not read file '" + lang_path + "'\n" + err_msg);
  }

  function read_file() {
      // it's an async function
      // use .then().catch()
      HMIRuntime.FileSystem.ReadFile(lang_path, "utf8").then(set_language).catch(error);
  }

  read_file();
}

D.h. immer, wenn das Grundbild aufgebaut worden ist, wird das Script ausgeführt, auch beim ersten Start.
 
Hallo und Danke,

bin jetzt den Weg über die PLC gegangen, also zwei Variabelen remanet angelegt. Sobald die Verbindung zur PLC steht und die Uhrzeit aktualisiert wird lese ich auch die Sprache und Schriftgröße und alles ist gut.

Deine Variante werde ich aber auch nochmal testen, Anlage geht morgen zur Montage zum Kunden, da fehlt heute die Zeit zu.
 
Zurück
Oben