Modbus Python和温度& DO传感器

时间:2015-12-02 17:14:52

标签: python serial-communication modbus

我遇到与读取温度和温度有关的问题。来自在RS485协议下工作的RTU传感器的溶解氧(DO)。

我已经尝试使用C ++和C#来做到这一点,但是响应非常混乱和错误,所以我决定尝试使用默认的MinimalModbus lib来尝试Python。 (所有代码都是在Linux环境中开发的。)

根据传感器手册,我需要编写以下字节数组来获得温度测量和DO测量:

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

其中第一个字节是设备地址,第二个字节是命令(READ COMMAND)。

byte[] stop_command = {0x01, 0x03, 0x2E, 0x00, 0x00, 0x00, 0x4C, 0xe2} //STOP MEASUREMENT 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')

我看到的第一个问题是wroten命令是:

\x01\x03\x00\x00\x00\x02\xc4\x0b

什么时候应该:

\x01\x03\x26\x00\x00\x04\x4F\x41

不幸的是,我不知道如何改变这个框架。

另一个问题是我需要先发送START COMMAND,然后在指定之前发送STOP COMMAND。

请任何帮助都会很棒。

谢谢。

0 个答案:

没有答案