EcoStruxure Machine Expert-Skripterstellung – Python-API
EcoStruxure Machine Expert stellt eine Python-API zur Verfügung, die Sie für EcoStruxure Machine Expert-Skripte verwenden können.
Die Python-API besteht aus zwei Kategorien:
oPython-Standard-API und Python-Module/-Pakete
oEcoStruxure Machine Expert Python-API
Die Python-Standard-API (für Strings, Arrays, Dateien usw.) ist Teil der EcoStruxure Machine Expert-Installation. Detaillierte Informationen finden Sie im Internet (z. B. unter https://docs.python.org/3/). Sie können Ihre EcoStruxure Machine Expert-Installation um Python-Module und -Pakete ergänzen, die im Internet verfügbar sind.
Um EcoStruxure Machine Expert zu automatisieren, ist auch eine EcoStruxure Machine Expert Python-API Teil der EcoStruxure Machine Expert-Installation. Diese wird beispielsweise verwendet, um ein Projekt zu öffnen oder zu schließen, den Projektinhalt zu ändern oder ein Projekt zu kompilieren und auf eine Steuerung zu laden.
Das Konzept der EcoStruxure Machine Expert Python-API wird in diesem Kapitel erläutert. Weitere Informationen bieten auch die Skript-Engine-Beispiele. Um die EcoStruxure Machine Expert Python-API kennenzulernen, lesen Sie im Kapitel Überblick über die EcoStruxure Machine Expert-API nach.
Detaillierte Methoden-/Funktionsbeschreibungen oder die zugehörigen Parameterbeschreibungen finden Sie im Abschnitt zur Skripterstellungs-Engine im Teil Software der Online-Hilfe von EcoStruxure Machine Expert.
Das Konzept der EcoStruxure Machine Expert Python-API und die Grundlage der objektorientierten Programmierung
Damit Sie die passenden API-Methoden für Ihre Python-Skripte finden, müssen Sie das Konzept der EcoStruxure Machine Expert Python-API kennen und wissen, wie sie in die Skript-Engine integriert ist (Skriptausführung). Das grundlegende Konzept hinter der EcoStruxure Machine Expert Python-API ist ein objektorientierter Ansatz. Object-Oriented Programming oder objektorientierte Programmierung (OOP) ist ein auf zwei Konzepten basierendes Paradigma: Objekte und Code. Objekte sind Datenstrukturen, die Daten in Form von Feldern (oder Attributen) enthalten. Code steht in Form von Prozeduren (oder Methoden) zur Verfügung. Die Prozeduren eines Objekts können auf die Datenfelder, mit denen sie verbunden sind, zugreifen und diese verändern. Computerprogramme, die gemäß OOP entwickelt werden, bestehen aus interagierenden Objekten.
Die Herausforderung beim Schreiben von Skripten besteht in der Applikation der EcoStruxure Machine Expert Python-API-Dokumentation auf die richtigen Objekte, damit die Prozeduren aufgerufen werden können.
Vordefinierte Variablen und Typen
Wenn Sie ein Skript ausführen oder die REPL verwenden (in LogicBuilderShell.exe oder der Ansicht Scripting Immediate), haben Sie einen Hauptcode mit vordefinierten Variablen (und Typen). Diese können Sie in Ihrem Skript als Startpunkt für die EcoStruxure Machine Expert Python-API wählen. Um die verfügbaren vordefinierten Variablen im Hauptskriptbereich aufzuführen, starten Sie LogicBuilderShell.exe, und führen Sie dir() aus.
Liste der vordefinierten Variablen durch Ausführen von dir():
>>> dir()
['AccessRight', 'ApplicationState', 'ArchiveCategories', 'ChannelType', 'Compile
rMessage', 'ConflictResolve', 'ConnectorRole', 'CredentialSourceKind', 'DeviceID
', 'DeviceUserManagementFlags', 'DiagType', 'ExportReporter', 'Guid', 'Implement
ationLanguage', 'ImportReporter', 'MultipleChoiceSelector', 'NativeExportReporte
r', 'NativeImportFilter', 'NativeImportHandler', 'NativeImportResolve', 'NativeI
mportResult', 'ObjectPermissionKind', 'OnlineChangeOption', 'OperatingState', 'P
ermissionState', 'ProjectType', 'PromptChoice', 'PromptChoiceFilter', 'PromptHan
dling', 'PromptResult', 'ResetOption', 'SV_DEV', 'SV_POU', 'Severity', 'TimeoutE
xception', 'ValuesFailedException', 'Version', '__SoMachine__', '__builtins__',
'__doc__', '__file__', '__name__', 'communication_settings', 'compiler_settings'
, 'etest_test_provider', 'feature_settings_manager', 'librarymanager', 'libraryp
ackage_service', 'new_project', 'online', 'projects', 'system', 'visualization_s
ettings']
Die vordefinierten Einträge in dieser Liste, die rein aus Kleinbuchstaben bestehen, sind Variablen, die ein Objekt referenzieren, das Methoden oder Felder bereitstellt. Dies ist eine Art globales API, das mit oder ohne geladenes EcoStruxure Machine Expert-Projekt funktioniert.
Beispiel: system, projects oder online.
osystem: Funktion für die Integration in EcoStruxure Machine Expert. Dieses Objekt stellt Funktionen bereit, die in ISystemInterface dokumentiert sind, z. B. den Zugriff auf die Meldungsansicht ausgehend von EcoStruxure Machine Expert oder die Verwendung von ui_present zur Prüfung, ob das Programm im --noUI-Modus ausgeführt wird.
oprojects: Funktion für das Projektmanagement. Dieses Objekt stellt Funktionen bereit, die in IScriptProjects Interface dokumentiert sind, z. B. das Laden von Projekten und Projektarchiven. Darüber hinaus fungiert es als Eingangspunkt für individuelle Projekte.
oonline: Funktion für den Online-Zugriff auf die Steuerung. Sie können die create_online_application-Methode verwenden, um das zutreffende Online-Objekt (dokumentiert in IScriptOnlineApplication) für ein Anwendungsobjekt abzurufen. Dieses Objekt ermöglicht Ihnen die Anmeldung bei einer Steuerung, den Start der Anwendung und das Lesen der Variablenwerte.
Weitere Informationen, siehe den Teil zur API-Referenz des Skript-Engine-Plugins in der Online-Hilfe von EcoStruxure Machine Expert.
Die vordefinierten Einträge in dieser Liste, die mit einem Großbuchstaben beginnen, sind Enumerationen oder Typen/Klassen, die verwendet oder in Ihrem Python-Skript instanziiert werden können. Zum Beispiel DeviceID (Klasse) oder Guid (Klasse) oder PromptChoice (Enumeration).
In der EcoStruxure Machine Expert-Baumstruktur suchen und navigieren
Ein EcoStruxure Machine Expert-Projekt besteht aus Geräten, POUs, DUTs, GVLs usw., die in einer Objektbaumstruktur organisiert sind (z. B. die Gerätebaumstruktur im Logic Builder). Diese Objektstruktur ist die Projektbaumstruktur und mit projects.primary verbunden. In projects.primary können Sie über die API nach Objekte suchen. Dafür gibt es die find(…)-Methode. Sie können innerhalb der Projektbaumstruktur navigieren, indem Sie beispielsweise die get_children()-Methode einsetzen, um die direkt untergeordneten Objekte (z. B. die Steuerungsgeräte) anzuzeigen. Auf jedem untergeordneten Objekt können Sie erneut get_children() aufrufen, um die wiederum direkt untergeordneten Objekte anzuzeigen usw.
HINWEIS: Die in der Projektbaumstruktur verfügbaren Methoden können sich von Objekt zu Objekt unterscheiden, je nachdem, von welchem Typ sie sind (POU, DUT, GVL, Gerät). Es hat sich bewährt, inspectapi.dir(…) einzusetzen, um die Liste der verfügbaren API-Methoden für ein Objekt anzuzeigen.
Beispiel für die Verwendung einer globalen API-Funktion zum Öffnen eines Projekts:
projects.open("MyProject.project")
Beispiel für das Suchen und Umbenennen eines Objekts in der Projektbaumstruktur (nach dem Laden eines Projekts):
myObject = projects.primary.find("SERCOSIII")[0]
myObject.rename("New_SERCOSIII_Name")
Die Abbildung zeigt das Objekt aus der Projektbaumstruktur in der Benutzeroberfläche sowie die traversierte Projektbaumstruktur, wie von einem Skript ausgegeben:
Beispielskript zum Traversieren der Projektbaumstruktur (wie oben dargestellt):
def print_tree_of_obj(treeobj, depth=0, verbose=False):
name = treeobj.get_name(False)
if treeobj.is_device:
deviceid = treeobj.get_device_identification()
details = ""
if verbose == True:
details = " [Device {0}/{1}/{2}]".format(deviceid.type, deviceid.id, deviceid.version)
print("{0} * {1}{2}".format(" "*depth, name, details))
else:
print("{0} * {1}".format(" "*depth, name))
for child in treeobj.get_children(False):
print_tree_of_obj(child, depth+1, verbose)
def print_tree_of_project(pro, verbose=False):
if pro == None:
print("No project open.")
else:
for obj in pro.get_children():
print_tree_of_obj(obj, 0, verbose)
def print_tree(verbose=False):
if projects.primary != None:
print_tree_of_project(projects.primary, verbose)
else:
print("No project open.")
print_tree(True)