MPC-816 Q&A


関連記事= 1999年以前のFAQ(1) 1999年以前のFAQ(2)

目次

最新情報は MPC-816 BBS

098 MPC-816 バッテリが無くなったらデータ・プログラムはどうなるか
097 MPC-816 webのシステムデータを転送したら動かなくなった
096 MPC-816 PRINT文を入れていると遅くなるか
095 MPC-816 プログラム実行中に VOID がでる
094 MPC-816 自動実行の方法
093 MPC-816 BRKコマンドでプログラムが壊れる
092 MPC-816 絶対値の求め方
091 MPG-303 とMIF-816 のパルスを切り換えて使えるか
090 MPC-816 MOVEコマンドでパルスが出ない
089 MBK-816 を使った装置で、時間が経つとGPの画面が消える
088 MPC-816 システムローダは動くのにFTMWと接続できない
087 MBK-816,MBK-SH,MBK-RS デジタル社タッチパネルのページが換わらない
086 MPG-303 HOME中にSTOPできるか
085 MPC-816 IF 〜 GOTO でStack Overflowになる?
084 MPC-816 1つのタスクで複数のパトライトを非同期で同時点滅させるサンプル
083 MBK-816 GPとMPCのアドレス表記の対応
082 MPC-816K RS-232C入力確認
081 原点入力の最小信号幅

080 MPG-303 ラインドライバ、TTL出力のZ相をMPGの原点入力に接続するI/F
079 MPC-816KFのバスコネクタ(J5)にLCDモジュールを接続する
078 MIF-816からパルス発生する場合(PG -1)センサー停止条件は指定できるか
077 配列変数を使ったRS-232Cのデータ処理
076 YPLSのカウンタが0になるのを拾えない
075 MPG-303のティーチモード中にTABキーでPGが切り替わらない
074 MOVE、RMOVとYPLS,ZPLSの併用
073 MPC-816P,Z,S の初期化
072 MPC-816 プログラムの読み込み(LOAD)が終わらない
071 MPC-816の演算結果が異常?
070 MPG-301にはMPG-303の命令は使えないのか?
069 MPC-816 RS-232C GET#(0)で入力したデータを10進数にするには
068 MPC-816 RS-232C INPUT#は使える?
067 MPC-816 RS-232C INPUT#,GETN#,GET#の違い
066 MPC-816 RS-232C データのターミネータとデリミタ
065 MPC-816 TMOUTの待ち時間を関数実行中に変更できるか?
064 MPC-816X(FROM版)とMIF-816Zの組み合わせ使用について
063 MPG-301の減速が遅い
062 MPC−816のバッテリ交換について
061 MPC-816KFの「MIO 816モード」でMIO-240Eが動作不良
060 MPG−303 パルス出力実測
059 MPG−303 JOGコマンド動作が不安定
058 FTMWでプログラムを読み込んだら???続出
057 高速サイクルの装置を作成したい。MPCの実行速度の目安は?
056 MPCがノイズでフリーズ?。リセットボタンで復帰する
055 Out of Range の原因
054 マルチタスクトレースの方法
053 MIO−248のアドレス設定
052 MPC−816のプログラム容量が足りない
051 MPG−303動作、パルス出力の確認方法
050 MPG-301をアップダウンカウンタとして使うには
049 MPG-303でパルス発生中に他軸を動かせるか?
048 MPC-816KF Z版MODE 1のパルス波形
047 MPC−816X、Kのリチウム電池について
046 MPG-303が動かない?
045 プログラム中でジャンプを繰り返すとスタックオーバーフローエラーになる
044 MPC-816KのFROMが実装されていない?
043 デジタル社のタッチパネルとの接続方法は?
042 MPC-816 Rev3.01 のポイントデータは何点?
041 MIF-816ADに使用しているAD7890-4の絶対最大定格
040 STOPコマンド減速停止についての質問
039 YPLS,ZPLS,RS(),I/Oスキャンを別タスクで使うと遅くなる?
038 MPC-816K 電源が入らない
037 MPC-816K 赤LED点滅間隔と原因
036 プログラム実行時間
035 デジタルGPで32ビット長データを表示する
034 LCD表示サンプル
033 パルス発生していないのにモーターが動く
032 ティーチングができない
031 MPG-301からパルスが出ない
030 MPG-303、MIF-816のDC24Vパルス出力はできるか
029 816K Z版 PULSE裏機能でセンサー停止しない
028 P版によるMIFからのパルス発生
027 MPC-816XのMIO-248対応
026 命令文がエラーになったり、変ったりする
025 MPC-816K(F) BUSからのパルス発生
024 2相エンコーダカウントについて
023 出力状態を知りたい
022 メモリーI/Oの定義について
021 #DEFO、#DEFSで定義した定数が使えない?
020 I/O、変数、ポイントデータの初期化
019 コメント・ラベルについて
018 カンマで区切られたデータの受信方法
017 文番号無しプログラムをロードしたらラベルしか入らない
016 MPC-816を交換しMPCINIT後prgをloadしたが途中停止
015 MPC-816KのP版/Z版の変更方法
014 PG -1でOVER RUNした場合、prgはハングアップし、再起動が必要になりますか?
013 ビットチェックサンプルプログラム
012 配列変数を使ったRS-232C文字列解析
011 PG -1(P版 MIF-816パルス発生)で原点復帰ができない?
010 変数の値をBCDで出力するには。
009 MOVE -A1,-B1 と書けない
008 YPLS/ZPLSでCCW運転中にCtrl+A停止すると次に回転しない。
007 Z版の原点センサーポートSW(16)〜(21)を汎用入力として使えるか?
006 MIO-240とMIO-248の混載は可能か?
005 FTMからRUNすると正常動作、パワーオンリセットすると途中停止
004 RUNタイムでPG comunication errorになる
003 プログラムLOAD中に停止 しまう
002 アスキーコード表記でRS-232C受信したデータを2バイト10進にキャスト
001 P版でのMIFパルス出力


●098 MPC-816 バッテリが無くなったらデータ・プログラムはどうなるか              040519

【Q】
リチウムバッテリが無くなったり外れたりした場合、変数・ポイントデータ・プログラム
などはどうなるか。MPCの症状は?

【A】
バッテリバックアップされているS-RAMには変数、配列変数、点データ、コマンドの
パラメータが入っています。
バッテリがなくなるとこれらのデータは不正な値となり(0になるわけではありません)
これらに依存しているプログラムは正常に動作しなくなる可能性があります。
通常、変数・配列変数は明示的にプログラムに記述しますが、パラメータは省略しがち
なので要注意です。
(ダイレクトコマンドで実行しただけでプログラムに反映されていない場合など)
ティーチングで作成された点データを使うプログラムにも不具合が出ます。
つまり、
・変数・配列変数の初期値、コマンドのパラメータが記述されていないプログラム
・ティーチング点データを使うプログラム
・バックアップ変数を使うプログラム
はバッテリがなくなると正常に動きません。
また、バッテリが一時的に外れたり、S-RAMに触る、静電気が加わるなどしてS-RAMデータ
が壊れると、保守コマンド(LIST表示など)にも影響がでることがあります。
その場合は大抵、初期化(MPCINIT)で復旧します。

基本ソフト、ユーザープログラムはフラッシュROMに書き込まれるので消えることはあり
ません。

●097 MPC-816 webのシステムデータを転送したら動かなくなった                     030603

【Q】
MPC-816Xに弊社のWeb siteからダウンロードしたシステムデータを、システムローダで
転送したら、FTMW32と接続できなくなった。

【A】
弊社web siteの「オフィシャルダウンロード」には MPC-816用として「MPC-816X」と 
「MPC-816K」用の 2つのシステムデータがあります。
MPC-816Xに MPC-816K のシステムデータを入れると動かなくなります。

もしも、816X に 816K のデータを入れるとFTMW画面上に
「 No JP on 0 then jp BOOT moniter」というメッセージが表示されます。(注)
再度、MPC-816Xのシステムデータをロードすれば復帰します。

MPC-816KとMPC-816KFのシステムデータは共通です。

(注)
通常のFTMW32の状態では接続できません。
次の手順で編集画面を開いてからMPCの電源を入れると表示します。
@MPC電源を切ります。
AFTMW32初期画面の「FTMW32 設定」で「Start Negotiation」をアンチェックにします。
B「MPC-816 接続」を押します。
B真っ白な編集画面が開きます。
CMPCの電源を入れます。
※「Start Negotiation」の状態は保持されます。
 この作業が終わったら「チェック」に戻してください。

see also : MPC-816 BBS 2003年6月3日記事

●096 MPC-816 PRINT文を入れていると遅くなるか                                   030418

【Q】
デバッグのためにプログラムにPRINT文を入れている。これにより実行スピードは遅くなるか?

【A】
PRINT文の処理時間だけ遅くなります。
自動実行時にもPRINT文は実行されます。FTMWを接続してもしなくても下記の結果は同じです。

10      PUT &H15        "FTMW stop watch start
20      FOR I=1 TO 100
30       PRINT 12345
40      NEXT I
50      PUT &H16        "FTMW stop watch stop
実行結果 901mSec

10      PUT &H15
20      FOR I=1 TO 100
30       'PRINT 12345   "PRINT文コメントアウト
40      NEXT I
50      PUT &H16
実行結果 0mSec

●095 MPC-816 プログラム実行中に VOID がでる                                    030416

【Q】FTMWと接続してプログラムを実行していると、途中で「VOID」と表示される。
しかし、プログラムは動き続ける。VOIDの原因は?

【A】STR(n)で、存在しない文番号や-2以下の数字を指定するとVOIDになります。

  10      'ABC
  20      PRINT STR(5)
  30      PRINT STR(-2)
  RUN
    VOID
    VOID

●094 MPC-816 自動実行の方法                                                    030415

MPC-816はプログラミングケーブルを抜くとプログラムが走ります。
これは、J1コネクタの5,6番ピンがショートか否かでプログラムモードか自動実行モード
かを判別しているためです。5,6番ピンがオープンなら自動実行モードです。
つまり、プログラミングケーブルを抜いた状態で電源を投入すればプログラムが走ります。
A_START というコマンドがあります。これは、プログラムパソコンが接続されていても
一定時間が経過するとプログラムを走らせるという特殊用途のコマンドで、通常は使いま
せん。

注意:MPCは起動時にフラッシュROM内のプログラムをS-RAMに展開して実行します。
プログラムを修正したりパソコンから読み込んだ後は必ず RUN をしてフラッシュROMに
書き込んでからケーブルを抜く、または、電源を切ってください。

●093 MPC-816 BRKコマンドでプログラムが壊れる                                   030410

ご注意下さい
BRKコマンドはメインタスク(タスク0)でしか使えないコマンドです。
子タスクで使用するとプログラムが壊れます。
5       FORK 1,*TASK1
10      *MAIN_LOOP
20      ON 0
30      TIME 50
40      OFF 0
50      TIME 50
60      GOTO *MAIN_LOOP
100     *TASK1
110     TIME 100
120     BRK                 "タスク1にBRK
130     END

Programming the FLASH ROM *++++++++

        TASK 0 # 49908  TASK 1 # 65535
        TASK 2 # 65535  TASK 3 # 65535
        TASK 4 # 65535  TASK 5 # 65535
        TASK 6 # 65535  TASK 7 # 65535

LIST
5       FORK 1,*TASK1
10      *MAIN_LOOP
20      ON 0
30      TIME 50
40      OFF 0
50      TIME 10
60      GOTO *MAIN_LOOP
100     *TASK1
110     TIME 100
120     BRK c9,c9,c9,c9,e9,9,HWS1(H9),&,f,8,N19,AD(V5),x5,5,X(1),C5,0,MC(8),#2,!HSW(B7)
130     END
>VER
 TNYFSC(R) Rev-2.60a[VER-Zmx1729]       ←VERも化ける
 Copyright(C)by ACCEL CORP/BC-SOFT
 [255point MPC-816K MODE1~4]K8b9

■復帰方法
>V_SWAP                             "ダイレクトコマンドでV_SWAP[Ent]
 TNYFSC(R) Rev-2.60a[VER-Zmx1729]   "電源 off→on
 Copyright(C)by ACCEL CORP/BC-SOFT
 [255point MPC-816K MODE1~4]K8b9
V_SWAP                              "Revが2.xxの時は繰返し
 TNYFSC(R) Rev-3.53s[VER-PmaX2044]  "Rev-3.xxで正常
 Copyright(C)by ACCEL Corp/BcSoft
 [300p MPC-816K  MPG  MODE5|6]K8bb
>MPCINIT                            "SRAM初期化
>ERASE                              "FROM初期化
*
>

■メインタスクでは問題ありません
LIST
5       FORK 1,*TASK1
10      *MAIN_LOOP
20      ON 8
30      TIME 50
40      OFF 8
50      TIME 50
55      BRK
60      GOTO *MAIN_LOOP
100     *TASK1
110     ON 9
120     TIME 5
130     OFF 9
140     TIME 5
150     GOTO *TASK1
>RUN
Breaked !!
>CNT
Breaked !!
>
●092 MPC-816 絶対値の求め方                                                    030409

【Q】
絶対値を計算で、出せないですか?
平方根が使えれば
A=SQR(A*A)とか・・
ANDを使って、−の桁を消すとか・・

【A】
MPC-816には一発回答のコマンド・関数はありません。
下記はサブルーチン例です。
10       A=-98776
20      GOSUB *ABS
30      PRINT A
40      END
50      *ABS
60      IF A>0 THEN *ABS_RET
70       A=A*-1
80      *ABS_RET
90      RETURN
>RUN
 98776

SQR()は2つ以上の引き数を与えられません=@
事前に二乗してSQRに与えれば可能です=A
しかしMPC-816は3バイト長なので±2897以上は扱えません=B
@
>A=-2
>B=SQR(A*A)
???
A
>A=-2896
>A=A*A
>A=SQR(A)
>PR A
 2896
B
>A=-2897
>A=A*A
>A=SQR(A)
>PR A
 2895       "期待通りにならない

また、SQRTはO以下は扱えません。
>A=-2
>B=1
>SQRT A B C
>PR C
 109        "期待通りにならない

●091 MPG-303 とMIF-816 のパルスを切り換えて使えるか                            030312

【Q】
MPG-303のパルス出力が足りないとき、PG -1で切り換えてMIF-816からパルス出力できるか?

【A】
できますが PG -1にはマルチタスク停止、STOPが無いなどの制約あります。
下記のサンプルPRGはタスク1で実行していますが、タスク0でも同様です。

  FORK 1,*TASK1
  END
*TASK1
  PG 1            " MPG-303#1設定。タスク1でも有効で必要 
  MODE 5
  ACCEL 1000
  FEED 0
  SETPOS 0,0
  PG -1           " MIF-816 設定
  ACCEL 5000
  FEED 0
  SETPOS 0,0
*LOOP
  PG 1
  MOVE 1000,1000
  PG -1
  MOVE 10000,10000
  '
  PG 1
  RMOV -500,-500
  PG -1
  RMOV -5000,-5000
  '
  PG 1
  'PG=1
  PRINT STR(-1),X(0),Y(0)
  PG -1
  'PG=-1
  PRINT STR(-1),X(0),Y(0)
  GOTO *LOOP

実行結果
Programming the FLASH ROM *++++++++
 PG=1 500 500
 PG=-1 5000 5000
 PG=1 500 500
 PG=-1 5000 5000
 PG=1 500 500
 PG=-1 5000 5000
●090 MPC-816 MOVEコマンドでパルスが出ない                                      030124

【Q】
Z版 MODE 2 でMOVEコマンドのパルスが発生しません。
RMOV、MOVZ、RMVZ、HOMEでは問題ないです。

【A】
Z版は保守モードで、最近は資料も正規マニュアルから略しています。
Z晩のMOVEのパラメータは3つあり最後のパラメータを省略するとうまく動かないことがあ
ります。
MOVE X Y 0
というように、パラメータを省略せずに記述して下さい。
MOVZ,HOMEなども同様にパラメータを省略しないで下さい。
●089 MBK-816 を使った装置で、時間が経つとGPの画面が消える                      020510 

【 Q 】
MPC-816にMBK-816を搭載してデジタルのタッチパネルを接続しました。
プログラムをRUNさせ、パネルをタッチしているときは問題ないのですが、しばらく何も
せずにほっておくとTPの画面が真っ暗になります。
あわてて1回タッチすると表示しますが、これってどうしてでしょうか。

デジタルのHP上で確認するところでは、システムエリアの14ワード目の最下位ビット
(00ビット目)がONしているとバックライトOFFのフラグなので真っ暗になり、さらに同
システムエリア9ワード目(画面のON/OFF)にHexでFFFFが書きこまれていると画面表示
が消えてしまうようですが・・。
これらアドレスをクリアしてみてください。と書いてありました。

【 A 】
確かに下記の操作をすると画面がON/OFFしますが、MBK-816で勝手にこれらのアドレスを
操作することはありません。

>OUT &HFFFF 40009       " 9ワード 画面表示のON/OFF 画面真っ暗
>OUT 0 40009            " 表示
>OUT 1 40014            " 14ワード0ビット バックライトOFF 画面真っ暗
>OUT 0 40014            " 表示

