Beispiele und bewährte Praktiken für Scripting API von CODESYS Trace
CODESYS Scripting von CODESYS Trace
Die folgenden Beispiele sind als Ergänzung zur automatisch generierten API-Dokumentation von CODESYS Scripting zu CODESYS Trace zu verstehen.
Trace erstellen
Sie können die CODESYS Trace Scripting API verwenden, um einen neuen Trace erstellen zu lassen.
myApplication = projects.primary.find("Device", "PLC Logic", "Application")[0] traceObject = trace.create(myApplication, "MyTraceName")
Hier muss bereits eine Task mit dem Namen Task
vorhanden sein. Ist dies nicht der Fall, führt die Zuweisung zu einem ValueError
.
traceObject.task_name = "Task"
Sie können im Skript angeben, in welcher Task der neu erstellte Trace ausgeführt werden soll.
myApplication = projects.primary.find("Device", "PLC Logic", "Application")[0] traceObjectWithTaskSet = trace.create(myApplication, "NameOfMySecondTrace", "MainTask") assert traceObjectWithTaskSet.task_name == "MainTask"
Bestehenden Trace finden und verifizieren
Um einen bereits vorhandenen Trace zu finden, können Sie mit der Methode project.find
danach suchen lassen.
Für alle anderen Objekte des Typs IScriptObject
gilt, dass .is_trace_object
gleich FALSE
ist.
foundObjects = projects.primary.find("Device", "PLC Logic", "Application", "MyTraceObject") expectedTraceObject = foundObjects[0] assert expectedTraceObject.is_trace_object, "Could not find trace object with the expected name"
Trace-Variablen hinzufügen und ändern
add_variable()
ist eine einfache Methode, um eine neue ScriptTraceVariable
hinzuzufügen und ihre Eigenschaften während der Erstellung festzulegen.
myTrace = projects.primary.find("Device", "PLC Logic", "Application", "MyTraceObject")[0] addedVariable = myTrace.add_trace_variable(variableName="PLC_PRG.a1", graphColor= 0xff000000, graphType=GraphType.LINES, activateMaxWarning=True, maxWarningArea=9.0, maxColor= 0xffff0000) addedVariable.enabled = False for i in range(2,11): newVariable = myTrace.variable_list.add() newVariable.variable_name = "PLC_PRG.a"+str(i) newVariable.graph_type = GraphType.LINES_CROSSES assert len(myTrace.variable_list) == 10
ScriptTrace-Variablenliste ändern
Spezielle ScriptTrace-Variable entfernen
Im folgenden Codefragment wird eine Variable mit dem angegebenen Namen erst gefunden und dann aus der ScriptTraceVariableList
entfernt.
def remove_variable_by_name(traceObject, variableName): index_to_remove = -1 for variable in traceObject.variable_list: if variable.variable_name == variableName: index_to_remove = traceObject.variable_list.index_of(variable) break if index_to_remove != -1: traceObject.variable_list.remove(index_to_remove)
Aufzeichnungseinstellungen ändern
Auflösung (ms/µs) der Trace-Aufzeichnung einstellen
Das folgende Codefragment basiert auf dem Fragment "Trace erstellen".
traceObject.resolution = Resolution.MicroSeconds
Verwenden Sie Resolution.MilliSeconds
, wenn Sie eine millisekundenbasierte Aufzeichnung wünschen.
Aufzeichnungsbedingung einstellen
Das folgende Codefragment basiert auf dem Fragment "Trace erstellen".
traceObject.record_condition = "PLC_PRG.bDoRecord"
Kommentar einstellen
Das folgende Codefragment basiert auf dem Fragment "Trace erstellen".
traceObject.comment = "This trace records the ..."
AutoStart-Option einstellen
Das folgende Codefragment basiert auf dem Fragment "Trace erstellen".
traceObject.auto_start = True
Option für die Aufzeichnung nur in jedem n-ten Zyklus einstellen
Das folgende Codefragment basiert auf dem Fragment "Trace erstellen".
traceObject.every_n_cycles = 10
Diagramme und deren Variablen
ScriptTrace-Diagramm mit allen ScriptTrace-Variablen erstellen
Das folgende Skript ist ein Beispiel für die Erstellung eines einfachen Diagramms, in dem alle Variablen verwendet werden.
Als erstes werden ein ScriptTrace-Objekt und einige ScriptTrace-Variablen erstellt.
traceObject = projects.primary.find("Device","PLC Logic","Application","Trace")[0] assert traceObject.is_trace_object for i in range(5): traceObject.add_trace_variable(variableName="PLC_PRG.a"+str(i))
Als nächstes werden ein ScriptTrace-Diagramm erstellt und dann alle ScriptTrace-Variablen hinzugefügt.
traceDiagram = traceObject.diagrams.add() for traceVar in traceObject.variable_list: traceDiagram.add_diagram_variable(traceVar)
Ein ScriptTrace-Diagramm pro ScriptTrace-Variable erstellen
Die folgende Python-Methode nimmt ein ScriptTrace-Objekt und fügt ein Diagramm pro ScriptTrace-Variable hinzu.
def one_diagram_per_variable(traceObject): assert traceObject.is_trace_object for traceVar in traceObject.variable_list: diagram = traceObject.diagrams.add(traceVar) diagram.name = traceVar.variable_name
Einstellungen eines ScriptTrace-Diagramms kopieren
Das folgende Skript zeigt, wie die Einstellungen eines ScriptTraceDiagramms geändert und kopiert werden können.
traceObject = projects.primary.find("Device","PLC Logic","Application","Trace")[0] assert traceObject.is_trace_object # apply settings for the first diagram traceObject.diagrams[0].y_axis.mode = AxisScaleMode.FixedLength traceObject.diagrams[0].y_axis.range = 10.0 traceObject.diagrams[0].y_axis.color = 0xffee0000 traceObject.diagrams[0].y_axis.draw_grid = True traceObject.diagrams[0].y_axis.grid_color = 0xffee0000 traceObject.diagrams[0].tickmark_fixed_spacing = True traceObject.diagrams[0].tickmark_fixed_distance = 5.0 traceObject.diagrams[0].tickmark_fixed_subdivisions = 4 # copy the settings from the first diagrams to all other diagrams for i in range(1,len(traceObject.diagrams)) traceObject.diagrams[i].y_axis.copy_from(traceObject.diagrams[0])
Online-Handling des Traces
Trace herunterladen und starten
Das folgende Codefragment findet den Trace Trace
der Applikation Application
, lädt den Trace herunter und startet ihn.
proj = projects.open(r"<Path to the project file>") app = proj.find("Device", "PLC Logic", "Application")[0] with online.create_online_application(app) as onlineapp: traceObject = proj.find("Device", "PLC Logic", "Application", "Trace")[0] onlineapp.login(OnlineChangeOption.Never, True) onlineapp.start() editor = traceObject.open_editor() editor.download() editor.start()
Trace in einer Datei speichern
Das folgende Codefragment basiert auf dem Fragment "Trace herunterladen und starten".
Um den Trace zu speichern, muss er angehalten werden. Das kann entweder durch Erreichen der Triggerbedingung oder durch einen expliziten Aufruf von stop()
erreicht werden.
Es wird davon ausgegangen, dass bereits ein Trace läuft.
editor.stop() editor.save(r"<File path to csv file>")
Verschiedene Informationen zur Trace-Aufzeichnung abfragen
Das folgende Codefragment basiert auf dem Fragment "Trace herunterladen und starten".
Es wird davon ausgegangen, dass bereits ein Trace läuft.
print("Packet State: {}".format(editor.get_packet_state())) print("Trace started at {} (absolute timestamp)".format(editor.get_trace_start_timetamp()))
Trigger-Handling
Booleschen Trigger konfigurieren
traceObject = proj.find("Device", "PLC Logic", "Application", "Trace")[0] traceObject.trigger_variable = "PLC_PRG.bVar" traceObject.trigger_edge = TriggerEdge.Positive traceObject.post_trigger_samples = 20
Der Triggerlevel wird nur für numerische Triggervariablen benötigt. Es ist allerdings guter Codierungsstil, den Trigger explizit auf None
zu setzen
traceObject.trigger_level = None
Numerischen Trigger konfigurieren
traceObject = proj.find("Device", "PLC Logic", "Application", "Trace")[0] traceObject.trigger_variable = "PLC_PRG.iTemperature" traceObject.trigger_edge = TriggerEdge.Positive traceObject.post_trigger_samples = 20
Wenn die Triggervariable vom Typ REAL
oder LREAL
ist, kann der Triggerlevel auch als Gleitpunktzahl angegeben werden, beispielsweise 80.5
.
traceObject.trigger_level = 80
Auf Trigger warten und aufgezeichnete Daten speichern
Das folgende Codefragment basiert auf dem Fragment "Trace herunterladen und starten" und "* Trigger konfigurieren".
triggerstate = editor.get_trigger_state() while triggerstate != TriggerState.TriggerReached: system.delay(200) triggerstate = editor.get_trigger_state() editor.save(r"<File path to csv file>")
Zeitstempel-Informationen nach Erreichen des Triggers abfragen
Das folgende Codefragment basiert auf dem Fragment "Trace herunterladen und starten" und "* Trigger konfigurieren".
print("Trigger reached at {} (absolute timestamp)".format(editor.get_trigger_timetamp())) print("Trigger reached at {}".format(editor.get_trigger_startdate())) print("Trace was running {}ms until trigger has been reached".format(editor.get_trigger_timetamp() - editor.get_trace_start_timetamp()))
Trace-Aufzeichnung nach Erreichen des Triggers fortsetzen
Das folgende Codefragmant basiert auf dem Fragment "Trace herunterladen und starten" und "* Trigger konfigurieren".
editor.reset_trigger()
DeviceTrace
DeviceTrace erstellen
myDevice = projects.primary.find("Device")[0] devicetrace = trace.create(myDevice, "DeviceTrace")
Aktuelle Trace-Aufzeichnungen auf dem Gerät abfragen
Das folgende Codefragment basiert auf dem Fragment "DeviceTrace erstellen".
traceObject = projects.primary.find("Device", "DeviceTrace")[0]
Bei Applikations-Traces enthält das Ergebnis von get_online_traces
nur die Traces der Applikation.
# traceObject = projects.primary.find("Device", "PLC Logic", "Application", "Trace")[0] editor = traceObject.open_editor() for tracepacket in editor.get_online_traces(): print(tracepacket)
Vorhandener Trace als DeviceTrace hochladen
Das folgende Codefragment basiert auf dem Fragment "DeviceTrace erstellen".
traceObject = projects.primary.find("Device", "DeviceTrace")[0] editor = traceObject.open_editor() editor.upload_to_device_trace("CpuCoreLoad")