blochの日記

自虐ネタ以外のぐちは書かないようにしましょう

速読み34401、その3

昼間、ある班で数人で使っていたPCが突然、画面が乱れて動かなくなり、その数人は里子として他所へ貰われていった、、、。
リカバーに一時間もかかったことにがっくり。GPIB−USBは調子が悪く(これが一時間もかかった原因)、結局、visaを入れてUSBで繋いだ!。壊れたPCは、HDDを取り出して先週の分のデータを確保し、隣のPCに入れておいた。



さて、「早読み34401」の続き。
複数の34401に同時にコマンドを送出するには、どうやら、
Addr4882List=array[0..31]of SmallInt;
の配列(smallintはPascalのInteger)にアドレスリストを入れておいて、
void SendList (int boardID, Addr4882_t addrlist[ ], void *buffer,
long datacnt, int eotmode)
を読みだせばよい。
Sendの場合は、listener:byte で宛先を指定するのに対し、Sendlistでは、
Addr4882_t addrlist[ ],
で宛先リストを示すらしい。しかし、最初のAddr4882_t(SmallInt)はC言語だけで、他言語では、
addrlist%(),
だけで良いようだ。他にアドレスリストを使っているコマンドは、
EnableRemote、EnableLocal、
などがあるが、自分は、いままでアドレスリストに何も代入せずに呼び出していた。そもそも、無代入のまま放置で、替えられるようにすらしていなかった。他の人もそうだと思う。
EnableRemoteの箇所の説明では、

addrlist A list of device addresses that is terminated by NOADDR

と、NOADDR=Addr4882_t($ffff)でターミネートするらしい。しかし、Sendlist
のところの説明では、
addrlist A list of device addresses to send data to
となっていて、終端の仕様説明がない。

煮詰まりながら、別の資料(NI-488.2 User Manual for Windows 7-15)を見ると、例文が載っていた。

int WaitResult;
Addr4882_t Addrlist[4] = {3,4,5,NOADDR};

そうか、頭のAddr4882_tは、並記された変数ではなく、型キャストだった! やれやれ、よく見れば確かに、コンマがない。
右辺の初期定数で、設定の仕方も分かった。ついでに一応読み出し方は、

for (i = 0; AddrList[i] != NOADDR; i++) {...

ということだ。

ということは、おそらく、

procedure gpib_print_list(Addrlist:Addr4882list; st:string);
var
 buf:GPIB_buffer;
 s1:string;
 begin
 case GPIB_delimitor of
  0:s1:=st+#$0d+#$0a;
  1:s1:=st+#$0d;
  2:s1:=st+#$0a;
  3:s1:=st;
 end;
 strcopy(buf,pchar(s1));
 Sendlist(GPIB_board,Addrlist,buf,strlen(buf),DABEND);
end;
※但し、DABend=$02; (* send EOI at the last data byte *)

としておいて、
var Addrlist:Addr4882list;
で確保した配列変数に、
Addrlist[0]=22; Addrlist[1]=23; Addrlist[2]=NOADR;
と代入して、gpib_print_list(Addrlist,'Initiate');
だな!
12年ぶりにプログラムライブラリgpib32.pasを書き換えた!



※リンク
http://acfahep.kek.jp/subg/ir/feather/beamTests/gpib/GPIBprog.pdf
http://it360.tw/document/an/pdf/an002.pdf
http://www.ni.com/pdf/products/us/4gpib659-663.pdf
http://www.ni.com/pdf/manuals/321819d.pdf