下記の設定をご確認ください。(下記のメニューはGP2400です)

オフライン
    ┗初期設定
        ┗システム環境の設定
            ┗システムの設定  > スタンバイモード時間(0-255)

スタンバイモード時間が 0 (これがdefaultだと思います)なら常時表示、それ以外だと
設定時間で画面表示OFFとなりました。

●088 MPC-816 システムローダは動くのにFTMWと接続できない                        020417 

【 現象 】
いままで使用していたMPC-816のシステムをアップデートするため、システムローダを実
行。正常に完了した。
その後、手順通りMPCの電源をOFF/ONしてFTMWと接続しようとしたがつながらない。
同じPCとケーブルで別のMPCへは接続できるのでMPCの不具合のようだ。

【 原因 】
ケーブル不良(ユーザー製作) = 5,6番ピンがショートされていない。
つながらないMPCにはプログラムが入っていた。
このケーブルを使って他のMPCとリンク出来たのは、そのMPCにプログラムが入っていなか
ったため。

【 再現実験 】
・プログラムケーブルの5,6番ピンをオープンにする。
・システムローダは5,6オープンでも動作する。
・システムロード後
    @MPCにプログラムが入っていると (注:システムロードではプログラムは消えない)
        電源OFF/ONでそのプログラムが実行される。Ctrl+](リセット)は効くが直ぐにプ
        ログラムが再実行されてしまいコマンド入力モードにならない。
    AMPCにプログラムが入っていないと
        コマンド入力モードで正常起動に起動するように見える。このためPCとケーブル
        は正常と判断された。

※MPCはプログラムポート(J1)の5,6のショート・オープンでプログラムモード・自動実行
  モードを判別しています。オープン状態で電源を入れるとプログラムが実行されコマン
  ド入力ができなくなります。FTMWもつながりません。

●087 MBK-816,MBK-SH,MBK-RS デジタル社タッチパネルのページが換わらない          020221 

【 現象 】
MBK-816,MBK-SH,MBK-RSでデジタル社GPシリーズを接続している。
GP画面上に配置したボタン操作でページ切り換えをした後、MPCからの操作で元のページ
に戻れないことがある。

【 例えば 】
・  GPにページ1と2を作成し、そこにボタンを配置する。
    このボタンでGPシステムエリアDT8を操作し、ページ切り換えができるようにする。

・  MPCからDT8を操作(816はOUT 1 40008、684はS_MBK 1 8)して 1ページを表示する。

・  その後GP画面上のスイッチ操作で 2ページ に切り換える。

・  その時の DT8 (816ではIN(40008)、684ではMBK(8))は 1 のまま。
    つまり、画面上のスイッチ操作では、ページは換わってもGPのDT8は換わらない。

・  この状態で1ページに戻ろうとして MPCから操作(816はOUT 1 40008、684はS_MBK 1 8)
    をしても効かない。

 ※これはMBKのバグではありません。GPの仕様のようです。

【 回避例 】
@ページを換える前にDT8を0でリセットする。その間ディレイが必要(200mSEC位)
このディレイ時間は画面のデザインによって必要最低時間が変わるので安全をみて長めの
設定が必要。

◆816
 I=0
'
*LOOP
 I=I+1
 I=I%2
 P0=I+1
GOSUB *GP_PAGE_SEL
GOTO *LOOP
*GP_PAGE_SEL        "ページ切り換えサブルーチン
OUT 0,40008             "リセット
TIME 20                 "ディレイ
OUT P0,40008            "切り換え
WAIT IN(40000)=P0       "換わり待ち
RETURN

◆684
    I=0
'
  DO
      I=I+1 :   I=I%2 :   gp_page=I+1
    PRINT I
    GOSUB *GP_PAGE_SEL
  LOOP
