Modbus

Moin zusammen,

für meine Hausautomatisierung arbeite ich mich immer noch in das Thema Modbus ein.
Um den Thread von @ Scorpi08 nicht mit meinen Fragen weiter zu belasten hier ein neuer
in dem ich ein paar kurze Verständnissfragen habe.

Well trotz gemachter Hausaufgaben und einer auf den Sample Script basierenden (Simple Modbus) funktionierenden
Schaltung habe ich das massive Problem die gelernte Theorie (modbus.org - General Specification + Spec RS485) MIT der Hardware (Arduino Nanos) + der Software in Einklang zu bringen. (Ich möchte es verstehen was ich hier mache und nicht nur stumpf Str+C - Str+V)

Um hier keinem unnötige Arbeit zu machen ein paar Worte zu dem was ich mir bisher erarbeitet habe.

Wenn ich das richtig gelernt habe, so habe ich
laut "Spec" (und in Klammern bezogen aufs Arduino wording) 4 Bereiche, so gennante (Coil Stat. (Dig. Out) - Input Stat. (Digit. IN) - Holding Reg. (Analog Out) - Input Reg. (Analog IN)) . Diese können mit jeh 10.000 (laut spec.) Speicherstellen adressiert und in den ersten beiden Fällen mit 1 bit (boolean) (ON/OFF) und bei den letzten beiden Fällen mit 2 byte beschrieben sein. (0-65535 unsigned int)

Über die Funktion 1,2,3,4 kann ich diese Speicheradressen auslesen, b.z.w. über Funtkion 5 und 6 Adressbereich "Coil Stat." & Holding Reg." EINZELN beschreiben, 15 & 16 dienen zum beschreiben zuvor genannter Bereiche in SERIE.

Wie die Komunikation, Fehlerevaluierung CRC, CRL, Polling, das Adressieren an einen der 1-247 Slaves, die Aufrechung der einzelnen Fehlerwerte, oder das Broadcasting (0) geschieht, auch das habe ich in der Theorie verstanden. Soweit die Vorarbeit, aber :

Und nun meine Fragen (und mögen diese sich auch noch so dämlich anhören..... ich kann es nicht ändern)

FRAGE 1 : Verstehe ich es richtig das JEDER SLAVE und der MASTER über einen EIGENEN Speicher Verfügen in dem JEWEILS diese 4 Adressbereiche gehosted sind ? (Mir ist schon klar das jedes PIC ein RAM hat) Aber ich habe noch nicht verstanden ob hier der Master die Zentrale Rolle übernimmt oder ich eben (Bildlich gesprochen) in jedem Slave ein KOMPLETTES Ablageregister habe wo die Werte ins RAM geschrieben werden. Oder verstehe ich es gar total falsch ?

FRAGE 2 : Unabhängig der Frage 1 ob jeder SLAVE + MASTER eine eigene Adressdatenbank haben so frage ich mich wie man bei dem vorhanden Speicher auf die volle Datenbankbreite kommen kann. 10K Coil Stat. *1bit (IPM-PC 8 bit = 1 byte)= 1250 byte (/1024) = 1,22 Kbyte * 2 = 2,44 KB + 10K * 2byte = 19,53 MB ??????? * 2 (Bereiche) ca. 40 MB und das 1970 ???? Na ja und da hat die Firma Motcom das wohl entwickelt. Oder denke ich hier einfach VIEL ZU KOMPLIZIERT, gar verkehrt ?

Oder ist es wirklich so trivial das ich ein INT definiere, sich der PIC um eine freie stelle bemüht und das Modbus protokoll lediglich den wert vom SLAVE zum MASTER transportiert der das dann wieder in ein definiertes (irgendwo) int schreibt ? Aber wo wäre da dann der Sinn von der Definition des Modbusses ?

Für eine Antwort wäre ich sehr dankbar.

Tom

Und nun meine Fragen (und mögen diese sich auch noch so dämlich anhören..... ich kann es nicht ändern)

Hören sich dämlich an, ganz einfache Antwort; Einfach machn, stumpf Str+C - Str+V :smiley:

