Zaber Consoleを使用して、ループ内のいくつかのステップを実行するZaberデバイスを制御するスクリプトを作成しました。ループの途中で一時停止して、最初に戻らずに再開するにはどうすればよいですか?
1 に答える
これをサポートするための4つのオプションを考えることができます。
- スクリプトが開始時に現在の状態を何らかの方法で検出し、ルーチンのどの部分から開始する必要があるかを理解するようにします。ルーチンによっては、現在の位置を読み取って、現在のステップを確認できる場合があります。そうでない場合は、ユーザーメモリを使用するか、現在の状態をテキストファイルに書き込むこともできます。スクリプト例の1つは、テキストファイルへの書き込み方法を示しています。
- メインスクリプトに加えて、一時停止スクリプトと再開スクリプトを記述します。メインスクリプトは、他の2つのスクリプトからの応答に気づきます。以下に例を示します。
- 一時停止と再開を別々のスクリプトで行う代わりに、Zaberジョイスティックを使用してボタンをプログラムし、一時停止コマンドと再開コマンドを送信します。以下の例では、それについても説明します。
- スクリプトを、 BackgroundWorkerでメインルーチンを実行するプラグインに変換します。次に、コントロールクラスで状態を保持し、[一時停止/再開]ボタンを追加できます。
個別のスクリプトを使用してルーチンを一時停止および再開する例を次に示します。また、ジョイスティックボタンの使用方法についても説明します。
オリジナルのルーチン
まず、この簡単なルーチンを作成しました。
/* C# example of how to pause and resume a Zaber Console script.
* This script is the original routine without the pause and resume logic.
* It moves to position zero, then makes four moves of 10000 microsteps each
* and goes back to zero. This loops forever.
*/
#template(simple)
while (true)
{
for (var i = 0; i < 5; i++)
{
var position = i*10000;
Output.WriteLine("moving to {0}", position);
Conversation.Request(Command.MoveAbsolute, position);
}
}
一時停止
ルーチンを一時停止するスクリプトは次のとおりです。
/* C# example of how to pause and resume a Zaber Console script.
* This script pauses the main routine by sending a Stop command. Running this
* script twice will stop the routine.
*/
#template(simple)
Conversation.Request(Command.Stop);
stopコマンドを実行すると、メインスクリプトでエラーが発生しますが、メインスクリプトを変更してそのエラーをキャッチし、一時停止/再開ロジックを追加します。
履歴書
ルーチンを再開するためのスクリプトは次のとおりです。
/* C# example of how to pause and resume a Zaber Console script.
* This script resumes the main routine by sending an EchoData command with a
* magic number.
*/
#template(simple)
const int RESUME_NUMBER = 42;// Matches the main routine.
Conversation.Request(Command.EchoData, RESUME_NUMBER);
ルーチンプラス一時停止ロジック
一時停止と再開のスクリプトは非常に簡単です。実際の作業は、メインスクリプトに停止コマンドからのエラーと再開するマジックナンバーをリッスンさせることです。これが、すべてが追加された新しいバージョンのルーチンです。このスクリプトをメインのスクリプトエディタウィンドウで実行し、メインウィンドウの[スクリプト]タブのグリッドから他の2つを実行します。
/* C# example of how to pause and resume a Zaber Console script.
* This script is the main routine that moves to position zero, then makes four
* moves of 10000 microsteps each and goes back to zero. This loops forever.
* To pause the routine, run the Pause.cs script. To resume the routine, run
* the Resume.cs script. Running the pause script twice will stop the routine.
*/
#template(methods)
/* We switched to the methods template so we can put the move with pause and
* resume into a helper method.
*/
public override void Run()
{
while ( ! IsCanceled)
{
for (var i = 0; i < 5 && ! IsCanceled; i++)
{
var position = i*10000;
MoveTo(position);
}
}
}
/* This wraps the pause and resume logic around a simple MoveAbsolute command.
* If your resume logic is more complicated, you can put more commands inside
* the try/catch block, or use the return value of this function to tell the
* main routine what to do next.
* When this method returns, either the move has successfully completed, or
* IsCanceled is true.
*/
private void MoveTo(int position)
{
bool isComplete = false;
while ( ! isComplete && ! IsCanceled)
{
try
{
Output.WriteLine("moving to {0}", position);
Conversation.Request(Command.MoveAbsolute, position);
isComplete = true;
}
catch (RequestReplacedException ex)
{
Pause();
}
catch (RequestCollectionException ex)
{
/* If you are running against device number zero
* or some other alias, you get a slightly
* different exception.
*/
Pause();
}
}
}
/* Just wait for responses from your device. If a response is an EchoData
* command with the magic number, then this method will return. If the response
* is a Stop command, then IsCanceled is set to true and this method will
* return. All other responses are ignored.
*/
private void Pause()
{
Output.WriteLine("paused");
/* Let the device finish processing the current stop command before
* you start listening, otherwise you sometimes see the stop command
* again.
*/
Sleep(100);
const int RESUME_NUMBER = 42;// Matches the resume script.
var listener = new DeviceListener(Conversation.Device);
bool isPaused = ! IsCanceled;// Don't pause if already canceled.
while (isPaused)
{
var response = listener.NextResponse();// wait
if (response.Command == Command.EchoData &&
response.Data == RESUME_NUMBER)
{
isPaused = false;
Output.WriteLine("resumed");
}
else if (response.Command == Command.Stop)
{
isPaused = false;
IsCanceled = true;
Output.WriteLine("stopped");
}
}
}
ジョイスティック
Zaberジョイスティックを使用している場合は、Zaberコンソールで一時停止および再開スクリプトを実行するよりも、いくつかのジョイスティックボタンをタップする方が便利な場合があります。ジョイスティックのボタン1のデフォルトのコマンドは[停止]であるため、一時停止はすでに処理されています。他のボタンの1つをプログラムしてEchoData42を送信すると、スクリプトを再開できます。上記の最後のスクリプトは、一時停止および再開コマンドを送信するために別々のスクリプトを使用するか、ジョイスティックボタンを使用してそれらを送信するかにかかわらず、一時停止および再開ロジックでルーチンを実行します。