*GP_PAGE_SEL                /*ページ切り換えサブルーチン
  S_MBK 0 8                     /*リセット
  TIME 200                      /*ディレイ
  S_MBK gp_page 8               /*切り換え
  WAIT MBK(0)==gp_page          /*換わり待ち
  RETURN

Aページを替える都度DT8を0リセットする。
DT0でページの切り換わりを確認するのでディレイは不要。

◆816
OUT 0,40008        "初期設定
TIME 50
 I=0
'
*LOOP
 I=I+1
 I=I%2
 P0=I+1
GOSUB *GP_PAGE_SEL
GOTO *LOOP
*GP_PAGE_SEL        "ページ切り換えサブルーチン
OUT P0,40008            "ページ切り換え
WAIT IN(40000)=P0       "換わり待ち
OUT 0,40008             "リセット
RETURN

◆684
  S_MBK 0 8 : TIME 500 :   I=0  /*初期設定
  '
  DO
      I=I+1 :   gp_page=I%2+1
    GOSUB *GP_PAGE_SEL
  LOOP
*GP_PAGE_SEL                    /*ページ切り換えサブルーチン
  S_MBK gp_page 8                   /*ページ切り換え
  WAIT MBK(0)==gp_page              /*換わり待ち
  S_MBK 0 8                         /*リセット
  RETURN

---------------------

この他、画面上のスイッチにタグを被せたり、Dスクリプトを使う回避方法もあるようです。
●086 MPG-303 HOME中にSTOPできるか                                              020215 

【 Q 】
MPG-303のHOME動作中にSTOPできるか

【 A 】
HOMEに対してもSTOPはききますが、STOP 1でも2でも急停止。
また、BSYの戻り値は1です。

10      PG 1
20      MODE 5
30      ACCEL 1000
40      FEED 0
50      FORK 1,*PG
60      WAIT SW(0)=1
80      STOP 1
90      WAIT BSY(1)<>0
110     END
120     *PG
130     SHOM 2,8,100
140     HOME &H05,100,100
150     'HOME END
160     PRINT STR(-1),BSY(0)
>RUN          ←SW(0)をオンするとタスク0からタスク1をSTOP
 HOME END 1   ←STOP 1 でも STOP 2 でも BSYは1
>
●085 MPC-816 IF 〜 GOTO でStack Overflowになる?                               011112 

【 Q 】
エディタでコーディングしたプログラムで IF 〜 THEN と書くところを IF 〜 GOTO と
間違た。それをMPCにLOADして実行したら Stack Overflow になった。なぜ?

【 A 】

   I=0
*LOP
   I=I+1
  PRINT I
  IF A=0 GOTO *LOP

上記プログラムをLOADすると、最後の「IF 〜 GOTO」が「IF 〜 GOSUB」に自動変換され、
実行すると Stack Overflowになります。

LIST
10       I=0
20      *LOP
30       I=I+1
40      PRINT I
50      IF A=0 GOSUB *LOP           ←GOTOがGOSUBへ
Programming the FLASH ROM *++++++++ ←RUN
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 # 50
!! Stack Overflow
>

関連 055

●084 MPC-816 1つのタスクで複数のパトライトを非同期で同時点滅させるサンプル     010904 

"*****************************************************************************
"複数のパトライトを非同期で同時点滅させるために複数のタスクを使うのはムダです。
"これは1つのタスクでソフト的に同時点滅するサンプルです。
" *PATLIGHTタスクのループカウンタで変数により各パトライトの起動、
" ON/OFF時間を管理しています。
"                                                             ACCEL.eng 010904
"      -----------------------------------------------------------------
"◆使用配列・変数
" M(0):  PAT0 COUNTER
" M(1):  PAT1 COUNTER
" M(2):  PAT2 COUNTER
" M(10): PAT0 ON TIME
" M(11): PAT0 OFF TIME
" M(12): PAT1 ON TIME
" M(13): PAT1 OFF TIME
" M(14): PAT2 ON TIME
" M(15): PAT2 OFF TIME
" T0:    FOR NEXTで使う変数。M()の要素を指す。
" T1:    *PATY_ENA、*PAT_DESの引数、戻り値
" T2,T3: FOR NEXT、*PAT_ENA、*PAT_DES内のテンポラリ
"◆使用I/O
" パトライト0 出力0
" パトライト1 出力1
" パトライト2 出力2
" パトライト0 オンオフSW 入力0
" パトライト1 オンオフSW 入力1
" パトライト2 オンオフSW 入力2
"   -----------------------------------------------------------------
"◆カウンタ配列変数の構造
" 1つの配列変数の中で点滅開始/停止、ON/OFF状態、タイマーループカウントを行います。
" 000a | 000b | cccc | cccc
"  a: 点滅 開始/停止フラグ。1=開始、0=停止。
"  b: ON/OFFフラグ 1=OFF、0=ON
"  cccccccc (8BIT) : タイマーカウンタ 設定範囲2〜255 *ベースタイム*10mSec
"  ------------------
"  aは親タスクからPATLIGHTタスクへの開始を指示するフラグです。
"  親タスクでaを1にするとフリックを開始します。0にするとフリックを止めます。
"  bはサブルーチン内で使用するフラグで、1ならOFF、0ならONします。
"  cはループした回数を数えるカウンターです。1回実行する毎に1プラスします。
"*****************************************************************************
  M(0)=0
  M(1)=0
  M(2)=0
  M(10)=10    "2以上
  M(11)=5     "2以上
  M(12)=2     "2以上
  M(13)=2     "2以上
  M(14)=20    "2以上
  M(15)=20    "2以上
  FORK 1,*PAT0
  FORK 2,*PAT1
  FORK 3,*PAT2
  FORK 11,*PATLIGHT
  END
*PAT0
  WAIT SW(0)=1
  M(0)=&H1000         "パトライト0 点滅開始
  WAIT SW(0)=0
  M(0)=0              "パトライト0 点滅終了
  GOTO *PAT0
*PAT1
  WAIT SW(1)=1
  M(1)=&H1000         "パトライト1 点滅開始
  WAIT SW(1)=0
  M(1)=0              "パトライト1 点滅終了
  GOTO *PAT1
*PAT2
  WAIT SW(2)=1
  M(2)=&H1000         "パトライト2 点滅開始
  WAIT SW(2)=0
  M(2)=0              "パトライト2 点滅終了
  GOTO *PAT2
'=========
*PATLIGHT
  TIME 10     "ベースタイム
  FOR T0=0 TO 3
    T1=M(T0)
    T2=T1^&H1000
    'PRX T0,T2
    IF T2<>0 GOSUB *PAT_ENA
    ELSE_GOSUB *PAT_DES
  NEXT T0
  GOTO *PATLIGHT
'---------
*PAT_DES
  OFF T0
  RETURN
*PAT_ENA
  T2=T1^&H100
  IF T2<>0 THEN *PAT_OFF
*PAT_ON
  ON T0
  GOSUB *PAT_CONT
  T3=T0*2
  T3=T3+10
  IF T2<M(T3) THEN *PAT_ENA_RET
  T1=&H100        "カウンタバイトリセット、ON/OFFフラグセット
*PAT_OFF
  OFF T0
  GOSUB *PAT_CONT
  T3=T0*2
  T3=T3+11
  IF T2<M(T3) THEN *PAT_ENA_RET
  T1=0            "カウンタバイトリセット、ON/OFFフラグリセット
  GOTO *PAT_ON
*PAT_CONT
  T2=T1^&HFF
  T2=T2+1         "カウンタインクリメント
  T1=T1^&HF00     "カウンタバイトをクリア
  T1=T1|T2        "カウンタ値をT1にセット
  RETURN
*PAT_ENA_RET
  T1=T1^&HFFF
  TIME 1          "ここで故意にSWAPさせる=この後10mSECスワップしない
  T2=M(T0)^&HF000 "      ┐この2行の間ではSWAPさせない
  M(T0)=T2|T1     "      ┘
  RETURN

●083 MBK-816 GPとMPCのアドレス表記の対応                                       010821 

【Q】
デジタルGPのビットアドレスはMPCのI/O表記とどう対応するのか?

【A】
GPはワードアドレスを3文字、ビットアドレスを1文字で表しますが、MPCではワードアド
レスを2文字、ビットアドレスを2文字で表します。
ビットは各ワードに0〜F(MPCでは00〜15)あります。
例えば GPのワードアドレス 001 からの対応は次のようになります。

(w : ワードアドレス、b : ビットアドレス)

  GP          MPC
---------------------
X www b  => 5 ww bb
X 001 0     5 01 00
X 001 1     5 01 01
X 001 2     5 01 02
X 001 3     5 01 03
X 001 4     5 01 04
X 001 5     5 01 05
X 001 6     5 01 06
X 001 7     5 01 07
X 001 8     5 01 08
X 001 9     5 01 09
X 001 A     5 01 10
X 001 B     5 01 11
X 001 C     5 01 12
X 001 D     5 01 13
X 001 E     5 01 14
X 001 F     5 01 15
X 002 0     5 02 00
X 002 1     5 02 01
X 002 2     5 02 02
  ↓          ↓

●082 MPC-816K RS-232C入力確認                                                  010803 

【Q】
下記のソフトでIの値が89で停止してしまいます。

FOR I=50 TO 100
U(I)=GET(#0)
NEXT I

【A】
下記のような簡単なプログラムで動作しないとすれば、ハード的に壊れているか、相手か
ら本当にキャラがこないかです。

以下のようなプログラムでループバックテストしていただければハードの良否は判定でき
ます。

CNFG# 4 0 2
FOR I=1 TO 255
PUT# I
PRINT I GET#(0)
NEXT I

J1の8,9をショートしてループバックします。
1〜255までを表示します。

●081 原点入力の最小信号幅                                                     010627 

【Q】
「HOME」コマンドで指定されたXS1,XS2の信号の読取可能な最小信号幅は何μsか
教えてください。

【A】
フォトカプラの応答速度が、50〜100マイクロ秒程度(ばらつきあり)になります。
このためにこれ以下の信号については拾えない可能性もあります。

SHRD nの値を増やすと原点復帰コマンドの中でセンサポートの読み取り回数を増やし
ますので、相当短いパルスでも読み取り可能と思います。

原点復帰速度を相当落としても読み取れないという事例では、サーボの調整が悪くて、常
にサーボが振動しており(つまりある一定のレンジで往復運動をしたままで動作。このた
めZ相のパルスが極細になる)原点復帰が完了しないということがありました。
この場合は、インポジションを厳しくするとサーボーエラーになりますのですぐ判別でき
るかと思います。

●080 MPG-303 ラインドライバ、TTL出力のZ相をMPGの原点入力に接続するI/F          010626 

●079 MPC-816KFのバスコネクタ(J5)にLCDモジュールを接続する                      010418 

MPC-816KF単体使用でLCDキットを使わずに小型LCD(日立M1632系)を接続する例です。

MPC-816KF バスコネクタ(J5)          LCD
    1   VCC ----------------------- VCC
    2   VCC
    3   GND ----------------------- VSS
    4   GND
    10  /WR ----------------------- R/W
    16  D0  ----------------------- DB0
    17  D1  ----------------------- DB1
    18  D2  ----------------------- DB2
    19  D3  ----------------------- DB3
    20  D4  ----------------------- DB4
    21  D5  ----------------------- DB5
    22  D6  ----------------------- DB6
    23  D7  ----------------------- DB7
    25  A0  ----------------------- RS
    37  E   ----------------------- E


コマンドサポートはMPC-LCDと同様です。
    LOC 0,0 初期化
    LOC line,column         line=行: 1~4、column=列:1~
    PRD figure,variable     figure=表示桁数、variable=表示する数値(変数)
    PRS strlen              strlen=文字列数

表示イメージ

   10      LOC 0,0     "初期化
   20      LOC 1,5     "1行、5列にカーソル移動
   30      'ACCEL      "表示する文字列
   40      PRS 5       "表示
   50      LOC 2,5     "2行、5列にカーソル移動
   60       A=12345
   70      PRD 5,A     "数値表示

 ----------------------------------
| □□□□ACCEL□□□□□□□ |
| □□□□12345□□□□□□□ |
 ----------------------------------
 (注 □はブランク)
●078 MIF-816からパルス発生する場合(PG -1)センサー停止条件は指定できるか        010417 

【Q】
MPG-303からパルス発生する場合(PG 1〜3)はSTOPコマンドでセンサ停止条件を指定できるが、
MIF-816のJ5からパルス発生する場合(PG -1)は可能か?

【A】
PG -1の時はSTOPコマンドは無効です。途中停止にはOVRUNを使用しますが入力ポートは限
定されます(SW(24)〜(31))。

◆PG 1〜3の場合
10      PG 1
20      MODE 5
30      ACCEL 1000
40      SETPOS 0,0
50      STOP 3,0,1      ←SW(0)=1で停止
60      MOVE 10000,0
70      PRINT BSY(0)
>RUN
 15                     ←センサ停止
>RUN
 1                      ←正常停止

◆PG -1の場合
10      PG -1
20      MODE 5          ←エラーにはなりませんが無効です
30      ACCEL 1000
40      SETPOS 0,0
50      STOP 3,0,1      ←エラーにはなりませんが無効です
55      OVRUN &HFF      ←入力24〜31のどれかがonで停止
60      MOVE 10000,0
70      PRINT BSY(0)
>RUN
 1                      ←正常停止しても、OVRUN停止してもBSY(0)は1
RUN
 1
●077 配列変数を使ったRS-232Cのデータ処理                                       010403 

【Q】
次のような固定フォーマットの受信データを配列変数を使って処理できるか? 

MO,±データ1,±データ2,データ3[cr]
    (データ1とデータ2は符号付7桁、データ3は4桁)

【A】
使う配列はAR()やM()の代わりにポイントデータを使いました。
ポイントデータはPLSコマンドで簡単に確認できるからです。
(このサンプルPRGでは1個目のデータしか扱っていません)

10  NEWP
20  CNFG# 4,0,2
30  FOR I1=1 TO 26    ←キャリジリターンまで含めて26文字のデータ
40    Z(I1)=GET#(0)   ←1キャラづつ受信して配列変数に代入
50  NEXT I1
60   I3=0
70   I4=1
80  FOR I1=11 TO 5   ←ここで1桁づつ合成
90    I2=Z(I1)-&H30  ←データ取り込み
100   I2=I2*I4       ←桁上げ
110   I3=I3+I2       ←結果はI3に入れる
120   I4=I4*10
130 DEC I1
140 IF Z(4)=&H2B THEN *PLUS ←+か−か
150  I3=I3*-1       ← −の場合
160 *PLUS
170 PRINT I3
>RUN        ←実行すると待ち状態になります。
            そこへ MO,+1234567,-7654321,5678[cr]
            と送信します([cr]はキャリッジリターン)。
            それを1文字づつポイントデータに入れます。
 1234567   ←結果

このときのポイントデータは(使っているのはZ軸)
>PLS
P(1): 0 0 77 0      77(10進) = &H4D = 'M'
P(2): 0 0 79 0      79       = &H4F = 'O'
P(3): 0 0 44 0      44       = &H2C = ','
P(4): 0 0 43 0      43       = &H2B = '+'
P(5): 0 0 49 0      49       = &H31 = '1'
P(6): 0 0 50 0      50       = &H32 = '2'
P(7): 0 0 51 0           (以下略)
P(8): 0 0 52 0
P(9): 0 0 53 0
P(10): 0 0 54 0
P(11): 0 0 55 0
P(12): 0 0 44 0
P(13): 0 0 45 0
P(14): 0 0 55 0
P(15): 0 0 54 0
P(16): 0 0 53 0
P(17): 0 0 52 0
P(18): 0 0 51 0
P(19): 0 0 50 0
P(20): 0 0 49 0
P(21): 0 0 44 0
P(22): 0 0 53 0
P(23): 0 0 54 0
P(24): 0 0 55 0
P(25): 0 0 56 0
P(26): 0 0 13 0
P(27): 0 0 0 0
P(28): 0 0 0 0
   (以下略)

※MPC-816(P版)で扱える数値は3バイト長(約±800万)整数です。
※ポイントデータのX(0)、Y(0)、U(0)、Z(0)はMPG-303からの現在値取得ですから
  このような用途には使えません。

    see also 012 配列変数を使ったRS-232C文字列解析
●076 YPLSのカウンタが0になるのを拾えない                                       010312 

【Q】
下記のようにYPLSのCCW方向のパルスカウントが0になるのを待っているが拾えない。

WAIT C=0  "C パルスカウント変数

【A】
タスクの稼動状況や、パルスレートによっては丁度0を拾えない場合があります。
WAIT C<=0
としてみてください。


●075 MPG-303のティーチモード中にTABキーでPGが切り替わらない                    010312 

【Q】
MPC-816KシステムにMPG-303を複数使用している。ティーチモード中でTABキーを使って
PGを切り替えたいのだが動かない。

    PG 1#1(X,Y,Z,U) 0 0 0 0 [XYZ,U] 800 800
       ~\
          PGナンバー TABキーで1〜3切り替え

【A】
PGの選択値が初期化されていないとなる場合があります。PG関係の初期化はMPCINITには
含まれていないため、MPCINITでは直りません。
ティーチングモードに入る前に値を設定すれば、その後TABキーで選択できるようになります。

>PG 1                                       ← ダイレクトコマンドでPG選択
PG 1#1(X,Y,Z,U) 0 0 0 0 [XYZ,U] 800 800     ←ティーチモード

インチング量(上記 800 800 の部分)が異常な数値になっている場合もあります。
これは数字キー0〜3のいずれかで正常化します。


●074 MOVE、RMOVとYPLS,ZPLSの併用                                               010312 

【Q】
MIF-816の同一パルスポートを使って、MOVE,RMOV,HOMEなどのSOFT-PGとYPLS,ZPLSを併用
できるか?

【A】
SOFT-PG(P版でPG-1で使用する)とYPLS,ZPLSは全く関連の無いソフトです。併用する場合
は以下の点にご注意ください。

・YPLS,ZPLSで出力されたパルスはRMOV,MOVEの位置管理と関連しない。というより内部シ
  ステムでは関連づけることができない。
・YPLS実行中でもMOVE,RMOVは実行可能であり、それによりポートの状態が整合しなくな
  りパルス数が狂うことがある。場合によってはパルス発生が終了してもポートがONの
  ままになり、モータードライバによっては具合が悪くなる場合がある。
・つまり、YPLSでポートがONのまま、RMOVなどのパルス出力をすると、ON/OFFが整合し
  ない。

などで、正しい使い方としては 

・SOFT-PGとYPLS,ZPLSは排他使用とし、YPLS,ZPLSの終了をしっかり
  確認する(例:WAIT A=256)。
です。

これらのソフトは、MPC−816K自体がZ80環境として満杯状態で、ソフトメンテ
が困難です。問題が出ても改版ができない場合がありますので、クリティカルな使い方を
される場合は、確認をお願いします。

●073 MPC-816P,Z,S の初期化                                                     010228 

初期MPC-816シリーズ(256ROMに816P,S,Zのシール貼付)の初期化にMPCINITコマンドは使え
ません。バッテリを交換した場合、下記のプログラムを実行すると初期状態になります。

※バッテリ交換の際、プログラム、ポイントデータは消えますから必要に応じて事前に
パソコンへ保存してください。
※I/Oコネクタは抜いて初期化してください。

◆MPC-816S or PでMPG-303を実装している場合の初期化

 PG 1
 SETIO &H007F
 MODE 1      "MPC-816PはMODE 5
 OVRUN 0
 D45 0
 AXIS 1
 ACCEL 4000
 SHOM 3,8,50
 SHMZU 0,0   "MPC-816Pは不要
 HOME IN(2),0,0
 SET 0,100,100
 SET 1,200,200
 SET 2,400,400
 SET 3,800,800
 FIX 0
 NEWP
 HOMZ 0
 LSCNT 22
 A_START 0
 TMOUT 0
 NEW


◆MPC-816S or PでMPG-303を実装していない場合の初期化

 SETIO &H007F
 SET 0,100,100
 SET 1,200,200
 SET 2,400,400
 SET 3,800,800
 FIX 0
 NEWP
 LSCNT 22
 A_START 0
 TMOUT 0
 NEW

◆MPC-816Zの初期化

 SETIO &H007F
 MODE 2
 AXIS 1
 ACCEL 4000
 OVRUN 0
 SHOM 2,5,50
 SHMZU 0,0
 HOME 0 0 0
 HOMZ 0
 SET 0,100,100
 SET 1,200,200
 SET 2,400,400
 SET 3,800,800
 FIX 0
 NEWP
 LSCNT 22
 A_START 0
 TMOUT 0
 NEW

●072 MPC-816 プログラムの読み込み(LOAD)が終わらない                            010112 

【Q】
下のプログラムを読み込むと、最終行で作業が停止したままになる。なぜか?

'日本語コメント
  ON 0
  OFF 0
*A
  PRINT SW(0)
*B
  END

【A】
原因は日本語です。
MPC-816のプログラムには日本語は使えません。
'(シングルコーテーション)のコメントにも使えません。
ソースプログラムの"(ダブルコーテーション)の後ろなら日本語も使えます。
●071 MPC-816の演算結果が異常?                                                     001214 

 @は除算結果を配列変数に代入するダイレクトコマンド操作で、2回目の結果が不正です。
これはMPC-816の文字数制約により、2回目の1000を100として演算してしまうためです。
Aは打ち込んだプログラムのLISTが変化しています。
このような場合は普通の変数に置き換えて演算してください。
AR配列をM配列にしても短くなりますB(1文字だけですが(^^; )

@
    >AR(10)=36000/100
    >PR AR(10)
     360                        ←正常
    >AR(10)=36000/1000
    >PR AR(10)
     360                        ←不正

A
    10 AR(10)=36000/100
    20 PRINT AR(10)
    30 AR(10)=36000/1000        ←1文字長い
    40 PRINT AR(10)
    LIST
    10       AR(10)=36000/100
    20      PRINT AR(10)
    30       AR(10)=36000/100   ←1000が100になる
    40      PRINT AR(10)
    >RUN
     360
     360

B
    10       M(10)=36000/100
    20      PRINT M(10)
    30       M(10)=36000/1000
    40      PRINT M(10)
    >RUN
     360
     36
●070 MPG-301にはMPG-303の命令は使えないのか?                                      001207 

MPG-301の制御はMPG-303とは全く異なり、MOVE,RMOV,HOMEなどのMPG-303に対するロボット
コマンドは使えませんし、ティーチングモードでも動きません。
MPG-301の命令は下記の4つで、搭載しているパルス発生IC「X3202」のレジスタを読み書
きしてICのパルス機能を使います。

  CMND     ・・X3202コマンド実行
  REG      ・・X3202レジスタ読込み
  REG3     ・・X3202レジスタ読込み
  ST_REG   ・・X3202レジスタ書き込み

◆MPG-301の特徴  ()内 MPG-303
◎ハード的
  1軸/1枚     (4軸/1枚)
  高速パルス発生 1Mpps (50kpps)
  途中パルスレート変更、無限パルス発生、S字加減速等の特殊パルス発生
  エンコーダーカウント
  MPCはMPG-301を最大4枚までサポート (3枚)

◎ソフト的
  どのタスクでも使える (使えるタスクに制約有り)
  パルス発生中にそのタスクが停止しない (MOVE,RMOV等は実行中停止)

●069 MPC-816 RS-232C GET#(0)で入力したデータを10進数にするには                     001129  
INPUT#は&H31を10進'1'に自動的に変換しますが(@)、GET#では'49'のままです。
それを10進'1'にするには&H30を引きます(A)。
この様にGET#したデータが&H30〜&H39('0'〜'9')なら&H30、&H41〜
&H46('A'〜'F')なら&H37を引きます(B)。
もしもデータが10進の桁表記(&H31&H32&H33で'123'としたい)ならば10進に直して桁上げします(C)。

@
INPUT# A    ←外部から&H31<cr>と送信
>PR A
 1

A
>A=GET#(0)  ←外部から&H31と送信
>PR A
 49
>B=A-&H30
>PR B
 1

B
>A=GET#(0)  ←外部から&H41と送信
>PR A
 65
>B=A-&H37
>PR B
 10

C
(外部から&H31&H32&H33('123')と送信)
>A=GET#(0)
>PRX A
 &H31
>A1=A-&H30
>A1=A1*100  ←100の桁
>A=GET#(0)
>PRX A
 &H32
>A2=A-&H30
>A2=A2*10   ←10の桁
>A=GET#(0)
>PRX A
 &H33
>A3=A-&H30
>A4=A1+A2
>A4=A4+A3
>PR A4
 123
●068 MPC-816 RS-232C INPUT#は使える?                                              001124 

【Q】
  次のようなデータをINPUT#で入力できるか?
082005280FA00EB0FF76
|  |
 ↑
1つのデータは2バイト16進で表されている。

【A】
  このデータにはデリミタもターミネータも無いのでINPUT#では受信できません。下記の
プログラムでは受信バッファから1文字ずつ取りだし、一旦配列変数に入れてから各デー
タに分けています。
  バッファから取り出す毎に普通の変数で処理をしてもかまいませんが、デバッグ性を考
えて配列変数を使っています。
  ここでは配列変数に点データZ()を使っていますが、MPC-816にはこの他にAR()、M()と
いう配列があります。Z()を使った理由はPLSコマンドで簡単に内容確認が行えるためです。

"受信データ例
" 082005280FA00EB0FF76
" |X1||Y1||X2||Y2||Z1| 
"
"  X1:X 1点目の中心座標
"  Y1:Y 1点目の中心座標
"  X2:X 2点目の中心座標
"  Y2:Y 2点目の中心座標
"  Z1:角度ずれ量
"
"受信したデータは2バイト長16進なので10進にすると
"      16進数  10進数
"  X1   820     2080
"  Y1   528     1320
"  X2   FA0     4000
"  Y2   EB0     3760
"  Z1   FF76    -138
"
CNFG# 4,0,2
WAIT RS(1)>9
FOR I1=1 TO 10
  Z(I1)=GET#(0)
NEXT I1
X1=Z(1)*256
X1=X1+Z(2)
Y1=Z(3)*256
Y1=Y1+Z(4)
X2=Z(5)*256
X2=X2+Z(6)
Y2=Z(7)*256
Y2=Y2+Z(8)
Z1=Z(9)*256
Z1=Z1+Z(10)
PR X1,Y1
PR X2,Y2
I1=Z(9)^&H80
IF I1=0 THEN *SKIP0
Z1=Z1-65536
*SKIP0
PR Z1
>RUN  ←ターミナルから&H08&H20&H05&H28&H0F&HA0&H0E&HB0&HFF&H76と送信
 2080 1320
 4000 3760
 -138

この時の点データを見てみると
>PLS
P(1): 0 0 8 0       = &H08
P(2): 0 0 32 0      = &H20
P(3): 0 0 5 0       = &H05
P(4): 0 0 40 0      = &H28
P(5): 0 0 15 0      = &H0F
P(6): 0 0 160 0     = &HA0
P(7): 0 0 14 0      = &H0E
P(8): 0 0 176 0     = &HB0
P(9): 0 0 255 0     = &HFF
P(10): 0 0 118 0    = &H76
           ↑
           Z()


●067 MPC-816 RS-232C INPUT#,GETN#,GET#の違い                                       001124 

  MPC-816のINPUT#はアスキーコードで表された10進数文字列の入力で、ターミネータ(<cr>)
まで一気に読み込みます(@)。
  INPUT#で意味のあるのは下表の様に&H30(0)〜&H39(9)で(B)、それ以外のデータが混在
していると異常な数値になります(C、C')。また、&H41(A)〜&H46(F)は1キャラクタずつ
しか入力できません。
  GETN#は先頭から連続した&H30〜&H39のみを入力します(D)。
  コードそのもので取り出したい場合はGET#を使います(A)。

※ターミナルとは汎用ターミナルソフトのことで、ここでは弊社オリジナルの「ACTERM.EXE」
  を使いました。

@ 書式付き数値列の入力
10 CNFG# 4,0,2
20  INPUT# A1   ←ターミナルから1キャラクタ(&H30など)+<cr>(&H0D)送信
30 PRX A1
40 PRINT A1

A 1キャラクタ入力
10 CNFG# 4,0,2
20  A1=GET#(1)  ←ターミナルから1キャラクタ送信(&H30など)
30 PRX A1
40 PRINT A1

B @とAで受信した結果。 ()内は10進数
ターミナル   MPC        MPC
から送信    INPUT#      GET#
  &H30      &H00 (0)   &H30 (48)
  &H31      &H01 (1)   &H31 (49)
  &H32      &H02 (2)   &H31 (49)
  &H33      &H03 (3)   &H31 (49)
  &H34      &H04 (4)   &H31 (49)
  &H35      &H05 (5)   &H31 (49)
  &H36      &H06 (6)   &H31 (49)
  &H37      &H07 (7)   &H31 (49)
  &H38      &H08 (8)   &H31 (49)
  &H39      &H09 (9)   &H39 (57)
  &H40      &H10 (16)  &H40 (64)
  &H41      &H0A (10)  &H41 (65)
  &H42      &H0B (11)  &H42 (66)
  &H43      &H0C (12)  &H43 (67)
  &H44      &H0D (13)  &H44 (68)
  &H45      &H0E (14)  &H45 (69)
  &H46      &H0F (15)  &H46 (70)
  &H47      &H10 (16)  &H47 (71)
   :
  &H64      &H2D (45)  &H64 (100)

C &H30〜&H39だけの数値文字列をINPUT#で入力
10      CNFG# 4,0,2
20      INPUT# A1
30      PRX A1
40      PRINT A1
RUN  ←ターミナルから &H31&H32&H33&H0D(123<cr>)と送信
 &H7B
 123 ←期待通り

C' &H30〜&H39以外とそれ以外のキャラが混在したものをINPUT#で入力
10      CNFG# 4,0,2
20      INPUT# A1
30      PRX A1
40      PRINT A1
RUN  ←ターミナルから &H31&H32&H33&H41&H0D(123A<cr>)と送信
 &H04D8
 1240 ←?

D &H30〜&H39以外とそれ以外のキャラが混在したものをGETN#で入力
10      CNFG# 4,0,2
20      GETN# A1
30      PRX A1
40      PRINT A1
RUN  ←ターミナルから &H31&H32&H33&H41&H0D(123A<cr>)と送信(上と同じ)
 &H7B
 123 ←Aより前まで入力。A以降はバッファに残る
>PR RS(1)
 2   ←Aと<cr>が残っている

●066 MPC-816 RS-232C データのターミネータとデリミタ                                001122 

【Q】
RS-232C送受信のターミネータ、デリミタって何?

【A】
デリミタはデータ文字列の中の区切り文字で、ターミネータは1データ文字列の終端子を
いいます。
たとえば
  <esc>111<sp>222<sp>333<cr>
  <esc>444<sp>555<sp>666<cr>
            :
というようなデータでは<sp>(スペース&H20)がデリミタ、<cr>(キャリッジリターン&HD)
がターミネータです。
デリミタは<sp>に限りませんが、このような区切り文字があれば、データ文字列の中から
データを切り出すのが容易になります。
ターミネータもこれに限られたものではありませんが、<cr>または<cr><lf>が一般的です。
MPCの出力では PRINT# 123 とすると 123<cr><lf> と出力されます。
<cr><lf>を出したくない場合はPUTS#、1文字ずつ出したい場合はPUT#を使います。
MPCの入力 INPUT# はデリミタが<sp>、ターミネータが<cr>です。
"INPUT# A1 A2" とすると<cr>が来るまでこの文から抜けません。
そこに外部から123<sp>456<cr>と送ると、データは<sp>で区切られてA1に123、A2に456と
入ります。
ターミネータが<cr><lf>なら最後の<lf>はバッファに残されますが、次のINPUT#で無視さ
れます。

次のプログラムは上記データ列の入力例です。ここではデータ長・フォーマットは固定と
します。
  10      CNFG# 4,0,2     ←ポート初期化
  20      WAIT RS(1)>12   ←バッファにデータが溜まるのを待つ
  30      SKIP# &H1B      ←最初の<esc>(エスケープ)を読み飛ばす
  40      INPUT# A1,A2,A3 ←<sp>をデリミタとしてデータを分解して変数に入れる
  50      PRINT A1,A2,A3
  RUN                     ←外部から<esc>111<sp>222<sp>333<cr>と送る
   111 222 333

この様な定型の書式ではINPUT#を使えますが、可変長データや特殊なターミネータ・デリ
ミタの場合はデータ入力確認、読み飛ばし、データ切り出しなどの工夫が必要です。
MPC-816では特定の文字を探したり、を読み捨てるためにSKIP#、SKPSP#、TST#、FIND#と
いうコマンドがあります。
●065 MPC-816 TMOUTの待ち時間を関数実行中に変更できるか?                           001117 

【Q】
WS1,WS0などのタイムアウト付き関数を実行中に別のタスクからTMOUT値を変更できるか?
(目的:長いタイムアウトを強制終了したい)

【A】
できません。

10      SETIO
20      TMOUT 1000   ←10秒設定
30      FORK 1,*WS
40      END
50      *WS
60      PUT &H15
70      IF WS1(0)=1 THEN *TMOT
80      'OK
90      PRINT STR(-1)
100     END
110     *TMOT
120     PUT &H16
130     'TM OUT
140     PRINT STR(-1)
150     END
RUN         ←実行して
>TMOUT 0    ←途中でダイレクトコマンドでTMOUTの値を短くする
>
 TM OUT     ←やはり10秒かかる
●064 MPC-816X(FROM版)とMIF-816Zの組み合わせ使用について                            001113 

MPC-816X(フラッシュROM版 PCB番号:CEP-021F)とMIF-816Z(PCB番号:CEP-002B)は
BUS仕様の一部の違いにより組み合わせて使用できません。
保守等でCPUを交換する場合は下記の処置を施すことで使用可能になります。

J5 BUSコネクタ 1番(P5)・7番(ME)ピン間に2KΩの抵抗をハンダ付けします。

        (J5 部品実装面)
    2 ○ ○ ○ ○ --- ○ 40
    1 ○ ○ ○ ○ --- ○ 39
      |       |7
       --2KΩ--

●063 MPG-301の減速が遅い                                                           001109 

【Q】
加速レート設定レジスタの値を小さく(例えば100->30)すると減速がだらだらと遅くなる。

【A】
減速レート設定レジスタにも加速レート設定レジスタと同じ値をセットしてください。

10      ST_REG &H0100,250
20      ST_REG &H0101,5000
30      ST_REG &H0103,100           ←起動周波数設定レジスタ
40      ST_REG &H0104,2000
50      ST_REG &H0105,10            ←加速レート設定レジスタ
60      ST_REG &H0106,10            ←減速レート設定レジスタ
70      CMND &H01A0
80      CMND &H0100

減速開始点自動算出モード(レジスタ&H60)ではR5=R6に設定する。
(R5>R6ならば減速領域は小さくなり、R5<R6だと減速領域はR3の定速パルス発生になる。)
●062 MPC−816のバッテリ交換について                                          001019 

MPC-816にはSRAMデータバックアップ用のリチウム電池が実装されています。
この電池は充電式ではありませんので、プログラムでポイントデータやバックアップ変数
を使用している場合には定期交換をお勧めします。

◆バッテリがハンダ付けのタイプの場合

【 @バッテリを抜く前に 】
ポイントデータをパソコンに保存して下さい。(使用していなければ不要)
変数値を控えて下さい。(バックアップ変数として使用していなければ不要)
  変数はプログラムやポイントデータの様にパソコンに保存はできません。
  VLIST<cr>とすると変数一覧が表示されますので、画面コピーなどして控えをとってください。
    >VLIST
    A0~9,A:  240 1 16 1 0: 0 0 0 0 0: 0
    B0~9,B:  0 0 0 0 0: 0 0 0 0 0: 0
    C0~9,C:  0 0 0 0 0: 0 0 0 0 0: 0
    (以下略)
念のためプログラムもパソコンに保存して下さい。

【 Aバッテリを交換する 】
MPCの電源を切り、バッテリ回路のショートピンが有る機種はオープンにして下さい(816X,KはSP1)。
バッテリを交換して、ショートピンを戻します。(この間にSRAMのデータは消えてしまいます)
再びMPCに通電します。
ポイントデータ、変数は化けていますからMPCINIT<cr>(※)でを実行してリセットボタンを
    TNYFSC(R) Rev-3.53s[VER-PmaX2044]       ←電源再投入
     Copyright(C)by ACCEL Corp/BcSoft
     [300p MPC-816K  MPG  MODE5|6]K8bc
    !! BAT Error
    >VLIST                                  ←確認(必須ではありません)
    A0~9,A:  5864936 -1091850 -2888037 -5579420 7724252: 1046397 -3202851 -7120225
    B0~9,B:  6130687 -672267 3756448 -6291688 -4735490: 8378103 -3303698 7584639
    (中略)
    >PLS                                    ←確認(必須ではありません)
    P(1): 16640 4202752 -8388576 4458496
    P(2): 3211776 65556 -7794398 106496
    (中略)
    >MPCINIT                                ←SRAM初期化(※)
    >                                       ←MPCのリセットボタンを押す
                                              (プログラムがFROMからリストアされます)
            TASK 0 # 5156   TASK 1 # 11
            TASK 2 # 16768  TASK 3 # 20864
    >VLIST                                  ←確認
    A0~9,A:  0 0 0 0 0: 0 0 0 0 0: 0
    B0~9,B:  0 0 0 0 0: 0 0 0 0 0: 0
    (中略)
    >PLS                                    ←確認
    P(1): 0 0 0 0
    P(2): 0 0 0 0
    (中略)

※ このときはMPCINITだけを実行します(ERASEは行わない)。
   MPCINIT後、直ちにリセットボタンを押して下さい。
   リセットボタンを押すことによりFROM(フラッシュROM)に入っているプログラムが復元されます。

【 Bデータの復元 】
@でパソコンに保存したポイントデータをMPCに戻します。(使用していなければ不要)
稼動に必要な変数をダイレクトコマンドで入力します。   (使用していなければ不要)
    >A0=240
    >A1=1
万一、プログラムを消してしまったら、プログラムも戻してください。


◆MPC−816KF (バッテリがソケット実装のタイプ)での裏ワザ

MPC-816KFの電源を切りラックから引き抜きます。
周辺機器の誤動作防止のためI/O・RS-232C・パルスのコネクタは抜き、電源(J3)だけを接続して下さい。
再びMPCに通電を入れ、通電状態でバッテリを交換します。
通電時にはバッテリは分離された状態となり、SRAMデータは外部電源によって保持されます。
ショートしないように、バッテリ・基板の取り扱いには十分注意して下さい。

◆使用電池

MPC-816Z,S,P (黄色)
    CR1/26L-F1ST2S (FDK。弊社でも販売しています)
MPC-816X,K   (銀色)
    CR1/3N-FINF1S  (FDK。弊社でも販売しています)
MPC-816KF    (ボタン電池)
    CR2032   (市販品が使用できます)

●061 MPC-816KFの「MIO 816モード」でMIO-240Eが動作不良                              001013 
(これはかなり特殊なケース)
MPC-816KFにMIO-816を8枚、MIO-240を2枚搭載して「MIO 816モード」で使おうとしたら
MIO-240の出力が正常に動作しない
デフォルトの状態(MIO 240モード)ではMIO-816#6以上は使えないが、
「MIO 816モード」にすればMIO-816#6以上とMIO-240(MAX3枚)が併用できるはず。

【ボード構成】
MPC-816KF(3.35s/K8bb),MIF-816X,MIO-816X#1〜#8,MIO-240E#1〜#2(出力のみ)
(これまでMPC-816Xで使用していたが、CPUのみKFに交換)

【原因】
周辺ボードも含めたXからKへの改版時(8255レス)に未対応でした。
修正版 3.35s/K8bb を公開(本日の時点ではβ扱い)。
なお、MIO-248では問題ありません。
●060 MPG−303 パルス出力実測                                                 001005 

データ
●059 MPG−303 JOGコマンド動作が不安定                                     001004 

【現象】
複数台同仕様の装置を製作したが、その中でJOGコマンドが頻繁に動かなくなるMPG−303がある。
問題MPGを使った装置で発症するのでMPGについて回る不具合のようだ。

【原因】
原因はJOGの動作範囲設定(RANG)の不正によるものと思われます。
JOGの動作範囲はXRANG〜ZRANGで規定され、JOG開始時の位置がRANG
範囲内にある場合は設定範囲を超える動作はできません。しかし、開始時すでに範囲外で
あれば動いてしまいます。JOGはRANG内で使用するという前提です。
また、XRANG〜ZRANGのパラメータはMPG−303のSRAMに保存されており、
RANGコマンドを実行するまで値は不定です。(RANG指定しなければどんな値かわ
からない)
JOG動作不安定のMPGは、RANG幅がかなり狭くなっていたようで、SETPOS
やHOME直後のJOGが少しだけ動作してその後動かなくなるというような現象だと思います。
JOGを使う場合、RANGは必ず設定して下さい。
詳細はユーザーズマニュアル JOG、XRANGをご覧下さい。
●058 FTMWでプログラムを読み込んだら???続出                                         001003 

【現象】
FTMW Ver6.02aで文番号無しプログラムをLOADしたら???が続出し、
正常に読めない。
プログラムに問題は無さそうだが..

【原因】
2行目以降の行頭が数字だと正常に読み込めません。
判り難いのはO(オー)と0(ゼロ)です。
オー     ゼロ
 ON 0  → 0N 0
 OFF 0 → 0FF 0
FTMW Ver6.08でエラーメッセージを追加しました。
●057 高速サイクルの装置を作成したい。MPCの実行速度の目安は?                     000926 

下記はそれぞれ10000回実行してのデータです。
遅いほうで約8秒で10000*5行実行です。
めやすとして、0.16mSEC/一行となります。
0.1秒では625ステップとなりますので、500行くらいのプログラムで
あれば0.1秒に収まるということになります。

ただ、これはシングルタスクの場合のデータです。マルチタスクにした場合は
統合性能になりますので、机上計算はできません。

高速の場合はIOのディレイも無視できません。通常1m秒くらいの遅れは配線や
センサで発生しますのIOの状態も配慮にいれる必要があります。

10      FOR I=1 TO 10000
20        A=HSW(0)
25       A=1
30       ON 1
40       OFF 1
50       IF A=0 THEN *TEST
60       *TEST
70      NEXT I
RUN
5'97"
10      FOR I=1 TO 10000
20        A=HSW(0)
25       A=0
30       ON 1
40       OFF 1
50       IF A=0 THEN *TEST
60       *TEST
70      NEXT I
RUN
7'73"
●056 MPCがノイズでフリーズ?。リセットボタンで復帰する                          000920 

【現象】
自動運転中に装置停止。MPC−816のリセットボタンで再起動する。
原因は高ノイズ源にあるようだが不明。

【推測】
MPC−816のリセットボタンはソフトリセットなので、CPU暴走やデータ破壊といった
致命傷ではありません。
過去に、ノイズを入力信号と誤認識して予期せぬシーケンスを実行していたという事例が
ありました(この時は非常停止シーケンスでした)。
このようなとき、MPCの電源を切らずにそのままFTMWと接続し、MONコマンド
で実行ステップを確認できれば解決の糸口をつかめるかもしれません。
●055 Out of Range  の原因                                                          000913 40401

Out of Rangeはサブルーチンのネストが深すぎたり、
パラメータに不正な数値を入れると発生します。

◆次の例はTHENと書くところをGOTOと書き、LOAD後GOSUBに自動変換されてエラーになった例です。

・DIKS上のプログラム

N=0
*LOOP
IF SW(0)=0 GOTO *PASS           ←GOTOで飛ばすつもり
*PASS
N=N+1
PRINT N
GOTO *LOOP

・読み込み(LOAD)後のMPC内のプログラム

>LIST 0
10       N=0
20      *LOOP
30      IF SW(0)=0 GOSUB *PASS  ←GOTOがGOSUBに変わる(正しくはTHEN)
40      *PASS
50       N=N+1
60      PRINT N
70      GOTO *LOOP              ←戻って繰り返しGOSUBが実行される
Programming the FLASH ROM *+++++++
 1
 2
 3
(中略)
 22
 23
 # 30
!! Out of Range   ←GOSUBのネストが深くなりすぎてエラー(ネストの深度はプログラムにより異なります)
>


◆RS−232CでMPCの処理が間に合わない場合でもエラーになります
ボーレートを9600にして接続機器から1234567<cr>を連続して送信します。
MPCの処理が間に合わず、文字こぼしやOut of Range エラーとなります。

10      CNFG# 6,2,2     ←9600ボー
20      *LOOP
30      INPUT# A
40      PRINT A
50      IF A=0 THEN *END
60      GOTO *LOOP
70      *END
80      END
>
RUN
 1234567
 13457
 1234567
 # 30
!! Out of Range

◆文番号が大きすぎる

TNYFSC(R)!Rev-3.30e [VER-PmaX2044]  ←P版のプログラムは最高2044行です
 Copyright(C)by ACCEL CORP/BC-SOFT
 [300p MPG-303(PG 1~3)MODE5|6]m405

32760   ON 0
32765   OFF 0
32766   ON 1
32767   OFF 1                       ←文番号は32766以下です(P,Z共通)。
!! Out of Range


◆パラメータが不正の場合

・Z版でP版のMODEを指定
MODE 5                 "Z版にMODE 5は無い
!! Out of Range

・JOGのスピードの設定が大きすぎる
JOGのスピードはACCELの加速距離と関係します。

10 PG 1
20 MODE 5
30 ACCEL 30000,900,500 "加速距離900パルス
40 JOG 1000,2          "スピード > 加速距離なのでNG
RUN
 # 40
!! Out of Range        "エラーになる
>
上の30行を変更
30 ACCEL 30000,1000,500 "加速距離変更
40 JOG 1000,2           "スピード≦加速距離 でOK


◆◆エラー個所の探し方
エラー停止したときに表示される文番号はタスク0の番号です。
マルチタスクで動いている場合、エラー個所はそことは限りません。
子タスクも調べる必要があります。

(MPCはZ版です)
>LIST 0
10      FORK 1,30
20      GOTO 20
30      MODE 5
40      ACCEL 1000
50      END
>RUN
 # 20                               ←この番号はタスク0のもの
!! Out of Range                     ←エラーで停止。20行目がおかしい??
>MON                                ←全タスクの停止行表示
        TASK 0 # 20     TASK 1 # 30 ←タスク1は30で停止   
>                                   ←FTMWでCTRL+Mすると1行ずつ表示します
TASK0 20        GOTO 20             ←これは問題無し
TASK1 30        MODE 5              ←これが原因!
●054 マルチタスクトレースの方法                                                    000901 

下のプログラムのようにメインタスクを終了するとプロンプトが戻って来てFTMWから
操作ができるようになります。
ここでCtrl+M操作をすると各タスクの実行行を知ることができます。
ダイレクトコマンドも実行できますから、変数やI/Oの状態もモニタできます。

注意としては
@Ctrl+Aではプログラムの停止が出来なくなります。Ctrl+]で停止してください。
Aプログラムを変更すると実行は停止します。
B子タスクにPRINT文表示があると画面表示文字が乱れることがあります。

10       I=0
20      FORK 1,*TASK1   ←子タスク起動
30      END             ←メインタスク(タスク0)を終了
40      *TASK1
50       I=I+1
60      ON 0
70      TIME 50
80      OFF 0
90      TIME 50
100     GOTO *TASK1
Programming the FLASH ROM *++++++++     ←RUN
>               ←プロンプトが戻って来てFTMWの操作が可能になる
TASK1 90        TIME 50 ←Ctrl+M で各タスクの実行行表示

>PR I           ←ダイレクトコマンドも実行可能
 6
>
●053 MIO−248のアドレス設定                                                  000829 

MIO−248のアドレスはDIP1のどれか1つのSWをONにして選択します。

  MIO                 DIP SW(1=ON)
  248   in     out    12345678
  #1  112~119 112~135 10000000
  #2  136~143 136~159 01000000
  #3  160~167 160~183 00100000
  #4  184~191 184~207 00010000
  #5  208~215 208~231 00001000
  #6  232~239 232~255 00000100

MIO−248は出力24点、入力8点で固定です。
MIO−240の様にコマンドでの入出力ポートの設定はできません。
●052 MPC−816のプログラム容量が足りない                                      000824 / 001208

現在のMPC−816Kのプログラム容量は2044ステップです。

  TNYFSC(R) Rev-3.53s[VER-PmaX2044] ←この2044はプログラム容量
  Copyright(C)by ACCEL Corp/BcSoft
  [300p MPC-816K  MPG  MODE5|6]K8bb

この量を増やすことは出来ません。
残量はFREEコマンドで確認できます。

  >NEW      ←プログラムエリアクリア
  >FREE     ←残量表示
   2044     ←カラッポ状態


◆ステップ数を減らすワザ

@コメントを減らす
 '(シングルコーテーション)のコメント行もステップ数に入りますから、これを多用
している場合は減らしてください。
エディタで編集している場合は "(ダブルコーテーション)にして下さい。
FTMWは"コメントを読み込みません。日本語もOkです。
しかし、この場合はPC→MPCへの一方通行(LOADのみ)の作業になります。

  'COMMENT    ←これは1ステップになる
  "COMMENT    ←MPCへ読み込まない

Aタッチパネル通信を減らす
RS-232Cユーザーポートでタッチパネル(デジタル社GPシリーズ)と通信していたら、MBK-816
をご検討下さい。MBK-816でパネルとの通信(Panasonic MEWNET-FPプロトコル)を行います
から、プログラムからパネル通信部分を全て省くことができます。

●051 MPG−303動作、パルス出力の確認方法                                      000817 
ティーチングモードで確認するのが簡単です。
    >PG 2           PGボード選択[最初]
    >MODE 5         モード選択[PG選択の直後]
    >OVRUN 0        OVRUN設定解除
    >ACCEL 5000     加減速設定
    >FEED 0         スピード設定[ACCEL後]
    >T              ティーチングモード
    PG 2#1(X,Y,Z,U) 1600 1600 0 0 [XYZ,U] 800 800
       ↑            ↑    ↑↑↑         ↑
       PGボード        X    Y Z U          移動量

※ティーチングモード時の主なキー操作
PGボードの変更
    TABキー
パルス出力
    Xキー  XCW、xキー  XCCW、Yキー  YCW、yキー  YCCW、
    Zキー  ZCW、zキー  ZCCW、Uキー  UCW、uキー  UCCW
移動量の変更
    0〜3キー
ティーチングモードの終了
    Qキー

MODE,ACCEL,FEEDなどの設定はダイレクトコマンドで実行するとPGのSRAMに記憶されますが、
プログラムにも必ず記述してください。
ACCELやMOVE,RMOVなどのPGコマンド実行中はMPG-303の赤LEDが点灯します(BUSY状態)。
パルス発生中はLED3〜10の緑LEDが点灯しますが、周波数や出力数により判り難い場合があります。
●050 MPG-301をアップダウンカウンタとして使うには                           000810 

エンコーダ入力を2クロック負論理に設定し、J4コネクタに信号を次の様に接続します。

    接続
    [301 J4]              [機器]
    9 (EA1+) ------------ UP+ (例 DC5Vプルアップ)
    10(EA1-) ------------ UP- (例 オープンコレクタ出力)
    13(EB1+) ------------ DOWN+
    14(EB1-) ------------ DOWN-

    プログラム設定
    ST_REG &H151 &H0    "チャンネル1,2 2クロック負論理
    CMND &H150          "カウンタAクリア

MPG−301にエンコーダー入力は2チャンネルありますが、カウンタは1つです。
切り替えで排他的に使うことができます。

    ST_REG &H152 &H02   "チャンネル1 カウントイネーブル
    ST_REG &H152 &H04   "チャンネル2 カウントイネーブル

カウンタの読み込みは
    P0=REG3(&H121)

※これらはMPG-301 #1に対する使用例です。

●049 MPG-303でパルス発生中に他軸を動かせるか?                             000810 
【Q】
例えばX軸が動作している途中で同じMPGのZ軸パルスを開始できるか?
【A】
できません。
パルス発生中のMPG-303へ対してのアクセスは禁止です。
STOP,BSY以外のMOVE,RMOV,ACCEL,HPTなどのコマンドは使用できません。
●048 MPC-816KF Z版MODE 1のパルス波形                                       000731 

MODE 1
ACCEL 10000
FEED 0
RMOV 30000 0
FEED 0

  ______________   ______________   OFF
_|              |_|                 ON
 |<------------>| |<-
    100μSEC    12μSEC

ACCEL 20000の時
  ______   ______
_|      |_|
 |<---->| |<-
   50μ 12μ

ACCEL 30000の時
  ____   ____
_|    |_|
 |<-->| |<-
  32μ12μ

●047 MPC−816X、Kのリチウム電池について                            000718 

【Q】
寿命は?
【A】
MPCに24V通電中はリチウム電池は消耗しませんので、
電池寿命はボードの使用状況で変りますが、常温無通電保存で公称7年としています。
実績としては初代MPCは10年以上経過しますが、電池やその周辺回路の初期不良、
ボード取り扱いミスと思われるトラブル以外での容量抜けのご報告や修理依頼は頂いておりません。
目安は電圧が3V以上あれば大丈夫だと思います。

【Q】
アクセルで購入できるか?
【A】
リチウム電池は弊社でも販売しています。
MPC−816X、Kの電池(銀色・筒型)は FDK CR1/3N-FINF1S です。
価格と納期は営業係へお問い合わせ下さい。

MPC−816KFの電池(ボタン型)は マクセル CR2032 は市販品が使用できます。

●046 MPG-303が動かない?                                           000717 

【症状】
MPC-816K(Rev3.53o)でMPG-303を使用し、TEACHモードにしても動作しない。
ダイレクトコマンドでPG 1とした後は動作しても、プログラム停止後(CTRL+A)や
電源再投入するとに動作しなくなる。

プログラムを実行しても、フラッシュROM書き込みのメッセージが出ない。
プログラムを実行すると異常終了していまう。

【原因】
これらはRev-3.53o(2000/4月)〜3.53r(2000/7月)の問題です。
前者はRev-3.53oでPG -1を初期値としたためで、
CTRL+Aや電源投入でリセットされると設定がPG -1に戻ってしまいます。
後者は上記初期値の変更時に作ってしまったHPT関数のバグによるものです。

これらの不具合は3.53sで改善しました。
MPG、HPTを使用していない場合は問題ありません。


●045 プログラム中でジャンプを繰り返すとスタックオーバーフローエラーになる             000714 

【Q】
    *DEF
    IF --- GOSUB *ABC
    *ABC
    GOTO *DEF
というようにGOSUBでジャンプを繰り返していたらスタックオーバーフローになる。
本当はGOTOしたくて
    IF --- THEN GOTO *ABC
と書いたら???になった。
どうしたらいい?

【A】
GOSUBはサブルーチンコールで、RETURNが無いまま何回もGOSUBを繰り返すとスタックがオーバーフローしてプログラムは停止します。
MPC-816でIF文からGOTOするには 
    IF --- THEN *ABC
と記述下さい。このTHENがGOTOと同意です。

●044 MPC-816KのFROMが実装されていない?                            000714 
【Q】
新規購入したMPC-816KにFROMがのっていないんですが...

【A】
MPC-816はKF(CEP-080)より表面実装になりました。
それに伴い従来の亀の子FROM基板を止めて、フラッシュROMを直付けしています。
FROM上下のDIP ICが実装されそうなスルーホールは保守用のもので、通常そこには何ものっていません。
実装漏れではありませんので安心してご使用下さい。


●043 デジタル社のタッチパネルとの接続方法は?                      000706 

デジタル社GP70シリーズとの接続は次の2通りです。

@RS-232Cポートと接続してメモリリンクプロトコルで通信する。
    MPC-816のRS-232C CH1を用いるのでコストは低い
    通信レートはMAX9600bps
    通信は全てインタプリタで記述=プログラム負担大
    データチェックの有無はプログラム依存

AMBK-816を使う。
(MBK-816は松下電工MEWNET-FPシリーズに準拠した通信プロトコルを搭載しています。)
    RS-422で38400bpsと高速
    インタプリタでは通信を一切意識しない=プログラム負担小
    データチェック有り
    簡単なI/OコマンドでGPを制御
    →詳細資料 「MBK MEWNET-FPプロトコル仕様 マニュアル」
    GP377,370,270で実績あります。

●042 MPC-816 Rev3.01 のポイントデータは何点?                      000705

Rev3.01はおよそ10年前の最初のP版で、1990年版のマニュアルに解説があります。
2バイトのRev2.54(S版)を3バイトに拡張し、パルス仕様などが変更されました。
ポイントデータは169点、プログラムは1709ステップです。

        ※現在のMPC-816にS版はありません。
●041 MIF-816ADに使用しているAD7890-4の絶対最大定格               000607 

ANALOG DEVICESの1997〜1998データブックによりますと
アナログ入力電圧−AGND  ±17V
となっています。

またMPCでは、電圧が4.095Vを超えてもAD関数値は4095です。
     PR AD(0)
     4095
     PRX AD(0)
     &H0FFF
    (MIF-816AD A13番ピンに5.0V、B13番ピンにGNDを加えて測定)


●040 STOPコマンド減速停止についての質問                            000607 

【Q1】
減速停止の減速率はACCELコマンドで定義されたの減速率を使用しているのか?

【A1】
そうです。

【Q2】
MOVE(MOVZ)コマンドでティーチングポジションへ移動している最中に
STOPコマンドで減速停止を行った場合、ティーチングポイントを超えて
停止する事はないか?

【A2】
ありません。
たとえば0からスタートしてMOVZ 1000を実行中に減速停止を実施した場合、
1000を超えることはありません。
減速停止コマンドは一定速移動のところだけで受け付けるためです。
減速区間にはいると無視されます。


●039 YPLS,ZPLS,RS(),I/Oスキャンを別タスクで使うと遅くなる?         000607 

【症状】
YPLS,ZPLS,RS()とI/Oスキャンを別タスクで実行。
YPLS,ZPLSを最低周波数(10pps)設定にすると全体が遅くなり、20ppsにすると安定。
そんなことってあり?

【考えられる原因】
YPLS,ZPLSが原因では有りません。
MPCのマルチタスクはタイマーで効率的なスワップが行えるようになっており、
タイマーが無いLOOPを実行するタスクがあるとパフォーマンスが低下することがあります。
SW()、IN()、メモリアクセス、演算、変数代入だけをLOOPしているタスクには
TIMEを挿入して下さい。

【TIME有無による実行時間の比較実験】

<<実験に用いたMPCのバージョン>>
 TNYFSC(R) Rev-3.53k[VER-PmaX2044]
 Copyright(C)by ACCEL Corp/BcSoft
 [300p MPC-816K  MPG  MODE5|6]K8b9

<<実験PRG>>
        FORK 1,*YPLS
        FORK 2,*ZPLS
        FORK 3,*IO
*MAIN
        PUT &H15                "※1 FTMWのストップウォッチ START
        FOR I=0 TO 10000
                A=RS(1)         "※6
        NEXT I
        PUT &H16                "※2 FTMWのストップウォッチ STOP
        PR Y3,Z3
        END
*YPLS
        Y1=1
        Y2=10                   "※4 パルスレート
        Y3=0
        YPLS Y1,Y2,Y3
        WAIT Y3>10000
        END
*ZPLS
        Z1=1
        Z2=10                   "※5 パルスレート
        ZPLS Z1,Z2,Z3
        WAIT Z3>10000
        END
*IO
        B=SW(0)                 "※7
        TIME 1                  "※3
        GOTO *IO

<<結果>>
※1〜※2の実行時間の計測を計測しました。

@※3のタイマが有る場合
        1070mSEC 
        (TIME値は1でも5でも同じ)
A※3のタイマが無い場合
        2050mSEC

B※4,5のパルスレート変更(上記TIMEは有り)
    Y2=20,Z2=20の時
            1086mSEC
    Y2=1000,Z2=1000の時
            1512mSEC

<<考察>>
YPLS、ZPLSは10PPSの場合でも特別なことはしていません。
原理的には周波数が高くなるほどCPUの負担が増すのでタスクスワップは遅くなります。
結果はこれを裏付けるものとなりました。

※6「A=RS(1)」と※7「B=SW(0)」は同じ仕様で、この2つのステートメントを入れ替えても結果は殆ど同じです(下記)。
つまりRS(1)だけのループでも効率は悪くなります。
単純な待ちなら WAIT RS(1)<>0 が良いです。

*MAIN
        PUT &H15                "FTMWのストップウォッチ START
        FOR I=0 TO 10000
                B=SW(0) 
        NEXT I
        PUT &H16                "FTMWのストップウォッチ STOP
        (中略)
*IO
        A=RS(1)                 ←2223mSEC。「WAIT RS(1)<>0」 なら 1162mSEC
        GOTO *IO


●038 MPC-816K 電源が入らない                                       000525 

【症状】
MPC−816K単体では動くが、MPG−303を組合わせると電源が入らない。
電源を入れると赤LEDが一瞬つくが、その後は赤緑ともに消灯。

【原因】
DC24V電源が小さすぎた(0.3A)。
MPCの他にも電磁ブレーキに給電していた。

●037 MPC-816K 赤LED点滅間隔と原因                               000512 
MPC-816Kの赤LEDが点滅する原因として、ランタイムエラーと瞬間停電の2つがあります。

@ランタイムエラー(例 GOSUBのネストが深する)
10      GOSUB 100
100     GOTO 10
>RUN
 # 10
!! Stack Overflow       ←FTMからRUNするとエラーを表示します。

ランタイムエラーの場合、FTMからRUNした場合でも自動実行でも赤LEDが点滅します。
点滅間隔 約2Hz (目視でカウント可能)

※RS-232エラー(パリティエラー、フレーミングエラー)ではこの点滅にはなりません。


ADC24V瞬間停電検出
点滅間隔 約7Hz (目視ではカウント困難)

※RS-232エラー(パリティエラー、フレーミングエラー)ではこの点滅にはなりません。
※内部5VとDC電源(J3)の相対電圧を検出しているので、外部からCPU駆動用5Vを給電した場合、
  検出機能を無効にしないと、誤動作する場合があります。


●036 プログラム実行時間                                            000510 

IN()、SW()、変数代入を含むFOR〜NEXT10000回ループの所要時間(@〜B)から、
空ループ10000回(C)の時間を引いてそれぞれの実行時間を算出しました。
実際は、MPCのコマンドの実行効率はタスク数やその内容により変化しますから、
実機で計測してみないと意味はありません。

【実験に用いたMPC】
    MPC−816K
    TNYFSC(R) Rev-3.50j [VER-PmaX2044]
     Copyright(C)by ACCEL CORP/BC-SOFT
     [300p MPC-816K  MPG  MODE5|6]K8b5

【結果】
    @IN()関数
    10      PUT &H15
    20      FOR I=1 TO 10000
    30        A=IN(0)
    40      NEXT I
    50      PUT &H16
    950mSec
    (950-320)/10000=0.063mSec

    ASW()関数  (816KのSW()には5mSecフィルタはありません)
    10      PUT &H15
    20      FOR I=1 TO 10000
    30        A=SW(0)
    40      NEXT I
    50      PUT &H16
    1070mSec
    (1070-320)/10000=0.075mSec

    B変数代入
    10      PUT &H15
    20      FOR I=1 TO 10000
    30      A=50000
    40      NEXT I
    50      PUT &H16
    730mSec
    (730-320)/10000=0.041mSec
    
    C空ループ
    10      PUT &H15
    20      FOR I=1 TO 10000
    40      NEXT I
    50      PUT &H16
    320mSec



●035 デジタルGPで32ビット長データを表示する                        000425

"*****************************************************************************
" GPの画面
"       使用部品        数値表示器
"       ワードアドレス       0020
"       表示形式        32ビット Dec
"       表示桁数        6
"       通信プロトコル      メモリーリンク アスキー互換モード
"
"     (MPC-816のデータ長は3バイト(24ビット)長です)
"*****************************************************************************
        CNFG# 4 0 2
        FOR A0=999999 TO 0      " A0が表示したいデータ
                A1=A0/65536     " 上位バイトを2バイト下にシフト &Hddnnnn -> &Hdd (MPC-816は&H10000と書けない)
                A2=A0^65535     " 下位2バイトだけを残す    &Hddnnnn -> &Hnnnn
                PRX A1,A2
                PUT# &H1B,&H57  " ESC W = Write コマンド

                "アドレス指定
                PUT# &H30,&H30  " 00
                PUT# &H31,&H34  " 14  = 10進で20 つまりGPの20番地を指定

                "GPアドレス 20番地 = 上位 に書き込む
                S0=A1^&HF000    " HEX表現のアスキーコードで1桁ずつGPに出力する (123 == &H7B -> &H37&H42)
                S0=S0/&H1000 
                GOSUB *WRITE1
                S0=A1^&HF00  
                S0=S0/&H100  
                GOSUB *WRITE1
                S0=A1^&HF0   
                S0=S0/&H10   
                GOSUB *WRITE1
                S0=A1^&HF    
                GOSUB *WRITE1

                "GPアドレス 21番地 = 下位 に書き込む
                S0=A2^&HF000
                S0=S0/&H1000 
                GOSUB *WRITE1
                S0=A2^&HF00  
                S0=S0/&H100  
                GOSUB *WRITE1
                S0=A2^&HF0   
                S0=S0/&H10   
                GOSUB *WRITE1
                S0=A2^&HF    
                GOSUB *WRITE1

                PUT# &HD
                TIME 10
        DEC A0

        END
*WRITE1
        IF S0>9 GOSUB *A_F
        ELSE_GOSUB *0_9
        PUT# S0
        GOTO *__RTN
*A_F
        S0=&H37+S0
        GOTO *__RTN
*0_9
        S0=&H30+S0
        GOTO *__RTN
*__RTN
        RETURN



●034 LCD表示サンプル                                            000413 
"*****************************************************
"LCD表示サンプル
"  LCDキットを使用したときの表示方法の基本形と、
"  CG RAMのキャラクタ作成例です。
"  CG RAM、文字コード表はLCDモジュールの添付票をご覧下さい。
"*****************************************************
" 実行時画面例
"   ----------------------------------------- →列
"   |       ◆◆◆  アクセル  ¥¥¥
"   |               Accel      
"   |                   123      
"   |                               
"   -----------------------------------------
" ↓行
"*****************************************************
*__BEGIN
        LOC 0,0                 "BUS接続 4*20LCD
        GOSUB *CHAR_DIA
        GOSUB *CHAR_YEN
        'キャラクタ表示
        LOC 1,5                 "ロケーション 1行目の5列
        PRC &H0,&H0,&H0         "ダイヤを3つ表示
        LOC 1,9
        PRC &HB1,&HB8,&HBE      "アクセ  を表示
        PRC &HD9                "ル    を表示
        LOC 1,14
        PRC &H1 &H1 &H1         "\を3つ表示
        '文字列表示
        LOC 2,9
        'Accel
        PRS 5                   "Accel を表示
        '数値表示
        A0=0
*LOOP
        LOC 3,9
        PRD 5,A0                "数値表示は右付け
        A0=A0+1
        TIME 10
        GOTO *LOOP
"***********************************
"CG RAM &H00にダイヤマークを書き込む
"***********************************
*CHAR_DIA
        OUT &H40 &HF8
        TIME 1
        OUT &H00 &HF9
        OUT &H41 &HF8
        TIME 1
        OUT &H04 &HF9
        OUT &H42 &HF8
        TIME 1
        OUT &H0E &HF9
        OUT &H43 &HF8
        TIME 1
        OUT &H1F &HF9
        OUT &H44 &HF8
        TIME 1
        OUT &H0E &HF9
        OUT &H45 &HF8
        TIME 1
        OUT &H04 &HF9
        OUT &H46 &HF8
        TIME 1
        OUT &H00 &HF9
        OUT &H47 &HF8
        TIME 1
        OUT &H00 &HF9
        GOTO *__RET
"***********************************
"CG RAM &H01に\マークを書き込む
"***********************************
*CHAR_YEN
        OUT &H48 &HF8
        TIME 1
        OUT &H11 &HF9
        OUT &H49 &HF8
        TIME 1
        OUT &H0A &HF9
        OUT &H4A &HF8
        TIME 1
        OUT &H1F &HF9
        OUT &H4B &HF8
        TIME 1
        OUT &H04 &HF9
        OUT &H4C &HF8
        TIME 1
        OUT &H1F &HF9
        OUT &H4D &HF8
        TIME 1
        OUT &H04 &HF9
        OUT &H4E &HF8
        TIME 1
        OUT &H04 &HF9
        OUT &H4F &HF8
        TIME 1
        OUT &H00 &HF9
        GOTO *__RET
*__RET
        RETURN


●033 パルス発生していないのにモーターが動く                        000331 
【 症状 】
MPG-303と作動入力のサーボモータードライバを直接接続して使用。
パルスコマンドを実行していないのにモーターが動き、そのパスル数はMPCではカウントされていない。

【 原因 】
作動ドライバ入力とのミスマッチと思われます。
MPG-303は5Vプルアップ、オープンコレクタ引き込み出力なので、
パルスOFF時は作動ドライバの両方の信号が同レベルで不安定な状態となります。

MPG-303パルスポート
        100Ω          ドライバ作動入力
5V     <-□------------|\
オープンコレクタ /-----------*|/

【 対策 】
フォトカプラでI/Fするか、弊社の「PIF-422」を挿入して下さい。


●032 ティーチングができない                                       000328 

【 Q 】
FTMWにて「T」と入力するとティーチングの表示はでるが、QUIT以外のキーをうけつけない。
MOVEコマンドは実行できるし、通常動作は問題ない。
なぜ?

【 A 】
実はティーチング表示にはAXISコマンドの影響を受ける部分があり、
AXISの値が妙な値に化けているとうまく動作しなくなるという事例があります。
AXIS 1を実行してから試してみてください。
AXISは現在ではほとんど利用されていませんが、過去の互換性のため残っています。


●031 MPG-301からパルスが出ない                                     000307 

MPG-301や現在のMPG-303は内部とパルス出力・入力がアイソレートされており、
その回路の駆動電源はJ3から供給されます。
J3に電源を入れないと動きません。

●030 MPG-303、MIF-816のDC24Vパルス出力はできるか                   000307 

MPG-303のパルス出力に使用しているフォトカプラ(TLP2630)は出力耐圧が約7Vです。
MIF-816のプルアップ電源は内部5Vで分離できません。
よってDC24Vを直接引き込むことはできません。
I/Fボード「PIF−400」をご使用下さい。


●029 816K Z版 PULSE裏機能でセンサー停止しない                      000229 

816Xと816Kは入力ポートのアドレスが違い、'99マニュアルの解説の通りに
PULSEコマンドの裏機能を実行してもセンサー停止しません。
入力ポートのアドレス &H48 を &H3A と変更してください。

◆'99マニュアル 5-61 (誤)
   AXIS 1
   PULSE &H8248 -100 -100

◆正
   AXIS 1
   PULSE &H823A -100 -100

◆'99マニュアル P6-18 訂正

 ------------------------------------------
| SP |   アドレス   |   ボード |    機能   |
 ------------------------------------------
|    |3AH           |          | 入力0-7   |
|    |3CH(下位4ビット)|          | 入力8-11  |
|CPU |38H(上位4ビット)| MPC-816K | 入力12-15 |
|    |38H(下位4ビット)|          | 出力0-3   |
|    |3CH(上位4ビット)|          | 出力4-7   |
 ------------------------------------------


●028 P版によるMIFからのパルス発生                                000218 

P版でもMIFからパルス発生ができます。これによりZ版は無用になった!?
P版によるMIFからのパルスには2通りあります。

@YPLS、ZPLS、WPLS、VPLSによるパルス出力
    変数をレジスタ代わりに使う特殊なパルス発生です。マルチタスクで動作しますが、高速ではありません。
    途中のパルスレート変更ができます。

APG −1でパルスポート変更
    PGコマンドに−1を与えると、MPG−303仕様のパルス発生をMIF−816のJ5から行います。
    MOVE、RMOVなど標準コマンドで加減速付きのパルスが行えます。
    パルス発生中マルチタスクは停止します。

以下はコマンドに関する資料です。

(PLS_MIF,YPLS,ZPLS,WPLS,VPLSコマンド追加(REV-3.50j 980805))

◆書式
PLS_MIF
◆解説
ZPLS,YPLS,WPLS,VPLSの出力先は通常"out 0"ですが、このコマンドによってMIFパルスポートに変更することができます。
この設定はパワーオンリセット、もしくはPLS_MIF -1で解除できます。

******

◆書式
YPLS p,r,c
ZPLS p,r,c
    p:出力ポート (out0かMIF-816のパルスポート)
        CW =1,4,16,64  (1=X,4=Y,16=U,64=Z)
        CCW=2,8,32,128 (2=X,8=Y,32=U,128=Z)
    r:パルスレート  10pps-1500pps程度
    c:パルスカウンター  省略可。いくつパルスを出したかを記録する変数
◆解説
引数はかならず、変数で指定します。
コマンド実行前に第一、第二引数の値を決めておかないと正しく動作しません。
第一引数、第二引数を動作中に変更するとパルス出力を停止、あるいはポート変更できます。
また、第二引数に指定した変数を変更することによって、パルスレートも動的に変更できます。
ZPLSはYPLSと同等のコマンドでYPLS,ZPLSは同時に使用することができます。
停止待ちはクリアしたポート変数が256になるのを待ちます。
パルスはデューティー50%の正方波形です。

 >LIST
10 A=1
20 B=100
25 C0=0
30 YPLS A,B,C0
40 FOR I=1 TO 10 
42 I0=100*I 
45 PRINT I0 
50 WAIT C0=I0 
55 A=0 	        ←停止
60 WAIT A=256   ←停止待ち
65 A=1
70 YPLS A,B,C0
80 NEXT I
90 A=0
>RUN
 100
 200
 300
 400
 500
 600
 700
 800
 900
 1000
> 


 ******

◆書式
WPLS p r c
VPLS p r c
    p:出力ポート (out0かMIF-816のパルスポート)
       CW =1,4,16,64  (1=X,4=Y,16=U,64=Z)
       CCW=2,8,32,128 (2=X,8=Y,32=U,128=Z)
    r: オフパルス幅  2.17μ秒*r (次の変数がオンパルス幅 例えばrがB0ならB1がオンパルス)
    c:パルスカウンター  省略可。いくつパルスを出したかを記録する変数
◆解説
WPLS,VPLSはPWMライクなコマンドです。
周波数設定方法のほかは、YPLSと同様の使用方法になります。
注意としてYPLS,WPLSはタイマー3,ZPLS、VPLSはタイマー2を共有しているため、
それぞれ排他的にしか使用できません。

WPLS A,B0,C0
Aはポート指定です。YPLSと同様です。
B0はオフ時間を規定します。時間の単位は2.17μ秒です。50-65535(0.1m秒-0.14秒)まで指定できます。
オン時間を規定するのは次のアドレスの変数です。この場合B1がオン時間指定変数です。
50以下を指定するとパルスが正常でなくなったり、他のコマンドを受け付けなくなります。
C0はカウンタの指定です。停止方法は停止待ちの方法はYPLSと同様です。

 '************
 'WPLS TEST
 'SAVE WPLS01
 ' 980805
 '************
 PLS_MIF
 FORK 1,*TASK1
 '===========
*LOOP0
 'direction
 A0=1            ←方向 X-CW
 'counter
 C0=0            ←カウンタークリア
 '
 FOR I=1 TO 10
 'off pulse
 B0=I*100        ←オフパルス幅
 'on pulse
 B1=I*100        ←オンパルス幅
 WPLS A0,B0,C0
 I1=I*1000
 WAIT C0=I1
 NEXT I
 A0=0           ←停止
 WAIT A0=256    ←停止待ち
 TIME 100
 GOTO *LOOP0
 '============
*TASK1
 'direction
 A5=4           ←方向 Y-CW
 'off pulse
 B5=200         ←オフパルス幅
 'on pulse
 B6=200         ←オンパルス幅
 'counter
 C5=0           ←カウンタークリア
 VPLS A5,B5,C5
 WAIT C5=1000
 A5=0           ←停止
 WAIT A5=256    ←停止待ち
 TIME 50
 '
 A5=8           ←方向 Y-CCW
 C5=0           ←カウンタークリア
 VPLS A5,B5,C5
 WAIT C5=-1000
 A5=0           ←停止
 WAIT A5=256    ←停止待ち
 TIME 50
 GOTO *TASK1
 
******

◆注意
YPLS、ZPLS、WPLS、VPLSをMPC−816Kの
出力ポートで使用する場合は、ドライバとの接続に注意して下さい。
MPCと共通電源(DC24V)でドライバを駆動する場合、
2K程度の抵抗を入れて駆動電流を10mA程度に調整してください
(一般的なフォトカプラ入力の場合)。
TTL/差動入力の場合はフォトカプラ等でI/Fして下さい。
またDC24V駆動の場合、波形のなまりによる位置ズレが起こる場合があります。
パルスモータ制御はPLS_MIFでMIFパルスポートに割り当てて下さい。

*************************************************************************
*************************************************************************

◆書式
PG n 
  n:MPG-303ボードアドレス 1≦n≦3{REV-3.53g以降}
    -1を指定するとMIF-816のJ5からパルス発生
	***
◆解説
n=1~3はタスク0でMPG-303切り替え。
タスク1~3 はMPG-303#1、タスク4~7 はMPG-303#2、タスク7~11はMPG-303#3 固定。
	***
PG -1のとき
  座標 :3バイト長
  OVRUN:IN24~31に対して入力停止機能を追加 
  STOP :サポート無し 
  MODE :無効 
  SHOM X,Y,s / SHMZ X,Y,s :sはPPS単位で設定1~2000pps
  JOG,PULSEコマンド :使えません
  パルス発生中はマルチタスク停止

◆サンプルprg

"P版のMIFパルス出力
" PG -1はCTRL+Aでリセット
" どのタスクでも発生可能ただしパルス発生中はマルチタスク停止
" 原点センサーポートはSW(16)〜(23)
" STOPコマンド無し 途中停止はOVRUNだけ OVRUNセンサーポートはSW(24)〜(31)
" MODEコマンド無効
" 最高周波数 60Kpps
" 「SHOM x,y,s」 で sはPPS単位で設定します。1〜2000pps
" 「FEED n」 のnは0〜63です。MAX60kでほぼ1kpps単位で指定できます。
" PG -1では JOG,PULSEコマンドは使えません。
"**********************************************
	PG -1			"MIFからパルスを出すモード
	ACCEL 3000		"ACCELは必須、MODEは不要
	FEED 0
	FEDZ 0
	OVRUN &HFF		"SW(24)〜(31)のどれかがONで停止
	'OVRUN &H01		"SW(24)がONで停止。使わないポートは一般入力OK
	'OVRUN &HFFFF		"SW(24)〜(31)のどれかがOFFで停止
	'OVRUN &HFF01		"SW(24)がOFFで停止。使わないポートは一般入力OK
	GOSUB *HOME
*MAIN
	GOSUB *CW
	GOSUB *CCW
	GOTO *MAIN
*CW
	'CW
	PRINT STR(-1)
	TIME 5
	FOR I0=1 TO 5
		RMOV 1000 1000
		RMVZ 1000 1000
		GOSUB *OVRUNCHK
		TIME 10
	NEXT I0
	MOVE 0 0
	MOVZ 0 0
	GOSUB *OVRUNCHK
	GOTO *__RTN
*CCW
	'CCW
	PRINT STR(-1)
	TIME 5
	FOR I0=1 TO 5
		I1=I0*-1000
		SETP I0 I1 I1
		STPZU I0 I1 I1
	NEXT I0
	FOR I0=1 TO 5
		MOVE P(I0)
		MOVZ P(I0)
	NEXT I0
	MOVE 0 0
	MOVZ 0 0
	GOTO *__RTN
*OVRUNCHK				"OVRUNチェック
	IF IN(3)<>0 THEN *OVRUNERR	"OVRUNが&HFFの時
	'IF IN(3)<>255 THEN *OVRUNERR	"OVRUNが&HFFFFの時
	GOTO *__RTN
*OVRUNERR
	'OVER RUN
	PRINT STR(-1)
	END
*HOME				"原点復帰
	SHOM 1 4 400		"XCW YCW スピード
	HOME &H0F 1000 1000	"停止パターン SW(16)~(19)までON、退避移動CW 1000
	'			"使わないポートは一般入力OK
	'HOME COMP
	PRINT STR(-1)
	TIME 5
	SHMZ 1 4 400		"UCW ZCW  スピード
	HOMZ &H0F 1000 1000	"停止パターン SW(17)~(23)までON、退避移動CW 1000
	'			"使わないポートは一般入力OK
	'HOMZ COMP
	PRINT STR(-1)
	TIME 5
	GOTO *__RTN
	'============
*__RTN
	RETURN
*__END


●027 MPC-816XのMIO-248対応                            000217 

MIO-248KはMPC-816Kから対応しています。
MPC-816Xでは使用できません。

●026 命令文がエラーになったり、変ったりする                            000216 

【 Q 】
下記の命令文にてエラーになるものとOKになるもの、
エラーにはならないが、文が変わってしまうものがあります。
     
  X(13)=PLX(N1)+X(1)      エラー
  X(13)=PLX(N1)           OK
  X(13)=PLX(N)+X(1)       OK
  X(13)=PLX(N)+X(1)+Y1 → X(13)=PLX(N)+X(1) に変る

【 A 】
MPC-816は旧い設計で、内部処理単位が16byteなのですが、
  X(13)=PLX(N1)+X(1)   は超えてしまいエラー
  X(13)=PLX(N1)        はOK
  X(13)=PLX(N)+X(1)    では、17byte目が)のため辛くも処理が完結するという次第です。
  X(13)=PLX(N)+X(1)+Y1 MPC-816は二項演算しかできないのです。すみません。

816はすでに8bitCPUの狭い空間がごちゃごちゃになっている始末で、
バージョンアップがかなり困難になっています。
このため致命的なバグ以外はあまり触れないという状況です。
816の16bit化については鋭意努力中でありますので、しばらく、
ご容赦ください。

●025 MPC-816K(F) BUSからのパルス発生                            000203 

MPC-816K(F)のJ5(BUS)コネクタにはMIF-816のパルス出力(J5)と同等のパルス信号が出ています。
これを利用すればMPC-816K(F) 1枚で、2軸パルス発生付き16入力8出力のコントローラーが出来あがりです。
また、LCDキットを併用すると液晶表示(4*20文字または2*16文字)も出来ちゃいます。

【全体仕様】
I/O		入力16、出力8
RS-232C 	2CH (1CHはPRG用)
パルス出力 	2軸
LCD表示		LCDキット使用
電源		DC12〜24V

【パルス発生仕様】 
対応バージョン	P版
PGモード	PG -1
スピード	MAX60Kpps
出力形態	C-MOS相当(シンクmax16mA)
対応コマンド	MOVE,RMOV等の標準コマンド

【パルス接続例】

MPC J5(BUS)       DRIVER
--------          --------
SIG  PIN|        |
        |        |
P5   1  □------□--[220R]┬ ┐
        |        |        ┴ ▽  CW
        |        |        △ ┬
PLS0 33 □------□--------┴ ┘
        |        |
P5   2  □------□--[220R]┬ ┐
        |        |        ┴ ▽  CCW
        |        |        △ ┬
PLS1 34 □------□--------┴ ┘
        |        | 
PLS2 35 □        --------
        |
PLS3 36 □
        |
--------

※TTLレベル論理入力タイプのドライバーとはフォトカプラで
  アイソレートI/F接続してください。
  (ノイズ混入防止のため、MPCの電源とドライバ電源を共通にしない)
※フォトカプラ入力のドライバーとは直接接続可能な機種もありますが、
  ノイズ混入に十分注意して下さい。(アイソレートI/F推奨。)
  (信号線の引き回し経路・長さ・線材 等)
※ドライバーの入力回路を確認の上、正しく接続して下さい。
  (電流、極性 等)
※パルス発生中はマルチタスクは停止します。
※この出力とは別にMPC-816I/Oコネクタ(J4)からパルス発生のできる
  YPLS,ZPLS コマンドもあります。


●024 2相エンコーダカウントについて                            000203 

カウンターボード「MCT-801」は製造を止めました。
それに代るエンコーダーカウンターとして「MPG-301」があります。
MPG-301は1軸パルス発生ボードですが、カウンターも2CH持っています。
下記はMPG-301〜エンコーダーの接続例とサンプルPRGです。
シャント抵抗は電圧に応じて入力電流が10mA程度になるように外付けするか、
RA10・RA11を交換して下さい。

"MPG-301エンコーダーカウント読み込みprg
"                       000128
"  実験回路
"   使用エンコーダー オムロン E6C-CWZ3E
" -----------
"|  MPC-301  |                           -----------
"|  J4コネクタ   |  <-約10mA                | エンコーダー   |
"|   EZ(+)5  |------[1.2KR]---*12V      |           |
"|   EZ(-)6  |------------------------->|Z相        |
"|   EA(+)9  |------[1.2KR]---*12V      |           |
"|   EA(-)10 |------------------------->|A相        |
"|   EB(+)13 |------[1.2KR]---*12V      |           |
"|   EB(-)14 |------------------------->|B相        |
"|           |                          |           |
"|           |                          |           |
"|           |                 12V *----|電源+      |
"|           |            GND(12V) *----|電源-      |
"|  J3コネクタ   |                           -----------
"|        1  |-----> 24V
"|        3  |-----> GND(24V)
" -----------
"********************************************************
"
        ST_REG &H51,&H03        "2相クロック1逓倍
        ST_REG &H52,&H02        "チャンネル1カウントイネーブル
        CMND &H50               "カウンターAクリア
*LOOP
        PRINT REG3(&H21)        "カウンターA読み込み
        TIME 50
        GOTO *LOOP


●023 出力状態を知りたい                                          000203 

出力ポートの状態は下記の関数で取得できます。

<<O_IN>>I/O
・・出力状態の取得
O_IN(n)
  n:ポートバンク   0≦n≦31

<<O_SW>>I/O
・・出力状態の取得
O_SW(n)
  n:出力ポート番号

例)
>ON 0,1
>PR O_IN(0)
 3
>PR O_SW(0)
 1



●022 メモリーI/Oの定義について                                  000203 
メモリーI/OはR/W属性です。
#DEFOと#DEFSの両方に同一定義すると、入出力同一定数名で扱えます。

10      #DEFO MIO1 -1
20      #DEFS MIO1 -1
30      SETIO		"SETIOはメモリーI/Oもリセットします
40      ON MIO1
50      PRINT SW(MIO1)
Programming the FLASH ROM *++++++++
 1
>




●021 #DEFO、#DEFSで定義した定数が使えない?                            000201 

【 Q 】
#DEFO、#DEFSで定義した定数を使おうとすると???。
たとえば #DEFO ABC 0 として ON ABC とするとエラー。
子タスクで定義しているのが原因か?

【 A 】
下記のように子タスクで#DEFO,#DEFSしてみましたが問題ありません。
ダイレクトコマンドでもOKです。他の原因のようです。
(MPCのout0とin0はショートしてあります)

10      FORK 1,*TASK1
20      END
30      *TASK1
40      #DEFO ABC 0
50      #DEFS DEF 0
60      *LOOP
70      ON ABC
80      PRINT SW(DEF)
90      TIME 50
100     OFF ABC
110     PRINT SW(DEF)
120     TIME 50
130     GOTO *LOOP
Programming the FLASH ROM *++++++++
>
 1
 0
 1
 0

(ダイレクトコマンド)
>ON ABC
>PRINT SW(DEF)
 1
>OFF ABC
>PRINT SW(DEF)
 0




●020 I/O、変数、ポイントデータの初期化                            000127 

I/Oの一括リセットはSETIOです。
物理I/O、メモリーI/Oともにリセットされます。
部分的なリセットはON,OUTコマンドで行います。

    OUT &HF 0
    OUT &HF0 -8     "-1〜-8はメモリーI/O
    PRX IN(0)
    &H0F
    PRX IN(-8)
    &HF0
    SETIO           "リセット
    PRX IN(0)
    &H00
    PRX IN(-8)
    &H00

変数の範囲指定初期化はSETVARです。
    >SETVAR A0 B 99         "A0〜Bまでを99にする
    >VLIST                  "変数の一覧表示(P版のみ)
    A0~9,A:  99 99 99 99 99: 99 99 99 99 99: 99
    B0~9,B:  99 99 99 99 99: 99 99 99 99 99: 99
    C0~9,C:  0 0 0 0 0: 0 0 0 0 0: 0
    (中略。VLISTを途中で止めるには"Q"キー押下)
    ok
    >SETVAR A5 A 0          "A5〜Aまでを0にする
    >VLIST
    A0~9,A:  99 99 99 99 99: 0 0 0 0 0: 0
    B0~9,B:  99 99 99 99 99: 99 99 99 99 99: 99
    C0~9,C:  0 0 0 0 0: 0 0 0 0 0: 0

ポイントデータの全クリアはNEWPです。
    >SETP 1 100 100         "ポイントデータセット
    >SETP 2 200 200         "ポイントデータセット
    >PLS                    "ポイントデータ表示(P版のみ)
    P(1): 100 100 0 0
    P(2): 200 200 0 0
    P(3): 0 0 0 0
    (中略。PLSを途中で止めるには"Q"キー押下)
    ok
    >NEWP                   "全ポイントデータクリア
    >PLS
    P(1): 0 0 0 0
    P(2): 0 0 0 0
    P(3): 0 0 0 0

変数、ポイントデータはSRAMにバッテリバックアップされていますから、MPCの電源を切っても消えません。
しかし、ボードの取り扱いや落雷、外部機器のサージなどで破壊される場合があります。
基本的には、変数はプログラムで初期化、ティーチングされたポイントデータはパソコンにバックアップしてください。



●019 コメント・ラベルについて                            000126 

<<ソースPRG>>
"ダブルコーテーションの後ろは読み込まない
        '12345678901234567890
        IF AR(0)=0 THEN *ABCDEFGHIJKL
        IF A0=&HFF THEN *0123456
        IF A=0 THEN *0123456
        IF A0=30000 THEN *XYZxyz
*ABCDEFGHIJKL
*0123456
*XYZxyz

<<LOAD後>>
>LIST 0
20      '123456789012                   ←コメントは12文字まで
30      IF AR(0)=0 THEN *0123456        ←長いラベルは化ける
40      IF A0=&HFF THEN *0123456
50      IF A=0 THEN *0123456
60      IF A0=30000 THEN *XYZxyz        ←大文字、小文字アルファベットはOK、日本語・半角カタカナ不可
70      *ABCDEFGHIJKL
80      *0123456
90      *XYZxyz

※FTMはダブルコーテーション以降は読み込みません。日本語もOKです。
しかし、ブランクの全角スペースの混入には注意して下さい。
例えば 
   A=0<全sp><全sp>"コメント
のように全角スペースがあると不具合が生じます。
専用エディタ(MPCED.EXE)は保存時に全角スペース1文字を半角スペース2文字に変換します。

※飛び先のラベルの文字数は*を含め13文字ですが、1行の文字数に制約があるため、
IF文などの長い文では化けてしまいます。5〜7文字が実用範囲です。

※事実上、ラベルには半角スペース以外の文字ならなんでも使えます(日本語はダメ)。
例えば演算子、コマンドや関数名も使えますが、これらは紛らわしいので避けてください。




●018 カンマで区切られたデータの受信方法              000120 
"RS-232C CH1のINPUT#はデリミタがスペースなので
"カンマで区切られたデータ列は読めません。
"たとえば
"      INPUT# A,B,C
"に 「123 456 789<cr>」と送信すると
"      PRINT A,B,C
"      123 456 789
"と3つの変数にデータが入りますが、
"「123,456,789<cr>」と送信すると
"      PRINT A,B,C
"      123 0 0
"となります。
"下記のように取得します。
	CNFG# 4,0,2
	GETN# D1
	SKIP# &H2C	"&H2C=カンマ まで読み飛ばし
	GETN# D2
	SKIP# &H2C
	GETN# D3
	PRINT D1,D2,D3
"実行結果  123 456 789




●017 文番号無しプログラムをロードしたらラベルしか入らない              000117 
FTMW32 Ver5.22?を使用した一部のパソコンで発生しました。
6.02hで修正し、発症するパソコンで改善を確認しました。




●016 MPC-816を交換しMPCINIT後prgをloadしたが途中停止
MPCINITするとSRAM内のprg、pntデータ、変数、コマンドパラメータが消えます。
開発時や調整時にダイレクトコマンドだけで設定したpntデータ、変数、コマンドパラメータを、
prgで使用しているとMPCINIT後動作しなくなることがあります。
prgで変数の初期化し、コマンドパラメーターは省略せずに記述してください。



●015 MPC-816KのP版/Z版の変更方法
ダイレクトコマンドで V_SWAP<ent>と入力した後、MPCの電源を入れ直して下さい。
P/Zがトグルで替わります。
変更後はMPCINITとERASEで初期化して下さい。

 TNYFSC(R) Rev-3.53k[VER-PmaX2044]
 Copyright(C)by ACCEL Corp/BcSoft
 [300p MPC-816K  MPG  MODE5|6]K8b9
>V_SWAP                               ←この後MPC電源再投入
 TNYFSC(R) Rev-2.60a[VER-Zmx1729]
 Copyright(C)by ACCEL CORP/BC-SOFT
 [255point MPC-816K MODE1~4]K8b9
>MPCINIT
>ERASE
*
>



●014 PG -1でOVER RUNした場合、prgはハングアップし、再起動が必要になりますか?
(この場合の再起動とは、電源の入れ直しか、リセットすること)
MPG-303の場合は PG is OVRUN でプログラムが停止するので、電源再投入やリセットボタンでの再起動となりますが、
PG -1ではパルス発生コマンド実行中にovrun入力があった場合、パルスは停止しプログラムは次のステップへ進みます。
ただし、パルス停止後、それが正常停止かovrun停止なのかはセンサーをみて確認しなければなりません。

RMOV 1000,0 "1000パルス発生、またはovrunセンサ入力でコマンド終了
IF SW(24)=1 THEN *OVRUN "オーバーランセンサー確認



●013 ビットチェックサンプルプログラム
変数のどのBitがたっているか調べます。被検査変数はVです。
1バイト中のどれか1つのビットが1であるという前提で検査します。
結果はI2に入ります。
10 *LOOP
20 INPUT V
30 I1=1
40 I2=0
50 FOR I=1 TO 8
60 IF V<>I1 THEN *PASS
70 I2=I
80 *PASS
90 I1=I1*2
100 NEXT I
110 PRINT I2
120 GOTO *LOOP
>RUN
?0
 0
?1 ←V
 1 ←ビット
?2
 2
?4
 3
?8
 4
?16
 5
?32
 6
?64
 7
?128
 8
?



●012 配列変数を使ったRS-232C文字列解析
このサンプルはHIOKI ミリオームハイテスタ3540の
コマンドリファレンスをもとに作成しましたが、
実機と接続して動作確認は行っておりません。
(テスタの代りにパソコン+ターミナルソフトで実験しました)
注意して作成しましたが、おそらくバグがあると思います。
また、これだけでは実用にはなりませんし、
この方法よりもっと合理的な方法があるかもしれません。
このプログラムに使用したコマンドのほかにも
RS-232C関係には下記のものがあります。
詳細はマニュアルをご覧下さい。
 E(n)
 FIND# n
 GET#(0)
 GETN# A
 INPUT# A1[,A2,A3]
 PUT# A1[,A2,A3]
 PUTS# A1[,A2,A3]
 SKIP# n
 SKPSP#
 TST#(n)

*__BEGIN
 CNFG# 4,0,2
 GOSUB *SET_STR
'********************
*MAIN
 WAIT IN(0)=0
 WAIT IN(0)<>0
 GOSUB *BUF_CLEAR
 I0=IN(0)
 IF I0=1 GOSUB *RESET
 IF I0=2 GOSUB *RMES
 GOTO *MAIN
'********************
*RESET
 'RESET
 PRINT# STR(-1) "ユーザーCHから 文字列 RESET<crlf>を出力
 GOSUB *RS_GET
 GOTO *__RTN
'********************
*RMES
 'RMES
 PRINT# STR(-1) "ユーザーCHから 文字列 RMES<crlf>を出力
 GOSUB *RS_GET
 GOTO *__RTN
'********************
"このサブルーチンでRS-232Cから入力して文字列を解析します。
"RS-232C CH1から1キャラずつ入力してZ()に入れます。
"その配列と*SET_STRで作成した文字列データ配列とを比較して
"受信した文字を調べます。
"このプログラムではZ()を配列として使用しているので
"ポイントデータとして使う場合は変更が必要です
*RS_GET
 R0=1
*RS_GET_0
 Z(R0)=GET#(0) "1文字入力
 IF Z(R0)=&HD THEN *RS_GET_1 "<cr>を入力したら取りこみ終了
 R0=R0+1
 GOTO *RS_GET_0
*RS_GET_1 "応答解析
 R2=0 "OK かどうか
 GOSUB *STR_CMP
 IF R2=0 THEN *OK
 '
 R2=10 "ON かどうか
 GOSUB *STR_CMP
 IF R2=0 THEN *ON
 '
 R2=20 "OFF かどうか
 GOSUB *STR_CMP
 IF R2=0 THEN *OFF
 '
 R2=30 "EXEC_ERR かどうか
 GOSUB *STR_CMP
 IF R2=0 THEN *EXEC_ERR
 '
 GOTO *ELSE "上の文字列のどれでもなければ
*OK
 'OK
 PRINT STR(-1)
 GOTO *__RTN "RETURN OF *RS_GET
*ON
 'ON
 PRINT STR(-1)
 GOTO *__RTN "RETURN OF *RS_GET
*OFF
 'OFF
 PRINT STR(-1)
 GOTO *__RTN "RETURN OF *RS_GET
*EXEC_ERR
 'EXEC_ERR
 PRINT STR(-1)
 GOTO *__RTN "RETURN OF *RS_GET
*ELSE
 'ELSE
 PRINT STR(-1)
 IF Z(1)=&H20 THEN *PLUS "正の数値なら
 IF Z(1)=&H2D THEN *MINUS "負の数値なら
 '
 'UNKNOWN
 PRINT STR(-1) "判らない
 GOTO *__RTN "RETURN OF *RS_GET
*PLUS
 I7=2
 GOSUB *GETNUM
 GOTO *__RTN "RETURN OF *RS_GET
*MINUS
 I7=3
 GOSUB *GETNUM
 GOTO *__RTN "RETURN OF *RS_GET
'****************************
*GETNUM
 I1=100
 I2=0 "小数点「.」の位置が入る
 I6=0 "指数の値が入る
 I8=0
 FOR I0=I7 TO R0
 IF Z(I0)>=&H30 GOSUB *GETNUM_1
 IF Z(I0)=&H2E GOSUB *GETNUM_2
 IF Z(I0)=&H45 GOSUB *GETNUM_3
 NEXT I0
 I5=1
 I4=0
 FOR I0=I1 TO 101
 I3=M(I0)*I5
 I4=I4+I3
 I5=I5*10
 DEC I0
 IF I7=2 THEN *GETNUM_4
 I4=I4*-1 "負のとき
*GETNUM_4
 IF I2=0 THEN *GETNUM_5
 I2=I8-I2 "小数点以下の桁数にする
*GETNUM_5
 "**********************************************
 "ここが結果です。
 "I4に数値、I2に小数の桁数、I6に指数が入ります。
 " 例えば
 " 「<sp>25.6?」 なら 256 1 0
 " 「-<sp>5.1?」 なら -51 1 0
 " 「<sp>15.72E-03」 なら 1572 2 3
 "となります。
 "MPCは3バイト整数しか扱えません。
 "**********************************************
 PRINT I4,I2,I6
 '
 GOTO *__RTN "RETURN OF *GETNUM
 '
*GETNUM_1
 IF I6<>0 THEN *__RTN
 IF Z(I0)>&H39 THEN *__RTN "数字なら入れる
 I8=I8+1
 I1=I1+1
 M(I1)=Z(I0)-&H30
 GOTO *__RTN
*GETNUM_2
 I2=I0-I7 "少数点の位置
 GOTO *__RTN
*GETNUM_3
 I6=I0+3
 I6=Z(I6)-&H30 "指数
 GOTO *__RTN
'*********************
*STR_CMP "文字列比較
 I3=0
 FOR I0=1 TO R0
 I1=R2+I0
 I2=M(I1)-Z(I0)
 I3=I3+I2
 NEXT I0
 R2=I3
 GOTO *__RTN "RETURN OF *STR_CMP
'********************
*SET_STR "文字列作成
 'OK
 M(1)=&H4F
 M(2)=&H4B
 M(3)=&HD
 'ON
 M(11)=&H4F
 M(12)=&H4E
 M(13)=&HD
 'OFF
 M(21)=&H4F
 M(22)=&H46
 M(23)=&H46
 M(24)=&HD
 'EXEC_ERR
 M(31)=&H45
 M(32)=&H58
 M(33)=&H45
 M(34)=&H43
 M(35)=&H5F
 M(36)=&H45
 M(37)=&H52
 M(38)=&H52
 M(39)=&HD
 GOTO *__RTN "RETURN OF *SET_STR
'********************
*BUF_CLEAR "RS-232C バッファをクリアする
 IF RS(1)=0 THEN *__RTN "RETURN OF *BUF_CLEAR
 I1=GET#(0)
 GOTO *BUF_CLEAR
'********************
*__RTN
 RETURN
*__END



●011 PG -1(P版 MIF-816パルス発生)で原点復帰ができない?
【症状】
下記の設定で原点復帰ができない
SHOM 0,8,100 " X軸無し、Y軸CCW、スピード100PPS
HOME 2,0,0 "SW(17)=1まで原点復帰動作。退避移動無し
【原因】
SHOMではY軸の原点復帰設定なのに、HOMEでX軸のセンサパターンを指定。
駆動軸と監視ポートの関係は固定されておりソフト的に変更はできません。



●010 変数の値をBCDで出力するには。
"シーケンサー等とI/Oでデータの授受を行うとき多桁の数値データを
"BCDコードで出力しなくてはならない場合があります。
"MPC-816には変数をBCDに変換するコマンドはありませんが、簡単な演算で実現できます。
"例えば"A=1234"を
"出力バンク1上位 → "1"
"出力バンク1下位 → "2"
"出力バンク0上位 → "3"
"出力バンク0下位 → "4"
"に出力したい。
"
"1桁ずつばらしてBCDに変換します。
"
*__BEGIN
 SETIO
 A=1234
 A4=A/1000
 A0=A4*1000
 A=A-A0
 A3=A/100
 A0=A3*100
 A=A-A0
 A2=A/10
 A0=A2*10
 A1=A-A0
 PRINT A4
 PRINT A3
 PRINT A2
 PRINT A1
 A2=A2*16
 A2=A2|A1
 OUT A2,0 "バンク0に出力
 A4=A4*16
 A4=A4|A3
 OUT A4,1 "バンク1に出力
 TIME 10
 ON 16 "接続機器にデータセットレディー出力
*__END



●009 MOVE -A1,-B1 と書けない
事前に-1を掛けてください。
A1=-1*A1
B1=-1*B1
MOVE A1,B1



●008 YPLS/ZPLSでCCW運転中にCtrl+A停止すると次に回転しない。
【症状】
YPLS,ZPLS動作中にFTMからCtrl+Aで停止すると次のパルス出力が出来ない。
【原因】
YPLS,ZPLS動作中にCtrl+A停止するとパルス出力がONのままになることがある。
【対策】
prgでポート初期化
SETIO "出力ポートからパルス発生する場合
OUT 0 &H40 "MIF-816 J5からパルス発生する場合



●007 Z版の原点センサーポートSW(16)〜(21)を汎用入力として使えるか?
"MODE 2のHOMEは常にSW(20)とSW(21)を監視します。
"これらのポートだけSHOMの設定では使用禁止には出来ません。
"もし入力状態がHOMEパターンと違えばHOMEコマンドが終了しません。
"HOMEパターンにHOME開始時のSW(2O),(21)の状態をORして与えれば
"HOME開始時にすり抜けてしまうので、HOME動作中にSW(20),(21)の
"状態が変化してもHOMEは終了します。
"ただしチャタリングの多い不安定な入力ではうまく行かない場合もあります。
"つまり、SW(20)とSW(21)は汎用入力として使用しないほうが無難です。
"SW(20),(21)以外の入力はSHOM,SHMZで未使用状態になっていれば汎用入力として使用可能です。
"P版(PG -1でMIF出力設定した場合)はSHOM,SHMZで未使用とした軸の入力ポートは、
"HOME時の監視をしませんから汎用入力として使えます。
"****************************************************
" TNYFSC(R) Rev-2.60a[VER-Zmx1729]
" Copyright(C)by ACCEL CORP/BC-SOFT
" [255point MPC-816K MODE1~4]K8b8
"****************************************************
*__INIT
 MODE 2
 ACCEL 2000
 AXIS 1
 D45 0
*MAIN
 SHOM 1,0,200 "X=CW
 A1=IN(2) "SW(20),(21)の状態をOR
 A1=A1^&H0030
 A1=A1|&H0003
 HOME A1,100,100
"
"これより下P版
" PG -1 "MIFからパルスを出すモード
" ACCEL 3000 "ACCELは必須、MODEは不要
" FEED 0
" OVRUN &HFF "SW(24)〜(31)のどれかがONで停止
" SHOM 1 0 200 "X=CW
" A1=&H3
" HOME A1,-100,0
*__END



●006 MIO-240とMIO-248の混載は可能か?
Rev-3.53k(MPC-816K) でMIO-240#1とMIO-248#2でI/O動作確認→OK



●005 FTMからRUNすると正常動作、パワーオンリセットすると途中停止
【症状】
シーケンサーとI/O接続し装置制御。
FTMからRUNをすれば正常に動作するのに、自動運転で途中停止する。
停止後はリセットボタン押下で正常動作する。
電源を入れるタイミングがあるのか?
【原因】
 IN(0)でシーケンサーのデータをパラレル入力し変数に格納→その変数をX()配列に入れて使用している
パワーオンでシーケンサーの起動が遅く、変数は0となる→ 結果 X(0) となり PG comunication error (303は使っていない)
【対策】
prgにタイマーを入れてシーケンサーと同調。



●004 RUNタイムでPG comunication errorになる
【症状】
MPG-303は使っていない。
ACCEL、MOVEなどは使っていないのにPG comunication errorになる
【原因】
PALET ,MTRX コマンド使用。これらのコマンドもMPG-303にアクセスするPGコマンドです。
X(0),Y(0),U(0),Z(0)もPGにアクセスします。



●003 プログラムLOAD中に停止 しまう
【原因】
プログラムのコメントに日本語使用。
【対策】
MPC-816のプログラムには日本語は使用できません。
シングルコーテーションのコメントにも使えません。
prgソースのダブルコーテーションのコメントには使えます。

’にほんご ←ダメ
ON 0 ”にほんご ←OK



●002 アスキーコード表記でRS-232C受信したデータを2バイト10進にキャスト
" FFFF(~46~46~46~46)と来たとき-1として入力
" -2はFFFE(~46~46~46~45)としてRS-232Cから出力
" 【注意】816のHEXの扱いは2バイト長
" >A0=&HFFFF
" >PRX A0
" &HFFFF
" >PR A0
" -1
" >A0=&H10000
" >PRX A0
" &H00
" >PR A0
" 0
"******このプログラムの作成MPC VER*****************
" TNYFSC(R) Rev-3.52 [VER-PmaX2044]
" Copyright(C)by ACCEL CORP/BC-SOFT
" [300p MPC-816K MPG MODE5|6]K8b8
"**********************************************
*__INIT
 CNFG# 4,0,2
*MAIN
 GOSUB *GET
 GOSUB *PUT
 GOTO *MAIN
 '============
*GET "入力
 FOR I0=0 TO 31
 AR(I0)=0
 NEXT I0
 R1=-1
*GET_01
 R0=GET#(0) "入力は可変長
 IF R0=&HD THEN *GET_END "タミネータ=&HDで終り
 IF R0<&H3A GOSUB *GET_09 "0~9なら
 ELSE_GOSUB *GET_AF "A~Fなら
 R1=R1+1
 AR(R1)=R0 "1バイトづつAR()に格納
 GOTO *GET_01
*GET_END
 R2=1
 FOR I0=R1 TO 0
 AR(I0)=AR(I0)*R2 "桁シフト
 R2=R2*&H10
 DEC I0
 R3=0
 FOR I0=0 TO R1
 R3=R3+AR(I0) "合体
 NEXT I0
 R4=R3^&H8000 "トップビットチェック
 IF R4<>0 GOSUB *GET_CONV
 'GET=
 PRINT STR(-1),R3 "入力
 GOTO *__RTN
*GET_09
 R0=R0-&H30
 GOTO *__RTN
*GET_AF
 R0=R0-&H37
 GOTO *__RTN
*GET_CONV
 R3=R3-65536
 GOTO *__RTN
 END
 '============
*PUT "出力
 IF R3<0 GOSUB *PUT_CONV
 R1=&H1000
 R2=&H0FFF
 FOR I0=0 TO 3 "出力は2バイト固定長
 AR(I0)=R3/R1 "桁シフト
 R3=R3^R2
 R1=R1/&H10
 R2=R2/&H10
 NEXT I0
 'PUT=
 PRINT STR(-1)
 FOR I0=0 TO 3
 IF AR(I0)<10 GOSUB *PUT_09
 ELSE_GOSUB *PUT_AF
 PUT# R3 "出力
 PUT R3
 NEXT I0
 PUT# &HD
 PUT &HD
 GOTO *__RTN
*PUT_CONV
 R3=R3-65536
 R3=R3^65535
 GOTO *__RTN
*PUT_09
 R3=AR(I0)+&H30
 GOTO *__RTN
*PUT_AF
 R3=AR(I0)+&H37
 GOTO *__RTN
 '============
*__RTN
 RETURN
*__END

【補足説明 001117】
◆R4=R3^&H8000の意味は?

R3を2バイトとして正負を調べてします。
トップビットが0なら正、1なら負です。
>R3=123
>PRX R3  ←16進表示
 &H7B

>R3=-123
>PRX R3
 &HFF85  ←トップビットが立っています。

◆R3=R3-65536の意味は?

例えば65535(&HFFFF)は2バイト長では-1なのですが、MPCの変数は3
バイト長なので65536(&H10000)を引いて負の数にしています。

>R3=65535 ←Q&Aのサンプルは2バイト長で受信したい。
>PR R3
 65535    ←MPCは3バイト長なので65535は65535
>R3=R3-65536  ←符号付2バイト長に変換
>PR R3
 -1

本当はプログラムには65536を&H10000と書けば判りやすくなるので
すが、2バイト整数だった初期時代の名残でHEX表現では2バイト(&H
FFFF)までしか扱えないからです。
A=&H10000
>PR A
 0     ←異常値

また同様の理由で、変数に10進で65535と入れるのとHEXで&HFFFFと
入れるのでは下記のような違いがありますのでご注意下さい。
>R3=65535
>PRX R3
 &HFFFF    ←65535はHEXでは&HFFFF
>PR R3
 65535     ←再度10進で表しても65535

>R3=&HFFFF ←HEXで入れると、この時2バイト符号付に変換されて
>PRX R3
 &HFFFF
>PR R3     ←10進で見ると-1になってしまう。
 -1


●001 P版でのMIFパルス出力
"P版でも PG -1とするとMIF-816 J5からパルス出力となります。
"基本仕様はP版です。
" PG -1はCTRL+Aでリセット
" どのタスクでも発生可能、ただしパルス発生中はマルチタスク停止
" 原点センサーポートはSW(16)〜(23)
" STOPコマンド無し 途中停止はOVRUNだけ OVRUNセンサーポートはSW(24)〜(31)
" MODEコマンド無効
" 最高周波数 60Kpps
" 「SHOM x,y,s」 で sはPPS単位で設定します。1〜2000pps
" 「FEED n」 のnは0〜63です。MAX60kでほぼ1kpps単位で指定できます。
" PG -1では JOG,PULSEコマンドは使えません。
"******このプログラムの作成MPC VER****************
" TNYFSC(R) Rev-3.53y[VER-PmaX2044]
" Copyright(C)by ACCEL CORP/BC-SOFT
" [300p MPC-816K MPG MODE5|6]K8b8
"**********************************************
*__BEGIN
 '************
 ' My Template
 ' Program
 '------------
 ' MIF_PLS.FSC
 ' 990311
 '************
 '== USE VARI=
 '
 '== MEM I/O==
 '
 '************
*__INIT
 PG -1 "MIFからパルスを出すモード
 ACCEL 3000 "ACCELは必須、MODEは不要
 FEED 0
 FEDZ 0
 'AXIS 1
 OVRUN &HFF "SW(24)〜(31)のどれかがONで停止
 'OVRUN &H01 "SW(24)がONで停止。使わないポートは一般入力OK
 'OVRUN &HFFFF "SW(24)〜(31)のどれかがOFFで停止
 'OVRUN &HFF01 "SW(24)がOFFで停止。使わないポートは一般入力OK
 GOSUB *HOME
*MAIN
 GOSUB *CW
 GOSUB *CCW
 GOTO *MAIN
*CW
 'CW
 PRINT STR(-1)
 TIME 5
 FOR I0=1 TO 5
 RMOV 1000 1000
 RMVZ 1000 1000
 GOSUB *OVRUNCHK
 TIME 10
 NEXT I0
 MOVE 0 0
 MOVZ 0 0
 GOSUB *OVRUNCHK
 GOTO *__RTN
*CCW
 'CCW
 PRINT STR(-1)
 TIME 5
 FOR I0=1 TO 5
 I1=I0*-1000
 SETP I0 I1 I1
 STPZU I0 I1 I1
 NEXT I0
 FOR I0=1 TO 5
 MOVE P(I0)
 MOVZ P(I0)
 NEXT I0
 MOVE 0 0
 MOVZ 0 0
 GOTO *__RTN
*OVRUNCHK "OVRUNチェック
 IF IN(3)<>0 THEN *OVRUNERR "OVRUNが&HFFの時
 'IF IN(3)<>255 THEN *OVRUNERR "OVRUNが&HFFFFの時
 GOTO *__RTN
*OVRUNERR
 'OVER RUN
 PRINT STR(-1)
 END
*HOME "原点復帰
 SHOM 1 4 400 "XCW YCW スピード
 HOME &H0F 1000 1000 "停止パターン SW(16)~(19)までON、退避移動CW 1000
 ' "使わないポートは一般入力OK
 'HOME COMP
 PRINT STR(-1)
 TIME 5
 SHMZ 1 4 400 "UCW ZCW スピード
 HOMZ &H0F 1000 1000 "停止パターン SW(17)~(23)までON、退避移動CW 1000
 ' "使わないポートは一般入力OK
 'HOMZ COMP
 PRINT STR(-1)
 TIME 5
 GOTO *__RTN
 '============
*__RTN
 RETURN
*__END



---END---