1

I try to establish connection between a Mass flow controller and pc using minimalmodbus python library. Based on device document I have to set the communication port as:

Communication speed: 9600 
Baud Start bit: 1 
Data bits: 8 
Stop bits: 2
Parity: none 
input buffer: 300 Bytes

I tried to make a slave using that library on Windows through COM4 but it wasn't successful. I use a simple code to make/test the connection:

import serial
import minimalmodbus as minbus

mfc_ins = minbus.Instrument('COM4',1,'rtu',False,True)
mfc_ins.serial.baudrate =9600
mfc_ins.serial.parity   = serial.PARITY_NONE
mfc_ins.serial.timeout  = 0.3
mfc_ins.serial.stopbits  = 2

print(mfc_ins)
try:
    print(mfc_ins.read_register(5))
except IOError:
    print("Failed to read from instrument")

Note: Definition : Instrument(port: str, slaveaddress: int, mode: str=MODE_RTU, close_port_after_each_call: bool=False, debug: bool=False)

The output is

minimalmodbus.Instrument<id=0x2c3c3449730, address=1, mode=rtu, close_port_after_each_call=False, 
    
precalculate_read_size=True, clear_buffers_before_each_transaction=True, handle_local_echo=False, debug=True,

serial=Serial<id=0x2c3c33b5dc0, open=True>(port='COM4', baudrate=9600, 

bytesize=8, parity='N',stopbits=2, timeout=0.3, xonxoff=False, rtscts=False, dsrdtr=False)

and:

MinimalModbus debug mode. Will write to instrument (expecting 7 bytes back): 01 03 00 05 00 01 94 0B (8 bytes)
MinimalModbus debug mode. Clearing serial buffers for port COM4
MinimalModbus debug mode. No sleep required before write. Time since previous read: 49578.00 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument:  (0 bytes), roundtrip time: 0.3 ms. Timeout for reading: 300.0 ms.

Traceback (most recent call last):

  File "<ipython-input-35-24f3921a9fc3>", line 1, in <module>
    (mfc_ins.read_register(5))

  File "C:\ProgramData\Anaconda3\lib\site-packages\minimalmodbus.py", line 480, in read_register
    returnvalue = self._generic_command(

  File "C:\ProgramData\Anaconda3\lib\site-packages\minimalmodbus.py", line 1245, in _generic_command
    payload_from_slave = self._perform_command(functioncode, payload_to_slave)

  File "C:\ProgramData\Anaconda3\lib\site-packages\minimalmodbus.py", line 1322, in _perform_command
    response_bytes = self._communicate(request_bytes, number_of_bytes_to_read)

  File "C:\ProgramData\Anaconda3\lib\site-packages\minimalmodbus.py", line 1490, in _communicate
    raise NoResponseError("No communication with the instrument (no answer)")

NoResponseError: No communication with the instrument (no answer)

What I've tried so far:

  1. close_port_after_each_call = True
  2. enabling local echo
  3. Using another COM port
  4. Checking the COM properties in device manager and also set it as it's described above
  5. Changing the slave address, time out, time stop and other parameters
  6. And NO, there isn't another device using COM4. And the connection with Mass flow controller can be established through COM4 using company's own software.
  7. Enabling xonxoff

this is also the output of print(minbus._get_diagnostic_string())

## Diagnostic output from minimalmodbus ## 

Minimalmodbus version: 2.0.1
File name (with relative path): C:\ProgramData\Anaconda3\lib\site-packages\minimalmodbus.py
Full file path: C:\ProgramData\Anaconda3\lib\site-packages\minimalmodbus.py

pySerial version: 3.5
pySerial full file path: C:\ProgramData\Anaconda3\lib\site-packages\serial\__init__.py

Platform: win32
Filesystem encoding: 'utf-8'
Byteorder: little
Python version: 3.8.8 (default, Apr 13 2021, 15:08:03) [MSC v.1916 64 bit (AMD64)]
Python version info: sys.version_info(major=3, minor=8, micro=8, 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: ['']
Python prefix: 'C:\\ProgramData\\Anaconda3'
Python exec prefix: 'C:\\ProgramData\\Anaconda3'
Python executable: 'C:\\ProgramData\\Anaconda3\\python.exe'
Float repr style: 'short'

Variable __name__: minimalmodbus
Current directory: C:\Users\Tutor_in\tubCloud\CO2 Sensors\Python Script

Python path: 
C:\ProgramData\Anaconda3\python38.zip
C:\ProgramData\Anaconda3\DLLs
C:\ProgramData\Anaconda3\lib
C:\ProgramData\Anaconda3

C:\ProgramData\Anaconda3\lib\site-packages
C:\ProgramData\Anaconda3\lib\site-packages\locket-0.2.1-py3.8.egg
C:\ProgramData\Anaconda3\lib\site-packages\win32
C:\ProgramData\Anaconda3\lib\site-packages\win32\lib
C:\ProgramData\Anaconda3\lib\site-packages\Pythonwin
C:\ProgramData\Anaconda3\lib\site-packages\IPython\extensions
C:\Users\Tutor_in\.ipython

## End of diagnostic output ## 

Any suggestion would be appreciated

Soprano
  • 17
  • 3
  • Please try `mfc_ins.read_register(12)` (retrieve the U16 alarms register). I have no experience with these units but the register you are trying to retrieve is 32 bits (so two 16 bit modbus registers and the request is for one register). I have worked with units ignore 'partial' reads like this. – Brits Dec 06 '21 at 20:33
  • Thanks for suggesting this, but sadly it didn't work, I face the same error – Soprano Dec 10 '21 at 10:26

0 Answers0