Не совсем по теме, но все же.
Есть прибор Метран-910. Пытаюсь читать значения аналоговых входов. Функция в протоколе Modbus RTU - 04. Значение на одном из входов = 2,350 мА
def modbus_read(device_id, function, first_registr, registr_count):
r=struct.pack("!2b2h", device_id, function, first_registr, registr_count)
res = crc16(r)
CRC1= "{:c}".format(res >> 8)
CRC2= "{:c}".format(res & 0xFF)
ser = serial.Serial(14, timeout=1, baudrate='115200')
ser.flushInput()
ser.flushOutput()
ser.write(r+CRC2+CRC1)
time.sleep(1)
h=struct.unpack("=3b", ser.read(3))
while ser.inWaiting() > 2:
print struct.unpack(">f", ser.read(4))
ser.close()
modbus_read(1,4,0,12)
Запрос: 01 04 00 00 00 0C F0 0F
Ответ: 01 04 18 00 00 00 00 6A E7 40 16 00 00 00 00 00 00 7F 80 00 00 7F 80 00 00 7F 80 12 C6
01 04 18 - шапка, содержащая адрес прибора, код функции, и количество байт с ответом (18=24)
Т.е. нужные мне значения шести каналов:
1.00 00 00 00 =0
2.6A E7 40 16 =2,350 Хранится в виде float 32bit
3.00 00 00 00 =0
4.00 00 7F 80 =обрыв
5.00 00 7F 80 =обрыв
6.00 00 7F 80 =обрыв
И тут я застрял.
while ser.inWaiting() > 2:
print struct.unpack(">f", ser.read(4))
Выдает "левые" значения:
(0.0,)
(1.3978225080712631e+26,)
(0.0,)
(4.573838187556203e-41,)
(4.573838187556203e-41,)
(4.573838187556203e-41,)
Из документации: Для чтения одного входа следует запросить значение двух последовательно расположенных 16-битных регистров и затем объеденить полученные значения. Данные разделены по двум регистрам следующим образом:
Регистр 1:
Байт1 - средний байт мантиссы (биты 8-15)
Байт2 - младший байт мантиссы (биты 0-7)
Регистр 2:
Байт1 - знак и порядок числа (биты 24-31)
Байт2 - старший байт мантиссы (биты 16-22)
В общем, такие сложности. Сам я не осилю.
Перемещено Pinkbyte из general