Liaison modbus avec compteur energie OR-WE514

Bonjour, mon premier post, j'espéré être au bonne endroit
comme je suis nouveau sur le site je n'ai pas le droit d'envoyer de message avec tous ces liens et images

je vais donc découper en plusieurs morceaux.

Je débute sur la programmation Arduino et je cherche à faire fonctionner du ModBus pour superviser un compteur energie ORNO OR-WE514,

Le problème et que cela ne fonctionne pas, donc je vous donne ma démarche

Je vais donc vous présenter ma démarche et les endroits ou j'ai trouvé de l'information.

Lien vers Orno pour le produit et le logiciel d'analyse modBus :

https://orno.pl/en/product/1078/1-phase-energy-meter-with-rs-485-100a-rs-485-port-mid-1-module-din-th-35mm

En bas de la page vous trouvez le lien vers le programme.

Je cherche à connecter dans un premier temps un compteur énergie Orno OR-WE-514 à une carte Arduino Uno
Pour m’aider à créer le code .ino pour ma carte Arduino Uno.
J’ai utilisé le logiciel Orno et le logiciel ModbusDoctor pour identifier l’ensemble des paramètres à utiliser dans le code .ino
image

14:41:02:513 Write: 01 03 01 31 00 01 D4 39
14:41:02:832 Read: 01 03 02 59 BE 02 64
14:41:03:205 Over

autre mode pour visualiser les infos

je post directement le code car pour l'instant hyper limiter dans les photos et liens
le code ne fonctionne pas dans le monieur serie j'ai:

15:12:13.751 -> 0.0 V

15:12:14.189 -> 1�9failed to read voltage! Connection timed out

15:12:15.268 -> 0.0 V

15:12:15.736 -> 1�9failed to read voltage! Connection timed out

15:12:16.785 -> 0.0 V

15:12:17.245 -> 1�9failed to read voltage! Connection timed out

15:12:18.298 -> 0.0 V


/*
Configuration port 9600,even,8,one
config voltage 0131
08:19:02:030  Write: 01 03 01 31 00 01 D4 39 
08:19:02:347  Read: 01 03 02 5C 01 40 84 
*/

//https://forum.arduino.cc/t/inaccuracy-in-reading-rs485-modbus-rtu-data/698693/10

#include <ArduinoRS485.h>
#include <ArduinoModbus.h>


void setup() {

  Serial.begin(9600);
  delay(200);

//Serial.println("j' ai démaré le setup");

  if (!ModbusRTUClient.begin(9600)) {
    //  if (!ModbusRTUClient.begin(9600, SERIAL_8E1)) {
    Serial.println("Failed to start Modbus RTU Client!");

    while (1);
  }
  else
   {

   }
}

void loop() {


  float volt = readVoltage();
  Serial.print(volt, 1);
  Serial.println(" V");
  delay(500);

  //float amp = readCurrent();
  //Serial.print(amp, 1);
  //Serial.println(" A");
  //delay(2000);
  //float watt = readPower();
  //Serial.print(watt, 1);
  //Serial.println(" W");
  //delay(2000);
  
}


float readVoltage() {
  float volt = 0.;

  //if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x00F3, 1)) {           // make the call to the register

  if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0131, 1)) { 
    Serial.print("failed to read voltage! ");
    Serial.println(ModbusRTUClient.lastError());  

  } else {
    uint16_t word1 = ModbusRTUClient.read();                                       // read data from the buffer
    volt = word1 / 10.0;
  }
  return volt;
}


/*
float readCurrent() {
  float ampere = 0;
  if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x00F9, 1)) {           // make the call to the register
    Serial.print("failed to read current! ");
    Serial.println(ModbusRTUClient.lastError());                                  // error handler
  } else {
    uint16_t word1 = ModbusRTUClient.read();                                       // read data from the buffer
    ampere = word1/10.0;
  }
  return ampere;
}

float readPower() {
  float watt = 0;
  //if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x00FD, 2)) {
     if (!ModbusRTUClient.requestFrom(0x01, HOLDING_REGISTERS, 0x0131, 2)) {            // make the call to the register
    Serial.print("failed to read power! ");
    Serial.println(ModbusRTUClient.lastError());                                  // error handler
  } else {
    int16_t word1 = ModbusRTUClient.read();                                       // read data from the buffer
    int16_t word2 = ModbusRTUClient.read();
    int32_t WATT = word1 << 16 | word2;                                           // bit math
    watt = WATT;
  }
  return watt;

}
  */
  

