驪戻 麗全 黎新

N88からVB6.0への移行

1 N88初心者 2006/03/30(木) 17:52
GPIB Interface社pci4301
PG N88Basic→VB6.0
OS Win2000
はじめまして。
現在N88BasicでGPIBを制御していたものをVB6.0で制御しようとしています。
N88のRBYTEに対応するVBのコードがわかりません。

N88ソース
RBYTE &H3F,&H20,&H42;M,L
    @、A、B;C、D
という形になっていますが、どのような意味なのでしょうか。
バイナリデータを読むという解説は見つけたのですが。。
対応しそうなDLL関数
「PciGpibExMastRecvData」

1.@、A、Bは何を表しているのか。
2.C,Dは変数っぽいが、「;」より前の変数の数と一致していない。
3.「;」は何を意味するのか。

どなたかRBYTEに関して、解説のあるHPを教えていただけませんでしょうか。

もしよろしければこれに対応するVBのコードを教えていただけるとありがたいです^^

2 匿名488 2006/03/30(木) 19:02
対応するコードはわかりませんが、
1,2,3はマルチラインメッセージ(ATN=Active)で、
トーカ、リスナの指定

&H3F : UNLISTEN (リスナ解除)
&H20 : LA リスナアドレス指定(PC自身)
&H42 : TA トーカアドレス指定

セミコロン以降4、5 は各数値変数に1バイトずつのバイナリデータ受信
ではないでしょうか。

3 N88初心者 2006/03/31(金) 09:47
匿名488さん早速のお返事ありがとうございました。

@、A、Bに関してそのようなデータをいったんGPIBに
送信を行ってから、受信を行っているというイメージなんでしょうか?
(何らかのデータの送信を行ってから受信を行う)

それとも受信を行う前の設定というイメージなんでしょうか。
(受信するための設定を行い、受信を行う)

C、Dに関しては受信データの1バイト目、2バイト目を設定するということですね。

なんども質問を行ってしまいすみません。

4 匿名488 2006/03/31(金) 13:49
1,2,3は端末に対するコントローラからの指示で、
通常の GPIB カードの API では直接記述することは
まれです(PC がコントローラの場合 API の引数で トーカアドレス、
リスナアドレス指定をすると内部で上記のキャラクタが
自動生成て送出されます)

4,5については、PC が受信側ですので、
おっしゃるとおりです。

5 N88初心者 2006/03/31(金) 14:35
匿名488さんお返事ありがとうございます。

>1,2,3は端末に対するコントローラからの指示で、
>通常の GPIB カードの API では直接記述することは
>まれです

そうなんですか。
直接記述することがないということは、API関数にそのような機能
が含まれているという認識でよろしいでしょうか?

そこでヘルプより下記のものを見つけました。
>Declare Function PciGpibExMastRecvData Lib "gpc4304.dll"( _
>ByVal BoardNo As Long, _
>ByRef AdrsTbl As Long, _
>ByRef Length As Long, _
>ByRef Buffer As Any, _
>ByVal Msg As Long _
>) As Long

>【パラメータ】
>BoardNo
>ボードアクセス番号(0〜15)を指定します。
>AdrsTbl
>機器のアドレステーブルへのポインタ(参照渡し)を指定します。
>アドレステーブルへの終端には必ず-1 を設定します。
>Length
>受信バッファのバイトサイズが格納されている変数へのポインタ(参照渡し)を指定しま
>す。
>本関数呼び出し後、実際に受信したバイトサイズが格納されます。(同期入出力時)
>受信バッファの領域は、必ず「受信データ長」+「デリミタ」分の領域を確保するように
>してください。
>Buffer
>受信バッファ領域へのポインタ(参照渡し)を指定します。
>※ Visual Basic の場合には、API のDeclare Function の宣言がバイト型/数値型と文字列
>型とでは異なります。
>※ Visual Basic では、文字列変数として固定長文字列を指定してください。
>例: Dim RecvBuffer As String * 32 など
>※ Visual Basic で非同期送信を行う場合は、GlobalAlloc 関数などを用いて割り当てたメ
>モリ領域を指定してください。詳しくはサンプルプログラムをご参照ください。
>Msg
>非同期送信完了時にアプリケーションに通知されるメッセージを指定します。
>同期動作時にはWM_NULL もしくは0 を指定してください

ここでAdrsTblに&H42(十進数だと66?)を入れてあげれば解決できるというわけですね!

