Benötige Hilfe bei Modbus

Hallo, ich bin neu im Forum, kurz zu mir:

Mein Name ist Stefan, 39Jahre, komme aus Nürnberg und bin gelernter Industrieelektroniker,
habe jedoch schon seit vielen Jahren beruflich nicht mehr viel mit Elektronik zu tun, bin dann
in die Kraftwerkstechnik gewechselt (meine normalen Ströme liegen so im kA-Bereich...).
Elektronik und Arduino mache ich nur noch als Hobby.

Zu meinem Vorhaben:

Ich möchten einen Wago Feldbus-Controller 750-316 / 300-000 mit einem Arduino via ModBus
ansteuern. Ich benötigen nicht den vollen ModBus-Umfang, ich möchte lediglich einzelne Eingangs-Bits einlesen und Ausgangsbits schalten...

Ich beschäftige mich mit nachfolgender ModBus-Bibliotek:

zu welcher ich einige Fragen hab..

Zeile 30: Modbus master(0,0,0);
Hier wird mit der ersten Null als Master deklariert, nächste 0 ist Serielle Kommunikation, letzte 0 ist RS232 (andere Ziffer grösser 1 wäre RS485) , das glaub ich hab ich verstanden.

Jetzt möchte ich einen Ausgang setzen, z.B. den 8 Ausgang des ersten 8fach Digitalausganges
dazu müsste mein Programmcode dann so aussehen:

telegram.u8id = 1; // slave address (Der Controller hat die Adresse 1..)
telegram.u8fct = 5; // function code (Funktionscode 0x05, Forge Single Coil)
telegram.u16RegAdd = 0; // start address in slave (der erste Ausgangsblock der Wago sollte 0x000 sein?
telegram.u16CoilsNo = 7; // number of elements ich möchte nur ein Bit schreiben, das 7te (=Ausgang8)
telegram.au16reg = 1; // dies hier sollte der Wert sein der mir den Ausgangs setzt???????
// hier eine 0 sollte den Ausgang wieder abschalten??.-.

master.query( telegram ); // dieser Befehlt sollte das oben erstellte Telegramm dann versenden.

Ist obiges so richtig????

nun möchte ich einen Eingang einlesen:

dazu schreibe ich:

telegram.u8id = 1; // slave address
telegram.u8fct = 1; // function code (read Coil)
telegram.u16RegAdd = 1; // start address in slave (0x001 = 2tes Modul
telegram.u16CoilsNo = 1; // number of elements (coils or registers) to read
telegram.au16reg = au16data; // hier werden die empfangenen Daten gespeichert

master.query( telegram ); // die Nachricht versenden,

was hat dieser Code mit dem if zu bedeuten?

master.poll(); // check incoming messages

if (master.getState() == COM_IDLE) { ///??? Was wird hier gemacht??
u8state = 0; // diese setzt die Switch Bedingung wieder auf 0
u32wait = millis() + 100; // nächster Sendevorgang in 100ms
}

habe ich das ganze grundsätzlich Verstanden? oder liege ich total falsch,
wo gibt es eine Beschreibung zu der Library, in der die einzelnen Befehle erklärt werden.

Leider habe ich noch keine Hardware (Wago) vorliegen um damit zu testen, das ganze ist
aktuell noch alles in der Plaungsphase.

Ich hoffe mir kann jemand Helfen, bzw. das ganze etwas erklären..

Vielen Dank für Eure Hilfe!
Gruß Stefan

Ich denke deine Ansätze sind gar nicht so falsch. Aber ohne Hardware Modbus Testen ist schwierig du kannst mit Modbus View auf dem PC anschauen ob deine Befehle so Richtig kommen. Ich habe keine Ahnung ob Wago Irgendwelche Register noch zum Konfiguriern nutzt. Modbus mit Arduino funktioniert grundsätzlich schon habe hier ein Siemens KTP600 an einem Arduino MEGA via ModbusRTU (RS485) laufen.
Du brauchst auf jeden Fall noch einen UART/RS485 Wandler z.B. MAx485 o.ä. direkt wirst du mit der WAGO nicht sprechen können.
Gruß
DerDani

Die benötigte Hardware werde ich demnächst bestellen,
Habe mit dem Wago-Support bereits telefoniert, die sagen wenn die
Befehle so kommen wie es im Handbuch steht, funktioniert es.
Der von mir verwendete Busknoten besitzt keinerlei "Inteligenz".

Wenn ich nicht weiter komm melde ich mich wieder..
Gibt es zu der Bibliothek eine Beschreibung wie und welche Befehle es gibt?
Ich finde hierfür nichts...

Gruß Stefan

Ich habe leider auch keine Doku zu der Lib gefunden. Man kann sich aber die .h bzw .cpp Datei anschauen und sehen welche Befehle es dort gibt.
Gruß
DerDani