# RS485 Modbus Topologie ?



## Kayle (19 Juli 2016)

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


----------



## Mobi (20 Juli 2016)

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.


----------



## Kayle (20 Juli 2016)

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


----------



## Mobi (20 Juli 2016)

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.


----------



## Kayle (20 Juli 2016)

Ich probiere es dann einfach mal aus.

Danke und Gruß Kay

Gesendet von meinem Elephone P8000 mit Tapatalk


----------



## Kayle (6 August 2016)

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


----------



## Mobi (6 August 2016)

Was ist wenn du einfach zwei Slaves an einem Strang machst und am 2. Slave die Terminierung? Also wie man es eigentlich immer macht.


----------



## Kayle (6 August 2016)

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


----------



## Mobi (6 August 2016)

Sehr seltsam. Bei mir funktioniert es prima.

Du hast es so wie hier gemacht? https://www.wut.de/kpics/e-6wwww-12-grde-000.gif
Die Bias-Widerstände sind meist schon im Master integriert.


----------



## Kayle (6 August 2016)

Ja genau so. Sind die bias Widerstände in der Wago vorhanden? Muss ich direkt mal nachlesen.

Gesendet von meinem Elephone P8000 mit Tapatalk


----------



## Mobi (7 August 2016)

Welche Adressen hast du vergeben? Wie ist die Geschwindigkeit? Parität, Datenbits?
A und B nicht vertauscht?


----------



## Senator42 (7 August 2016)

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.


----------



## Kayle (7 August 2016)

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


----------



## Mobi (7 August 2016)

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.


----------



## Kayle (7 August 2016)

Welches Kabel nutzt du? Wie werden die slaves gespeist ?

Gesendet von meinem Elephone P8000 mit Tapatalk


----------



## Mobi (7 August 2016)

LiYCY-0 4x0,25 paarweise verdrillt und im Ganzen geschirmt. Die Slaves werden mit 24V versorgt.


----------



## Kayle (7 August 2016)

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


----------



## Mobi (7 August 2016)

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.


----------



## Kayle (7 August 2016)

Ich weiß ... es ist ein MAX485 verbaut. Ist halt günstig gewesen 

Hier der 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:



Schaltplan:



Layout:



Gruß Kay


----------



## Senator42 (7 August 2016)

Kayle schrieb:


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



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.)


----------



## Mobi (7 August 2016)

@Kayle: Wo hast du festgelegt, welcher Pin für die Sende-/Empfangsrichtung zuständig ist?

@Senator42: Das hat mich schon immer genervt. Auch beim Raspberry Pi.
Ich nutze übriegens den SN65HVD1786D von TI.


----------



## Kayle (7 August 2016)

Senator42 schrieb:


> 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).
> ...



Der RE,DE Pin ist Parallel am Arduino D4 angeschlossen. So auch im Code deklariert. Habe oben in meinem Beitrag Schaltplan und Layout hinzugefügt.

Gruß Kay


----------



## Kayle (7 August 2016)

Mobi schrieb:


> @Kayle: Wo hast du festgelegt, welcher Pin für die Sende-/Empfangsrichtung zuständig ist?
> 
> @Senator42: Das hat mich schon immer genervt. Auch beim Raspberry Pi.
> Ich nutze übriegens den SN65HVD1786D von TI.



Hier:

```
modbus_configure(9600, 1, 4, TOTAL_REGS_SIZE, 0);
```

Die 4 zeigt auf D4.


----------



## Mobi (7 August 2016)

Ah ok. Wundert mich nur.
Weil ich u.a. sowas gefunden hab:
[FONT=&quot]
	
	



```
modbus_configure(&Serial1, baud, SERIAL_8N2, SlaveID, TxEnablePin, HOLDING_REGS_SIZE, holdingRegs);[/FONT][/COLOR][COLOR=#333333][FONT=&quot]
```
Ich kenne natürlich die Modbus Lib von Arduino nicht, aber normalerweise müsste die ja funktionieren.