実際の使われ方は
10  RBYTE &H3F,&H20,&H42;M,L
20  IF M<>254 THEN 10
のような形になっているため、各コマンドを送信し、セットされたら
次の行へいくということですかね。(勝手な想像)
(勝手な想像はまだまだ続く)
PciGpibExMastRecvDataで、機器の指定を行っているため、
RBYTE &H3F,&H20,&H42;M,L
は必要ないのかな。。

もし考え方が間違っていればご指摘お願いします。

6 匿名488 2006/03/31(金) 16:18
>ここでAdrsTblに&H42(十進数だと66?)を入れてあげれば解決できるというわけですね!

&H42(0x42) は GPIB のバスのコマンドメッセージですので、
API のレベルでは通常生のアドレス(0,1,2..31)になるかと思いますが、
考え方としては合っているのではないでしょうか。

7 N88初心者 2006/03/31(金) 17:04
お返事ありがとうございます。

なんとなく見えてきました!
RBYTE &H3F,&H20,&H42;M,L は
RBYTE [受信するための設定];[受信データの格納先]
という扱いですね

そこでN88のプログラムで似たようなWBYTEがありました。
これは
WBYTE &H3F,&H40,&H22;MV,LV,DMY
WBYTE [送信するための設定];[送信データ]
という認識でいいんですよね^^;

現在機器が複数あり、機器の指定が送信(&H22)と受信(&H42)で番号が違っていますが、
同じ機器を指しています。
>&H42(0x42) は GPIB のバスのコマンドメッセージですので、
>API のレベルでは通常生のアドレス(0,1,2..31)になるかと思いますが、
>考え方としては合っているのではないでしょうか。
ということから、APIでは対応した機器の番号を指定した、送信、受信のAPIを呼んでやればよい
ということですね^^

制御から話は外れるのですが、
N88でDIM KEY(?)
というのが見つからないのに
KEY(1) ON

KEY 1, ""
というものを見かけました。
N88はDIMで宣言しなくても変数を扱えるのでしょうか?
(まるでjavascriptのような。。。)
上記のKEY 1 と KEY(1) は同じものなのでしょうか・・

初歩的な質問かもしれないですがよろしくお願いいたします。

8 匿名488 2006/04/03(月) 11:55
>KEY(1) ON

これらは当時の BASIC のファンクションキー割り込み処理関連
ON KEY GOSUB ?参照

>KEY 1, ""

これはファンクションキーへの文字列の割り当てだと思います。

9 匿名488 2006/04/07(金) 12:03
お返事ありがとうございます。

KEYは予約語ということですね。
>>KEY 1, ""
>これはファンクションキーへの文字列の割り当てだと思います。
ですが、ファンクションキーへ文字列を割り当てるイメージが湧きません。
これは文字列を割り当てられるということは、文字列の取得ができるということでしょうか?

N88 BASIC で
10 VOLT=2000
20 VOLT=VOLT AND &HFFF
というコードがありました。
VBだと、
Dim VOLT as Long
VOLT = 2000
VOLT = 2000 AND &HFFF
だと思うのですが、
VOLTの値を見ると2000のままです。
この「AND &HFFF」は何か意味があるのでしょうか?

あとはVBではためしていないのですが、
10 FOR I=&HB60+324 TO &HB76+320 STEP 2
20 何らかの処理
30 NEXT
とあるのですが、
「AND」と「+」で使い分けるのはなぜなんでしょうか。
VBでは 「AND」はIF文ぐらいでしか使用したことがありません。

よろしくお願いいたします。

10 匿名488 2006/04/07(金) 17:06
>この「AND &HFFF」は何か意味があるのでしょうか?

 これはビット演算です。おそらく12ビットの値なので、
 上位 4 ビットを捨てるためのものでしょう。
 BASIC の AND には2つあって、
 これはビット演算の AND ではないでしょうか?(C 言語の &)
 IF 文の AND (C 言語の &&)とは意味が違ってきます。

 +は算術演算の足し算です。

11 匿名488 2006/04/07(金) 17:12
↑でも、もともと 2000 しか代入されてないのなら、
意味はないですね。12 ビットを強調するために
あえてそういう表記にしているのかもしれません。

12 ka 2006/04/11(火) 11:11
kaと申します。いまだにPC-9821(ペンティアム150MHz)を使っています。

