#python #modbus #minimalmodbus
Вопрос:
РЕДАКТИРОВАТЬ: По какой-либо причине вся эта проблема была решена (на данный момент) с помощью оператора finally, содержащего только time.sleep(1). Не имеет никакого смысла, почему это будет работать в моей программе, но это так. Спасибо пользователю Brits за рекомендацию.
Я разрабатываю программное обеспечение для тестирования датчиков с использованием Python и пакета minimalmodbus. Я получил пять других датчиков для работы с minimalmodbus без проблем. У меня возникли проблемы с этим датчиком Rotronic (с подключением modbus): https://www.rotronic.com/en-us/rms-hcd-s.html. Вот руководство: https://service.rotronic.com/manual/?_ga=2.154508728.1456734610.1628031858-1559765634.1628031858. Навигация: Обзор оборудования > Датчики и зонды >> HCD-Sx >>> MODBUS
Немного сложно объяснить эту проблему, но я сделаю все, что в моих силах. Я могу успешно опрашивать с устройства несколько раз без каких-либо проблем. Периодически я буду получать сообщение «Ошибка связи отсутствует», которое выглядит примерно так при включенной отладке minimalmodbus:
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1000.00 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: '÷x04x04î$ÅAx8bÈ' (F7 04 04 EE 24 C5 41 8B C8) (9 bytes), roundtrip time: 31.0 ms. Timeout for reading: 50.0 ms.
24.64303207397461
#temp from previous request
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1016.00 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 63.0 ms. Timeout for reading: 50.0 ms.
No communication with the instrument (no answer)
# a '' was returned
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: '÷x04x04ix0cÅA#t' (F7 04 04 69 0C C5 41 23 74) (9 bytes), roundtrip time: 0.0 ms. Timeout for reading: 50.0 ms.
24.631059646606445
#temp again
Затем периодически я буду получать две ошибки контрольной суммы подряд:
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1016.00 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: '÷x04x04x9famp;ÅA1' (F7 04 04 9F 26 C5 41 31) (8 bytes), roundtrip time: 62.0 ms. Timeout for reading: 50.0 ms.
Checksum error in rtu mode: 'A1' instead of 'x0f±' . The response is: '÷x04x04x9famp;ÅA1' (plain response: '÷x04x04x9famp;ÅA1')
# checksum error
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: '4÷x04x04x9famp;ÅA1' (34 F7 04 04 9F 26 C5 41 31) (9 bytes), roundtrip time: 31.0 ms. Timeout for reading: 50.0 ms.
Checksum error in rtu mode: 'A1' instead of 'ai' . The response is: '4÷x04x04x9famp;ÅA1' (plain response: '4÷x04x04x9famp;ÅA1')
# checksum error again
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: '÷x04x04x9famp;ÅA14' (F7 04 04 9F 26 C5 41 31 34) (9 bytes), roundtrip time: 31.0 ms. Timeout for reading: 50.0 ms.
24.643857955932617
#back to normal
Эти ошибки ничего не нарушают, их легко исправить с помощью инструкций об исключениях, но реальная проблема заключается в том, что устройство просто полностью перестает отвечать на запросы. Я написал небольшой скрипт специально для показа этой проблемы:
def test():
count = 0
ins = mm.Instrument('COM4', 247, debug=True)
while True:
try:
temp = ins.read_float(31002, functioncode=4, number_of_registers=2, byteorder=1)
print(temp)
time.sleep(1)
count = 0
except mm.NoResponseError as e:
print(e)
count = 1
if count > 3:
print(mm._get_diagnostic_string())
break
except Exception as e:
print(e)
test()
This script can run for anywhere from 1 minute to maybe 6 minutes before the sensor just stops responding. Here is the debug output and the diagnosis script:
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1015.00 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: '÷x04x04î$ÅAx8bÈ' (F7 04 04 EE 24 C5 41 8B C8) (9 bytes), roundtrip time: 16.0 ms. Timeout for reading: 50.0 ms.
24.64303207397461
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. No sleep required before write. Time since previous read: 1015.00 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: '÷' (F7) (1 bytes), roundtrip time: 63.0 ms. Timeout for reading: 50.0 ms.
Too short Modbus RTU response (minimum length 4 bytes). Response: '÷'
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: 'x04x04Ù*ÅAäx7f÷' (04 04 D9 2A C5 41 E4 7F F7) (9 bytes), roundtrip time: 0.0 ms. Timeout for reading: 50.0 ms.
Checksum error in rtu mode: 'x7f÷' instead of 'j©' . The response is: 'x04x04Ù*ÅAäx7f÷' (plain response: 'x04x04Ù*ÅAäx7f÷')
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: 'x04Ù*ÅAäx7f÷x04' (04 D9 2A C5 41 E4 7F F7 04) (9 bytes), roundtrip time: 0.0 ms. Timeout for reading: 50.0 ms.
Checksum error in rtu mode: '÷x04' instead of '27' . The response is: 'x04Ù*ÅAäx7f÷x04' (plain response: 'x04Ù*ÅAäx7f÷x04')
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. No sleep required before write. Time since previous read: 15.00 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: 'ÅAäx7f' (C5 41 E4 7F) (4 bytes), roundtrip time: 63.0 ms. Timeout for reading: 50.0 ms.
Checksum error in rtu mode: 'äx7f' instead of 'x92Ð' . The response is: 'ÅAäx7f' (plain response: 'ÅAäx7f')
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 62.0 ms. Timeout for reading: 50.0 ms.
No communication with the instrument (no answer)
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 62.0 ms. Timeout for reading: 50.0 ms.
No communication with the instrument (no answer)
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 62.0 ms. Timeout for reading: 50.0 ms.
No communication with the instrument (no answer)
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷x04yx1ax00x02]Æ' (F7 04 79 1A 00 02 5D C6)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. Sleeping 2.01 ms before sending. Minimum silent period: 2.01 ms, time since read: 0.00 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 62.0 ms. Timeout for reading: 50.0 ms.
No communication with the instrument (no answer)
## Diagnostic output from minimalmodbus ##
Minimalmodbus version: 1.0.2
Minimalmodbus status: Production
File name (with relative path): c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui.venvlibsite-packagesminimalmodbus.py
Full file path: c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui.venvlibsite-packagesminimalmodbus.py
pySerial version: 3.5
pySerial full file path: c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui.venvlibsite-packagesserial__init__.py
Platform: win32
Filesystem encoding: 'utf-8'
Byteorder: little
Python version: 3.9.1 (tags/v3.9.1:1e5d33e, Dec 7 2020, 17:08:21) [MSC v.1927 64 bit (AMD64)]
Python version info: sys.version_info(major=3, minor=9, micro=1, releaselevel='final', serial=0)
Python flags: sys.flags(debug=0, inspect=0, interactive=0, optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0, ignore_environment=0, verbose=0, bytes_warning=0, quiet=0, hash_randomization=1, isolated=0, dev_mode=False, utf8_mode=0)
Python argv: ['c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\test scripts\minimalmodbus_test.py']
Python prefix: 'c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv'
Python exec prefix: 'c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv'
Python executable: 'c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv\Scripts\python.exe'
Long info: (none)
Float repr style: 'short'
Variable __name__: minimalmodbus
Current directory: C:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui
Python path:
c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_uitest scripts
C:UsersnataliebDesktopPythonRepositoriessensor_testingtools
C:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui
C:UsersnataliebAppDataLocalProgramsPythonPython39python39.zip
C:UsersnataliebAppDataLocalProgramsPythonPython39DLLs
C:UsersnataliebAppDataLocalProgramsPythonPython39lib
C:UsersnataliebAppDataLocalProgramsPythonPython39
c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui.venv
c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui.venvlibsite-packages
c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui.venvlibsite-packageswin32
c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui.venvlibsite-packageswin32lib
c:UsersnataliebDesktopPythonRepositoriesenvironmental_chamber_ui.venvlibsite-packagesPythonwin
## End of diagnostic output ##
Ошибка «Нет ответа» будет повторяться бесконечно, если цикл не будет прерван. Датчик переходит в заблокированное состояние, когда повторное подключение к нему возможно только в том случае, если он отключен и снова подключен. Он даже не будет взаимодействовать с другой программой (ModbusReader от KurySoft), когда датчик находится в этом заблокированном состоянии. Я не сталкивался ни с какими проблемами с этим датчиком, используя только ModbusReader, поэтому это наводит меня на мысль, что это несовместимость с minimalmodbus, о которой у меня недостаточно знаний, чтобы понять.
Ошибка «Слишком короткий отклик Modbus» не всегда приводит к состоянию блокировки датчика и не всегда приводит к его продолжению. Иногда никакая другая ошибка не приведет к ошибке «нет связи». Он просто перестает общаться без предупреждения.
Я также обращаюсь к разработчикам датчика, но они не слишком заинтересованы в понимании проблемы. Я не думаю, что что-либо, что я отправляю, должно привести к блокировке датчика, поэтому я хочу объявить об этой проблеме с датчиком и отправить ее обратно, но я не могу воспроизвести проблему с помощью другой программы.
Если есть способ отредактировать свой код или библиотеку minimalmodbus, чтобы устранить эту проблему, я был бы рад помощи. Спасибо.
Комментарии:
1. Моей первой мыслью была бы проблема с прошивкой на устройстве — работает ли версия 1.5 ? (в примечаниях к выпуску версии v1.4 упоминается «Улучшена обработка сетевой связи RS485» — не очень подробно, но возможно, это связано с проблемой, которую вы видите, если ваше устройство находится на предыдущей версии). Возможно, также стоит добавить небольшую задержку после неудачного чтения (в настоящее время вы немедленно повторяете попытку; я видел, как устройства блокируются при слишком быстром опросе).
2. Может ли это быть проблема с прошивкой, даже если она работает с другой программой? Сертификат этого датчика говорит, что это версия 1.5. Ошибка связи происходит независимо от того, сколько времени проходит между каждым опросом. Также не имеет значения, каков лимит времени ожидания. Этот небольшой скрипт был написан только для того, чтобы уловить проблему, но мне все равно следовало перенести время.sleep() в конце. Я изначально уловил проблему во время запуска своей программы, у которой есть задержка в 2-3 секунды перед повторным опросом. Однако более частый опрос с его помощью, по-видимому, приводит к тому, что он быстрее выходит из строя.
3. Различные программы будут иметь незначительные различия (время и т.д.), Которые могут вызвать ошибку (всегда стоит убедиться, что у вас последняя версия прошивки). Тот факт, что устройство полностью блокируется (вам нужно включить его), указывает на проблему с самим устройством (при хорошо написанной прошивке оно не должно блокировать все, что вы отправляете). Я предполагаю, что вы опрашиваете устройство с той же частотой с помощью ModbusReader?
4. Обе программы опрашивают с интервалом 1000 мс. И ModbusReader фактически опрашивает три разных регистра: температуру, влажность и серийный номер. Я согласен, что датчик вообще не должен запираться. Однако сейчас я в еще большем замешательстве, потому что я провел тест в течение ночи с указанием времени.сон(1) в заявлении «наконец», чтобы еще раз проверить, что это не проблема со сном, но он все еще работал, когда я вернулся этим утром. Я собираюсь добавить то же самое утверждение finally в свою программу и посмотреть, что произойдет. Это сбивает с толку, хотя, когда я впервые обнаружил проблему, она опрашивала только каждые 2-3 секунды.
5. Я собираюсь продолжать возиться с этим и обновить этот пост, если функция time.sleep работает с моей программой. Спасибо за вашу помощь, будет немного неловко, если это сработает, но, по крайней мере, это сработает, ха-ха