zu FRAGE 1:

Verstehe ich es richtig das JEDER SLAVE und der MASTER über einen EIGENEN Speicher Verfügen

in jedem Slave ein KOMPLETTES Ablageregister habe wo die Werte ins RAM geschrieben werden

Wenn ich es richtig verstanden habe, JA.

zu FRAGE 2:

Oder denke ich hier einfach VIEL ZU KOMPLIZIERT

Jep, Einfach machn, stumpf Str+C - Str+V :smiley:

Was ich über den Sinn des Modbusses denke:
Gepimpte Serial Übertragung, 1200m Reichweite.

Welche Lib nutzt du, es gibt verschiedene Modbus Libs. Link?

PS: könntest auch in meinem Thread fragen können, hast ja schon da angefangen.

Stefan, die schwarzen Lochraster waren von ihm :wink:

skorpi08:
Stefan, die schwarzen Lochraster waren von ihm :wink:

Ah okay :wink: Zum Thema kann ich aber noch nichts beitragen. Baue gerade erst die Hardware mit dem Attiny841 auf.

Hmmmm, grumpf..... Na dann erstmal danke für die Beantwortung der Frage 1. Aber verstehen würd ich das trotzdem gerne. Sonst hätte ich mir nicht die Mühe gemacht das zu beschreiben.

@Scorpi08 ich wollte Dir nur nicht mehr den Thread mit meinen Lernfragen zuschreiben, weil ich eben noch nicht so weit bin mich über die Ansteuerung von extern Steuerungen (openHotAirBaloon) mit Dir austauschen zu können. Ich arbeite derzeit einzige an den Basics da in 5 Tagen bei mir die Entscheidung fallen muss nur 3km Kabel im Haus zu verlegen oder 6-8km.
Hardwaretechnisch hab ich bis auf den Gasmelder (da liegen die Sensoren noch in der Kiste aber sollte auch nicht das Problem sein) für mich vieles gelöst. Testaufbauten stehen für nahezu alle Bereiche ob auf Breadboard oder eben auf Lochraster. Finalplanung der sicherungskästen =
62licht/power Finder Relais zentral ,18 Rauchmelder, Rollosteuerung, Tür und Fensterkontakte, intercom, RFID gestützter Zugang, teile des Alarmsystem,etc. um jetzt die Hauptpunkte zu nennen. Ach ja und die komplette Wasseraufbereitung.

Ich benutze die SimpleModbus Lib. Mit Deinem Auto TX kam ich übrigens drauf weil Du das Schaltbild in Deinem Link angegeben hattest. ich selber polle das auch manuell.

Das mit Platinen ätzen hab ich ja auch mittlerweile gelernt (physisch) aber der Eagel spezie bin ich eben noch nicht. Seis drum.
Es geht mir lediglich darum (reales Problem) vertraue ich darauf das ich das Modbus Protokoll verstehe und binde jeden der 15 Räume über Noodes an (treffe dafür die Vorkehrung) oder kneife ich und ziehe die Strippen aller Sensoren Schalter zum Zentralpunkt. Entscheidend für mich war das die Hardware funktioniert das später professioneller (ätzen oder eben eine PCB Company zu beauftragen ) zu reproduzieren dürfte das geringste Problem sein.

Hab ich bezüglich meiner schwarz lackierten Testplatinen was verpasst ? Sorry wenn das nicht so toll aussieht, aber ich bin da Anfänger.

Anyhow, zu guter letzt besteht noch die Möglichkeit das ich alle Noodes via Ethernet anbinde. Aber rs485 wäre schon eleganter.

Tom30:
Hab ich bezüglich meiner schwarz lackierten Testplatinen was verpasst ? Sorry wenn das nicht so toll aussieht, aber ich bin da Anfänger.

Das war nicht negativ gemeint. Die sahen echt gut aus.

Ich hatte mich letztens bei einem Kommentar in einem anderen Thread mit dem User vertan. Hatte die schwarzen Platinen einem anderen User "unterstellt" :*

