Skip to main content

Utilizzo dell'interfaccia Trace Scripting

Le CODESYS Trace il componente aggiuntivo fornisce un'interfaccia di scripting. Di seguito troverai esempi di come utilizzare questa interfaccia

Creazione di una traccia

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

Individuazione e verifica delle tracce esistenti

# 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

Aggiungere e modificare le variabili di traccia

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

Cambiare il ScriptTrace elenco di variabili

Rimuovere uno specifico ScriptTrace variabile

Il seguente frammento di codice trova la variabile con il nome specificato e la rimuove dal ScriptTrace elenco di variabili.

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)

Modifica delle impostazioni di registrazione

Impostazione della risoluzione (ms/µs) della registrazione della traccia

Il seguente frammento di codice è basato su ??? frammento.

traceObject.resolution = Resolution.MicroSeconds
# Use Resolution.MilliSeconds if you want to have a trace recording based on milliseconds

Impostazione delle condizioni di registrazione

Il seguente frammento di codice è basato su ??? frammento.

traceObject.record_condition = "PLC_PRG.bDoRecord"

Impostazione del commento

Il seguente frammento di codice è basato su ??? frammento.

traceObject.comment = "This trace records the ..."

Impostazione dell'opzione di avvio automatico

Il seguente frammento di codice è basato su ??? frammento.

traceObject.auto_start = True

Impostazione dell'opzione per registrare solo ogni n-esimo ciclo

Il seguente frammento di codice è basato su ??? frammento.

traceObject.every_n_cycles = 10

Diagrammi e loro variabili

Creare un ScriptTrace grafico con tutto ScriptTrace variabili

Lo script seguente mostra come creare un diagramma semplice e le relative variabili.

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

Creare un ScriptTrace diagramma per ScriptTrace variabile

Il seguente metodo Python ne richiede uno ScriptTrace oggetto e aggiunge un diagramma per ScriptTrace variabile.

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

Copia delle impostazioni di un ScriptTrace Diagramma

Lo script seguente mostra come modificare e copiare le impostazioni di un ScriptTrace diagramma.

# 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])

Gestione online della traccia

Scaricamento e avvio della traccia

Il seguente frammento di codice trova il Trace traccia del Application applicazione, la scarica e la avvia.

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

Salvare la traccia in un file

Il seguente frammento di codice è basato su Scaricamento e avvio della traccia frammento. Una traccia deve essere interrotta prima di poter essere salvata. Questa operazione può essere eseguita raggiungendo la condizione di attivazione o richiamando esplicitamente stop().

# We assume, that we have an already running trace
editor.stop()
editor.save(r"<File path to csv file>")

Interrogazione di varie informazioni per la registrazione delle tracce

Il seguente frammento di codice è basato su Scaricamento e avvio della traccia frammento.

# 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()))

Gestione dei trigger

Configurazione di un BOOL grilletto

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

Configurazione di un trigger numerico

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

Attesa di un trigger e salvataggio dei dati registrati

Il seguente frammento di codice si basa sulla «Configurazione di un BOOL-triggers» e «Configurazione di un * trigger».

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

Interrogazione delle informazioni sul timestamp dopo il raggiungimento del trigger

Il seguente frammento di codice si basa sulla «Configurazione di un BOOL-Snippet» e «Configurazione di un * Trigger».

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

Ripresa della registrazione della traccia dopo aver raggiunto il trigger

Il seguente frammento di codice si basa sulla «Configurazione di un BOOL-Snippet» e «Configurazione di un * Trigger».

editor.reset_trigger()

Traccia del dispositivo

Creare un DeviceTrace

myDevice = projects.primary.find("Device")[0]
devicetrace = trace.create(myDevice, "DeviceTrace")

Interrogazione delle registrazioni di tracce correnti del dispositivo

Il seguente frammento di codice si basa sul codice «Crea un DeviceTrace« frammento.

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)

Scaricamento di una registrazione esistente su DeviceTrace

Il seguente frammento di codice si basa sul codice «Crea un DeviceTrace« frammento».

traceObject = projects.primary.find("Device", "DeviceTrace")[0]
editor = traceObject.open_editor()
editor.upload_to_device_trace("CpuCoreLoad")

Cosa non funziona con DeviceTrace

  • Accesso a traceobject.variable_list

  • Creazione di variabili di traccia utilizzando traceobject.add_variable())

  • Accesso a traceobject.diagrams