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:
Starten Sie CODESYS.
Wählen Sie den Menübefehl Tools → Scripting → Skriptdatei ausführen.
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.
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_detailsermittelt werden (siehe unten Propertysystem.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.
Es werden die Werte ScriptPromptHandling.LogPrompts und ScriptPromptHandling.ForwardUnknownPrompts zugewiesen.
ScriptPromptHandling.ForwardUnknownPromptslegt fest, dass alle Prompts ohne passenden Eintrag insystem.prompt_answersan den zugrundeliegenden Message Service weitergeleitet werden.ScriptPromptHandling.LogPromptslegt fest, dass für alle Prompts mit Eintrag insystem.prompt_answersim Meldungsfenster ausgegeben wird, mit welchen Werten das Prompt bestätigt wurde.
system.script_prompt_handling = ScriptPromptHandling.LogPrompts | ScriptPromptHandling.ForwardUnknownPrompts
Es werden die Werte ScriptPromptHandling.LogPrompts und ScriptPromptHandling.AlwaysForwardPrompts zugewiesen.
ScriptPromptHandling.AlwaysForwardPromptslegt fest, dass alle Prompts an den zugrundeliegenden Message Service weitergeleitet werden. Passende Einträge in system.prompt_answers werden ignoriert.ScriptPromptHandling.LogPromptshat in diesem Fall keinen Effekt, daScriptPromptHandling.AlwaysForwardPromptsdie 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.
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")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.
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")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_1wird automatisch verarbeitet und das Ergebnis wird in der MessageView ausgegebenDas zweite Prompt mit dem Message Key
message_key_2wird 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
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")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
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.
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))