マルチコア化でPLC(シーケンサ)のスキャンタイムの短縮が難しい

PLC(シーケンサ)

CODESYSとラズベリーパイ(raspberry pi)でマルチコア対応のパッケージが出てきましたので動作確認しました。今までのマルチコア非対応のと比較してスキャンタイムがどれだけ短縮できるかを試して失敗したのを記事にしています。

 

  1. 最初に… スキャンタイムとサイクルタイムの表記
  2. CODESYS+ラズベリーパイのマルチコアverが出た
  3. codesys,raspberry piをdownload,installする
    1. CODESYS(本体)の「3.5.14.0」以降をダウンロード・インストールする
    2. 「Raspberry PI MC SL」をダウンロード・インストールする
  4. ハードとソフトの差でもスキャンタイムを比較してみる
  5. マルチタスクの負荷のプログラムにする
    1. 今回のベースとなるプログラム
    2. プログラムの改造内容
  6. 回路図(構成)・デバッグ環境
  7. ラズベリーパイ・GPIOの設定
  8. マルチコアでの各タスクの割り当て
    1. 「順序・ピン止め(SequentialPinned)」にした理由
  9. サイクリックからフリーホイールにしておく
  10. PLC(シーケンサ)のスキャンタイムを測定するには
  11. 各スキャンタイムの結果
    1. ①…「raspberry pi 1B(シングルコア)」 +「マルチコア非対応ソフト」
    2. ②…「raspberry pi 3B+(クアッドコア)」+「マルチコア非対応ソフト」
    3. ③…「raspberry pi 3B+(クアッドコア)」+「マルチコア対応ソフト」
  12. マルチコアでスキャンタイムを短縮できなかった考察
    1. クアッドコアにタスクを割り振れていない
      1. 各コアの負荷 トレース
      2. PLCの各コアへの負荷 トレース
    2. プログラムが簡単すぎる
  13. また情報が出てきましたらリライト予定
  14. codesysとraspberry pi MC SLの組み合わせは面白い!
    1. raspberry piのCPU各コアの負荷をプロットする方法
    2. PLCがCPUの各コアにどれだけ負荷掛けているか調べる方法
    3. 動画でまとめておきました
  15. まとめ

最初に… スキャンタイムとサイクルタイムの表記

今回ソフト(CODESYS)上の語句としては「サイクルタイム」とも表記されているところを、本記事の文では「スキャンタイム」という語句で統一して記載しています。ご了承ください。

 

詳細の違いの説明は三菱のFA用語解説の「サイクルタイム」と「スキャンタイム」をご確認ください

CODESYS+ラズベリーパイのマルチコアverが出た

今までラズベリーパイ(raspberry pi)をPLC(シーケンサ)として使っておりCPUはA53の4コアありましたがソフト(パッケージ)がマルチコア非対応でした。

 

理由としてはパッケージがマルチコアが対応していなかったためです。筆者がダウンロードした時(2018年夏頃)はまだマルチコア非対応でした。

 

しかしこの2018年末頃にマルチコア対応のパッケージがリリースされていました。(正式なリリース日は2018/12/14)。

 

しかも相変わらずのPLC(シーケンサ)として2時間までフリー(無料)で実動作・デバッグできます。相変わらずの神対応です。※2時間経っても再度接続すればいいだけです。仮に2時間以上使っても費用は発生せず下記メッセージが出て終了するだけです。

 

今回はマルチコア対応したパッケージをダウンロード・インストールする手順、そして実際に使って今までのシングルコアとのスキャンタイムを比較していきます。

 

codesys,raspberry piをdownload,installする

マルチコア対応のソフト「ラズベリーパイのパッケージ」をダウンロード・インストールします。

 

今回マルチコアのパッケージのCODESYSの対応Verが「3.5.14.0」~なので古いVerの方は最新Verをダウンロード・インストールする必要があります。

 

CODESYS(本体)の「3.5.14.0」以降をダウンロード・インストールする

・本体の「CODESYS Development System V3」のVer「3.5.14.0」以降をダウンロードします。リンク先からダウンロードをお願いします。

 

もしダウンロード・インストールする上で分からない箇所ありましたら、記事「PLC(シーケンサ)・ラダーがフリーで使える!おススメ入門ソフト」で記載しましたのでリンク先から参照をお願いします

