042 PyVISAを使ってBinaryデータを送受信する(その4)

2022/04/18

紹介/PyVISA

t f B! P L

今回は,測定機器に一連の数列データの送信を,PyVISAパッケージwrite_binary_values関数に,そのまま適用できないケースの例と,その対処方法を紹介します.

きっかけは,あるファンクション・ジェネレータに任意の波形データをBinaryデータとして送信しようとしたときでした.
その波形データは,
    水平軸成分,垂直軸成分,水平軸成分,垂直軸成分,...
という具合に,水平軸成分と垂直軸成分が交互に繰り返される形式となっていました.

ところが,
    水平軸成分: 4 [bytes](符号なし)
    垂直軸成分: 2 [bytes](符号あり)
と,水平軸成分と垂直軸成分のバイト長さが異なっているのです.

PyVISAパッケージwrite_binary_values関数は,エンディアンの指定ができるのですが,このケースのように,異なったバイト長さが混在した数列データには対応できません.
(そもそも,datatypeキーワード引数を使って,異なるバイト長さを指定できません)

このようなケースには,どうやって対処したら良いのでしょうか?
残念ながら,送信する数列データそのものを,write_binary_values関数で対応できる形式に,変換するしか手段がありません.

具体的には,送信する数列データを,バイト列(byte型のリスト)として変換して対処します.
Pythonでは,to_bytes関数を使うことで,エンディアン(と符号)を考慮して,整数値からバイト列に変換することができます.

つまり,水平軸成分は4[bytes]の数値xだとして,これを,ビッグエンディアン符号なしバイト列xbytesに変換するには,
    xbytes = x.to_bytes(4, byteorder="big", signed=False)
とすれば,変数xbytesに,4[bytes]のバイト列が入力されます.

同様に,垂直軸成分は2[bytes]の数値yだとして,これを,ビッグエンディアン符号ありバイト列ybytesに変換するには,
    ybytes = y.to_bytes(2, byteorder="big", signed=True)
とすることで,変数ybytes2[bytes]のバイト列が代入されます.

上記の変換を,全ての数列データに行い,変換した結果を,前もって用意しておいたバイト列にコピー(代入)すれば,PyVISAパッケージwrite_binary_values関数を,このバイト列を適用して,Binaryデータを送信することができるようになります.
前の投稿で紹介したように,ここでのdatatypeキーワード引数は's'を設定すれば良く,エンディアンは設定してもしなくても良いです)

今回紹介したことは,複雑すぎて,よく分からなかったかもしれませんが,実際に,測定機器に一連の数列データBinaryデータとして送信する際に,解決すべき事柄として発生した事例です.雰囲気だけ感じてもらえば結構です.
今回紹介したケースで困っていた人が,本ブログを読むことで,解決の糸口が見つかることになれば幸いです.

このブログを検索

アーカイブ

自己紹介

C++やC#を使って数値解析プログラムの開発を長年行ってきました.
今は,Pythonを使った自動処理システムの開発をメインに行っています.

QooQ