質問:
EV3はMyBlocksと並列ですが、機能しているのは1つだけです
freefaller
2014-07-20 19:55:32 UTC
view on stackexchange narkive permalink

TL; DR =プログラムと並行して2回追加されたMyBlockがそのうちの1つだけを実行する明らかな理由はありますか?


EV3-Gプログラムでは、近接ヘディングを使用してモーターを制御し、ヘディングが常に真っ直ぐになるようにするMyBlock。 (近づくと遅くなるなど、複雑さが増します。)

私のロボットアームには2つの赤外線センサーがあります。1つは水平に取り付けられ、もう1つは垂直に取り付けられているため、アームは常にビーコン...そしてMyBlockはパラメータで設定されているので、対応するポート/モーター番号が渡されます。

並列に実行されている2つのMyBlockが、一方でのみ機能する理由はありますか?それらのブロックであり、他のブロックではありませんか? (デバッグ時には、両方のブロックが「きらめき」、両方が明らかに実行されていることを示します。)

すべてのフロー制御、センサー、およびアクションが正しいパラメーターで機能していることを2倍から4倍にチェックしました。値を設定し、各ブロックを個別に実行すると完全に機能します。

また、新しいプログラムでブロックを(非常に長い間)複製しましたが、問題なく機能します。

2つのブロックが必要な理由プログラムで複製された同じコードが機能する場合、並行して実行しても機能しませんか?


UPDATE

要求どおり(元々実行する必要がありました) 。

これがMyBlockです。センサーポート、モーターポート、「オフセット」の3つのパラメーターで始まります。すべて数値です。ループが開始され、方向見出しの読み取りが行われます。次に、「offset」値を使用して、「offet-5」と「offet +5」を範囲に渡します

MyBlock part 1

範囲のブール値に基づきます、現在の見出し値が範囲内にある場合、見出し値に基づいて「段階的な」速度でモーターを実行します。したがって、0に近づくと、モーターの動作が遅くなります。

MyBlock part 2

現在の方位値が範囲外の場合、モーターは非可変速度...この場合、値が「オフセット」値を下回っている場合。

MyBlock part 3

この場合、値が「オフセット」値を超えている場合。

MyBlock part 4

プログラムは単に2つを呼び出します。 MyBlockのインスタンス。左を実行すると、水平方向の検出と移動は問題なく機能します。右を実行すると、垂直方向の検出と移動は問題なく機能します。

MyBlock part 5 MyBlock part 6

しかし、以下を実行すると、最後に配線されたMyBlockのみが機能します。文字通り、一方向のモーターからの動きがあります。

MyBlock part 7

スクリーンショットを1つか2つください。
こんにちは@dfrevert,もちろん-それは私が前もってやるべきだったことです-お詫びします。説明が明確であることを願っています。さらに説明が必要な場合はお知らせください。
二 答え:
David Lechner
2014-07-22 00:27:01 UTC
view on stackexchange narkive permalink

ヘルプファイルでこれを見つけることができませんでしたが、このスレッドによると「MyBlocksのもう1つのあまり知られていない特徴は、再入可能ではないことです。同じMyBlockの2つのコピーはできません同時に実行されています。」

EV3-Gでいくつかの簡単なプログラムを試し、これが正しいことを確認しました。それらが実行される順序はランダムに見えます。

まあ、それは確かにそれを説明するでしょう。うまく見つかった@David,のおかげで:-)
mstahl
2015-07-21 23:30:27 UTC
view on stackexchange narkive permalink

MyBlocksは再入可能ではありません。一度に1つのスレッドのみがブロックを使用できます。 2番目のスレッドが別のスレッドによって使用されているMyBlockを実行しようとすると、2番目のスレッドは最初のスレッドがブロックを終了するまでブロックします。

これは通常、単純な計算を行うMyBlocksでは問題になりません。それらはすぐに終了し、すべてのスレッドが進行します。ただし、MyBlockにループまたは待機が含まれている場合、同じMyBlockを使用する他のスレッドを無期限にブロックできます。

デバッグビューから、ブロックされたMyBlockはアクティブとして表示されます。これにより、デバッグが非常に困難になります。 MyBlockの前後に異なるサウンドを配置して、どのスレッドがスタックしているかを確認してみてください。

簡単な解決策は、問題のあるMyBlockの複数のコピーを作成し、各スレッドに独自のコピーを実行させることです。

(DavidLの答えは大丈夫でした。完全を期すためにこれを提供します。プログラミングを楽しんでください!)



このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 3.0ライセンスに感謝します。
Loading...