Hast du mal am PC mit Hilfe des USB-RS485-Adapters einen Master simuliert und mal selber getestet?

[/FONT]


----------



## Mobi (7 August 2016)

Dann müsste deins vielleicht so aussehen:

```
modbus_configure(&Serial1, 9600, 1, 1, 4, TOTAL_REGS_SIZE, holdingRegs);
```


----------



## Kayle (7 August 2016)

Habe nochmal im Samples Ordner der lib nachgesehen und dort wird der Slave wie folgt konfiguriert:


```
[TABLE="class: highlight tab-size js-file-line-container"]
[TR]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#A71D5D]void[/COLOR] [COLOR=#795DA3]setup[/COLOR]()[/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"]{[/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"]  [COLOR=#969896]/* parameters(long baudrate, [/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]                unsigned char ID, [/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]                unsigned char transmit enable pin, [/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]                unsigned int holding registers size,[/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]                unsigned char low latency)[/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]                [/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]     The transmit enable pin is used in half duplex communication to activate a MAX485 or similar[/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]     to deactivate this mode use any value < 2 because 0 & 1 is reserved for Rx & Tx.[/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]     Low latency delays makes the implementation non-standard[/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]     but practically it works with all major modbus master implementations.[/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"][COLOR=#969896]  */[/COLOR][/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"]  [/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"]  [COLOR=#0086B3]modbus_configure[/COLOR]([COLOR=#0086B3]115200[/COLOR], [COLOR=#0086B3]1[/COLOR], [COLOR=#0086B3]2[/COLOR], TOTAL_REGS_SIZE, [COLOR=#0086B3]0[/COLOR]);[/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"]  [COLOR=#0086B3]pinMode[/COLOR](ledPin, OUTPUT);[/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"]  [COLOR=#0086B3]pinMode[/COLOR](buttonPin, INPUT);[/TD]
[/TR]
[TR]
[TD="class: blob-num js-line-number, align: right"][/TD]
[TD="class: blob-code blob-code-inner js-file-line"]}[/TD]
[/TR]
[/TABLE]
```

Was mir allerdings auffällt ist -> der D4 wird nicht als Output deklariert im Programm. Auch nicht im Sample der Lib. Vielleicht liegt es ja daran. Werde das morgen mittag mal probieren und mich melden.

Danke für Eure Hilfe
Gruß Kay


----------



## Kayle (8 August 2016)

Hallo an alle Helfer,

es funktioniert jetzt. Problem waren die nicht vorhandenen BIAS Widerstände um den Pegel auf dem Bus auf einem definierten Wert zu halten. Ohne Widerstände lag die Spannungsdifferenz zwischen A und B bei 140mV. Für RS485 laut Spezifikation zu wenig ( > 200mV ). Nach dem ich die Widerstände verbaut hatte lag die Differenz bei 260mV. So funktioniert es.

Es hängt wohl stark am Transceiver ob die BIAS Widerstände gebraucht werden oder nicht.

Gruß Kay


----------



## Mobi (8 August 2016)

Je nachdem wieviele Transceiver es im Bus gibt, musst du den Passenden auswählen, das sagt Unit Load aus. Ich hab extra einen genommen der bis zu 256 Nodes unterstützt.
Mich wundert es, dass Wago nicht die Bias-Widerstände drin hat. Bei Phoenix sind sie integriert.


----------



## Kayle (8 August 2016)

Bei mir sind es maximal 32. Ich werde es morgen an der Wago testen.

Gruß Kay


----------



## Kayle (9 August 2016)

Hi Mobi,

habe heute das ganze an der Wago probiert. Zuerst Abschlusswiderstände am Anfang und Ende vom Bus. Dann die Spannungsdifferenz gemessen = 34,6mV. BIAS Widerstände installiert, getestet, geht 