>>これはファンクションキーへの文字列の割り当てだと思います。
>ですが、ファンクションキーへ文字列を割り当てるイメージが湧きません。
>これは文字列を割り当てられるということは、文字列の取得ができるということでしょうか?
BASICを立ち上げた状態だとあらかじめファンクションキーには
load "だとかautoだとかが割り当てられていますが、これを任意の
文字列に変更するものです。もしGP-IBでの電圧設定コマンドがVOLT 10.00
だとしたら、KEY 1,"VOLT "を実行しておくとF1キーを押せば
VOLT の文字が入るようになるので、コマンドを入力する際のキーを
へらすことができます。
KEY(x) ONはファンクションキーによる割り込み処理の許可です。
ファンクションキーxを押すと、ON KEY GOSUB文で定義した行番号
(またはラベル)のサブルーチンが実行されます。

13 匿名488 2006/04/11(火) 12:56
匿名488さん、kaさんありがとうございます。

ビット演算をしているのですね。
   1111|   1110|
AND 0001|AND 0001|
   0001|   0000|
調べて見ましたが、かなり便利そうですね!
ちなみにVOLTの値の2000は数字を変えています。。

>BASICを立ち上げた状態だとあらかじめファンクションキーには
>load "だとかautoだとかが割り当てられていますが、これを任意の
>文字列に変更するものです。
BASICの画面を実際みたことがなく、イメージが湧きませんでした。
これは、最初からフォームにファンクションキー分だけボタンが置かれているような
イメージでよいのですよね(ボタンではなくラベル?

2番目より
>セミコロン以降4、5 は各数値変数に1バイトずつのバイナリデータ受信
>ではないでしょうか。
1バイトということは2文字(00-FF)ということでいいんですよね?

N88のソースのなかに
890 83848!
などというコードがありました。
ちなみに83848行などは存在しません。
これは何を表しているんでしょうか?
意味のないものだといいのですが。。

14 DDDDD 2007/04/07(土) 16:11
インターネットでここを見つけて、初めて書込みます。

現在、N88をVBに焼き直しています。
そこで、教えて頂きたいのですが。

PC98のN88で以下のコードがありました。

PRINT @8;"OC0,CR.LF":WBYTE 8+0,8;    '発生器(PWS-307C)共通出力OFF

発生器(PWS-307C)のコマンド表では「OC0」が共通出力OFFになっていて
CR.LFはデリミタは分かりました。

では、その後ろの「WBYTE 8+0,8;」は何でしょうか?
上記の掲示板の内容ですと送信するための設定とのことですが、具体的には
どう言う設定になるのでしょうか?

また、VBではCONTEC製のGPIBボードを使って、付属の関数で送信
しています。
その場合、送るのは「OC0」のみでOKなのでしょうか?
(デリミタはGPIBの初期化関数で「CR.LF」を指定済み)

よろしくお願い致します。

15 匿名488 2007/04/25(水) 22:56
WBYTE の;より前はマルチラインメッセージ
(GPIBのATNをアサートして送るバスコマンドです)

以下、BASIC98 (N88 互換 BASIC マニュアルから引用)

------ 引用ここから -------

WBYTE ステートメント

【形式】  WBYTE  〔<コマンド>〔 ,<コマンド>・・・〕〕;〔<データ>〔 ,<データ>・・・〕〕〔
@〕


【機能】  マルチラインメッセージの送出、およびバイナリデータの送出を行ないます。

【解説】  <コマンド>で指定したマルチラインメッセージ(&H00〜&HFF)および<データ>で指定したバイナリデータ(&H00〜&HFF)を送出します。この範囲を越える<データ>または<コマンド>を指定すると、"命令の呼び出し方の誤り(Illegal function call
)"というエラーになります。
  また、オプションの@を指定すると、最後の送出データバイトを送出した後、EOI(End Or Identify)をtrueにします。


  バイナリデータの送出手順は次のとおりです。

  ■マスタモードの場合

  (1)  ATN(Attention)をtrueにします。
  (2)  <コマンド>を順次送出します。
  (3)  ATNをfalseにします。
  (4)  <データ>を順次送出します。
  (5)  オプションの@を指定した場合は、EOIをtrueにします。


  ■スレーブモードの場合

  (1)  MTA(My Talk Address)を受信するまで待ちます。
  (2)  ATNがfalseになるまで待ちます。
  (3)  <データ>を順次送出します。
  (4)  オプションの@を指定した場合は、EOIをtrueにします。


  スレーブモードでは、<コマンド>を指定することはできません。


【文例】  WBYTE &H5F,&H6F;&H35,&H36


【関連命令】  RBYTE

●注意  この命令は、セットアップユーティリティーの[ライブラリ]で、[GP-IBを使用する]をチェックしていないと使用できません。

名前
mail
コメント



文責:計測制御技術ラウンジ, Powered by ©タカヒロ@みちのく掲示板 [12ch BBS 2.03]