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