LabVIEW通信入門 バイナリプロトコル

バイナリプロトコルの重要性

特徴

  • 効率性
    帯域を節約して、同じ時間でより多くのデータを転送可能
  • 低負荷
    CPUの変換不可を抑え、組み込み機器でも高速に動作
  • 高精度
    浮動小数点のビット情報を1bitも損なわず転送

テキスト形式と比較した効率性と信頼性のメリット

比較項目テキスト形式バイナリ形式
データ量大きい(数値も文字列として送る)最小(型そのままのバイト列)
処理速度遅い(パース処理[1]が必要)高速(直接読み書き)
数値の精度変換誤差の可能性がある誤差なし(ビットレベルで型のまま転送するため)
可読性高い(人間が読める)低い(専用のツールが必要)
用途設定コマンド・ログセンサデータ転送・高速モーション制御・機器プロトコル
[1]パース処理:文字列データを、プログラムで利用可能なデータ構造に変換する処理

バイナリパケットの構造設計

バイナリプロトコルでは通信データの「パケット(フレーム)」の構造を事前に定義します。 以下は典型的な設計例です。

テキスト形式と比較した効率性と信頼性のメリット

  • ヘッダ(Header)
    パケットの開始を特定するための固定値。ノイズによる誤検知を防ぎ、同期を確立します。
  • コマンド種別(CMD)
    操作の種類(読み取り/書き込み等)を定義。
  • データ長(LEN)
    続くデータのバイト数を定義。受信側はこの値を基に解析範囲を決定します。
  • ペイロード(Data)
    実データ。LabVIEWの「文字列に平坦化関数(Flatten To String)」で変換されたバイナリ列がここに入ります。
  • チェックサム(Checksum)
    通信途中のデータ破損を検出。全バイトのXOR演算やCRC計算を行い、整合性を検証します。

エンディアン(バイト順)

2バイト以上の数値をバイト列で表現するとき、上位バイトを先に送るか後に送るかがエンディアンの問題です。通信相手の仕様に合わせる必要があります。

種類バイト配置例説明
ビッグエンディアン
(Big-Endian)
[0x11], [0x33]
(上位バイト先)
上位バイトから順に配置。
TCP/IP 標準。Modbus 等も採用。
リトルエンディアン
(Little-endian)
[0x33], [0x11]
(下位バイト先)
下位バイトから順に配置。
Intel CPU / Windows PC のメモリ構造。

LabVIEWはビックエンディアンを採用しています。トルエンディアンが必要な場合は、VI関数を使用して並び順を合わせる必要があります。

LabVIEWの主なバイト操作関数

VI関数関数名(VI)機能
文字列に平坦化文字列に平坦化
Flatten To String
任意のデータ型(数値・配列・クラスタ)をバイナリ文字列に変換します。
データバイト順序 (エンディアン形式) を変換することもできます。
文字列から非平坦化文字列から非平坦化
Unflatten From String
バイナリ文字列をタイプのデータ型(数値・配列・クラスタ)に変換します。
データバイト順序 (エンディアン形式)を指定することもできます。
型変換型変換
Type Cast
指定したデータタイプ (タイプ) に型変換します
バイトスワップバイトスワップ
Swap Bytes
1バイト(8ビット)の上位と下位を入れ替えます。
エンディアン変換(バイト順の入れ替え)
ワードスワップワードスワップ
Swap Words
2バイト(16ビット)の上位と下位を入れ替えます。
エンディアン変換(バイト順の入れ替え)
文字列をバイト配列に変換文字列をバイト配列に変換
String To Byte Array
文字列をU8配列(バイト配列)に変換します。
バイト配列を文字列に変換バイト配列を文字列に変換
Byte Array To String
U8配列(バイト配列)を文字列に変換します。

LabVIEWプログラム例

  1. 「VISAを開く」関数で通信ポートを開く)
  2. 通信データの「パケット(フレーム)」の構造に合わせて送信データを用意する
    1. 送信データを用意する
    2. 数値データ(U8)を入力
    3. バイト配列でパケット構造に合わせる
    4. 「バイト配列を文字列に変換」関数を使用して文字列に変換
  3. 「VISA Write」でデータを送信
  4. 「VISA Close」で通信ポートを閉じる