今回はTwinCAT3のTaskについて話しします。
Taskを話す前にまずパソコンの話をしましょう。
パソコンにはMemory・CPU・IOなど様々なハードウェアがあります。
そして上にOperation System(OS)載せてて、OSが直接にHardwareとInterfaceされてる。
- Process管理
- CPUのProcess管理・そしてその時間
- Devices管理
- Devicesとのやりとり、どんなProcessとどんなDevicesとやりとりするか、そしてその時間
- File管理
- Fileのデータ、Location、使用などのTrack
- Memory管理
- Memoryどれくらい使ってるのか、そしてMemoryの解放・振り分け・使用などのTrack
- Security管理
- 未認証の実行・アクセスなどから守るための管理
そしてOSの上に様々なアプリケーションが作られています。記事本とか、Codesys CompilerとかVisual Studioとか…そしてUSERたちがそれらのApplicationsを使いますのイメージです。ここまでも大丈夫ですね。
ここでProcess管理をみましょう。WindowsにはSchedulerというプログラムがあります。
このSchedulerは各Processの実行順番・実行時間などを管理します。いまはProcess#1だなら問題ですが、Process#2も実行したいとするとどうになりますか?
本来はProcess#1を止まり、Process#2を実行開始します。そしてそのとき”Threading”の概念が出てきます。いわゆるParallel processingです。
SchedulerがProcess1を一時停止しProcess2を実行し、そしてまたProcess2を一時停止しまたProcess1を実行します。ですが、問題はOSから該当するProcessかどれくらい実行するか・一時停止かは誰もわかりません。
Factory Automationでは、例えばMotion Controlの中にいきなり制御中に止って別のProcessやると、予想にもつかない結果になると繋がります。なので、各Processには振り分ける処理時間を”確定”する必要がありますよね。
でもSchedulerはどう決まるんですか?それは色々なきめるルールがありますね。例えばFIFO(First in First Out)、Manual方法、優先順位で決める、最短タスク時間など…
*Windows10はMultiLevel Feedback queueがあります。
プログラムには開始点(Entry Point)と終了点(End Point)があり、例えば以下のFor Loopのプログラムみますと、途中で別のProcessが入ったらそのプログラムのLoopから一旦止めて、Windowsが現在の状態を保存し別のProcessから切り替えしたら状態を戻り、また再実行することになります。
その動作はContext switchingといいます。
#include <stdio.h> int main(void) for (i=0;i<10;i++) { printf(“Hello world.”); } |
大部分のOSはコードを実行するとき、User ModeとKenral Modeに分かられています。CPUが”Ring”というOperationがあり、そのRingの中に実行する命令などが決められています。
Ring0はKernel Modeで、直接ハードウェアにアクセスします。中にTwiCAT Scheduler、IO Field Bus(EtherCAT,Profinet..直接にNetwork Portにアクセス、Telegramの送通信)、Motion制御などのTaskをやります。
Ring3はUser Modeです。例えばWindowsのアプリケーションとか、TwinCATのHMIとか。
そのコンセプトはRing3のアプリケーションがなにか不具合あってもシステム全体に影響に与えないようになるメリットがあります。そしてUser Modeのアプリケーションが直接にRing0のKernel ModeにInterfaceすることができません。
TwinCATはReal-time extension to WindowsなのでKernel Modeで実行します。なので、Real-time Scheduler・Parallel実行・Hardware直接アクセスすることができます。
例えば、以下のように2つのCoreがあります。
Core1はTwinCAT Taskで、Core2はWindows Taskだと構成されています。
TwinCATは先も書いてますが、PLCプログラム・Montion Control・Field BusなどのRT Taskを実行しますね。そして最後のIdle TimeはCycle Timeの設定より変わりますーいわゆるCycle Time-Read Input+Task1+Task2+Write Output後の余り時間になります。
ここで注意するのはPLCプログラムはCycle Time以内に完了しないとだめのことです。そのため、TwinCATにはReal-TimeのPerformanceを図るツールも用意しています。
そしてWindowsのアプリケーションはそもそもCore1をみないし、アクセスしません。(理想上)
最後の説明はみんなさんもわかるだと思いますが、Core1はまずField Busからの入力を読み・PLCプログラムのTaskを実行・そして最後Field Bus経由して出力下書くのような動きします。そしてまたRead Inputから始まるのように無限While-loopです。
TwinCATはTwinCAT TaskとWindowsを1つのCoreを共有することもできます。それは”Share core Configurations”です。Share CoreをするとRuntimeの中にReal-time ModeとNon-Real Time Modeを切り替え、Windowsからもアクセスできるようにします。
まず、TwinCAT SchedulerがWindowsをPauseし、TwinCAT Taskに処理する時間を与える。Read Inputする前Tickが発生します。RuntimeをReal-time Modeに切り替えます。Real-timeのTaskがすべて終わったらWindows Modeに切り替え、Windowのアプリケーションを実行します。最後はまたReal-time Modeに戻ります。つまりもう一回のTick。
実際TwinCATのプロジェクトでなん%のソースをWindowsに残るを設定することができ、もし90%を設定したら、Base Timeの90%がReal-time Modeで残りの最低10%がWindowsになる、のイメージです。そしてReal-timeのTaskが早めに終わったら待たずにWindows もでに切り替えるの特徴もあります。(もちろんTask1と2は毎回も同じのCycle Timeとは限りません、Task2はなにかしらの条件でいっきり計算が大量に発生するかもしれませんし。)
ここで注意するのはもしBase Time=1ms、Cycle Time=10msなら、TwinCAT Taskは10Ticksで1回実行することになります。TwinCAT Runtimeは1msことにまだ実行してないのReal-Time Taskがあるかどうかを確認するから。
最後に、このShare Coreのコンセプトの中に、TwinCAT SchedulerでReal-Time TaskがこのBase Timeの中の最高使用率がリミットされています。これは90%です(せめてOSには10%の時間を割りあげる)。
補足ですが、切り替えるときにも時間がかかり、その分のPerformanceに影響があります。
逆に、該当するCoreはTwinCAT Taskだけなら、それは”Isolated Core”といいます。なのでOSとCPUの間にDouble Tickの切り替え問題がなくなります。
実際にはあなたのアプリケーションによりますが、例えば1CoreはMotion制御専用で、もう1CoreはVision専用とか自由に決めます。
はーい、お疲れ様です。