編集および解決済み(以下)
Java for Android を使用して、バイト 255 (WriteSingleCoil 関数の 0xFF) を ModBUS サーバー デバイスに送信しようとしています。
デバイスが実行されていません。符号付きバイト -1 を解釈できないためか、CRC の計算が間違っているためかはわかりません。負のバイトの CRC を計算する方法がわかりません。
要約: Java から ModBUS サーバーへのコイルのスイッチをオンにする関数 05 Write Single Coil を 0xFF 値で送信する方法がわかりません。
誰でも私を助けてもらえますか?
解決:
" iIndex = ucCRCLo ^ b: このような操作は、iIndex = (ucCRCLo ^ b)&0xff のように記述する必要があります。これは、& が ucCRCLo、b、および結果を int にキャストするためです。これは 32 ビットですが、short は 16 です。 1に設定された余分なビットの "
この答えは私を助けました。TheDayOfcondorに感謝します
しかし、私の大きな問題は、符号付きバイトに関する Java の通常の問題でもありました。私の CRC 計算関数は、符号なしバイトに対して正しく実行されますが、符号付きバイト内を渡すとエラーが発生します。ModBUS 通信でバイトを使用するための秘訣は、アプリ全体で short をバイトとして使用することです。これは、0 ~ 255 の範囲を持ち、trames と CRC を計算することもできます。そして、最後のステップでのみ、trame を ModBUS サーバーに送信するときに、再度バイトにキャストします。これは実行中です。
それが将来誰かに役立つことを願っています。
問題の説明:
関数 05 で ModBUS にコイルをオンに設定しようとしています。これは関数の説明です。
リクエスト
アドレス1のコイルをオンにしようとしています:
このヘックス: 0A 05 00 01 ff 00 DC 81
このバイト配列: 10 5 0 1 255 0 220 129
10: スレーブ アドレス (10 = 0A hex)
05: 機能コード (Force Single Coil)
0001: コイルのデータ アドレス。(コイル番号 1 = 01 hex)
FF00: 書き込むステータス ( FF00 = ON、0000 = OFF )
DC81: エラー チェック用の CRC (Cyclic Redundancy Check)。
問題は、Java が符号付きバイトを使用しているため、バイト配列に 255 を入れることができないということです。-1 を入力する必要があることは理解していますが、CRC を取得するために事前に計算されたバイト配列がいくつかあるため、CRC を正しく計算できませんが、関数は負のインデックスを送信します。
だから:-1を送信しようとして正しいことをしているかどうか、255を送信するための代替手段があるかどうか、-1のCRCを計算する方法もわかりません。
これは、CRC を計算するための関数です。
public short[] GenerateCRC (byte[] pMsg) {
short ucCRCHi = 0xFF;
short ucCRCLo = 0xFF;
int iIndex;
for (byte b : pMsg)
{
iIndex = ucCRCLo ^ b;
try {
ucCRCLo = (short)(ucCRCHi ^ aucCRCHi[ ( iIndex ) ]);
ucCRCHi = aucCRCLo[ ( iIndex ) ];
} catch (Exception e) {
Log.e(LOGTAG, "GenerateCRC: " + e.toString(), e);
e.printStackTrace();
}
}
short[]result= new short[2];
result0]= ucCRCHi;
result1]= ucCRCLo;
return result;
}