簡體   English   中英

將兩個原始值轉換為 32 位 IEEE 浮點數

[英]Convert two raw values to 32-bit IEEE floating point number

我正在嘗試通過 TCP modbus 解碼來自 Shark 100 功率計的一些數據。 我已經成功地拉下了我需要的寄存器,並從寄存器中留下了兩個原始值,如下所示:

[17138, 59381]

從手冊中,我知道我需要將這兩個數字轉換成一個 32 位的 IEEE 浮點數。 我還從手冊中知道“地址較低的寄存器是高階的一半(即包含指數)”。 上面顯示的列表中的第一個數字是低地址寄存器。

使用 Python(如果需要,任何庫都可以),我將如何獲取這兩個值並將它們變成 32 位 IEEE 浮點值。

我曾嘗試使用各種在線轉換器和計算器來找出一種非編程方式來執行此操作,但是,我嘗試過的任何事情都會讓我得到一個超出范圍的結果(在這種情況下我正在讀取伏特所以最終結果應該是上面提供的值的 120-122 左右)。

Python 3.6+ (f-strings) 的更新。

我不確定為什么 @B.Go 的答案只有2 此外,由於字節順序是 big-endian,我將其硬編碼為這樣。

import struct
a = 17138
b = 59381
struct.unpack('>f', bytes.fromhex(f"{a:0>4x}" + f"{b:0>4x}"))[0]

輸出: 121.45304107666016

以下代碼有效:

import struct
a=17138
b=59381
struct.unpack('!f', bytes.fromhex('{0:02x}'.format(a) + '{0:02x}'.format(b)))

它給

(121.45304107666016,)

改編自Convert hex to float and Integer to Hexadecimal Conversion in Python

我在評論中看到了,@Sanju 發布了這個鏈接: https ://github.com/riptideio/pymodbus/blob/master/examples/common/modbus_payload.py

對於任何使用pymodbus的人來說,內置的BinaryPayloadDecoder非常有用。傳遞result.registers非常容易,如示例所示。 此外,它還集成了logging ,因此您可以幫助調試轉換不起作用的原因(例如:字節順序錯誤)。

因此,我為這個問題做了一個工作示例(使用pymodbus==2.3.0 ):

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder


a = 17138
b = 59381
registers = [a, b]
decoder = BinaryPayloadDecoder.fromRegisters(registers, byteorder=Endian.Big)
decoder.decode_32bit_float()  # type: float

輸出: 121.45304107666016

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM