RS485 Modbus Topologie ?

Kayle

Level-1
Beiträge
161
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich würde gerne eine Modbus RS485 RTU Kommunikation mit einer Wago 750-881 und Modbus Thermostaten aufbauen. Ich habe von jedem Raum aus ein 4x2x0,8 J-Y(ST)Y im Schaltschrank liegen. Jetzt habe ich gelesen das man bei RS485 keine langen Stichleitungen machen soll. Jetzt ist mein Gedanke:

Ich schleife die A und B Leitung zum Thermostat und von dort wieder durch das gleiche Kabel auf anderen Adern zurück in den Schaltschrank. Von dort aus in das nächste 4x2x0,8 für Raum 2. Dort wieder das gleiche Spiel für die nächsten Räume. Kann das so funktionieren ?

Gruß Kay
 
Warum willst du A und B zurückführen?

In einem aktuellen Projekt bei mir geht eine Stichleitung aus dem Keller über weitere 3 Etagen zu einer Wetterstation auf dem Dachfirst. Das sind im Ganzen mindestens 25m. Hatte bis jetzt keine Probleme. Terminierung ist natürlich auch drin. Geschwindigkeit ist 19200.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

ich will die Adern zurückführen damit der Bus "in Reihe" bleibt. Mit Stichleitungen handelt man sich im Regelfall Reflexionen ein. Das kann funktionieren, muss aber nicht. Wollte hier auf Nummer sicher gehen und diese Durchschleifen dafür nehmen das alles in Reihe bleibt.

Gruß Kay
 
Also ich hab mehrere Stiche und an den Meisten sind auch selbstentwickelte Module dran. Wie gesagt, bis jetzt keine Probleme. Hast du es denn einfach mal probiert?
Und damit du minimiale Reflexionen hast, baust du doch Abschlusswiderstände ein, meistens 120 Ohm.
 
Zuletzt bearbeitet:
Ich probiere es dann einfach mal aus.

Danke und Gruß Kay

Gesendet von meinem Elephone P8000 mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

habe heute ein paar Tests gemacht. Zuerst habe ich an jeden Strang einen Slave angeschlossen und einzeln an der Wago getestet. Wenn nur 1 Slave an der Wago hängt funktioniert die Kommunikation einwandfrei. Dann habe ich zwei Slaves in Reihe ( also A+B hin und A+B wieder zurück durchs gleiche Kabel ) an de Wago angeschlossen. Es funktioniert dann nur 1 Slave. Und zwar der ohne Abschlusswiderstand. Der Slave mit Abschlusswiderstand ist dann nicht erreichbar. Habe dann den RS485 Baustein an den Slaves getauscht und dann geht der anderer Slave. Auch bei Parallelschaltung anstatt in Reihe habe ich das gleiche Problem. Abschlusswiderstand ist 120 Ohm. Ich bin mit meinem Latein langsam am Ende und suche jetzt nach eine Lösung.

Jemand eine Idee ?

Gruß Kay
 
Was ist wenn du einfach zwei Slaves an einem Strang machst und am 2. Slave die Terminierung? Also wie man es eigentlich immer macht.
 
Auch hier funktioniert nur der letzte Slave. Also der mit dem Abschlusswiderstand. Wenn ich den Abschlusswiderstand an den anderen Slave setze funktioniert nur dieser.

Gruß Kay

Gesendet von meinem Elephone P8000 mit Tapatalk
 
Ja genau so. Sind die bias Widerstände in der Wago vorhanden? Muss ich direkt mal nachlesen.

Gesendet von meinem Elephone P8000 mit Tapatalk
 
Welche Adressen hast du vergeben? Wie ist die Geschwindigkeit? Parität, Datenbits?
A und B nicht vertauscht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ist A + B Twisted Pairs, also verdrillt ?
Ich habe A+B angeschlossen, sowie GND auch !
Ob das mit GND mit der Verdratung mit den Widerständen gut ist, kann ich aber nicht sagen.
Habe das ohne den Rs.

Bei DMX (Lichtsteuerung), die ebenfalls RS485 ist, haben wir Ethernetleitungen genommen und die RJ45 Stecker abgeschnitten.
Ethernetleitungen haben Twisted Pairs und sind abgeschirmt.
Geht mit 250 kBaud und 50m, + 120 Ohm Anschuss, alles als Strang.
 
Hallo zusammen,

- Kabel ist YSTY 4x2x0,8
- Adernpaare sind verdrillt
- GND ist angeschlossen
- Schnittstellenparameter = 9600, 8, N, 1
- Adressen an den Slaves 1 und 2
- Protokoll ist Modbus RTU

Habe mehrfach die Leitungen durchgeklingelt um ein vertauschen auszuschließen. Da es ja mit nur einem Slave jeweils funktioniert sollte A+B nicht vertauscht sein. Ohne Abschlusswiderstand funktioniert es garnicht. Habe zum testen auch mal einen RS485 zu USB Adapter angeschlossen. Hier ist das Problem das gleiche. Schließe also ein Problem mit der Wago hinsichtlich Anschluss auch aus.

