我遇到与读取温度和温度有关的问题。来自在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。
请任何帮助都会很棒。
谢谢。