Forum: Mikrocontroller und Digitale Elektronik Modbus Details


von NochAnfänger (Gast)


Lesenswert?

Einen schönen guten Abend!

Ich beschäftige mich gerade mit dem Thema Modbus und hab da einpaar 
Verständnisschwierigkeiten. Deshalb würd ich gern Fragen ob ihr mir 
etwas helfen könntet :D. Also

-Wo liegt der genaue Unterschied zwischen Coils und Holding Registern 
bzw. für welchen genauen Zweck brauche das eine und / oder das andere?

-Weiterhin würde ich später gerne ein kleinen Programm schreiben das 
über Modbus mit einer anderen Geräten kommuniziert. Bin aber noch nicht 
ganz klar wie diese Register in C aussehen müssten.

Wäre das sowas wie in char[] und jedes Element ist dann 16 Bit große. 
Oder sollte ich mir eher eine eigene kleine struct deklarieren wo ich 
dann die Datentypen reinschreiben und mittels einer Listenstruktur 
verwalte :/

Also etwa sowas :

#ifndef
#define char BYTE
#endif

struct holdingReg{

   BYTE fu_code;
   BYTE addi_high;
   BYTE addi_low;

   struct holdingReg *next;

};

struct holdingReg *first;
...


-Benutzen Coils und Holding Register den selben Adressraum?

-In der "Modbus Application Protocol Specification V1.1b" ist für 'Read 
Hodling Registers' die Anzahl der Register mit 126 angeben. Verstehe ich 
das richtig des es 126 Stück insgesamt von diesen Registern gibt bzw. 
kann es Hersteller spezifisch auch weniger geben?

Hoffe ihr könnt mir ein bischen weiterhelfen :(.

von Ulrich K. (elektromechanikus)


Lesenswert?

hallo NochAnfänger,

Coils sind die Ausgänge einer SPS

Holding Register sind 16 Bit Register in der SPS die von Modbus aus 
geschrieben und gelesen werden können (im Gegensatz zu Input Registern 
die von Modbus nur gelesen werden können). In Holding Registern werden 
z.B. Rechenoperationen ausgeführt, Zeiten und Zähler verwaltet und ...

Die Anzahl von Holding Registern ist nicht auf 126 begrenzt. Es können 
über Modbus mit einem Lesebefehl aber nur 126 gelesen werden da der 
Modbus Frame eine maximale Länge von 256 Byte besitzt.
Ein Gerät kann sowohl mehr als auch weniger Register besitzen.

Im Lesebefehl wird die Startadresse und die Länge des zu lesenden 
Registerblocks angegeben.
Gibst du als Länge eine größere Zahl an als Register vorhanden sind 
erhälst du einen Exception Error als Rückmeldung.

Achtung, Modbus adressiert das erste Register als Register 0!

Über den physikalischen Aufbau des Gerätespeichers macht die Modbus 
Spezifikation keine Vorgaben. Denkbar wäre also ein Bitzugriff über 
Write Single Coil auf ein 16 Bit Holding Register.
Üblich (in einer SPS zumindest) sind aber getrennte Speicherbereiche.

Das alles steht aber auch sehr ausführlich in der von dir zitierten 
"Modbus Application Protocol Specification V1.1b" !

Für deine C-Frage google mal nach Free Modbus.

Gruß
Ulrich

von NochAnfänger (Gast)


Lesenswert?

Hi Ulrich

danke dir für deine Erklärung :D. Ist schon verwirrend wenn man grad am 
Anfang steht. Da kann eine anständig Erklärung schon einiges Licht 
bringen.

mfg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.