POUとタスク

POUとは

ユーザプログラム、ファンクション、ファンクションブロックの各要素のことです
これのことです

タスクとは

一連の処理をする塊のことで、その塊にPOUを割付けます
塊は一定の周期で実行するタイプがあり、塊ごとに実行周期と優先順位が設定できます

塊はこんな感じです


POUの割付けはこんな感じです


上記の設定だと1ms周期でProgram0を実行して、10ms周期でprogram1→program2の順番で実行します
(50msの定周期タスク17は空です)

タスクの周期とPOUを割付ける目安

基本的には
プライマリ定周期タスクにプログラムを全部入れて実行してみます
プログラムの起動条件などもONにしたりしてプログラムに負荷をかけてみてください
タスク実行時間モニタを見て実行時間の最大が80%以内であれば問題ないでしょう


プライマリ定周期タスクの周期を伸ばせるなら
プライマリ定周期タスクの周期を伸ばしてみます
[ EtherCATスレーブへの影響 ]
プライマリ定周期タスクの周期を伸ばすとEtherCATの通信周期も連動して伸びるので接続されているスレーブの入出力が伸びてしまいます
サーボやアナログの場合はキメ細かな制御ができなくなったり、精度が悪くなったり、マシンサイクルも伸びる方向になることが懸念されます

表示器が付いているなら
表示器の入出力はそれほど高速性はいらなくて、ボタンなら50msぐらいの反応速度で、表示データの更新速度も50msで更新すれば十分なので、20~50msの定周期タスクを作って、表示器の処理はそちらに入れるようにします

通信処理があるなら
シリアル通信やEthernetで外部機器と接続するときはデータ処理部分が多くなると思うので、そこで時間が伸びるようであれば別のタスクに入れてみます

毎周期計算する必要がなければ
複雑な計算を大量にするときに毎周期する必要がなければ別のタスクに入れてみます

サーボの精度の限界を求めて
サーボ以外の処理はすべてプライマリタスク以外に入れることも...

おまけ 時間のかかる命令

CONCAT
文字列をつなげる命令ですが、どの言語でもこの命令は遅いです
プログラムは長くなりますが大量に文字操作が必要な時はバイト配列で処理するほうが早いです

LrealToFormatString
LREAL型を文字列に変換する命令です
整数型に変換してから文字列に変換するほうが早いです