PLC(シーケンサ)・ラダーがフリーで使える!おすすめ入門ソフト
今回は筆者が持っているラズベリーパイをPLC(シーケンサ)として使う準備編で「PLC(シーケンサ)・ラダーがフリーで使える!おすすめ入門ソフト」を紹介します フリーでラダーのプログラムを実際に動かす手順を紹介しています。「自分...

 

「Raspberry PI MC SL」をダウンロード・インストールする

ラズベリーパイ(raspberry pi)用のマルチコア対応パッケージの「CODESYS Control for Raspberry Pi MC SL」もダウンロードお願いします。

 

※ちなみにもともとマルチコア非対応だった「CODESYS Control for Raspberry Pi SL」は(サイズ容量など見ましたが)マルチコアとおそらく同じダウンロード内容でした。

おそらく「3.5.14.0」以降のラズベリーパイのパッケージはシングルコアかマルチコアかを使い分けるとができ、新旧ラズベリーパイ両方に対応できるためかと思います。(プロジェクト作成時にデバイスで選択できました)

 

ハードとソフトの差でもスキャンタイムを比較してみる

今回スキャンタイム(PLCの制御周期)を比較する対象としては3パターンで比較してみます。これでハード・ソフトの差が出るのではという考えです。

 

①…「raspberry pi 1B(シングルコア)」 +「マルチコア非対応ソフト

②…「raspberry pi 3B+(クアッドコア)」+「マルチコア非対応ソフト

③…「raspberry pi 3B+(クアッドコア)」+「マルチコア対応ソフト

 

CODESYSの環境はダウンロード・インストールした「3.5.14.0」で全て対応します。またラズベリーパイ(raspberry pi)のOSのRaspbianはVer4.14で実施しています。

 

マルチタスクの負荷のプログラムにする

今回はマルチコアが機能するようにメインタスクが複数あるプログラムを作っていきます。タスクが複数ある負荷として掛けることで「マルチタスク対応」「マルチタスク非対応」の結果が変わって欲しいという意図です。

 

今回のベースとなるプログラム

ベースとなるのは簡単なプログラムですがラダーの自己保持回路を使います。記事「入門編!簡単なPLC・ラダーのプログラムの例を作って動かしてみた」の最後で動かしたプログラム(ラッチ(自己保持)回路 リセット付き)を改造します。

 

このプログラムの詳細はリンク先から参照をお願いします

入門編!簡単なPLC・ラダーのプログラムの例を作って動かしてみた
どうもミソジです。 今回は筆者が持っているラズベリーパイをPLC(シーケンサ)として使う実践編で「入門編!簡単なPLC・ラダーのプログラムの例を作って動かしてみた」を紹介します ラズベリーパイでラダーのプログラムを実際に...

 

プログラムの改造内容

今まではメインタスクが一つでしたが下記のようにタスク4つ作ります。各タスクに自己保持回路を作り4個分をクアッドコアでそれぞれ動かしたいイメージで作りました。

 

入力に関しては全ての同じSWにしたいためグローバル変数を用意しました。上図だと入力SWのa接点を「X001⇒GVL.X003」、リセットSWのb接点を「X002⇒GVL.X004」にしています。

 

プログラムとしてはグローバル変数リストを作ってX003,X004を書いているだけです。

 

回路図(構成)・デバッグ環境

正直今回のプログラムではCPU内部の負荷だけ気にしているので、特に出力ポートまで弄る必要無かったと思いますが一応修正しました。

 

下記がデバッグ環境です。ジャンパーワイヤーブレッドボードが多少必要になりますが簡単なLEDとSWを付けた回路となっています。

 

回路図としても特に普通です。LED・SW用の抵抗は全て10kΩです。6本程度ですので何かの抵抗セットに付いているもので事足りるはずです

※「raspberry pi 1B」を使う際はGPIO27が無いためGPIO4で代用しました

 

ラズベリーパイ・GPIOの設定

「CODESYS」でのラズベリーパイ・GPIOで使う方法に関しては基本は記事「ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた」に記載しましたのでリンク先から参照をお願いします

ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた
どうもミソジです。 今回は筆者が持っているラズベリーパイをPLC(シーケンサ)として使う実践編で「ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた」を紹介します ラズベリーパイでラダーのプログラムを実際に...

 

