Skip to main content

Message Handling mit CODESYS ScriptingScripting

Voraussetzungen: CODESYS V3.5 SP17 oder neuer mit installiertem CODESYS Scripting Version 4.2.0.0

Vorbereitungen: Kopieren Sie das jeweils gewünschten Code-Beispiel in eine Datei und speichern Sie diese unter einem beliebigen Namen als Python-Skript.

Um das gespeicherte Python-Skript auszuführen, führen Sie folgende Schritte aus:

  1. Starten Sie CODESYS.

  2. Wählen Sie den Menübefehl ToolsScriptingSkriptdatei ausführen.

  3. Wählen Sie im Dialog Wähle Skript-Datei aus das Python-Script aus, das ausgeführt werden soll.

Alle Ausgaben werden im Meldungsfenster (Ansicht Meldungen) in der Meldungskategorie Skripting angezeigt.

. Begriffserklärungen
  • Message Service: Funktionalität der Automation Platform um unterschiedliche Prompts anzuzeigen, die dann ggf. auch automatisiert verarbeitet werden können

  • Message Key: Eindeutiger Bezeichner für ein Prompt, das über den Message Service erzeugt wurde. Nicht jedes Prompt hat einen Message Key. Message Keys von Prompts sind normalerweise nicht sichtbar, können aber mittels Property system.log_prompt_details ermittelt werden (siehe unten Property system.log_prompt_details ).

Property system.script_prompt_handling

Mit dem Property system.script_prompt_handling kann festgelegt werden, ob und wie Prompts des Message Services automatisch verarbeitet werden.

Beispiel 34. Beispiel 1

Es werden die Werte ScriptPromptHandling.LogPrompts und ScriptPromptHandling.ForwardUnknownPrompts zugewiesen.

  • ScriptPromptHandling.ForwardUnknownPrompts legt fest, dass alle Prompts ohne passenden Eintrag in system.prompt_answers an den zugrundeliegenden Message Service weitergeleitet werden.

  • ScriptPromptHandling.LogPrompts legt fest, dass für alle Prompts mit Eintrag in system.prompt_answers im Meldungsfenster ausgegeben wird, mit welchen Werten das Prompt bestätigt wurde.

system.script_prompt_handling = ScriptPromptHandling.LogPrompts | ScriptPromptHandling.ForwardUnknownPrompts


Beispiel 35. Beispiel 2

Es werden die Werte ScriptPromptHandling.LogPrompts und ScriptPromptHandling.AlwaysForwardPrompts zugewiesen.

  • ScriptPromptHandling.AlwaysForwardPrompts legt fest, dass alle Prompts an den zugrundeliegenden Message Service weitergeleitet werden. Passende Einträge in system.prompt_answers werden ignoriert.

  • ScriptPromptHandling.LogPrompts hat in diesem Fall keinen Effekt, da ScriptPromptHandling.AlwaysForwardPrompts die höchste Priorität hat und alle anderen Optionen überschreibt.

system.script_prompt_handling = ScriptPromptHandling.LogPrompts | ScriptPromptHandling.AlwaysForwardUnknown


Wichtig

Es gelten folgende zusätzliche Bedingungen für alle Prompts, die eine zusätzliche Nutzerinteraktion benötigen (z. B. Checkboxen auswählen), wenn nur ScriptPromptHandling.SuppressPrompts oder ScriptPromptHandling.LogPrompts gesetzt ist:

  • Alle Prompts ohne Message Key werden an den zugrundeliegenden Message Service weitergeleitet.

  • Alle Prompts mit Message Key benötigen einen Eintrag in system.prompt_answers.

Property system.process_script_prompts

Mit dem Property system.process_script_prompts kann festgelegt werden, ob auch Prompts, die über system.ui generiert werden, vom Message Handling von CODESYS Scripting verarbeitet werden sollen.

Beispiel 36. Beispiel 1

Im folgenden Beispiel wird die Verarbeitung von Prompts aktiviert, die über CODESYS Scripting generiert werden.

