Hilfe beim Modbus

Hi Forum,

ich habe ein Projekt bekommen wo ich etwas mit einem Modbus rumprobieren soll. Ich habe ein Arduino nano, einen RS-485 Adapter und das Gerät wo der A und B Anschluss vom Modbus rausgeführt ist.

A und B vom RS-485 Adapter hängen an dem Gerät, R0 ist RX, D1 ist an TX und DE+RE ist an Pin7

Der Ausbilder ist Leider nicht da, weshalb ich nicht fragen kann...

folgenden Code hab ich:

/**
    Modbus master example 2:
    The purpose of this example is to query several sets of data
    from an external Modbus slave device.
    The link media can be USB or RS232.

    Recommended Modbus slave:
    diagslave http://www.modbusdriver.com/diagslave.html

    In a Linux box, run
    "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1"
    This is:
     serial port /dev/ttyUSB0 at 19200 baud 8N1
    RTU mode and address @1

*/

//// http://pdacontrol.blogspot.com.co/2016/03/pruebas-libreria-modbus-rtu-maestro-con.html



#include <ModbusRtu.h>


uint16_t au16data[32]; //!< data array for modbus network sharing  Array
uint8_t u8state; //!< machine state
uint8_t u8query; //!< pointer to message query

/**
    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, 0, 7); // this is master and RS-232 or USB-FTDI  ///  7 = PIN ENEABLE rs485

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

unsigned long u32wait;



void setup() {

  Serial.begin(9600);
  //////////////////////////////

  // telegram 0: read registers
  telegram[0].u8id = 240;                 // slave address
  telegram[0].u8fct = 4;                // function code (registers read multiple  3)
  telegram[0].u16RegAdd = 30061;            // start address in slave -  direccion de Inicio 0
  telegram[0].u16CoilsNo = 7;          // number of elements (coils or registers) to read  0 - 16
  telegram[0].au16reg = au16data;       // pointer to a memory array in the Arduino - Almacenamiento en Array de memoria de arduino

  // telegram 1: write a multiple  register = function 16
  telegram[1].u8id = 1;                 // slave address
  telegram[1].u8fct = 16;               // function code (write multiple registers 16 )
  telegram[1].u16RegAdd = 10;           // start address in slave  -  direccion de Inicio 10
  telegram[1].u16CoilsNo = 10;          // number of elements (coils or registers) to read
  telegram[1].au16reg = au16data + 10;  // pointer to a memory array in the Arduino - Almacenamiento en Array de memoria de arduino 10 posiciones despues


  master.begin( 9600 ); // baud-rate at 19200
  master.setTimeOut( 5000 ); // if there is no answer in 5000 ms, roll over
  u32wait = millis() + 1000;
  u8state = u8query = 0;
}

void loop() {
  switch ( u8state ) {
    case 0:
      if (millis() > u32wait) u8state++; // wait state
      break;
    case 1:
      master.query( telegram[u8query] ); // send query (only once)
      u8state++;
      u8query++;
      if (u8query > 2) u8query = 0;
      break;
    case 2:
      master.poll(); // check incoming messages
      if (master.getState() == COM_IDLE) {
        u8state = 0;
        u32wait = millis() + 1000;
      }
      break;
  }


  //Read Multiple Holding Register  - Lectura de multiples registros

  Serial.print(au16data[0]);    // Read Holding Register [0]
  Serial.print(au16data[1]);    // Read Holding Register [1]
  Serial.print(au16data[2]);    // Read Holding Register [2]
  Serial.print(au16data[3]);    // Read Holding Register [3]
  Serial.println(au16data[4]);    // Read Holding Register [4]

  Serial.print(au16data[5]);   // Read Holding Register [5]
  Serial.print(au16data[6]);   // Read Holding Register [6]
  Serial.print(au16data[7]);   // Read Holding Register [7]
  Serial.print(au16data[8]);   // Read Holding Register [8]
  Serial.println(au16data[9]);   // Read Holding Register [9]




  //Write Multiple Holding Register  - Escritura de multiples registros

  au16data[10] = analogRead( 0 ); // Write Holding Register [10]

  au16data[11] = analogRead( 0 ); // Write Holding Register [11]

  au16data[12] = analogRead( 0 ); // Write Holding Register [12]

  au16data[13] = analogRead( 0 ); // Write Holding Register [13]

  au16data[14] = analogRead( 0 ); // Write Holding Register [14]

  au16data[15] = analogRead( 0 ); // Write Holding Register [15]

  au16data[16] = analogRead( 0 ); // Write Holding Register [16]

  au16data[17] = analogRead( 0 ); // Write Holding Register [17]

  au16data[18] = analogRead( 0 ); // Write Holding Register [18]

  au16data[19] = analogRead( 0 ); // Write Holding Register [19]


  Serial.print(au16data[10]);
  Serial.print(au16data[11]);
  Serial.print(au16data[12]);
  Serial.print(au16data[13]);
  Serial.print(au16data[14]);
  Serial.print(au16data[15]);
  Serial.print(au16data[16]);
  Serial.print(au16data[17]);
  Serial.print(au16data[18]);
  Serial.println(au16data[19]);
  delay(1000);
}

außerdem hab ich diese Daten für den Code bekommen:

"
9600 baud
8 Datenbits
1 Stoppbit
Keine Parität

Slave (Gerät) ID: 240
Adresse 30061 bis 30068
Funktionscode: 4

"

Die Rückantwort soll dann ein datum. Z.B. 16.07.2020 sein jedoch bekomme ich nur eine ellenlange Zahl. Weß jemand was ich falsch mache ?

Ich habe auch schon statt Pin7 den Pin A0 genommen weil im Code analogRead steht, was ich nicht verstehe, hat aber auch nichts gebracht.

danke schonmal

Mfg Luca

das habe ich eben noch geändert. Die Zahl ist aber noch länger geworden.

/**
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(240, 0, 7); // this is master and RS-232 or USB-FTDI /// 7 = PIN ENEABLE rs485

Du musst der Master sein sonst wirst du keine Daten anfordern können denke ich mal.
Ich habe damit auch keine Erfahrung, dennoch vermute ich dass du die Zahl die dir zurückgesendet wird erst einmal umwandeln musst!?

Gruß