1. はじめに
DobotStudio ProではScriptはもちろんのこと、Blocklyでも様々な関数が実装されていることで複雑なプログラムの作りこみが可能となっています。
しかしながら作りこんでいくうちに構造が複雑となり、処理も重くなってしまうことでロボットの動作がスムーズにいかない、データのやり取りがスムーズに
いかないといった問題が出てくる可能性があります。
本稿では、DobotStudio Proで作成したプログラムを実行した際に動作が重い場合の解決策をいくつかご紹介いたします。
2. 環境
本稿投稿時に使用している環境は以下になります。
OS: Windows 10(64bit)
MG400: DobotStudioPro v2.6.1
また、下記の例で使用しているプログラム方法はBlocklyを使用しておりますがScriptや他SDKをご利用の際にも同様の方法を用いることができます。
3. 方法
3-1. 同期処理を用いる回数を調整する
IOの動作、読み取りや条件分岐を用いる際に同期命令であるSync()関数を用いることで処理のタイミングをコントロールすることが可能です。
Sync関数そのものにつきましては下記リンクをご参照ください。
I/Oの読み取りが意図したタイミングとずれてしまう場合の対処法 – TechShare FAQ
こちらの関数を用いる箇所、個数によっては意図せずプログラムの動作が重くなることがございます。
Sync()を用いる際には適切なタイミングに入れ、全体での必要量を減らすようにプログラムを調整して下さい。
3-2. 条件分岐やIOの読み取り回数を調整する
お使いのプログラム内での条件分岐の組み合わせ方を変更したり回数を減らしたりすることで改善する場合がございます。
Blocklyでは仕様上、「If」関数のブロックを用いる際に末尾に自動でsync()関数がつくようになっております。(2023年4月13日時点の最新バージョンv2.6.1にて確認)
Ifブロックを大量に用いますと逐次sync()関数の処理が入ることで処理にかかる時間が膨大になる場合がございます。
一部の条件分岐をandやorのような条件式を用いてまとめ、Ifブロックの個数を減らすことで
sync()が挟まる回数を軽減させ、処理にかかる時間を短くすることができる場合がございます。
しかし、Blocklyの性質上、andやorを重ねすぎますとブロックが横に伸びてしまい、視認性が下がる場合がございますのでひとまとめにする条件の数にはお気をつけ下さい。
また、「If」単体をつなげる場合より、「If ~ else ~」を用いた方が良い場合もございます。
これらもprint関数で出力される結果は全く同じですが
①のプログラムは条件を満たす満たさないにかかわらず組み合わせごとに毎回条件判定をしてしまうため、
条件の数によっては動作が重くなります。
②のプログラムは「If ~ else ~」を用いて分岐させることでDI01の判定結果に応じて不必要な条件判定を通らないように誘導し、
一連の処理で行う条件分岐の回数を削減することができます。
補足:スクリプトでのプログラム作成経験のあるお客様はサブルーチンブロックを用いて
条件分岐の処理の部分のみをスクリプトで作成し、sync()を入れるタイミングを
お客様の方でコントロールすることも可能です。
3-3. Sleep()を用いる
Sleep()関数は引数で指定した時間分、直後の処理の実行を遅らせる関数です。
これを用いることでIO読み取りや条件分岐によるループ処理の結果をスタックさせにくくすることができます。
Sleep()の秒数に関しましては弊社での推奨最低値は200msとしておりますがお客様の実行プログラム、環境に応じて少しずつ増加させて調整ください。
ご不明点等ございましたら、お気軽にdobot@techshare.co.jpまでお問い合わせください。