2
32ビット浮動小数点数のグループを表すバイナリ文字列を受け取ります。これは、第1のレジスタが下位ビットを表し、第2のレジスタが上位ビットを表す、16ビットのMODBUSレジスタの対から報告される。私は恐ろしく醜いやり方で、レジスタを並べ替えてからフロートにデコードすることができます。私はこれがかなり魅力的であることを望みますが、私はその仕事に失敗しています。基本的には、文字列を16進数の配列にアンパックして文字列に変換し、上位ビットをスライスして低ビットの前に置いて、それを整数16に変換し、32ビット整数にパックし、浮動小数点数を計算し、次に配列の最初の値を選択します。もしあなたが私を許したら、その最後の文は私に泣く必要があります。さらに邪魔することなく:32ビットバイナリ文字列をルビのfloatに変換するには
def read_dual_input_registers(addr, npairs)
@values = Array.new
result = <binary-string-returned-here>.unpack('H*').to_s
npairs.to_i.times do
register = result.slice!(4..7) + result.slice!(0..3)
@values.push([register.to_i(16)].pack('L').unpack('F')[0])
end
@values
end
これはありません。返されるバイナリ文字列は、[4f] [76] [43] [c0]と表示されます。先頭と末尾の部分は無視してください。 Rx(9バイト):[02] [03] [4f] [76] [43] [c0] [0f] [5d] => 1.05342283266357e + 33 – markf
上記に対する正しい応答は、 "[43c04f76] .to_i(16)]。pack( 'L')。アンパック( 'F')[0] => 384.620788574219 – markf
エンディアン。あなたは本質的に正しい:(結果[2..3] +結果[0..1])。アンパック( 'g')の作業。百万のおかげで – markf