python - 在minimummodbus中写入多个从站时出错

标签 python modbus minimalmodbus

我正在尝试使用 Modbus RTU 与温度 Controller 连接。我对这个主题不太熟悉,但我已经能够编写可以读取三个温度 Controller 的温度的代码,但是当我尝试按顺序写入三个温度 Controller 时,出现错误。我一直在运行的代码是:

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)

再次,当我打印当前温度时,代码不会给出错误,如果我一次只写入一个寄存器(注释掉其他寄存器并运行它们),它会更改设定点温度并且不会抛出错误错误。

对我来说更有趣的是,当我运行此代码时,第一次运行它时“左”温度 Controller 的设定值发生变化,然后引发错误。下次运行代码时,“中间”温度 Controller 的设定值发生更改,然后引发错误。上次我运行代码时,右侧温度 Controller 的设定点发生了更改,没有出现任何错误。

我往往会遇到不同的错误,而且我无法真正辨别出模式。它们包括:

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'

不过,左侧的温度确实发生了变化。我偶尔也会遇到仪器超时错误,但上面的错误似乎是最常见的错误。我想我会检查一下接口(interface)的接线方式,因为我想知道这是否是问题所在。

编辑二

我想我明白了,我只需要增加超时时间(我以为我已经有了,但我猜还不够)minimalmodbus.TIMEOUT = 3 似乎让一切正常。

感谢您的帮助!

最佳答案

如果您在写入之前进行读取,并且读取成功,那么您肯定选择了正确的速度和奇偶校验,并且不必更改它.

如果没有看到交换日志,很难猜测,但我 99% 确定,问题出在 write_registernumberOfDecimals 参数上。正如您可能期望的那样,它不是寄存器的数量,而是一种将 float 舍入为整数的方法。

所以,改为

Left.write_register(4097, Ltemp)
Middle.write_register(4097, Mtemp)
Right.write_register(4097, Rtemp)

关于python - 在minimummodbus中写入多个从站时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53546180/

相关文章:

python - 比较 2 个列表,同时迭代另一个列表 - Python

python - 如何使用 MySQLdb 在 Python 中创建跨多个语句的事务?

javascript - 来自 HTML/Javascript 网页的 Modbus TCP 通信

python - 处理从属寄存器的异常响应 - 制造商添加的额外 'FF'

python - 玛雅 2018 Python+QT : Querying Value of Imported TextField

python - 在 Python 数据框中获取一天的一部分(早上、下午、晚上、晚上)

algorithm - 微 Controller 上 Modbus Master 的正确非阻塞算法是什么

java - 将 ASCII 值写入 RS485 等串行通信设备的寄存器

python - RS485 Modbus-RTU 设备给出的错误是什么