Modbus浮動小数点値のレジスタをスワップする方法

更新しました Mar 20, 2019

使用製品

Software

  • LabVIEW Full
  • LabVIEW Datalogging and Supervisory Control Module

問題

LabVIEW Modbusスレーブアプリケーションでは、1つの浮動小数点数の最下位バイトを最初のレジスタに配置する必要があります。現在、最も重要なバイトが最初のレジスタに配置されています。アプリケーションに対してどうすればバイトをスワップできますか?

解決策

Modbusは、16ビットレジスタを使用して値を保持するため、32ビット浮動小数点数は2つのレジスタに分割する必要があります。Modbusは、浮動小数点数の表現を規格として宣言していないため、デバイスが浮動小数点数をLabVIEWとは異なる方法で処理する可能性があります。次の記事では、浮動小数点数を2つのレジスタで表現できるさまざまな形式について説明しています。
外部リンク: How Real (Floating Point) and 32-bit Data is Encoded in Modbus RTU Messages
 

下の図1は、IEEE 754規格を使用して浮動小数点数を定義する方法を示しています。最下位ビットは、最初のレジスタに格納されます。
 

図1: 最下位の値が最初のレジスタに格納される



この形式では、数値123456.00をレジスタF400001に格納しようとすると、最初のレジスタF40001にバイト「A B」が格納されます。バイト「C D」は、第2レジスタF400002に格納されます。LabVIEW 2011以前では、ModbusスレーブI/Oサーバを使用する場合、LabVIEWがModbusレジスタの浮動小数点数を表す方法とは異なります。デバイスが最下位ビットを最初に要求する場合、データは図2の10進値のように表示されます。
 


図2: 最上位の値が最初のレジスタに格納される


 

図2は、LabVIEWが最上位バイト「C D」を最初のレジスタに格納することを示しています。次に、最下位バイト「A B」が第2のレジスタに格納されます。この形式は、一般的に「ワードスワップ」と呼ばれます。

デバイスが図1の形式に従っている場合は、デバイスに値を書き込む前にスカラ値の浮動小数点値に 「ワードスワップ」を実行することができます。下図は順序を元に戻す方法を示しており、下記の手順はセットアップ方法を説明しています。
 


図3: 浮動小数点値のワードスワップ
 
  1. 型変換関数をブロックダイアグラムに配置します。数値配列定数をタイプ入力に配線します。スカラ値の浮動小数点数をx入力に配線します。
  2. 配列の数値定数を右クリックし、表記法>>I16を選択します。
  3. 1D配列反転関数を配置して、最初の型変換関数の出力を配列入力に配線します。
  4. 2つ目の型変換関数を配置します。スカラ値の浮動小数点数をタイプ入力に配線します。反転配列出力をx入力に配線します。
  5. スワップされたスカラ値の浮動小数点値をModbusレジスタに書き込むことができます。この例では、Modbusレジスタに結合されたシェア変数を使用しています。

この記事はお役に立ちましたか?

いいえ