示例和最佳实践 CODESYS Trace 脚本 API
CODESYS Scripting 从 CODESYS Trace
以下示例旨在补充自动生成的 API 文档 CODESYS Scripting 到 CODESYS 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")