blochの日記

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

埋蔵金で買ったオシロ3

とりあえず、データの転送まで成功、アジレント(Agilent)じゃなかったキーサイト(Keysight)のオシロDSOX2012A(2000-Xシリーズ)。
まず、転送前の情報確認をする。sは文字列(ポインタ渡し)、nsは転送バイト数の戻り値、100は最大転送バイト数である:

vi_Write(viTDS,':waveform:count?',ns);
vi_Read(viTDS,s,100,ns); writeln('count=',s);
vi_Write(viTDS,':waveform:byteorder?',ns);
vi_Read(viTDS,s,100,ns); writeln('byte order=',s);
vi_Write(viTDS,':waveform:format word',ns);
vi_Write(viTDS,':waveform:format?',ns);
vi_Read(viTDS,s,100,ns); writeln('format=',s);
vi_Write(viTDS,':waveform:points:mode normal',ns);
vi_Write(viTDS,':waveform:points:mode?',ns);
vi_Read(viTDS,s,100,ns); writeln('points mode=',s);
vi_Write(viTDS,':waveform:points 500',ns);
vi_Write(viTDS,':waveform:points?',ns);
vi_Read(viTDS,s,100,ns); writeln('points=',s);
vi_Write(viTDS,':waveform:preamble?',ns);
vi_Read(viTDS,s,100,ns); writeln('preamble=',s);
vi_Write(viTDS,':waveform:YORigin?',ns);
vi_Read(viTDS,s,100,ns); writeln('YORigin=',s);
vi_Write(viTDS,':waveform:source?',ns);
vi_Read(viTDS,s,100,ns); writeln('source=',s);
vi_Write(viTDS,':waveform:type?',ns);
vi_Read(viTDS,s,100,ns); writeln('type=',s);
vi_Write(viTDS,':waveform:view?',ns);
vi_Read(viTDS,s,100,ns); writeln('view=',s);

いろいろいじって色々確認しておく。
そして、いよいよ転送。嬉しいことに、たとえ転送受け取りに失敗してもバッファーがあふれてだんまり、とか言う風にはならないので、トライアンドエラーやり放題で助かる。

vi_Write(viTDS,':waveform:data?',ns);
vi_Read(viTDS,s,1,ns); writeln('header=',s); {"#" is sent.}
vi_Read(viTDS,s,1,ns); writeln('quantity=',s);
val(ese,i,nd);
vi_Read(viTDS,s,i,ns); writeln('body=',s);
val(ese,i,nd);
viRead(viTDS,buf,i,ns); writeln('done.');
for j:=1 to i div 2 do
begin
{writeln(j,' ',ord(buf[j*2-2]),' ',ord(buf[j*2-1]));
ni:=ord(buf[j*2-2])*256+ord(buf[j*2-1])*1;
if(ni>32768)then ni:=ni-32768;}
ix:=ord(buf[j*2-2])*256+ord(buf[j*2-1])-32768;
writeln(j,' ',ni)
end;

まず#を送って(header)きて次に「転送バイト数文字列」の文字数(quantity)、そして、転送バイト数(body)、最後に、データが転送バイト数だけ送られる。この形式は、レクロイ、テクトロ、アジレント、といろいろなメーカーで何十年も変わっていない。何かルールがあるのだろうか。
昔はバイナリー転送だと、やれバッファをどこに取るとか、やれターミナル文字がどうのこうの、と気を使ったものだが、viを使うと文字数指定で一発である。最後は、上位桁バイトが先に来ることを確認して、符号問題(これは未だ確認出来ていない)をとりあえずそれっぽくして出来上がり。

しかし、しかし、自分がインプリメントしたvi_Readは受け取り文字列を明示的に文字列型stringにしているので、大量データをバッファ配列で受け取れない。よって、生のvireadを頭ごなしに使用(最後の部分)。配列変数bufの型は、ViBuf=packed array[0..1000100]of char;である。packed arrayとか、PASCALには縁遠い用語であるが、ひたすらCとの互換性を取るために導入されたものらしい。

【後記】word⇒integerの変換が違っていた。テクトロとは違い、単純に原点をずらすだけで良かった。