MPC-68 Q&A


関連記事= 1999年以前のFAQ

目次

最新情報は MPC-68 BBS

136 MPC-684 文字列の中からの数値の取り出し
135 MPC-684 ローカル変数の数
134 MPC-684 I/Oエラーに関する表示
133 MPC-68x 変数をBCDでパラレル出力するには
132 MPG-314 複数の軸の停止確認
131 MPG-314 でパレタイズ
130 MPC-684 ランタイムエラーの確認方法
129 MPG-314 フォトカプラ アノードコモンタイプのドライバとの接続
128 MPG-314 補間コマンドはいずれかの軸のリミットが入っていると動かない
127 MPG-314 ソフトリミット設定/解除について
126 MPC-684 「WAIT 条件式 TMOUT 時間」はWS0()、WS1()に影響しないか?
125 MPC-684 で時計をつかいたい。SYSCLKの最大カウントは?
124 MPG-314 出力状態を読む方法は?
123 MPC-684 IF文のマルチステートメント
122 MPG-314 エンコーダ入力のフォトカプラの応答性
121 MPC-684 括弧が不整合です
120 MPC-684 IF -- THEN ELSE -- END_IF
119 MPG-314 リミットセンサーについて
118 MPC-684 ローカル変数の制限
117 MPG-3202 直線補間はできるか
116 MPG-314 パルス発生が終わらない
115 MPC-684 サブルーチンの引き数に式を与えるとPGアドレスが変る
114 MPC-684 システムの省コスト、省スペース
113 MPG-314 で STOP X_A IN3_OFF とした場合は減速停止?即停止?
112 MPG-314 1枚のMPGで同時に2組の円弧補間ができるか
111 MPG-314 MOVTによる連続移動のサンプル
110 MBK-816,MBK-SH,MBK-RS デジタル社タッチパネルのページが換わらない
109 MPC-684 バッテリ交換時の注意点、寿命について
108 MPC-684 RS-232Cで受信したHEX表現文字列を数値に変換する方法
107 MPG-405、MPG-68K パルスセンサー停止
106 MBK-RSの結線
105 MPG-314 MOVT(円弧補間)コマンドについての補足
104 MPC-684 TASK(n)関数で返される値
103 MPC-684 RS-232C受信で a$=INP$#0(1) とするとハングする?
102 MPC-684でMPG-405のACCEL設定を確認するときの注意
101 MPG-314のタスク割り付けについて
100 MBK-RSとMBK-68/SHの違い
099 MPG-314 原点センサ入力の読み方
098 MPC-684 FTMW32E(英語版FTMW)でプログラムが読み込めない
097 MPC-684 DC24V消費電流実測値
096 MPC-684 文字列配列AR$()のファイル化
095 MPG-314 差動入力非対応のモータドライバの接続方法
094 MPC-684 RUNしたとき裏タスクはどうなる
093 MPC-LNK2 DSWの設定
092 MBK-SH タッチパネルを2台付けたい
091 MPG-314 HOMEコマンド後のACCELパラメータの確認はできるか
090 MBK-SH MBK-68から置き換えるときのソフト的な変更点
089 MPC-684 セマフォ関数RSVを論理結合できるか
088 MPG-314 2相エンコーダのカウントが正常にできない
087 MPC-68K,684 入力したプログラムの後ろが消える
086 MPC-68K,684 プログラムのマルチステートメントのコロンが無いとどうなる
085 MPC-68K,684 RS-232Cのバッファのサイズはどのくらいですか?
084 MPG-314 XYサーボモータ、UステップモータのACCEL設定・移動
083 MPG-314 INPOSが有効にならない
082 MPG-314 軸指定予約定数について
081 MPG-314 WARPの途中停止
080 MBK-68 対応タッチパネルについて
079 MPC-684 浮動小数点について
078 MPC-68 SELECT_CASE文で複数の条件を同一処理するには
077 MPC-68シリーズ UL認定について
076 MPG-314 原点復帰で残パルスクリアの例
075 MPG-314 変数の文字数
074 MPG-314 インポジション信号幅はどのくらい?
073 MPG-314 パルス発生後の完了確認は必要か
072 MPG-314 入力モニタの表示
071 MPG-314 原点復帰後 自動的にサーボドライバの溜りパルスをクリアできるか
070 MPC-684 改版データの取得
069 MPC-684 プログラム保存後にLISTコマンドを実行したら全行表示してしまう
068 MPG-314 カウンタ入力X(-1)〜Z(-1)は何バイト

067 MPG-314 ACCELコマンドのlong,min値を同じ値にしたらエラー
066 HOUT 2(X_A;NOP,1)とSTOP X_A IN0_OFFの違い

065 MPG-314のINPOSを有効にしたらプログラムはその行で停止するのか
064 MPG-405に電源を入れたらFL1から煙が出た
063 MPC-684にMBK-68またはMPS-324からDC5V給電する場合
062 初期MPC-684 INPUT文で多量のキャラクタを受信するとポイントデータが壊れる
061 MPC-68K/684 点データが変更できない
060 MBK-68 7セグメントの表示内容
059 MOP-096とMIP-096のコネクタの違い
058 デジタルGP-2400イーサネットの実験
057 新旧MPCとMOP-048の適合について
056 MPC-684 P_SVコマンドで保存される点データ数
055 MPC-684のSV_Mをロングワードで使用したとき、飛ばされた点配列の内容は?
054 MPC-684の今後
053 MPCの初期化ってなに?
052 プログラムを作成するとき文番号は付けなければならないのか?
051 MPC-684の変数は電源を切ったらどうなる?
050 MPG-314 各軸-OUT4、OUT5の出力方法
049 外部機器の入力とMOP出力の接続
048 潟fジタル GP2400 CFカード〜MPC-684点配列間のデータ転送
047 MPG−314 ALM入力について
046 MPG−314 RRのビット位置
045 MPG−314で互換コマンドのSTOPは使えるか
044 MPG−314のリミット検出
043 MPG−314の原点復帰例
042 MPC−684 挙動不審
041 MPG−314パルス出力実測 2つ
040 大きなプログラムをLOADしたらFTMWがフリーズ
039 四捨五入
038 「余分な引き数、或はパルス発生条件文に異常があります」エラー
037 RAMモード時にFIX(FROMへの書き込み)ができない
036 RSE()にMRS−402のチャンネルを指定すると戻り値は255
035 プログラムLOAD時のエラー行検索
034 MBK−68でシステムローダーが動作しない
033 S−LINKのバンクナンバーはどうなってるの?
032 [MPC-684]GOSUB、IF〜END_IFなどの入れ子の数とCASEの数
031 MPGにもSRAMバックアップのバッテリがあるが..
030 PC−LNKの起動不具合
029 変数<->BCD 変換
028 MPG-3202とオリエンタルモータ CFK,PMCシリーズのパルス信号の接続
027 MPG-68KからMPG-405に交換したらPULSEコマンドが異常?
026 684でDC5Vを外部から供給する場合
025 WAIT A=1 などとするとタスク効率が悪くなる
024 MPC-684 コプロを必要とするコマンド
023 ACCELコマンド実行時間について
022 MPG-405の拡張ACCELコマンド
021 文字列変数の文字数
020 MPC−68Kシリーズ 消費電流
019 MBK−68 T1のピン配
018 HOMEコマンドを実行するとタスクスワップが遅くなる?
017 RUN後に"間"が空く
016 MPC-68K プログラム・ポイント・配列変数のサイズ
015 MBKでGPの2ワード(32ビット)データを読み込む方法
014 MPG-68K アドレス設定
013 MPG-3202 ティーチングサンプルプログラム
012 システムローダーが動かない
011 LOAD時間比較
010 クロックスピード変更コマンド
009 プログラムポートのボーレート変更
008 MPC-68K〜デジタル社GP 通信サンプル
007 電源を切ると変数が化ける?
006 MOP-048 prgで操作していないのに勝手に出力
005 文字列処理でprg停止
004 ポイントデータ破壊
003 MPC-68K RUNすると Illegal instructionエラー
002 ACCELコマンドでハングアップ
001 SELECT_CASE文でCASE_ELSEを省略しないで下さい


●136 MPC-684 文字列の中からの数値の取り出し                                     030820

◆例1 GET_VALで配列に取り込む

固定フォーマットのデータならGET_VALコマンドを使で簡単に文字列から数値を取り出せます。

10        DIM ABC(10)
20          T1$="T1T1,+0320.000,+0240.000,+2330.000,-0020.000,"
30          T2$="+0000033.000"
40          A$=T1$+T2$
50        PRINT A$
60        GET_VAL A$ ABC(1)
70        FOR I=0 TO 9
80          PRINT I ABC(I)
90        NEXT I
#RUN
T1T1,+0320.000,+0240.000,+2330.000,-0020.000,+0000033.000
0 0
1 1
2 1
3 320000
4 240000
5 2330000
6 -20000
7 33000
8 0
9 0

※このデータは57文字で、文字列変数に一度に格納できないので分けて取り込んでいます(20,30,40行目)

◆例2 STRCPYで切り出す

固定長データならSTRCPYコマンドを使って切り出すことも可能です。
下記は少数点以下を無視した場合のサンプルです。
(実際、この文字列なら上記のGET_VALの方が簡単です)