Wenn dieses Skript ausgeführt wird, wird das erzeugte Info-Prompt durch das Message Handling von CODESYS Scripting verarbeitet und das Ergebnis wird im Meldungsfenster ausgegeben.

system.process_script_prompts = True
system.script_prompt_handling = ScriptPromptHandling.LogPrompts
system.ui.info("my info message", "message_key")


Beispiel 37. Beispiel 2

Im folgenden Beispiel wird die Verarbeitung von Prompts, die über CODESYS Scripting generiert werden, deaktiviert.

Wenn dieses Skript ausgeführt wird, erscheint ein Info-Prompt, das nicht durch das Message Handling von CODESYS Scripting verarbeitet wird.

system.process_script_prompts = False
system.script_prompt_handling = ScriptPromptHandling.LogPrompts
system.ui.info("my info message", "message_key")


Property system.log_prompt_details

Mit dem Property system.log_prompt_details kann festgelegt werden, ob alle Details eines Prompts vor der Verarbeitung im Meldungsfenster ausgegeben werden sollen. Das ist insbesondere dann hilfreich, wenn die Reaktion für ein komplexeres Prompt in system.prompt_answers hinterlegt werden soll. Da auch der Message Key eines Prompts ausgegeben wird, kann die Methode verwendet werden, um den passenden Message Key zum Beispiel für die Verwendung in system.prompt_answers zu ermitteln.

Beispiel 38. Beispiel 1

Im folgenden Beispiel wird das Logging für Prompt-Details aktiviert. Anschließend wird ein Prompt mit zusätzlichen Auswahlmöglichkeiten generiert.

Wenn dieses Skript ausgeführt wird, erscheint das Prompt und im Meldungsfenster werden alle Informationen zu diesem Prompt ausgegeben.

system.log_prompt_details = True
system.process_script_prompts = True
options = ["Option 1", "Option 2", "Option 3"]
system.ui.select_many("my info message", PromptChoice.OKCancel, PromptResult.Cancel, options, "message_key")


Beispiel 39. Beispiel 2

Im folgenden Beispiel wird das Logging für Prompt-Details deaktiviert. Anschließend wird ein Prompt mit zusätzlichen Auswahlmöglichkeiten generiert.

Wenn dieses Skript ausgeführt wird, erscheint das Prompt. Im Meldungsfenster werden keine Informationen über das Prompt ausgegeben.

system.log_prompt_details = False
system.process_script_prompts = True
options = ["Option 1", "Option 2", "Option 3"]
system.ui.select_many("my info message", PromptChoice.OKCancel, PromptResult.Cancel, options, "message_key")


Property system.prompt_answers

Mit dem Property system.prompt_answers kann festgelegt werden, wie auf spezifische Prompts reagiert werden soll.

Dies ist notwendig

  • wenn, Prompts nicht mit den gesetzten Default-Werten beantwortet werden sollen

  • für Prompts, die eine zusätzliche Nutzerinteraktion erfordern (z. B. Checkboxen auswählen)

Wichtig

Es können nur Reaktionen für Prompts mit einem Message Key hinterlegt werden.

Prompts ohne weitere Auswahlmöglichkeiten

Im folgenden Beispiel wird in system.prompt_answers hinterlegt, wie auf Prompts mit dem Message Key message_key_1 reagiert werden soll. In diesem Beispiel werden alle Prompts mit diesem Message Key mit OK beantwortet.

Wenn dieses Skript ausgeführt wird, werden nacheinander zwei Prompts generiert.

  • Das erste Prompt mit dem Message Key message_key_1 wird automatisch verarbeitet und das Ergebnis wird in der MessageView ausgegeben

  • Das zweite Prompt mit dem Message Key message_key_2 wird angezeigt

system.process_script_prompts = True
system.prompt_answers["message_key_1"] = PromptResult.OK
system.ui.prompt("automatically processed prompt", PromptChoice.OKCancel, PromptResult.Cancel, message_key="message_key_1")
system.ui.prompt("shown prompt", PromptChoice.OKCancel, PromptResult.Cancel, message_key="message_key_2")

