Utilisation de l'interface Trace Scripting
Le CODESYS Trace module complémentaire fournit une interface de script. Vous trouverez ci-dessous des exemples d'utilisation de cette interface.
Création d'une trace
# 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"
Recherche et vérification des traces existantes
# 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
Ajouter et modifier des variables de trace
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
Changer le ScriptTrace
liste de variables
Supprimer un élément spécifique ScriptTrace
variable
L'extrait de code suivant recherche la variable portant le nom spécifié et la supprime du ScriptTrace
liste de variables.
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)
Modification des paramètres d'enregistrement
Réglage de la résolution (ms/µs) de l'enregistrement des traces
L'extrait de code suivant est basé sur le ??? extrait.
traceObject.resolution = Resolution.MicroSeconds # Use Resolution.MilliSeconds if you want to have a trace recording based on milliseconds
Réglage des conditions d'enregistrement
L'extrait de code suivant est basé sur le ??? extrait.
traceObject.record_condition = "PLC_PRG.bDoRecord"
Paramétrer le commentaire
L'extrait de code suivant est basé sur le ??? extrait.
traceObject.comment = "This trace records the ..."
Configuration de l'option de démarrage automatique
L'extrait de code suivant est basé sur le ??? extrait.
traceObject.auto_start = True
Configuration de l'option permettant d'enregistrer uniquement tous les n-ièmes cycles
L'extrait de code suivant est basé sur le ??? extrait.
traceObject.every_n_cycles = 10
Les diagrammes et leurs variables
Création d'un ScriptTrace
tableau avec tous ScriptTrace
variables
Le script suivant montre comment créer un diagramme simple et ses variables.
# 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)
Création d'un ScriptTrace
schéma pour ScriptTrace
variable
La méthode Python suivante nécessite une ScriptTrace
objet et ajoute un diagramme par ScriptTrace
variable.
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
Copier les paramètres d'un ScriptTrace
Schéma
Le script suivant montre comment modifier et copier les paramètres d'un ScriptTrace
schéma.
# 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])
Gestion en ligne de Trace
Téléchargement et démarrage de la trace
L'extrait de code suivant permet de trouver le Trace
trace du Application
application, la télécharge et la démarre.
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()
Enregistrer la trace dans un fichier
L'extrait de code suivant est basé sur le Téléchargement et démarrage de la trace extrait. Une trace doit être arrêtée avant de pouvoir être enregistrée. Cela peut être fait soit en atteignant la condition de déclenchement, soit en appelant explicitement stop()
.
# We assume, that we have an already running trace editor.stop() editor.save(r"<File path to csv file>")
Interrogation de diverses informations pour l'enregistrement des traces
L'extrait de code suivant est basé sur le Téléchargement et démarrage de la trace extrait.
# 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()))
Gestion des déclencheurs
Configuration d'un BOOL
déclencheur
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
Configuration d'un déclencheur numérique
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
Attendre un déclenchement et enregistrer les données enregistrées
L'extrait de code suivant est basé sur la « Configuration d'un BOOL
extraits de code « -triggers » et « Configuration d'un déclencheur * ».
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>")
Interrogation des informations d'horodatage une fois que le déclencheur a été atteint
L'extrait de code suivant est basé sur la « Configuration d'un BOOL
extraits de code « -Trigger » et « Configuration d'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()))
Reprise de l'enregistrement des traces après avoir atteint le déclencheur
L'extrait de code suivant est basé sur la « Configuration d'un BOOL
extraits de code « -Trigger » et « Configuration d'un * Trigger ».
editor.reset_trigger()
Suivi de l'appareil
Création d'un DeviceTrace
myDevice = projects.primary.find("Device")[0] devicetrace = trace.create(myDevice, "DeviceTrace")
Interrogation des enregistrements de traces actuels de l'appareil
L'extrait de code suivant est basé sur la commande « Créer un DeviceTrace
« extrait.
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)
Téléchargement d'un enregistrement existant sur DeviceTrace
L'extrait de code suivant est basé sur la commande « Créer un DeviceTrace
« extrait.
traceObject = projects.primary.find("Device", "DeviceTrace")[0] editor = traceObject.open_editor() editor.upload_to_device_trace("CpuCoreLoad")
Qu'est-ce qui ne fonctionne pas avec le DeviceTrace
Accès à
traceobject.variable_list
Création de variables de trace à l'aide
traceobject.add_variable())
Accès à
traceobject.diagrams