1

编辑:无论出于何种原因,这整个问题(现在)都通过仅包含 time.sleep(1) 的 finally 语句解决了。为什么这会在我的程序中起作用没有任何意义,但确实如此。感谢用户英国人的推荐。

我正在使用 Python 和 minimummodbus 包开发传感器测试软件。我已经让其他五个传感器与 minimummodbus 一起工作,没有任何问题。我在使用 Rotronic 的这个传感器时遇到问题(带有 modbus 附件):https ://www.rotronic.com/en-us/rms-hcd-s.html 。这是手册:https ://service.rotronic.com/manual/?_ga=2.154508728.1456734610.1628031858-1559765634.1628031858 。Navigation: 硬件概述 > 传感器和探头 > HCD-Sx > MODBUS

解释这个问题有点困难,但我会尽力而为。我可以成功地从设备轮询几次,没有任何问题。定期我会得到一个“无通信错误”,看起来像这样,打开了最小的modbus调试:

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 没有遇到这个传感器的任何问题,所以它让我相信这是我没有足够的知识来理解的最小 modbus 的不兼容。

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

我也在联系传感器的开发人员,但他们对理解这个问题不太感兴趣。我认为我发送的任何内容都不会导致传感器锁定,因此我想声明这是一个传感器问题并将其发回,但我无法用另一个程序复制该问题。

如果有一种方法可以编辑我的代码或 minimummodbus 库来解决这个问题,我会很高兴得到帮助。谢谢你。

4

0 回答 0