Skip to main content

Exemples et bonnes pratiques pour le CODESYS Trace API de script

CODESYS Scripting depuis CODESYS Trace

Les exemples suivants sont destinés à compléter la documentation API générée automatiquement à partir de CODESYS Scripting à CODESYS Trace.

Créer une trace

Vous pouvez utiliser le CODESYS Trace API de script pour créer une nouvelle trace.

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

Une tâche nommée Task doit déjà exister ici. S'il n'existe pas, cette affectation génère une ValueError.

traceObject.task_name = "Task" 

Dans le script, vous pouvez spécifier dans quelle tâche la trace nouvellement créée doit être exécutée.

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

Recherche et vérification d'une trace existante

Pour retrouver une trace existante, vous pouvez utiliser le project.find méthode.

Pour tous les autres objets du IScriptObject taper, .is_trace_object équivaut à 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"

Ajout et modification de variables de trace

Le add_variable() est une méthode simple pour ajouter un nouveau ScriptTraceVariable et définissez ses propriétés lors de la création.

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

Modification de la liste des variables ScriptTrace

Suppression d'une variable ScriptTrace spécifique

Dans l'extrait de code suivant, une variable portant le nom spécifié est d'abord trouvée, puis supprimée du 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)    

Modification des paramètres d'enregistrement

Réglage de la résolution (ms/µs) de l'enregistrement de trace

L'extrait de code suivant est basé sur le "Créer une trace" extrait.

traceObject.resolution = Resolution.MicroSeconds

Utiliser Resolution.MilliSeconds si vous souhaitez un enregistrement basé sur des millisecondes.

Définition des conditions d'enregistrement

L'extrait de code suivant est basé sur le "Créer une trace" extrait.

traceObject.record_condition = "PLC_PRG.bDoRecord"

Définir un commentaire

L'extrait de code suivant est basé sur le "Créer une trace" extrait.

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

Définition de l'option de démarrage automatique

L'extrait de code suivant est basé sur le "Créer une trace" extrait.

traceObject.auto_start = True

Définition de l'option d'enregistrement uniquement tous les n-ièmes cycles

L'extrait de code suivant est basé sur le "Créer une trace" extrait.

traceObject.every_n_cycles = 10

Diagrammes et leurs variables

Création d'un diagramme ScriptTrace avec toutes les variables ScriptTrace

Le script suivant est un exemple de création d'un diagramme simple dans lequel toutes les variables sont utilisées.

Tout d'abord, un objet ScriptTrace et certaines variables ScriptTrace sont créés.

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

Ensuite, un diagramme ScriptTrace est créé, puis toutes les variables ScriptTrace sont ajoutées.

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

Création d'un diagramme ScriptTrace par variable ScriptTrace

La méthode Python suivante prend un objet ScriptTrace et ajoute un diagramme par 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

Copie des paramètres d'un diagramme ScriptTrace

Le script suivant montre comment modifier et copier les paramètres d'un diagramme 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])

Traitement en ligne de la trace

Téléchargement et démarrage de Trace

L'extrait de code suivant trouve le Trace trace de la Application l'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 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 par un appel explicite de stop().

On suppose qu'une trace est déjà en cours d'exécution.

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

Interrogation de diverses informations sur l'enregistrement de trace

L'extrait de code suivant est basé sur le "Téléchargement et démarrage de Trace" extrait.

On suppose qu'une trace est déjà en cours d'exécution.

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

Gestion des déclencheurs

Configurer un déclencheur booléen

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

Le niveau de déclenchement est requis uniquement pour les variables de déclenchement numériques. Cependant, il est judicieux de définir explicitement le déclencheur sur None.

traceObject.trigger_level = None

Configurer un déclencheur numérique

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 de déclenchement est de type REAL ou LREAL, le niveau de déclenchement peut également être spécifié sous la forme d'un nombre à virgule flottante (par exemple, 80.5).

traceObject.trigger_level = 80

Attendre le déclencheur et sauvegarder les données enregistrées

L'extrait de code suivant est basé sur le "Téléchargement et démarrage de Trace" extrait 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>")

Interroger les informations d'horodatage après avoir atteint le déclencheur

L'extrait de code suivant est basé sur le "Téléchargement et démarrage de Trace" extrait et "Configuration d'un déclencheur *".

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 de trace après avoir atteint le déclencheur

L'extrait de code suivant est basé sur le "Téléchargement et démarrage de Trace" extrait et "Configuration d'un déclencheur *".

editor.reset_trigger()

Suivi de l'appareil

Création d'un DeviceTrace

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

Interroger les enregistrements de trace actuels sur l'appareil

L'extrait de code suivant est basé sur le "Création d'un DeviceTrace" extrait.

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

Pour les traces d'application, le résultat de get_online_traces ne contient que des traces de l'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'une trace existante en tant que DeviceTrace

L'extrait de code suivant est basé sur le "Création d'un DeviceTrace" extrait.

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