Rotronic温度/湿度探头与Modbus和python锁定为“无通信”状态

2024-09-30 22:22:47 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑: 不管出于什么原因,整个问题(目前)用一个只包含time.sleep(1)的finally语句解决了。为什么在我的程序中这样做毫无意义,但确实如此。感谢英国用户的推荐

我正在使用Python和minimalmodbus包开发传感器测试软件。我已经有五个其他传感器与MinimaModbus一起工作,没有问题。我对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): '÷\x04y\x1a\x00\x02]Æ' (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: '÷\x04\x04î$ÅA\x8bÈ' (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): '÷\x04y\x1a\x00\x02]Æ' (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): '÷\x04y\x1a\x00\x02]Æ' (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\x04i\x0cÅ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): '÷\x04y\x1a\x00\x02]Æ' (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: '÷\x04\x04\x9f&Å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: '÷\x04\x04\x9f&ÅA1' (plain response: '÷\x04\x04\x9f&ÅA1')
# checksum error

MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷\x04y\x1a\x00\x02]Æ' (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÷\x04\x04\x9f&Å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÷\x04\x04\x9f&ÅA1' (plain response: '4÷\x04\x04\x9f&ÅA1')
# checksum error again

MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷\x04y\x1a\x00\x02]Æ' (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\x04\x9f&Å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()

在传感器停止响应之前,该脚本可以运行1分钟到6分钟。以下是调试输出和诊断脚本:

MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷\x04y\x1a\x00\x02]Æ' (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: '÷\x04\x04î$ÅA\x8bÈ' (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): '÷\x04y\x1a\x00\x02]Æ' (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): '÷\x04y\x1a\x00\x02]Æ' (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\x04Ù*Å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: '\x04\x04Ù*ÅAä\x7f÷' (plain response: '\x04\x04Ù*ÅAä\x7f÷')
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '÷\x04y\x1a\x00\x02]Æ' (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): '÷\x04y\x1a\x00\x02]Æ' (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): '÷\x04y\x1a\x00\x02]Æ' (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): '÷\x04y\x1a\x00\x02]Æ' (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): '÷\x04y\x1a\x00\x02]Æ' (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): '÷\x04y\x1a\x00\x02]Æ' (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:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv\lib\site-packages\minimalmodbus.py
Full file path: c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv\lib\site-packages\minimalmodbus.py

pySerial version: 3.5
pySerial full file path: c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv\lib\site-packages\serial\__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:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui

Python path:
c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\test scripts
C:\Users\natalieb\Desktop\Python\Repositories\sensor_testing\tools
C:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui
C:\Users\natalieb\AppData\Local\Programs\Python\Python39\python39.zip
C:\Users\natalieb\AppData\Local\Programs\Python\Python39\DLLs
C:\Users\natalieb\AppData\Local\Programs\Python\Python39\lib
C:\Users\natalieb\AppData\Local\Programs\Python\Python39
c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv
c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv\lib\site-packages
c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv\lib\site-packages\win32
c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv\lib\site-packages\win32\lib
c:\Users\natalieb\Desktop\Python\Repositories\environmental_chamber_ui\.venv\lib\site-packages\Pythonwin

## End of diagnostic output ##

除非循环中断,否则无响应错误将无限期重复。传感器进入锁定状态,只有在拔下并重新插入后才能重新连接。当传感器处于锁定状态时,它甚至不会与另一个程序(KurySoft的ModbusReader)通信。我在使用ModbusReader时没有遇到任何问题,因此我认为这是与minimalmodbus的不兼容,我没有足够的知识来理解

“Modbus响应太短”错误并不总是导致传感器锁定状态,也不总是继续。有时没有其他错误会继续“无通信”错误。它只是在没有任何警告的情况下停止通信

我也在接触传感器的开发人员,但他们对理解这个问题不太感兴趣。我不认为我发送的任何东西都会导致传感器锁定,所以我想声明这是一个传感器问题并将其发送回,但我不能用其他程序复制该问题

如果有一种方法我可以编辑我的代码或Modbus库来解决这个问题,我希望得到帮助。多谢各位


Tags: fromdebugforbytestimemodeserialusers