Minimalmodbus + Python pour VMC

Partie du forum pour tout ce qui concerne la partie soft, ou logiciel, dans l'industrie. Forum, conseil, astuce et entraide sur les logiciels d'automatisme ou d'informatique industrielle .
Répondre
nicolas67
Apprend le binaire
Apprend le binaire
Messages : 5
Inscription : 26 déc. 2016, 16:46

Minimalmodbus + Python pour VMC

Message par nicolas67 »

Bonjour,

Je souhaite visualiser certains paramètres (T°, débit d'air,..) de ma VMC double flux Unelvent Domeo 210 fl.
J'ai acheté 1 passerelle USB => RS485, je suis en train de rédiger 1 programme sous Python et fais appel à la librairie Minimalmodbus
Ds la doc de ma VMC je m'aperçois que certains registres sont des "holding" registrers et d'autres des "input" registers adresses de registred, étant donné que leurs adresses sont certaines fois identiques, je me dis qu'il est nécessaire d'informer ds le programme quel type de registre il s'agit lorsque je veux visualiser 1 parametre; cependant je n'arrive pas à trouver comment?!

Merci pour votre aide!
Nicolas

Voici mon progr:

Code : Tout sélectionner

#!/usr/bin/env python
import minimalmodbus
import serial
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1) # port name, Domeo VMC address (in decimal)
#instrument.debug = True
instrument.serial.baudrate = 19200 # Baud
instrument.serial.bytesize = 8
instrument.serial.parity = serial.PARITY_EVEN
instrument.serial.stopbits = 1

# input registers
# temp Text
Text = instrument.read_register(23,1,4)
print 'Temperature extèrieur = ' + str(Text)
# temp Soufl
Tsoufl = instrument.read_register(24,1,4)
print 'Temperature soufflage dans chambres = ' + str(Tsoufl)
# temp Taspi
Tint = instrument.read_register(21,1,4)
print 'Temperature extraction = ' + str(Taspi)
# temp Tint
Tout = instrument.read_register(22,1,4)
print 'Temperature exterieure rejetée= ' + str(Tout)



# Debit normal
debitstd = instrument.read_register(13,1,4)
print 'Débit vitesse normale = ' + str(debitstd)
# Debit boost
debitboost = instrument.read_register(14,1,4)
print 'Débit vitesse rapide Boost = ' + str(debitboost)
# Debit surventilation
debitbipass = instrument.read_register(15,1,4)
print 'Débit vitesse surventilation Bipasse = ' + str(debitbipass)

# Vitesse moteur extraction
vitmotextr = instrument.read_register(19,1,4)
print 'Débit moteur extraction = ' + str(vitmotextr)
# Vitesse moteur soufflage
vitmotsoufl = instrument.read_register(20,1,4)
print 'Débit vitesse rapide Boost = ' + str(vitmotsoufl)
# Pre filtre alarme (nb de mois)
filtralarm = instrument.read_register(36,1,4)
print 'Reglage Pre filtre alarme = ' + str(filtralarm)

#holding registers

# temp mini intereur pour Bypass
Tintbip = instrument.read_register(23,1,4)
print 'Temperature exterieure rejetée= ' + str(Tintbip)
Edit maxpeigne: Mise du programme sous la balise code python.
Avatar de l’utilisateur
maxpeigne
Créateur de langage
Créateur de langage
Messages : 712
Inscription : 11 oct. 2015, 17:31
Localisation : Nord pas de calais

Re: Minimalmodbus + Python pour VMC

Message par maxpeigne »

Bonjour nicolas67,

Je ne suis pas un expert du MODBUS, mais la différence d'adressage est que read input register commence par un 4 et read holding register commence par un 3.
Tu auras donc 300021 pour le holding register et 400021 pour l'input register.

A confirmer par les experts...

Source:
http://control.com/thread/1026208903
https://en.wikipedia.org/wiki/Modbus#Fu ... gisters.29
http://automacile.fr - Site et tutoriels sur l'arduino.
nicolas67
Apprend le binaire
Apprend le binaire
Messages : 5
Inscription : 26 déc. 2016, 16:46

Re: Minimalmodbus + Python pour VMC

Message par nicolas67 »

Bonjour Maxpeigne,

Merci pour ta réponse, est ce que cela signifie qu' à la place de mettre "Tint = instrument.read_register(21,1,4)", je devrais mettre
"Tint = instrument.read_register(300021,1,4)" ds le cadre d'1 read holding register et
"Tint = instrument.read_register(400021,1,4)" ds le cadre d'1 input register?

Merci pour ton aide!

Nicolas
Avatar de l’utilisateur
maxpeigne
Créateur de langage
Créateur de langage
Messages : 712
Inscription : 11 oct. 2015, 17:31
Localisation : Nord pas de calais

Re: Minimalmodbus + Python pour VMC

