Bonjour,
Je souhaite piloter une étuve à distance (régulateur C3030). La communication se fait par Modbus ( RS485). Je n'arrive pas à communiquer...

J'utilise un convertisseur RS4856 to USB (USB-RS485-WE-5000-BT) , mon système d'exploitation est windows 10 et les paramètres semblent correctement spécifiés...

Voici le code

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
 
 
# -*- coding: utf-8 -*-
 
 
import minimalmodbus
import numpy as np
import serial
import time
 
#Use Modbus RTU communication, normalement par défaut
# minimalmodbus.MODE_RTU = 'rtu'
 
#Définition des caractéristiques de l'instrument
port='COM6'         # A définir en fonction de l'installation PC
                    #Pour trouver le numéro du port aller dans gestionnaire de périphérique
Adresse_XUE112=9    # valeur par défaut 09
 
 
# Lien entre variable et adresse (hexa)
    # Temperature mesurée           -> 01      en 1/10 de °C 1234 pour 123.4 
    # Consigne de température       -> 02      idem
    # Teamperature maximale         -> 0A      entier en °C
 
 
# Definission de l'instrument et des caractéristique de la comm
print ('\n Définition des caractéristique de la Comunication : \n')
Etuve_XUE112 = minimalmodbus.Instrument(port, Adresse_XUE112)   # port name, slave address (in decimal)
 
# In some cases (mostly on Windows) the serial port must be closed after each call
# On implèmente ce changement dans les carcatéristiques de la comm
Etuve_XUE112.close_port_after_each_call = True
Etuve_XUE112.serial.timeout = 0.05
Etuve_XUE112.debug = True
Etuve_XUE112.serial.baudrate = 9600
Etuve_XUE112.mode = minimalmodbus.MODE_RTU
 
# permet d'afficher les réglages de la comm
print(Etuve_XUE112)
print ('\n')
 
 
## Read temperature (PV = ProcessValue) ##
temperature = Etuve_XUE112.read_register(1, 1) # Register number, number of decimals
time.sleep(0.1)
print(temperature)
 
 
# Change temperature setpoint (SP) ##
NEW_TEMPERATURE = 95
# On écrit la nouvelle consigne de température
Etuve_XUE112.write_register(2, NEW_TEMPERATURE, 1) # Registernumber, value, number of →decimals for storage
#lecture et affichage de la nouvelle consigne
time.sleep(0.1)
temperature_2 = Etuve_XUE112.read_register(2, 1)
time.sleep(0.1)
print(temperature_2)
 
try:
    print(Etuve_XUE112.read_register(4143))
except IOError:
        print("Failed to read from instrument")
et voici la réponse en retour :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
 Définition des caractéristique de la Comunication : 
 
minimalmodbus.Instrument<id=0x1f99b7c5700, address=9, mode=rtu, close_port_after_each_call=True, precalculate_read_size=True, clear_buffers_before_each_transaction=True, handle_local_echo=False, debug=True, serial=Serial<id=0x1f99b786670, open=True>(port='COM6', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=0.05, xonxoff=False, rtscts=False, dsrdtr=False)>
 
 
MinimalModbus debug mode. Will write to instrument (expecting 7 bytes back): 09 03 00 09 00 01 55 40 (8 bytes)
MinimalModbus debug mode. Clearing serial buffers for port COM6
MinimalModbus debug mode. No sleep required before write. Time since previous read: 767532.00 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Closing port COM6
MinimalModbus debug mode. Response from instrument: 00 (1 bytes), roundtrip time: 0.1 ms. Timeout for reading: 50.0 ms.
 
Traceback (most recent call last):
 
  File "C:\Users\Stephane\.spyder-py3\Communication\Com_ModBus_Etuve_XUE112 - Test.py", line 68, in <module>
    temperature = Etuve_XUE112.read_register(9, 0) # Register number, number of decimals
 
  File "C:\Users\Stephane\anaconda3\lib\site-packages\minimalmodbus.py", line 480, in read_register
    returnvalue = self._generic_command(
 
  File "C:\Users\Stephane\anaconda3\lib\site-packages\minimalmodbus.py", line 1245, in _generic_command
    payload_from_slave = self._perform_command(functioncode, payload_to_slave)
 
  File "C:\Users\Stephane\anaconda3\lib\site-packages\minimalmodbus.py", line 1329, in _perform_command
    payload_from_slave = _extract_payload(
 
  File "C:\Users\Stephane\anaconda3\lib\site-packages\minimalmodbus.py", line 1808, in _extract_payload
    raise InvalidResponseError(
 
InvalidResponseError: Too short Modbus RTU response (minimum length 4 bytes). Response: '\x00'
Est ce que quelqu'un peut m'aider à trouver la source du problème??
Merci