Trace-Scripting-Schnittstelle verwenden
Das Add-on CODESYS Trace stellt eine Scripting-Schnittstelle zur Verfügung. Im Folgenden finden Sie Beispiele für die Verwendung dieser Schnittstelle.
Erstellen eines Traces
# a new trace can be created using the toplevel trace api myApplication = projects.primary.find("Device", "PLC Logic", "Application")[0] traceObject = trace.create(myApplication, "MyTraceName") traceObject.task_name = "Task" # a task with the name "Task" should already exist here. If it does not exist, this assignment throws an ValueError.
# the task of the trace can be set during creation myApplication = projects.primary.find("Device", "PLC Logic", "Application")[0] traceObjectWithTaskSet = trace.create(myApplication, "NameOfMySecondTrace", "MainTask") assert traceObjectWithTaskSet.task_name == "MainTask"
Finden und Verifizieren von bestehenden Traces
# finding an existing trace can be done via the project.find method 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" # .is_trace_object is False for all other objects of type IScriptObject
Hinzufügen und Ändern von Trace-Variablen
myTrace = projects.primary.find("Device", "PLC Logic", "Application", "MyTraceObject")[0] # add_variable() is a convenience method to add a new ScriptTraceVariable and set its properties during creation 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
Ändern der ScriptTrace
-Variablenliste
Entfernen einer bestimmten ScriptTrace
-Variablen
Der folgende Codefragment findet die Variable mit dem angegebenen Namen und entfernt diese aus der ScriptTrace
-Variablenliste.
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)
Ändern der Aufzeichnungseinstellungen
Einstellen der Auflösung (ms/µs) der Trace-Aufzeichnung
Der folgende Codefragment basiert auf dem Fragment ???.
traceObject.resolution = Resolution.MicroSeconds # Use Resolution.MilliSeconds if you want to have a trace recording based on milliseconds
Einstellen der Aufzeichnungsbedingung
Der folgende Codefragment basiert auf dem Fragment ???.
traceObject.record_condition = "PLC_PRG.bDoRecord"
Einstellen des Kommentars
Der folgende Codefragment basiert auf dem Fragment ???.
traceObject.comment = "This trace records the ..."
Einstellen der Option Automatischer Start
Der folgende Codefragment basiert auf dem Fragment ???.
traceObject.auto_start = True
Einstellen der Option, nur jeden N-ten Zyklus aufzuzeichnen
Der folgende Codefragment basiert auf dem Fragment ???.
traceObject.every_n_cycles = 10
Diagramme und ihre Variablen
Erstellen eines ScriptTrace
-Diagramms mit allen ScriptTrace
-Variablen
Das folgende Skript verdeutlicht, wie ein einfaches Diagramm und seine Variablen erstellt werden können.
# first we need a ScriptTraceObject and some ScriptTraceVariables 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)) # create one ScriptTraceDiagram and add all ScriptTraceVariables to it traceDiagram = traceObject.diagrams.add() for traceVar in traceObject.variable_list: traceDiagram.add_diagram_variable(traceVar)
Erstellen eines ScriptTrace
-Diagramms pro ScriptTrace
-Variable
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
Kopieren von Einstellungen eines ScriptTrace
-Diagramms
Das folgende Skript zeigt, wie die Einstellungen eines ScriptTrace
-Diagramms geändert und kopiert werden können.
# we assume, that the traceObject already has multiple diagrams 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
Download und Starten des Traces
Das folgende Codefragment findet den Trace Trace
der Applikation Application
, lädt ihn 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()
Speichern des Traces in einer Datei
Das folgende Codefragment basiert auf dem Fragment Download und Starten des Traces. Um den Trace zu speichern, muss er angehalten werden. Dies kann entweder durch Erreichen der Triggerbedingung oder einen expliziten Aufruf von stop()
erfolgen.
# We assume, that we have an already running trace editor.stop() editor.save(r"<File path to csv file>")
Abfragen verschiedener Informationen zur Trace-Aufzeichnung
Das folgende Codefragment basiert auf dem Fragment Download und Starten des Traces.
# We assume, that we have an already running trace print("Packet State: {}".format(editor.get_packet_state())) print("Trace started at {} (absolute timestamp)".format(editor.get_trace_start_timetamp()))
Trigger-Handling
Konfigurieren eines BOOL
-Triggers
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 # The trigger level is only needed for numeric trigger variables. It is a good coding style to set the trigger explicitly to "None" traceObject.trigger_level = None
Konfigurieren eines numerischen Triggers
traceObject = proj.find("Device", "PLC Logic", "Application", "Trace")[0] traceObject.trigger_variable = "PLC_PRG.iTemperature" traceObject.trigger_edge = TriggerEdge.PositivetraceObject.post_trigger_samples = 20 # In case of a trigger variable of REAL or LREAL type it is also possible to specify floating point trigger levels, e.g. 80.5 traceObject.trigger_level = 80
Warten auf Trigger und Speichern der aufgezeichneten Daten
Das folgende Codefragment basiert auf den Fragmenten "Konfigurieren eines BOOL
-Triggers" und "Konfigurieren eines * Triggers“ .
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>")
Abfrage von Zeitstempelinformationen, nachdem der Trigger erreicht wurde
Das folgende Codefragment basiert auf den Fragmenten "Konfigurieren eines BOOL
-Triggers" und „Konfigurieren eines * Triggers“ .
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()))
Fortsetzen der Trace-Aufzeichnung nach Erreichen des Triggers
Das folgende Codefragment basiert auf den Fragmenten "Konfigurieren eines BOOL
-Triggers" und „Konfigurieren eines * Triggers“ .
editor.reset_trigger()
DeviceTrace
Erstellen eines DeviceTrace
myDevice = projects.primary.find("Device")[0] devicetrace = trace.create(myDevice, "DeviceTrace")
Abfrage der aktuellen Trace-Aufzeichnungen des Geräts
Das folgende Codefragment basiert auf dem Fragment "Erstellen eines DeviceTrace
" .
traceObject = projects.primary.find("Device", "DeviceTrace")[0] # for application traces the result of get_online_traces contains only the traces of the application # traceObject = projects.primary.find("Device", "PLC Logic", "Application", "Trace")[0] editor = traceObject.open_editor() for tracepacket in editor.get_online_traces(): print(tracepacket)
Download einer vorhandenen Aufzeichnung auf das DeviceTrace
Das folgende Codefragment basiert auf dem Fragment "Erstellen eines DeviceTrace
".
traceObject = projects.primary.find("Device", "DeviceTrace")[0] editor = traceObject.open_editor() editor.upload_to_device_trace("CpuCoreLoad")
Was mit dem DeviceTrace
nicht funktioniert
Zugriff auf
traceobject.variable_list
Anlegen von Trace-Variablen mittels
traceobject.add_variable())
Zugriff auf
traceobject.diagrams