Wenn du mit Hot Air Baloon über Modbus arbeiten willst, dann brauchst du eine Modbus Lib (für Arduino) die die Funktionen 1,2,3,4,5,6 unterstützt. Funktionen 15 und 16 werden nicht unterstützt.
Bei meiner Lib hab ich die Funktion 3 und 6, type=holding.
Da brauchst du aber kein Master, NUR Slaves.

Es gibt auch ein Serial Binding, hier ein Beispiel.
Da brauchste aber ein Master. Der Master wird an den PC/Raspberry über USB Kabel angeschlossen.

Einfacher wäre es 10km Kabel verlegen. Ist ja bei KNX auch so.

Du stellst zu komplizierte Fragen, verstehe immer noch nicht wo dein Problem liegt.

skorpi08:
Funktionen 15 und 16 werden nicht unterstützt.
Bei meiner Lib hab ich die Funktion 3 und 6, type=holding.
Da brauchst du aber kein Master, NUR Slaves.

Einfacher wäre es 10km Kabel verlegen. Ist ja bei KNX auch so.

Du stellst zu komplizierte Fragen, verstehe immer noch nicht wo dein Problem liegt.

Ich hab jetzt den Quote mal eingekürzt.
Also ich hatte mich auf Deinen Link bezogen und somit verwenden wir beiden scheinbar die gleichen Libs : SimpleModbus Master und Slave V10 / V8, ist aber auch egal. Wenn ich das richtig verstehe wir das sequentielle schreiben mehrere Register sehr wohl unterstützt. Aber ich wäre ja schon froh wenn ich wüsste was wieso Einzeln wohin geschrieben wird.

Tja was soll ich sagen, einerseits wird hier immer gesagt (und auch so drauf reagiert) das man sich einarbeiten soll und andererseits stelle ich zu komplizierte Fragen........

Du hast da den Dreh scheinbar schon raus, ich steh aber auf dem Schlauch.... Leider, daher meine Fragen.

Schöne Grüße Tom

Also ich bin etwas über 1 Jahr mit Arduino beschäftigt
Davor kein blassen Schimmer von Mikrokontroller gehabt.
Seit ca 3 Monaten mit openHAB beschäftigt, einige Wochen mit der SimpleModbus LIb.
Brauchst also kein 2 Jahre Studium.
Hier gibt es ein Thread zu der Lib.

Hier gibste an

#define MB_TXENPIN   A2
#define MB_SLAVE_ID  1
#define MB_BAUDRATE  9600
#define MB_PARITY  SERIAL_8N2

  modbus_configure(&Serial, MB_BAUDRATE, MB_PARITY, MB_SLAVE_ID, MB_TXENPIN, HOLDING_REGS_SIZE, holdingRegs);
  // modbus_update_comms(baud, byteFormat, id) is not needed but allows for easy update of the
  // port variables and slave id dynamically in any function.
  modbus_update_comms(MB_BAUDRATE, MB_PARITY, MB_SLAVE_ID);
enum 
{     
  // just add or remove registers and your good to go...
  // The first register starts at address 0
  ADC_VAL,     
  PWM_VAL,        
  HOLDING_REGS_SIZE // leave this one
  // total number of registers for function 3 and 16 share the same register array
  // i.e. the same address space
};

Da schreibste rein… keine Ahnung wie das jetzt heißt, Packet, Bit, Byte… whatever.
Also jeden Wert den du haben willst.

enum 
{     
Pin0,
Pin1,
Pin2,
Pin3,
Pin4,
Pin5,
Pin6,
Pin7,
Pin8,
Pin8,
Pin9,
DHT22,
Analog1,
Analog2,

  HOLDING_REGS_SIZE // leave this one

};

Dies muss beim Master und beim Slave gleich sein.
Wenn du openHAB mit Modbus nutzt, brauchst du kein Master, also beim Slave dies eintragen und gut is.
Welchen Wert du dann nachher haben willst, bestimmst du in openHAB der .items Datei.
zB fürs Licht schalten nimmste {modbus=“slave1:1”} und der Status von Pin1 wird übermittelt.
Man muss dabei von 0 anfangen zu zählen.
Damit das ganze mit openHAB funktioniert, muss du das Modbus Binding in den addons Ordner kopieren und in der openhab.cfg in etwa so konfigurieren:

