我正在尝试使用Modbus RTU与温度控制器接口。我对这个主题不是很熟悉,但是我已经能够编写可以读取三个温度控制器的温度的代码,但是当我尝试依次写入三个温度控制器时,我得到了一个错误。我一直在运行的代码是:
import minimalmodbus
import time
import serial
from datetime import datetime
minimalmodbus.BAUDRATE= 9600
minimalmodbus.PARITY = serial.PARITY_EVEN
Left = minimalmodbus.Instrument('COM3', 1,)
Middle = minimalmodbus.Instrument('COM3', 2)
Right = minimalmodbus.Instrument('COM3', 3)
print(Left.read_register(4096, 1))
print(Middle.read_register(4096, 1))
print(Right.read_register(4096, 1))
newTemp = 65
Ltemp = newTemp
Left.write_register(4097, Ltemp, 1)
time.sleep(.04)
Mtemp = newTemp
Middle.write_register(4097, Mtemp, 1)
time.sleep(.04)
Rtemp = newTemp
Right.write_register(4097, Rtemp, 1)
同样,当我打印当前温度时,代码不会给出错误,并且如果我一次只写入一个寄存器(注释掉其他寄存器并运行它们),它将更改设定点温度并且不会抛出错误。
对我来说更有趣的是,当我运行此代码时,第一次运行它时,会更改“左”温度控制器的设定值,然后引发错误。下次运行代码时,将更改“中间”温度控制器的设定值,然后引发错误。上次运行代码时,正确的温度控制器的设定点已更改,没有任何错误。
我倾向于遇到不同的错误,而且我无法真正分辨出模式。其中包括:
Checksum error in rtu mode: '\x10\x01' instead of '\x01ì' . The response
is: '\x01\x10\x10\x01' (plain response: '\x01\x10\x10\x01')
builtins.ValueError: Too short Modbus RTU response (minimum length 4
bytes). Response: '\x02'
builtins.OSError: No communication with the instrument (no answer)
我尝试将波特率更改为4800,但这样做没有任何效果。从Modbus RTU更改为ascii,我也遇到类似的错误。将平价设置为默认值时,我也得到了相同的错误。我还尝试休眠代码并更改超时,我认为这有助于解决上一个错误。
任何尝试停止这些错误的建议将不胜感激。
谢谢
修改
我尝试删除小数位数,但仍然收到相同的错误,现在更新了设定点,以使80变成8.0,这没什么大不了的。
这是我运行代码时得到的完整响应,现在没有小数位数了:
19.1
19.1
21.1
Traceback (most recent call last):
File "C:/Users/matth/Desktop/tempController.py", line 26, in <module>
Left.write_register(4097, Ltemp)
File "c:\Users\matth\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\minimalmodbus.py", line 296, in write_register
self._genericCommand(functioncode, registeraddress, value, numberOfDecimals, signed=signed)
File "c:\Users\matth\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\minimalmodbus.py", line 697, in _genericCommand
payloadFromSlave = self._performCommand(functioncode, payloadToSlave)
File "c:\Users\matth\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\minimalmodbus.py", line 798, in _performCommand
payloadFromSlave = _extractPayload(response, self.address, self.mode, functioncode)
File "c:\Users\matth\AppData\Local\Programs\Python\Python36-32\Lib\site-packages\minimalmodbus.py", line 1032, in _extractPayload
response))
builtins.ValueError: Too short Modbus RTU response (minimum length 4 bytes). Response: '\x01'
左的温度确实发生变化。偶尔我还会收到仪器超时错误,但以上错误似乎是最常见的错误。我想我会检查如何连接接口,因为我想知道这是否是问题。
编辑II
我想我已经弄清楚了,我只需要增加超时时间(我以为我已经有,但我想还不够)minimalmodbus.TIMEOUT = 3
似乎可以使一切正常。
感谢您的帮助!
答案 0 :(得分:0)
如果您在read
之前做过write
,并且读取成功,那么您肯定已经选择了正确的速度和奇偶校验,并且不必更改。
没有看到交换日志,很难猜测,但是我有99%的把握是问题是numberOfDecimals
的{{1}}参数。如您所料,它不是寄存器的数量,而是一种将浮点数四舍五入为整数的方法。
因此,更改为
write_register