T.TのHPIndex > PrbScriptの書き方
PrbScriptの書き方

 このページではPrbScriptの書き方を説明します。BASICみたいに書きます。 プロロボでできないことはできないので、変数などはないです。簡単です。

@命令を使って動かす
A繰り返し処理
Bラベルとラベルジャンプ
Cセンサでの条件分岐

@命令を使って動かす

 まずは、以下のように書き、プログラムを転送し、動作させてみましょう。 すべて、半角英数字で書きます。大文字小文字は区別しません。大文字でなくともOKです。 TABキーを押すと、インデントがつけられます。見やすくするために便利です。

START
	STRAIGHT LOW,500
	BACK HIGH,500
FINISH

この動きは、「五秒間低速で前進し、その後、5秒間高速で後進する」という動きななったはずです。
 まず、「START」。これは、フローチャートの「はじめ」に相当します。PrbScriptはこの命令から始めてください。 次に、「STRAIGHT」は前進を指示しています。そしてその後に、「HIGH」や「500」といった情報を与えています。 このように、プロロボに指示をするものを「命令」そして、命令に情報を与えているものを「引数(ひきすう)」といいます。 命令と引数の間は半角スペース開け、引数と引数は「,」で区切ります。
 命令にはどのような順番で引数を渡すべきか決まっています。STRAIGHT命令は「STRAIGHT 速度,動作時間」と言った形で指定します。 この場合、速度は「LOW」(PrbScriptでは速度は三段階、HIGH,MIDDLE,LOWで指定できます。)低速で動き、 処理時間は「500」、これは5秒を意味します。PrbScriptでは処理時間はすべて10ms単位(秒*100)で指定します。 これは、プロロボ内でも同じように10ms単位で処理されているからです。
 では、「BACK HIGH,500」はどうでしょうか?簡単です。「BACK」は後進する命令です。同じく、 「BACK 速度,処理時間」で指定します。
 最後の「FINISH」はフローチャートの「終わり」を意味します。この命令を入れ忘れると、 プロロボがフリーズしてしまいます。ご注意ください。
 プログラムは基本的に上から下へと進むのです。
 お気づきだと思いますが、命令などはちゃんとスペルが合っていると、エディタで色が変わります。 これがあるだけでだいぶ楽かと思います。

 他にも、公式のプロロボエディタでできた動作は全部できます。

START
'このように半角シングルクォーテーションから始まる行はコメントになります。
'コメントはプログラムの実行に影響を一切与えません。

'命令 速度,動作時間
	'前進
	STRAIGHT LOW,500
	'後進
	BACK HIGH,300
	'停止
	BRAKE HIGH,150

'命令 方向,速度,動作時間
'方向はR(右)とL(左)で指定します。
	'旋回(信地回転)
	TURN R,MIDDLE,320
	'ツイスト(超信地回転)
	TWIST L,HIGH,420
	'後旋回
	BACKTURN R,LOW,300

FINISH

このように、動作を伴う命令を「プロロボ動作命令」と呼んでいます。
命令は110個まで記述できます。
動作命令を含む命令一覧は、命令一覧を御覧ください。

ところで、存在しない命令を書いてしまったり、命令の引数を間違えてしまうとどうなるでしょうか。 例えば、

START
	HOGE HIGH,300
FINISH

と書くと、

...\PrbScriptSdk200\temp.vbs(3, 2) Microsoft VBScript 実行時エラー: 型が一致しません。: 'HOGE'

プロロボ言語ファイルの読み込みに失敗しました。

のようなエラーが出たはずです。ことメッセージの下線付きの数字が、 エラーが発生した行+1になります。これを参考にエラーが発生した行がわかります。
 次に、このようなエラーもあります。

■コード
START
	BACK 500,HIGH
FINISH

■結果
命令の速度値が不正です。(2命令目)

スクリプトエラーが発生しました。

となります。この「命令目」というのは、エディタで薄紫色になっている命令で何番目かを表しています。 例えば、FINISHは薄紫にはならないのでこの「命令目」には数えられません。

エラーに関しては少しわかりづらくなってしまい、申し訳ありません。

A繰り返し処理

繰り返し処理とは、同じ処理を指定回数繰り返すことです。

START
	REPEAT 3
		STRAIGHT HIGH,300
		BACK HIGH,300
	RETURN
FINISH

REPEATはフローチャートの「繰り返し」にRETURNは「もどる」に相当します。 「REPEAT N」の形で指定された回数、REPEAT〜RETURN間を繰り返します。
 このような動きを伴わない命令を「プロロボ制御命令」とよんでいます。

START
	REPEAT 3
		REPEAT 2
			TWIST R,HIGH,200
			TWIST L,HIGH,200
		RETURN
		STRAIGHT HIGH,300
	RETURN
FINISH

このように、繰り返しの中に、繰り返しを入れ子にする(=ネストさせる) こともできます。面白い動きになります。
 ただし、繰り返しはプログラムの中で、10回しか使えません。また、 REPEAT〜RETURN外でREPEATやRETURNが検出されるとエラーになります。 また、繰り返しの中では後述するラベルジャンプや条件分岐が行なえません。(*1)

Bラベルとラベルジャンプ

以下のように書いてみましょう。

