Ошибка записи нескольких ведомых в минимальной шине

Я пытаюсь взаимодействовать с контроллером температуры, используя 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 кажется, заставляет все работать.

Спасибо за помощь!

1 ответ

Если вы делаете read до writeи чтение выполнено успешно, тогда вы определенно выбрали правильную скорость и четность и вам не нужно ее менять.

Без просмотра журнала обмена было бы сложно догадаться, но я уверен на 99%, проблема в том, numberOfDecimals параметр write_register, Это не количество регистров, как вы, вероятно, ожидаете, а способ округления плавающего числа в целое число.

Итак, измените на

Left.write_register(4097, Ltemp)
Middle.write_register(4097, Mtemp)
Right.write_register(4097, Rtemp)
Другие вопросы по тегам