Suite des infos

Voici le montage
image

Lien pour préparer mon code

Lien produit :
https://www.partner.orno.pl/manuals/OR-WE-512,514,515_manual_EN.pdf

Lien pour configuration :
[https://github.com/gituser-rk/orno-modbus-mqtt/blob/master/Register%20description%20OR-WE-514%26OR-WE-515.pdf]

Autre Lien pour configuration :
https://www.aggsoft.com/serial-data-logger/tutorials/modbus-data-logging/orno-or-we-514-or-we-515.htm

Pour faire le code .ino je suis partie des infos du lien ci-dessous ou j’ai pris que les infos pour lire la tension.

Je vois un conflit sur la liaison série qui sert à la fois pour dialoguer avec le compteur et envoyer les infos reçues vers le moniteur série.
La liaison série n'est pas correctement initialisée pour dialoguer avec le compteur la parité doit être paire or dans la configuration par défaut c'est sans parité.

Je suggère :

  • de conserver Serial pour le dialogue avec le moniteur série
  • d'utiliser softwareSerial pour dialoguer avec le compteur

Je vois surtout une incompatibilité de la librairie avec une Arduino Uno (si c'est bien la carte que tu utilises) voir ici

Bonjour @fdufnews

Merci pour ce retour

J'avais bien vu ce lien et le message suivant lors du téléversement:


> ATTENTION: la bibliothèque ArduinoRS485 prétend être exécutable sur la (ou les) architecture(s) samd, mbed_portenta, mbed_opta et peut être incompatible avec votre carte actuelle qui s'exécute sur avr.
ATTENTION: la bibliothèque ArduinoModbus prétend être exécutable sur la (ou les) architecture(s) megaavr, samd, mbed_nano, mbed_portenta, mbed_opta et peut être incompatible avec votre carte actuelle qui s'exécute sur avr.

Si j'utilise

#include <Modbus.h>

c'est pire j'ai:

C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino: In function 'void setup()':
C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino:28:8: error: 'ModbusRTUClient' was not declared in this scope
   if (!ModbusRTUClient.begin(9600)) {
        ^~~~~~~~~~~~~~~
C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino: In function 'float readVoltage()':
C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino:65:8: error: 'ModbusRTUClient' was not declared in this scope
   if (!ModbusRTUClient.requestFrom(1, HOLDING_REGISTERS, 0x0131, 1)) {
        ^~~~~~~~~~~~~~~
C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino:65:39: error: 'HOLDING_REGISTERS' was not declared in this scope
   if (!ModbusRTUClient.requestFrom(1, HOLDING_REGISTERS, 0x0131, 1)) {
                                       ^~~~~~~~~~~~~~~~~
Plusieurs bibliothèque trouvées pour "Modbus.h"
  Utilisé: C:\Users\richa\Documents\Arduino\libraries\Modbus
  Non utilisé: C:\Users\richa\Documents\Arduino\libraries\modbus-esp8266
exit status 1

Compilation error: 'ModbusRTUClient' was not declared in this scope

Je ne sais pas quoi faire car pas de compétences informatique.

Peux tu me donner un bout de code de remplacement ou plus de détail pour corriger

Bonne journée

cette librairie devrait être compatible AVR :

J'ai installé la nouvelle librairie

Je n'ai plus de message sur compatibilité carte

Maintenant je suis sur le message suivant

C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino: In function 'void setup()':
C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino:23:8: error: 'ModbusRTUClient' was not declared in this scope
   if (!ModbusRTUClient.begin(9600)) {
        ^~~~~~~~~~~~~~~
C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino: In function 'float readVoltage()':
C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino:60:8: error: 'ModbusRTUClient' was not declared in this scope
   if (!ModbusRTUClient.requestFrom(1, HOLDING_REGISTERS, 0x0131, 1)) {
        ^~~~~~~~~~~~~~~
C:\Users\richa\Bureau\modbus_test3\modbus_test3.ino:60:39: error: 'HOLDING_REGISTERS' was not declared in this scope
   if (!ModbusRTUClient.requestFrom(1, HOLDING_REGISTERS, 0x0131, 1)) {
                                       ^~~~~~~~~~~~~~~~~

exit status 1

Compilation error: 'ModbusRTUClient' was not declared in this scope

Le compilateur t'indique que cet objet ModbusRTUClient, n'a jamais été déclaré.
Ou est-il déclaré ?

Oui justement je ne sais pas et comment je dois faire, c'est bien la mon probléme.

Le mieux dans ce cas là est de regarder ce que l'exemple de la librairie te propose.
Je suppose que tu as laissé ton code issue d'une autre librairie, du coup rien ne te garantie qu'il initialise les mêmes objets.

il n'y a pas d'exemples

j'ai supprimé les autre bibliothèque qui concernent Modbus

le code suivant vient d'où alors ?

if (!ModbusRTUClient.begin(9600)) {

Dans ce cas il faut regarder le fichier d'en-tête de la librairie que tu as inclus pour voir le prototypage des fonctions.

Si on regarde le fichier Modbus.h il n'y a pas d'instanciation automatique, il faut donc que tu instancie toi-même un objet pour pouvoir utiliser les fonctionnalités fournies.

D'ici

Rien au niveau de la dernière bibliothèque que tu as proposé

Ceci n'est pas dans mes compétences je suis pas informaticien

Tu es donc électronicien ?

Trêve de plaisanterie, un lien pour appréhender ce dont je te parle

Oui j'ai bien compris qu' il me faut des bases,

Vu que j'apprends pas vite je ne suis pas prêt de sortir ce projet.

Concrètement aujourd’hui' j'ai besoin d'une personne qui débug le code et me donne les choses à faire pour le faire tourner ou qui me propose une solution qui tourne

Beaucoup attendent aussi quelque chose de ta pars pour t'aider.
Le soucis c'est qu'on peut t'indiquer ce qu'il faut faire pour ce cas précis, mais cela ne t'avancera pas vraiment, puisque tu ne semble pas comprendre ce que tu fais, donc forcément comment le faire et quoi faire après.

La le problème de mon point de vue, n'est pas de débugger du code existant, mais de le créer.

Ne le prends pas comme une moquerie, mais je t'ai indiqué les choses à faire.
Il faut instancier(créer) l'objet ModbusRTUClient pour pouvoir l'utiliser.
Le problème c'est que cet objet est lié à une librairie que tu n'utilise pas, donc si tu change de librairie, il y a une grosse probabilité de devoir changer le code.

Oui j'ai,bien compris
Par contre je ne vois pas comment faire, j'aurai besoin d'un exemple pour comprendre et adapter

Du genre ligne a écrire dans le ino en fonction de la bibliothèque que j'utilise

De mon coté je comprend mieux par des exemples

hello

ici

par le gestionnaire de librairies, il te sera demandé au téléchargement si tu veux y adjoindre "ArduinoRS485", car elle est nécessaire à "ArduinoModbus".

@dfgh
J'avais déjà cette bibliothèque dans cette version

Malgré le message du site d' installation qui dit:

Compatibility

This library is compatible with the megaavr, samd, mbed_nano, mbed_portenta, mbed_opta architectures

lorsque je téléverse j'ai le message suivant

ATTENTION: la bibliothèque ArduinoModbus prétend être exécutable sur la (ou les) architecture(s) megaavr, samd, mbed_nano, mbed_portenta, mbed_opta et peut être incompatible avec votre carte actuelle qui s'exécute sur avr.
ATTENTION: la bibliothèque ArduinoRS485 prétend être exécutable sur la (ou les) architecture(s) samd, mbed_portenta, mbed_opta et peut être incompatible avec votre carte actuelle qui s'exécute sur avr.
Le croquis utilise 16882 octets (52%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 1639 octets (80%) de mémoire dynamique, ce qui laisse 409 octets pour les variables locales. Le maximum est de 2048 octets.

Dans mon programme j'ai bien

#include <ArduinoRS485.h>
#include <ArduinoModbus.h>

Dans la console série j'ai:

1�9failed to read voltage! Connection timed out

0.0 V

1�9failed to read voltage! Connection timed out

0.0 V

1�9failed to read voltage! Connection timed out

0.0 V

1�9failed to read voltage! Connection timed out

0.0 V