RS485 Modbus Topologie ?

Zuviel Werbung?
-> Hier kostenlos registrieren
@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.
 
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.)

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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@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:
Code:
modbus_configure(9600, 1, 4, TOTAL_REGS_SIZE, 0);

Die 4 zeigt auf D4.
 
Ah ok. Wundert mich nur.
Weil ich u.a. sowas gefunden hab:
[FONT=&quot]
Code:
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]
 
Dann müsste deins vielleicht so aussehen:
Code:
modbus_configure(&Serial1, 9600, 1, 1, 4, TOTAL_REGS_SIZE, holdingRegs);
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe nochmal im Samples Ordner der lib nachgesehen und dort wird der Slave wie folgt konfiguriert:

Code:
[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
 
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
 
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.
 
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

MAX485-Module-Sch1.jpg

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:

rs485.png
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
 
Zuletzt bearbeitet:
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 ?
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei mir funktionieren meine selbstgebauten Module perfekt zusammen mit einer Wetterstation im Netz. Baudrate und Parität stimmen? Zeig mal deinen Code der Module.
 
Code:
// 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 ?
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nicht verunsichern durch MOSI. Ich mappe im Programm den SPI um. Hauptsache Baud und Parität stimmen. Ich fahr mit 19200 und Even.
 

Anhänge

  • modbus.jpg
    modbus.jpg
    101,6 KB · Aufrufe: 15
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
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.
 
Zurück
Oben