Skip to main content

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