Frage: Nutzt Du den Modbus Konfigurator ? Wenn ich den Task für den Modbus auf 500ms stelle wird jeder Slave aber erst alle 9 Sekunden abgefragt. Wenn ich mit dem Windows PC über den RS485 USB Adapter die Slaves abfrage geht das direkt ( besser gesagt alle 500ms direkt ). Hast Du dafür eine Erklärung ?

Gruß Kay


----------



## Mobi (9 August 2016)

Kenne keinen Modbus Konfigurator. Wie gesagt, nutze Phoenix, kein Wago.

Ich schätze mal das die Prio der Task nicht so hoch ist. Der PC hat ja auch wesentlich mehr Power, als die SPS. Der schafft das locker. Mit meinem Testtool (sowohl Windows als auch Linux) geh ich sogar runter auf 20 ms.


----------



## Kayle (27 Februar 2017)

Hallo zusammen,

nach längerer Abwesenheit musste ich mal wieder an den Modbus ran. 3 Teilnehmer funktionierten ja bereits. Jetzt wollte ich 4 weitere Eigenbau Teilnehmer und einen Modbus Stromzähler an den Bus hängen. Also alles schon verkabelt, getestet ... nix geht mehr :-( Ich dreh jetzt langsam wirklich am Rad mit dem Modbus, weil ich nicht weiß an was es genau liegt -> an meinen DIY Modulen oder an der Software. Mir ist beim Testen aufgefallen das auf den RS485 Modulen schon BIAS Widerstände verbaut waren. 




Die habe ich jetzt entfernt und versucht den Bus nur mit den beiden 120 Ohm Endwiderständen zu betreiben. Bis auf den gekauften Modbus Zähler geht nichts. Ich bekomme immer ein Timeout ( also die Wago zeigt Timeout ). An der Verkabelung kann es nicht liegen denn ich habe es jetzt so verkabelt:



BUS ist wie schon geschrieben mit 120 Ohm auf beiden Seiten terminiert. An die Senderichtung Umschaltung am MAX485 habe ich wie empfohlen mal eine LED gemacht. Die LED ist aus, bis die Wago Daten anfordert. Dann blitzt die LED kurz auf. Im Programm habe ich ja auch die Onboard LED des Arduino so programmiert, das wenn ein Telegramm angefordert wird diese blinkt. Das macht sie auch, nur kommt nix zurück. Dann habe ich nochmal den PC über einen RS485 USB Wandler angeschlossen. Dieser hat 2 LEDs. 1x Senden, 1x Empfangen. Wenn ich die Devices 1-5 abfrage geht nur die Sende LED an. Empfangs LED bleibt aus und ich bekomme im Programm einen Error Timeout. Wenn ich Device 50 abfrage erhalte ich sofort eine Antwort und beide LEDs gehen an.

Da der Modbus Zähler ganz am Ende der Bus Leitung hängt gehe ich einfach mal davon aus das die Verkabelung stimmt. Dem Modbus Zähler ist es auch egal ob BIAS Widerstände eingebaut sind oder nicht, der geht immer  Nur meine eigenen Module mit MAX485 nicht :-(

Der einzige "große" Unterschied zwischen meinen Modulen und dem Modbus Zähler ist die Spannungsversorgung. Zum Zähler gehen nur A+B und gespeist wird er über sein eigenes internes Netzteil. Meine Module werden zentral über +5V / GND im gleichen Kabel gespeist.

Habt Ihr eventuell noch einen Tip wo ich suchen kann ?

Gruß Kay


----------



## Senator42 (27 Februar 2017)

Hast du schon die neuen Nodes allein, also einzeln getestet?  

Etwa so:
> Dann habe ich nochmal den PC über einen RS485 USB Wandler angeschlossen.
daran jeweils eins der neuen Module.

Haben vielleicht die neuen Module  die SELBE Node-ID ?


----------



## Kayle (27 Februar 2017)

Hi,

zum Testen habe ich aktuell nur 1x Neue Node mit Node ID 4 und den Stromzähler mit Node ID 50 am PC / Wago hängen. Was mich halt stutzig macht ist die Tatsache das ja was an der Node ankommt und auch die Richtung umgeschalten wird. Also auf SENDEN geht die Node ja, sonst würde die LED ja nicht angehen.

Gruß Kay


----------



## Mobi (27 Februar 2017)

Bei mir funktionieren meine selbstgebauten Module perfekt zusammen mit einer Wetterstation im Netz. Baudrate und Parität stimmen? Zeig mal deinen Code der Module.


----------



## Kayle (27 Februar 2017)

```
// Libs deklarieren
#include <ModbusRtu.h>
#include <Wire.h>
#include "Adafruit_SHT31.h"


// Werte für Modbus deklarieren 
#define TXEN 4 // Enable Pin
#define ID 4 // Modbus Adresse
#define SPEED 9600 // Baud
Modbus slave(ID,0,TXEN); // Slave konfigurieren


// Sensor deklarieren
Adafruit_SHT31 sht31 = Adafruit_SHT31();


// Array für Modbus default Variablen deklarieren
uint16_t au16data[2] = {99,99};


// Werte für Wartezeit Sensor deklarieren
unsigned long previousMillis = 0;
const long interval = 60000;


// Werte für Modbus State LED deklarieren
int8_t state = 0;
unsigned long tempus;


// Werte allgemein
boolean toggle = false;




// Setup Mode
void setup() {
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  slave.begin(SPEED);
  sht31.begin(0x44);
  tempus=millis()+100;
  digitalWrite(13,HIGH);
  digitalWrite(12,HIGH);
}


// Hauptprogramm
void loop() {
 state = slave.poll(au16data,2);


 // Abfrage ob Werte über Modbus gelesen wurden
 if (state > 4) {
  tempus = millis() + 50;
  digitalWrite(13,HIGH);
 }
 if (millis() > tempus) digitalWrite(13,LOW);


 // Interval für Sensor Abfrage
 unsigned long currentMillis = millis();
 if (currentMillis - previousMillis >= interval) {
 previousMillis = currentMillis;
toggle = !toggle;
digitalWrite(12,toggle);
 uint16_t temp = sht31.readTemperature() * 10;
 uint16_t humi = sht31.readHumidity() * 10;
 au16data[0]=temp;
 au16data[1]=humi;
 }
 
}
```

Hier der aktuelle Code. Hast Du einen Schaltplan zu deinen Modulen ?


----------



## Senator42 (27 Februar 2017)

da der Node 4 anscheinend etwas sendet, hilft fast nur auf die Leitung schauen.

Habe ich so gemacht:
a) 2 mal   RS485 - TTL - RS232 - Wandler,  beide auf NUR Empfang
b) einen PC mit 2 Com-Port (RS232-USB geht auch)
c) am PC mit dem kostenlosen Binterm die Daten beobachtet.

