# Master Slave communication through RS485



## Gillo (10 Dezember 2021)

Ich habe einen Sensor bestellt, der drei Parameter an bestimmten Registeradressen misst. Der Sensor verwendet ein Modbus-Protokoll für die Kommunikation (RS 485). Ich verwende den Arduino als Master und den Sensor als Slave. Da ich den Sensor noch nicht habe, gibt es eine Software (Modsim32), die auf meinem Windows 10 Computer läuft und es mir ermöglicht, einen Slave zu simulieren. Ich möchte meinen Arduino mit der Simulationssoftware über die RS485 mit dem Modbus RTU-Protokoll kommunizieren lassen. Wenn ich das auf der ModbusMaster-Bibliothek basierende Programm ausführe, finde ich an der seriellen Schnittstelle eine 226, was nach dem, was ich gelesen hatte, eine Fehlermeldung ist. Aber warum?
Ich verwende einen Arduino Uno.
Die Kommunikation erfolgt über RS485 und einen USB-Anschluss.

mein RS485 : DollaTek 5PCS 5V MAX485 / RS485 Modul TTL zu RS-485 MCU Entwicklungsboard

mein USB: WINGONEER CH340E USB zu TTL USB zu RS485 Konverter Adapter Windows 7/8 XP Linux Vista

Anhang finden Sie bilder von mein Schaltplan und vom Modsim32 oberfläche

Hier ist mein code:



```
#include <ModbusMaster.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
/*!
  We're using a MAX485-compatible RS485 Transceiver.
  Rx/Tx is hooked up to the hardware serial port at 'Serial'.
  The Data Enable and Receiver Enable pins are hooked up as follows:
*/
#define MAX485_DE      3
#define MAX485_RE_NEG  2

LiquidCrystal_I2C lcd(0x27, 20, 4);

// instantiate ModbusMaster object
ModbusMaster node;

void preTransmission()
{
  digitalWrite(MAX485_RE_NEG, 1);
  digitalWrite(MAX485_DE, 1);
}

void postTransmission()
{
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);
}

void setup()

{
  // Modbus communication runs at 115200 baud
  Serial.begin(9600);

  // Modbus slave ID 10
  node.begin(10, Serial);

  lcd.init();
  lcd.backlight();

  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  // Init in receive mode
  digitalWrite(MAX485_RE_NEG, 0);
  digitalWrite(MAX485_DE, 0);


  // Callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
}



void loop()
{
  uint8_t result;

  // Read 1 registers starting at 0x3100)
  result = node.readInputRegisters(0x3100, 1);   // I am getting 226 here

  lcd.setCursor(0, 0);
  lcd.print(result);

  /*  if (result == node.ku8MBSuccess)
    {
      Serial.print("Vbatt: ");
      Serial.println(node.getResponseBuffer(0x04)/100.0f);
      Serial.print("Vload: ");
      Serial.println(node.getResponseBuffer(0xC0)/100.0f);
      Serial.print("Pload: ");
      Serial.println((node.getResponseBuffer(0x0D) +
                      node.getResponseBuffer(0x0E) << 16)/100.0f);
    }*/

  delay(1000);
}
```


----------



## JSEngineering (10 Dezember 2021)

Gillo schrieb:


> finde ich an der seriellen Schnittstelle eine 226, was nach dem, was ich gelesen hatte, eine Fehlermeldung ist.


Wo hast Du das gelesen?
Und wenn Du das gelesen hast, steht dort auch, was der Fehlercode bedeutet?



Gillo schrieb:


> // Modbus communication runs at 115200 baud
> Serial.begin(9600);


Fehlerhafter Kommentar oder flasche Baud-Rate?

Stimmen die anderen Schnittstellenparameter? Datenbits/Stopbit/Parität?



Gillo schrieb:


> // Read 1 registers starting at 0x3100)
> result = node.readInputRegisters(0x3100, 1);   // I am getting 226 here


Was mußt Du hier angeben? Register, Datenadresse oder Modbus-Adresse?

Datenadresse: 3100
Modbusadresse: 33100
Register: 33101

Und warum gibst Du das Register in Hex an? 0x3100 = 12544

Ich glaube, an dieser Stelle mußt Du gucken und den Fehler suchen...


----------



## PN/DP (10 Dezember 2021)

Kannst Du an dem Simulations-PC die Modbus-Anfragen des Arduino sehen? Vertausche mal testweise die A und B Leitungen (gekreuzt verbinden).

Harald


----------



## Gillo (10 Dezember 2021)

JSEngineering schrieb:


> Wo hast Du das gelesen?
> Und wenn Du das gelesen hast, steht dort auch, was der Fehlercode bedeutet?
> 
> 
> ...





Gillo schrieb:


> result = node.readInputRegisters(0x3100, 1); // I am getting 226 here



1. Ich lese den registerwert(Z.b der Wert 5), und sende eine abfrage an den Slave, um dieser Wert zu lesen. Das Ergebnis von der Abfrage wird in result gespeichert und ich zeige es an einen LCD an. Der Wert von result, der angezeit ist, ist 226.  Normaleweise sollte ich 0(0 bedeutet "Success ") haben.



Gillo schrieb:


> // Modbus communication runs at 115200 baud Serial.begin(9600);



2. Ich habe erstmal den Baud-Rate 115200 benutzt und auf den Slave angepasst, aber es hat nicht geklappt. Deshalb habe ich eine andere probiert.
Die Datenbits, Stoppbit und Parität sind okay



Gillo schrieb:


> result = node.readInputRegisters(0x3100, 1);


3. Laut ModbusMaster bibliothek von Doc Walker muss  man da als erste Parameter die Adresse von der "first input register" und als zweite parameter " quantity of input register to read" angeben.  Also als erste parameter habe ich die register adresse in hexadezimal


----------



## Gillo (10 Dezember 2021)

PN/DP schrieb:


> Kannst Du an dem Simulations-PC die Modbus-Anfragen des Arduino sehen? Vertausche mal testweise die A und B Leitungen (gekreuzt verbinden).
> 
> Harald


Wenn die Verbindung okay ist, wird es an Slave software connection angezeigt. Ich habe auch A und B vertauscht aber ich kriege das gleich ergebnisse


----------



## Hitschkock (10 Dezember 2021)

Hi,
liest du zufällig auch am Arduino auf der USB parallel zu deiner zweiten Schnittstelle?


----------

