Arduino Modbus Joy-it RS485 shield Serial1

Moin zusammen,

ich habe einen Arduino Uno
ein Joy-it RS485 Shield
und ein ModBus Slave bei dem ich das "Read holding registers (0x03)" 2000 auslesen will. Derzeit steht darin eine 132

Am Raspberry mit PyMod klappt es:

> client.read_holding_registers unit=1 address=2000 count=1                                                                                                                                                                                                             
{
    "registers": [
        132
    ]
}

Am RasPi habe ich einen EX9530 USB > 485 Wandler dran den ich mit

pymodbus.console serial --method rtu --port /dev/ttyUSB0 --baudrate 57600 --stopbits 2 --parity n --bytesize 8

mit dem Slave verbinde und mit obigen Befehlt das Register 2000 auslese. Schreiben von anderen Registern klappt auch, ebenso das Auslesen einer Adressgruppe (z.B. Adresse 100-118). Also der Slave arbeitet und macht was er soll.

Als Lib wollte ich die Modbus Master.h von Doc Walker verwenden.

Mein bisheriger Code, er basiert auf dem Beispiel "RS485_HalfDuplex"

#include <ModbusMaster.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h> 

ModbusMaster node;                                               // instantiate ModbusMaster object
SoftwareSerial RS485_BUS(2,3);
LiquidCrystal_I2C lcd(0x27,16,2);                            // set the LCD address to 0x27 for a 16 chars and 2 line display

#define MAX485_DE     9     // 3
#define MAX485_RE_NEG 9     // 2

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

void setup() {
  lcd.init();                                                        // initialize the lcd 
  lcd.backlight();                                               
  lcd.setCursor(0,0);                                          // Print a message to the LCD
  lcd.print("booting...");
  pinMode(MAX485_RE_NEG, OUTPUT);
  pinMode(MAX485_DE, OUTPUT);
  digitalWrite(MAX485_RE_NEG, 0);                                // Init in receive mode
  digitalWrite(MAX485_DE, 0);
  RS485_BUS.begin(57600);                                        // init serial port for bus 2
  node.begin(1, RS485_BUS);                                      // start the Modbus RTU server, with (slave) id 1
  node.preTransmission(preTransmission);
  node.postTransmission(postTransmission);
  lcd.init();                                                    // Display neu init
}

void loop() {
//  int8_t result;           
  int reg2000 = -1;
  
  reg2000 = node.readHoldingRegisters(0x2000, 1);
  lcd.setCursor(0,0);
  lcd.print("Position ");
  lcd.setCursor(10,0);
  lcd.print(reg2000);
  lcd.setCursor(14,0);
  lcd.print(" \337");
}

Es wird etwas ausgelesen, dass hat aber nichts mit dem tatsächlichen Wert zu tun, ist auch egal welches Register ich auslesen will. In Register 2000 ist ne 132, in 2001 eine 0, aus beiden bekomme ich eine 226, glaube also das da noch gar nichts ausgelesen wird.

Der UNO hat nur eine Serielle, gejumpert ist er jetzt auf D2 und D3, deswegen software Serial. Für die Umschaltung von senden zu empfangen ist bei dem JoY-it RS485 D9 vorgesehen

Hat schonmal jemand das Joy-it RS485 Board für Modbus RTU benutzt? Ich bin mit nicht sicher ob ich es überhaupt richtig anspreche.

Hast Du alles schon mal mit einem Mega getestet, mit Hardware Serial1? Und mit Full Duplex? Wenn das funktioniert, kann man sich langsam an den Fehler herantasten.

nen Mega habe ich leider nicht. Ich habe aber das Sketch schonmal auf serial port0 geändert und dementsprechend auf dem RS485 Shield umgejumpert, es kamen die gleichen Ergebnisse. Ich denke also das es eher an der Umschaltung Senden und Empfangen liegt. Auf dem Shield ist ein 7LB184 verbaut. Leider habe ich nirgends Beispiel Sketche mit diesem Shield gefunden. Es wird aber bei Conrad, Reichelt, ELV, Völkner und Pollen vertrieben, also die üblichen Verdächtigen..

Edit 25.02.19 8:20
habe mir mal die Datenblätter der des ICs rausgesucht. Pinout ist identisch vom Max485, der TI scheint nen Clone vom Maxim zu sein, oder andersrum. Wenn das Shield auf D9 gejumpert ist muss D9 HIGH sein um Daten zu empfangen (RX), bei LOW wird gesendet (TX) so verstehe ich das.

Alte Topic, und entschuldigung fur mein deutsch, ist nicht mein erste Sprache aber diese Topic ist in dieser zustand nicht vollstandig. Hatte auch das Problem weil ich Serial (0 und 1) behalten wollte und SoftwareSerial war das Antwort. Nach bedarf den Jumper auf D2-D7 (RX/TX) setzen, Beispiel von Joy-it (https://joy-it.net/files/files/Produkte/ARD-RS485/ARD-RS485-Manual-19-12-19.pdf) andern: Serial ersetzen mit den SoftwareSerial variabele. Zum Beispiel (mit den ModbusMaster library, aber ohne soll auch klappen):

#include <ModbusMaster.h>
#include <SoftwareSerial.h>

SoftwareSerial rs485(2, 3); // RX, TX
ModbusMaster node;

void setup()
{
   Serial.begin(19200);
   rs485.begin(19200);
   node.begin(4, rs485);
}

void loop()
{
 node.writeSingleRegister(0x6060, 4);
 delay(2000);
}

Getestet mit diagslave auf Ubuntu 19.10 (hierfur brauchen sie ein weitere MAX485 -> USB adapter oder vergleichbares):

diagslave -m rtu /dev/ttyUSB1 -b 19200 -a 4 -d 8 -p none -4 1

Nicht vergessen /dev/ttyUSB1 zu ersetzen mit das wichtige tty fur deine Lage.