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