START
	STRAIGHT LOW,500
	JUMP "ROLL"
	BACK LOW,500
LABEL "ROLL"
	TWIST R,HIGH,500
FINISH

どうでしょうか、動かしてみると、「BACK LOW,500」が実行されていないことがわかります。 これは、「JUMP "ROLL"」によって、プログラムの実行が、「LABEL "ROLL"」に移動したのです。
LABEL "ラベル名" の形でラベルを宣言できます。 (ただし、回数ループの中では宣言できません。(*1)すでに宣言されたものと、「@」から始まるラベルは宣言できません。)
JUMP "ラベル名" で宣言したラベルにジャンプできます。ラベル名も大文字小文字を区別しません
 次にこう書いてみましょう。

START
LABEL "LOOP"
	STRAIGHT HIGH,1
	JUMP "LOOP"

これは無限ループのプログラムになります。 無限ループですから、FINISHは必要ありません。
 ここで、特殊なラベル「システムラベル」を紹介します。 システムラベルは宣言しなくても使えるラベルで、 ラベル名が「@」から始まります。例えば、さっきのコードは、以下のように簡素に書けます。

START
	STRAIGHT HIGH,1
	JUMP "@TOP"

@TOPラベルはプログラムの先頭(START命令のすぐ下)にジャンプします。
このようにシステムラベルを使うとコードを簡略化できます。 他にもシステムラベルは定義されていますが、他は次で出てくるSENSOR命令で利用されます。
なお、JUMP命令はSTART,SENSOR,JUMP,FINISHのすぐ下と、回数ループの中では使用できません。(*1) STARTの直下で使いたい場合は、

START
	BRAKE LOW,1
	JUMP "BACK"
	STRAIGHT HIGH,500
LABEL "BACK"
	BACK HIGH,500
FINISH

のように、10ms停止の命令を挟んでみましょう。(そもそも先頭でJUMPする必要はあまりない。)

Cセンサでの条件分岐

 プロロボはセンサの状態によって動作を変える条件分岐ができます。 センサにはついてくる左右タッチセンサや、追加キットで増設する、 ライントレースユニットや赤外線、光センサがあるそうです。 (僕は追加センサを持ってませんが。)
 条件分岐を行うのは、SENSOR命令です。回数繰り返しの中では使用できません。(*1)

  SENSOR センサ番号,"ONだった時に飛ぶラベル名","OFFだった時に飛ぶラベル名"

センサ番号には1〜6のセンサ番号を指定します。指定されたセンサがONなら、 第二引数のラベルへ、OFFなら、第三引数のラベルへ飛びます。
ただ、センサ番号を指定するとコードの可読性が著しく低下するので、以下の 定数を指定できます。(定数とは数学の定数のように、文字で数字を表すもの)
定数センサーの種類
TOUCH_RIGHT右タッチセンサ1
TOUCH_LEFT左タッチセンサ2
LINE_RIGHT右ラインセンサ3
LINE_LEFT左ラインセンサ4
INFRARED_RIGHT右赤外線センサ3
INFRARED_LEFT左赤外線センサ4
LIGHT光センサ6

以下の例を見てみましょう。 センサによる分岐を行う際は、ループをしなくてはいけません。

START
LABEL "LOOP"
	SENSOR TOUCH_RIGHT,"YES","NO"

LABEL "YES"
	BACK HIGH,500
	FINISH

LABEL "NO"
	STRAIGHT HIGH,1
	JUMP "LOOP"

このプログラムを転送すると、ひたすら前に進み、右センサがONになると、5秒後進して止まるという動きをします。 プログラムを追ってみると、
 @右センサの状態を確認
 AONになら、"YES"へ。5秒後退してフィニッシュ
 BOFFなら、10ms前進して、@へ
という動きになっているのがわかります。
 ここで、システムラベルを使ってみましょう。システムラベルには以下のものがあります。

ラベル名ジャンプ先
@ENDプログラムは終了します。FINISH命令と同じです。
@MESENSOR命令自身にジャンプします。JUMP命令で呼んだ場合はひとつ前の命令にジャンプします。 正確には、直前の動作命令が実行される仕様に注意してください。
@NEXT自身の下の行の命令にジャンプします。
@TOPプログラムの先頭にジャンプします。

システムラベルを使うとさっきのプログラムは、

START
	SENSOR TOUCH_RIGHT,"@NEXT","NO"
	BACK HIGH,500
	FINISH
LABEL "NO"
	STRAIGHT HIGH,1
	JUMP "@TOP"

と簡略化できます。では、次のプログラムはどのような動きになるでしょうか。

START
	STRAIGHT HIGH,1
	SENSOR TOUCH_RIGHT,"@NEXT","@TOP"
	SENSOR TOUCH_LEFT,"@END","@TOP"

これは結果的に言えば、「左右のセンサがON(=バンパーが押された)になるまで前進する。」ものです。 右センサがONなら、下の行で、左センサを確認し、ONなら@END どちらの分岐もOFFならプログラム先頭へ飛んでいます。

ここらでPrbScriptの解説は終わりです。

*1 ... PrbScript 2.5からはUNSAFEモードを利用することで回数繰り返し内でのJUMP/LABEL/SENSORは使用可能ですが、推奨されません。





inserted by FC2 system