Die Adern in den Kabeln sind verdrillt. Im Schaltschrank und an den Slaves sind die Kabel auf ca. 20 cm nicht mehr verdrillt. Sollte das das Problem sein ? Vielleicht teste ich mal mit verschiedenen Geschwindigkeiten um herauszufinden an was es liegt. Meine Vermutung -> je höher die Geschwindigkeit desto größer die Reflexionen ?

Danke und Gruß
Kay
 
Also bei mir läuft der Modbus standardmäßig mit 19200, 8E1. Die freien Adern sind auch nicht verdrillt (im Kabel natürlich schon) und GND hab ich nicht angeschlossen.
 
LiYCY-0 4x0,25 paarweise verdrillt und im Ganzen geschirmt. Die Slaves werden mit 24V versorgt.
 
Nabend,

ok ich konnte das Problem eingrenzen. Problem sind die Slaves. Diese sind selbst gebaut mit diesen Modulen:

http://www.dx.com/p/ttl-to-rs485-module-for-arduino-green-163849#.V6eJEaKzzA0

Habe zum testen die Slaves auf einem Tisch aufgebaut mit ca. 20cm Kabeln dazwischen. Hier habe ich das gleiche Problem wie in meiner Installation. Nur der Slave mit Widerstand wird erkannt und ausgelesen.

Muss weiter forschen. Melde mich wenn ich weiter gekommen bin.

Gruß Kay
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Immer dieses "speziell für Arduino". Das ist ein stinknormaler RS485-Treiber.

Für meine Modbus-Slaves nutze ich freemodbus in C. Die sind auch selbstentwickelt (Schaltung und Layout).

Wenn du willst, kannst du mir mal deinen Code schicken, dann kann ich mal drüberschauen.
 
Ich weiß ... es ist ein MAX485 verbaut. Ist halt günstig gewesen :)

Hier der Code:

Code:
/*
 * Raumthermostat RS485 Modbus
 * 4 Holding Register
 * Version 0.1 für HW Version 0.0.0.1
 * 
 * Register 0 = Temperatur * 10
 * Register 1 = Luftfeuchte * 10
 * Register 2 = Update Interval SHT31
 * Register 3 = LED ein / aus 
 * 
 */


//Includes & Defines
#include <Adafruit_SHT31.h>
#include <Wire.h>
#include <SimpleModbusSlave.h>
#define  ledPin  12 

//Sensor deklarieren
Adafruit_SHT31 sht31 = Adafruit_SHT31();

//Deklarationen
boolean value = LOW;                  // Startwert der LED
unsigned long previousMillis = 0; // speichert wie viele Sekunden seit derletzten Änderung vergangen sind
unsigned long interval = 10000;    // Interval zwischen zwei Änderungen


//Register deklarieren
enum 
{     
  temp,
  humidity,
  timer_interval,
  led,
  TOTAL_ERRORS,
  // leave this one
  TOTAL_REGS_SIZE 
  // total number of registers for function 3 and 16 share the same register array
};

unsigned int holdingRegs[TOTAL_REGS_SIZE]; // function 3 and 16 register array

//Setup
void setup()
{
  
  modbus_configure(9600, 1, 4, TOTAL_REGS_SIZE, 0);
  pinMode(ledPin, OUTPUT);
  sht31.begin(0x44);
  
}

//Hauptprogramm
void loop()
{
  holdingRegs[TOTAL_ERRORS] = modbus_update(holdingRegs);
  //holdingRegs[TOTAL_REGS_SIZE] = TOTAL_REGS_SIZE;
  //Abfrage ob Interval Wert über Modbus eingestellt wurde. Minimaler Interval ist 10s
  if (holdingRegs[2] < 10000)
  {
    holdingRegs[2]=10000;
    interval = 10000;
  }
    else
  {
    interval = holdingRegs[2];
  }

  //Interval für Abfrage von SHT31 Sensor
  if (millis() - previousMillis > interval) 
  {
    previousMillis = millis();   // aktuelle Zeit abspeichern

    // LED Zustand wecheln.
    value = !value;

    // Wert auf den Ausgang schreiben
    digitalWrite(ledPin, value);
  
    holdingRegs[0] = sht31.readTemperature()*10;
    holdingRegs[1] = sht31.readHumidity()*10;

    }

  //Regsiter 4 für LED einschalten
   if (holdingRegs[3]==0)
   {
    digitalWrite(13,LOW);
   }
   else
   {
    digitalWrite(13,HIGH);
   }


  
}

Das ganze läuft auf einem Arduino Pro Mini. Habe an einem der RS485 Module den 120 Ohm R7 entfernt.

Hier ein Bild vom Board:
Front_Sensor.png

Schaltplan:
schematic.jpg

Layout:
board.jpg

Gruß Kay
 
Zuletzt bearbeitet:

Dann mal eine LED mit Vorwiderstand an den Sender_Enable_Pin löten.
Ich kann mir vorstellen, dass der "Sender" nicht (mehr) abgeschaltet wird.
Sollte also mind. 3 Leitungen zum RS485 Treiber gehen:
RxD, TxD und die RE,DE zum Sender und Empfänger (meist parallel).

Mobi kann das auch am Code erkennen.

@Mobi:
> Immer dieses "speziell für Arduino"
so funktioniert das "Marketing".
(Ich benutze den SN75176 auch wenn der ca. 50mA braucht, der Max so um 1mA.)
 
Zurück
Oben