Die Baud, 8-Bit, Stop-Parity  stimmt auch ?

Wenn die Baud langsam ist (300,1200) ginge grob auch ein Oszi). Ob dann aber eine Antwort oder NAK-Antort kommt, sieht man dabei aber nicht.
mit a) b) c) schon,  das Protokoll gibt es im web


----------



## Mobi (27 Februar 2017)

Nicht verunsichern durch MOSI. Ich mappe im Programm den SPI um. Hauptsache Baud und Parität stimmen. Ich fahr mit 19200 und Even.


----------



## Kayle (27 Februar 2017)

Senator42 schrieb:


> da der Node 4 anscheinend etwas sendet, hilft fast nur auf die Leitung schauen.
> 
> Habe ich so gemacht:
> a) 2 mal   RS485 - TTL - RS232 - Wandler,  beide auf NUR Empfang
> ...


Das ist dann wohl der nächste Schritt. Dazu werde ich noch den LogicAnalyzer anklemmen. Baud und Parität habe ich kontrolliert. Es hat ja auch schon mit 3 "alten" Nodes funktioniert bis ich die 4te angeschlossen habe. Als das nicht ging habe ich den rappel bekommen und den Modulen die Bias Widerstände geklaut. Wollte damit erstmal einen "sauberen" bus schaffen. Jetzt geht nicht mal mehr 1 Node.