Message par maxpeigne »

Je dirai que oui.

Penses à nous faire un retour je suis curieux de savoir si cela fonctionne :mrgreen:
http://automacile.fr - Site et tutoriels sur l'arduino.
Avatar de l’utilisateur
filou59
Forcené des structures
Forcené des structures
Messages : 184
Inscription : 20 oct. 2015, 23:26
Localisation : Nord

Re: Minimalmodbus + Python pour VMC

Message par filou59 »

Salut

C'est bien le code de la fonction qui ferra la distinction entre chaque emplacement mémoire. A l'origine il y avait 16 codes.

Les codes les plus courant sont les suivant :
Lecture de Bits : 1/2
Lecture de Mots : 3/4
Ecriture 1 bit : 5
Ecriture 1 Mot : 6

Eventuellement ecriture sur plusieurs bits/mots :
Ecriture n Bit : 15/0Fh
Ecriture n Mots : 16/10h

Tiens sinon voici ce lien qui pourra peu etre te servir : http://www.knx-fr.com/showthread.php?tid=3455
nicolas67
Apprend le binaire
Apprend le binaire
Messages : 5
Inscription : 26 déc. 2016, 16:46

Re: Minimalmodbus + Python pour VMC

Message par nicolas67 »

Bonsoir,

Merci Maxpeigne & Filou59 pour votre aide!

Je n'ai pas pu tester le programme pour l'instant car lorsque je le lance via mon PC (sous windows avec Python 3.6 Shell), j'ai le message d'erreur "No module named 'minimalmodbus'" qui apparaît alors que j'ai bien copié la librairie ds le rép. Lib de Python, j'ai effectué de nombreuses recherches sur le Web sans succès....
La nuit porte conseil.....
nicolas67
Apprend le binaire
Apprend le binaire
Messages : 5
Inscription : 26 déc. 2016, 16:46

Re: Minimalmodbus + Python pour VMC

Message par nicolas67 »

Bonsoir,

