PC でリアルタイム処理を実装してみる Part 1 ~Windowsソフトリアルタイム編~

こんにちは、プライムモーション歴1年の中年エンジニア ”モーション太郎” です。

モーションコントロールに欠かせない技術である「リアルタイム制御」ですが、新製品開発のために、
Windows 10 IoT Enterpriseに実装された 「SoftRealTime」を評価することになりました。

弊社のモーションコントローラは、IntervalZero社の「RTX」を使用して、Windows上にリアルタイム環境を構築していますが、Windowsの標準機能である「SoftRealTime」でリアルタイム環境を構築できれば、
「開発のしやすさ向上」や「コストダウン」などが期待できます。

そこで、実際に「SoftRealTime」環境を構築して、リアルタイム性能の検証をおこないました。

環境準備

OSインストール

Windows SoftRealTimeを導入するには、Windows 10 IoT Enterprise LTSC 2021 [21H2]をPCにインストールする必要があります。msdnよりOSイメージをダウンロードしてPCにインストールしました。

また、今回使用したPCの主なスペックは以下です。

項目スペック
CPUIntel (R) Core(TM) i5-14500 2.6 GHz
Memory32.0GB
StorageSSD 2TB (M.2)
NIC driverRealtek Gaming 2.5GbE Family Controller

※UEFI/BIOS設定でIntel-HyperThreadingをOFFにします。

SoftRealTimeの有効化

以下リンクの説明に従ってSoftRealTime環境を構築します。
リアルタイムのパフォーマンスを向上させるためにデバイスを設定する方法 | Microsoft Learn

ポイントは、
① CPUのアイドル状態を無効にする。
② リアルタイムコアに影響を及ぼすサービスの無効化
③ WindowsUpdateの停止/無効化
④ NICからの割り込みをリアルタイムコア以外で処理できるようにRSSを設定する。重要!
です。

上記が完了したら、
Windows IoT CSPのSetRTCoreにリアルタイム実行させるコア番号を指定します。
※SetRTCoresに設定したコア番号よりも大きな番号のすべてのコアがリアルタイム用のコアに設定されます。

CSP階層
WindowsIoT 
    SoftRealTimeProperties     
        SetRTCores

今回は、コア番号を10に設定したので、Core10、Core11、Core12, Core13の4コアがリアルタイム用コアに割り当てられました。
※CPUのアイドル状態を無効にしているため、使用率が常に100%になってしまいます。

SoftRealTimeの動作確認

SoftRealTimeが機能しているかをチェックするために、WindowsPerformanceAnalyzerで各コアが実行しているプロセスを確認します。

コア0~9まではWindowsのプロセスを実行していますが、コア10~13までは一部のプロセス以外は実行していないため、SoftRealTimeが機能していることが確認できます。
SoftRealTimeでは、リアルタイム用に割り当てられたコアで、ユーザープロセスを実行することで、リアルタイム処理を実現します。

一部のリアルタイムコアで動作しているプロセスはMsMpEng.exeでした。リアルタイムコアで実行される想定外のプロセスがあるとリアルタイム性を阻害する要因となります。MsMpEng.exeはWindowsDefender関係のプロセスなので、必要に応じて機能を停止/無効化する必要があるかもしれません。
※今回は実行時間が短くリアルタイム性への影響が少ないことからそのままにしておきます。

リアルタイム性能の検証

SoftRealTimeの環境が構築できたので、実際のアプリケーションを動作させてリアルタイム性能の検証を行います。

テストプログラムの処理フロー

現在弊社ではEtherCATインタフェースを備えた新しいモーションコントローラの開発を行っており、そこで使用するテストプログラムを用いてリアルタイム性の検証を行います。

テストプログラムでは、250us周期で通信をおこなっているEtherCAT通信ボードに対して、250usに1回モータの目標位置を更新します。

