Skip to main content

トレーススクリプトインターフェイスの使用

ザル CODESYS 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"

既存のトレースの検索と検証

# 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

トレース変数の追加と変更

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

の変更 ScriptTrace 変数リスト

特定のものを削除する ScriptTrace 変数

次のコードスニペットは、指定された名前の変数を検索し、から削除します。 ScriptTrace 変数リスト。

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
# Use Resolution.MilliSeconds if you want to have a trace recording based on 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 変数

次のスクリプトは、簡単な図とその変数を作成する方法を示しています。

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

の作成 ScriptTrace 1 つあたりのダイアグラム ScriptTrace 変数

次の Python メソッドには 1 つ必要です。 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 ダイアグラム。

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

トレースのオンライン処理

トレースのダウンロードと開始

次のコードスニペットは 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()

トレースをファイルに保存する

次のコードスニペットは、 トレースのダウンロードと開始 スニペット。トレースは保存する前に停止する必要があります。そのためには、トリガー条件に達するか、明示的に以下を呼び出します stop()

# We assume, that we have an already running trace
editor.stop()
editor.save(r"<File path to csv file>")

トレース記録のためのさまざまな情報のクエリ

次のコードスニペットは、 トレースのダウンロードと開始 スニペット。

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

トリガーハンドリング

の設定中 BOOL トリガー

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

数値トリガーの設定

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

トリガーを待って記録されたデータを保存する

次のコードスニペットは、「Configuring a」に基づいています。 BOOL-triggers」および「* トリガーの設定」スニペット。

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

トリガーに到達した後のタイムスタンプ情報のクエリ

次のコードスニペットは、「Configuring a」に基づいています。 BOOL-トリガー」と「* トリガーの設定」スニペット。

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

トリガーに到達した後にトレースの記録を再開する

次のコードスニペットは、「Configuring a」に基づいています。 BOOL-トリガー」と「* トリガーの設定」スニペット。

editor.reset_trigger()

デバイストレース

の作成 DeviceTrace

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

デバイスの現在のトレース記録を照会する

次のコードスニペットは、「Create a」に基づいています。 DeviceTrace「スニペット。

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)

既存のレコーディングをにダウンロードする DeviceTrace

次のコードスニペットは、「Create a」に基づいています。 DeviceTrace「スニペット。

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

で機能しないもの DeviceTrace

  • へのアクセス traceobject.variable_list

  • を使用したトレース変数の作成 traceobject.add_variable())

  • へのアクセス traceobject.diagrams