J'ai résolu mon pd de librairie (en installant sous Windows via la console "cmd" la librairie PIP (qui permet d'installer et gérer les librairies) puis en installant la librairie "minimalmodbus" avec la commande "pip install minimalmodbus"; en tapant la commande "pip freeze" (qui pemret de connaitre toutes les librairies installées + leurs versions", j'ai pu m'apercevoir que minimalmodbus + pyserial ont bien été installées (cette dernière était inclue ds le paquage de la 1ere)
Puis il a fallu que je trouve le nom du port USB utilisé ('COM3') et j'ai lancé l'application via IDLE (qui se trouve ds le repertoire de Python.exe: python\Lib\idlelib\idle.pyw)
rq: j'essaie d'être précis afin que peut être d'autres n'aient pas à passer des heures comme moi pour régler ces messages d'erreurs.

Ma VMC Domeo 210fl nécessite de fermer le pont JP1 pour activer le modbus (ce qui a pour effet de désactiver la commande manuelle!)
Pour l'instant je reçois les températures mais celle exterieure est erronée
Text = instrument.read_register(23,1,4)
print 'Temperature extèrieur = ' + str(Text) => resultat: 12.0 °C (alors qu'il fait 0° dehors) et lorsque je demande 2 décimales
Text = instrument.read_register(23,2,4)
print 'Temperature extèrieur = ' + str(Text) => j'obtiens 1.20 ° C

Je n'ai pas encore trouvé comment via "minimalmodbus" désigner le type de registre (coil, input/holding registers), j'ai essayé le conseil de Maxpeigne:
"Tint = instrument.read_register(300021,1,4)" ds le cadre d'1 read holding register et
"Tint = instrument.read_register(400021,1,4)" ds le cadre d'1 input register?
=> message d'erreur, idem en supprimant les 0 un à un entre le 3 et le 21
Bref, il faut que je trouve plus d'info sur la commande "instrument.read_register"
Rq: les autres T° semblent correctes mais sont divisées par 10 lorsque je passe à 2 le chiffre situé juste après celui du n° du registre

Si certains ont des idées, je suis preneur!
Nicolas
Avatar de l’utilisateur
filou59
Forcené des structures
Forcené des structures
Messages : 184
Inscription : 20 oct. 2015, 23:26
Localisation : Nord

Re: Minimalmodbus + Python pour VMC

Message par filou59 »

Avant de partir directement en phase de dev , utilise un utilitaire modbus tout fait afin de voir comment reagit ta VMC (ya eu des lien de poster dans la section soft)

Tu pourras voir quel adresse tu dois utiliser.

Attention certain utilitaire applique un decalage de 1 par rapport a l'adresse du fabriquant (modscan par exemple)
tuscaonline
Générateur de blocs fonctions
Générateur de blocs fonctions
Messages : 141
Inscription : 04 nov. 2015, 04:25

Re: Minimalmodbus + Python pour VMC

Message par tuscaonline »

Salut test comme suit :
"Tint = instrument.read_register(21,1,3)" ds le cadre d'1 read holding register et
"Tint = instrument.read_register(21,1,4)" ds le cadre d'1 input register?

On voit souvent la fonction modbus au début du registre d'adresse ainsi quand tu voit 300021 il faut lire Utillisé la Fonction 3 pour acceder au registre 21.

@+
nicolas67
Apprend le binaire
Apprend le binaire
Messages : 5
Inscription : 26 déc. 2016, 16:46

Re: Minimalmodbus + Python pour VMC

Message par nicolas67 »

Bonsoir,


Suite aux différents conseils, j'ai téléchargé Modbus doctor mais toutes les valeurs des registres étaient =0 et ce malgré la bonne configuration (j'ai vérifié à plusieurs reprises les valeurs utilisées: num du port, num du slave, vitesse, nd de bits, bit de parité....., il faut dire que la version du soft que j'ai trouvé date de 2008...
Donc j'ai persisté avec Python et j'ai compris la raison qui faisait que les T° étaient erronées; je suis passé de l'instruction:
Text = instrument.read_register(23,1,4) à:
Text = instrument.read_register(23,1,4,True) # 4=inputregister true car la valeur peut etre négative => le "True" a fait toute la différence
J'ai réussi également à changer la valeur de la T° intérieure mini pour que le bipass se mettre en marche (26° à la place de 24°) avec l'instruction:
#Tintbip = instrument.write_register(23,26,0,6) #26= nouvelle T°, 6=ecrire ds holding registre, 0 = pas de décimale (en pièce jointe les valeurs affichées)

Par contre les valeurs les valeurs des débits sont toutes = 0?! Je viens de m'apercevoir que ces mêmes paramètres se se situent également ds les Holding Registers, il faudra que je vérifie si ils sont visibles à cette endroit....
Ce qui n'est pas terrible sur cette VMC, c'est qu'il est nécessaire de l'ouvrir pour activer le Modbus et je ne peux pas le laissé activé car mon boitier de commandes manuelles est alors désactivé, il faudra que je place 1 interrupteur à la place du pont....

Voici mon prgr:
#!/usr/bin/env python
import minimalmodbus
#print(minimalmodbus.path)
#minimalmodbus.path.append("F:\Documents\doc de travail\A sauvegarder\formation Raspberry\python\Lib\minimalmodbus-master")
#print(minimalmodbus.path)
import serial
instrument = minimalmodbus.Instrument('COM3', 1) # port name, Domeo VMC address (in decimal)
#instrument.debug = True
instrument.serial.baudrate = 19200 # Baud
instrument.serial.bytesize = 8
instrument.serial.parity = serial.PARITY_EVEN
instrument.serial.stopbits = 1

# input registers
# temp Text
Text = instrument.read_register(23,1,4,True) # 4=inputregister true car la valeur peut etre négative
print ("Temperature extèrieur = " + str(Text))
# temp Soufl
Tsoufl = instrument.read_register(24,1,4,True)
print ("Temperature soufflage dans chambres = " + str(Tsoufl))
# temp Tint
Tint = instrument.read_register(21,1,4,True)
print ("Temperature extraction = " + str(Tint))
# temp Tout
Tout = instrument.read_register(22,1,4,True)
print ("Temperature exterieure rejetée= " + str(Tout))



# Debit normal
debitstd = instrument.read_register(13,0,3)
print ("Débit vitesse normale = " + str(debitstd))
# Debit boost
debitboost = instrument.read_register(14,0,3)
print ("Débit vitesse rapide Boost = " + str(debitboost))
# Debit surventilation
debitbipass = instrument.read_register(15,0,3)
print ("Débit vitesse surventilation Bipasse = " + str(debitbipass))

# Vitesse moteur extraction
vitmotextr = instrument.read_register(19,0,4)
print ("Vitesse Rotation Extraction = " + str(vitmotextr))
# Vitesse moteur soufflage
vitmotsoufl = instrument.read_register(20,0,4)
print ("Vitesse Rotation Soufflage = " + str(vitmotsoufl))
# Pre filtre alarme (nb de mois)
filtralarm = instrument.read_register(36,0,4)
print ("Reglage Pre filtre alarme = " + str(filtralarm))

#holding registers

# temp mini interieur pour Bypass
Tintbip = instrument.read_register(23,0,3) # 3=holdingregister
print ("Temperature mini intérieur pour Bypass = " + str(Tintbip))
# temp mini intereur pour Bypass
#Tintbip = instrument.write_register(23,26,0,6) #26= nouvelle T°, 6=ecrire ds holding registre, 0 = pas de décimale
#print ("Temperature mini intérieur pour Bypass = " + str(Tintbip))

Bonne soirée
Nicolas
Répondre