Skip to main content

Esempi e buone pratiche per CODESYS Trace API di scripting

CODESYS Scripting da CODESYS Trace

I seguenti esempi sono intesi come supplemento alla documentazione API generata automaticamente da CODESYS Scripting a CODESYS Trace.

Creazione di una traccia

Puoi usare il CODESYS Trace API di scripting per creare una nuova traccia.

myApplication = projects.primary.find("Device", "PLC Logic", "Application")[0]
traceObject = trace.create(myApplication, "MyTraceName")

Un'attività denominata Task deve già esistere qui. Se non esiste, questo compito genera a ValueError.

traceObject.task_name = "Task" 

Nello script è possibile specificare in quale attività deve essere eseguita la traccia appena creata.

myApplication = projects.primary.find("Device", "PLC Logic", "Application")[0]
traceObjectWithTaskSet = trace.create(myApplication, "NameOfMySecondTrace", "MainTask")
assert traceObjectWithTaskSet.task_name == "MainTask"

Trovare e verificare una traccia esistente

Per trovare una traccia esistente, puoi utilizzare il file project.find metodo.

Per tutti gli altri oggetti del IScriptObject tipo, .is_trace_object equivale FALSE.

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"

Aggiunta e modifica di variabili di traccia

Il add_variable() metodo è un metodo semplice per aggiungere un nuovo file ScriptTraceVariable e impostarne le proprietà durante la creazione.

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

Modifica dell'elenco delle variabili ScriptTrace

Rimozione di una variabile ScriptTrace specifica

Nel seguente frammento di codice viene prima trovata una variabile con il nome specificato e poi rimossa dal file ScriptTraceVariableList.

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 "Creazione di una traccia" frammento.

traceObject.resolution = Resolution.MicroSeconds

Utilizzo Resolution.MilliSeconds se vuoi registrare in base ai millisecondi.

Impostazione delle condizioni di registrazione

Il seguente frammento di codice è basato su "Creazione di una traccia" frammento.

traceObject.record_condition = "PLC_PRG.bDoRecord"

Impostazione di un commento

Il seguente frammento di codice è basato su "Creazione di una traccia" frammento.

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

Impostazione dell'opzione di avvio automatico

Il seguente frammento di codice è basato su "Creazione di una traccia" frammento.

traceObject.auto_start = True

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

Il seguente frammento di codice è basato su "Creazione di una traccia" frammento.

traceObject.every_n_cycles = 10

Diagrammi e loro variabili

Creazione di un diagramma ScriptTrace con tutte le variabili ScriptTrace

Lo script seguente è un esempio per creare un diagramma semplice in cui vengono utilizzate tutte le variabili.

Innanzitutto vengono creati un oggetto ScriptTrace e alcune variabili ScriptTrace.

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

Successivamente, viene creato un diagramma ScriptTrace e quindi vengono aggiunte tutte le variabili ScriptTrace.

traceDiagram = traceObject.diagrams.add()
for traceVar in traceObject.variable_list:
    traceDiagram.add_diagram_variable(traceVar)

Creazione di un diagramma ScriptTrace per variabile ScriptTrace

Il seguente metodo Python accetta un oggetto ScriptTrace e aggiunge un diagramma per variabile ScriptTrace.

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 diagramma ScriptTrace

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

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 in linea della traccia

Download e avvio di Trace

Il seguente frammento di codice trova il file Trace traccia del Application l'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()

Salvataggio della traccia in un file

Il seguente frammento di codice è basato su "Download e avvio di Trace" frammento.

Una traccia deve essere interrotta prima di poter essere salvata. Questo può essere fatto raggiungendo la condizione di trigger o tramite una chiamata esplicita di stop().

Si presuppone che una traccia sia già in esecuzione.

editor.stop()
editor.save(r"<File path to csv file>")

Interrogazione di varie informazioni sulla registrazione della traccia

Il seguente frammento di codice è basato su "Download e avvio di Trace" frammento.

Si presuppone che una traccia sia già in esecuzione.

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 trigger booleano

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

Il livello di trigger è richiesto solo per le variabili di trigger numeriche. Tuttavia, è consigliabile impostare in modo esplicito il trigger su uno stile di codifica 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.Positive
traceObject.post_trigger_samples = 20

Se la variabile trigger è di tipo REAL O LREAL, il livello di trigger può essere specificato anche come numero a virgola mobile (ad esempio, 80.5).

traceObject.trigger_level = 80

In attesa del trigger e salvataggio dei dati registrati

Il seguente frammento di codice è basato su "Download e avvio di Trace" 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 aver raggiunto il trigger

Il seguente frammento di codice è basato su "Download e avvio di Trace" 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 è basato su "Download e avvio di Trace" e "Configurazione di un * trigger".

editor.reset_trigger()

Traccia del dispositivo

Creazione di un DeviceTrace

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

Interrogazione delle registrazioni Trace attuali sul dispositivo

Il seguente frammento di codice è basato su "Creazione di un DeviceTrace" frammento.

traceObject = projects.primary.find("Device", "DeviceTrace")[0]

Per le tracce dell'applicazione, il risultato di get_online_traces contiene solo tracce dell'applicazione.

# traceObject = projects.primary.find("Device", "PLC Logic", "Application", "Trace")[0]
editor = traceObject.open_editor()
for tracepacket in editor.get_online_traces():
    print(tracepacket)

Caricamento di una traccia esistente come DeviceTrace

Il seguente frammento di codice è basato su "Creazione di un DeviceTrace" frammento.

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