modbus:poll=1000 //wie oft aktualisiert wird

modbus:serial.slave1.connection=/dev/tty.wchusbserial:9600 //Serieller Port, wo der RS485 Adapter angeschlossen ist und die Baudrate
modbus:serial.slave1.id=1 // Slave ID
modbus:serial.slave1.start=0 // Ab welchen Byte angefangen wird zu zählen
modbus:serial.slave1.length=1 // Wieviele Bytes es insgesamt gibt
modbus:serial.slave1.type=holding // Typ der Übertragung. Bei  Funktion 3 und 6 ist es holding.

Hast du nun ein zweiten Slave, machst du es so:

modbus:serial.slave2.connection=/dev/tty.wchusbserial:9600 //Serieller Port, wo der RS485 Adapter angeschlossen ist und die Baudrate
modbus:serial.slave2.id=2 // Slave ID
modbus:serial.slave2.start=0 // Ab welchen Byte angefangen wird zu zählen
modbus:serial.slave2.length=13  // Wieviele Bytes es insgesamt gibt
modbus:serial.slave2.type=holding // Typ der Übertragung. Bei  Funktion 3 und 6 ist es holding.

mit
holdingRegs[Analog1] = analogRead(A0);
liest du den Wert aus
Es gibt ne demo.items, da ist so eine Zeile, da fügst du am ende ein {modbus=“slave2:11”}
Number Temperature_GF_Corridor “Temperature [%.1f °C]” (Temperature, GF_Corridor) {modbus=“slave2:11”}

Wenn du nun zB mit Potentiometer rumdrehst, haste ne Temperatur bis 1023.

Well,

DANKE !! :slight_smile:
Ich schau es mir im Detail an, versuche es zu verstehen , probiere es aus und melde mich.
Vieleicht lößt das ja meine zu komplizierten Gedanken wirklich.
Vielen Dank für die Mühe !! Ich bin leider auch erst seid 3 Monaten dabei.

Tom

Hallo,

Ich bin neu hier lese aber schon einige Wochen im forum mit.

Arbeite zur Zeit auch an so einem Projekt weil ich für meinen Neubau dann doch keine homeatik wired mehr wollte.
Habe bei homematic in meinem alten Haus viel gelernt aber man ist einfach zu eingegrenzt gerade bei der wired Version.
Ich will gerne eigene module haben die ich dann später auch mal mit neuen Ideen erweitern kann.

Habe auch schon 1x master und 2x slave über max485 zum laufen gehabt mit Tastern LEDs und temp\lf Sensor.
Das ganze hat der master dann auch schön per mqtt weiter geschickt. Allerdings mit der Lib von Nick gammon.

Würde es lieber auf modbus bauen.

Wobei die wichtigsten Aktionen auch ohne einen pi laufen sollen. Der master ist ein mega der auch gleich die koppelrelais steuern soll.

Auf dem pi sollen nur die scripte zur Automatisierung und die Visualisierung sowie die online Erreichbarkeit realisiert werden.
Wenn der pi dann mal hängt oder aufgibt geht wenigstens noch das Licht an und aus :slight_smile:

Mein Problem ist eigentlich der master.
Slave Beispiele gibt es ja zu häufig im Netz sind auch recht einfach zu verstehen.

Aber wie greife ich jetzt auf die verschiedenen Register der slaves zu.
Es werden ja auch mehrer und jeder hat im master ein array mit seinen werten und einen Bereich wo dann die wichtigsten Funktion gleich durch geführt werden.

Also wenn am slave 1 Kanal 1 auf 1 geht dann soll am master pin 40 auf high gehen.

Hat jemand vielleicht eine Idee oder ein Beispiel welches ich verstehe oder vielleicht mit Händen und Füßen erklären.

Gruß Enrico

PS: wenn ich das grob zum laufen habe mache ich einen eigenen thread auf und stelle dort auch meine ersten Ergebnisse rein.

Enrico mach bitte eine neue Diskussion (Topic) auf.
Grüße Uwe