2017-08-12 32 views
1

私はminimalmodbusを使ってrs485プロトコルを使用するマイクロモーションフローメーターと通信しています。私はusb-rs485コンバータを使用しています。マイクロモーションモードバスのドキュメントはこちらです。minimalmodbusのPythonでスレーブからペイロードを抽出

http://www2.emersonprocess.com/siteadmincenter/PM%20Micro%20Motion%20Documents/Modbus-Map-Manual-20001741.pdf

私はこのコード

import minimalmodbus 
minimalmodbus.CLOSE_PORT_AFTER_EACH_CALL=True 
import serial 
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) 
instrument.serial.baudrate = 9600 
instrument.serial.timeout = 1 
instrument.serial.baudrate = 9600 
instrument.serial.bytesize = 8 
instrument.serial.parity = serial.PARITY_NONE 
instrument.serial.stopbits = 1 
instrument.serial.timeout = 0.05 
instrument.mode = minimalmodbus.MODE_RTU 
instrument.debug = True 
try: 
    values = instrument.read_float(250, 3, 2) 
    print (values) 
except IOError: 
    print("Failed") 

を使用して2つのレジスタから浮動小数点数を読んだとき、それは私にこの応答を与える:

よう29.879または29.78687何かのようにする必要があり
MinimalModbus debug mode. Writing to instrument (expecting 9 bytes back): '\x01\x03\x00ú\x00\x02ä:' (01 03 00 FA 00 02 E4 3A) 
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1502310315020.7 ms, minimum silent period: 4.01 ms. 
MinimalModbus debug mode. Response from instrument: '\x01\x03\x04\x9f3Aâ\x941' (01 03 04 9F 33 41 E2 94 31) (9 bytes), roundtrip time: 28.8 ms. Timeout setting: 50.0 ms. 

-3.7959221374830406e-20 

それ。 bytestringの順序のために。ここには回避策があります。 https://minimalmodbus.readthedocs.io/en/master/advancedusage.html#workaround-for-floats-with-wrong-byte-order

それは、このコード

values = read_registers(3924, numberOfRegisters=2) 
registerstring = chr(values[2]) + chr(values[3]) + chr(values[0]) + chr(values[1]) 
floatvalue = minimalmodbus._bytestringToFloat(registerstring) 

または類似のものを使用して、そこに書かれたとして、我々は、通常のoutputs.Butイム

values = read_registers(3924, numberOfRegisters=2) 

リターン調印int型を使用して、ここで立ち往生するバイト順を右に置くことができます2つのレジスタを読み込むと、リストに2つの値が与えられます。

[61552, 16865] 

私はどのように注文の権利を設定するためにバイトを取得することになっています。今私の質問は、スレーブからペイロードを保存する方法です。私はこのバイト文字列を '\ x01 \ x03 \ x04 \ x9f3A \ x941'変数に保存したいので、バイトオーダーを変更できます。 _bytestringToFloat() に渡すので、実際の値を取得できます。私は初心者ですので、助けてください。

答えて

0

整数をバイトでfloatに変換する場合は、struct.packstruct.unpackを使用します。

import struct 

r=[61552, 16865] 
b=struct.pack('HH',r[0],r[1]) 

>>> b'p\xf0\xe1A' 

struct.unpack('f',b)[0] 

>>> 28.242401123046875 
+0

ありがとうございます。 –

関連する問題