Skip to main content

示例和最佳实践 CODESYS Trace 脚本 API

CODESYS ScriptingCODESYS Trace

以下示例旨在补充自动生成的 API 文档 CODESYS ScriptingCODESYS Trace

创建追踪

您可以使用 CODESYS Trace 脚本 API 来创建新的 Trace。

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

名为 Task 必须已经存在。如果不存在,则此分配将抛出 ValueError

traceObject.task_name = "Task" 

在脚本中,您可以指定应在哪个任务中执行新创建的跟踪。

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

查找并验证现有跟踪

要查找现有跟踪,您可以使用 project.find 方法。

对于所有其他对象 IScriptObject 类型, .is_trace_object 等于 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"

添加和修改跟踪变量

add_variable() 方法是一种添加新方法的简单方法 ScriptTraceVariable 并在创建过程中设置其属性。

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

修改 ScriptTrace 变量列表

删除特定的 ScriptTrace 变量

在下面的代码片段中,首先找到具有指定名称的变量,然后将其从 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)    

修改录制设置

设置跟踪记录的分辨率 (ms/µs)

以下代码片段基于“创建追踪“片段。

traceObject.resolution = Resolution.MicroSeconds

使用 Resolution.MilliSeconds 如果您希望基于毫秒进行记录。

设置录音条件

以下代码片段基于“创建追踪“片段。

traceObject.record_condition = "PLC_PRG.bDoRecord"

设置评论

以下代码片段基于“创建追踪“片段。

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

设置自动启动选项

以下代码片段基于“创建追踪“片段。

traceObject.auto_start = True

设置仅在每第 n 个循环中记录的选项

以下代码片段基于“创建追踪“片段。

traceObject.every_n_cycles = 10

图表及其变量

创建一个包含所有 ScriptTrace 变量的 ScriptTrace 图

以下脚本是创建使用所有变量的简单图表的示例。

首先,创建一个 ScriptTrace 对象和一些 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))

接下来,创建一个 ScriptTrace 图表,然后添加所有 ScriptTrace 变量。

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

为每个 ScriptTrace 变量创建一个 ScriptTrace 图

以下 Python 方法采用一个 ScriptTrace 对象并为每个 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

复制 ScriptTrace 图表的设置

以下脚本显示如何修改和复制 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])

在线处理痕迹

下载并启动 Trace

以下代码片段查找 Trace 踪迹 Application 应用程序,下载并启动它。

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

将跟踪保存到文件

以下代码片段基于“下载并启动 Trace“片段。

必须先停止跟踪,然后才能保存它。这可以通过达到触发条件或通过显式调用 stop()

假定跟踪已在运行。

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

查询跟踪记录的各种信息

以下代码片段基于“下载并启动 Trace“片段。

假定跟踪已在运行。

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

触发器处理

配置布尔触发器

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

仅数字触发变量需要触发级别。但是,将触发器明确设置为 None

traceObject.trigger_level = None

配置数字触发器

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

如果触发变量的类型为 REAL 或者 LREAL,则触发级别也可以指定为浮点数(例如, 80.5)。

traceObject.trigger_level = 80

等待触发并保存记录的数据

以下代码片段基于“下载并启动 Trace“片段和“配置*触发器”。

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

达到触发器后查询时间戳信息

以下代码片段基于“下载并启动 Trace“片段和“配置*触发器”。

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

达到触发条件后恢复跟踪记录

以下代码片段基于“下载并启动 Trace“片段和“配置*触发器”。

editor.reset_trigger()

设备追踪

创建 DeviceTrace

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

查询设备上的当前跟踪记录

以下代码片段基于“创建 DeviceTrace“片段。

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

对于应用程序跟踪,结果 get_online_traces 仅包含应用程序的痕迹。

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

将现有跟踪上传为 DeviceTrace

以下代码片段基于“创建 DeviceTrace“片段。

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