Modbus Python和温度&;DO传感器

Modbus Python和温度&;DO传感器,python,serial-communication,modbus,Python,Serial Communication,Modbus,我有一个问题与从RS485协议下工作的RTU传感器读取温度和溶解氧(DO)有关 我已经尝试用C++和C语言来做这件事,但是这个反应非常混乱和错误,所以我决定尝试使用默认的MimaLalMMOBLIB来进行Python。(所有代码都是在Linux环境下开发的) 根据传感器手册,我需要写入以下字节数组以获取温度测量值并进行测量: byte[] start_command = {0x01, 0x03, 0x25, 0x00, 0x00, 0x00, 0x4E, 0xc6} //START MEASUR

我有一个问题与从RS485协议下工作的RTU传感器读取温度和溶解氧(DO)有关

我已经尝试用C++和C语言来做这件事,但是这个反应非常混乱和错误,所以我决定尝试使用默认的MimaLalMMOBLIB来进行Python。(所有代码都是在Linux环境下开发的)

根据传感器手册,我需要写入以下字节数组以获取温度测量值并进行测量:

byte[] start_command = {0x01, 0x03, 0x25, 0x00, 0x00, 0x00, 0x4E, 0xc6} //START MEASUREMENT COMMAND

byte[] = {0x01, 0x03, 0x26, 0x00, 0x00, 0x04, 0x4F, 0x41} //READ TEMP & DO COMMAND
其中第一个字节是设备地址,第二个字节是命令(读取命令)

因此,传感器最终将回复帧中3-6字节的温度数据和7-10字节的DO测量值

正式传感器的规格为(来自手册):

编码系统:8位二进制(每个8位软件包包含4位十六进制字符(0-9,A-F)

每字节位:1个起始位,8个数据位(最低有效位优先),无奇偶校验,2个停止位

波特率:9600bps

以下python代码就是我试图连接到此设备的代码:

#!/usr/bin/env python
import minimalmodbus

import serial


instrument = minimalmodbus.Instrument('/dev/serial/by-path/pci-0000:00:14.0-usb-0:2.3:1.0-port0', 1, minimalmodbus.MODE_ASCII) # port name, slave address (in decimal), type
instrument.serial.baudrate = 9600
instrument.serial.bytesize = 8
instrument.serial.parity = minimalmodbus.serial.PARITY_NONE
instrument.serial.stopbits = 2
instrument.serial.timeout = 1.5
instrument.debug = True
instrument.mode = minimalmodbus.MODE_RTU
print instrument

temp = instrument.read_float(0, functioncode=0x03,
    numberOfRegisters=2)
print "Temperatura: ", temp
输出如下:

minimalmodbus.Instrument<id=0x7f0267d40c20, address=1, mode=rtu, close_port_after_each_call=False, precalculate_read_size=True, debug=True, serial=Serial<id=0x7f0267d37f10, open=True>(port='/dev/serial/by-path/pci-0000:00:14.0-usb-0:2.3:1.0-port0', baudrate=9600, bytesize=8, parity='N', stopbits=2, timeout=1.5, xonxoff=False, rtscts=False, dsrdtr=False)>

MinimalModbus debug mode. Writing to instrument (expecting 9 bytes back): '\x01\x03\x00\x00\x00\x02\xc4\x0b' (01 03 00 00 00 02 C4 0B)
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1449073891873.3 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument: '\x00\x7f~\xfe\xfe\xf6\xeez' (00 7F 7E FE FE F6 EE 7A) (8 bytes), roundtrip time: 1511.2 ms. Timeout setting: 1500.0 ms.

Traceback (most recent call last):
  File "prueba.py", line 17, in <module>
    numberOfRegisters=2)
  File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 392, in read_float
    return self._genericCommand(functioncode, registeraddress, numberOfRegisters=numberOfRegisters, payloadformat='float')
  File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 697, in _genericCommand
    payloadFromSlave = self._performCommand(functioncode, payloadToSlave)
  File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 798, in _performCommand
    payloadFromSlave = _extractPayload(response, self.address, self.mode, functioncode)
  File "/usr/local/lib/python2.7/dist-packages/minimalmodbus.py", line 1075, in _extractPayload
    raise ValueError(text)
ValueError: Checksum error in rtu mode: '\xeez' instead of '\xac/' . The response is: '\x00\x7f~\xfe\xfe\xf6\xeez' (plain response: '\x00\x7f~\xfe\xfe\xf6\xeez')
何时应:

\x01\x03\x26\x00\x00\x04\x4F\x41
不幸的是,我不知道如何改变这个框架

另一个问题是,我需要先发送START命令,然后在指定之前在末尾发送STOP命令

求求你,任何帮助都会很棒的


谢谢。

在Python代码中是否有一个地方可以在任何地方传递start命令?不,这正是我遇到的第二个问题。我不知道怎么做。minimamodbus提供的要编写的命令指定了16位命令或32位命令。当我使用13位时,我不知道怎么做,或者实际上是否相同。见:
\x01\x03\x00\x00\x00\x02\xc4\x0b
\x01\x03\x26\x00\x00\x04\x4F\x41