テストプログラムの主な処理フローは以下です。
① EtherCAT通信ボードに対してボード側のデータ更新許可ビットがONするのをポーリングする。
② データ更新許可ビットがONしたら目標位置バッファからデータを取得し、ボードに目標位置をWriteする。
③ 次の目標位置を計算し目標位置バッファに格納し、①に戻る。

もしなんらかの要因で処理が250us以上かかってしまうと、モータの目標位置を正しく更新できないため、モータが想定とは異なる動作をしてしまいます。そのため、モーションコントロールには高いリアルタイム性が要求されます。

また、プログラムはリアルタイムコアで動作させる必要があるため、事前に
SetPriorityClass 関数
SetProcessAffinityMask 関数
などで、プログラムを実行するプロセスが動作するコアをリアルタイム用コアに設定し、優先度を最大にする必要があります。

EtherCATとは

EtherCATは、産業用フィールドネットワーク(リアルタイムイーサネット)の一種であり、工場自動化、制御システム、ロボット、モーションコントロール、産業用機器などのFA分野で広く使用されています。EtherCATは、高速かつリアルタイムなデータ通信を実現し、複数のデバイスを一つのネットワーク上で同期して制御することができます。これにより、効率的な制御システムの構築が可能となります。EtherCATは、オープンな標準プロトコルであり、多くの産業用機器メーカーによってサポートされています。

評価結果

実際にSoftRealTime環境でテストプログラムを動作させた結果を以下に示します。

① SoftRealTime環境での動作結果
SoftRealTime環境では、処理間隔が平均値で「249.9us」のところ最大値「273.2us」とおおむね良好な結果でした。
処理時間も最大値と最小値が約10us程度の差しかなく、安定していることから、実際のモーションコントロールに使用可能な性能であると判断できます。

※Timer int. period ⇒ ボードの更新許可ビットがONしてから次のONまでの時間(ポーリングを含む処理時間)
※Timer int. process ⇒ ボードへのWrite動作及び目標位置計算処理の時間  

② 非SoftRealTime環境での動作結果
比較のため、非SoftRealTime環境で動作させたところ、処理間隔が平均値で「251.2us」のところ最大値が「14608.6us」と大きなばらつきが発生しました(当然ですが)。


SoftRealTime環境での動作結果(他のプロセスを動作した場合)
PC(Windows)でリアルタイム制御を行うメリットの一つとして、リアルタイム制御とユーザープログラムを同じ環境(PC)で同時に使用することが可能であることがあげられます。
そこで、普段Windowsで使用するアプリケーションを同時に実行した場合のリアルタイム性についても評価をおこないました。

SSDアクセスのベンチマークソフト及びGPU描画ソフトにて負荷を与えた状態かつ、Youtubeを再生した状態であってもリアルタイム性が大きく落ちることなく動作することができました。

ただし、使用するアプリケーションやサービスがリアルタイムコアを使用するような設定(例 VisualStudioのビルドをマルチプロセッサで実行するなど)になっている場合は、リアルタイム性を阻害する要因となるため、実際の運用では使用する非リアルタイムのアプリケーションがリアルタイムコアで動作しないように設定・管理する必要があります。

まとめ

今回はWindows 10 IoT Enterpriseに実装されているSoftRealTimeのリアルタイム性について評価を行いました。

結論としては、
基本的な性能としては、高いリアルタイム性が要求されるモーションコントロールでも使用可能なリアルタイム性能を実現できました。

また、Windows SoftRealTimeを使ってみて以下のメリットを感じました。
・通常のWindowsアプリをそのままリアルタイム化できる(CPUの割り当てと優先度設定を行う必要はあり)。
・RealTime化に追加の費用がかからない。
・最優先で実行したいプロセスを設定できるので、AI推論や画像処理など他の用途にも効果がありそう。

今回は基本的な評価のみでしたが、実際の製品にも展開できそうなので、引き続き評価を進めていく予定です。

今後の評価予定

・ハードウェア割り込み(デバイスドライバ)を実装した場合のリアルタイム性能評価
・リアルタイムコアでのEthernet通信性能評価 など