🐷

CODESYS Example Projectを調べてみた#8.1 (Trend)

2025/03/06に公開

Trend

次回の勉強会まで日があいているので、CODESYSのVisualizationで標準的に使える3つのグラフXY Chart, Trace, Trendのうち最後のTrend機能に関するExample Projectも調べてしまうことにしました。

Trendは、長い期間の時系列データを表示するために適した機能です。以下の表は、3種類の視覚化機能の特徴と適用先をまとめたものです。

機能 主な特徴 使用例・使い所
XY Chart - X軸・Y軸に任意の変数を設定可能
- 2つの変数間の相関を視覚化
- 時間軸に依存しないプロットも可能
- センサー入力 (X) に対する制御出力 (Y) の相関を見る
- 温度と速度、圧力と流量など、2つの値の関係を分析するとき
Trace - ミリ秒単位などの高速サンプリングに対応
- トリガ条件を設定して、特定のタイミングで記録開始・停止が可能
- 大量のデータを扱うため、メモリ使用量に注意が必要
- 制御ループの調整や振動解析など、高速・詳細な波形観察
- 故障発生の瞬間など、特定条件での挙動をトリガーベースで記録・解析
Trend - 時間軸ベースで長期間にわたる値の変化を継続的に記録・可視化
- 高速サンプリングは不要だが、長時間のログ取得に向いている
- 過去データの履歴閲覧や動向分析に適している
- 温度や生産量など、24時間~1週間などの長期推移を把握
- 異常値が出た際に、いつから変化が始まったかを過去にさかのぼって確認

Setup

  1. Example Projectのページから、プロジェクトをインストールします。
  2. プロジェクトを起動し、Update Deviceを実行します。

プログラムの内容

このプロジェクトには、4つのアプリケーションが含まれていました。

  • SimpleTrendExample: サンプル信号3つをTrend要素で視覚化する例
  • LongTermRecording: サンプリング間隔を調整し、長期間データを記録する例
  • ConditionalRecording: 信号がある条件を満たす場合のみデータを記録する例
  • DynamicRecordingIntervalTrendExample: Intervalを動的に変更する例

SimpleTrendExample

メインのプログラムは、GEN FBを使って波形データを生成するだけです。
Trend Recording Manager上の設定は、Record depending on taskになっていました。MainTask(20ms cycle)に対して、10周期ごとに測定する設定になっていました。

SimpleTrendExampleTrend

LongTermRecording

太陽光発電出力をシミュレートするコードが、Simulator(PRG)として実行されます。このプログラムの中で、SysTimeRtcGetなどが使われていますが、これは、SysTimeRtcライブラリの機能です。

PROGRAM Simulator
VAR
	rCurrentMillis 	: LREAL;
	udiUtcTime 		: UDINT;
	udiUtcTimeLocal : UDINT;
	udiResult : RTS_IEC_RESULT;
	strTimeDate 	: SYSTIMEDATE;
	rTemp 			: LREAL;
	rCurrentPower 	: LREAL;
END_VAR
VAR CONSTANT
	crDayMillis : LREAL := 24 * 60 * 60 * 1000;
END_VAR

// Get the current milliseconds of the day
udiUtcTime := SysTimeRtcGet(udiResult);
udiResult := SysTimeRtcConvertUtcToLocal(udiUtcTime, udiUtcTimeLocal);
udiResult := SysTimeRtcConvertUtcToDate(udiUtcTimeLocal, strTimeDate);
rCurrentMillis := strTimeDate.wHour * 60 * 60 * 1000 + strTimeDate.wMinute * 60 * 1000 + strTimeDate.wSecond * 1000;

// Simulate the power of a solar station
rTemp := - COS(2 * 3.14 * rCurrentMillis / crDayMillis) * 1000;
IF rTemp > 0 THEN
	// Day
	rCurrentPower := rTemp + 20 * PseudoRnd(); // Add some noise to the signal.
ELSE
	// Night
	rCurrentPower := 20 * PseudoRnd(); // Add some noise to the signal.
END_IF

SimpleTrendExampleと異なり、Trend Recording Manager上のRecord Settingsで、測定間隔がMainTaskの1000周期ごと(=20s周期)に設定されていました。また、TrendStorage項目も大きな値が設定されており、Store every N millisecods = 60000, Maximum storage size=20MBとなっていました。

ConditionalRecording

PLC_PRG内で、xRecord: BOOLの条件判定をしています。

PLC_PRG line4
xRecord := rSignalToRecord1 >= 20;

Trend Recording ManagerのRecord Settings > Common SettingsのRecord ConditionにPLC_PRG.xRecordを設定することで、条件成立時のみ記録されるようになります。

DynamicRecordingIntervalTrendExample

SimpleTrendExampleの測定周期を運転中に変更可能にしたバージョンです。

Text variable中で周期を計算して画面に表示しています。

最初、PLC_PRG中のSlowDownFactorがTrendのどこに反映されているかわからなかったのですが、下の図の赤枠部分が最初空欄になっていました。名前から察するにここに変数を設定すればよいのだと思います。

実際に動かしてみて、factorに大きい数値を入れると画面にプロットされる周期がだんだん遅くなることが確認できました。0も入力することができたのですが、プロットがとまったりすることはなく、1に設定した場合と変わりませんでした。

気づきと学び

  • 日付やTZを扱う時、SysTimeRtcライブラリが使える。
  • text variableの中で、数値計算処理ができる。
  • サンプリング周期は、slowdown factorを使って動的に変えられる。

まとめ

  • きれいに表示するならTraceの方が向いてる。
  • 長期データ保存するならTrendが楽。
  • Recordingの設定項目については、Online Helpを参照

Discussion