Prompts mit zusätzlicher Einzelauswahl

Bei Prompts, die die Auswahl einer Option aus einer Liste möglicher Optionen erwarten, muss in system.prompt_answers für den entsprechenden Message Key hinterlegt werden, welche Option ausgewählt werden soll.

Dafür existieren zwei Möglichkeiten:

  • Angabe des Null-basierten Index der gewünschten Option

  • Hinterlegen einer Delegate vom Typ MultipleChoiceSelector

Beispiel 40. Beispiel 1

Im folgenden Beispiel wird in system.prompt_answers der Index hinterlegt, der für alle Prompts mit dem Message Key message_key_1 verwendet werden soll.

system.process_script_prompts = True
options = ["Option 1", "Option 2", "Option 3"]
system.prompt_answers["message_key_1"] = 1
system.ui.choose("single choice prompt", options, message_key="message_key_1")


Beispiel 41. Beispiel 2

Im folgenden Beispiel wird in system.prompt_answers ein Delegate vom Typ MultipleChoiceSelector hinterlegt, der für alle Prompts mit dem Message Key message_key_1 verwendet werden soll.

from System import Array

# filter function
def my_filter(choices):
    return Array.IndexOf(choices, "Option 2")

system.process_script_prompts = True
options = ["Option 1", "Option 2", "Option 3"]
system.prompt_answers["message_key_1"] = MultipleChoiceSelector(my_filter)
system.ui.choose("single choice prompt", options, message_key="message_key_1")


Prompts mit zusätzlicher Mehrfachauswahl

Bei Prompts, welche die Auswahl beliebig vieler Optionen aus einer Liste möglicher Optionen erwarten, muss in system.prompt_answers für den entsprechenden Message Key hinterlegt werden, welche Optionen ausgewählt werden soll und mit welchem Ergebnis das Prompt beantwortet werden soll.

Dafür existieren zwei Möglichkeiten:

  • Angabe des Null-basierten Index der gewünschten Option

  • Hinterlegen einer Delegate vom Typ MultipleChoiceSelector

Beispiel 42. Beispiel

Im folgenden Beispiel wird in system.prompt_answers ein Tupel hinterlegt, welches an erster Stelle das zu verwendende PromptResult und an zweiter Stelle einen Delegate vom Typ PromptChoiceFilter enthält.

Wenn das Skript ausgeführt wird, wird das Prompt automatisch beantwortet und das Ergebnis im Meldungsfenster ausgegeben. Für die einzelnen Optionen wird dabei mittels Boolean angegeben, ob sie ausgewählt wurden.

# filter function
def my_filter(choice):
    return choice in ("Option 1", "Option 3")

system.process_script_prompts = True
options = ["Option 1", "Option 2", "Option 3"]
system.prompt_answers["message_key_1"] = (PromptResult.OK, PromptChoiceFilter(my_filter))
system.ui.select_many("select many prompt", PromptChoice.OKCancel, PromptResult.OK, options, message_key="message_key_1")


Prompts mit zusätzlichen, anwendungsspezifischen Auswahlmöglichkeiten

Im folgenden Beispiel wird in system.prompt_answers ein Tupel hinterlegt, das an erster Stelle das zu verwendende PromptResult und an zweiter Stelle einen Delegate vom Typ PromptCustomControlValueProvider enthält.

Beispiel 43. Beispiel

Im folgenden Beispiel wird exemplarisch gezeigt, wie ein solcher Delegate implementiert und in system.prompt_answers hinterlegt wird. Die IDs der einzelnen Sub-Controls können mittels system.log_prompt_details ausgelesen werden.

# filter function
def my_filter(control_id):
    if control_id = id_1:
        return "value_for_id_1"
    if control_id = id_2:
        return "value_for_id_2" 
   return None

system.prompt_answers["message_key_1"] = (PromptResult.OK, PromptCustomControlValueProvider(my_filter))