Skip to main content

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