LabVIEW通信入門 バイナリプロトコル
バイナリプロトコルの重要性
特徴
- 効率性
帯域を節約して、同じ時間でより多くのデータを転送可能 - 低負荷
CPUの変換不可を抑え、組み込み機器でも高速に動作 - 高精度
浮動小数点のビット情報を1bitも損なわず転送
テキスト形式と比較した効率性と信頼性のメリット
| 比較項目 | テキスト形式 | バイナリ形式 |
|---|---|---|
| データ量 | 大きい(数値も文字列として送る) | 最小(型そのままのバイト列) |
| 処理速度 | 遅い(パース処理[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プログラム例
- 「VISAを開く」関数で通信ポートを開く)
- 通信データの「パケット(フレーム)」の構造に合わせて送信データを用意する
- 送信データを用意する
- 数値データ(U8)を入力
- バイト配列でパケット構造に合わせる
- 「バイト配列を文字列に変換」関数を使用して文字列に変換
- 「VISA Write」でデータを送信
- 「VISA Close」で通信ポートを閉じる

