はじめに
PLCとpythonを通信してデータを取ろうとした時、想定していた値と違う数値が返ってきて困ったことがありました。
struct
標準ライブラリを使用して解決できたので記載します。
内容
例) 0.25
が正しい値だが、1048576000
となる
原因)浮動小数点数のバイト列を整数型で変換していた
解決策↓
from struct import pack, unpack
def convert_2word_to_double(value: int) -> float:
"""PLCから取得した数値を変換する
32bit符号無し整数から符号あり浮動小数点数へ変更
Parameters
----------
value: int
PLCから取得した値
Returns
-------
result: float
valueを変換した値
"""
binary = pack('>L', value)
return unpack('>f', binary)[0]
# 0.25になればok -> 0.25
print(convert_value(1048576000))
その他の型にも変換できそうです。
参考
struct --- バイト列をパックされたバイナリデータとして解釈する — Python 3.10.0b2 ドキュメント
浮動小数点数のバイナリ表現を10進数表記へ変換してみる - esm アジャイル事業部 開発者ブログ
浮動小数点数内部表現シミュレーター - instant tools