Download 第3章 プログラミング例
Transcript
第3章 プログラミング例 基本1(I/O定義) MPCの入出力はそれぞれ0番から ス ター ト し ています。MPC-816に付属し ている16点の入力 と8点の出力は0 ~15の入力、 0~7の出力にふ り あて られています。 MIFではこれが16~31 (入力) 8~15 (出力) と 順にふら れています。MPCではI/Oを ラベルで扱 う こ と ができ ます。 これを定義する コマン ド は#DEFS、#DEFOです。 それぞれ入力ポー ト 、出力ポー ト の定義に用います。も ちろん ラベルを使用し ないでそのま まポー ト 番号で 扱 う こ と もでき ますが保守時にはラベル化さ れたI/Oの方が扱いやす く な り ます。次に、定義例を示し ます。 最初に0か ら6までの入力を指定し、次に0から7までの出力ポー ト を定義し ています。こ の定義は最初にし な く て も、 プロ グ ラ ム完成後追加し て も有効です。 I/Oマップ #DEFS START 0 ポートNO. 名 称 #DEFS AUTO 1 0 START スイッチ 押してON #DEFS MAN1 2 1 MODE スイッチ AUTO #DEFS MAN2 1 2 〃 MAN1 #DEFS CYCLE 4 入力 3 〃 MAN2 #DEFS MIGI 5 4 〃 CYCLE #DEFS HIDARI 6 5 テーブル右 さえぎってOFF ' 6 テーブル左 〃 #DEFO PIN 0 7 #DEFO HANDDWN 1 0 位置決めピン ON 位置決め #DEFO HANDMAE 2 1 トランスポート上下 ON 下降 #DEFO PINUP 3 2 トランスポート前後 ON 前進(C) #DEFO AIR 4 出力 3 案内板送りピン上下 ON 上昇 #DEFO MAE 5 4 トランスポート真空破壊 ON 真空破壊 #DEFO STOP 6 5 案内板送り前後 ON 前進 #DEFO VACUM 7 6 度当り切替え ON B位置 7 トランスポート真空 ON 真空 ※前後の前(前進)とはシリンダのロッドが伸びた状態 2 センサ 5 4 7 1 OUT +DC GND START AUTO MAN1 NAN1 CYCLE 操作BOX 3 0 5 サンプル装置 3-1 6 センサ 6 OUT +DC GND 基本2 (自動・手動運転の切り替え) MPCにはマルチタ ス ク の機能があ り ます。 これは、複数のプ ロ グ ラ ム を同時に実行する ものです。 こ の機能 を使用する こ と によ り 動作の切 り 替え を簡単に実現する こ と ができ ます。 も し マルチタ ス ク を使用し ない と自動と 手動の動作切 り 替えはプロ グ ラ ムを複雑な ものに し て し まいます。 '******* *LOOP '******* WAIT SW(START)=1 WAIT SW(START)=0 QUIT 1 IF SW(AUTO)=1 THEN *A1 IF SW(MAN1)=1 THEN *M1 *A1 FORK 1,*AUTO GOTO *LOOP *M1 FORK 1,*MANU GOTO *LOOP '******* *AUTO '******* FOR I=0 TO 7 ON I TIME 5 OFF I NEXT I GOTO *AUTO '******* *MANU '******* FOR I=0 TO 7 WAIT SW(MAN2)=1 PRINT# I NEXT I GOTO *MANU 管理プログラム 自動運転プログラム ’プログラム自体には意味無し 手動運転プログラム ’プログラム自体には意味無し こ の例ではSTARTス イ ッチの操作を き っかけに し て、 手動 と自動を切 り 替えています。 STARTス イ ッチ後 AUTO とMAN1のス イ ッチを読み取 り こ れによ り 必要に応じ て異なるプロ グ ラ ムをFORK し ています。 こ の FORKコマン ド がマルチタ ス ク を起動させる ものです。 入力ポー ト AUTOがONの場合こ のコマン ド実行後、 管理プロ グ ラ ム と自動運転プロ グ ラ ムが同時に稼働し ます。 その次に、AUTOをOFFと し てMAN1をON と し てSTARTス イ ッチを操作する と 管理プ ロ グ ラ ム中のQUITコマン ド によ り タ ス クが停止されます。 も ちろん 動作をいき な り 停止する と危険なプ ロ グ ラ ム も あ り ますのでタ ス ク間イ ン ターロ ッ ク に よ って タ イ ミ ング を考慮し ます。通常はサイ クル停止 と な る よ う に し ます。こ の よ う に動作を決めるプロ グ ラ ム と動作を管理 するプロ グ ラ ムを分離する こ と によ って見通し の良いプロ グ ラ ム と な り ます。また、管理プロ グ ラ ム中で非 常停止ス イ ッ チを監視する よ う にすればいつで もプ ロ グ ラ ム を停止し た り 特別な処理をする こ と がで き ま す。 次の例では非常停止によ ってプロ グ ラ ム停止、 出力ポー ト ク リ ア(SETIO)後にプロ グ ラ ムを停止し てい ます。 3-2 '******* *LOOP '******* IF SW(START)=1 THEN *NORMAL IF SW(EMG)=1 THEN *EMG *NORMAL WAIT SW(START)=0 QUIT 1 IF SW(AUTO)=1 THEN *A1 IF SW(MAN1)=1 THEN *M1 *EMG QUIT 1 SETIO END *A1 FORK 1,*AUTO GOTO *LOOP *M1 FORK 1,*MANU GOTO *LOOP 管理プログラム また、 マルチタ ス クは管理プロ グ ラ ムだけでな く 装置の上に分散する幾つものユニ ッ ト に個別のプロ グ ラ ム を対応させて使用し ます。 3-3 基本3 (タスク間インターロック) 先の例のよ う に管理プロ グ ラ ムが一方的に タ ス ク を停止する と不都合な こ と が多い ものです。こ のため、動 作切 り 替えにはサイ ク ル停止が必要にな り ます。 こ う し た場合はタ ス ク (プロ グ ラ ム) 間で信号のや り と り を し て動作を定めます。 '******* *LOOP '******* WAIT SW(START)=1 WAIT SW(START)=0 ON -1 WAIT SW(-2)=1 QUIT 1 IF SW(AUTO)=1 THEN *A1 IF SW(MAN1)=1 THEN *M1 *A1 OFF -1,-2 FORK 1,*MANU GOTO *LOOP *M1 ON -2 FORK 1,*MANU GOTO *LOOP '******** *AUTO '******* FOR I=0 TO 7 ON I TIME 5 OFF I NEXT I IF SW(-1)=0 THEN *AUTO ON -2 WAIT SW(-1)=0 GOTO *AUTO 管理プログラム 自動運転プログラム ’プログラム自体には意味無し こ こ では、 メ モ リ I/Oの-1と-2を使用し て*AUTOのプロ グ ラ ムの停止を制御し ています。 こ の よ う に相手の プロ グ ラ ム を特定の箇所で停止させた り 、 状態を知らせた り するのには メ モ リ I/Oが有効です。 こ こ では直 接番号で メ モ リ I/Oを指定し ていますが#DEFS、 #DEFOで定義する こ と もでき ます。 注意すべき こ と は メ モ リ I/Oは入出力が同じ番号のため、 2つ定義文が必要 と な り ます。 #DEFS #DEFS #DEFO #DEFO CMND ACK CMND ACK -1 -2 -1 -2 3-4 基本4 (サブルーチン) 以上でプロ グラ ムを記述する場合の大まかな段取 り ができ ま した。 あ と必要な事は細かい動作をどのよ う に記述すれば良いか とい う こ とです。これにはサブルーチン とい う 考え方を使って、プロ グラ ムをよ く整理 し ます。も し この整理が無い とプログ ラ ムは秩序の無い冗長なものと なって保守が難し く な り ます。次の例 ではP&Pの動作を させるのに、 動作をい く つかの単位に分けて全体を制御し ています。 P&P1で1の位置に移 動しCHACKでワーク を囲みます。 P&P0は退避位置に移動するサブルーチンです。 P&P2は2の位置に移動し ます。その後RELSはワーク を離し ます。この一連の動作をサブルーチンを使用しないで記述する と繰り 返し が多いこ と、全体の見極めがつきに く いこ と などからプロ グラ ムの保守性が 著 し く 悪 く な り ます。またサブ ルーチン単体の動作確認はRUNコマン ドで行います。 >RUN *P&P1 NO STATE! >RUN *P&P0 NO STATE! > NO STATE! とい う エ ラーはサブルーチンのRETURNコマン ド を実行した時に現れる ものです。戻 るべき文番 号が無いために 発生 し ます。サブルーチンで注意すべき こ とはRETURNで 戻 らないで GOTOで 戻 してはなら ないこ と です。(必ずRETURNで戻 して 下 さい)こ う する と 覚 えてお いた 戻 り 番地が 消費 されないために メ モ リ 上にどんどん 蓄積 され30回ほ どで エ ラー停止を 招 き ます。 これまでのこ と をま とめる とプログ ラ ムはタ ス ク、 メ インプログ ラ ム、サブルーチンによ ってよ く 整理し て 記述すべきだ と い う こ と です。 モード切 り 替えなど全体に 関わ る こ とはマルチタ ス ク を使用し て別のプロ グ ラムを起動する よ う な見通しの良い構成にし ます。 *LOOP GOSUB *P&P1 GOSUB *CHACK GOSUB *P&P0 GOSUB *P&P2 GOSUB *RELS GOSUB *P&P0 GOTO *LOOP *P&P1 OFF HANDDWN,STOP TIME 50 ON HANDMAE TIME 100 ON HANDDWN TIME 100 RETURN *P&P2 OFF HANDDWN ON STOP TIME 50 ON HANDMAE TIME 100 ON HANDDWN TIME 100 RETURN *CHACK ON VACUM TIME 80 RETURN *RELS OFF VACUM ON AIR TIME 20 OFF AIR RETURN 3-5 *P&P0 OFF HANDDWN TIME 80 OFF HANDME TIME 50 RETURN パルス発生1 (モードの選択) P 版でのパルス発生 (MPG-303 から出力 ) MPC-816での パルス 発生は基本的にはMPG-303を使用し ます。また パ ルス 発生の方法にはMODE5とMODE6 があ り ます。 MODE5はス テ ッ プモータの 駆動に用い、 MODE6はサー ボ モータ に使用し ます。 こ れは、 多 く のス テ ッ プモータ ド ラ イ バ が10μか ら20μsec以上の パルス 幅 を必要と し ている こ と に対し て、 サーボ ド ラ イ バは、1μsec度に設定されてい る こ と に対応し ている ためです。パ ルス 発生の パルス レ ー ト はACCELコマ ン ド で設定し ます。 次の 表はACCELコマン ド で与 えた数値に対し てどの よ う な 周波数で パ ルスが出力され るかを示し ています。 MP G でパ ルス 発生 させるためには最低次のサンプルプ ロ グ ラ ムの機能設定が必要です。 こ こ では 4 相のス テ ッ プモータ で最大ス ピ ード を8kpps と し ています。 MPG-303カラパルス発生 *LOOP PG 1 MODE 5 OVRUN 0 D45 0 ACCEL 8000 SETPOS 0 0 MOVE TIME MOVE GOTO REV 3.2(Pバージョン) MODE 5 n 10000 0 100 0 0 *LOOP MOVE MODE 6 JOG MOVE JOG 50000 -45000 -- --- 56.3 51.6 14.6 13.7 40000 -35000 -- --- 44.2 38.6 12.0 10.8 30000 29.0 25000 26.5 20000 21.1 13.7 32.5 12.0 26.8 8.9 21.3 9.3 7.9 6.4 15000 15.7 10000 10.4 6.2 15.8 3.9 10.3 4.9 3.3 8000 4000 3.0 1.4 2.6 1.3 8.2 4.1 8.2 4.1 2000 2.0 0.7 2.3 0.8 パルス幅 20 μ sec 4 μ sec (単位 kpps) 最初に設定すべき コマン ド はPG です。MPG-303は、 1 つの シ ス テ ムで 3 枚 まで使用でき ます。 こ のため、 コ マン ド をどち らのMPG に対し て 与 え るかを最初に 選択する必要があ り ます。 PG 1で シ ョ ー ト ピ ンが一番目 に設定されたMPGに対し て有効 と な り ます。次にMODEコマン ド でモー ド を 選択 し、 オーバ ラ ンの 設定を ク リ ア し て お き ます。OVRUNが 設定さ れている とMPGの パルス動作が入力の状態によ って停止し ます。D45は 直線補間の方法 を決める コマン ド で通常の直線補間では0と し ます。 コマン ド の詳細は各 コマン ド リ フ ァ レ ン スを 参照 し て 下 さ い。 コマン ド SETPOSよ り は実際 の動作プロ グ ラ ムです。 実際 のプロ グ ラ ムではパ ルス 発生 に先立 ち原点復帰 を し ますが これは次の節 に ゆず り ます。 コマン ドSETPOSは現在位置に指定し た値 を 与 え る コマン ド です。 これで現在位置を0,0 と し て 原点復帰 に代 え ます。 そのあ とは10000パ ルスの位置まで ス テ ップモータ を 進 め、タ イ マー1秒後にまた0の位置まで も ど り ます。こ のプロ グ ラ ムを実行する とACCEL の処で時間待 ちが発生 し ます。 こ れはACCELコマン ド が加減速テ ーブルを 内部計算で作成する ために発生 する ロ ス タ イ ムです。 ACCEL 8000ではさ ほ どの時間 とはな り ませんが50kppsぐ らいにな る と無視できな く な り ます。こ の時間は加減速の距離が長ければ長い ほ ど多 く な り ます。な おプ ロ グ ラ ム中で パルス 発生のス ピ ー ド を 変更するにはFEEDコマン ド を使用し ます。ACCELで 設定された 範囲内で15段階 でス ピ ー ド 変更 で き ます(FEED 0~FEED 15)。 前記の実験 をする 前にMPG と ド ラ イ バ の接続方法は次の様 にな り ます。 こ こ で は フォ ト カ プ ラ入力のものを 想定し ています。TTL レ ベル入力や差動入力の場合はイ ン ター フェ ースが用意 さ れていますので第2章「PIF-422」 を 参照 し て 下 さ い。 3-6 尚、MPG を使用し た場合の原点復帰の入力ポー ト はMPG-303上のJ2です。OVRUNの入力ポー ト はMIF-816上 の入力ポー ト 24~31と な り ます。 この間はなるべく短くまた ツウィストペアを用いる MPG-303 J4 A C C E L C O R P . CE PM P- G09 30 6C 3F J2 (+5V) XCW (+5V) XCCW 各種ドライバ CW CCW ・ドライバは2パルス方式に設定する RA1 ・入力LEDに抵抗が入っている場合は RA1(100Ω)を低いものと取り替える。 P 版でのパルス発生 (MIF-816 J5 から出力) PG -1 と す る と MIF-816 J5か ら パル ス を出力 し ま す。小規模シ ス テ ム 向 き です。MPG-303の パル ス 発生に 準 拠 し た コ マン ド 体系 ですが、 下記の相違点があ り ま す。 ・ PG -1はCTRL+Aで リ セ ッ ト さ れ ます。 プ ロ グ ラ ム先頭 に記述 し て く だ さ い。 ・ ど の タ ス ク か ら で も パル ス 発生が 可能ですが、 その間はマルチ タ ス ク が停止 し ま す。 ・ 原点 セ ン サーポー ト はMIF-816の入力SW(16)~(23)を用い ます。 ・ STOP コ マ ン ド 、 MODEコ マ ン ド は無効です ・ 途中停止はOVRUNだ けです。 OVRUN セ ン サーポー ト はSE(24)~(31)を用い ます。 ・ 最高周波数は約60kppsです。 ・ 「SHOM x,y,s」 で s (原点復帰 ス ピ ー ド ) はPPS単位で設定 し ます。 (1~200pps) ・ 「FEED n」 のnは0~63です。 MAX60kで ほぼ1kpps単位で指定で き ます。 ・ JOG, PULSE コ マン ド は使え ま せん。 Z 版でのパルス発生 従来MIF-816 J5か ら の パル ス 発生は Z 版 で行い ま し たが、 前記のPG -1サポー ト に よ り Z版は保守版 と な り ま し た。 新規作成はP版で使用 し て く だ さ い。 3-7 パルス発生2 (XYステージ・原点復帰・ティーチング・パレタイズ) パルス発生を用いた応用の中で、 比較的難し く なるのがXYステージの制御です。 これはXYステージではロ ボ ッ ト 的な動作を要求される こ とが多く なるためです。その一番の応用例はパレ タ イズです。こ こ では次の 様な簡単な応用例にも とづいて解説し ます。 X軸 モータ X軸回転センサ X軸方向センサ Y軸方向センサ Y軸回転 センサ Y軸 モータ サーボドライバ J2-2 XS2 センサは軸方向についてはスリットセンサ、回転方 向としてはエンコーダのZ相を用いるのが一般的で す。Z相をMPG-303の入力に接続するにはト ランジスタやフォトカプラで信号を変換しなければ なりません。 J2-4 YS2 J2-3 YS1 J2-1 XS1 サーボドライバの入力にはフォトカプラ、差動入力、 TTLレベルなどがあります。単純なフォトカプラ の場合MPGと直接接続することもできます が、適合しない場合や長い引き回しが必要な場合に は、PIF-422を用います。 J4-2 XCW J4-4 XCCW J4-6 YCW J4-8 YCCW 原点復帰について 原点復帰は通常 2 つのセンサによ って実施し ます。 1 つは実際のテーブルの移動方向に取 り 付けられたス リ ッ ト センサ、も う1つは回転軸に取 り 付けられたス リ ッ ト センサです。サーボモータの場合はZ相検出を用 いるかサーボ ド ラ イバ自体に備えられた原点検出機能を使用し ます。MPCで原点復帰する場合には次の2つ のコマン ドが重要です。 SHOM 2 8 10 HOME &HA 100 100 SHOMコマン ドは原点復帰のパルス発生の方向とパルス発生のスピード を定めます。前記の様な設定例では XY軸と もにCCW方向に原点復帰パルス出力し ます。 逆にCWで原点復帰する場合は SHOM 1 4 10 と な り ます。SHOMの最後の引き数は原点復帰パルスのパルスレー ト で、ACCELで設定されたパルスレー ト とは独立して設定し ます。 MODE5,6での原点復帰パルスレー ト は次の様に計算し ます。 f=8Mhz/(1841+208×n) 例えば前記の様に10とすれば2040.3と な り 約2kHzと な り ます。 またパルス幅はデューテ ィ 50%と なってい ます。HOMEの最初の引き数は原点復帰入力の目的とするビ ッ ト パタ ンを表しています。通常、遮光センサ は常時ONでス リ ッ ト の遮光でOFF と な り ます。 またサーボのZ相はZ相検出でON と な り ます。 次の表の通 り 、 HOMEの最初の引き数は目的とするセンサパタ ン値 (原点復帰後の最下段) を与えます。 3-8 J2 方向 センサ 原点復帰前 原点復帰後 1 XS1 X 方向 遮光センサ ON (1) OFF (0) 2 XS2 X 回転 Z 相 OFF (0) ON (1) 3 YS1 Y 方向 遮光センサ ON (1) OFF (0) 4 YS2 Y 回転 Z 相 OFF (0) ON (1) &H5 &HA 尚、 こ の 値は関数HPT(0) で直接読み取る こ と がで き ます。 関数HPT()はMP G 動作中には使用で き ません。 HOMEの2番目 と 3番目の 引 き数は原点復帰に先立つ退避移動量 です。 こ の例の 様にHOME&HA 100 100 と す る と 原点復帰前 にC W 方向 に100 パ ルス ずつ移動 し ます。 こ れは原点復帰時には一定の方向 か ら 原点復帰 を し ない と 一定の 精度 を 確保で き なかっ た り 、 Z相検出 (C相) が一回転 ズレ て し ま う こ と があ る ためです。 必 要の無い場合は0、 0と し ます。 又、 Z相検出 (C相) ではパル ス 幅や動作の不安定 さ か ら 検出 ミ スする こ と が あ り ます。 こ れを 防ぐ のにSHRDコ マン ド で6~15までの値 を 与 え ます。 電源投入後は4 と なってい ます。 こ の場合の 原点復帰の パ ルス レ ー ト は次の通 り です。 f=8MHZ/(709+RX(n×52+283)) *RはSHRDの 設定値。 nはSHOMの 設定値 *Z相は メ ー カ に よ ってC相 と 表記 さ れ る こ と も あ る。 PG -1での原点復帰 PG -1では原点セ ンサーをMIF-816の入力ポート に接続し ま す。MPG-303 J2コ ネ ク タ と の対応は次の通り です。 セン サ MPG-303 J2 XS1 1番ピン XS2 2番ピン YS1 3番ピン YS2 4番ピン US1 5番ピン US2 6番ピン ZS1 7番ピン ZS2 8番ピン MIF-816 J4 1番ピン (SW(16)) 3番ピン (SW(17)) 5番ピン (SW(18)) 7番ピン (SW(19)) 9番ピン (SW(20)) 11番ピン (SW(21)) 13番ピン (SW(22)) 15番ピン (SW(23)) SHOMの原点復帰方向指定、 HOMEの セ ンサーパ ターン指定はMPG-303 と 同様です。 ティーチング 点データ にはあ ら か じ め 設定し てあ る場合 と 、 装置が 組上がってか ら 設定するべ き データ の2通 り があ り ま す。 次に点デー タ の扱い方について例示し ますがその前に点データ (ベ ク ト ル) 配列P( n ) と 成分配列X ( n ) , Y(n),Z(N),U(n)の 関係について解説 し ます。MPCには予約配列 と し てAR(n)は純粋に 演算用の配列ですが、他 は点データ と し ての意味 を も っ てい ます。点データ はP(n)であらわされ、その各成分はX(n),Y(n),Z(n),u(n) で表されています。 点配列P(n)は通常の演算で使用する こ とができ ません。 受け付ける コマン ドはMOVE, JMPZ,JUMP,PRINTの点データに基づく移動コマン ド と表示コマン ドのみです。 これに対してX(n)~U(n)は 予約配列と して単体で演算中で使用する こ とができ ます。 ①点データはコマン ドSETP, STPZUで設定でき る。 >SETP 1 100 200 >STPZU 1 300 400 ②点データは各配列成分に演算で設定でき る。 >X(1)=100 >Y(1)=200 >Z(1)=300 >U(1)=400 ③点データはプログ ラ ム中で設定でき る。 >10 SETP 1 100 200 20 STPZU 1 300 400 3-9 ④点データはプログ ラ ム中で変更でき る。 >10 X(1)=X(1)+D0 20 Y(1)=Y(1)+D1 点データはこのよ う にして様々な方法で設定 ・ 変更でき ます。 またこの使用方法は様々です。 次の3つの例 はいずれも同等の意味を持ちます。 ① MOVE P(1) ② MOVE X(1) Y(1) ③ A0=X(1) A1=Y(1) MOVE A0 A1 も う 1つの点データの設定方法は、 テ ィーチコマン ドによ る ものです。 テ ィーチコマン ドはイ ンチング動作 (JOG動作) によ り 機械体を目的の位置まで移動させ、 その点を教示する ものです。 テ ィ ーチモードに移る にはT<ENTER>と し ます。単純な初期化が終わった時点では、次の様にデタ ラ メ な値が表示されますので所 定の初期化を実施し ます。テ ィーチモードに移って最初に押すキーは0~3のいずれかです。このキーによ っ てイ ンチング量を選択し ます。実際に移動させる コマン ドは、XでCW,xでCCWです。 これはX軸の場合で、 他の軸の場合はY, Z, Uキーです。 目的の場所への移動が終了したら、 Pを押し ます。 する と改行し て番号 の入力を促してきます。 こ こで指定された番号のP(n) に現在位置が登録されます。 次の例では点1 と点3に データ を設定し、テ ィーチモード終了後PRコマン ドで表示しています。尚、テ ィ ーチモードの終了はQです。 >MPCINIT PG 2#(X,Y,Z,U) 2048 28691 2048 28691 [XYZ,U] 400 400(ここでT<ENTER>を実行しています) >PG 1 >MODE 5 >ACCEL 15000 >SETPOS 0 0 >STPZU 0 0 0 PG 1#1(X,Y,Z,U) 0 0 0 0 [XYZ,U] 200 200 (ここでもT<ENTER>を実行しています) > PG 1#1(X,Y,Z,U) 400 0 0 0 [XYZ,U] 200 200 P1 PG 1#1(X,Y,Z,U) 800 0 0 0 [XYZ,U] 200 200 P3 PG 1#1(X,Y,Z,U) 800 0 0 0 [XYZ,U] 200 200 >PR P(1) P(3) 400 0 0 0 800 0 0 0 主 な テ ィ ーチモードでの操作 キ ャ ラ ク タは次の通 り です。 参照 コマン ド : T Xx X軸のイ ンチング移動 (小文字でマイ ナ ス方向) Yy Y軸のインチング移動 (小文字でマイ ナ ス方向) Zz Z軸のイ ンチング移動 (小文字でマイ ナ ス方向) Uu U軸のイ ンチング移動 (小文字 でマイ ナ ス方向) 0 1 2 3 インチング 量の 選択 P 点データの 設定 Q テ ィ ーチモードの 終了 3-10 ティーチングプログラム 装置に テ ィ ーチング タブ レ ッ ト を装備 して テ ィ ーチング機能を 備 える こ とは多 く あ り ます。I/Oに次の図 の 様にス イ ッチ ボ ッ ク スを接続 し て XY ス テ ー ジ などをならい教示させる ものです。 この テ ィ ーチングには JOG命令 を使 う 方法 とRMOVによ って構成する場合の2通 り があ り ます。 ティーチングBOXを使った制御例 MPC パルス I/O XYロボット ドライバ ハンド パレット ティーチングBOX RMOVを使用する場合 RMOVは現在位置よ り の相対移動です。ス イ ッチ入力によ って、RMOV を実行し イ ンチング動作させます。点 の教示ではSETPコマン ド を使用し ます。 次のプロ グラ ムはX軸1軸の場合の例です。 イ ンチング 量 を 変更す る場合はRMOV の引 き数を 変数と して、 変数を デジ ス イ ッチで設定する よ う にし ます。 また、 点番号の設定 も同様 な方法 を と る もの と し ます。 1000 1010 1020 1030 1100 1110 1200 1210 1300 1310 IF SW(0)=1 GOSUB 1100 IF SW(1)=1 GOSUB 1200 IF SW(2)=1 GOSUB 1300 GOTO 1000 RMOV 10,0 RETURN RMOV -10,0 RETURN SETP 1,X(0),Y(0) RETURN JOG命令を使用する場合 MPG での JOG機能はJOG コマン ド と XRANG~URANG までの領域設定コマン ド よ り 成立 しています。 JOG コ マン ドはSTOPコマン ドで停止と な り ます。 次に X1軸のみで JOG コマン ド を使用し た例を示し ます。 910 XRANG 10000,-10000 1000 IF SW(0)=1 GOSUB 1100 1010 IF SW(1)=1 GOSUB 1200 | 1100 JOG 100,1 1110 WAIT SW(0)=0 1120 STOP 1 1125 TIME 5 1130 RETURN 1200 JOG 100,2 1210 WAIT SW(1)=0 1220 STOP 1 1225 TIME 5 1230 RETURN 点の 教示などは先の例と同様 なので 省略 し てあ り ます。動作範囲の 設定はXRANG(YRANG,URANG,ZRANG) で定めて お き ます。 また、 STOP後のTIME 5はMPG待 ちです。 ※ これは標準入力を使用した テ ィ ーチングのためのプロ グラ ム例です。 純正テ ィ ーチング ペ ン ダ ン ト 「 MPC-10KE Y」 はMPCのプロ グラ ムポー ト に接続 して ダ イ レ ク ト コマン ド で制御するため入出力や テ ィ ーチングのためのプロ グ ラ ミ ングは必要あ り ません。 3-11 パレタイズについて 点データの中には、パレ ッ ト のよ う に大量の点を必要とする ものがあ り ます。これを前記の様に点データの 教示によ って実現し よ う とする と たいへんな労力と な り ます。 パレ タ イ ズコマン ドはこのよ う な規則的な 点データ を少ない基本的な点データから生成する ものです。 次のプログ ラム例では点1、 2、 3を基本点とす る5*5のパレ ッ ト の点を定義し、 データは関数PL(n)で取 り 出しています。 100 PALET 1 2 3 110 120 130 140 P(3) MTRX 5 5 FOR I=1 TO 25 MOVE PL(I) NEXT I P (4) ’ P(1)=PL(1) P(2)=PL(5) | P(3)=PL(21) P'(4)=PL(25) P(1) P(2) パレ ッ ト はP版の場合同時に2つ設定する こ とができ ます。 コマン ドはPALET1 とMTRX1です。 対応するパ レ ッ ト 関数はPL1(n)です。さ らに点データ と同じ よ う にパレ ッ ト 点はX、Yの各成分で得る こ とができ る よ う に関数PLX(),PLY()が用意されています。尚、パレ ッ ト 点PL(n)はX,Y,Z,Uの4成分を含んでいますがパレ タ イ ズされているのはX,Yの2次元のみでU,Z成分についてはPALETコマン ドの最初の点の座標値にならいます。 前記の例では、 P(1)のZ,U値が各PL1(n)のU,Z成分と な り ます。 3-12 実際のプログラム ずい ぶん と 前置きが長く な り ま したが、これで実際 の応用の 準備ができ ま した。次にMPG-303でのモデルプ ログ ラ ムを例示し ます。 自動、 テ ィ ーチング、 原点復帰 を単純 なモデルで 表現し ています。 流れと 基本的な コマン ド をつかんで 下 さい。 #DEFS START 1 #DEFS HOMES 2 メイン操作スイッチ #DEFS TEACH 4 ' #DEFO READY 1 #DEFO ERR 2 ' #DEFS SNS1 5 インタロック用センサ #DEFS XCW 6 #DEFS YCW 7 各軸のJOGキー #DEFS XCCW 8 #DEFS YCCW 9 #DEFS PENT 10 現在位置記憶スイッチ #DEFS OP1 11 パレット交換完了スイッチ #DEFO PALET 5 パレット交換表示 '************ 'INIT '************ PG 1 MPG-303初期化 MODE 5 この例のようにPG選択、モード設定、OVRUN、 OVRUN 0 D45等を初期してからACCELを実行する D45 0 ACCEL 15000 PALET 11,12,13 パレット宣言点11,12,13を使って5×5のパレット構成 MTRX 5,5 '************ *MAIN '************ IF SW(START)=1 GOSUB *START メインプログラム IF SW(HOMES)=1 GOSUB *HOME 自動、原点復帰、ティーチングの動作を分類する IF SW(TEACH)=1 GOSUB *TEACH GOTO *MAIN '************ *START '************ MOVE P(1) ON PALET 出力パレットのONはオペレータにパレット交換を促す WAIT SW(OP1)=1 OP1はオペレータスイッチで作業完了を意味する OFF PALET J=0 3-13 *LOOP WAIT SW(SYS1)=1 パレットとパルス発生の組み合わせ例 MOVE PL(J) 移動スピードを変更する場合は’FEED’を使用します GOSUB *PLACE IF J=25 THEN *END GOTO *LOOP *PICK チャッキング動作 'PICK MOTION RETURN *PLACE プレース動作 'PLACE MOTION RETURN *END RETURN '************ *HOME 原点復帰動作 '************ サーボのZ相を読み取る場合は他にSHRDを必要とします SHOM 2,8,10 (SHRD 6~SHRD 15) HOME &H000A,100,100 RETURN '************ *TEACH '************ IF SW(XCW)=1 THEN *XMV IF SW(YCW)=1 THEN *YMV IF SW(XCCW)=1 THEN *XMVN ティーチングスイッチによる分岐 IF SW(YCCW)=1 THEN *YMVN IF SW(PENT)=1 THEN *PENT GOTO *TEACH *XMV JOG 100,1 WAIT SW(XCW)=0 GOTO *MV_END *XMVN JOG 100,2 各軸のJOGコマンドと停止 WAIT SW(XCCW)=0 停止はスイッチを離す(開放)ことによって行っています。 GOTO *MV_END スピードを変更したい場合はJOGの100を変更します。 *YMV JOG 100,3 WAIT SW(YCW)=0 GOTO *MV_END *YMVN JOG 100,4 WAIT SW(YCCW)=0 *MV_END STOP 1 JOGコマンドはSTOPによって停止します TIME 10 停止後0.1秒程のタイマを入れます GOTO *TEACH *PENT A=IN(2)^&H000F A1=IN(2)/16 A1=A1*10 ティーチング点はデジスイッチで指定することを前提としています A=A+A1 入力16~23にDSWが2ヶあると想定しています SETP A,X(0),Y(0) RETURN 3-14 パルス発生3 パルス発生の作業の中で最もやっかいなのがパルス発生中の途中停止です。パルス発生はI/O制御と異な り 停止が必要と なった時点でどのよ う な状態であるか、 あ るいはどのよ う に停止したいかによ って処理が変 わ り ます。 残念ながらMPC-816での途中停止は仕様追加によ って構成されているためわか り に く いもので あった り 、コマン ドが対称的にサポー ト されていなかった り し ます。この節では代表的なパルス停止の方法 を紹介し ます。 パルス停止の注意事項 QUITの禁止 マルチタ ス クの使用方法に習熟して く る と、 ある作業の停止には QUIT が便利だとい う こ とがわか り ます が、 これは、 パルス発生の場合にはあてはま り ません。 パルス発生中のタ ス クに対して不用意にQUITする と それ以降MPGに対し てのコマン ドが無効になる こ とがあ り ます。 悪い例 *LOOP FORK 1100*PG TIME QUIT 1100 TIME *LOOP *PGGOTO RMOV 1000 1000 TIME 50 RMOV -1000 -1000 TIME 50 GOTO *PG 良い例 *LOOP FORK 1100*PG TIME STOP BSY(1)<>0 4 WAIT QUIT 15 STOP GOTO *LOOP *PGRMOV 1000 1000 TIME 50 RMOV -1000 -1000 TIME 50 GOTO *PG STOP後の処理(STOPさせても次の命令は有効) MPGにSTOPをかけても イ ン タプ リ タの停止が止ま るわけではあ り ません。 パルス発生中のコマン ドが停止 させられるだけです。 このため、 STOPによ って完全に動作を中断させるには次の様な 工夫 が必要です。 悪い例 FORK 1SW(1)=1 *MPG WAIT STOP 1 END *MPGRMOV 100 0 GOTO *MPG 良い例 FORK SW(1)=1 1 *MPG WAIT STOP 1 END *MPGRMOV 100 0 WAIT GOTO BSY(0)=1 *MPG 悪い例ではRMOV 100 0が1回停止させられてもすぐ次のコマン ドが実行されて、 再びRMOV 100,0が実行さ れます。 良い例ではRMOV ご とにWAIT BSY(0)=1のチェ ッ ク をし てお り 1度STOPで停止させられる と こ こで 条件待ち と な り ます。 JOG,STOP後の現在位置読み取り テ ィ ーチング用のプログ ラムを作る場合に JOG とSTOPを 組み合わせますが、STOP実行後ただちに現在位置 を読み取る 関数を実行する と、 STOPが無効にな り ます。 次に1軸の テ ィ ーチングプロ グラ ム例を示し ます。 STOP後に0.1秒 のタ イマを入れています。 これはSTOPの実行とMPGの停止の間には時差があ り 、 この間に MPGに対して指示を 与 える と誤動作してし ま う こ とがあるためです。 *TEACH IF SW(1)=1 THEN *XCW IF SW(2)=1 THEN *XCCW IF SW(3)=1 THEN *END GOTO *TEACH *XCW 3-15 JOG 100,1 WAIT SW(1)=0 STOP 1 TIME 10 X=X(0) GOTO TEACH *XCCW JOG 100,2 WAIT SW(2)=0 STOP 1 TIME 10 X=X(0) GOTO *TEACH 0.1秒タイマ 0.1秒タイマ このこ とは通常のRMOVやMOVEでも同様です。 次の例のよ う にSTOP停止をかけたあ とでMPGの実際 の停 止をBSY()関数によ って監視する必要があ り ます。 悪い例 良い例 PG 1 FORK 1,*PG TIME 100 STOP 1 X1=X(0) END *PG MOVE 10000,0 END PG 1 FORK 1,*PG TIME 100 STOP 1 WAIT BSY(1)<>0 X1=X(0) END *PG MOVE 10000,0 END 複数のタスクからのコマンド プロ グラ ムの設計時には各 タ ス クの用途は整理されて、 パ ルス 発生用、 I/O制御用と分類されていますが最 終的な段階ではこの秩序が保ちきれな く なる こ とがあ り ます。例えば、前記の例にあったよ う に他のタ ス ク が停止コマン ド を実行するために 座標読み取 り は他のタ ス クが実施 し ます。 又、 複数のユニ ッ ト がからみ あった位置決めでは複数のタ ス クから同一のMP G に対して指示を 与 えた く なる こ とがあ り ます。 こ う した 場合には、交通整理をきちん と しなければな り ません。 セ マ フォ を使 う場合 (複数のタ ス クが同じMPGにコ マン ド を出力) 次の 様に セ マ フォ関数を使えば複数のタ ス クがコマン ド を出しても問題は発生 し ません。 ①セ マ フォ の場合 *TASK1 WAIT RSV(-1)=0 MOVE 1000,0 OFF -1 GOTO *TASK1 *TASK2 WAIT RSV(-1)=0 RMOV -1000,0 OFF -1 GOTO *TASK2 *TASK1 A=1 WAIT A=0 GOTO *TASK1 *TASK2 B=1 WAIT B=0 GOTO *TASK2 ②パルス 発生 を 1 つのタ ス クにま とめた場合 *PG IF A=1 THEN *MV IF B=1 THEN *RV GOTO *PG *MV MOVE 1000,0 A=0 GOTO *PG *RV RMOV -1000,0 B=0 GOTO *PG 3-16 STOP コマンド 引 様 味 減速 パ 発生 続 パ 発生 STOP コ マン ド は1~5ま での き 数が あ り 次の に意 が異な り ます。 STOP 1 停止 STOP後 し その後停止 し ます。 STOP 2 停止 STPO後ただちに ル ス 中止 し ます。 STOP 3 次に く ル ス コ マン ド に対 し てのみ有効なI/O監視停止 減速 急 STOP 3,10,1 MOVE 10000,0 V 命令です。 減速 こ の例ではポー ト 10がONにな っ た ら 次のMO E コ マ ン ド で 停止 し ます。 STOP MP コ マン ド 付を一時停止 し ます。 STOP 5 STOP に よ る一時停止を し ます。 ルス を停止す る コ マン ド は、 こ の にO RUNがあ り ま す。 O RUNは常時入力ポー ト を監視 し て が成 す る と ル ス を中止 し 、 イ ン タ プ リ タ の実行を停止 し ます。 こ のため ラ ー が必要な場合は STOP 1 STOP 2を監視 タ ス ク か ら 実行 し ます。 、 STOP STOP 5は ル ス コ マン ド その も の を停止す る こ と がで き る ので こ れ を み合 せ る と 非常停止は簡単に実現す る こ と がで き ます。 4 パ G 発生 立 パ , 発生 組 *MAIN *EMG *PG 4 4 わ 受 他 V 又 解除 V 4, パ 発生 エ 回復 条件 FORK 1 *PG IF SW(1)=1 THEN *EMG IF SW(2)=1 THEN *JOB1 | その他の処理 GOTO *MAIN STOP 4 STOP 1 WAIT BSY(1)<>0 | | 後処理 QUIT 1 STOP 5 GOTO *EMG MOVE WAIT MOVE WAIT GOTO MPGへのコマンド実行停止設定 MPGのパルス発生中止 停止確認 タスクの停止 MPG停止の解除 1000 0 SW(3)=1 0 0 SW(4)=1 *PG お 発生 ぐ W BY = 組 込 パ 発生 も し STOP を先に実行 し て かない と 、 STOP 1はその時実行 さ れてい る ル ス コ マン ド のみに有効で すか ら ル ス 中止後す に次の コ マ ン ド を実行 し て ル ス し て し ま い ます。 も う 一つの方 は、 移動 コ マ ン ド に AIT S (0) 1を み んで き ます。 パ *PG FORK TIME STOP WAIT QUIT END パ お 発生 1 *PG 1 BSY(1)<>0 1 RMOV 1000,0 WAIT BSY(1)=1 GOTO *PG STOPで停止すると次へは進まない 3-17 法 各 PG -1 でのパルス停止 G パ 発生前 V W 4 P -1ではSTOP コ マン ド が使用で き ません。 ル ス にO RUN コ マ ン ド でMIF-816の入力(S (2 )~ (31))の タ ーン を指定 し ます。 次は指定例 と サ ン プルプ ロ グ ラ ム です。 V パ O RUN指定例 OVRUN OVRUN OVRUN OVRUN &HFF &H01 &HFFFF &HFF01 "SW(24)~(31)のどれかがONで停止 "SW(24)がONで停止。使わないポートは一般入力OK "SW(24)~(31)のどれかがOFFで停止 "SW(24)がOFFで停止。使わないポートは一般入力OK サ ン プルプ ロ グ ラ ム ACCEL 3000 FEED 0 FEDZ 0 OVRUN &HFF MOVE 10000 10000 IF IN(3)<>0 THEN *OVRUNERR "SW(24)~(31)のどれかがONで途中停止 "パルス発生 "停止原因確認。OVRUNならエラー 3-18 MPG-301の使用例 G 汎 パ 発生 :X 搭載 お 途 ① kpps 超 高速パ 発生 ②パ 発生 速度 減即 変更 字 減速 途 ③エ ダカウ G 途 詳 ュ 当社Web 製品 ュ 参照 ュ 紹介 パ ボ テ パ 続 差 バ パ 続発生 速度 変更 G 内部レジ 参照 ・ 変更 可 MP -301は 用の ル ス IC 3202を し て り 、 次の よ う な用 に対応で き ま す。 50 を える ルス ルス 中での や加 の 、S 加 な ど を必要 と す る 用 ン コー ン タ の入力 MP -301には別 、 細マニ アル ( サイ ト 、 別マニ アル) が用意 さ れてい ま すので、 使用 例については こ ち ら を し て く だ さ い。 こ のマニ アルでは簡単な例を一つ し ま す。 接 は、 MP 301の ル ス出力を サー モー タ あ る いは ス ッ プモー タ の ル ス入力に接 す る だけです (MP -301の出 力は 動出力 ド ラ イ です)。 プ ロ グ ラ ム例では ル ス を連 さ せなが ら 、 入力0か ら 7の に し たが っ て を し 、IN8をONにす る と 停止す る と い う も のです。 こ の例で見 る よ う にMP -301は リ アル タ イ ム で スタの が 能です。 続 G 値 G ステップ/サーボモータドライバ MPG-301 ドライバ Driver 入力 CW+ Driver 入力 CWDriver 入力 CCW+ Driver 入力 CCW- MPG-301 J4 1 (CW+) 2 (CW-) 3 (CCW+) 4 (CCW-) ※接続には ツウ ィ ス ト ペ ア を推奨 し ます。 ま た、 100 k 以上の 高速パル ス 発生には、 高速信号伝達に 配慮 さ れた ケ ーブル を ご 使用 く だ さ い。 "SW(8) ONで停止 '"N0-IN7 DSWの読み取り ST_REG 0,250 ST_REG 3,100 ST_REG 4,1000 ST_REG 5,100 ST_REG 6,100 CMND &HA0 CMND &H06 IF SW(8)=1 GOTO *STOP R4=IN(0) R4=R4*20 ST_REG 4,R4 GOTO *LOOP *STOP CMND &H31 WAIT REG(-1)=&H20 WAIT SW(8)=0 GOTO *MAIN "周波数倍率250の時倍率は1/1 "起動周波数100pps "最高周波数1000pps "加速レート100pps2 "減速レート "動作完了フラグリセット "連続駆動 "読み取り値の20倍の値を速度とする。 "周波数変更 "減速停止命令 "動作完了待ち 3-19 RS-232C通信 MPC 間の通信 MPC間で通信をす る 場合は次の3つの コ マ ン ド で CNF # INPUT# PRINT# G, , 充分です。 参照 : 5章 コ マ ン ド リ フ ァ レ ン ス MPC-1 MPC-2 10 CNFG# 2 0 2 20 ON 1 30 PRINT# 1 40 INPUT# A 50 IF A=0 THEN *ERROR 60 OFF 1 70 GOTO 20 1000 *ERROR 1010 ・ ・ 10 CNFG# 2 0 2 20 INPUT# A 30 ON 1 40 TIME 100 50 IF SW(1)=0 THEN *ACK 60 OFF 1 70 PRINT# 1 80 GOTO 20 1000 *ACK 1010 PRINT# 0 ホ 値 送 セ ジ 受 テ 待 継続 業 変更 高度 様 こ の例ではMPC-1が ス ト と な り 30で数 1 を 出 し てい ま す。 こ れに対応す る のはM PC -2 のINPUT# で MPC-1か ら え ら れた メ ッ ー を け取 る と 次の ス ッ プ みま す。MPC-1は、MPC-2に指示を 出す る と 0のINPUT#でMPC-2か ら の信号を ち ます。 こ こ で注意す る のは、返っ て く る 数 には0 と 1の2 があ り 、 それに よ っ てMPC-1の 作 も さ れ ます。 こ の よ う に通信に よ る イ ン タ ロ ッ ク では、 が数 と し て扱え る ため イ ン タ ロ ッ ク を な も の と す る こ と がで き ます。 、通信を け取 る で ル ス と し て使用す る 場合は次の に な り ます。 与 4 MPC-1 MPC-2 | 100 PRINT# X1 Y1 120 INPUT# A 130 IF A<>7 THEN *ERR | 5 10 20 30 40 進 値 又 受 送 種類 情報 値 側 パ 発生器 *LOOP INPUT# A B RMOV A B PRINT# 7 GOTO *LOOP パソコンと MPC の通信(CH1 を使用した場合) パソコン(N88BASIC) MPC側 10 OPEN "COM1:E71XN" AS #1 | | 100 PRINT#1,A,B 110 INPUT#1,C | | 5 10 20 30 40 注意すべ き こ と は、 通信の手順を あ 簡単に通信が実現で き ま す。 CNFG# 2 0 2 INPUT A B RMOV A B 0 PRINT# 7 GOTO 10 わせ る こ と です。 N88BASIC と MPCの通信 コ マ ン ド は良 く 似 てい る ので 複雑なプロトコルに対応 Y 字キャ 様 関 パソ 等 固 フォ 備 器 計測器 ・ 表 器 等 側 GET#() PUT# PUTS# GETN# SKIP# FIND# こ こ では、 電圧計測器 か ら 次の 様 な フォ ーマ ッ ト で デー タ が 送 ら れて く る も の と し ます。 [SP]X1=230.13[SP][SP]Y1=156.17[SP][CR] こ の場合、 通常のINPUT#文では ” X1” や ” =” 等 の文字 が 邪魔 にな り 、 正常な数値 の取 り 込 みがで き ま せん。 こ う し た場合、 次の 様 なプ ロ グ ラ ム を 組 めばデ ー タ を取 り 込む こ と がで き ます。 T N F S C では文 ラ ク タ の操作のために次の な コ マン ド や 数がサポー ト さ れてい ます。 対 コ ン、対MPC の通信の場合は こ う し た コ マ ン ド を使用す る 必要は無いのですが、 定の通信 ーマ ッ ト を え た機 ( 示 ) に対 し ては、 MPC でプ ロ ト コ ル を整合 さ せ る 必要が あ り ます。 3-20 当 100 110 120 130 140 150 160 170 180 190 200 210 220 SKIP# &H3D GETN# X0 SKIP# &H2E GETN# X1 SKIP# &H3D GETN# Y0 SKIP# &H2E GETN# Y1 SKIP# &H0D X0=X0*100 X0=X0+X1 Y0=Y0*100 Y0=Y0+Y1 字 &H3Dは‘=’ 230を変数X0にとりこむ &H2Eは‘.’ 13を変数X1にとりこむ 156を変数Y0にとりこむ 17を変数Y1にとりこむ &H0Dは‘CR’ X0には23013がセットされる Y0には15617がセットされる 検索 G デ 様 字 ・ 字列 込 再 与 変 代 前 デジボ ピ オ 込 字列 SKIP#は相 す る文 コ ー ド を し 、 ETN#は数 文 のみを 数に 入 し ます。 こ の例は リ ド を んで 1 つの ー タ を 2 つの整数 ー タ と し て取 り み後で 合成 し てい ます。 記は ー タ の読み み で し たが、 装置に よ っ てはRS-232Cで コ マン ド を え る も の も あ り ます。 ルに対 し て次の文 を出 力 し なければな ら ない時は例の に し ま す。 挟 デ "CH1 DAT"[CR] 字 字 他 デ 【例1】 100 'CH1 DAT 110 PUTS# STR(-1) 120 PUT# &HOD 【例2】 100 PUT# &H43,&H48,&H31 110 PUT# &H20,&H44,&H41 120 PUT# &H54,&HOD Y 内部 デ お 関 n 受 キャ キャ 類 率 悪 率 こ の よ う に文 を文 コ ー ド と し て扱 う こ と に よ っ てT N F S C で ー タ を処理で き る よ う に し てい ま す。 通信プ ロ グ ラ ム で に有効な コ マン ド と し て え て き たいのは、 数RS( ) と TST#(0)です。 RS( )は コ マ ン ド で処理 さ れていないが、 ッ にた ま っ てい る 信 ラ ク タ の数を知 ら せ ます。TST#(0)はCH1だ けに ら れ ますが ー タ を読み出 さ に け取っ てい る ラ ク タ を分 し ま す。 I N P U T # や E T # ( 0 ) は ラ ク タ を け取っ てい な く て も ラ ク タ ちの状態 と な る ため実行効 が く な り ます。 R S ( ) や TST#(0)で 信状態を の上プ ロ グ ラ ム を め る と よ り 効 の良いプ ロ グ ラ ム を記述で き ます。 キャ 限 受 受 デ 確認 バ ファ ず 受 キャ 覚 進 待 n G n パソコンと MPC の通信(CH 0 を使用する場合) こ こ では、プロ グラ ム 用CHを パソ コ ン に接続し て使用する 方法について述べま す。次の 様な簡単な例に 基づき 専用プロ グ ラ ム を つく る こ と にし ま す。プロ グ ラ ム は、 与えら れた データ に 基づいてポート を ON/OFFし ま す。 10 'SAMPLE 20 INPUT B 30 QUIT 1 40 OFF A 50 A=B 60 FORK 1,1000 70 GOTO 20 1000 ON A 1010 TIME 20 1020 OFF A 1030 TIME 20 1040 GOTO 1000 これに対応する プログラムは次 の様になります ソフ ・ セ ソフ ・ セ B エ 割 込 禁 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 190 200 'INITIAL OPEN "COM1:E71XN" AS #1 PRINT#1,CHR$(&H1); IF INPUT$(1,#1)=">" THEN #START GOTO 40 ' *START PRINT#1,"RUN";CHR$(&HD); ' 'MAIL LOOP IF INPUT$(1,#1)="?" THEN *RSPNS ELSE 110 *RSPNS0 INPUT "PLEASE SET DATA PORT NUMBER ",A IF A>B THEN *RESET PRINT#1,A;CHR$(&HD); GOTO 110 ' *RESET INPUT "CAN I RESET FASIC !!(Y/N)",C$ IF C$="Y" THEN 30 ELSE *RSPNS ” ” >” レ 捨 , $ ;” ” ?” キ ・ Z版 パ こ の例では、 MPCの ト リ ッ ト が使用 さ れてい ます。 01H コ ー ド で PRINT#1 CHR (&H1) によ っ てMPCは ト リ ッ ト し ます。 ASICのプ ロ グ ラ ム中では、 の ス ポ ン ス と INPUTの を ー ラ ク タ と し て使用 し てい ます。 コ ー ッ ク は全て読み て と な り ます。 こ う し たや り と り で注意す る こ と は、 MPCが り み 止 と な っ てい ないだ ろ う か と い う こ と です。 り み 止は、 での ル キャ ・バ ? 3-21 割 込 禁 発生 お キャ 受 可 > 待 ず キャ 送 続 続 基本 解説 外 身 持 < >+< >キ シャ セ ジ 等 外 限 ず” ” 送 内容 破壊 様 基本 ソフ ・ セ , , 等 デ 詳説 ス 時に こ り 、 こ の時M PC はただ1つの ラ ク タ のみ 付 能でそれ以上は ら ない よ う に し ま す。 ま た、 ス ポ ン ス ( ) を た に ラ ク タ を り け る と プロ グ ラ ムの が される こ と があ り ま す。 こ の よ う に、 CH 0に接 し てMPCを制御す る こ と も で き ますが こ れにはMPCのプ ロ ト コ ルつい て 細 に知 る 必要が あ り ま す。 次に プ ロ ト コ ルについて し ます。 MPCでは、 次の な プ ロ ト コルを ち ます。例 は、 コ マ ン ド 自 が通信出力を つ場合、 CTRL A ーに よ る ト リ ッ ト の場合、 さ らにイニ ルの メ ッ ー 出力 の場合です。 例 コ マ ン ド は、 TEACH PRINT INPUT の ー タ 入出 力 コ マ ン ド に ら れ ます。 こ こ では ま 、 ON 1 を例 と し てプ ロ ト コ ル を し ます。 レ 《TERMINAL》 O N [sp] 1 [cr] 命令 エ このよ う に を コー す。 例えば、 一行入力 《MPC》 O [echo] echo: N [echo] sp: [sp] [echo] cr: 1 [echo] lf: [cr] [echo] 命令実行 [cr] [lf] > 詳 持 エコーバック スペース リターン ライン・フィートを意味します。 バ ッ ク し 、 実行終了 と と も に [lf] > を出力 し ます。 プ ロ グ ラ ム の入力 も 全 く 同様 で ” 10 ON 1” の場合は次の様 にな り ます。 《TERMINAL》 1 O [sp] O N [sp] 1 [cr] 《MPC》 1 [echo] O [echo] [sp] [echo] O [echo] N [echo] [sp] [echo] 1 [echo] [cr] [echo] 命令実行 [cr] [lf] > こ の 資料 でプ ロ ト コ ルの全て を 前記の 様 に記述す る のは困 難で あ り ますので、 次の 様 な 略 記法 を用い ます。 エ コ ー部は、 ( )で囲ま れた部分です。 レ ス ポ ン ス は、 キャ ラ ク タ と ヘキ サで表記 し ます。 ヘキ サは、 [&H_ ] と 表 現 し ます。 ☆★☆★☆★☆ 特殊プロトコル一覧 ☆★☆★☆★☆ (NEW[&HD]) [&HD][&HA]> (10 ON 1[&HD]) [&HD][&HA]> (20 ON 2[&HD]) [&HD][&HA]> (30 TIME 100[&HD]) [&HD][&HA]> (LIST[&HD]) [&HD][&HA]10[&HA]ON 1 [&HD][&HA]20[&H9]ON 2 [&HD][&HA]30[&H9]TIME 100 [&HD][&HA]> (INPUT A B[&HD]) [&HD][&HA]?(1234 567[&HD]) [&HD][&HA]> (PRINT A B[&HD]) [&HD][&HA] 1234 567 [&HD][&HA]> (TEACH[&HD]) [&HD](X,Y,Z,U) 0 0 210 0 [XYZ,U] 100 100 [&HD][&HA]> 実 ミ (*Q) 際 の詳細が不明の場合はFTMWディ ス ク に 含 ま れ るACTERM を使用 し て下 さ い。 ACTERM は無手順 タ ー ナル ソ フ ト で受 け取っ た コ ン ト ロ ール コ ー ド も 表示で き ます。 3-22 デジタル社タッチパネルとの接続 ザ ャ ネ デジ 社「 ホ 表 器 G シ リ ー ズ」 の 込 /書込みで パ MPC-816のRS-232Cユー ーチ ン ル (CH1) と タル プ ロ グ ラ マブル 示 P70 メ モ リ リ ン ク 通信のサ ン プルです。メ モ リ リ ン ク ではMPCが ス ト と な り 、 P メ モ リ の読 み ルを コ ン ト ロ ール し ま す。 ネ G 「「割 込 」 際 部品 「割 込 」 レ シ テ デ エ 各 W 来 G 待 法 利 デ 得 G G 画面 デザ 」 「 W」 「 」 押 「 」 お 押 識 G 「W」 ・G ボ 押 レ 可 超 パネ デザ 向 例1)は Pの り み出力 を用いた例です。 こ のプ ロ グ ラ ム を実行す る には、 Pの を イ ンす る に、 の出力を り み出力 と し て 定 し ま す。 り み出力 と は ワ ー ド S や Tタ グ の ワ ー ド ア ド ス を ス ム ー タ リ ア 13 に り て る と 、 それ を し た と き に 定数 をRS-232C出 力す る と い う も のです。 ワ ー ド S やT タ グ に 有の 定数 を 定 し て けば、 さ れた も のの 別が出 ます。 MPCはその出力を ET#で っ てい る だけです。 ラ ン プ のMPCか ら の出力は Pの コマン ド で行っ てい ます。 こ の方 の 点は、 プ ロ グ ラ ム が簡単 常時ループ し ない Pの タ ン を し た と き の ス ポ ン ス が良い、 な どが あ り ます。 し か し 、 出力 能な定数は1 イ ト (&HFFは不 ) なので、 こ れ を え る ー タ は ら れ ま せん。MPC と リ ン ク で き る の と 数 も ら れ ます。簡単な ル イ ン きで す。 設 「割 「 」 割 当 固 「 」 ・ 可 部品 種類 パネ 込 G 「」 法 利 デ デ 込 欠 レ 低下 レ ペ ジ 部品 レ 1回 4ビ 程度 込 設 等 バ 限 書込 G 「W」 G 「 値表 器」 「設 値表 器」 度 デ ペ ジ 範 限 範 設 レ 低下 感 例2)は ルか ら の読 みを Pの R コ マン ド で行っ てい ます。 みは例1 と 同 じ Pの コ マン ド です。 こ の方 の 点は ワ ー ド ー タ が扱え る こ と です。 Pの 数 示 や 定 示 な ど の16 ッ ト ー タ の読 みがで き ま す。 点は、 プ ロ グ ラ ム が複雑、 常にループす る 、 一 に多 く の ー タ を入力す る と スポン スが し ま す。 ス ポ ン ス については、 ー 単位で入力 囲を制 すれば良いで し う 。(同 一 ー の のア ド ス は のR E A D で読め る 囲に 定す る ) こ のサ ン プルでは1 ループで ワ ー ド (6 ッ ト ) をREAD し てい ますが、 こ の な ら スポン スの はあ ま り じ ら れ ません。 GPの通信設定 : キ-互換 設 : 伝送速度9 bps デ bit 式: G G 画 説明 」 ビ ょ 4 通信プ ロ ト コ ル ア ス 通信 定 600 、 ー タ 長8 、 ス ト ッ プ ッ ト 1、 リ 無 通信方 RS-232C メ モ リ リ ン ク プ ロ ト コ ル、 P操作、 P作 につい ては タ ル の 取扱 を さ い。 こ れはRS-232C通信を す る ためのサ ン プルプ ロ グ ラ ム です。 実 に タ ッ チ ル を接 す る には M K-816 を用い ます。 ※ ※ 「 B 例1) '************ ' GP-H70 ' SAMPLE '-----------' USE T-TAG ' & SYS Adr13 '============ 'GPH70S10 ' 980818 '************ CNFG# 4,0,2 FORK 1,*RS_RCV *LP1 A=600 S=IN(0) GOSUB *WRITE WAIT IN(0)<>S GOTO *LP1 *WRITE PUT# &H1B,&H57 S0=A^&HF000 S0=S0/&H1000 GOSUB *WRITE1 S0=A^&H0F00 S0=S0/&H0100 GOSUB *WRITE1 S0=A^&HF0 S0=S0/&H10 GOSUB *WRITE1 ビ パ ティ デジ 社 各 説明書 ご覧下 際 パネ 続 "入力用のタスク "書込みアドレス "書込みデータ "ESC W "アドレス(hex表記)をアスキーコードで出力 3-23 S0=A^&H0F GOSUB *WRITE1 S0=S^&HF000 S0=S0/&H1000 GOSUB *WRITE1 S0=S^&H0F00 S0=S0/&H0100 GOSUB *WRITE1 S0=S^&HF0 S0=S0/&H10 GOSUB *WRITE1 S0=S^&H0F GOSUB *WRITE1 PUT# &H0D RETURN *WRITE1 IF S0>9 GOSUB *A_F ELSE_GOSUB *0_9 PUT# S0 RETURN *A_F S0=&H37+S0 RETURN *0_9 S0=&H30+S0 RETURN '************ *RS_RCV R=GET#(0) PRINT R OUT R,0 GOTO *RS_RCV 例2) '************ ' GP-H70 ' SAMPLE '-----------'USE GP ' READ/WRITE ' COMMAND '============ 'GPH70S20 ' 980818 '************ S=0 CNFG# 4,0,2 *LP1 A=600 S=IN(0) GOSUB *WRITE ' FOR A=500 TO 503 GOSUB *READ NEXT A ' GOTO *LP1 *WRITE PUT# &H1B,&H57 S0=A^&HF000 S0=S0/&H1000 GOSUB *WRITE1 S0=A^&H0F00 S0=S0/&H0100 GOSUB *WRITE1 S0=A^&HF0 S0=S0/&H10 GOSUB *WRITE1 "データをアスキーコードに変換して出力 "入力待ち "READ,WRITEとも同一タスク "書込みアドレス "書込みデータ "A=読込みアドレス 3-24 S0=A^&H0F GOSUB *WRITE1 S0=S^&HF000 S0=S0/&H1000 GOSUB *WRITE1 S0=S^&H0F00 S0=S0/&H0100 GOSUB *WRITE1 S0=S^&HF0 S0=S0/&H10 GOSUB *WRITE1 S0=S^&H0F GOSUB *WRITE1 PUT# &H0D RETURN *WRITE1 IF S0>9 GOSUB *A_F ELSE_GOSUB *0_9 PUT# S0 RETURN *A_F S0=&H37+S0 RETURN *0_9 S0=&H30+S0 RETURN '************ *READ PUT# &H1B,&H52 S0=A^&HF000 S0=S0/&H1000 GOSUB *READ1 S0=A^&H0F00 S0=S0/&H0100 GOSUB *READ1 S0=A^&HF0 S0=S0/&H10 GOSUB *READ1 S0=A^&H0F GOSUB *READ1 PUT# &H30,&H30,&H30 PUTS# 1 PUT# &H0D ' SKIP# &H41 INPUT# D O=A-500 OUT D,O RETURN *READ1 IF S0>9 GOSUB *A_F ELSE_GOSUB *0_9 PUT# S0 RETURN "ESC R "アドレス(hex表記)をアスキーコードで出力 "読込みデータ数=1 "Aまで読み飛ばし "CRまで入力 3-25 MBK-816 の使用方法 前節 では タ ッ チパネ ル イ ン タ ー フェ ース をRS-232Cで実現 し ま し たが、複雑な用途 にはプ ロ グ ラ ムが 煩雑に な り 保守 し に く い も のにな り ます。本格 的な タ ッ チ パネ ルの応用にはMBK-816が 適 し てい ます。こ こ では簡 単にMBK-816の 紹介 を し ます。 (詳 し く は当社Webサ イ ト 、 製品別マニ ュ アル を 参照 く だ さ い。) MBK-816を用い る と 次の よ う な メ リ ッ ト があ り ます。 ①RS-422接続 と な る ため、 信頼性が 向上 し 、 通信速度 も 速 く な る 。 ② イ ン タ ー フェ ー ス コ マン ド がON/OFF/SW()/OUT/IN()な ど のI/O コ マ ン ド にな り 扱いやす く な る 注意 と し て次の事柄 があ り ます。 ①MBK-816の 消費電流が大 き いので設計時に注意 ②IF SW(5000)=1 THEN ~ と い う 記述が出来 ない。 A0=5000, IF SW(A0)=1 THEN ~ と す る 。 MBK-816 Butaface タッチパネルディスプレイ MIF-816 MPC-816 3-26 いろいろなトラブル 出力トランジスタの破損 MPCの ト ラ ブルで最 も 多いのが出力 ト ラ ン ジ ス タ の 破損 です。 こ れは通電 し た ま ま 配線 チ ェ ッ ク を し た り 、 配線チ ェ ッ ク し ない ま ま パ ワ ー オ ン し た場合に 発生 し てい ます。いずれに し て も 初歩的な ミ ス です。十分に 注意 し て 配線 は 確 かめて 下 さ い。 修 理は ト ラ ン ジ ス タ 交換 と な り ま す。 バッテリバックアップ関係のトラブル テ ィ ウ 電池 バ 持 バ テ バ 設 変 MPC-816のRAMは、 リ ム で ッ ク ア ッ プ さ れてい ます。 こ れに よ り 定 さ れた 数、 ポ イ ン ト ー タ が無通 中 も 保 さ れ ます。 し か し 、 ッ リ ッ ク ア ッ プは リ ー ト な保 方 のため相応の注 意が必要 と な り ます。 デ 電 組立時の注意 電 テ ィ ウ 電池 箔 包 デ 変わ 安 確 デ ケ 活 電池放電 持 法 鉄 又 静電気 放 組立 MPC-816は無通 中に も リ ム に よ り SRAMが か さ れてい ます。 こ の ためMPC-816を やアル ミ の に直接置い た り アル ミ に んだ り す る と やSRAMの ー タ が さ れ ます。 、 の を ける こ とによ っても ータが っ て し ま い ます。 時には 記を考慮の上扱 う こ と と 、 後は MPCINITの初 化を行 う こ と が 全で 実です。 板 電 受 期 組立 デ 前 破壊 パソコンと接続した時 装置に 組 み込 まれたMPC と 外部 の パソ コ ン を接 続す る と き にMPCのRS-232Cポー ト に 電気 的な シ ョ ッ ク が 発生 し ま す。特に、200V系の装置では こ の 度合が大 き く 甚だ し い場合は イ ン タ ー フェ ー ス のICを 壊 し て し ま い ます。 こ れは、 パソ コ ン と 装置のアース を 共 通にす る こ と に よ り 回 避で き ますが、 現場ではなかなか難 し い こ と です。MPC-816では、RS-232C イ ン タ ー フェ ース 回路 を フォ ト カ プ ラ で 絶縁 分離 し て 外乱 か ら 内部回 路 を保護 し てい ます。 プログラム上の問題 登載 Y 9 9年 来フ ィ 仕様 古 供 誤解 ソフ バ MPC-816に さ れたTN FSCは1 8 以 ール ド で実用に さ れてい る ト です。 こ のため、 グ は相 ら さ れ てい ま すが、 が い ためにい く つか 上の を ま い た り 用 が不 であ っ た り す る 場合が あ り ま す。 当減 FORKについて 概念 発生 質 普 ね パソ 法 明確 等 お目 FORKはマルチ タ ス ク を さ せ る コ マ ン ド ですが、 ふだん 通のプ ロ グ ラ ム ( コ ン ) では にか かれ ません。 こ のため、 性 がつかみに く か っ た り 、 初 的な用 の り を く こ と が あ り ま す。 例えば、 次の例です。 前 B 味 始 歩 5 *LOOP 10 IF SW(1)=0 THEN *NEXT 20 FORK 1 *SUB 30 *NEXT 40 GOTO *LOOP 50 *SUB 60 ON 0 70 TIME 10 80 OFF 0 90 END W 値 B 限 何度 法 誤 招 期待 記の例ではS (1)の が1になっ た時にプロ グ ラ ム *SU が動作する こ と を し ている のですが、こ れでは *SU プロ グ ラ ム が動作し ま せん。こ れはFORKが実行さ れた時点でプロ グ ラ ム *SU を 実行し める と いう 意 になる ためです。 こ の例では、 S (1)が1になっ ている り も FORKが実行さ れその に*SU から 実 行し めま す。 つま り 、 プロ グ ラ ム が 行する に 起動かけら れてし ま いま す。 し く は次の にし ま す。 W 進 前 再 5 *LOOP 10 IF SW(1)=0 THEN *NEXT 12 FORK 1 *SUB 14 WAIT SW(1)=0 16 QUIT 1 30 *NEXT 40 GOTO *LOOP 3-27 B 正 度 始 B 様 再 反応が遅いと思われる場合 多 く の入力で制御を分 合が あ り ます。 類す る場合に、 IF文 と SW(n)関数を 組み合わ せて 何行 も 記述す る と 反応が遅 く な る 場 5 *LOOP 10 IF SW(1)=1 THEN *WORK1 20 IF SW(2)=1 THEN *WORK2 30 IF SW(3)=1 THEN *WORK3 (中略) 200 IF SW(20)=1 THEN *WORK20 210 GOTO *LOOP n 関 こ の よ う な場合は、 IN( )で入力 数を 減 ら し た方が有利 です。 5 *LOOP 10 A=IN(0)~&HFE 20 IF A=2 THEN *WORK1 30 IF A=4 THEN *WORK2 40 IF A=8 THEN *WORK3 | 50 IF A=128 THEN *WORK7 60 A=IN(1) | HSW(n)を使用した場合の注意 節 げ Wn ノ ズ 策 Wn等 関 限 高速反 度 問題 組 込 関 度 先の で と り あ たS ( )は イ 対 のための2 読み機能が み まれてい ます。 こ れに対 し て2 読み を し ないのがH S ( ) H の付 さ れた 数です。 こ のため こ の 数を使えばプ ロ グ ラ ム が ン グル タ ス ク で ある り 応す る プ ロ グ ラ ム と な り ます。 は こ れ を マルチ タ ス ク で使用す る と 効 と な る こ と です。 シ 逆 果 10 20 30 40 50 FORK 1 *PRG1 FORK 2 *PRG2 *LOOP IF A=1 THEN *SUB1 IF B=1 THEN *SUB2 | 100 GOTO *LOOP 200 *PRG1 210 A=HSW(1) 220 GOTO *PRG1 230 *PRG2 240 B=HSW(2) 250 GOTO *PRG2 こ のプ ロ グ ラ ム では、 *PR G1 と *PRG2の中でHSW (1) と HSW (2)を使 う こ と に よ っ て 高速 を 期待 し てい ま すが 逆効果 と な り ます。 結果 と し てはSW(1), SW(2) と し た方が 総合的には高速 と な り ます。 こ れは、 マルチ タ ス ク に お け る 時間 資源 の有効活用 と い う 難 し い 内容 にな り ます。と り あ え ず こ こ では、1つの タ ス ク でHSW ()等 を使用す る 場合にのみ高速応答 が 期待 で き る と い う こ と を御了解下 さ い。 エラー停止 Y エ 発生 下 セ ジ を 表示 し ますが こ の文番号は セ ジ 発生 し た ト ラ ブル を 表現 し てい TN FSC は ラー と 同時に イ ン タ プ リ タ を停止 し て文番号 と メ ッ ー メ イ ン タ ス ク の文番号 と な っ てい ます。 こ れに対 し て ラ ー メ ッ ー は ますのでマルチ タ ス ク では読み方に注意が必要 と な り ます。 エ >LIST 10 FORK 1,*TASK2 20 FOR I=1 TO 10 30 ON I 40 TIME 5 50 OFF I 60 NEXTI 70 GOTO 20 80 *TASK2 90 PG 3 3-28 100 RMOV 1000,0 110 GOTO 100 >RUN #40 !!Out of Range > 前記の例ではあ たか も #40で ” Out ogf Range” と な っ て し ま っ た よ う に見え ま すが、本当の 問題は90のPG3で 発生 し てい ます。 マルチ タ ス ク で エ ラ ー停止 し た時は こ の後にMON コ マ ン ド を使っ て停止文番号を 参照 し ます。 >MON TASK1# 40 TASK2# 90 !!Out of Range > こ の よ う にMON コ マン ド で 各 タ ス ク の停止番号を 参照 し どれが メ ッ セー ジ に対応す る か を 調べ ます。 瞬間停電について , 瞬 電検 隔 滅 赤 秒程度 隔 ゆ 4Vへ 過負荷 4V 著 低下 瞬 電 原因 赤 . 秒程度 発生 電 ほ 滅 確認 下 MPC-816K KFには 間停 出機能があ り ま す。DC2 が し く し た場合、MPCの いLEDが0 1 の間 で点 し ま す。 MPC-816の いLEDの点 は、 プロ グ ラ ム のラ ン タ イ ム ラ ーでも し ま す。 こ の 場合は一 の間 で っ く り と し た点 です。 間停 の と し ては、 A C ラ イ ン の停 の かに、 DC2 の が考え ら れま す。装置が間 的に停止する よ う な場合、 いLEDの点 を し て さ い。 滅 歇 滅 エ 赤 言語の制限 Y 易言語です。 簡単な整数演算 と 制限 さ れた分岐制御文 し かあ り ません。 TNYFSCで 純にす る こ と に よ っ て 高速性を保っ てい ます。 MPC-816のTN FSCは簡 はイ ン タ プ リ タ の を単 構造 変数の制限 MPC-816で使用で き る 286個の 数です。 計 変 A B C | Y Z A0 B0 C0 | Y0 Z0 変数はA~Z ま でのアル フ ァ ベ ッ ト と 数字 を 組み合わ せた も のに 限 ら れてい ます。 合 A1 B1 C1 | Y1 Z1 ・・・ A8 A9 ・・・ B8 B9 ・・・ C8 C9 ・・・ Y8 Y9 ・・・ Z8 Z9 又演算は、 3byte長整数のみで表現で き る 範囲は±8388608です。 (Z版では±32767の2byte長整数です。) 配 列 配列要素 と し て用意 さ れてい る のは、 AR()です。 AR()はAR(0)~AR(31)の32個のみです。 又、 P版ではM(n)を 使用す る こ と がで き ます。AR()はSFTL、SFTR コ マン ド にて デー タ を ロ ー テ ー シ ョ ンす る こ と がで き ま す。点 デー タ と し てX()、 Y()、U()、 Z()の 4つが用意 さ れてお り 配列 と し て使用す る こ と がで き ます。要素は各1~300 です。 X(0)、 Y(0)、 U(0)、 Z(0)は特別な意 味 を 持 ち 配列 と し て使用す る こ と がで き ま せん。 コメント・文字列の限界 シ ォ 続 字 内 限 字 内 * 英 及び ‘ ^ ’ ‘ ’ ペ 除 限 ” B” 字列 様 許 及び 字 英 及び ‘ ^ ’ 除 頭 字 字列 MPC-816での コ メ ン ト 行は ン グル ク ー ト に く 12文 以 です。 さ れ る文 は 数 を く 記号に ら れ ます。 ラ ベルは11文 以 です。 ラ ベルの場合は (ア ス タ リ ス ク ) を に付 し ま す。 文 は 数 と (ス ース ) を く 記号に り ます。 コ メ ン ト ラ ベル行は文 出力に使用で き ます。 例えば、 RS-232CのCH1に対 し て A C と い う 文 を出力す る サブルーチン を作 る 場合は次の に し ま す。 3-29 *ABC GOSUB *ABC | PRINT# STR(-1) RETURN 関数STR(-1)は1行前の文字列 ( ラ ベル も し く は コ メ ン ト ) を指定 し ます。複雑な コ メ ン ト を必要 と す る 時は、 ソ ー ス フ ァ イ ルにのみ可能ですが” (ダ ブル ク ォ ー ト ) に続 く 文字 がプ ロ グ ラ ム を読み込む時に切 り 捨 て ら れ る ため コ メ ン ト と し て使用で き ま す。但 し こ の方法 は、 ソ ー ス フ ァ イ ルのみに有効なのでMPC上で見 る こ と はで き ません し 、 パソ コ ン へ 上書 き 保 存す る と 消 え て し ま い ます。 制御文 X G B G ず G B 5 G 飛び 又G G B 混 G B 4byte X ネ B及び MPC-816の制御文はFOR~NE T、 OSU 、 OTO、 IF~THEN、 IF~ OSU の つです。 OSU FOR ~NE Tでは ス タ ッ ク を用いた制御を行っ てい る ので、 ス ト の さ と 制御文中か ら の 出 し に注意 し て さ い。 あ り がち な ト ラ ブルは次の場合でい れ も 止事 です。 、 OTO と OSU を 同 し て使用 し て い る 場合 も 多 く あ り ますので注意 し て さ い。 制御用の ス タ ッ ク は タ ス ク と も 8 と な っ てい ます。こ れに対 し て OSU では、 FOR~NE Tでは 6 スタックを し ます。 こ のため OSU のみでは11、 FOR~NE Tのみでは8ま での ス ト が さ れ ま すが、 す る 場合は次の で 現 さ れ ます。 8 ( OSU の さ )* (FOR/NE Tの さ )*6 下 X 下 各 4 byte byte 消費 G B 混在 式 表 4 ≧ G B 深 4+ X 深 禁 ネ 項 深 X 許 【例1】 【例2】 10 ON A 10 FOR A=1 TO 10 20 OFF B 20 ON 4,5 30 GOSUB *WORK1 30 IF SW(5)=1 THEN 70 40 WAIT SW(1)=1 40 TIME 10 このようにIF文などでFOR 50 OFF 1 50 OFF 4,5 文からは飛び出せない。何度も 100 *WORK1 60 NEXT A 飛び出すうちにエラーとなる。 110 ON 1,2,3 70 ON 1,2 120 OFF 5,4 80 OFF 4,5 130 GOTO 40 RETURNで戻らずGOTOで戻すとエラーとなる 【例1の修正】 【例2の修正】 10 ON A 10 A=1 20 OFF B 15 *LOOP 30 GOSUB *WORK 1 20 ON 4,5 40 WAIT SW(1)=1 30 IF SW(5)=1 THEN 70 50 OFF 1 40 TIME 10 | 50 OFF 4,5 100 *WORK 1 60 A=A+1 110 ON 1,2,3 65 IF A<11 THEN *LOOP 120 OFF 5,4 70 ON 1,2 130 RETURN 80 OFF 4,5 又 _ IF文では、 ELSE を使用す る こ と がで き ま す。 ELSEはIF文の直後に置 き ます。 ELSE にはELSE THEN と ELSE OSU が あ り ます。 (P のみ にはあ り ま せん) _G B 版 【例3】 IF SW(0)=1 THEN *SUB1 ELSE_THEN *SUB2 *SUB1 作業1 *SUB2 作業2 Z 【例4】 IF SW(0)=1 GOSUB *SUB1 ELSE_GOSUB *SUB2 *SUB1 作業1 RETURN *SUB2 作業2 RETURN 3-30 記述の制限 一行に対する制限 残念 なが ら MPC-816では次のIF文が記述で き ません。 a. IF X(1)=100000 THEN 200 し か し 、 次のIF文は 受付 ら れ ます。 b. IF X(1)=10000 THEN 200 Y 内部 問題 お 限界 byte 内 収 long セ ジ byte 内 b. 規則 b. !! oo こ れは、 TN FSCの の なのですがプ ロ グ ラ ム文は メ モ リ 上で16 以 と な っ てい ま す。 こ の はIF文に いて と な っ てい ます。 では100000が3 と ら れ る のに対 し て の10000は2 です。 では16 以 に ま る のに対 し て では16 を え て し ま い ます。 こ う し た場合 イ ン タ プ リ タ は T と い う メ ッ ー を出力 し ます。 PRINT文では次の記述がで き 、 最後の70000が さ れて し ま い ます。 a. a. byte 超 byte ず byte 略 10 PRINT SQR(50000)、60000、70000 LIST 10 PRINT SQR(50000)、60000 > 引き数に対する制限 各 コ マ ン ド の引 き数は3つま で と な っ てい ま す。 例えば、 ON、 OFFコ マ ン ド では次の記述が可能です。 ON 1 ON 1,2 OFF 1,2,3 4 目の入力を し て も 無視 さ れ ます。 又引 き 数は変数、 定数 も し く は関数です。 式は記述で プ ロ グ ラ ム中に つ き ません。 ON A OUT IN(0),0 OUT &HAA,0 変数 関数 定数 >ON IN(IN(IN(0)) ??? エラーとなる 関数の関数 も 処理す る こ と はで き ま せん。 演算に対する制限 演算は2項演算のみです。 ま た、 式の長 さ は16文字以内 です。 次の 様 な記述をす る と 問題 をお こ し ます。 >10 A1=C(1000)^&HFF >LIST 10 A1=C(1000)^&HOOFF >LIST 10 A1=C(1000)^&HOOOF > (15文字) カーソルアップリタンする(17文字) FFがFとなってしまう こ れは、 最初の入力の時15文字 以内 であ っ たのが リ ス ト を と る と ヘキ サ デ ー タ が 4文字固 定表 現のため17文 字 と な っ て し ま い ま す。 こ こ で カ ー ソ ル を上に移動す る と 式が17文字 と な り 最後の1文字 が略 さ れ意味が 変 わ っ て し ま い ます。 こ れは、 プ ロ グ ラ ム を セーブす る と 同様の問題 と な り ますので注意 し て 下 さ い。 ヘキ サ 表現はで き る だけ 変数に置 き 換 え て おいた方が 安全です。 H0=&HOOFF H1=&HFFOO A1=C(1000)^H0 A2=C(1000)^H1 演算は+,-,*,/,%,^ ,|,x の8種です。+,-,*,/は電卓 と 同 じ く 加減乗除 を意味 し ま す。他は次の通 り です。 3-31 % ^ | x 余 り を 算出す る (パー セ ン ト ) 論 理 積 (ハ ッ ト ) 論理和 (パ イ プ) 排他的論理和 (ス モール エ ッ ク ス ) 通信の制限 ザ MPC-816では、 CH1 と い う ユー ー用のRS-232C を ん。 ま た、 600 ル ー ー ト ではプ ロ グ ラ ム の 9 bpsフ ボ レ 文字列の扱い 字列 外 関 備 え てい ま すが文字列処理はあ ま り 得意ではあ り ませ 組み方に よ っ て 問題 を起 こ す こ と が あ り ます。 値デ 限 INPUT#、 PRINT#は文 を扱 う こ と がで き ま せん。 MPC と のや り と り は数 ー タ に っ た方が見通 し が 良 く な り ます。 ただ、 例 的に次の な応用が あ り ます。 STR() 数の使用 PRINT#、 PUTS#ではSTR() 数を使用す る こ と がで き ます。 こ れに よ り 、 コ メ ン ト 文に かれた文 を出 力す る こ と がで き ま す。 FIND#、 SKIP#、 ET#() ら れて く る通信 ー タ に文 が ま れて く る こ と は ま ま あ り ま すが、 M P C は こ れを無視す る こ と がで き ます。 ま た、 ET#()に よ り 1文 を ア ス ー コ ー ド と し て扱 う こ と がで き ます。 関 G デ G 送 様 書 字列 字列 含 字 キ 通信時のトラブル 10 GETN# A 20 A1=GET#(0) 30 SKIP# &H000D 前記のプ ロ グ ラ ム は一見 う ま く 動作 し そ う なのですが、 シ ス テ ム的な問題に よ り 20のGET#(0)で正確に文字 が読み取れない こ と があ り ます。 こ れはG ETN#が 内部 的に 割 り 込み禁 止を 伴 う 演算 を し てい る ために 発生 し ます。 つま り 、 文字列 を 受 取 り なが ら GETN#は処理を 開始 し ますが、 割 り 込 み禁 止 と す る ため こ の間文 字 を 受 け取 ら な く な っ て し ま い ます。 こ れ を さ け る には、 次のプ ロ グ ラ ム と す る のが完全です。 関数RS(1)に よ っ て文 字列 が 貯 ま る の を 待 ち、 バ ッ フ ァ に 貯 ま っ た文字列 を処理す る と こ う し た 問題 は 発生 し ません。 問題 5 WAIT RS(1)>10 10 GETN# A 20 A1=GET#(0) 30 SKIP# &H000D 様 発生 留 下 文字がある程度貯まるのを待つ ネ この は、 INPUT#で も 同 に し ます。 INPUT#を使用す る 場合は、 CR、 LFで タ ー ミ ー ト さ れてか ら ただちに次の文 を け取 る プ ロ ト コ ルが ない ために と な る こ と はあ ま り あ り ませんが、 同 の を かかえ てい る こ と に 意 し て さ い。 問題 字列 受 少 問題 3-32 様