4

Profibus DP を介して PLC と通信しているハードウェアがあり、「44 79 FF FF」である 16 進数で 4 バイトのデータを送信し、PLC プログラムでこの入力データの BYTE 配列を宣言しました。問題はPLCにあり、BYTE配列で受信したデータは「66 121 255 255」であり、これは16進数の10進値ですが、私の目標はその値をREALに変換することであり、そうすると私はそうではありません私が期待した値を取得します。

4bytesDataすべての BYTES を挿入する DWORD( ) を作成しました。したがって、4 バイトをバイトに挿入する前に4bytesData: in1 = 68, in2 = 121, in3 = 255&in4 = 255

4bytesData := (SHL(SHL(SHL(BYTE_TO_DWORD(in1), 8) OR BYTE_TO_DWORD(in2), 8) OR     BYTE_TO_DWORD(in3), 8) OR in4);

realValue := DWORD_TO_REAL(4bytesData);

in1、in2、in3、in4 はバイト 0 ~ 3 です。

私が得ている値は次のとおりです。4bytesData= 1148846079 & realValue= 1.148846e+009

私が期待している値realValueは = 9.9999993896484375E2 です

この Web サイト ( IEEE754 アナライザー/コンバーター) を使用して 16 進数値 (4479FFFF) を変換すると、必要な値が得られます。10 進数値 (1148846079) を挿入すると、 PLC。

私の問題を理解していただければ幸いです。よろしくお願いします。

4

5 に答える 5

4

あなたはすでにそれを理解していますが、あなたはそれに気付いていないようです。変換DWORD_TO_REALでは、格納されている整数 (16 進数) 値を取得し4bytesData、IEEE754 REAL 形式に変換します。

これはあなたがしたいことではありません。 4479FFFF既にIEEE754 REAL 形式になっています。その値を取得し、REAL を DWORD として解釈し、DWORD 値を REAL に変換しています。簡単に言えば、変換は必要ないということ4bytesDataです。すでに正しい形式になっています。

編集

コメントのフォローアップ:

ここに画像の説明を入力

ここで、FunctionBlock2 は rIn(REAL)、rOut(REAL) を宣言し、sets を設定しますrOut:=rIn;。これにより、ST の強制的な型キャストが回避されます。ここに格納されているデータは何も変更されていませんD2000。同じバイナリ データです。上のファンクション ブロックはメモリに格納し、下のファンクション ブロックはメモリから読み取ります。唯一の違いは、一番上のラングが DWORD (表示目的) として解釈し、一番下のラングが REAL として解釈していることです。

編集

ベッコフのマニュアルを読んでいます。他にも選択肢があるようです。同じメモリ位置で DWORD と REAL を宣言してみてください。そうでない場合は、おそらくポインターを使用してそれを行うことができます(ベッコフのポインターにも型の制限が適用されるかどうかわかりませんか?)

于 2013-04-19T13:54:15.690 に答える
0

すべての SHL をネストするように注意してください。V2.3 では、深さは約 4 しかありませんでした。さまざまなコントローラー (おそらくターゲットのコンパイラー) で、ネストによって間違った評価が得られることがわかりました。それらを独自の行に保つのが最善です。関数 FUNCTION BYTES_TO_DWROD : DWORD に入れられた 4 行のコードで、変換を何度も再利用できます。

于 2015-11-14T01:11:22.607 に答える
0

ポインターを使用して、値を DWORD から REAL に移動します。変換を妨げているようです。

于 2016-06-02T14:48:13.787 に答える
0

あなたのバイトオーダーはおそらく間違っており、あなたのルーチンは反対のエンディアンを期待しています. 4479FFFF の代わりに FFFF7944 を試して、期待どおりに 9.9999993896484375E2 が得られるかどうかを確認してください。また、1148846079 は IEEE754 として 00F4884E であるため (必要に応じてバイト順序を変更してください)、認識に複数のエラーがある可能性があります。

于 2013-04-19T11:17:05.840 に答える