Skip to main content

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")