----------



## Kayle (27 Februar 2017)

Mobi schrieb:


> Nicht verunsichern durch MOSI. Ich mappe im Programm den SPI um. Hauptsache Baud und Parität stimmen. Ich fahr mit 19200 und Even.


Mehr nicht ?  Hast Du bias Widerstände ? Laufen bei dir die slaves über eine Spannungsversorgung?


----------



## Mobi (27 Februar 2017)

Die Bias gehören an den Master, die sind ja eh schon meistens verbaut, mit denen hab ich ja nichts zutun. Ich kann lediglich die 120 Ohm zuschalten, wenn es das letzte Modul ist. Jedes Slave wird an 24V angeschlossen vom Hausnetz. Also jedes hat seine eigenen 5V.


----------



## Kayle (27 Februar 2017)

Mobi schrieb:


> Die Bias gehören an den Master, die sind ja eh schon meistens verbaut, mit denen hab ich ja nichts zutun. Ich kann lediglich die 120 Ohm zuschalten, wenn es das letzte Modul ist. Jedes Slave wird an 24V angeschlossen vom Hausnetz. Also jedes hat seine eigenen 5V.


OK. Bei mir werden die Module alle über das gleiche 5v Hutscheinen Netzteil versorgt. Meine Wago Rs485 Klemme hat keine Bias Widerstände. Aktuell habe ich 120 ohm an der wago und 120 ohm am Ende am Stromzähler.


----------



## Senator42 (27 Februar 2017)

wie schaut es mit GND aus ?

- dicker GND am Netzteil,  alle module an den dicken GND (also keinen strang)

- den Bus auch an GND ?
(die 2 Busadern  *&  GND* habe ich mit 6 Frequenzumrichtern so angeschlossen,  die SPS (Master) aber nur die 2 Busadern),
120 Ohm an den Enden) 
 (ohne GND hatte ich Problem bis hin zum komplettausfall wenn die FU mit eingeschalteter Reglerfreigabe vom 230V Netz getrennt wurden. )


----------



## Mobi (27 Februar 2017)

Schirmung?


----------



## Kayle (27 Februar 2017)

Mobi schrieb:


> Schirmung?


Vorhanden aber nicht angeschlossen.


----------



## Kayle (27 Februar 2017)

Senator42 schrieb:


> wie schaut es mit GND aus ?
> 
> - dicker GND am Netzteil,  alle module an den dicken GND (also keinen strang)
> 
> ...


Was meinst Du mit Bus auch an GND? Vom Netzteil geht GND wie A+B an die Module zur Spannungsversorgung. GND am Max485 ist gleich dem der Module.


----------



## Senator42 (27 Februar 2017)

Kayle schrieb:


> Was meinst Du mit Bus auch an GND? Vom Netzteil geht GND wie A+B an die Module zur Spannungsversorgung. GND am Max485 ist gleich dem der Module.



Ja   "GND am Max485 ist gleich dem der Module"  meinte ich.
(Hatte bei den FUs eine zusätzliche GND Klemme.)


----------



## Kayle (28 Februar 2017)

Hallo zusammen,

habe heute weiter getestet. Dazu habe ich zuerst 5 Nodes in der Wekstatt aufgebaut und als Master den PC angeschlossen. 







