Après la V3, la V4, je suis passé en V5 plus particulièrement pour le MODBUS.
Voilà plusieurs jours que je tente de faire quelques chose avec le MODBUS sans succès, malgré les nombreux sujets dans ce forum.
Je fais donc appel à votre aide.
Je tente d’interfacer un adaptateur DS18B20 vers MODBUS (longue distance)
Voici le peu d’information que je possède sur la carte :
Protocole MODBUS RTU, 03 commande de lecture, 06 commande d’écriture.
Débit en bauds du port série: 9600 (par défaut), N, 8, 1
Coté config de la V5 pas de soucis :
Vous semblez bien parti, il y a seulement une petite erreur qui génére le crc error…
La reponse a la requete modbus se fait sur 2 octets. Il vous faut donc une autre ANA8 ou une ANA16 directement…
J’attire votre attention sur le bit de poids fort qui est a 1 si la température que vous souhaitez mesurer est négative… alors les choses se compliqueront…
D’autre part, pour des valeurs positives, il vous faudra convertir la valeur obtenue en décimale. Pour ce faire, utilisez un objet fonction qui divisera par 10 la valeur de l ANA modbus .
Donnez moi des retours sur l’avancement de votre projet
Bonjour,
Merci pour votre réponse, j’avais continuer à chercher mais sans grand succès.
N’étant pas à l’aise avec les octets, les bits, … quelle est la solution la plus simple deux ANA8 ou un seul ANA16 ?
Je test cela dans la semaine et vous tiens informé.
Je vais essayer de vous expliquer un peu mieux le fonctionnement du modbus mais n ayant pas votre équipement, je ne pourrai pas tester ce que je vous écris:
Qd vous voulez lire une température en modbus (avec l objet modbus READ de la v5)
vous emetez une requête (construction de l’objet READ)
Exemple :
Adresse de l’objet a lire sur la chaine modbus: ex 1 (codé sur 1 octet soit 8 bits) 01
la fonction utilisée danz notre exemple READ 03 (codé sur 1 octet soit 8 bits)03
l’adresse du registre que l’on veut interroger : ici 0 (codé sur 2 octets soit 16 bits) 00 00
la taille de ce qu’on veut lire ( codé sur 2 octets soit 16 bits)00 01
le CRC (codé sur 2 octets soit 16 bits) cette opération est effectuée automatiquement par la v5 (84 0A)
La requete donne donc:
01 03 00 00 00 01 84 0A
La reponse de la carte modbus :
Adresse lu : ex 1 (codé sur 1 octet soit 8 bits) 01 (non visible sur la v5)
la fonction utilisée dans notre exemple READ 03 (codé sur 1 octet soit 8 bits)03 non visible sur la v5
nombre d octets lus (codé sur 1 octet) non visible sur la v5
les données lues ANA16 EN MODE RAW (2 octets VISIBLE SUR LA V5)
le CRC (codé sur 2 octets soit 16 bits) cette opération est effectuée automatiquement par la carte modbus interrogée (non visible sur la v5)
EXEMPLE 1 DE REPONSE pour la requête formulée ci-dessus:
01 03 02 00 DB F8 1F
Ainsi avec le decodage expliqué ci-dessus les données qui nous intéressent sont 00 DB qui sont converties dans l ANA16 en 219
Il faut alors diviser le résultat obtenu par 10 pour obtenir la température réelle… soit 219/10=21.9 °C
EXEMPLE 2 DE RÉPONSE pour la requête formulée ci-dessus :
01 03 02 FF 90 F2 3F
Les données qui nous intéresse sont : FF 90 converti en decimal 65424.
En binaire la représentation de 65424 commence par 1 ( bit de poids fort) ce qui signifie que la valeur recherchée est une valeur négative… pour obtenir la valeur négative il faut faire :
(65424-65536)/10 = -11.2°C
Notez que si la valeur de retour est 32768 cela signifie que la sonde n’est pas branchée ou est en erreur
Pour répondre, simplement à votre question (si ma longue explication -rédigée depuis mon tel portable - ne vous a pas fait fuir) : j’essaierai avec une ANA16 en mode raw puis y coller un objet fonction qui divise par 10 et le résultat de cet objet fonction devrait donner directement la température recherchée… mais ceci ne sera valable que pour des températures positives
Ne seront pas gérés les températures négatives et les cas d erreurs de sonde… pour gérer ces cas ce sera plus compliqué et je ne suis pas sur que vous en ayez besoin?
EDIT: pensez aussi à rajouter un mécanisme qui permet d’interroger de façon régulière la température pour que la valeur soit rafraîchie
Il y a une incertitude sur l’adresse de début 0 ou 1 selon les différentes documentations trouvé sur unternet. Avec 0 j’ai un message d’erreur « Délais d’attente dépassé ». Avec 1 je vois la led du ma carte clignoter et l’IPX indique « trame envoyé » mais aucune valeur dans mon ANA16.
Visualision faite dans un widget sur le dashboard :
Votre ANA16 est en REAL, je l’aurais mise en RAW…
OK pour le test de l’adresse 0 ou 1… sur la doc que j’ai du chercher en ligne, cela indiquait 0x0000…
Vous ne précisez pas si la mesure de températures négatives vous intéresse ?
Merci encore pour les infos.
Modification de l’ANA16 en RAW, toujours aucune valeur d’affichée
Câblage vérifié RAS, essai avec un autre DS18B20, IPX V5 neuf en version 5.5.7…
J’attends un nouveau module MODBUS pour refaire les mêmes tests.
Concernant les températures négatives, je vais commencer par le plus simple et bien me familiariser avec la V5 et le MODBUS.
Si vous pensez que la carte modbus a un pb de hardware… entre temps vous pouvez peut-être essayer un restore to factory settings en utilisant la commande write 06 avec une sequence comme celle-ci :
01 06 00 03 00 05 B9 C9
Pour cela il faut mettre uniquement sur la ligne modbus la carte dont vous souhaitez modifier l adresse (car elles ont toutes les 2 la meme adresse par defaut : 1)
01: adresse courante de la carte dont on veut changer l adresse (1 octet) à ecrire ds l’objet v5
06: commande WRITE (1 octet) à ecrire ds l’objet v5
00 02 : l adresse du registre (2 octets) à écrire dans l’objet v5
00 03: pour par ex. Mettre la carte à l’adresse 3 (2 octets) à constituer dans une ANA16 dont on fixe la valeur à l’adresse qu’on souhaite qu’il occupe ds la chaine modbus (NB: l’adresse d’un objet esclave dans la chaine modbus doit etre compris entre 1 et 247)
68 0B: le CRC (2 octets) calculé automatiquement par la v5
recevoir la valeur de retour sous la forme:
Ex: 01 06 00 02 00 03 68 0B
01: adresse courante de la carte
06: commande WRITE (1 octet)
00 02 : l adresse du registre (2 octets)
00 03: l’adresse 3 (2 octets) confirmée que l’on retrouve dans l ANA16
68 0B: le CRC (2 octets) retourné (non visible)
Super ! Vous avancez! Les données de températures fonctionnent et se refraichissent?
Votre 2eme carte modbus semble de marque différente de la 1ère… merci pour l’extrait de la doc ( j’en aurais bien voulu un peu plus pour vous guider…)
Dans cet extrait la ligne qui vous intéresse pour la lecture et le changement d’adresse est la ligne 3.
On note l’adresse de registre 0100 en hexadécimal (H) ce qui fait 256 en decimal donc ce n’est pas le registre 0
Faute de documentation, j’ai du mal à comprendre la 2nd colonne
Voila, une nouvelle connexion réussi avec un compteur d’Energie en RTU.
Uniquement deux fils nécessaire (A+ et B-).
J’utilise trois ANA16 pour les registres 12, 13 et 14 comme suit :
Bonsoir
Comme @grocrabe l’a dit, je vous recommande la plus grande prudence avec des compteurs d’énergie peu cher et probablement non conformes aux normes.
Je vous recommande des compteurs à la norme CE ET certifié MID.
Personnellement, j’utilise un EM112 modbus RTU .