PIC−USBIO using BASIC
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第25回]
●ON ERROR GOTO、RESUME、ERC、ERL
ソフトウェアを作っていますと、あれもあるといいのでは、とかこれも入れておくべきでは、などと考えてどんどん機能が増えていってしまいます。
機能が増えることは決して悪いことではありません。
むしろ望ましいことなのでしょうけれどそんなことばかりしているといつになってもハードウェアの紹介に入れません。
いいかげんに区切りをつけなければと思っています。
機能的にもかなり充実してきましたので、もうこの辺りでけりをつけてハードウェアの紹介に入るべきと思います。
ところがこうしてソフトウェアの機能追加などをしていますと、それに付随してどうしても直しておかなければならないところなどが出てきて、それがもとでまた当初考えていた仕様が大きく変わってしまいます。
なかなかに悩ましいところです。
ま、しかし大体のところは固まってきたと思いますからソフトウェアについては一旦この辺りで一時休止してぼちぼちハードウェアのほうにかかりたいと思います。
その前にあと2、3の機能について簡単に説明をしておきたいと思います。
それからハードウェアの紹介に入る予定です。
ということで今回のテーマはON ERROR GOTO文です。
プログラムを実行するとさまざまなエラーが発生します。
たとえばWindowsなどですと、なんじゃこりゃあ?なんて意味不明のエラーメッセージが表示されることがあります。
一般ユーザーにとっては全く対処のしようがないエラーです。
BASICインタプリタの場合にはそんなことはなくてプログラムのどの行でどんなエラーかということを表示してくれます。
プログラムのデバッグ中のエラーについてはそれなりに都合がよいエラーメッセージなのですが、プログラムが完成したあとでも実行中にエラーが発生することがあります。
エラーが発生するとプログラムの実行はそこで打ち切られてエラーメッセージを表示するとともにブレークしてしまいます。
たとえば長時間のデータのサンプリングなどをおこなっているときに突然エラーでブレークしてしまうとそれ以後のデータ取得ができないためデータの連続性が失われてしまいます。
エラーの内容によってはとりあえずエラーは無視してデータの取得を続けたいという場合も多いかと思います。
そういう場合にはON ERROR GOTO文は必須の機能となります。
いつものようにプログラム例で説明をします。
ON ERROR GOTO文はプログラムのどこに置いても構いませんがプログラム中にはただ1つだけしか置くことはできません。
間違いを避けるためなるべくプログラムの先頭に置くようにしたほうがよいでしょう。
ON ERROR GOTO文はエラーが発生したときに実行したい行をラベルで指定します。
上の例はエラーが発生したときにエラーコードとエラーが発生した行を表示させるだけのプログラムです。
エラー処理対策にはなっていませんがON ERROR GOTO文の働きを理解するためのサンプルプログラムです。
ERCはエラーコードを格納するシステム変数です。
ERLはエラーの発生した行を記録するシステム変数です。
上のプログラムを実行すると*errの行(行番号50)にジャンプしてERC=12、ERL=3が表示されます。
ERC=12は除数0の割り算が行なわれたことを示しています。
ERL=3は3番目の行でそのエラーが発生したことを示しています。
ERLについては本来は行番号そのものを示すとよいのですがPIC−USBIO用BASICインタプリタは行番号がないプログラムでも実行することができるため、行番号ではなくて先頭からの行数で示すようにしました。
上から3番目の行は
30 c=a/b
です。
行番号20でb=0を実行しますから除数0での除算が実行されてしまいます。
今度はエラー対策をしたサンプルプログラムです。
これもサンプルのためのサンプルで実用的な例ではありません。
エラー処理プログラムの最後にRESUME文があります。
RESUMEはエラーが発生してエラー処理プログラムが実行されたあと通常のプログラムに戻るための戻り先を指定する命令文です。
この例のようになにも指定しないRESUME文が実行されるとエラーの発生した行に戻ります。
プログラムを実行しました。
70行でb=2になったあと40行に戻ります。
c=12345/2
が実行されたあと50行でcの値を表示してブレークします。
今度はRESUME NEXTの例です。
RESUME NEXTを実行するとエラー処理後にエラーが発生した行の次の行に戻ります。
プログラムを実行しました。
先ほどのRESUME文のテストではb=b+2を実行したあと40行に戻ってc=a/bの計算を再度実行しましたが今回は40行には戻らず次の50行に戻ります。
c=a/bは計算されませんからcの値は当初の456のままで終ります。
今度はRESUME ラベルの例です。
70行でRESUME *l30を実行します。
英小文字が見にくくてl(L)が数字の1に見えてしまいます。
*130ではなくて*L30です。
エラー処理後に*l30の行(行番号30)に戻ります。
プログラムを実行しました。
エラー処理後に*l30の行(行番号30)に戻ります。
その行のprint文を実行してからc=a/b以下の命令が実行されます。
その流れでプログラムが実行され最後にc=6172を表示してブレークしました。
PIC−USBIO using BASIC[第25回]
2022.7.19upload
前へ
次へ
ホームページトップへ戻る