[Aide] Modbus + Shield RS485 avec régulateur

Bonjour à tous,

Je bosse actuellement sur un projet visant à récupérer des informations analogiques (température notamment…) d’un régulateur de marque Ascon, le X5 pour être précis pour ensuite pouvoir ensuite faire du monitoring.

Pour communiquer, le régulateur utilise le protocole Modbus en RS485 , j’ai à m’a disposition en plus la table Modbus spécifique pour mon régulateur (cf Modbus ascon de la page 59 à page 75).

Du coté Hardware, je possède une Arduino Mega ainsi qu’un Shield RS485 TTL (https://www.fiabiparkp.com/index.php?main_page=product_info∏ucts_id=529549).

J’ai a peux près compris le fonctionnement du protocole Modbus:
on rentre l’adresse de l’esclave, la fonction qu’on veut qu’il réalise, l’adresse à partir de laquelle il commence à réaliser cette dite fonction puis le nombre de registres sur lequel on l’applique.

Par exemple, dans mon cas si je veux lire une valeur : Ox02 (addresse de mon regulateur)
Ox03 ou 04 ( pour lire) Ox40 ( 64 en decimal pour lire un statut ) Ox 01 ( on lit un registre)

Dans mon cas, ma carte arduino fonctionne en maître tandis que mon régulateur en esclave.

J’en viens à mon/mes problèmes :

*le 1er étant au niveau câblage pur (cf Schéma câblage) , je ne sais où brancher les pins RxD & TxD de mon shield, pour l’instant elles sont au niveau des pins 10 & 11 car j’utilise la librairie “software serial” ainsi que s’il faut bien que je câble mon régulateur en mode Esclave.

*Le second au niveau logiciel, je suis un peu submerger au niveau information et ne ses donc pas quelles librairies utilisé. Pour l’instant, j’utilise les librairies software serial ainsi que ModbusRtu.

voici mon code actuel :

#include <ModbusRtu.h>

#include <SoftwareSerial.h>

// data array for modbus network sharing
uint16_t au16data[16];
uint8_t u8state;

/**
 *  Modbus object declaration
 *  u8id : node id = 0 for master, = 1..247 for slave
 *  u8serno : serial port (use 0 for Serial)
 *  u8txenpin : 0 for RS-232 and USB-FTDI 
 *               or any pin number > 1 for RS-485
 */
Modbus master(0); // this is master and RS-232 or USB-FTDI via software serial

/**
 * This is an structe which contains a query to an slave device
 */
modbus_t telegram;

unsigned long u32wait;

SoftwareSerial mySerial(10, 11);//Create a SoftwareSerial object so that we can use software serial. Search "software serial" on Arduino.cc to find out more details.

void setup() {
  Serial.begin(9600);//use the hardware serial if you want to connect to your computer via usb cable, etc.
  master.begin( &mySerial, 9600 ); // begin the ModBus object. The first parameter is the address of your SoftwareSerial address. Do not forget the "&". 9600 means baud-rate at 9600
  master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll over
  u32wait = millis() + 1000;
  u8state = 0; 
}

void loop() {
  switch( u8state ) {
  case 0: 
    if (millis() > u32wait) u8state++; // wait state
    break;
  case 1: 
    telegram.u8id = 0x02; // slave address
    telegram.u8fct = 0x03; // function code (this one is registers read)
    telegram.u16RegAdd = 0x40; // start address in slave
    telegram.u16CoilsNo = 0x03; // number of elements (coils or registers) to read
    telegram.au16reg = au16data; // pointer to a memory array in the Arduino

    master.query( telegram ); // send query (only once)
    u8state++;
    break;
  case 2:
    master.poll(); // check incoming messages
    if (master.getState() == COM_IDLE) {
      u8state = 0;
      u32wait = millis() + 2000; 
        Serial.println(au16data[0]);//Or do something else!
        Serial.println(au16data[1]);//Or do something else!
        Serial.println(au16data[2]);//Or do something else!
        Serial.println(au16data[3]);//Or do something else!
        Serial.println(au16data[4]);//Or do something else!
        Serial.println(au16data[5]);//Or do something else!
        Serial.println(au16data[6]);//Or do something else!
        Serial.println(au16data[7]);//Or do something else!
        Serial.println(au16data[8]);//Or do something else!
        Serial.println(au16data[9]);//Or do something else!
        Serial.println(au16data[10]);//Or do something else!
        Serial.println(au16data[11]);//Or do something else!
        Serial.println(au16data[12]);//Or do something else!
        Serial.println(au16data[13]);//Or do something else!
        Serial.println(au16data[14]);//Or do something else!
        Serial.println(au16data[15]);//Or do something else!
    }
    break;
  }
}

Merci d’avance,

Cordialement

Schéma cablage.pdf (168 KB)

Cette rubrique est réservée aux “Réalisations et Projets Finis”.
SVP utiliser le lien “Report to moderator” pour demander au modo de déplacer ce sujet dans le forum principal.