前回記事から違う点としては下記2点ぐらいかと思いますが、そこまで多くはないので各個人に合わせた修正をお願いします。

・GPIOのパラメータ・マッピングを修正する

 

・ラズベリーパイを再アップデート(Ver3.5.14.0以前の方はマルチコア対応にする必要があります)

 

ラズベリーパイをアップデートする際に「Standard」か「Multicore」にするかを聞かれますので各個人で使いたい方を選択お願いします。マルチコア対応の機能など使いたい場合は「Multicore」を選びます

 

マルチコアでの各タスクの割り当て

マルチコアの場合は各タスクがどのコアで実行・割り当てするかは「タスク構成」⇒「タスク グループ」で設定できます

 

今回は「順序・ピン止め(SequentialPinned)」で設定しています

 

「順序・ピン止め(SequentialPinned)」にした理由

本来4つあるタスクをコア0,1,2,3にそれぞれ分けようとして色々試したのですが、どうしても実行後すぐに割り込みエラーが発生しました。

 

エラーのログを見ると「License missing」?色々ヘルプページ含めて確認したが筆者では詳細まで分からずじまいでした

 

マルチタスクの設定の詳細に関してはCODESYSのヘルプページをご確認ください。

 

「順序・ピン止め(SequentialPinned)」の説明では「すべてのタスクは異なるプロセッサコアに固定され~」と書かれていましたので、タスクを各コアに割り当てくれるだろうという意図で選択しました。

それも後ほどの結果に書きますが「全てコア0」に割り振られNGでした…。もしこの辺りの詳細分かった方がいればコメントいただけると助かります。

 

サイクリックからフリーホイールにしておく

今回は各タスクのコンフィグレーションの「タイプ」を「フリーホイール」に設定しておきます。

 

PLCのスキャンタイムに影響する変更です。簡単に意味を説明しますと下記になります。デフォルトは「サイクリック」です。

「サイクリック」…PLCのスキャンタイムの時間を任意に設定する

「フリーホイール」…PLCのスキャンタイムを最速に設定する

 

今回は何処までスキャンタイムが出るか測定したいので「フリーホイール」にしておきます。

 

PLC(シーケンサ)のスキャンタイムを測定するには

CODESYSでは非常に簡単にスキャンタイムを測定できます。プログラム運転中に「タスク構成」の「監視」をクリックするだけです

 

各タスクのスキャンタイムまで測定できますので今回はCODESYS上で「プログラム実行中」の「平均サイクルタイム(us)」と表記されている箇所を測定していきます。

 

各スキャンタイムの結果

実際に測定したところ下記結果となりました。今回はスキャンタイム以外にもLinuxのTOPコマンドでCODESYSのCPU負荷を確認しました。

 

※あくまで筆者のプログラム・デバッグ環境での値ですので参考扱いでお願いします

 

考察等はまた次の章で記載するとして、単純な結果としては②>③>①の順でマルチタスク非対応で最新機種のラズベリーパイ(raspberry pi)が一番速かったです。

 

各個別の結果を貼っておきます

①…「raspberry pi 1B(シングルコア)」 +「マルチコア非対応ソフト」

 

②…「raspberry pi 3B+(クアッドコア)」+「マルチコア非対応ソフト」

 

③…「raspberry pi 3B+(クアッドコア)」+「マルチコア対応ソフト」

 

マルチコアでスキャンタイムを短縮できなかった考察

今回マルチコア対応の③が一番速くできなかった理由は多くあると考えています。数例挙げておきます。(あくまで筆者の1個人の考えでお願いします)

ぶっちゃけ言いますと筆者が完全にマルチコアを使いこなせれていないのが一番大きいです。申し訳ないです。

 

クアッドコアにタスクを割り振れていない

③の結果で見てもらうと分かりますが、結局どのタスクも「コア0」に割り振られていました。(色々試行錯誤したのですが結局コア1,2,3に割り振れなかったです)

 

CODESYSのマルチコアの機能で「各コアの負荷」「PLCの各コアへの負荷」のトレースを確認しましたが、やはり「コア0」に一番負荷が掛かっていました。