Mit nur der normalen Terminierung von 120 Ohm auf beiden Seiten bekam ich weiterhin Timeouts von den Nodes. Dann habe ich die BIAS Widerstände an den Master angeschlossen. Das hat dann funktioniert. Als nächstes habe ich die Wago rein über A+B an den Nodes angeschlossen. Läuft bis jetzt ohne Timeout. Der einzige Unterschied zu gestern ist die fehlende Masse am BUS und die Verkabelung durchs Haus. Werde morgen die Nodes wieder im Haus verteilen und genau so verkabeln wie hier auf dem Tisch.

Gruß Kay


----------



## roger34 (28 Februar 2017)

1) Bias Widerstände
    Wenn alle Teilnehmer off sind, sollte sich trotzdem ein gültiger Pegel einstellen. Beim Max also grösser als 200mV. 
    Wenn du mit 20k Bias Widerstände arbeitest und 2x120 Ohm Abschlußwiderstand stellt sich aber nur ein Pegel von einigen mV ein. 5V*60 Ohm/40kOhm. 
    Also benötist du Widerstände eher im 680 Ohm Bereich. Jetzt wärer noch wichtig welche Widerstand deine Wago hat. 
    Unterschied zw. MAX und den 65HVD ist, Max hat 200mV als Diffenzeingang , der 65HVD nur 100mV.  Somit kommt dieser auch mit höheren Widerständen zurecht. 

2) Du versorgt die Module mit einem 5V Netzteil.  Welche Spannungs hast du dann bei den einzelnen Modulen.  
    Wenn du die 5V direkt am Baustein und zur weiteren Versorgung verwendet, darf hier max. 0.5V über die Verdrahtung abfallen.


----------



## Kayle (28 Februar 2017)

Ohne die BIAS Widerstände hatte ich einen Ruhepegel von 36mV. Hatte ja die BIAS Widerstände ( 20k ) von den RS485 Modulen entfernt und nun 560 Ohm Widerstände verbaut und somit jetzt einen Ruhepegel von 265mV. 

Hier das Schaltbild meiner Wago Klemme 750-653:


Keine internen Widerstände.

Die Spannung der Module liegt aktuell bei genau 5,01 V an allen Modulen. Ich werde das nochmal messen sobald ich alle Module wieder verbaut habe.

Gruß Kay



roger34 schrieb:


> 1) Bias Widerstände
> Wenn alle Teilnehmer off sind, sollte sich trotzdem ein gültiger Pegel einstellen. Beim Max also grösser als 200mV.
> Wenn du mit 20k Bias Widerstände arbeitest und 2x120 Ohm Abschlußwiderstand stellt sich aber nur ein Pegel von einigen mV ein. 5V*60 Ohm/40kOhm.
> Also benötist du Widerstände eher im 680 Ohm Bereich. Jetzt wärer noch wichtig welche Widerstand deine Wago hat.
> ...


----------



## roger34 (28 Februar 2017)

Dein Kabel im ersten Beitrag hat einen Widerstand von 36Ohm bei 1km. Wenn du den Strom vom 5V Netzteil und die ungefähre Kabellänge weisst, kannst ja den Spannungsabfall berechnen.


----------



## Kayle (13 März 2017)

Hallo zusammen,

wollte mal kurz den aktuellen Stand mitteilen. Es laufen jetzt alle 7 Thermostate + 1 Stromzähler über Modbus RTU an meiner Wago Klemme. Ich habe auf die einzelnen Thermostate einen kleinen StepDown Regler gebaut um die Thermostate mit 24V zu betreiben und keinen Spannungsfall über das Kabel zu haben. Zusätzlich habe ich auf jegliche Art von Widerständen verzichtet und damit läuft es jetzt aktuell stabil.

Gruß Kay


----------



## Tiktal (13 März 2017)

Hallo Kay,

das klingt alles sehr interessant was Du da gebaut hast. Darf ich mal nach paar mehr Infos horchen?
Hast Du jetzt eigene Platinen genommen und dort Temperatursensoren montiert? 
Benötigst Du das nur um die Temperatur zu messen? Klingt für mich nach etwas viel Aufwand, einfache Fühler wären doch um einiges günstiger?
Wie hast Du die Platinen im Haus verteilt? Eigene Gehäuse?