#PR A$
T1T1,+0320.000,+0240.000,+2330.000,-0020.000,+0000033.000   /* A$の中身
#STRCPY A$ X1$  5 5    /* A$の5文字目から5文字をX1$にコピー
#PR X1$                /* 確認
+0320
#X1=VAL(X1$)           /* 数値に変換
#PR X1
320
#STRCPY A$ Y2$ 35 5    /* A$の35文字目から5文字をY2$にコピー
#PR Y2$                /* 確認
-0020
#Y2=VAL(Y2$)           /* 数値に変換
#PR Y2
-20

●135 MPC-684 ローカル変数の数                                                  030807

【Q】
ローカル変数の数は?
制限数を超えるとどうなるか?

【A】
ローカル変数は26個です。それを超えるとエラーになります。
下記はプログラム読み込み(LOAD)時の例です。

FORK 1 *TASK1
GOSUB *SUB1
END
*TASK1
GOSUB *SUB1
END
'----------
*SUB1
VARI01!=1
VARI02!=2
VARI03!=3
VARI04!=4
VARI05!=5
VARI06!=6
VARI07!=7
VARI08!=8
VARI09!=9
VARI10!=10
VARI11!=11
VARI12!=12
VARI13!=13
VARI14!=14
VARI15!=15
VARI16!=16
VARI17!=17
VARI18!=18
VARI19!=19
VARI20!=20
VARI21!=21
VARI22!=22
VARI23!=23
VARI24!=24
VARI25!=25
VARI26!=26
VARI27!=27
RETURN

↑このプログラムをFTMWで読み込む

(Line:35) 34 VARI27!=27
・・・・・ローカル変数が多すぎます

see also #118 
●134 MPC-684 I/Oエラーに関する表示                                             030729

サポート外のI/Oにアクセスしたり、存在しないMPC-SLINKに出力しようとすると
エラーメッセージが出てプログラムが停止します。下記はその例です。
これはコマンド・関数のパラメータに変数を使ったときに起こり易いエラーです。
エラー停止時に表示される文番号でエラー内容・変数の値を確認できます。
(強調文字がエラーメッセージです)

@メインタスクでエラーになった場合

・OUTコマンド
10      '
20        FOR I=0 TO 2000
30          OUT 0 I
40        NEXT I
#RUN
#30     !! Out of IO AREA   ← 文番号30で停止したことを表します
#PR I                          ← 変数の値を確認
98
#

・IN関数
10      '
20        FOR I=0 TO 2100
30          PRINT IN(I)
40        NEXT I
#RUN
0
(略)
0
#30     ・・・・・異常な演算です  ← 文番号30で停止したことを表します
#PR I                          ← 変数の値を確認
97
#

A子タスクでエラーになった場合

・OUTコマンド
10   FORK 1 *TASK1
20   END
30 *TASK1
40   FOR I=0 TO 2000
50     OUT 0 I
60   NEXT I
#RUN
        タスク停止 *1 [50]!! Out of IO AREA  ←タスク1が文番号50で停止
#PR I
98

・ONコマンド
10   FORK 1 *TASK1
20   END
30 *TASK1
40   FOR I=0 TO 2100
50     ON I
60   NEXT I
#RUN
#       タスク停止 *1 [50]・・・・・サポートI/Oの範囲を超えました
PR I
776
#

・IN関数
10   FORK 1 *TASK1
20   END
30 *TASK1
40   FOR I=0 TO 2100
50     PRINT IN(I)
60   NEXT I
#RUN
#0
0
(中略)
0
        タスク停止 *1 [50]・・・・・異常な演算です
PR I
97

・SW関数
10   FORK 1 *TASK1
20   END
30 *TASK1
40   FOR I=0 TO 2100
50     PRINT SW(I)
60   NEXT I
#RUN
#0
0
(中略)
0
        タスク停止 *1 [50]・・・・・異常な演算です
        *0   [20]
        *1  停止 
#PR I
776


BMPC-SLINKのエリアをアクセスした場合

・MPC-SLINKのI/Oエリアは2000からです。
 MPC-SLINKを実装せずに(または異なるアドレス設定をして)このエリアに出力した場合。
10   FORK 1 *TASK1
20   END
30 *TASK1
40   FOR I=2000 TO 2100
50     OUT 0 I       ← OUTではエラーになりますが、ONではエラーになりません。
60   NEXT I
#RUN
        タスク停止 *1 [50]SLINKに正常に書き込めません。(存在しないか、入力ポートへの書込)
#PRINT I
2000

・IN、SW関数ではエラーにはなりません
10   FORK 1 *TASK1
20   END
30 *TASK1
40   FOR I=2000 TO 2100
50     PRINT IN(I)          ←IN関数
60   NEXT I
#RUN
#255
255
255
(略)

10   FORK 1 *TASK1
20   END
30 *TASK1
40   FOR I=2000 TO 2100
50     PRINT SW(I)          ←SW関数
60   NEXT I
#RUN
#1
1
1
(略)

C更に上のエリア
・10000からはMPC-LNKのエリアですが、ここより上はボードが有っても無くても
 エラーにはなりません。
10   FORK 1 *TASK1
20   END
30 *TASK1
40   FOR I=10000 TO 11000
50     OUT 0 I
60   NEXT I
70   PRINT "completed"
RUN
#completed


※このように、コマンド・関数・エリアによってメッセージやエラーとしての扱いが異なります。

●133 MPC-68x 変数をBCDでパラレル出力するには                                   030728

【A】
例えば 4321 という10進数を 出力のバンク1(上位2桁)とバンク0(下位2桁)へ
パラレルで出したい。

【Q】
@10進数で表される各桁を取り出します。
AOUTコマンドで出力します。その際、上位ニブルは16倍して4ビットシフトします。

10   sorce=4321                      /* 出力したい数値
20   fig1=sorce%10                   /* 1の桁取り出し
30   fig10=(sorce%100)/10            /* 10の桁取り出し
40   fig100=(sorce%1000)/100         /* 100の桁取り出し
50   fig1000=sorce/1000              /* 1000の桁取り出し
70 PRINT fig1000 fig100 fig10 fig1   /* 確認表示
80 OUT fig1000*16+fig100 1           /* 1000と100桁をバンク1へ出力
90 OUT fig10*16+fig1 0               /* 100と1桁をバンク0へ出力
RUN
4 3 2 1                              /* 各変数に各桁の数値が入っています

上のプログラムを実行すると、出力の状態は次のようになります。

出力ポート
        bit   状態
      - 00  = on   -
     |  01  = off   | &B0001=1
     |  02  = off   |
bank |  03  = off  -
 0   |  04  = off  -
     |  05  = on    | &B0010=2
     |  06  = off   |
      - 07  = off  -

      - 08  = on   -
     |  09  = on    | &B0011=3
     |  10  = off   |
bank |  11  = off  -
 1   |  12  = off  -
     |  13  = off   | &B0100=4
     |  14  = on    |
      - 15  = off  -
●132 MPG-314 複数の軸の停止確認                                                030520

複数の軸の全停止を確認するには、RR()関数に軸指定定数をビット演算の論理和("|"記号)
で与えます。下記@
X_A、U_Aなどは予約定数で、それを論理和して与えることでRR()はそれらの軸を同時に
検査します。
A、Bでは正常に動作しません。

10 PG &H400
20 ACCEL X_A 5000
30 ACCEL U_A 1000
40 FEED ALL_A 0
50 STPS 0 0 0 0
60 RMVS X_A 5000         /* ┓X,U同時にスタートするが停止はズレる。
70 RMVS U_A 10000        /* ┛
80 WAIT RR(X_A|U_A)==0   /* @ 検査する軸を 論理和 で与える。X,U両方の停止待ち
90 PRINT P(0)            /* 座標表示
#RUN
5000 0 10000 0
-------
80 WAIT RR(X_A&U_A)==0          /* A
80 WAIT RR(X_A AND U_A)==0      /* B
●131 MPG-314 でパレタイズ                                                      030515

【Q】
MPG-314で、XY直行ロボットと単軸2本のシステムの場合
・パレットの定義は、4軸のポイント全ての成分が必要か。
・X軸U軸、Y軸Z軸の組み合わせでのパレットは可能か。
・XY直行でパレットを使用した場合。他の単軸2本は問題無く動作させることはできるか?

【A】
PALETは3つの点データと縦横の分割数から全部の升目のXYUZのデータを演算しますが、
MOVLなどの移動コマンドに対しては、その中で必要な成分だけを与えることができます。
下記はP(1)〜P(3)がパレットの座標データ、P(4)をX,Yだけを取り出すための一時的なデ
ータとして使っています。

10 PG &H400
20 SETP 1 100 100 0 0         /* P(1)データ作成。ティーチングでもok
30 SETP 2 500 100 0 0         /* P(2)データ作成。ティーチングでもok
40 SETP 3 100 500 0 0         /* P(3)データ作成。ティーチングでもok
50 PALET1 P(1) P(2) P(3) 5 5  /* PALET宣言。25個の升目の座標を演算してPL1(1)〜PL1(25)に入れます
60 FOR N=1 TO 25              /* ↓パレット上の各升目に移動します
70   SETP 4 PL1(N)            /*   各升目の座標をP(4)にコピー
80   MOVL X(4) Y(4) VOID VOID /*   P(4)のX、Y成分だけを使用。UZは他で使用可能。
90   WAIT RR(X_A|Y_A)==0      /*   パルス発生終了待ち
100 PRINT N P(0)              /*   現在点表示
110 NEXT N
#run
1 100 100 0 0
2 200 100 0 0
3 300 100 0 0
4 400 100 0 0
5 500 100 0 0
6 100 200 0 0
7 200 200 0 0
8 300 200 0 0
9 400 200 0 0
10 500 200 0 0
11 100 300 0 0
12 200 300 0 0
13 300 300 0 0
14 400 300 0 0
15 500 300 0 0
16 100 400 0 0
17 200 400 0 0
18 300 400 0 0
19 400 400 0 0
20 500 400 0 0
21 100 500 0 0
22 200 500 0 0
23 300 500 0 0
24 400 500 0 0
25 500 500 0 0


上記のサンプルでY軸とU軸を入れ替えてみました。

10        PG &H400
20        SETP 1 100 0 100 0        /* XとU軸で点データを作成
30        SETP 2 500 0 100 0
40        SETP 3 100 0 500 0
50        PALET1 P(1) P(2) P(3) 5 5
60        FOR N=1 TO 25
70          SETP 4 PL1(N)
80          MOVL X(4) VOID U(4) VOID    /* XとU軸移動
90          WAIT RR(X_A|U_A)==0
100         PRINT N P(0)
110       NEXT N
#run
1 100 0 100 0
2 200 0 100 0
3 300 0 100 0
4 400 0 100 0
5 500 0 100 0
6 100 0 200 0
7 200 0 200 0
8 300 0 200 0
9 400 0 200 0
10 500 0 200 0
11 100 0 300 0
12 200 0 300 0
13 300 0 300 0
14 400 0 300 0
15 500 0 300 0
16 100 0 400 0
17 200 0 400 0
18 300 0 400 0
19 400 0 400 0
20 500 0 400 0
21 100 0 500 0
22 200 0 500 0
23 300 0 500 0
24 400 0 500 0
25 500 0 500 0

●130 MPC-684 ランタイムエラーの確認方法                                        030424

【Q】
自動実行中にMPC-684の赤LEDが点滅した。これは何?

【A】
赤LED点滅はRUNタイムエラーです。
エラー内容の確認方法は

@一番手っ取り早いのは FTMW を接続し実行てみることです。
  何かエラーメッセージが出ると思います。

A自動運転中の装置に対しては、FTMWを接続して停止後、Ctrl+Mで各タスクの停止行を
  確認して、プログラムを追いかける..です。

BLOGコマンドでログを確認する
  次のプログラムを自動実行すると 40 でエラーになり 赤LEDが点滅します。
  その状態で FTMW を接続してプログラム停止後 ダイレクトコマンドで LOG を実行します。
  自動実行中にプログラムポートから出力されたメッセージを確認できます。

10        FORK 1 *TASK1
20        DO  : LOOP
30      *TASK1
40        ON 99999
50        END


#LOG              ←  PRG停止後 LOG[Enter]


RUN<AUTO>
タスク停止 *1 [40]・・・・・サポートI/Oの範囲を超えました  ←自動実行中のエラー
MPC-684f ADVFSC(r) REV-3.84m
 BASIC like + multi tasking
 Created by ACCEL Crp.~2003

※タスク0で発生したエラーはlogできません。
  また、タスク0がend終了していてもlogできません。

●129 MPG-314 フォトカプラ アノードコモンタイプのドライバとの接続               030418

【Q】
パルスI/Fがフォトカプラ入力でアノード側がコモンになっているドライバーを接続する
には?

【A】
MPG-314のSP3をショートするとパルスI/Fの内部DC5VがJ5(電源コネクタ)2番ピンに出力されます。
これをアノード側に接続し、カソード側はJ3(パルス出力)の(-)側に接続します。
これにより負論理で引き込みます。

●128 MPG-314 補間コマンドはいずれかの軸のリミットが入っていると動かない        030414

「補間ドライブにおいても、ドライブする各軸のハードリミット、ソフトリミットは作動します。
補間ドライブ中、いずれの軸のリミットがアクティブになっても、補間ドライブは停止します」
(MCX314 取扱説明書 より)

例えば、MOVLのXY直線補間動作で、X軸の移動方向のリミットが入っているとX軸Y軸両方
動きません。MOVSではX軸は動きませんがY軸は動きます。
●127 MPG-314 ソフトリミット設定/解除について                                  030414

【A】
ソフトリミットを有効にする SLMT_ON はあるのに SLMT_OFF は無いのか?
解除はどうする?

【Q】
SLMT_OFF は有りません。
入力設定時に
    INSET_314 ALL_A SLMT_ON|LMT_ON|MD_2PLS
とすればソフトリミットは有効
    INSET_314 ALL_A LMT_ON|MD_2PLS
のように設定しなければ(または、設定し直せば)無効になります。
●126 MPC-684 「WAIT 条件式 TMOUT 時間」はWS0()、WS1()に影響しないか?           030312

【Q】
REV-3.84j で
    WAIT 条件式 TMOUT 時間  
というように、WAIT文にタイムアウト機能が付加されたが、従来のタイムアウト付き関数
WS0()、WS1()のTMOUTの値には影響はないか?

    TMOUT 10
    WAIT A==10 TMOUT 100:GOTO *ERR
    IF WS0(0)==1THEN
        GOTO *ERR
    END_IF
    END
    *ERR
    END

のような場合、先頭のTMOUTの設定が10 -> 100に変わってしまうなんてないですよね。

【A】

変りません

実験prg
10          A=0
20        TMOUT 2
30          SYSCLK=0
40        WAIT A==10 TMOUT 500 : GOTO *NEXT
50      *NEXT
60        PRINT "1 " SYSCLK
70          SYSCLK=0
80        IF WS1(0)==1 THEN
90          GOTO *TMOUT
100       END_IF
110       END
120     *TMOUT
130       PRINT "2 " SYSCLK
#run
1 100   /* 100*5mSec=500mSec
2 400

上記の40のTMOUT設定値を変える
40        WAIT A==10 TMOUT 100 : GOTO *NEXT
#run
1 20    /* 20*5mSec=100mSec
2 400   /*WS1()のタイムアウト時間=変化無し
●125 MPC-684 で時計をつかいたい。SYSCLKの最大カウントは?                      030129

【Q】
MPC-68Kから684に変更するのですが、68KではカレンダICを搭載して使用していました。
684にはカレンダ機能は搭載していないのでしょうか。

【A】
MPC-684はカレンダICを搭載していません。
現状で時計を使うにはデジタル社タッチパネルGPを接続するのが最も簡単な方法です。
684ではtime$、date$でGPの時計・カレンダを取得できます。

【Q】
SYSCLKはいくつまでカウントできるのでしょうか。

【A】
MPC-68K/684は4バイト長ですからSYSCLKのカウントも最大&H7FFFFFFF(2147483647)です。
1カウントは5msecですから約124日分です。
●124 MPG-314 出力状態を読む方法は?                                             021224

MPG-314の出力(axis-SON、OPn等)の状態を読み込むことはできません。
これはPG-IC MCX314の仕様的な問題でライトレジスタ(WRn)を読むことができないためです。
どうしても自分が出力した状態を知りたいのであれば、プログラムで記憶(管理)させてく
ださい。
●123 MPC-684 IF文のマルチステートメント                                        021004 

【Q】
次のIFで repeat%2 が0(余りが0)のときは PRINT 0 が実行されるが、それ以外のときに 
PRINT 1 が実行されない。

  IF repeat%2=0 THEN : PRINT 0
    ELSE PRINT 1 : END_IF

【A】
原因はELSEの後に':'がないことです。下記の様に記述してください。

  IF repeat%2=0 THEN : PRINT 0
    ELSE : PRINT 1 : END_IF  /* ELSEの後ろにコロン追加

または

  IF repeat%2=0 THEN         /* マルチステートメントをやめる
    PRINT 0
  ELSE 
    PRINT 1
  END_IF

●122 MPG-314 エンコーダ入力のフォトカプラの応答性                              020917 

【Q】
MPG-314のエンコーダ入力で質問です。
取り説の回路図を見るとエンコーダ入力はフォトカプラになっていますが、読みとり可能
な周波数はどのくらいでしょうか?出力と同様に4Mpps程度可能でしょうか?

【A】
TLP2630というフォトカプラを使用してますが、メーカデータシートで10Mbdということに
なっています。周辺が最良の状態ででの性能です。4Mbdは配線に注意すればフォトカプラ
は通ると想定されます。
またMCX314カウント入力性能は、4てい倍相当で、tCYC*2+20nsです。
tCYC=1/16Mhzなので、145n---->約7Mhzです。
つまり一てい倍パルスとしては1.75Mhzということになります。
●121 MPC-684 括弧が不整合です                                                  020729 

【Q】
10 WAIT (IN(-1~Lng) & &H78563412)==0
・・・・・括弧が不整合です
これはどういう意味ですか???

【A】
これは式中にスペースが有るのでエラーです。
MPCのエラーメッセージには、もともといい加減なところ(というか
エラー内容を厳密に判定できない)があり、'括弧が不整合です'と
いうのも変なメッセージですが、こんなものだと思ってください。

上の式からスペースを取れば文法的にはokです。
10        WAIT (IN(-1~Lng)&&H78563412)==0

●120 MPC-684 IF -- THEN ELSE -- END_IF                                         020729 

【Q】
下記(a)のプログラムは正常動作しますが、(b)のように変更したところ、
「対応する終端が有りません。」と表示され、SW1以外何を押してもSW2になってしまいま
す。(c)のようにしてみても同じです。どうしたら良いのでしょう?

(a)
  DO
    swbuf!=P_IN(0)
  LOOP WHILE swbuf!==0
  SELECT_CASE swbuf!
    CASE &H01 : PRINT "SW1 On"
    CASE &H02 : PRINT "SW2 On"
    CASE &H04 : PRINT "SW3 On"
    CASE &H08 : PRINT "SW4 On"
    CASE &H10 : PRINT "SW5 On"
    CASE &H20 : PRINT "SW6 On"
    CASE &H40 : PRINT "SW7 On"
    CASE &H80 : PRINT "SW8 On"
    CASE_ELSE : PRINT "?"
  END_SELECT

(b)
  DO
    swbuf1!=P_IN(0)
  LOOP WHILE swbuf1!==0
  IF (swbuf1!&&H01)==1 THEN :PRINT "SW1 On"
    ELSE IF (swbuf1!&&H02)==1 THEN :PRINT "SW2 On"
    ELSE IF (swbuf1!&&H03)==1 THEN :PRINT "SW3 On"
    ELSE IF (swbuf1!&&H04)==1 THEN :PRINT "SW4 On"
    ELSE PRINT "?:sw_in"
    PRX swbuf1! : WAIT P_IN(0)==0 END_IF

(c)
  DO
    swbuf1!=P_IN(0)
  LOOP WHILE swbuf1!==0
  IF (swbuf1!&&H01)==1 THEN :PRINT "SW1 On"
    ELSE IF (swbuf1!&&H02)==1 THEN :PRINT "SW2 On" :END_IF
    ELSE IF (swbuf1!&&H03)==1 THEN :PRINT "SW3 On" :END_IF
    ELSE IF (swbuf1!&&H04)==1 THEN :PRINT "SW4 On" :END_IF
    ELSE PRINT "?:sw_in"
    PRX swbuf1! : WAIT P_IN(0)==0 END_IF

【A】
IF --- THEN : ---- : ELSE : ----- : END_IF でセットです。
一対のIF 〜 END_IF 中にELSEを複数使うことはできません。
下記@はSW(26)がonしても PRINT "26"は実行されません。
Aは動作します。

@
5         DO
10          IF SW(24)==1 THEN
20            PRINT "24"
30            ELSE
40            IF SW(25)==1 THEN
50              PRINT "25"
60            END_IF
70            ELSE
80            IF SW(26)==1 THEN
90              PRINT "26"
100           END_IF
110         END_IF
120       LOOP

A
5         DO
10          IF SW(24)==1 THEN
20            PRINT "24"
30            ELSE
40            IF SW(25)==1 THEN
50              PRINT "25"
70              ELSE
80              IF SW(26)==1 THEN
90                PRINT "26"
100             END_IF
105           END_IF
110         END_IF
120       LOOP

●119 MPG-314 リミットセンサーについて                                          020705 

【 Q 】
MPG-314のリミットセンサーについて質問します。
J2に接続するX-LMTM〜Z-LMTPですが、プログラムにはどのように記述するのでしょうか?
またマニュアルには、常時有効とありますが、リミットセンサーで停止した場合の復帰は、
どうするのでしょうか?

【 A 】
リミットの検出設定は INSET_314 コマンドで行います。
    INSET_314 X_A LMT_ON       /*リミットon(NO接点)で検出
    INSET_314 X_A LMT_OFF      /*リミットoff(NC接点)で検出
入力を無効にすることはできません。

LMTPはCW方法のオーバーランリミット信号です。CW方向のドライブパルス出力中にアク
ティブになると停止します。LMTMはその逆です。
リミットが入って停止しても、反対方向のパルスは出ます。例えば、LMTPが入って停止し
てもCCW方向には動きます。

●118 MPC-684 ローカル変数の制限                                                020705 

【 Q 】
ローカル変数の使用上の制限はなんでしょうか。
確か26個までとか、制限が有ったような気がしますが。制限以上使うとボーソーすると聞
きました。一つのタスクで1個使うと1個と数えるのでしょうか。同じ変数名のものならば
32タスクで使っても1つと数えるのでしょうか。

【 A 】
たとえば、I!というのを一個使うと、タスク0〜31まで、I!を使うことができ、それぞれ
別の値を持ちます。つまりタスク1用とかタスク2用とか区別はされません。
!のついたラベルの数が26個に制限されています。ラベルはグローバルで、値だけローカル
変数です。
現在では26個以上使おうとするとプログラムロード時にはエラーになると思います。

●117 MPG-3202 直線補間はできるか                                               020513 

【 Q 】
MPG-3202を使用して「2軸直線補間」ができるか?
もし、不可ならMPG-314を使用すればよいか?
動作時のMAXパルスレートは20000pps。
MPG-314はエンコーダカウントは出来るか?

【 A 】
MPG-3202は2軸のパルス発生ができますが補間機能ありません。
MPG-314のパルス出力はMax4Mppsで、直線補間、エンコード機能があります。
エンコード機能にはオプションのフォトカプラ(TLP2630)が必要です。お客様にて軸数分
購入して取り付けてください。

●116 MPG-314 パルス発生が終わらない                                            020513 

【 Q 】
MPC-684 & MPG-314を使用中に変な動作が発生した。
座標 (0,0)から 座標(26200,450)への移動で、プログラム1は WAIT RR(ALL_A)=0 で 
停止してしまう。その時の座標は(25733,442)。
プログラム2のようにFEEDを変更すると終了する。
     
プログラム1
*****************************
FEED X_A 200
FEED Y_A 200
MOVL 26200 450 VOID VOID
WAIT RR(ALL_A)=0        /* ここで停止している(25733,442)
*****************************

プログラム2
*****************************
FEED X_A 199            /* 変更
FEED Y_A 199            /* 変更
MOVL 26200 450 VOID VOID
WAIT RR(ALL_A)=0        /* 正常通り処理する
*****************************

【 A 】
最低速度を遅くしておくと、条件によってはパルス発生ICの減速の最後が1ppsや0ppsとか
になって、最後の1パルスを出すのに恐ろしく時間がかかったり、あるいは出しきれずに
ハングするということが発生します。
パルス発生IC 「MCX-314」のハード的なバグというかクセです。
なるべく回避するように、最低速(自起動周波数)に0はセットできないようにはしてあり
ますが、ACCELの設定をご確認ください。

ACCELの条件で自起動を10pps程度にしておけば回避できると思います。
もし、パラメータを省略しているのであれば、省略せずに記述してみて下さい。

ACCEL 1000 1000 0       /* 0はNG

ACCEL 1000 1000 10      /* 最低速度を大きく

●115 MPC-684 サブルーチンの引き数に式を与えるとPGアドレスが変る                020510 

【 Q 】
下記のプログラムのように、サブルーチンの引数に演算を含めると、PGアドレスが変化
します。(このプログラムの場合はTASK2のPGアドレスが変化します。)

引数に演算を含めるのは、よくないことなのでしょうか。
ちなみに、S_MBKや、GETFなどの命令は、
S_MBK A+100 100
GETF A+100
のように、演算も含めて使用していますが、これは問題ないのでしょうか。

<<プログラム実行前>>
#PG
      指定されているPGアドレス-&H420
        TASK  0 for PG &h420    TASK  1 for PG &h420
                            (略)
<<プログラム実行後>>
PG
      指定されているPGアドレス-&H420
        TASK  0 for PG &h420    TASK  1 for PG &h000
                            (略)

<<プログラム>>
#LIST
10        FORK 2 *TASK2
20        FORK 1 *TASK1
30        END
40      *TASK1
50          A=100
60        TIME 1000
70        GOSUB *TEST A+100         /*サブルーチンの引き数が式
80        _RET_VAL A
90        PRINT A
100       END
110     *TEST
120       _VAR I
130         I=I*10
140       RETURN I
150     *TASK2
160       PG 2
170       END

【 A 】
GOSUB引数に演算がはいった場合の対応が整合しておりませんでしたので、修正版をベータ
サイトにアップしました。REV-3.82xです。
なお、この問題は、gosub引数が後で追加された特殊な処理のために発生したもので、その
他コマンドの一般的な引数演算につきましては、長年の実績がありますので、安心してご
使用ください。

●114 MPC-684 システムの省コスト、省スペース                                    020425 

■I/Oボードについて
MOP-096は96点出力ボード、MIP-096は96点入力ボードです。それぞれ、MOP-048、MIP-048
の2倍の点数ですが、価格は2倍ではありません。

※ただし、MOP-096、MIP-096には全ビット別のモニタLEDは付いていません。

■パルスボードについて
MPG-68K、MPG-405で単軸非同期制御を行う場合、軸数分のボードが必要でした。
MPG-314は4軸の単軸非同期制御が可能です。
例えば、MPG-68Kで4軸の非同期制御をする場合、MPG-68Kが4枚必要ですが、MPG-314なら
1枚で可能です。3軸直線補間+1軸単独制御なども可能で、ハードウェアのリソースを無駄
なく活用できます。

■ラックについて
従来は6スロットを超える構成の場合、複数のラックを連結キットでつないでいました。
現在は3スロット、6スロットに加え13スロットラックがあります。上記の96点I/Oボード
とMPG-314を使えば、大抵のシステムは13スロットラック1つで収まるようです。
●113 MPG-314 で STOP X_A IN3_OFF とした場合は減速停止?即停止?                  020422 

STOPにMPGの入力ポートを指定した場合の停止は
   ・加減速ドライブであれば減速停止
   ・定速ドライブであれば即停止
となります。

下記の@で、RMVSは加減速ドライブですから、減速停止です。AのPLSCは定速ドライブで
すから、即停止です。
MPG-314は、入力ポートを指定したハード停止とソフト停止のSTP_I、STP_Dとは異なるレ
ジスタを使用し  
    STOP X_A IN3_OFF|STP_I  
というような条件の結合はできません。
(INn_ON,INn_OFFとSTP_I,STP_Dとは異なる機能です)

    @
    10        PG &H400
    20        ACCEL 5000
    30        STOP X_A IN3_OFF
    40        RMVS X_A 50000        /*加減速ドライブ
    50        WAIT RR(X_A)==0
    60        STOP X_A 0

    A
    10        PG &H400
    20        ACCEL 5000
    30        STOP X_A IN3_OFF
    40        PLSC X_A 1000         /*低速ドライブ
    50        WAIT RR(X_A)==0
    60        STOP X_A 0

●112 MPG-314 1枚のMPGで同時に2組の円弧補間ができるか                           020411 

【 Q 】
1枚のMPG-314で同時に2組の円弧補間ができるか。

【 A 】
MPG-314には4軸あり、円弧補間には2軸を使用します。軸の組み合わせは任意ですが、
同時に2組の円弧補間はできません。排他制御なら可能です。

例えば XY組 と UZ組 の2組を同時に円弧補間することはできません。どちらか片方ずつ
なら動かせます。
●111 MPG-314 MOVTによる連続移動のサンプル                                      020314 

連続補間コマンドMOVTの先読みとは?
移動中のコマンド実行は?

mpg-314のmovtによる連続移動のサンプル
●110 MBK-816,MBK-SH,MBK-RS デジタル社タッチパネルのページが換わらない          020221 

 MPC-816 Q&A 087 に同記事
●109 MPC-684 バッテリ交換時の注意点、寿命について                              020128 020130

【 Q 】
MPC-684に使われているCR2032は保証期間が5年となっている。
交換する際の注意点は?(バックアップを取った方が良いなど。)

【 A 】
電池交換の原則は以下のとおりです。
FTMを接続して、パソコンにデータのバックアップをとってください。
(プログラムセーブ、点データセーブします。)
電池交換後、FTMからMPCINIT(初期化)を実行します。そのあと再ロードです。
初期化は、ボードをハンドリングする時にRAMデータが化けることがあるためです。

MPC-684ではプログラムはフラッシュROM部に固定されておりバックアップデータである
点データ、配列変数、MBK変数に依存しないプログラムを搭載しないかぎり、バッテリの
有無にかかわりなく動作します。

バックアップに依存するプログラムを製作した場合は、
    点データや配列のチェックサムをプログラム中に記述する。
    MBK変数の場合はMBK(-1)により状態を確認する。
等の配慮を御願いします。

電池の寿命については、
220mAhに対して無通電で2.5μAの消費が出荷基準です。
220mAh/2.5μA=88000h->3666days->10year
です。稼動中は電流を消費しません。
5年としているは、各電池メーカが5年以上の長寿命(すくなくとも5年という表現です)と
しているところから表記しています。

【 Q 】
稼動中は電流消費しないということだが、消費ゼロと考えてよいのか?

【 A 】
通電中、電池はダイオードスィッチに(1s1588)より外部回路と遮断されています。

【 Q 】
2.5μAで通電し続けた場合でも電池寿命は約10年となるが、物理的には大丈夫なのか?
液漏れが発生してしまうことなど考えられるか?

【 A 】
液漏れなどの化学的安定性については電池メーカの補償範囲なのでそちらの資料を参照し
ていただけるのが良いと思います。長期安定性については、各メーカとも曖昧な記述しか
ありません。Panaの公開している資料では3μA連続放電で220mAhとなっており、ここから
すくなくとも5年以上の寿命があると推察されます。東芝は少なくとも5年とカタログにう
たってあります。
出荷時に搭載しているのはPanasonic CR2032Pです。電子手帳などを対象にした一般に市
販されている汎用品です。一般的な使用状況からも液漏れは無いかと思います。
以前の製品には実装の都合上タブ端子を取り付けた電池を用いており、メーカの加工ミス
(クラック発生)による液漏れがありました。その経緯から汎用の電池に切り替えました。
●108 MPC-684 RS-232Cで受信したHEX表現文字列を数値に変換する方法                020123 

【 Q 】
@外部機器からRS-232CでHEX表現の文字列データが送られてくる。
例えば 10進255 は文字列"FF"(コードは&H46&H46)。
それを数値に変換するには?

Aまた、その逆は?

【 A 】
@文字列として受信し、"&H"と結合してVAL関数で数値に変換します。
AHEX$関数でHEX表現の文字列に変換します。
  
  CNFG#0 "9600b8pns1XON"
  INPUT#0 a$
    b$="&H"+a$
    v=VAL(b$)             /* @ HEX文字列から数値へ
  PRINT "&H"+a$ "=" v
  PRINT#0 HEX$(v)+"\n"    /* A 数値からHEX文字列へ

実行結果
RUN         ← CH0へ"FF"(&H46&H46)と入力
&HFF=255    → CH0から"FF"+crlf と出力される
RUN         ← CH0へ"123"(&H31&H32&H33)と入力
&H123=291   → CH0から"123"+crlf と出力される

●107 MPG-405、MPG-68K パルスセンサー停止                                       020109 

【 Q 】
センサがオンしたらパルスを止めたい。RMOVで1発出してセンサ確認というやり方では遅い。
他に方法は?

【 A 】
MOVE,RMOVコマンドにはUNTILで停止条件を与えることが出来ます。
ただし、複数の条件を論理結合することはできません。
SW(192)==1 OR SW(193)==1 などは不可。
また、減速停止のみです。

PG &HE0
ACCEL 1000
CLRPOS
MOVE 10000 0 0 UNTIL SW(192)==1   /* ここの'='は必ず2つ入力して下さい。
SELECT_CASE BSY(-1)
  CASE 1 : PRINT "正常停止"       /* 10000パルス出し切ったら 1
  CASE 256 : PRINT "減速停止"     /* センサー停止したら 256
  CASE_ELSE  : PRINT "??" BSY(-1)
END_SELECT

(確認 MPC-68K | MPC-684 with MPG-68K | MPG-405)
●106 MBK-RSの結線                                                              011221 

MPC-684 RS-232C CH0 でGPダイレクトアクセス(MBK-RS)するときの結線です。

    MPC-684 CH0(J2コネクタ)            デジタルGP (シリアル25P)
      FG   1                          1 FG
      TXD  2  ───────────  3 RD
      RXD  3  ───────────  2 SD
      RTS  4  ─┐             ┌─   4 RS
      CTS  5  ─┘             └─   5 CS
      DTR 10                          6 NC
      SG   7  ───────────  7 SG
                                     20 ER

                               伝送速度   9600bps 
                               データ長     8 
                               ストップビット  1 
                               パリティ      無 
                               制御方式   ER制御 (XON・XOFF無し)
                               通信方式   RS232C

●105 MPG-314 MOVT(円弧補間)コマンドについての補足                              011220 

PDFドキュメント
●104 MPC-684 TASK(n)関数で返される値                                           011219 

END終了すると -1 が返って来る。 [例1]
TIMEでディレイ中は残タイマー値が帰る [例2]
SW待ちの場合は0または5が返る(5はSW()関数の2度読みタイマ) [例3]

だから、タスク実行中の判定はTASK(n)が0より小さいか否か。(負ならタスクは停止中)

[例1]
10        FORK 1 *task1
20        WAIT TASK(1)<0  /* "<>"ではない
30        PRINT TASK(1)
40        END
50      *task1
60        TIME 5000
70        END
#run
-1        /* 5秒後

[例2]
10        FORK 1 *task1
15        DO
30          PRINT TASK(1)
35        LOOP
40        END
50      *task1
60        TIME 5000
70        END
#run
0
4995      /* 残タイマ値
4990
4980
(以下略)


[例3]
10        FORK 1 *task1
20        END
30      *task1
40        WAIT SW(0)==1
50        END
#run
#pr task(1)
5
#pr task(1)
0

●103 MPC-684 RS-232C受信で a$=INP$#0(1) とするとハングする?                   011219 

【 Q 】
RS-232C受信で a$=INP$#0(1) とするとハングするのですが、外部からCh0に送信してバッ
ファに文字をいれてやると、ハングから回復するのでしょうか。
何かを待っているような感じでハングアップしているみたいなので...

【 A 】
INP$#0(n)はバッファにn文字溜まるまで待ちます。
[例1]では 30 で待ち状態となり、1キャラクタ受信すると次の行の進みます。
停止しないようにするには、[例2]のようにLOF(n)でバッファのキャラクタの有無の調
べてから読み込みます。

[例1]
10        DO
20          CNFG#0 "19200b8pns1NONE"
30            a$=INP$#0(1)
40          PRINT a$
50        LOOP

[例2]
10        CNFG#0 "19200b8pns1NONE"
20          i=0
30        DO
40          IF LOF(0)>0 THEN : GOSUB *RS_GET : PRINT a$ : END_IF
50            i=i+1 : OUT i 0 : TIME 10
60        LOOP
70      *RS_GET
80          a$=INP$#0(1)
90        RETURN

●102 MPC-684でMPG-405のACCEL設定を確認するときの注意                           011218 

下記のようにMPG-405を軸毎にACCEL設定した後、ACCEL<ent>で確認すると4行表示します
が、これらは各軸の内容を表すものではありません。
4行表示されるのはMPG-314対応のためで、MPG-405の場合は4行とも最後の設定が表れます。
(ACCELリクエストに対してMPG-450は1行分しかレスポンスが無いためです)

# PG &HE0
# ACCEL 0 &H41
# ACCEL 1000
# ACCEL 0 &H42
# ACCEL 2000
# ACCEL 0 &H43
# ACCEL 4000
#accel 
最大スピード 16000  L or PPS 800  最小スピード 800  /* ↑
最大スピード 16000  L or PPS 800  最小スピード 800  /* |4行全部 最後に設定された値
最大スピード 16000  L or PPS 800  最小スピード 800  /* |
最大スピード 16000  L or PPS 800  最小スピード 800  /* ↓

(確認 MPC-684 REV-3.82k)
●101 MPG-314のタスク割り付けについて                                           011217 

【 Q 】
MPC-816とMPG-303ではタスク0がPG1,2,3選択、タスク1〜3がPG1、タスク4〜7がPG2と決
まっているがMPG-314ではどうなのか?
また、1枚のMPG-314の各軸を非同期制御するにはどのようにタスクに割り付けるのか?

【 A 】
MPC-684ではMPC-816のような固定的な割り付けはありません。

  PG &H400 1
  PG &H410 2
    第一引き数=MPG-314アドレス
    第二引き数=タスク番号

というようにプログラムで任意のタスクに割り付けます。

1枚のMPG-314を複数のタスク使うには
  PG &H400 1
  PG &H400 2
と割り付け、タスク1で 
  MOVS X_A 1000  /* X軸絶対座標移動
タスク2で 
  MOVS Y_A 1000  /* Y軸絶対座標移動
という具合になります。

'*********************************************************
'MPG-314超シンプル単軸制御サンプル
' 011228
' IOボードは IOP-048を使って入力出力を1対1接続
'*********************************************************
  FORK 1 *X_AXIS
  FORK 2 *Y_AXIS
  FORK 3 *U_AXIS
  FORK 4 *Z_AXIS
  FORK 5 *IOP048
  END 
*X_AXIS
  PG &H400
  ACCEL X_A 100
  STPS X_A 0
  DO 
    MOVS X_A 10000
    WAIT RR(X_A)==0 :           '停止待ち
    TIME 1000
    MOVS X_A 0
    WAIT RR(X_A)==0
    TIME 1000
  LOOP 
*Y_AXIS
  PG &H400
  ACCEL Y_A 1000
  STPS Y_A 0
  DO 
    MOVS Y_A 10000
    WAIT RR(Y_A)==0
    TIME 1000
    MOVS Y_A 0
    WAIT RR(Y_A)==0
    TIME 1000
  LOOP 
*U_AXIS
  PG &H400
  ACCEL U_A 10000
  STPS U_A 0
  DO 
    MOVS U_A 10000
    WAIT RR(U_A)==0
    TIME 1000
    MOVS U_A 0
    WAIT RR(U_A)==0
    TIME 1000
  LOOP 
*Z_AXIS
  PG &H400
  ACCEL Z_A 100000
  STPS Z_A 0
  DO 
    MOVS Z_A 10000
    WAIT RR(Z_A)==0
    TIME 1000
    MOVS Z_A 0
    WAIT RR(Z_A)==0
    TIME 1000
  LOOP 
*IOP048
  DO 
    FOR IO=0 TO 255
      OUT IO 0
      OUT IO 1
      OUT IO 2
      TIME 10
      IF IN(3)<>IO OR IN(4)<>IO OR IN(5)<>IO THEN
        PRINT "IO ERROR"
        END 
      END_IF 
    NEXT IO
  LOOP 
●100 MBK-RSとMBK-68/SHの違い                                                   011217 

【 Q 】
MPC-684のRS-232C CH0でデジタル社タッチパネル「GPシリーズ」とダイレクト接続が可能
というのはMBK-68と同じ機能と考えてよいのか?
また、タッチパネルからティーチングや定数の設定は可能か?

【 A 】
MPC-684のCH0のタッチパネル通信機能を「MBK-RS」と呼んでいます。
タッチパネル制御に関しては、通信スピードを除きMBK-68/SHと同じです。
通信スピードはMBK-68/SHは38400bpsですがMBK-RSは9600bpsです。またMBK-RSはMPC-684の
CPUに負担がかかりますので、プログラムによっては全体のパフォーマンスに影響がでる
かもしれません。(今のところそのような事例報告はありません)
それと、MBK-RS実行時はタスク31が使えなくなります。

ちなみに、MBK-68は製造を中止しました。今後は上位機種のMBK-SHになります。
主な違いは、データメモリが 68=全800ワードに対してSH=全8000ワードと大きいこと、
オムロン、三菱シーケンサと上位リンクできることです。

MBK-RSのコマンド・関数はMBK-SHとほとんど同じです。MBK-SHの資料はホームページに
「製品別マニュアル」として掲載していますのでご参照ください。

タッチパネルにはFTMのティーチング(TEACH)や変数設定の標準機能はありません。
お客様で、画面・プログラムを作って頂いています。

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

             <<MBK-SH>>            <<MBK-RS>>
I/F           RS-422                RS-232
通信スピート  38400bps              9600bps
データエリア  7900word              7900word
I/Oエリア     100word               100word
その他        シーケンサと上位リンク可      RS-232ポート ch0占有
              PCとプロトコル通信可      タスク31が使えない
              タスクモニタアドレス可変       タスクモニタアドレス固定
              専用CPU               メインCPUに負担?
              1スロット占有             
              内部DC5V 300mA消費

●099 MPG-314 原点センサ入力の読み方                                            011214 

MPG-314のXS1〜ZS2(コネクタJ4 11〜18番ピン)はMPG-68KのようにHPTで読めます。
しかしその戻り値にはXS1〜ZS2以外の状態も含まれていますので、必要に応じてマスクし
てください。

XS1(11番ピン)がONの時
  #PRX HPT(0)
   0001

XS1(11番ピン)とX-INPOS(1番ピン)がONの時
  #PRX HPT(0)
   00010001

◆プログラム

  IF HPT(0)&&H1=0 THEN          /* XS1を調べる
    RMOV 50000 0 0              /* CW退避移動
  END_IF

◆HPT戻り値各桁の意味

#PRX HPT(0)
  00000000   表示データ
    |    |
   H5----0   桁

    下位<-------->上位ビット
H0: XS1,XS2,YS1,YS2           (コネクタJ4)
H1: US1,US2,ZS1,ZS2           (J4)
H2: X-IN2  〜 Z-IN2(差動入力) (J1)
H3: X-IN3  〜 Z-IN3           (J2)
H4: X-INPOS 〜Z-INPOS         (J4)
H5: X-ALM  〜 Z-ALM           (J2)

◆I/Oチェックは INCHK_314 コマンドで行えます。

#INCHK_314
X_S1  ON   Y_S1  __
Z_S1  __   U_S1  __
X_S2  __   Y_S2  __
Z_S2  __   U_S2  __
XIN2  __   YIN2  __
ZIN2  __   UIN2  __
XIN3  __   YIN3  __
ZIN3  __   UIN3  __
X-INP ON   Y-INP __
Z-INP __   U-INP __
X-ALM __   Y-ALM __
Z-ALM __   U-ALM __
XLMT+ __   XLMT- __
YLMT+ __   YLMT- __
ZLMT+ __   ZLMT- __
ULMT+ __   ULMT- __
#
●098 MPC-684 FTMW32E(英語版FTMW)でプログラムが読み込めない                     011213 

【 Q 】
FTMW32EでMPC-684にプログラムを読み込む時と「There is a Japanese(Kanji,Kana)--」
警告メッセージが出る。

【 A 】
プログラム(コメント含む)に日本語は有りませんか?
ネイティブWindowsで日本語キャラクタは表示できませんしPCがフリーズすることがあった
ので、英語版ではLOAD時に日本語キャラクタに対して警告を出します。
対策は..プログラムから日本語を削除してください。
●097 MPC-684 DC24V消費電流実測値                                               011210 

MPC-684ファミリのDC24V消費電流の実測値です。電源容量としては、これらにI/O機器の
消費電流を加え、突入電流を加味してください。

MPC-684 
    単体静止120mA 
    MIP-048、MOP-048、MPG-405、MPG-314挿入時170mA
MIP-048 
    全入力OFF 0mA 
    全入力ON 150mA
MOP-048 
    全出力OFF 0mA 
    全出力ON 90mA
MPG-405 
    静止 70mA 
    全入力ON 100mA 
    全入力ON+パルス(3軸)出力時110mA
MPG-314 
    静止 30mA 
    全入力ON 50mA  
    全入力ON+パルス(3軸)出力時60mA
RACK-68K
    0mA

●096 MPC-684 文字列配列AR$()のファイル化                                       011204 

【 Q 】
文字列配列AR$()をファイル保存・読込みする方法は?

【 A 】

AR$は下図のようにポイントデータと同じメモリ領域のうしろを使っています。

  ポイント               DIM_AR$ n m
|X,Y,U,Z| <-P(13000)   AR$(0)
|       |                |    n文字*mバイト
|       |                ↓    (nはデリミタNULを含む)
|       |              AR$(m-1)
|       |
|       |
|X,Y,U,Z| <-P(1)

   ( ※1ポイントデータが1AR$に対応しているわけではありません。)

ですから点データ操作でAR$もファイル化できます。
しかし点データ全部を読み書きすると、とても時間がかかりますからAR$領域の先頭を調
べて保存範囲を限定します。
AR$の先頭はDIM_AR$<ent>で調べられます。

    DIM_AR$ 35 100
なら   
    #DIM_AR$<ent>
    Length=35 Count =100 P(MAX)=12781

でAR$の領域はP(12782)〜P(13000)と判ります。
FTMWまたはPointEditorで点データの保存範囲を設定してファイル保存してください。

FTMWの点データ読み込み時は必ずNEWPします。AR$領域以外の点データをそのままで読み
込むにはPointEditorで「NEWPする」をアンチェックし実行してください。

MPC-684のバージョンはREV-3.82i以上をお使いください。
●095 MPG-314 差動入力非対応のモータドライバの接続方法                          011126 

【Q】
MPG-314でNSKのメガスラストモータドライバを駆動したら、パルス入力数が不安定

【A】
アプリケーションノート参照  

・確認ドライバ
NSK ESY-Y2020A23-21 (メガスラストモータドライバ)
潟nーモニックドライブシステムズ HA-650 シリーズ
●094 MPC-684 RUNしたとき裏タスクはどうなる                                     011126 

【 Q 】
裏で走っているタスクがあるときRUNすると、そのタスクはどうなる?

【 A 】
RUNすると裏タスクは全停止します。
プログラムを変更、LOADしても止まります。
SAVEでは止まりません。(FTMW32 Ver6.31から停止)

●093 MPC-LNK2 DSWの設定                                                        011122 

複数のMPC-684システムをMPC-LNKでネットワークする場合のDSWの設定です。
DSW1はシステム内のアドレスを設定します。1ラックにMPC-LNKが1枚ならDSW1は1です。
DSW3ネットワーク上のMPC-LNKのアドレスです。

 システム#1    システム#2    システム#3
 ---------     ---------     --------- 
| |     | |   | |     | |   | |     | |
| |     | |   | |     | |   | |     | |
| |     | |   | |     | |   | |     | |
 ---------     ---------     --------- 
 684   LNK     684   LNK     684   LNK
        |            ||            |
         ------------  ------------
     DSW1=1        DSW1=1         DSW1=1
     DSW3=1        DSW3=2         DSW3=3
●092 MBK-SH タッチパネルを2台付けたい                                          011116 

【 Q 】
装置の前後に同じタッチパネル(デジタル社GP)を1台ずつ付けたい。方法は?

【 A 】
MBK-SHは2つのポート(コネクタJ2,J3)でMEWNET-FPプロトコル準拠の通信ができます。
どちらもRS-422で接続可能、ピン配も同じですから、2台のタッチパネルを全く同じにつ
なぐことができます。
ただし、J2は通信速度が初期値で9600bpsですからプログラムで "S_MBK 1 8065"として
38400bpsにして下さい。

●091 MPG-314 HOMEコマンド後のACCELパラメータの確認はできるか                   011105 

【 Q 】
HOMEコマンド等を実行後、ACCELパラメータ破壊を確認しようとしたのですが壊されてい
ないようです。どのようにしたら破壊を再現できますか。

【 A 】
HOMEはMCX314のスピード設定のレジスタを操作するので、ACCELで設定した内容が変って
しまいます。しかしそれを見ることはできません。

#PG &H400
#ACCEL 3000
#FEED X_A 0
#HOME X_A IN0_ON -200 /* XS1(NEAR ORG)がOFFになるまでCCW FEED=200

上記のようにコマンドを実行した後ACCEL(パラメータ無し)で再確認しても値は変って
いません。
#accel
Max. speed 3000  L or PPS 150  Min. speed  150
Max. speed 3000  L or PPS 150  Min. speed  150
Max. speed 3000  L or PPS 150  Min. speed  150
Max. speed 3000  L or PPS 150  Min. speed  150


実験方法としては上記のHOMEの実行前後で
#RMVS X_A 1000       /* X軸CW1000パルス
のスピードの変化を見て下さい。HOME後は遅くなります。

  PRSET_ACCEL X_A       /* ACCELパラメータ復帰、停止条件クリア
  FEED X_A 0            /* FEED再設定
でHOME前のスピードに戻ります。PRSET_ACCELの代わりにACCELを再実行しても同じです。
●090 MBK-SH MBK-68から置き換えるときのソフト的な変更点                         011102 

データエリアがMBK−68(以下68)の0〜701に対して、MBK−SH(以下S
H)は0〜7899に拡張されています。
またI/Oエリアは、68の70000〜79715に対して、SHは70000〜79
915に拡張されています。
68からSHに置き換えるとき、これらのデータエリアとI/Oエリアだけを使用してい
るプログラムなら変更は不要です。
しかし、下表の68アドレスにアクセスしている場合にはSHアドレスへの書き換えが必
要です。

データエリア
 --------------------------------------
| 68アドレス |       内容       | SHアドレス |
 --------------------------------------
|  853    | MBKバージョン       | 8053    |
|  860    | CH0 BCCエラーカウント   | 8060    |
|  861    | CH1 BCCエラーカウント   | 8061    |
|  862    | CH0 コマンドエラーカウント | 8062    |
|  863    | CH1 コマンドエラーカウント | 8063    |
|  864    | タスクモニタアドレス設定  | 8064    |
 --------------------------------------

例えば、68で S_MBK 100 864 は SHでは S_MBK 100 8064 、
A==MBK(853) は A==MBK(8053) となります。

デジタルGPとの接続(ピン配、通信設定など)は相違ありません。

●089 MPC-684 セマフォ関数RSVを論理結合できるか                                 011101 

【 Q 】
セマフォ関数を論理結合して使用するとどうなるか?
また、リセットでRLSとOFFするのとは違うのか?

【 A 】
--実験プログラム--
PG &H400
PG &H400 1
PG &H400 2
ACCEL X_A 1000
STPS X_A 0
OFF -256
FORK 1,*TASK1
FORK 2,*TASK2
END
*TASK1
DO
*TASK1_LOOP
  IF RSV(-256)==0 AND SW(-1)==0 THEN    /*@_1
    GOTO *TASK1_NEXT                    /*@_2
  ELSE                                  /*@_3
    GOTO *TASK1_LOOP                    /*@_4
  END_IF                                /*@_5
*TASK1_NEXT
/*  WAIT RSV(-256)==0 AND SW(-1)=0      /*A
/*  WAIT RSV(-256)==0
  MOVS X_A 1000
  WAIT RR(X_A)=0
  PR "TASK1"
  dummy=RLS(-256)   /*リセット  == OFF -256
  TIME 10
LOOP
*TASK2
DO
  WAIT RSV(-256)==0
  MOVS X_A 0
  WAIT RR(X_A)=0
  PR "TASK2"
  dummy=RLS(-256)   /*リセット
  TIME 10
LOOP
-----------------

RSVを論理結合することはできます。
ランタイムエラーやシンタックスエラーにはなりません。
しかし...

@またはAが有効の時
-1がOFFの場合はこのプログラムは期待通りに*TASK1→*TASK2→*TASK1→と動きます。
しかし、-1がONになると @_1で引っかかってタスク1はループ状態にはいります。
このときRSV()で-256はセット(1になる)されるのでタスク2も動かなくなります。
その後OFF -1としても-256はONのまま保持される(リセットされない)のでやはりこの
プログラムは動きません。

というように訳のわかり難い事態にはまりそうです。
値を返すだけのSW()などとは違い、RSV()は動作を含む関数なので論理結合には注意して
ください。

また、
セマフォのリセット関数RLS()はOFFと同等です(RLS(-256) は OFF -256と同じ)。
プログラム上RSVに対する操作を明示的に表現するために用意された関数です。

●088 MPG-314 2相エンコーダのカウントが正常にできない                           011015 

【 Q 】
2相エンコーダのカウントが正常にできない。

【 A 】

MPG-314のカウンタは起動時にはUp/Down入力モードになっています。
2相パルス入力モードにするにはINSET_314を実行して下さい。

例)
#PG &h400
#INSET_314 X_A LMT_ON   /*カウンタを2相パルス入力にするためINSET_314を実行する
#PR X(-1)               /*カウンタ読み込み

カウンタはデフォルトで"4てい倍"となっています。
(2倍,1倍)率を与えるにはINSET_314の設定値に&H400(2倍)、&H800(1倍)をORします。

#INSET_314 X_A &H800|INP_OFF    /*1倍で読み取り

※Up/Down入力モードが使えるのは搭載ICが「MCX314A」以降です。
 Up/Down入力モードは分周されません。

●087 MPC-68K,684 入力したプログラムの後ろが消える                              011011 

【 Q 】
10 IF a==0 AND b==0 AND c==0 AND d==0 THEN
と書いてもLISTを見ると
10        IF a==0 AND b==0 AND c==0 AND d==0
というように、最後のTHENが消えてしまう。なぜ?

【 A 】
MPC-68K,684の制約として1文の(スペースで区切られた)文字列の数は8個までとなってい
ます。
上の入力したプログラムには9個の文字列が有るので最後のTHENが消えてしまいます。

10 IF a==0 AND b==0 AND c==0 AND d==0 THEN
   1   2    3   4    5   6    7   8    9

●086 MPC-68K,684 プログラムのマルチステートメントのコロンが無いとどうなる      011011 

【オリジン】
10        WAIT SW(192)==1 : GOSUB *sub : PRINT "After"  /* コロン有り
20        PRINT "END"
30        END
40      *sub
50        PRINT "SUB"
60        RETURN
#run
SUB
After
END     /* 期待通り

【MPC-68Kの場合】
10        WAIT SW(192)==1 : GOSUB *sub PRINT "After"  /* PRINT文の前のコロン無し
20        PRINT "END"
30        END
40      *sub
50        PRINT "SUB"
60        RETURN
#run
SUB
END     /* サブルーチンの後のPRINTが無い

【MPC-684の場合】
10        WAIT SW(192)==1 : GOSUB *sub PRINT "After"  /* PRINT文の前のコロン無し
20        PRINT "END"
30        END
40      *sub
50        PRINT "SUB"
60        RETURN
#run
#10     ・・・・・引き数が適合しません       /* RUN TIME エラーになる (赤LED点滅)
●085 MPC-68K,684 RS-232Cのバッファのサイズはどのくらいですか?                 011010 

MPC-68K,684とも内部リングバッファは256bytesです。

INPUT#0 A$
 B$=A$+"123"
などとした時の文字列サイズや文字列演算での最大長は、68Kでは80文字以下、684で
128文字以下を想定しています。
●084 MPG-314 XYサーボモータ、UステップモータのACCEL設定・移動                  010910 
【 Q 】
XY軸はサーボモーター、U軸はステッピングモーターを制御する。
MOVLで3軸直線補間移動させる場合にXYの移動量が小さいとU軸がACCELで設定したMAXの値
より速いスピードで回転する。
XYは直線補間で移動したいが、U軸はACCEL MAX値以下で移動するようにできないか?

【 A 】
MOVLでは与えられたパラメータで直線補間をしてしまいます。
U軸のみ速度を変更する必要がある場合は、U軸をMOVLでは制御しないで、MOVSを用います。

ACCEL X_A XYspeed
ACCEL U_A Uspeed

MOVL Xpos Ypos VOID VOID
MOVS U_A Upos
WAIT RR(X_A|Y_A|U_A)==0

と上記のように記述してください。
U軸はACCEL U_A に従いします。
同時スタートで終了はそれぞれになります。

//-----
XYUを3軸直線補間した場合ACCELのパラメータ優先順位は X>Y>U。
Uの出力数が最も多くなったとしてもUが(DDAでいうところの)主軸にはならずXの移動開始
・停止にUが同期して高速化してしまう。
このような組み合わせでは3軸直線補間は無理。
-----//
●083 MPG-314 INPOSが有効にならない                                             010803 

【Q】
次のプログラムでINPOSが有効になりません。J4のX-INPOSをGNDに落としたり離したりし
て動作をチェックしていますが、INP_ONとしても信号を無視しています。

PG &h400
ACCEL 100000
INSET_314 X_A ALM_ON|INP_ON
RANGE 0                <--これを入れるとINPOSが無視される。入れなければOK。なぜ?
CLP
DO
MOVS 10000 10000 10000 10000
WAIT RR(ALL_A)==0
MOVS 0 0 0 0
WAIT RR(ALL_A)==0
LOOP


【A】
RANGE nは旧来のコマンドと互換性を保つために作られたもので、新しいコマンド体系と
組み合わせると具合が悪くなります。
RANGE nコマンドを実行すると、INSET_314で設定されるパラメータをクリアしてしまいま
す。これはRANGEがSLMT_ONを含む実行をするためです。RANGE nを使う必要のある場合
は、RANGE n実行後INSET_314で改めて必要なモードを設定してください。

RANGEの新しい設定は
RANGE X_A Max Min
というものになります。こちらはINSET_314と組み合わせて使用します。

上のプログラムではINSET_314 X_A ALM_ON|INP_ONをRANGE nのあとで実行すればよいです。

●082 MPG-314 軸指定予約定数について                                            010803 

【Q】
軸指定予約定数を用いる全ての命令は論理和で指定できるのですか?
例)RANGE X_A|Y_A -1000 1000

【A】
本的にはコマンド体系をそのように考えて作成していますが、例外もあるかと思います。
もし不具合などありましたら連絡ください。RANGEについては以下のようにorが有効です。


10        PG &H410
20        RANGE X_A|Y_A 1000 -1000
25        INSET_314 X_A|Y_A SLMT_ON
30        CLRPOS
#                        
このあとteachでjogすると、リミットが有効なのを確認できる。
●081 MPG-314 WARPの途中停止                                                    010803 

【Q】
WARP実行中にパルス発生を途中停止することは可能ですか?
下降動作に入ればSTOP命令で停止できますがそれ以外はできません。

【A】
以下のサンプルで試してみましたが、問題ありません。どこでも停止します。

10        PG &H410
15        PG &H410 1
17        LIMZ 500
18        CLRPOS
20        ACCEL 5000
30        SETP 1 100 100 100 1000
40        SETP 2 10000 100 100 2000
50        GO P(1)
55        FORK 1 *aho
60        WARP 100 P(2) 200
70        WAIT RR(ALL_A)==0
80        CP
90        END
100     *aho
110       TIME 500
120       STOP X_A|Y_A|U_A STP_D
# 

シングルタスクで考えているのであれば、WARPは複合コマンドのため、Zの下降が始まる
まで次のコマンドを実行しません。以下がワープの仕様の全てです。下降前の停止はWHEN
を用いて記述してください。これは目的点の上空までいきます。

REV-3.81f(314使用ではかなり修正されているので最初は注意して動作させてください。)
機能追加・修正など

◆WARP [軸指定] [Upz] P(n) [Dwnz] [WHEN 論理式] 

    [軸指定]    省略するとX_A|Y_A|U_Aとなっています。
                X_A,Y_A,X_A|Y_Aを指定してU軸使わない場合やX,Y軸のいずれかを使う
                ようにできます。
                WARPで使わない軸は他のタスクで単独軸として使用できます。

    [Upz]       省略するとゲートモーションとなります。
                また、10以下の値は指定できません。

    [Dwnz]      省略するとゲートモーションとなります。
                また、10以下の値は指定できません。
                この値はリアルタイムでACCEL設定値から計算して制御されますので精
                度がよくありません。最初大き目に設定してください。
                また、最小速度を0とした近似計算のため、最高速度と最小速度の比が
                1/10の以下の場合は不正確になります。

    [WHEN 論理式] Z軸をおろし始めるところで条件式が成立していることを確認して下
                降にはいります。成立していないとZ下降をしません。
                WHEN文を省略すると無条件でワープジャンプとなります。

WARP X_A 1000 P(3) 1500 WHEN 1==HSW(-1)&HSW(-2) <- X軸とZ軸のみの条件付ワープ
WARP 1000 P(3) 1500                             <- XYU軸とZ軸のみの無条件ワープ
WARP X_A|Y_A 1000 P(3) 1500 WHEN 1==HSW(-1)     <- X/Y軸とZ軸のみの条件付ワープ

●080 MBK-68 対応タッチパネルについて                                           010712 

【Q】
MBK−68はデジタル社のGP2000シリーズでは使用できますか?
またオムロンのタッチパネル(NS12等)での使用は確認できていますか?

【A】
GP2000シリーズはすでに多くの実績があります。
オムロンについては未サポートです。

現在のMBK−68にはPanasonic MEW−NETプロトコル準拠のポートが
2CHあり、一方をパソコンとの通信に利用できます。
MPC側の通信プログラムは不要です。パソコン側はVBなどでプロトコル通信による
ホストアプリケーションを作成します。
●079 MPC-684 浮動小数点について                                                010712 

【Q】
複数の小数点データを記憶し、そのデータをMPC−LNKやRS−232Cでデータ転
送をしたいのですが、684オプションのコプロセッサを装着すれば可能でしょうか?

【A】
演算そのものは、浮動小数点としてできますが、684のインタプリタが浮動小数点型を
持たないので、ロング型整数(固定小数点)として変数保存していただくことになります。
 
浮動小数点の入出力については、細部の対応が粗いところもありますので、要望があれば、
検討させていただきます。
    例: PRINT#0 FP0 とかで直接出力するとか・・
MPC−LNKは、ワードイメージの変数共有なので、浮動小数点を扱う場合はRS−2
32Cのようなメール通信のほうが向いていると思います。
●078 MPC-68 SELECT_CASE文で複数の条件を同一処理するには                        010704 010712

SELECT_CASEで複数の条件を同一処理する場合は、例@のように式を記述せずにCASE文を
並べます。
例Aは条件をORで連結していますが、期待通りの結果は得られません。
また、例Bのようにコメント文を書いてもだめです。

例@
10        SELECT_CASE a
20          CASE 0
30          CASE 1
40          CASE 3 : PRINT "(^_^)v " a
50          CASE_ELSE  : PRINT "(-_゚)? " a
60        END_SELECT
#a=0
RUN
(^_^)v 0
#a=1
RUN
(^_^)v 1
#a=2
RUN
(-_゚)? 2
#a=3
RUN
(^_^)v 3


例A
10        SELECT_CASE a
20          CASE 0 OR 1 OR 3 : PRINT "(^_^)v " a
30          CASE_ELSE  : PRINT "(-_゚)? " a
40        END_SELECT
#a=0
RUN
(^_^)v 0
#a=1
RUN
(-_゚)? 1
#a=2
RUN
(-_゚)? 2
#a=3
RUN
(-_゚)? 3

例B
10        SELECT_CASE a
20          CASE 0 :                        'comment0
30          CASE 1 :                        'comment1
40          CASE 3 : PRINT "(^_^)v " a
50          CASE_ELSE  : PRINT "(-_゚)? " a
60        END_SELECT
#a=0
RUN
#a=1
RUN
#a=2
RUN
(-_゚)? 2
#a=3
RUN
(^_^)v 3

--確認:MPC-684 ADVFSC(r)eREV-3.81m--
●077 MPC-68シリーズ UL認定について                                           010626 

【Q】
MPC−68シリーズのUL認定は?

【A】
製品としてのUL認定は特に受けておりません。

..まず、使用電源をDC24V以下に限定していること、大電流を扱う機能を有しないこ
とから、その必要性は無いものと考えておりました..

しかしながら、
PCB(生基板)についてはUL認定工場にてUL94−V0品を使用するようにしており
ます。
使用コンポーネント、コネクタについては、できる限りUL94−V0相当品を使用して
います。
電源系へのタンタルコンの使用はしておりません。
カードケージの樹脂部についてもUL94−V0品を使用しています。

例外として
付属のカードプラがUL−94V0相当品が無く、HBグレードとなっています。
またMBKに搭載されているモレックス製コネクタがUL94−V2品です。

実質的にUL94−V0に統一するためには、カードプラの交換、上記モレックス製コネ
クタをとり外す。ということが想定できますが、今のところそうした仕様指定の受注は困
難です。
MBKにつきましては近々モデルチェンジの予定があり、モレックス製コネクタは廃止と
なります。

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

【Q】
UL認定の予定は?

【A】
今のところ不勉強もあってその予定はありません。 m(_ _;)m

●076 MPG-314 原点復帰で残パルスクリアの例                                      010615 

ドライバのトルクが十分でなかったり、装置に大きな摩擦がある場合、原点復帰時に残留
パルスが残る場合があります。
こうした場合、サーボドライバの残りパルスをZ相検出時にクリアすると原点復帰の精度
を確保することができます。
MPG-314にはこうした機能が無いため、以下のようなソフトで代替します。
ここではJ4のOP1~OP4をリセット信号として使用します。

10      '原点復帰で残パルスクリアの例
20      'Near Orgin
30        HOUT &HF0 :                       ' Servo On
40        HOME X_A 100 IN0_ON
50        HOME Y_A 100 IN0_ON
60        HOME Z_A 100 IN0_ON
70        HOME U_A 100 IN0_ON
80        WAIT RR(ALL_A)==0
90      'Detect Z phase
100     '必要に応じて他タスクpause
110     ' pause 3 4 5
120       HOME X_A 10 IN1_ON
130       HOME Y_A 10 IN1_ON
140       HOME Z_A 10 IN1_ON
150       HOME U_A 10 IN1_ON
160         a=0
170     'RR(ALL_A)の値をHOUTに反映
180     'Zのビットが4Uが8となるので注意
190     '論理反転してリセット信号とする。
200       WHILE a<>&HFF : HOUT a=(15-RR(ALL_A))|&HF0 : WEND
210       TIME 10
220       HOUT &HF0 :                      'カウンタリセットクリア
230     ' cont 3 4 5   

200のWHILE a<>&HFF : HOUT a=(15-RR(ALL_A))|&HF0 : WEND
この行を実行している間は(ニアオリジンからZ検出までの区間)はタイミングの配慮が必
要です。応答速度は他タスクを休止させた状態で0.5m秒です。このため1kPPS以上での原
点復帰は精度が保証できません。100pps程度の場合は10m秒程度の余裕があるため十分に
対応できます。

●075 MPG-314 変数の文字数                                                      010607 

【Q】
A=X_A|Y_A とか A=INP_ON|ALM_OFF とか、変数に予約定数を代入するとき、この変数は何
文字有効ですか?

【A】
式の記述制限のみです。一つの連続した文字列では37文字以内になっていたと思います。
10        INSET_314 X_A ALM_ON|INP_ON|LMT_OFF
10          INSET=ALM_ON|INP_ON|LMT_OFF    
ぐらいははいりますが・・
●074 MPG-314 インポジション信号幅はどのくらい?                                010607 

【Q】
インポジションを有効に設定した場合、INP信号幅はどのくらい必要ですか?

【A】
不明です。ICのデータシートに書いてないのです。
たぶん、ICとしては内部の1クロック1μ秒で十分なはずです。
フォトカプラの反応速度を配慮すると200μSEC以上としてください。
●073 MPG-314 パルス発生後の完了確認は必要か                                    010607 

【Q】
MPG-314のマニュアル25ページ最後に
    例)Z軸のINPOSを有効にする
      |
      |
    40 DO
    50 RMVS Z_A 10000
    60 RMVS Z_A -10000
    70 LOOP
とありますが、これは間違い?
つまり、RMVS、MOVS等を使用した最後には必ずインポジションの有効無効に関わらず
WAIT RR(?_A)==0 で終了したのを確認しなければいけないのではないか?

【A】
上のプログラムは間違いではありません。上のプログラムではMOVSと異なり現在位置取得
がないため、順次パルス発生し往復運動と なります。
inposが無効の場合、上の移動はサーボが溜まりパルスを持ったまま反転するため、微妙
に端までいかなくなります。
INPOSを有効にするとかならずパルスを出し切るのを待つため、かならず端までいきます。
WAIT RR(Z_A)=0などを必要とするのは、パルスを出し切った、あるいはINPOSまで検出した
ことを知るために必要です。
つまり普通の制御では必要です。従来のように移動完了検出をコマンドに組み込んでいな
いのは停止するまでに他の作業をすることが実際の応用では多いためです。
●072 MPG-314 入力モニタの表示                                                  010607 

【Q】 
INSET_314 ALL_A 0 とし INCHK_314 モニタします。
(X,Y,ZのLMT入力(+-)にノーマリオンの接点がはいっています)
    XLMT+ ON   XLMT- ON
    YLMT+ ON   YLMT- ON
    ZLMT+ ON   ZLMT- ON
    ULMT+ __   ULMT- __
と表示され、Z軸のLMT+のセンサを働かすと ZLMT+ __ と表示が変わります。
次にINSET_314 ALL_A LMT_OFF とし INCHK_314 でモニタします。
    XLMT+ __     XLMT- __
    YLMT+ __     YLMT- __
    ZLMT+ __     ZLMT- __
    ULMT+ ON     ULMT- ON
と表示が反転します。
Z軸のLMT+のセンサを働かすと ZLMT+ ON と表示が変わります。
これはいったいどういうことなのでしょうか?
INSET_314 ALL_A ALM_OFF と INSET_314 ALL_A 0 とではALM部の表示、入力動作は同じで
した。

【A】
ONというのは有効という意味です。通常のON/OFFではありません。
LMT_OFFとはオフ状態でリミットが有効になるという意味です。
この場合LMT_OFFに設定したためノーマリオン状態ではリミット検出にはならず、
センサがオフになるとON、つまり有効になるという意味です。
ON状態ではパルス発生もできません。

INSET_314 ALL_A ALM_OFF と INSET_314 ALL_A 0 のALM部の表示の違いは内部の機能の差
によるもので、LMTはIC内部の処理を経て出力されるためにこのようになります。
この件はマニュアル不備ですね。修正します。
●071 MPG-314 原点復帰後 自動的にサーボドライバの溜りパルスをクリアできるか     010524 

【Q】
MPG−314原点復帰で、サーボZ相を検出して停止したとき、サーボドライバの溜り
パルスをハード的(インタプリタプログラムではなく)にクリアできないか?

【A】
使用しているICにはそのような機能はありません。したがって、実現するとなるとインタ
プリタで組んでいただくしかないですね。
homeコマンドは以前との互換性とか簡便性を主体に搭載されているので、これをつかわず、
通常の条件停止と同じように考えて組んで、実行環境さえ整えれば、実用範囲の自動たま
りパルスリセットは実現できると思いますがどのみち、そんなに早く動作させることはで
きないわけで1Kで動作させた場合、1msecの時間余裕があり、684では十分に対応できると
思いますが・・
●070 MPC-684 改版データの取得                                                  010511 010514 
MPC-684 REV-3.81cから予約文字列変数VER$に改版データが入っています。
    #PRINT VER$
    MPC-684 ADVFSC(r)eREV-3.81c
     BASIC like + multi tasking
     Created by ACCEL Co.'~2001

その中からREV番号を取り出すサンプル
    10        GOSUB *GET_VER
    20        END
    30      *GET_VER
    40        FOR BEGIN=0 TO LEN(VER$)
    50          STRCPY VER$ DEST$ BEGIN 3
    60          IF DEST$=="REV" THEN
    70            BREAK NEXT
    80          END_IF
    90        NEXT BEGIN
    100       FOR TERM=BEGIN TO LEN(VER$)
    110         STRCPY VER$ DEST$ TERM 1
    120         IF DEST$==CHR$(13) THEN
    130           BREAK NEXT
    140         END_IF
    150       NEXT TERM
    160       STRCPY VER$ DEST$ BEGIN TERM-BEGIN
    170       PRINT DEST$
    180       RETURN
    #RUN
    REV-3.81c


実際には改版データ1行目の文字位置は変えないので(というお約束)
    #DEST$=""
    #STRCPY VER$ DEST$ 18 9
    #PR DEST$
    REV-3.81c
でもOkです。

●069 MPC-684 プログラム保存後にLISTコマンドを実行したら全行表示してしまう      010405 

【Q】
MPC-684でプログラム保存後にLISTコマンドを実行したら全行表示してしまう。
原因と対策は?

【A】
MPC-684はRev-3.81aからLISTコマンドの第2パラメータを保持します。
例えば LIST 100 50[Enter] とすると 文番号100から50行表示しますが、次のLISTコマン
ドで第2パラメータを省略しても 50 は有効です。
FTMは保存時にLIST 0 0 と実行し、全行を一括出力させてPCへ保存していますが、保存作
業終了後もその設定のままになっており、次のLIST n[Enter]で全行表示となります。
Ctrl+MやMerge時にはLIST n 1としているので、その後のLISTが1行しか表示されなくなっ
てしまいます。

FTMW32.EXE(Windows版)はVer6.22から、作業後にLIST第2パラメータを20に強制変更して
います。
PC98DOS、DOS/V版FTMは非対応です。作業後のLIST表示には LIST 1 20[Enter]のように
第2パラメータを与えてください。
●068 MPG-314 カウンタ入力X(-1)〜Z(-1)は何バイト                                010322 

【Q】
MPG-314のカウンタ入力X(-1)〜Z(-1)は何バイトか?

【A】
4バイト長(±2147483647)です。

#PG &h400
#STPS X_C 2147483647    /*カウンタ設定
#PR X(-1)               /*カウンタ読み込み
2147483647

●067 MPG-314 ACCELコマンドのlong,min値を同じ値にしたらエラー                   010322 

【Q】
@のようにACCELのlong,minを同じ値にしたらエラーになったので、Aのようにした。
エラーにはならないがこれで良いのか?

@
10        PG &H400
20        ACCEL X_A 1 1 1
30        RMVS X_A 10
RUN
#20     起動スピードが最大スピードよりも大きい

A
10        PG &H400
20        ACCEL X_A 1 1 1/2
30        RMVS X_A 10
#run
#       *0  停止 

【A】
@はACCELの仕様外の設定ですからエラーになります。Aはminが0と解釈されるので
ACCELのパラメーターチェックには引っかからずエラーにはなりませんが、正しい数値で
はありませんので、このような指定は不可です。
また、上記は1ppsの定速パルス発生を目的としています。低速パルス発生はPLSCコマンド
を使用します。

5         PG &H400
10        PLSC X_A 1 10             /* 1ppsで10パルス
20        WAIT RR(X_A)==0           /* パルス発生終了待ち
●066 HOUT 2(X_A;NOP,1)とSTOP X_A IN0_OFFの違い                                 010312 

【Q】
HOUT 2(X_A;NOP,1)とSTOP X_A IN0_OFFのコマンドの意味の違いはあるのか。
又、使い分けはあるのか。

【A】
どちらも同じです。
HOUTは出力/レジスタ設定の汎用的なコマンドですが難解です。
STOPは機能を限定してわかりやすくした後発コマンドです。

●065 MPG-314のINPOSを有効にしたらプログラムはその行で停止するのか              010312 

【Q】
INPOS(インポジション)信号を接続して有効にし、ネイティブコマンドにてパルス発生を
した場合、プログラムはパルス終了まで次の行に進まずINPOS信号を待つのか。

【A】
INPOSを有効にしても次の行へ進みます。
    #INSET_314 X_A INP_ON   ←X軸INPOS有効
    #RMVS X_A 10000         ←この行を実行して、すぐ次へ
    #

INPOSが有効になっていて、INPOS信号がOFFの場合は
    #INSET_314 X_A INP_ON
    #RMVS X_A 100000        ←実行後すぐ次へ進む
    #RMVS X_A -100000       ←この行を実行してもINPOSがONするまでパルスは出ない

パルス終了を待つのは次のようになります。
この場合INPOSもONにならなければWAIT文の次へは進みません。

    5  PG &H400
    10 INSET_314 X_A INP_ON
    20 RMVS X_A 100000
    30 WAIT RR(X_A)==0   ←X軸パルス終了待ち

●064 MPG-405に電源を入れたらFL1から煙が出た                                    010226 

【Q】
MPG-405の電源コネクタ(J5)にDC24Vを給電したらFL1から煙が出た。同じ電源のMPC-684、
MOP-048、MIP-048は問題無し。なぜ?

【A】
電源コネクタのピン配の違いに注意してください(下表)。
MPG-405、MPG-314の電源コネクタ(J5)の2番ピンはSGとなっています。
MIP,MOP仕様(1・2番ピンに+DC、3・4にGND)で作った電源コネクタをMPGに接続するとFL1
が過電流となります。

    ------------------------------
   |  |MPG-405|MOP-048/096|MPC-684|
   |  |MPG-314|MIP-048/096|MPC-68K|
   |  |       |IOP-048    |       |
    ------------------------------
   |1 | +DC   | +DC       | +DC   |
   |2 | SG    | +DC       | NC    | ←ここ!
   |3 | GND   | GND       | GND   |
   |4 | FG    | GND       | FG    |
    ------------------------------
    SGは基板パルスI/F回路のDC5V、GNDは+DCのリターンです。
●063 MPC-684にMBK-68またはMPS-324からDC5V給電する場合                          010214 

MPC-684システムにMBK-68のコネクタT1、またはMPS-324からDC5Vを給電する場合はMPC-684
のヒューズF1(透明ケースのジャンパーみたいな部品)を抜いてください。
この場合でもMPC-684の電源コネクタJ5にはDC24Vは必要です。

●062 初期MPC-684 INPUT文で多量のキャラクタを受信するとポイントデータが壊れる   010202 

実験レポート
●061 MPC-68K/684 点データが変更できない                                        010201 

【Q】
点配列Y(n)に&H66000000〜&H66FFFFFF(1711276032〜1728053247)を入れるとX(n)の数値が
変更できなくなる。なぜ?

  #Y(1)=&H66000000
  #X(1)=1
  ・・・・・定数は変更できません
  #U(2)=1728053247
  #Z(2)=2
  ・・・・・定数は変更できません
  #

【A】
システムのバグでMPC-68KでもMPC-684でも出ます。
このバグは設定しようとしている次の番地(※参照)の点配列のトップバイトに&h66がは
いっていると定数変数と勘違いしてしまうというバグです。
かなり大きな数なので(17億台)、普通は使われない範囲と思いますが、なんらかの原因で
RAMにこの値がはいるとこうした状態に陥ります。

SETPではこのバグはありませんので、こうした現象が確認されたら以下のように修正して
ください。

    X(PointNo)=xxx
    Y(PointNo)=yyy
    U(PointNo)=uuu
    Z(PointNo)=zzz
と配列を使って代入するところを、SETPで設定します。
    SETP PointNo xxx yyy uuu zzz

このバグは明確なエラー停止になります。つまりランニング中にエラーメッセージを出力
し、赤LEDの点滅状態となります。インタプリタは停止となりますので、演算を誤ったり、
暴走の原因にはなりません。

※点配列は以下のように並んでいます。
X(1)-> Y(1) ->Z(1) ->U(1) ->X(2) ->Y(2) ->Z(2) ->U(2) ->X(3) ....

【改版】
MPC-684 REV-3.80zwで修正しました。
(MPC-68Kは改版無し)

●060 MBK-68 7セグメントの表示内容                                              001226 

MBK-68の7セグメントには、各タスクの文番号、MBK I/F バージョン、通信エラー数
を表示します。
初期表示はタスク0の文番号表示で、SW1またはSW2を押す毎に切り替わります。
SW3は表示の一時停止です。

    ---------  SW2 ---------    ---------    ---------    --------- 
*→| task23  |−→| task0   |→| Version |→| BCC Err |→| Cmnd Err|→*
*←|         |←−|(Default)|←|         |←| Er1xxxx |←| Er2xxxx |←*
    ---------  SW1 ---------    ---------    ---------    ---------

◆表示内容
  task      [nnxxxxx]
      nn(緑)はタスク番号、xxxxx(赤)は実行中の文番号です。
      (表示するタスクはMPC-684でも0〜23です。)
  Version   [--02xxx]    
      1000番台はGPメモリーリンク、2000番台はGP NEWNET-FPプロトコル
      xxxは改版番号。
  BCC Err   [Er1xxxx]    
      10000番台はBCC(ブロックチェックコード=水平パリティーチェック)エラーです。
      ノイズ混入、配線不良による文字化けなどで発生します。
  Cmnd Err  [Er2xxxx]
      20000番台は不正コマンド受信エラーです。
      MBKが予期せぬコマンドを受信した場合に発生します。

●059 MOP-096とMIP-096のコネクタの違い                                          001225 010124 

【Q】
@どうして、2社のコネクタにしているか?
AMIP-096は3M、MOP-096はヒロセだが、圧接ケーブル用のコネクタはヒロセ製でいいのか?


【A】
@色を違えてMOPとMIPが識別できるようにしています。MOPは黒、MIPは灰色です。

Aどちらも勘合しますが、稀に、3Mのハウジングにヒロセの圧接フラット用を使うと接触
不良になることがあるようです。ヒロセの圧接は接触面が1面しかないためと思われます。
両者共通で使うにはJAEがよさそうです。JAEの圧接は2面のコンタクトでピンを挟む構造
となっています。
しかし、本来コネクタはオスメス同一メーカーを使うもので、異メーカー間での保証は無いそうです。
実装コネクタに関してはMIP-096、MOP-096マニュアルをご覧下さい。
●058 デジタルGP-2400イーサネットの実験                                         001222 

GP-2400のイーサネットを使ってMPC-684のデータにアクセス出来るかどうかという基礎的
な実験です。

68K-B01 デジタルGPシリーズイーサネット実験.pdf
●057 新旧MPCとMOP-048の適合について                                            001221 

MOP-048には基板型式 CEP-013(8255使用)、CEP-013A(8255使用)とCEP-013B(8255不使用)
があります。
フラッシュROM版以降のMPC-68KとMPC-684ではどれでも使えますが、EP-ROMのMPC-68K
にCEP-013Bは使えません。

CPU基板型式                                     対応MOP-048
CEP-011? (MPC-68K(FSC) EP-ROMタイプ)            CEP-013、CEP-013A
CEP-041? (MPC-68K フラッシュROMタイプ 現行版)   全MOP-048が使用可能
CEP-054? (MPC-684 フラッシュROMタイプ 現行版)        〃

入力ボード MIP-048にも8255使用タイプ(CEP-012、CEP-012A)と8255不使用(CEP-012B)タ
イプがありますが、こちらにはCPUの不適合はありません。
●056 MPC-684 P_SVコマンドで保存される点データ数                                001220 

MPC-684のP_SVコマンドでフラッシュROMに保存される点データは、フラッシュROM容量の
都合でP(1)〜P(5000)です。

●055 MPC-684のSV_Mをロングワードで使用したとき、飛ばされた点配列の内容は?          001220 

SV_MコマンドはMBKメモリ(GPデータエリア)からMPC点配列(X(n)〜Z(n))へ一括コピーします。
SV_Mをロングワード(32ビット長)で指定するとコピー先の点配列へは1つおきにデータが
入ります。そのとき、飛ばされた点配列のデータは変更されません。

SV_M X(9019) 19 3 4
X(9019)←──────DT20(上位ワード)・DT19(下位ワード)
X(9020)=不変
X(9021)←──────DT22(上位ワード)・DT21(下位ワード)
X(9022)=不変
X(9023)←──────DT24(上位ワード)・DT23(下位ワード)
X(9024)=不変

●054 MPC-684の今後                                                             001219 

【Q】
MPC-684のライフタイムとその保証は?
【A】
684は68Kからの継承互換品ですでに8年くらい互換性を保ちつつ進化しているところです。
816については当初のZ版からそろそろ15年になろうとしています。
どこかの大手シーケンサメーカの自社互換性よりはよほどマシだと自負していますが・・
ただ、保証ということになると、このところの半導体部品の製造中止が多く、なんとも申
し上げかねます。
MPC-684ではモトローラのMC68340というCPUを使っていますが、実のところ68000系で生き
残った数少ないCPUです。
ただ、基幹半導体は常に一年から二年程度のストックを持ち、たとえ製造中止になっても、
一年程度でなんとか準互換品をつくるということで鋭意努力継続しています。

【Q】
過去に816や68KなどCPUの生産中止にもかかわらず上位互換のボードを出しているが、
今後684に同じ事態が起きた時も上位互換路線を続けられるか?

【A】
既に多くのお客様で継続採用して頂いている現状から、製造中止で全く違うものを作るな
どということはできません。このMPC-68K(FSC)の基本仕様は等分不滅のデファクトです。

【Q】
MPC-684が発売されて約1年になるがこれまでにどの程度の販売実績があるのか?
【A】
稼動ベースの数量の上ではまだ150程度ですが、今のところフィールドで故障した話はあ
りませんので、製品としては安定していると考えています。

【Q】
パルス発生にはMPG-405とMPG-314の選択のどっちを選べば良いか?
【A】
新規設計の装置でMPG-405のTRコマンド使用を前提とされていなければ、MPG-314を選択し
ていただいたほうが良いと思います。
314は405より安価ですし、かなり互換性もあります。また、守備範囲が広いという特徴も
あります。
MPG-405に使用しているICもつい先日、製造中止の宣言が出ました。この夏に確認したら
そんな話はないということだったのですが、裏切られてしまいました。
●053 MPCの初期化ってなに?                                                         001208 

通常(弊社では)「MPCの初期化」というと、MPCINITとERASEコマンドを実行してSRAMと
FROM(フラッシュROM)内のデータを出荷状態に戻すことをいいます。プログラム・点デー
タ・パラメータが全部消えます。
ボード搬送時や取り扱い時に静電気の印加などでSRAMデータが化けることがあります。
ボードを装置に実装して電源を入れたら、プログラムを入れる前に初期化して下さい。
また、システムデータをバージョンアップしたときも初期化して下さい。

これに対して、「変数やMPGの初期化」というとちょっと違います。
変数の初期化といえば、変数を0やそれ以外の所定の数値に設定することで、MPGの初期化
といえば、加減速テーブルや最高速などの動作条件を設定することを言います。(例外も
ありますが..)これらはダイレクトコマンドでも設定されますが、必ずプログラムにも
記述して下さい。

●052 プログラムを作成するとき文番号は付けなければならないのか?                    001208 

ターミナルソフト「FTMW32.EXE」(黄色の三角形のアイコン)を使い、オンラインで直接MPC
内のプログラムを編集する場合は文番号を付けます。文番号をつけないとダイレクトコマ
ンドとして扱われます。
既存プログラムの行間に挿入するのに、Ctrl+Nとすると自動的に番号が入ります

    100 ON 0
    110 OFF 0
     ↓ 110の上にカーソルを置き、Ctrl+Nする
    100 ON 0
    105        ←文番号を付けて1行挿入
    110 OFF 0

外部エディタでプログラミングするのには文番号は要りません。FTMW32でMPCに読み込ん
だ後自動生成されます。
●051 MPC-684の変数は電源を切ったらどうなる?                                       001207 

MPCはダイレクトコマンド操作時やプログラム実行時には、プログラム・変数・点データ・
コマンドパラメータなどのデータ全てをバッテリバックアップSRAMで扱います。
電源を切ってもそれらのデータは消えませんが、MPC-684は電源投入時にFROM(フラッシュ
ROM)に書かれているプログラム・変数・コマンドパラメータをSRAMに戻します。これらの
データはプログラム編集時の「RUN」によって書き込まれたものなので、電源投入のたび
に過去に戻ってしまう、ということになります。
しかし、点データだけはFROM読み書きを行わないのでバックアップ変数として使用するこ
とができます。
ただし、MPC-684の「RAMモード」ではFROMへのアクセスが無効となり、プログラムも含め
て全てのデータがSRAMだけで扱われます。これは、旧MPC-68Kの互換とデバッグ時の時間
短縮(書き込みメッセージが出ない)のためのモードで、通常稼動にはお勧めできません。
ノイズなどでSRAMのデータがダメージを受けるとプログラム自体が動作しなくなることが
あります。RAMモードでデバッグした後はROMモードに戻してRUNして下さい。
(参照コマンド RAM、ROM)

MPC-816ではFROMに読み書きされるのはプログラムだけなので、変数・点データどちらも
バックアップ変数として使うことができます。

また、変数はパソコンに保存できませんが、点データはFTMでファイルとして保存するこ
とができますし、配列変数としても使用できます。

●050 MPG-314 各軸-OUT4、OUT5の出力方法                                             001122 020228

J2,J4の各軸-OUT4,OUT5の主目的はカウンタ比較結果の出力です。
例えば HOUT &H80+4 (X_A;NOP,3) とすると
    OUT4:論理/実位置カウンタがCOMP+レジスタより大きいときHiレベルに、小さいときLowレベルになります。
    OUT5:論理/実位置カウンタがCOMP-レジスタより大きいときHiレベルに、小さいときLowレベルになります。

これらポートは次のように用いると汎用出力としても使用できます。
論理は0がON、1がOFFとなります。パラレル操作のみです。

    HOUT &h304 (X_A;NOP,3)    /* X-OUT4(J2-17)=OFF  X-OUT5(J2-18)=OFF
    HOUT &h204 (X_A;NOP,3)    /* X-OUT4(J2-17)=ON   X-OUT5(J2-18)=OFF
    HOUT &h104 (X_A;NOP,3)    /* X-OUT4(J2-17)=OFF  X-OUT5(J2-18)=ON
    HOUT &h004 (X_A;NOP,3)    /* X-OUT4(J2-17)=ON   X-OUT5(J2-18)=ON
        /~~~~~ /~~~~~~~~~
 出力データ  X軸WR3設定
      |
(下位の'4'はWR3 D2(SACC)を1にするため)

注意:
SACCはS字加減速を有効にするためのビットです。ACCEL設定時にこのビットもS字の有無に
よって設定されます。
このため、この出力ポートの操作で下位バイトの値を04とするか00とするかはS字の要・
不要にしたがって設定してください。xx04の場合がS字有効です。

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

これらの操作はMCX314のレジスタWR3を操作するものです。
以下はMCX314リードライトレジスタ WR3 (モードレジスタ3)の概要です。(MCX314取扱説明書から抜粋)

   |                 H                     |                  L                        |
   | D15 D14 D13 D12 |  D11  D10  D9   D8  |   D7  D6 D5  D4  |  D3    D2   D1    D0   |
WR3|  0   0   0   0  | OUT7 OUT6 OUT5 OUT4 | OUTSL 0  0  EXOP1| EXOP0 SACC DSNDE MANLD |

D0      加減速定量ドライブにおける減速を自動減速にするか、マニュアル減速にするかを設定します。
            0:自動減速 1:マニュアル減速
D1      加減速ドライブの減速時の減速度を加速度の値にするか、個別の値にするかを設定します。
            0:加速度の値を使用 1:減速度の値を使用
D2      直線加減速/S字加減速の設定をします。
            0:直線加減速 1:S字加減速
D3,4    外部入力信号によるドライブ操作を設定します。
D7      出力信号OUT7〜4を汎用出力として使用するか、ドライブ状態を出力するかの選択をします
            0:汎用出力として使用します。D11〜D8の内容がOUT7〜4端子に出力されます。
            1:OUT7〜4にドライブ状態を出力します。
                OUT4/CMPP:論理/実位置カウンタがCOMP+レジスタより大きいときHiレベルに、小さいときLowレベルになります。
                OUT5/CMPM:論理/実位置カウンタがCOMP-レジスタより大きいときHiレベルに、小さいときLowレベルになります。
                OUT6/ASND:ドライブ命令実行中、加速状態になると、Hiレベルになります。
                OUT7/DSND:ドライブ命令実行中、減速状態になると、Hiレベルになります。
D11〜8  出力信号OUT7〜4の汎用出力として使用するときの値を設定します。
        O:Lowレベル出力 1:Hiレベル出力

※MPG-314ではD11,10(OUT7,6)はコネクタへは出ていません。
  D2は1に設定して下さい(MPG-314はS字加減速がデフォルト)。
●049 外部機器の入力とMOP出力の接続                                                 001122 

【Q】
接続機器の入力回路が、内部12V→電流制限抵抗→フォトカプラ→IN端子となっています。
MOPの駆動電源が24Vの場合、MOP出力ピンを相手の入力端子と直結しても問題ないですか。
それともフォトカプラを介在させるべきでしょうか?

【A】
MOPの出力はオープンコレクタなのでそのまま接続できます。オープンコレクタは相手か
らみるとショートとオープンしかありません。

昔のMPC−816ではサージ抜きダイオードがコレクタからDC24に向かって接続さ
れていて、MPCの電源を切ると外部機器からはオン状態に見えるという問題もありまし
たが、現在ではそうした寄生ダイオードは使用しないことにしているので、電源OFFでの
出力はハイインピーダンス(OFF状態)になります。

なおMOPはMPCとは関係の無い(別電源)DC12〜24Vで使用できます。5Vでもノイズマージン
を配慮してもらえれば駆動できるように設計してあります。

●048 潟fジタル GP2400 CFカード〜MPC-684点配列間のデータ転送                       001113 001214 

/**********************************************************************
/*甘゙ジタル GP2400 CFカード〜点配列間の多数データ転送のサンプルプログラムです。
/* MBKのデータエリアにはサイズ的な制約があるのでCFカードのデータをブロックに分けています。
/* 今回は100データ/ブロックで3ブロックのデータ転送を行いました。
/* GPの設定、ファイリングデータの編集についてはApplication Note 68K-006 参照。
/*
/* このプログラムを実行するには、下記の様にプロジェクトマネージャを設定して下さい。
/* また、ファイリングデータを下記の書式で作成してCFカードに転送し、GPに装着してください。
/* CFカード内のファイリングデータと書式が合致しないと動作しません。
/*
/*                                           CFTEST2.F68 001113 001214
/**********************************************************************
/* ●GPコントロールアドレス
/*   DT20 CF->SRAM トリガ
/*   DT21 SRAM->MBK モード
/*   DT22 SRAM->MBK ファイル番号
/*   DT23 SRAM->MBK ブロック番号
/*   DT24 SRAM->CF モード
/*   DT25 SRAM->CF ファイル番号
/*
/* ●●プロジェクトマネージャ(V4.0)の設定 ([〆]=チェックboxをチェック)
/*
/* ●メニュー 「画面/設定」「ファイリングデータ」「ファイリング動作設定..」
/*   [〆] ファイリング動作を行う
/*   [  ] 複数フォルダを使用する
/*
/*   転送準備(ファイリングデータ → SRAM)
/*       コントロールワードアドレス     DT0020
/*       書込み完了ビットアドレス X0000
/*
/*   転送設定(SRAM ←→ PLC)
/*       [〆] 転送をPCよりコントロール
/*       コントロールワードアドレス     DT0021
/*       書込み完了ビットアドレス X0001
/*
/* ●ボタン 「GPシステムの設定」「拡張機能設定」
/*   CFカードデータ保存設定
/*       [〆] データ保存
/*       コントロールワードアドレス     DT0024
/*
/* ●ファイリングデータ書式
/*      ファイル番号        1
/*      ブロック数          3
/*      データ数            100
/*      格納先頭アドレス    DT600
/*      データ形式          16ビット
/**********************************************************************
/*【メモリイメージ】
/*                GP2400                             MPC
/* |<--------------------------------->|<----------------------------->|
/*                           SRAM                      MPC-684点配列
/*                +---     --------                       --------  ---
/*                |       | data0  |                     | X(100) |  ↑
/*                |       | data1  |                     |   :    |  |
/*                |  ブロック|   :    |                     |   :    |1ブロック分
/*                |    0  |   :    |                     |   :    |  |
/*                |       | data98 |    MBK-68データエリア    |   :    |  |
/*                |       | data99 |       1ブロック分      | X(199) |  ↓
/*                |        --------        -------       |--------- ---
/*    ------      |       | data0  |      | DT600 |      | X(200) |
/*   |      |     |       | data1  |      | DT601 | SV_M |   :    |
/*   |  CF  | --->|  ブロック|   :    | ---> |   :   | ---> |   :    |
/*   | CARD | <---|    1  |   :    | <--- |   :   | <--- |   :    |
/*   |      |     |       | data98 |      | DT698 | LD_M |   :    |
/*    ------      |       | data99 |      | DT699 |      | X(299) |
/*                |        --------        -------       |--------|
/*                |       | data0  |                     | X(300) |
/*                |       | data1  |                     |   :    |
/*                |  ブロック|   :    |                     |   :    |
/*                |    2  |   :    |                     |   :    |
/*                |       | data98 |                     |   :    |
/*                |       | data99 |                     | X(399) |
/*                +---     --------                       --------
/*    CF〜SRAM間は                   GP〜点配列間はMBKデータエリアを経由して
/*    全ブロック一括で転送              1ブロックずつ(100データ)転送
/*
/**********************************************************************
/*
*INIT
  FOR I=20 TO 25
    S_MBK 0 I
  NEXT I
  OUT 0 70000
  BN=0
*MAIN
  PR "1 CF->MBK"
  PR "2 MBK->CF"
  INPUT A
  IF A=1 THEN : GOTO *CF2MBK : END_IF /* CFカードからMPC X()へ転送
  IF A=2 THEN : GOTO *MBK2CF : END_IF /* MPC X()からCFカードへ転送
  GOTO *MAIN
*CF2MBK
  S_MBK &H101 20      /* CF CARDからGP バックアップSRAMへファイリングデータを転送
  WAIT SW(70000)=1    /* 転送完了待ち
  OFF 70000           /* 完了ビット リセット
  S_MBK 0 20          /* トリガ リセット
  PR "CF -> SRAM copy"
  '
  FOR BN=0 TO 2       /* BN = ブロック番号
    S_MBK 1 22        /* ファイル番号
    S_MBK BN 23       /* ブロック番号
    S_MBK &H1 21      /* GP バックアップSRAMからMBKへファイリングデータを転送
    WAIT SW(70001)=1  /* 書き込み完了
    OFF 70001         /* 完了ビット リセット
    S_MBK 0 21        /* トリガ リセット
    TIME 200          /* 次の転送までにトリガOFF時間 150msec以上必要
    SV_M X(BN+1)*100 600 100  /* MBKメモリ->X配列へコピー
    PR "block" BN "copy"
  NEXT BN
  END
*MBK2CF
  /********************************************************************
  /* 画面転送直後は1回CFカードからSRAMへ転送しておかないとMBKからSRAMへ転送できない。
  /* おそらく、GPのSRAM上にファイリングデータのイメージが無いと作業が出来ないのでは..
  /* 2回以降は不要だが、害は無さそうなので入れておく。
  S_MBK &H101 20      /* CF CARDからGP バックアップSRAMへファイリングデータを転送
  WAIT SW(70000)=1    /* 転送完了待ち
  OFF 70000           /* 完了ビット リセット
  /********************************************************************
  FOR BN=0 TO 2
    LD_M X((BN+1)*100) 600 100  /* X配列->MBKメモリへコピー
    S_MBK 1 22        /* ファイル番号
    S_MBK BN 23       /* ブロック番号
    S_MBK &H101 21    /* MBK->GP バックアップSRAM へファイリングデータを転送
    WAIT SW(70001)=1  /* 書き込み完了
    OFF 70001         /* 完了ビット リセット
    S_MBK 0 21        /* トリガ リセット
    TIME 200          /* 次の転送までにトリガOFF時間 150msec以上必要
    PR "block" BN "copy"
  NEXT BN
  '
  S_MBK 1 25          /* ファイル番号 (ファイル内の全ブロックを転送)
  S_MBK 1 24          /* GP バックアップSRAM -> CF CARDへ転送
  WAIT MBK(24)=0      /* 完了待ち
  PRINT "SRAM->CF copy"
  END
  '***************
*CREATE_DAT           /* 確認用ダミーデータ作成
  FOR I=100 TO 399
    X(I)=I
  NEXT I
  END
●047 MPG−314 ALM入力について                                             001101 

MPG-314 コネクタJ2の ALM(4,8,12,16番ピン)入力には二通りの方法があります。

@HPTで読む
#PRX HPT(0)
 00100000                   /* X-ALM(4番ピン)がON状態

HPT(0)は各軸ALM入力をいつでも読むことができます。
単なる入力(標準I/Oの代用)として使うならこれでもOK。

ARRで読む
#INSET_314 X_A ALM_ON       /* X軸 ALMをONで有効にする
#PRX RR(X_A,ALM@)
 0010                       /* X-ALM(4番ピン)がON状態

パルス発生とALM入力を連動させるにはINSET_314で有効にしなければなりません。
INSET_314でALMを有効にするとRRで読むことができるようになります。

●046 MPG−314 RRのビット位置                                               001101 

コネクタ J2 X-LMTM(2番ピン)、X−ALM(4番ピン)がON状態のときRRでは下記の様になります。

#INSET_314 X_A ALM_ON
#PRX RR(X_A,ALM@|LMTP@|LMTM@)
 0018

ここで表されるビット位置は次のようになっています。
  (上位) |ビット| &H20|  10 |   8  |  4   |   2  |   1  | (下位)
         |信号  | EMG | ALM | LMTM | LMTP |   0  |   0  |
0018なら           0     1     1      0       0      0

●045 MPG−314で互換コマンドのSTOPは使えるか                              001031 

MPG-314専用コマンドであるMOVSやRMVSには互換STOPは使えません。
互換コマンドはMPG-68K、MPG-405用のプログラムのためにあります。
314専用コマンドに対してのFEEDやSTOPなどは拡張ステートメントで対応します。

下のプログラムは互換STOPのようにタスク0からタスク*XA,*YAのパルス発生を停止していますが、
MOVSは実行後すぐに次のステップに以降するので、タスク *UAのように同一タスクで処理するほうが
判りやす場合もあります。

  PG &H400
  PG &H400 1
  PG &H400 2
  ACCEL X_A|Y_A 5000
  /*FEED 0            /* 軸指定しない場合は0~64 各軸共通
  FEED X_A 0
  FEED Y_A 255      /* 軸指定した場合は設定範囲は0~255
  STPS 0 0 VOID 0
  PRINT P(0)
  FORK 1,*XA
  FORK 2,*YA
  FORK 3,*UA
  INPUT "HIT ENTER YKEY" A
  /*STOP 2 1        /* MOVSには互換のSTOPは使えない
  STOP X_A STP_I
  TIME 500
  INPUT "HIT ENTER YKEY" A
  STOP Y_A STP_I
  TIME 500
  END
*XA
  MOVS X_A 100000   /* 実行後すぐ次のコマンドへ
  WAIT RR(X_A)=0    /* 停止待ち
  PR "PULSE STOP X"
  END
*YA
  MOVS Y_A 100000   /* 実行後すぐ次のコマンドへ
  WAIT RR(Y_A)=0    /* 停止待ち
  PR "PULSE STOP Y"
  END
*UA
  PG &H400
  ACCEL U_A 1000
  FEED U_A 0
  MOVS U_A 100000   /* 実行後すぐ次のコマンドへ
  WAIT SW(192)=1
  STOP U_A STP_I
  PR "PULSE STOP U"
  END

●044 MPG−314のリミット検出                                                  001031 

MPG−314のリミット検出はHPT()ではなく、RR()で行います。

#PG &H400
#INSET_314 X_A LMT_ON       /*リミットonで検出
#PRX RR(X_A,LMTM@)          /*コネクタJ2 2番ピン入力
 0008                       /*リミットはONしている
#PRX RR(X_A,LMTP@)          /*コネクタJ2 3番ピン入力
 0004                       /*リミットはONしている
#PRX RR(X_A,LMTP@|LMTM@)    /*コネクタJ2 2,3番ピン入力
 000C                       /*リミットは両方ONしている

※表示されるビットとコネクタピン番号は整合しません。

●043 MPG−314の原点復帰例                                                    001019 

/*********************************************************
/* MPG-314 原点復帰
/*  第1段 NEAR ORGまで高速で原点復帰 (NEAR ORGはNCのリミットSW)
/*  第2段 Z相がオンになるまでゆっくり原点復帰
/*********************************************************
  PG &H400
  ACCEL 300000
  FEED X_A 0
DO
  IF HPT(0)&&H1=0 THEN
    RMOV 50000 0 0      /* CW退避移動
  END_IF
  HOME X_A IN0_OFF -200 /* XS1(NEAR ORG)がOFFになるまでCCW FEED=200
  WAIT RR(X_A)=0
  HOME X_A -1000 IN1_ON /* XS2(Z相)がオンになるまでCCW 1000pps
  WAIT RR(X_A)=0
  STPS 0 0 0 0          /* 現在点を0にする
  PR P(0)
  PRSET_ACCEL X_A       /* ACCELパラメータ復帰、停止条件クリア
  FEED X_A 0            /* FEED再設定
  TIME 1000
  MOVE 100000 0 0
  TIME 1000
LOOP

●042 MPC−684 挙動不審                                                       001017 

【症状】
IOが勝手にON,メモリデータ消失など

【原因】
コプロ挿入不良

【補記】
概ね動作するが異常な動作がありコプロを搭載している場合、
コプロの挿入確認(再挿入)をお願いします。
PLCCソケットは正しく挿入されないと接触面の絶縁破壊が中途半端となり
時間経過後接触不良となる場合があります。
●041 MPG−314パルス出力実測 2つ                                             001005 

S字加減速移動

非対称加減速移動
●040 大きなプログラムをLOADしたらFTMWがフリーズ                                000913 

FTMWはLOADプロセスの最後にRENUMを行います。
この時MPC-684は文番号で60000を超えると自動的に5間隔にしていましたが
それでも60000に収まらない大きなプログラムでは結果的にFTMWがLOADの最後でフリーズ
してしまいます。
MPC-684を改版して文番号間隔を5->4->3とプログラムサイズに合わせて自動変更するよう
にしました。

MPC-684 ADVFSC(r)eREV-3.80zm
 BASIC like + multi tasking
 Created by ACCEL Co.'~2000
●039 四捨五入                                                                      000905 

MPCには一発で演算結果を四捨五入できるコマンド・関数はありません。
下記はMPC−684で除算して1の位を四捨五入する例です。
(!付きの変数はローカル変数です)

/* MPC-684 一桁目の四捨五入
  GOSUB *round 10 4
  _RET_VAL ANS
  PRINT ANS
  END
*round
  _VAR round0! round1!            /* round0! = 割られる数 round1! = 割る数
  IF round0!*10/round1!%10>4 THEN /* 桁上げして割り、1の位を調べる
    round0!=round0!/round1!+1
  ELSE
    round0!=round0!/round1!
  END_IF
  RETURN round0!                  /* round0! = 戻り値
●038 「余分な引き数、或はパルス発生条件文に異常があります」エラー                  000830 

【Q】
MPC−68KにプログラムをLOADしてRUNしたら
    HOME &H2A 50 0 0 '原点復帰
という文で「余分な引き数、或はパルス発生条件文に異常があります」というメッセージ
が表示される。
構文、パラメータは間違っていない。
MPC−68KはRev−2.21。

【A】
原因はコメントです。
Rev−2.21は94頃のEP−ROMタイプのMPC−68K(FSC)で、
上記のように後ろにコメントを書くとエラーになるコマンドがあります。
現状で対応するにはコメントの前に:(コロン)を入れてマルチステートメント化します。
●037 RAMモード時にFIX(FROMへの書き込み)ができない                      000825 

【Q】
RAMモード時にFIXはできないか。
【A】
できませんm(_`_)m。
一旦ROMモードに戻ってからFIXして下さい。
●036 RSE()にMRS−402のチャンネルを指定すると戻り値は255              000825 

【Q】
RSE()関数にMRS-402のチャンネル(3~8)を指定すると戻り値が255になる。なぜ?
【A】
RSE()はMRSをサポートしていませんm(_"_)m。
●035 プログラムLOAD時のエラー行検索                                    000809 
FTMWはMPC−68K/684にプログラムをLOADするとき、
高速化のために文番号を付けていません。
LOAD中にシンタックスエラーがあった場合は番号と内容が表示されますが、
番号は送信行のカウントで、ソースの/*コメント行や空行はカウント外のため
エディタ上の行番号と一致せずエラー個所を見つけ難いことがあります。
そこでMPCエディタ Ver1.30に、LOAD時の番号と一致する行番号を表示する
モードをつけました。
プログラムを読み込んだ後、メニュー「その他」→「LOAD番号モード」をチェックしてください。
●034 MBK−68でシステムローダーが動作しない                            000801 
システムローダーでMBK−68のシステムデータを転送するのに、
ショートピンSP1を2−3ショートにするとパソコンのRS−232Cを直接接続できることがあります。
しかし、レベル的にはRS−232の規格外ですから使用できないパソコンもあります。
その場合はSP1は1−2ショートでRS−422/232コンバータを使って下さい。

2000年版68KユーザーズマニュアルP7−25ボード図下のSP1に関する記述は誤りで、
1−2ショートRS−422(出荷時)、3−2ショート RS−232 です。
●033 S−LINKのバンクナンバーはどうなってるの?                        000713 

MPC-SLINKのI/O番号は2000からです。
バンク番号も2000から8ビット単位です。

 | ON/SW|IN/OUT |
 | (BIT)|(BANK) |
 ---------------
 | 2000 |       |
 |   |  | 2000  |
 | 2007 |       |
 ---------------
 | 2008 |       |
 |   |  | 2001  |
 | 2015 |       |
 ---------------
 | 2016 |       |
 |   |  | 2002  |
 | 2023 |       |
 ---------------
 |  ↓  | ↓    |



●032[MPC-684]GOSUB、IF〜END_IFなどの入れ子の数とCASEの数                   000710 

◆GOSUB
GOSUBのネストには制限があります。
サプルーチンを呼ぶときにメモリのスタックエリアに戻り番地が積まれ、RETURNで下ろされます。
その数は各タスク約170個ずつです。
    10          i=0
    20      *sub
    30          i=i+1 : PRINT i
    40        GOSUB *sub
    50        GOTO *sub
    RUN
    1
    2
    (中略)
    170
    171
    #40     ・・・・・スタック・オーバーフロー 制御のネストが深すぎるか,
                  制御文の異常な使用法によるものです また_RET_VALが実行されていません。


◆DO〜LOOP,IF〜END_IF,FOR〜NEXT
これらはRUN時(プログラム整理中..の時)にラベル展開されます。そのためスタックを消費しませんから、
事実上制限はありません。しかし入れ子が深くなるとプログラムが難解になりますから注意して下さい。

    10          i=0 :   a=0
    20      *lp
    30        DO
    40            i=i+1 : PRINT i
    50          IF a==0 THEN
    60            GOTO *lp
    70          END_IF
    80        LOOP
    RUN
    1
    2
    (中略)
    1327
    1328
    (後略--限り無く続きます)

◆CASE
SELECT_CASEのCASEもIFと同様で、事実上制限はありません。

        (MPC-684 REV-3.80x現在)
●031 MPGにもSRAMバックアップのバッテリがあるが..                                000706 
【Q】
MPG-68KやMPG-405にもSRAMバックアップのバッテリが有るが何のため?
使用前にMPGに直接パラメータ設定など何かしなければならないのか?

【A】
MPGのSRAMにはACCELやSHOMコマンドなどのパラメータが保存されています。
こればティーチングモードやダイレクトコマンド実行時の便宜を計るための機能です。
MPGの使用前にボードに直接接続してパラメータを設定することはありません。(PGのアドレスだけです)
プログラムの実行に必要な設定を全てプログラム中に記述しておけばMPGのバッテリも不要です。
その逆に、ダイレクトコマンドで設定しただけのパラメータに依存しているプログラムの場合、
バッテリが抜けたりボードを乗せ替えたりした場合に正常に動作しなくなることがあります。
プログラムで使うパラメータは必ず記述するようにして下さい。
●030 PC−LNKの起動不具合                                              000620 

デジタル社のパネコンにPC−LNKを実装した際、
BIOSの起動時にPC−LNKが通信障害をおこすことがあります。

◆確認事例
◎機種
    デジタル BOX型FAコンピュータ PL-B900
    BIOS Award Modular v4.51PG
    OS   Windows NT4.0
    ※ このパネコンは BIOS SETUP 、 FEATURES SETUP 項で使用領域メモリーのマスクが必要です
    例) LNKをD000から使う場合 D0000-D3FFF Shadow を Enabled から Disabled に変更
◎症状
    電源を投入したすぐ後のBIOS起動時の「プッ」という音とともにPC-LNKが誤動作。
    LNK-048が全ONになったり赤LEDが点灯(通信不具合)になる。
◎原因
    BIOSが初期化時に不正なデータ(&HFF)を書いていると思われる。
◎確認方法
    LNKCHK.EXEを起動して、My lnk address($210) が1、Support address($211)が5であればOk。
    もしも255などの値で、mem_initボタンを押して正常復帰するようであれば該当。
    尚、起動タイミングによっては完全にフリーズすることがある。この場合はmem_initでは回復しないので
    再トライしてください。
◎対策
    起動から通信開始までを遅延(約13秒)したROMと交換。
    ROMは弊社技術係までご請求下さい。


●029 変数<->BCD 変換                                                       000614 

変数からBCDへ一発変換するコマンド・関数はありません。

/* 10進 解体
#A=123
#A3=A/100
#A=A-A3*100
#A2=A/10
#A=A-A2*10
#A1=A
#PRINT A3 A2 A1
1 2 3

/* 10進 合体
#A4=A3*100+A2*10+A1
#PRINT A4
123

/* 10進 文字変数にして解体
#A=789
#A$=STR$(A)
#STRCPY A$ A3$ 0 1
#STRCPY A$ A2$ 1 1
#STRCPY A$ A1$ 2 1
#PR A3$ " " A2$ " " A1$
7 8 9
#  PR VAL(A3$) VAL(A2$) VAL(A1$)
7 8 9

/* 16進 解体
#A=&H123
#A3=A&&HF00/&H100
#A2=A&&HF0/&H10
#A1=A&&HF
#PRINT A3 A2 A1
1 2 3

/* 16進 合体
#A4=A3*&H100+A2*&H10+A1
#PRX A4
 0123


●028 MPG-3202とオリエンタルモータ CFK,PMCシリーズのパルス信号の接続        000428 

CFK,PMCシリーズのパルス入力はC-MOSレベル入力です。
SGを共通にして、3202のパルス出力の負論理側(-)をドライバと接続します。

 MPG-3202                    MOTOR DRIVER

                               ---R-->5V 
CW(+) □1                     |  3.3KΩ
CW(-) □2 ---------------□---+----R--- CWパルス入力          
                                100Ω
                               ---R-->5V
CCW(+)□3                     |  3.3KΩ 
CCW(-)□4 ---------------□---+----R--- CCWパルス入力
                                  100Ω

SG    □25---------------□---信号入力用GND端子

              ==== ------□---+5V   
             | PS |              ロジック用電源入力 
              ==== ------□---GND
             
              ==== ------□---+24V 
             | PS |              モータ用駆動電源入力
              ==== ------□---GND

                          (参考:PMCシリーズの取り説)


●027 MPG-68KからMPG-405に交換したらPULSEコマンドが異常?            000407 

【 Q 】
PGボードをMPG-405に交換すると、PULSEコマンドのところが高速で動作します。(およそ4,5倍くらいか?)
なぜ?

【 A 】
MPG-68KとMPG-405のPULSEコマンドは仕様が異なります。
パラメータは3つで、スピードは周波数を設定します。
情報不足で申し訳ありませんでした。

_■書 式
PULSE axis acnt h
        axis 軸 1〜8 
           (1:x-cw 2:x-ccw 3:y-cw 4:y-ccw 5:u-cw 6:u-ccw 7:z-cw 8:z-ccw)
        acnt パルス数
        h パルス周波数

_■解 説
定速パルス発生です。hで指定された周波数でacntパルスをa
xisで指定された軸に出力します。
第3パラメーターには周波数を設定します。
デューティーは50%固定です。

           |<-1/h sec->|       
      _____       _____        
     |     |     |     |       
-----       -----       -----  


●026 684でDC5Vを外部から供給する場合                               000307 

MPS-324やBUSからDC5Vを供給する場合は、68Kと同じくF1(68KはJP1)を抜いてください。
この場合でもDC24V(J5)は給電して下さい。
システム構成が3ラックとなる場合はCPU、電源ボードは中央のラックに配置してください。

●025 WAIT A=1 などとするとタスク効率が悪くなる               000307 

WAITに変数を与えるとタスクの効率は悪くなります。
変数条件待ちのタスクが多いほど全体の効率は下がります。
これは、とくにバグというわけではなく、現在の仕様です。
基本的には変数の条件待ちはしないほうがよいです。
タスク間のインターロックにはメモリーI/Oを用います。
ただしこれは68Kでは効果的ですが、684ではもともと内部効率がよいので
それほどの効果はありません。
タスク効率が著しく低下するのは DO-LOOPで演算を繰り返実行するなどです。
    DO
       A=A+1            /*タイマ要素の無いDO LOOP
    LOOP


【実験PRG】
10          TASKC=1
20          A=0
30        FOR I=1 TO TASKC
40          FORK I *WAITTASK
50        NEXT I
60          SYSCLK=0
70        FOR I=1 TO 50000
80          ON 0
90        NEXT I
100       PRINT SYSCLK
110       END
120     *WAITTASK
130       WAIT A==1
140       END

【結果 SYSCLK数】
◆MPC-684 REV-3.70f

  130       WAIT A==1       のとき
  TASKC=1のとき
    746
  TASKC=23のとき
    853 
  
  130       WAIT SW(-1)==1  としたとき
  TASKC=1のとき
    745
  TASKC=23のとき
    822

◆MPC-68K REV-2.68j

  130       WAIT A==1       のとき
  TASKC=1のとき
    1398
  TASKC=23のとき
    2265
  
  130       WAIT SW(-1)==1  としたとき
  TASKC=1のとき
    1387
  TASKC=23のとき
    2011


●024 MPC-684 コプロを必要とするコマンド                            000222 

2000/2/22現在コプロで実行されるコマンドは下記のものです。
    AFFIN
    GETDG
    ATAN2
    TAN  
    SIN  
    COS  
    ATAN 
    不動小数点演算(整数インタプリタのため簡易方式)

※コプロ未搭載でこれらを実行するとシステムがサスペンドします。


●023 ACCELコマンド実行時間について                                 000218 

ACCELを実行するとPGコマンドで引当てられたMPGが加減速テーブルを作成します。
MPG-68Kの場合この加減速テーブルは内部ソフトの演算により作成され、
最高速や加減速域の違いで所要時間が変化します。

【 実測 】
10        PG &HE0
20        PUT &H15              /* FTMW32 STOP watch start
30        ACCEL 1000 10000 100
40        PUT &H16              /* FTMW32 STOP watch stop

30        ACCEL 5000 5000 100   のとき 約1.5sec
30        ACCEL 10000 10000 100 のとき 約3.1sec
30        ACCEL 1000 1000 100   のとき 約0.3sec
30        ACCEL 1000 10000 100  のとき 約3.1sec

※MPG-405はパルス発生ICのレジスタへ書き込む(加減速の演算はしない)ので瞬時に終了し、所要時間は一定です。

●022 MPG-405の拡張ACCELコマンド                               000216 

拡張ACCELコマンドは軸別に加減速レートを設定するときに使用します。
宣言は各軸毎に@拡張ACCELA標準ACCELの順に行います。
軸の順番は前後してもかまいません。(@XYAUBZが@ZAXYBUでもOK)

/* XY
ACCEL 0 &H41	/* 4倍
ACCEL 100000
/* U
ACCEL 0 &H02	/* 1倍
ACCEL 50000
/* Z
ACCEL 0 &H03    /* 1倍
ACCEL 25000

※全軸同一設定なら標準ACCELで400Kppsまで設定できます。
※「ユーザーズマニュアル'97」P6-9 ACCELの解説で「ACCEL 0 &H40  --X+Y軸に対して4倍に設定」
  とあるのは「ACCEL 0 &H41 --X+Y軸に対して4倍に設定」の誤りです。

●021 文字列変数の文字数                                            000216 

メモリー内には32個分の連続した文字列変数エリアがあり、1個あたり130文字分のメモリが割り当てられています。
しかし、文字格納時の文字数チェックは無いため、文字列を連結して130文字を超えてしまうと
次の文字列変数を侵食します。
例えば下記のように a$,b$,c$,d$,e$,f$,g$が連続してあります。(使われた順番に並びます)
30文字ずつ入ったa$からe$までを連結してf$に入れます。
すると20文字g$にはみ出してしまします。この場合でもf$は150文字の文字列変数として扱えます。
つまりg$の内容を無視すれば、f$は130*2文字の文字列変数として扱うことができます。

#vlist
・・現在定義されているラベル
・・現在定義されている定数
・・現在定義されている変数
 int    timer             int    SYSCLK            int    TASKN
 char*  time$             char*  date$             char*  a$
 char*  b$                char*  c$                char*  e$
 char*  f$                char*  g$                char*  d$
・・予約文字列(比較演算子・関数・配列ラベル)
==      >=      =>      <=      =<      <>      ><      SW
HSW     IN      HIN     PEEK    NOT     ABS     IOR     SWP
HEX$    CHR$    RSV     RLS     P_SW    P_IN    ASC     SQR
SQ      LEN     INP$#0  INP$#2  VAL     LOF     STR$    P_HSW
INPUT$  TASK    X       Y       Z       U       P       WS0
WS1     WIR     PEEK    HPT     BSY     PL1     PL2     PL3
PL4     ADR     RSE     MC      MCT     PGS     INP$#3  INP$#4
ZC      CMN     LCL     LNK     MX      MR      M_X     PEEKB
AR$     INP$#5  INP$#6  MBK     REG     REG3


#a$="12345678901234567890123456789!"
#b$="12345678901234567890123456789#"
#c$="12345678901234567890123456789$"
#d$="12345678901234567890123456789%"
#e$="12345678901234567890123456789&"
#
#f$=a$+b$+c$+d$+e$
#print f$		/* 実際には150文字入っていますがftmw32の都合で100文字しか表示できません。
12345678901234567890123456789!12345678901234567890123456789#12345678901234567890123456789$1234567890
#print g$		/* はみ出した20文字
1234567890123456789&
#

(確認バージョン MPC-68K ADVFSC(r)m REV-2.68g)

●020 MPC−68Kシリーズ 消費電流                                  000215 001208

<<消費電流 (内部5V)>>
  MPC-684  300mA(Hi FCLK時500mA)
  MPC-68K  250
  MPG-68K  150
  MPG-405  180
  MPG-314  200
  MOP-048   80
  MIP-048   30
  IOP-048   50
  MIP-096  100
  MOP-096  200
  MPG-3202 200
  MBK-68   200
  MRS-402   50
  MPC-LNK  150
  MPC-SLNK 200

MPC-68Kの供給能力は1A(自己含む)
これを超える場合はMPS-324使用


●019 MBK−68 T1のピン配                                        000215 
MPC-68K/684の5V供給能力は自己消費も含めて1Aまでです。
不足した場合は3A電源ボード「MPS-324」を用いますが、「MBK-68」を使用していれば
T1にパワーサプライから5Vを給電することが出来ます。 

      T1
    -------
   | 4 | 3 |     J3
   |---|---|    ____
   | 2 | 1 |   |oooo|
  =========================基板
   1 , 3 番ピン +DC(+5V)
   2 , 4 番ピン GND

コネクタ
メーカー   :モレックス
実装側     :5569-04A1
ケーブル側 :5557-04R


※基板シルク印刷のピン番は違うので注意して下さい

●018 HOMEコマンドを実行するとタスクスワップが遅くなる?              000201 
{MPC-684}

【 Q 】
HOMEコマンドを実行中のタスクがあるとタスクのスワップが遅くなり、
全体のパフォーマンスが下がるような気がする。
HOMEコマンド特有の何かがあるのか?

【 A 】
下記のprgで実験しましたがHOMEコマンドによるスワップ効率の低下はありません。
インタプリタの仕様からもHOMEコマンドによる効率の低下は考えられません。

HOME実行中に他のタスクで何かしていませんか?

【実験した684のバージョン】
MPC-684 ADVFSC(r)eREV-3.70b
 BASIC like + multi tasking
 Created by ACCEL Co.'91~99

【実験PRG基本形】
10        PG &HE0
20        ACCEL 10000
30        PG &HE0 1
40        FORK 1 *PG
50        PUT &H15              ←スタート
60        FOR I=0 TO 100000
70          ON 0
80        NEXT I
90        PUT &H16              ←ストップ
100       END
110     *PG
120      RMOV 10000000 0 0      ←上のFOR~LOOP中パルス発生持続
130      SHOM &H5 5000
140      HOME &H5 200 200 0     ←上のFOR~LOOP中パルス発生持続
150       END

RMOVを実行したとき
120      RMOV 10000000 0 0
130      'SHOM &H5 5000
140      'HOME &H5 200 200 0

約13.6sec

HOMEを実行したとき
120      'RMOV 10000000 0 0
130      SHOM &H5 5000
140      HOME &H5 200 200 0

約13.6sec

タスク起動無し
40        'FORK 1 *PG

約13.6sec

【後日談】
やはり、HOME時に裏タスクのDO〜LOOPで、インタプリタにとって重い仕事をしている。



●017 RUN後に"間"が空く                                          000201 
{MPC-684}
68KはRUN直後にメッセージを表示してから、プログラムの整理をしてFROMに書き込みます。
684はプログラムを整理した後メッセージを表示してFROMに書き込みます。
つまり整理と表示が逆になってしまい、"間"があきました。
バグといえばバグですが、実害は無いので、折を見て直します。



●016 MPC-68K プログラム・ポイント・配列変数のサイズ              000127 

◆MPC-68K
L model
    プログラム     :340Kbyte (1ステップ20バイトとして17000ステップ)
    ポイントデータ数 :5000個
    配列        :15配列 全5000個

M model (出荷時)
    プログラム     :230KByte (1ステップ20バイトとして11500ステップ)
    ポイントデータ数 :10000個
    配列        :15配列 全10000個

S model
    プログラム     :168KByte (1ステップ20バイトとして8400ステップ)
    ポイントデータ数 :200個
    配列        :15配列 全2000個


※EP-ROM時代はSモデルを標準としていましたが、現在はMモデルが出荷時状態です。
L,Sモデルへはシステムローダーで変更します。

◆MPC-684
(Rev-3.70c 00/02/23)
    プログラム     :500KByte (1ステップ20バイトとして25000ステップ)
    ポイントデータ数 :10000個
    配列        :15配列 全10000個


●015 MBKでGPの2ワード(32ビット)データを読み込む方法              000125 
MBKのIN()は通常1ワード読み込みです。
2ワードのデータは2回に分けて読み、上位を2バイトシフトします。
例えば、500と501の2ワードデータを読み込むには
(500〜501には1234567が入っているとすると)

HDAT=IN(50100)
LDAT=IN(50000)
DAT=HDAT*&H10000+LDAT
PRINT DAT
 1234567




●014 MPG-68K アドレス設定                                       000121 
 (SP2 OPEN,SP3 OPEN)
  SW2 SW1  PGアドレス
   E   0   &HE0  出荷時
   E   4   &HE4
   E   8   &HE8
   E   C   &HEC
   F   0   &HF0
   F   4   &HF4
   F   8   &HF8
   F   C   &HFC

 (SP2 SHORT,SP3 OPEN)
  SW2 SW1  PGアドレス
   E   0   &H100
   E   4   &H104
   E   8   &H108
   E   C   &H10C



●013 MPG-3202 ティーチングサンプルプログラム              000120 
{684}
/************************************************************
/*  MPC-684で拡張されたRSE(1)を使ったティーティング
/*-----------------------------------------------------------
/*  RSE(n)はRS-232Cポートのエラーを検出する関数ですが、
/*  n=1 のときはCH1(PRGポート)からの1キャラクタ入力となります。
/*   サポート MPC-684 ADVFSC(r)eREV-3.70c (000120)
/************************************************************
*__BEGIN
        GOSUB *GP_SET
        DO
                GETCHR=RSE(1)
                SELECT_CASE GETCHR
                        CASE &H58: GOSUB *XCW                   /* X key
                        CASE &H78: GOSUB *XCCW                  /* x key
                        CASE &H51:                              /* Q key
                        CASE &H71: PRINT "おしまい " : END      /* q key
                        CASE_ELSE : PRINT "invalid data"
                END_SELECT
        LOOP
*XCW
        ST_REG &H101 10         /*出力パルス数
        CMND &H1A0              /*動作完了フラグリセット
        CMND &H102              /*定速インデックス駆動(+)実行
        GOSUB *WAIT_CMP
        RETURN
*XCCW
        ST_REG &H101 10         /*出力パルス数
        CMND &H1A0              /*動作完了フラグリセット
        CMND &H103              /*定速インデックス駆動(-)実行
        GOSUB *WAIT_CMP
        RETURN
*GP_SET
        ST_REG &H100 250        /*周波数倍率
        ST_REG &H103 100        /*起動周波数
        ST_REG &H152 1          /*カウンタA=内部発振パルスカウント
        CMND &H150              /*カウンタA リセット
        RETURN
*WAIT_CMP
        WAIT REG(-1)=&H20       /* 動作完了待ち
        PRINT REG3(&H121)       /* カウンタA 表示
        WHILE LOF(1)<>0
                dummy=RSE(1)
        WEND
        RETURN
*__END



●012 システムローダーが動かない                            000120 
{684}
ボクのDESK TOP PCでシステムローダーが「MPCの電源が入りました」状態のままフリーズ。
【 原因 】
MPC-684のシステムローダーのボーレートは19200bps。
PC RS-232Cポート → 自作中継ケーブル → D-SUB25雄雌変換アダブタ
→RS-232C分配器 → MPC prgケーブル → MPC-684
という接続で信号が減衰し 19200bps でNG。
それに加えて自作中継ケーブルのバンダ付けが良くなかった。
 (´o`; トホ



●011 LOAD時間比較                                          000119 
約8300行(約260Kバイト)のプログラムを読み込んだ場合
    68K  9600bps 816sec
    68K 19200bps 740sec

    684  9600bps 508sec
    684 19200bps 422sec
    684 38400bps 385sec ※

※ケーブル等の条件により文字化けの可能性が高くなります。
実用範囲は19200まででしょう。



●010 クロックスピード変更コマンド                                  000119 

<<FCLK>>システム
・・{MPC-684}クロックスピード変更
FCLK n
   n:変数、定数

   nの値  クロック(MHz)
   -5     11.53  MPC-68K相当
   -4     12.58
   -3     13.63
   -2     14.64
   -1     15.73
    0     16.78
    1     17.82
    2     18.87
    3     19.92
    4     20.97
    5     22.02  デフォルト
    6     23.06  要クーリング
    7     24.12  要クーリング
	***
MPC-684のクロックスピード変更。
MPC-68Kの実行速度に依存する
タイミングがある、などの場合は
クロックスピードを調整してください。
電源OFFで初期状態に戻ります。




●009 プログラムポートのボーレート変更                            000119 
{MPC-684}
   -----------------------
  |       |  SP7  |  SP8  |
   -----------------------
  | 9600  | OPEN  | OPEN  |
  | 19200 | SHORT | OPEN  |
  | 38400 | OPEN  | SHORT |
   -----------------------
   ※出荷時は9600bps



●008 MPC-68K〜デジタル社GP 通信サンプル
メモリリンクプロトコルのチェックサム付き拡張アスキーモードの通信サンプルです。
アスキー互換モードは通信エラーのチェックができません。
チェックサムを確認することにより信頼性が向上します。

【GPの設定 (GP377R-TC)】
  初期設定→I/Oの設定→通信の設定
    伝送速度             9600
    データ長/ストップビット   8/1
    パリティビット       無し
    制御方式             X制御
    通信方式             RS-232C
  動作環境の設定→モード選択
    通信プロトコル       拡張
  動作環境の設定→拡張モード設定
    通信形式             1:1
    通信形式             アスキー
    ETX,チェックサム  有
    ターミネータ CR
    (次頁)
    ACK               有
    NAK               有

【PRG】
*INIT
        CNFG#0 "9600b8pns1NONE"
*MAIN
        DO
                FOR DAT=0 TO &HF
                        ADR=600
                        GOSUB *GP_WRITE
                        /*ADR=500
                        GOSUB *GP_READ
                        IF ANS<>DAT THEN
                                PRINT "DATA CHECK ERROR"
                        ELSE
                                OUT ANS 0
                        END_IF
                NEXT DAT
        LOOP

        END
*GP_WRITE                                       /* GPへ書き込み
        ADR$=HEX$(ADR)                          /* アドレスデータを作成
        FOR I=3 TO LEN(ADR$) STEP -1
                ADR$="0"+ADR$
        NEXT I
        DAT$=HEX$(DAT)                          /* 書き込みデータ作成
        FOR I=3 TO LEN(DAT$) STEP -1
                DAT$="0"+DAT$
        NEXT I
        COM$=CHR$(&H1B)+"W"
        COM$=COM$+ADR$+"0001"+DAT$              /* 0001はデータ数
        '
        CHKSUM=0                                /* チェックサムの計算
        FOR STRCONT=0 TO LEN(COM$)-1
                STRCPY COM$ TMP$ STRCONT 1
                CHKSUM=CHKSUM+ASC(TMP$)
        NEXT STRCONT
        CHKSUM=CHKSUM&&HFF
        CHK$=HEX$(CHKSUM)
        IF LEN(CHK$)=1 THEN                     /*チェックサムが1桁なら0を付加
                CHK$="0"+CHK$
        END_IF
        'PRINT "CheckSum " HEX$(CHKSUM)
        '
        COM$=COM$+CHK$+"\r"
        PRINT#0 COM$
        WAIT LOF(0)>0
        TMP$=INP$#0(1)
        SELECT_CASE ASC(TMP$)
                CASE &H06
                        'PRINT "ok"
                CASE &H15
                        PRINT "error"
                CASE_ELSE
                        PRINT "unknown"
        END_SELECT
        GOSUB *RS0_BUFCLR
        RETURN
*GP_READ                                        /* GPから読み込み
        ADR$=HEX$(ADR)                          /* アドレスデータを作成
        FOR I=3 TO LEN(ADR$) STEP -1
                ADR$="0"+ADR$
        NEXT I
        COM$=CHR$(&H1B)+"R"
        COM$=COM$+ADR$+"0001"                   /* 0001はデータ数
        '
        CHKSUM=0                                /* チェックサムの計算
        FOR STRCONT=0 TO LEN(COM$)-1
                STRCPY COM$ TMP$ STRCONT 1
                CHKSUM=CHKSUM+ASC(TMP$)
        NEXT STRCONT
        CHKSUM=CHKSUM&&HFF
        CHK$=HEX$(CHKSUM)
        IF LEN(CHK$)=1 THEN
                CHK$="0"+CHK$
        END_IF
        'PRINT "CheckSum " HEX$(CHKSUM)
        '
        COM$=COM$+CHK$+"\r"
        PRINT#0 COM$
        TMP$=INP$#0(1)
        RES$=""
        SELECT_CASE ASC(TMP$)
                CASE &H1B
                        'PRINT "ok"
                        WAIT LOF(0)>8
                        RES$=INP$#0(8)
                        GOSUB *RS0_BUFCLR
                CASE &H15
                        PRINT "error"
                        GOSUB *RS0_BUFCLR
                CASE_ELSE
                        PRINT "unknown error"
                        GOSUB *RS0_BUFCLR
        END_SELECT
        'PRINT RES$
        '
        IF RES$<>"" THEN
                CHKSUM=&H1B                     /* 最初のESCコード
                FOR I=0 TO 5                    /* "A"からETX(&H03)まで足す
                        STRCPY RES$ TMP$ I 1
                        CHKSUM=CHKSUM+ASC(TMP$)
                NEXT I
                CHKSUM=CHKSUM&&HFF
                STRCPY RES$ TMP$ 6 2            /* チェックサムデータ部分の取りだし
                GETSUM=VAL("&H"+TMP$)           /* チェックサムデータを変数化
                IF GETSUM<>CHKSUM THEN
                        PRINT "check sum error"
                ELSE
                        STRCPY RES$ TMP$ 1 4    /* データ部分を取りだす
                        ANS=VAL("&H"+TMP$)
                END_IF
        END_IF
        RETURN
*RS0_BUFCLR
        DO                                      /* バッファクリア
                TMP$=INP$#0(1)
        LOOP UNTIL TMP$=CHR$(&HD)
        RETURN




●007 電源を切ると変数が化ける?
フラッシュROM版MPC-68KはRUNの時、prgと一緒に変数エリアもフラッシュROMに書き込みます。
書き込まれたデータはパワーオンでSRAMに展開されます。
つまり、自動実行時に変数の値が変わってもパワーオンリセットした時点で、RUNで書き込まれた時点の値へ戻ってしまいます。
バックアップ変数はポイントデータを使用してください。
ポイントデータはフラッシュROMにR/Wされません。



●006 MOP-048 prgで操作していないのに勝手に出力
【症状】
MOP-048 ON 122,124状態で ON 120,121すると 勝手に 137,138,140,142がONする。
IN(17)で見ると0
ボード構成
<< RACK#1>>
 (1)MPC-68K
 (2)MPC-LNK
 (3)MPG-405
 (4)MPG-405
 (5)MPG-405
 (6)MPG-405
<< RACK#2>>
 (7)MPG-405
 (8)MPG-405
 (9)MPG-405
 (10)MPG-68K
 (11)MPS-324
 (12)MOP-048
<< RACK#3>>
 (13)MOP-048
 (14)MOP-048 /*このボード の出力がおかしい
 (15)MIP-048
 (16)MIP-048
 (17)MIP-048
 (18)MIP-048
【原因】
BUS反射
【対策】
RACK#1のMPC-68KをRACK#2へ。
3ラックになったらCPU、電源は真中へ。



●005 文字列処理でprg停止
【症状】
文字列処理コマンド・関数 (INPUT#、INP$#、PRINT str$、str$=a$+b$ など)でprgが停止する
【原因】
文字列処理中に外部タスクからQUITされると、文字列処理のためのテンポラリメモリを開放できず、以降の処理ができなくなる。
【対策】
文字列処理中にはQUITしない。




●004 ポイントデータ破壊                            991201

【症状】
MPC-68Kのポイントデータの特定のエリアが特定の数値に変わった。

    SETP 1 808464432 808464432 808464432 808464432              /* 808464432=&H30303030
    SETP 2 808464432 808464432 808464432 808464432
	(中略)
    SETP 120 808464432 808464432 808464432 808464432
    SETP 121 808464432 808464384 0 0				/* 808464384=&H30303000
    SETP 122 0 0 0 0

【原因】
特定エリアのデータ破壊の原因としては、
・ 電磁波によるもの、
・ RAMの素子そのものの劣化・初期不良、
・ ユーザプログラムのバグによる
・ 電源の瞬間停電
などが考えられるが、本件のような意味ありげな数値(&H30)で埋まるというのはどういうことだろうか?
電磁波、瞬間停電、素子の劣化ではこのようなことはまず起りえないし、ユーザーprgにもバグは見あたらない。
明確な原因は特定できなかったが、2つの原因を想定して実験を行った。

【 実験 1 】GPとの通信に異常があった場合
<< 仮説 >>
本件の装置はMPC-68KのRS-232Cユーザーポートを使ってデジタル社のタッチパネルと常にメモリーリンク通信を行っている。
GP-377RへのRコマンドで大きな読み込みデータ数を与えると大量の"0"(&H30)が返ってくる。
GPのプロトコルマニュアルにデータ数は 0000〜0040と記載されているが、その範囲以外の数値を与えてもエラーにはならない
( 0F0F位から上位通信エラーになるようだ)
正しくは PRINT#0 ESC$+"R"+"0064"+"000C"+CR$ と送信されるデータがノイズなどで不正になったと仮定する。

<< 実験 >>
   1        NEWP
   2          RD$="000F"
   3          RD1$="" :   RD2$=""
   4        PRINT#0 ESC$+"R"+"0064"+"0542"+CR$          /* 不正な読み込みデータ数       
   5        INPUT#0 RD2$ : TIME 2
   6        PRINT P(121)
   7        END

<< 結果 >>
   #pls 120
   点120    X= 808464432 Y= 808464432 U= 808464432 Z= 808464432 /*808464432 = &h30303030
   点121    X= 808464432 Y= 808452096 U= 0 Z= 0                 /*808452096 = &h30300000
   点122    X= 0 Y= 0 U= 0 Z= 0

GPから5384個の"0"(&H30)が返って来て、ポイントデータエリアが侵食された。
0542という数値に特に意味はないが、この値で今回の不具合内容と酷似。
P121が808464384にならないのは不明 (&H30が1個少ない)。

<< 対策案 >>
本prgはアスキー互換プロトコルで、エラーに対しては無防備。
ソフト的な対策としては
・GPとの通信をチェックサム有りのプロトコルにする
・INPUTでまとめて入力するのではなく、INP#$で1文字ずつカウントしながら受信する
・受信前にLOFでキャラクタ数を確認する。
など。
RS-232C ch0は255バイトのリングバッファになっており、これを超えてもオーバーフローすることはないが
INPUT#で受信待ち状態ではバッファから即座に文字列変数へ取り込まれる。


【 実験 2 】文字列変数の処理の異常

<< 仮説 >>
サブルーチン*W2の変数STRCNTの値が不正となり非常に多くの"0"が文字列変数W$に結合されたと仮定する。
    *W2
        W$=""
        STRCNT=B-LEN(W1$)
      DO WHILE STRCNT<>0
          W$=W$+"0"
          STRCNT=STRCNT-1
      LOOP 

<< 実験 >>
オリジナルprgの先頭に下記prgを追加してRUN
    1         NEWP
    2           WD2$=""
    3         FOR BYTE=1 TO 5647
    4           PRINT BYTE
    5             WD2$=WD2$+"0"
    6         NEXT BYTE
    7         END
   (この処理には時間がかかる 239Sec)

<< 結果 >>
    #pls 120
    Point120         X= 808464432 Y= 808464432 U= 808464432 Z= 808464432
    Point121         X= 808464432 Y= 808464384 U= 0 Z= 0
    Point122         X= 0 Y= 0 U= 0 Z= 0

文字列変数エリアを超えてポイントデータエリアまで"0"が書き込まれる。
5647という数値の意味は不明。

<< 対策案 >>
データ結合前に変数の数値を確認する。

<< 付記 >>
これらはあくまでも可能性。
どちらの場合もMPC-68Kがハングアップしたりエラーを表示することはない。

<<総合的な対策案>>
INPUT#受信後にデータ長、内容チェック。
ポイント移動前にデータチェック。
SP、LPはSRAMの固定エリアに保存される=FROMを交換しても残る。
SmodelでSPにより点データ保存。もし壊れていたらLPで復旧。
SRAMデータのチェックはチェックサム。
(SP,LP(sモデルのみ),P_LD,P_SV参照)




●003 MPC-68K RUNすると Illegal instruction エラー
【症状】
RUNすると Illegal instruction (1111) になる。((1111)は有ったり無かったり)
【原因】
自分自身のタスクをFORK。
【対策】
自分自身をFORKしない。

/******************************************
/* Illegal instruction の再現
/*<このプログラムをloadして>
/* プログラム整理中!! 整理後ROMに書き込みます。-----+++++Ok
/* Illegal instruction
/* #RUN
/* Hexadecimal number expected
/* こういう表示も有る
/* Illegal instruction (1111)
/* 表示が無いときもある
/******************************************
/*確認 991118
/* MPC-68K ADVFSC(r)m REV-2.68g
/* BASIC like + multi tasking
/* Created by ACCEL Co.'91~99
/******************************************
*__BEGIN
 FORK 1,*TASK1
 END
*TASK1
 FORK 1,*TASK1 /* 自分をFORK
*__END



●002 ACCELコマンドでハングアップ
【症状】
prgをRUNするとACCELコマンドでハングアップ。
ダイレクト入力で復帰する。
【原因】 
ACCELパラメータ化け。=ACCEL実行中のTASKを再FORK。



●001 SELECT_CASE文でCASE_ELSEを省略しないで下さい
CASE_ELSEは必ず記述して下さい。68K動作不安定の原因になります。
SELECT_CASE vari
  CASE 0 : GOTO *job
  CASE_ELSE : PRINT "invalid data"
END_SELECT


---END---