Skip to main content

Ejemplos y mejores prácticas para la CODESYS Trace API de secuencias de comandos

CODESYS Scripting de CODESYS Trace

Los siguientes ejemplos pretenden ser un complemento a la documentación API generada automáticamente por CODESYS Scripting a CODESYS Trace.

Creando un rastro

Puedes utilizar el CODESYS Trace API de scripts para crear un nuevo Trace.

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

Una tarea llamada Task ya debe existir aquí. Si no existe, entonces esta asignación arroja un ValueError.

traceObject.task_name = "Task" 

En el script, puede especificar en qué tarea se debe ejecutar el seguimiento recién creado.

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

Encontrar y verificar un rastro existente

Para encontrar un seguimiento existente, puede utilizar el project.find método.

Para todos los demás objetos del IScriptObject tipo, .is_trace_object es igual 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"

Agregar y modificar variables de seguimiento

El add_variable() El método es un método simple para agregar un nuevo ScriptTraceVariable y establecer sus propiedades durante la creación.

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

Modificación de la lista de variables de ScriptTrace

Eliminar una variable ScriptTrace específica

En el siguiente fragmento de código, primero se encuentra una variable con el nombre especificado y luego se elimina del 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)    

Modificar la configuración de grabación

Configuración de la resolución (ms/μs) del registro de trazas

El siguiente fragmento de código se basa en "Creando un rastro" fragmento.

traceObject.resolution = Resolution.MicroSeconds

Usar Resolution.MilliSeconds si desea grabar en base a milisegundos.

Configuración de la condición de grabación

El siguiente fragmento de código se basa en "Creando un rastro" fragmento.

traceObject.record_condition = "PLC_PRG.bDoRecord"

Establecer un comentario

El siguiente fragmento de código se basa en "Creando un rastro" fragmento.

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

Configuración de la opción de inicio automático

El siguiente fragmento de código se basa en "Creando un rastro" fragmento.

traceObject.auto_start = True

Configurar la opción para grabar solo en cada enésimo ciclo

El siguiente fragmento de código se basa en "Creando un rastro" fragmento.

traceObject.every_n_cycles = 10

Diagramas y sus variables

Crear un diagrama de ScriptTrace con todas las variables de ScriptTrace

El siguiente script es un ejemplo para crear un diagrama simple donde se utilizan todas las variables.

Primero, se crean un objeto ScriptTrace y algunas variables de 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))

A continuación, se crea un diagrama de ScriptTrace y luego se agregan todas las variables de ScriptTrace.

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

Crear un diagrama de ScriptTrace por variable de ScriptTrace

El siguiente método de Python toma un objeto ScriptTrace y agrega un diagrama por variable 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

Copiar la configuración de un diagrama de ScriptTrace

El siguiente script muestra cómo modificar y copiar la configuración de un diagrama de 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])

Manejo en línea de rastreo

Descargar e iniciar Trace

El siguiente fragmento de código encuentra el Trace rastro de la Application aplicación, la descarga y la inicia.

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

Guardar el seguimiento en un archivo

El siguiente fragmento de código se basa en "Descargar e iniciar Trace" fragmento.

Se debe detener un seguimiento antes de poder guardarlo. Esto se puede hacer alcanzando la condición de activación o mediante una llamada explícita de stop().

Se supone que ya se está ejecutando un seguimiento.

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

Consultar información diversa sobre el registro de seguimiento.

El siguiente fragmento de código se basa en "Descargar e iniciar Trace" fragmento.

Se supone que ya se está ejecutando un seguimiento.

print("Packet State: {}".format(editor.get_packet_state()))
print("Trace started at {} (absolute timestamp)".format(editor.get_trace_start_timetamp()))

Manejo del disparador

Configurar un disparador 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

El nivel de activación solo es necesario para variables de activación numéricas. Sin embargo, es un buen estilo de codificación establecer explícitamente el disparador en None.

traceObject.trigger_level = None

Configurar un disparador numérico

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

Si la variable desencadenante es de tipo REAL o LREAL, entonces el nivel de activación también se puede especificar como un número de punto flotante (por ejemplo, 80.5).

traceObject.trigger_level = 80

Esperando el disparo y guardando los datos grabados

El siguiente fragmento de código se basa en "Descargar e iniciar Trace" fragmento y "Configuración de un activador *".

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

Consultar información de marca de tiempo después de alcanzar el disparador

El siguiente fragmento de código se basa en "Descargar e iniciar Trace" fragmento y "Configuración de un activador *".

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

Reanudar la grabación de seguimiento después de alcanzar el activador

El siguiente fragmento de código se basa en "Descargar e iniciar Trace" fragmento y "Configuración de un activador *".

editor.reset_trigger()

Seguimiento del dispositivo

Crear un seguimiento de dispositivo

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

Consultar los registros de seguimiento actuales en el dispositivo

El siguiente fragmento de código se basa en "Crear un seguimiento de dispositivo" fragmento.

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

Para trazas de aplicación, el resultado de get_online_traces contiene sólo rastros de la aplicación.

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

Cargar un seguimiento existente como DeviceTrace

El siguiente fragmento de código se basa en "Crear un seguimiento de dispositivo" fragmento.

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