Gruß

Onno


----------



## PN/DP (13 März 2017)

Kayle schrieb:


> Zusätzlich habe ich auf jegliche Art von Widerständen verzichtet und damit läuft es jetzt aktuell stabil.


Vermutlich weißt Du nicht wieso es nun läuft, und kannst deshalb auch nicht sagen wie lange die Bastellösung zufällig funktionieren wird... 

Harald


----------



## Kayle (13 März 2017)

PN/DP schrieb:


> Vermutlich weißt Du nicht wieso es nun läuft, und kannst deshalb auch nicht sagen wie lange die Bastellösung zufällig funktionieren wird...
> 
> Harald


Voll und ganz korrekt. Muss ja aber irgendwo mal anfangen. Der nächste Schritt ist das Verbauen der 120 ohm Abschlusswiderstände.


----------



## Kayle (13 März 2017)

Tiktal schrieb:


> Hallo Kay,
> 
> das klingt alles sehr interessant was Du da gebaut hast. Darf ich mal nach paar mehr Infos horchen?
> Hast Du jetzt eigene Platinen genommen und dort Temperatursensoren montiert?
> ...


Hi Onno,











So sehen die Raumthermostate momentan aus. Ich wollte nicht extra Fühlerklemmen verbauen und da ich sowieso die rs485 Klemme hatte habe ich mich für Modbus Thermostate entschieden. Die Platine ist selbst entwickelt und meine Software nutzt eine Modbus rtu library für Arduino. Das Gehäuse ist ein standard Sensor Gehäuse mit Lüftungsschlitze.

Gruß Kay


----------



## roger34 (13 März 2017)

Kayle schrieb:


> Hallo zusammen,
> 
> wollte mal kurz den aktuellen Stand mitteilen. Es laufen jetzt alle 7 Thermostate + 1 Stromzähler über Modbus RTU an meiner Wago Klemme. Ich habe auf die einzelnen Thermostate einen kleinen StepDown Regler gebaut um die Thermostate mit 24V zu betreiben und keinen Spannungsfall über das Kabel zu haben. Zusätzlich habe ich auf jegliche Art von Widerständen verzichtet und damit läuft es jetzt aktuell stabil.
> 
> Gruß Kay



Du hast jetzt von 5V auf 24V Versorgung umgestellt. Hast du gemessen, wie weit bei 5V Versorgung die Moduleversorgung bei den einzelnen Teilnehmer eingebrochen ist ?

Wie schon öfters erwähnt, wird ja die Wago interne Pullup Widerstände haben. Vielleicht ist auch in interner Abschlußwiderstand vorhanden. Das muß man doch im Datenblatt herauslesen können.
Bei deiner niedrigen Baudrate wird es auch mit einen Abschlußwiderstand funktionieren.


----------



## Kayle (13 März 2017)

roger34 schrieb:


> Du hast jetzt von 5V auf 24V Versorgung umgestellt. Hast du gemessen, wie weit bei 5V Versorgung die Moduleversorgung bei den einzelnen Teilnehmer eingebrochen ist ?
> 
> Wie schon öfters erwähnt, wird ja die Wago interne Pullup Widerstände haben. Vielleicht ist auch in interner Abschlußwiderstand vorhanden. Das muß man doch im Datenblatt herauslesen können.
> Bei deiner niedrigen Baudrate wird es auch mit einen Abschlußwiderstand funktionieren.


Ja habe nach gemessen. Maximal eingebrochen auf 4,95 V. Habe es aber eher umgebaut um mir das 5v Netzteil zu sparen. 

In der Anleitung der Wago Klemme werden 120 Ohm Widerstände extern angeschlossen. Dann werden interne keine verbaut sein. Wäre ja eher kontraproduktiv.


----------