各コアの負荷 トレース

 

PLCの各コアへの負荷 トレース

 

筆者のCODESYSの使い方が一番悪いのが原因のようですが、今回はここでギブアップとしときます。

 

プログラムが簡単すぎる

そもそもマルチタスクが有効に活用できるプログラムだったかというと、確実に違いました。本来タスクを分ける必要がない簡単なプログラムを分散させて、変にタスクが増えてしまったかもしれません。

 

一応簡単な四則演算を大量にぶち込んだプログラムを個別で確認したのですが、結果は変わらずでした。CODESYSのマルチタスクのヘルプページを見ても、IECtask内では基本OSが必要に応じてタスクを分配するような旨の記載もありました。

 

本格的にマルチコアでメリットを出そうとすると「それなりの量のタスク」,「メインタスクとは個別に計算できるタスク」などを環境を整えて、ソフトのルールを守ってタスク分配してあげる必要がありそうです。

 

また情報が出てきましたらリライト予定

今回はリリースされたばっかりのマルチコアのパッケージを説明しましたが、上手く紹介できずに申し訳ないです。また情報が追加で出てきましたらまたこの記事をリライトしたいと思います。

 

codesysとraspberry pi MC SLの組み合わせは面白い!

今回の結果ではマルチコア対応パッケージの「CODESYS Control for Raspberry Pi MC SL」の良いところが筆者の力量不足で伝えきれなかったので追加で一部記載しときます。

 

前章でもトレースのグラフ載せましたが今回マルチコア対応になって簡単に「各コアの負荷」に加えて「PLCの各コアへの負荷」がトレース・プロットできるようになっています。これ非常に面白いです。

 

raspberry piのCPU各コアの負荷をプロットする方法

プログラム動作中で構いませんので「Device」の箇所で右クリックして「オブジェクト追加」⇒「DeviceTrace」を選択します

 

そしてトレース名を聞かれますので、好きに名前を付けてください

 

画面が切り替わったら右クリックして「オンライン  リスト」を選択します

 

オンラインリストのウインドウが出てきたら。「CpuCoreload」を選択した後に「アップロード」を選択します

 

無事CPUの各コアの負荷状況が分かります。

 

PLCがCPUの各コアにどれだけ負荷掛けているか調べる方法

「オンライン リスト」出すまでは「各コアの負荷」を調べる方法と同じ内容なので省略します。「Plcload」を選択して「アップロード」を選択します

 

plcloadはまだその時点ではトレースされていないので右クリックして「トレースを開始」を選択します

 

PLCがどのコアに一番負荷を掛けているか分かるようになりました。(下トレーズは右クリックして「シングルチャンネルに変換」を選択したものです)

 

動画でまとめておきました

今回の一連の流れをYoutubeの方にもあげておきました。流れとしては下記となっています。

3秒~  ログイン+プログラム運転開始

12秒   PLCの入力SW押す(自己保持回路を動作)

20秒~  スキャンタイムを確認

42秒~  PLCの各コアへの負荷を確認

67秒~  各コアの負荷を確認

まとめ

如何でしたでしょうか?普段はPLC(シーケンサ)は使うケースはあると思いますが、マルチコア対応までするケースはあまりないと思います。

CODESYSならば「マルチコアをどのように使うか」まで弄ることができます。普段やれない経験です。

 

筆者もマルチコアの一部の機能しか使えていないので、ぜひ皆様も実際にマルチコア対応パッケージを使ってみてください。実質フリーでこれだけ自由度が高いPLCソフトはあまり無いと思います。

 

今回はここまでにしたいと思います。ご覧いただきありがとうございました。

 

次の記事ではラズベリーパイ(raspberry pi)で絶縁して安全に24VリレーをON/OFFしたく、フォトカプラで回路を作ってみました。LTspiceのシミュレーション・実際に動作確認したのを記事にしています。

ラズベリーパイで絶縁して24Vリレーを動かすフォトカプラの使い方
ラズベリーパイ(raspberry pi)で絶縁して安全に24VリレーをON/OFFしたく、フォトカプラで回路を作ってみました。LTspiceのシミュレーション・実際に動作確認したのを記事にしています。 raspberry piは...

コメント