Ich bin auf der suche nach einem Code fürs Arduino mit Ethernet Shield, der es erlaubt das Arduino und seine ein und Ausgänge über Modbus TCP zu nutzen. ich bin nun soweit das mir codesys bei Status des Modbus slave "<modbustcpslave: läuft="">" anzeigt und wenn ich das Arduino vom Netzwerk nehme fehler anzeigt..... leider habe ich das programmieren nie richtig gelernt und versuche mir durch viel lesen und viel Interesse alles selber bei zu bringen.</modbustcpslave:>
ich habe bereits ein Arduino Ethernet als Modbus Slave laufen. Dieser bildet den "Buskopf" für meine Erweiterungskarten. Die Hardware für die Erweiterungskarten ist wiederum ein Arduino Uno der über i2c mit dem Buskopf verbunden ist. Jede Erweiterungskarte hat 8 Eingänge und 8 Ausgänge. Momentan habe ich 2 Erweiterungskarten angeschlossen es sollen mal 4 werden. Denkbar ist hier auch die Nutzung der Analogeingänge bzw. 1 Wire mit Temperatursensoren DS18x20.
Ich habe mich bei den i2c-Slaves absichtlich für Microcontroller entschieden da bei einem Busfehler die Ausgänge ausgeschalten werden können. Dieses ist meines wissens bei der Verwendung von PCF8574 nicht möglich.
Die Software habe ich aus der Arduino Library "mudbus" abgewandelt. Dazu am besten die Beispiele die in der Library vorhanden sind nutzen. Schau auch mal in die Datei Mudbus.ccp, da stehen ganz am Ende die möglichen Zugriffstypen. Je nachdem was im Arduinoprogramm verwendet wird, muss dies auch in Codesys bei der Konfiguration Modus-TCP-Slave unter "Modus-Slave-Kanal" eingetragen werden. Ich habe hier einmal für die Eingänge Funktionscode 03 und für die Ausgänge Funktionscode 16 gewählt. Der Offset ist ebenfalls anzupassen. Bei mir ist bei den Eingängen dieser 0x0000 und bei den Ausgängen 0x0002. Die länge ist dann jeweils 2 und die Fehlerbehandlung bei den Eingängen ist "Auf ZERO setzen". Ist wichtig das beim Ausfall der Verbindung die Eingänge in meiner Steuerung auch False sind.
Bin gerne bereit die geänderte Software von den Arduino s zur Verfügung zu stellen.
Viele Grüße Jürgen
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
das hört sich nach einer sehr interessanten Lösung an . Wenn Du so nett wärest, Deinen Arduino Code hier zur Verfügung zu stellen, würde ich mich sehr darüber freuen. Würdest Du Dein Codesys Projekt ebenfalls vorstellen?
Gruß Jörg
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
da mein Codesys Projekt noch in den Kinderschuhen steckt, dabe ich heute ein kleines Demoprojekt erstellt. Den Code für die Arduinos habe ich auch beigefügt. Die Library Mudbus von >Dee Wykoff< habe ich ein wenig abgeändert. Ich hoffe er kann mir verzeihen. Jetzt bekomme ich jedenfalls einen Rückgabewert, das die entsprechende Funktion auch ausgeführt wurde. Dieses benutze ich um im Arduino-Code auf Busausfälle zu reagieren. Die Library muss in den entsprechenden Ordner kopiert werden. Ansonsten gibt es Fehler beim kompilieren. Der Code sollte auch auf einem Arduino Uno mit Ethernet-Shield laufen. Bei allen Arduinos habe ich zwischen Pin 0 und Pin 1 ( RX und TX) eine zweifarbige LED mit 2 Anschlüssen (entsprechenden Widerstand nicht vergessen), die mir den Zustand des Busteilnehmers signalisiert. Falls keine 2 farbige LED zur Verfügung steht, kann auch an jeden Anschluss eine LED gegen Masse angeschlossen werden. Die Farben haben folgende Bedeutung:
- Rot blinken Modul befindet sich im Setup
- Rot Dauerlicht Modul mit Busfehler
- Grün Dauerlicht Bus OK
In den Arduino-Projeken gibt es eine Datei Namens "Config.h" in dieser müsst Ihr Eure Einstellungen bezüglich der Ethernet Adresse und i2c Adresse (momentan nur Adresse 1 und 2 möglich) vornehmen. Im Codesys Projekt beim Modus Slave ebenfalls die Adresse für den Arduino anpassen.
In meinen Projekten gehe ich immer etwas sparsam mit Kommentaren um, das ist nicht in Ordnung und ich werde bei Gelegenheit dies verbessern. Wenn jemand Fragen zum Code hat kann er sich gerne nochmals melden. Das Codesys Projekt habe ich getestet. Bei entsprechendem Aufbau sollten bei Euch ein paar LEDs blinken. Falls der Modbusteilnehmer ausfällt wird am Raspberry der GPIO Pin 17 eingeschalten. Dieser kann zur Signalisierung mit einer 3mA LED + Vorwiderstand bestückt werden.
Verbesserungsvorschläge sind ausdrücklich erwünscht.
Da ich mich größtenteils an Projekten aus diesem oder anderen Foren orientiere könnte es vorkommen, das der ein oder andere Bruchstücke seines Codes in diesem Projekt wiederkennt, ich behaupte auch nicht das der Code ausschließlich von mir stammt.
Danke für eure Hilfe.... hab's hinbekommen.... aber für die Haus Automatisierung bleibe ich doch lieber bei wago und beckhoff in Verbindung mit raspi und codesys v3
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
hat son jemand ein arduino nano mit ENC28J60 ethernet card als modbus slave in codesys zum laufen gebracht? ich habe die lib von https://github.com/andresarmento/modbus-arduino benutzt. es funktioniert aber nicht richtig, der status wechselt im sekunden takt zwisch läuft,läuft nicht, busfehler. leider finde ich den fehler nicht. Mudbus lib von https://code.google.com/p/mudbus/downloads/list funktioniert dagegen mit dem "teurem ethernet shield" ohne probleme. leider lässt sie sich nicht mit dem ENC28J60 nutzen
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
diese 1 Sekunde hört sich für mich nach dem Timeout "Response Timeout(ms)" 1000 an (oder aber im Master gibt's den auch)
den bitte mal erhöhen und im Watchfenster den Name deines Slaves eingeben (jeder Slave hat eine Implizit angelegten FB der dann Diagnose mitbringt)
Grüße
Edwin
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
hallo,
der ausdruck:
"Device.Application.Modbus_TCP_Slave.byModbusError"
wechselt immer zwischen "RESPONSE_SUCCESS" und "TCP_COMMUNICATION_ERROR" bei eingeschalteted auto-reconnect.
auch die erhöhung des "Response Timeout" beim master oder slave brachte keine änderung.
//Modbus Registers Offsets (0-9999)
const int LAMP1_COIL = 100;
//Used Pins
const int ledPin = 9;
//ModbusIP object
ModbusIP mb;
void setup() {
// The media access control (ethernet hardware) address for the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// The IP address for the shield
byte ip[] = { 192, 168, 178, 8 };
//Config Modbus IP
mb.config(mac, ip);
//Set ledPin mode
pinMode(ledPin, OUTPUT);
// Add LAMP1_COIL register - Use addCoil() for digital outputs
mb.addCoil(LAMP1_COIL);
}
void loop() {
//Call once inside loop() - all magic here
mb.task();
//Attach ledPin to LAMP1_COIL register
digitalWrite(ledPin, mb.Coil(LAMP1_COIL));
}
Die Mudbus.h lib für das "große ethernet shield funktioniert dagegen ohne probleme, nur halt dieses enc28j60 nicht.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
hm.. nicht so falsch.
Ich würde einfach mal mit den Offsets rumspielen.
(vielleicht mal auf beiden seiten auf 0, aber vielleicht hast du das schon probiert..?)
Grüße
Edwin
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Habe ich schon versucht, an sich funktioniert es ja, die Led blinkt..... Aber der Zyklus passt nicht, weil die Verbindung immer kurz weg ist...... Bin auch ratlos....
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
mach doch bitte mal den autoreconnect weg,
dann sieht man vielleicht an den Meldungen der FB's genauer was passiert und Reponse Timout und vielleicht auch mal den Socket Timeout
erhöhen.
Grüße
Edwin
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo liebe Gemeinde,
Ich bin auf der suche nach einem Code fürs Arduino mit Ethernet Shield, der es erlaubt das Arduino und seine ein und Ausgänge über Modbus TCP zu nutzen. ich bin nun soweit das mir codesys bei Status des Modbus slave "<modbustcpslave: läuft="">" anzeigt und wenn ich das Arduino vom Netzwerk nehme fehler anzeigt..... leider habe ich das programmieren nie richtig gelernt und versuche mir durch viel lesen und viel Interesse alles selber bei zu bringen.</modbustcpslave:>
vllt kann mir ja jemand helfen.
mfg almot
diesen code nutze ich zurzeit auf dem Arduino:
https://code.google.com/p/mudbus/downloads/list
Hallo almot,
ich habe bereits ein Arduino Ethernet als Modbus Slave laufen. Dieser bildet den "Buskopf" für meine Erweiterungskarten. Die Hardware für die Erweiterungskarten ist wiederum ein Arduino Uno der über i2c mit dem Buskopf verbunden ist. Jede Erweiterungskarte hat 8 Eingänge und 8 Ausgänge. Momentan habe ich 2 Erweiterungskarten angeschlossen es sollen mal 4 werden. Denkbar ist hier auch die Nutzung der Analogeingänge bzw. 1 Wire mit Temperatursensoren DS18x20.
Ich habe mich bei den i2c-Slaves absichtlich für Microcontroller entschieden da bei einem Busfehler die Ausgänge ausgeschalten werden können. Dieses ist meines wissens bei der Verwendung von PCF8574 nicht möglich.
Die Software habe ich aus der Arduino Library "mudbus" abgewandelt. Dazu am besten die Beispiele die in der Library vorhanden sind nutzen. Schau auch mal in die Datei Mudbus.ccp, da stehen ganz am Ende die möglichen Zugriffstypen. Je nachdem was im Arduinoprogramm verwendet wird, muss dies auch in Codesys bei der Konfiguration Modus-TCP-Slave unter "Modus-Slave-Kanal" eingetragen werden. Ich habe hier einmal für die Eingänge Funktionscode 03 und für die Ausgänge Funktionscode 16 gewählt. Der Offset ist ebenfalls anzupassen. Bei mir ist bei den Eingängen dieser 0x0000 und bei den Ausgängen 0x0002. Die länge ist dann jeweils 2 und die Fehlerbehandlung bei den Eingängen ist "Auf ZERO setzen". Ist wichtig das beim Ausfall der Verbindung die Eingänge in meiner Steuerung auch False sind.
Bin gerne bereit die geänderte Software von den Arduino s zur Verfügung zu stellen.
Viele Grüße Jürgen
Hallo Jürgen,
das hört sich nach einer sehr interessanten Lösung an . Wenn Du so nett wärest, Deinen Arduino Code hier zur Verfügung zu stellen, würde ich mich sehr darüber freuen. Würdest Du Dein Codesys Projekt ebenfalls vorstellen?
Gruß Jörg
Hallo Jörg,
da mein Codesys Projekt noch in den Kinderschuhen steckt, dabe ich heute ein kleines Demoprojekt erstellt. Den Code für die Arduinos habe ich auch beigefügt. Die Library Mudbus von >Dee Wykoff< habe ich ein wenig abgeändert. Ich hoffe er kann mir verzeihen. Jetzt bekomme ich jedenfalls einen Rückgabewert, das die entsprechende Funktion auch ausgeführt wurde. Dieses benutze ich um im Arduino-Code auf Busausfälle zu reagieren. Die Library muss in den entsprechenden Ordner kopiert werden. Ansonsten gibt es Fehler beim kompilieren. Der Code sollte auch auf einem Arduino Uno mit Ethernet-Shield laufen. Bei allen Arduinos habe ich zwischen Pin 0 und Pin 1 ( RX und TX) eine zweifarbige LED mit 2 Anschlüssen (entsprechenden Widerstand nicht vergessen), die mir den Zustand des Busteilnehmers signalisiert. Falls keine 2 farbige LED zur Verfügung steht, kann auch an jeden Anschluss eine LED gegen Masse angeschlossen werden. Die Farben haben folgende Bedeutung:
- Rot blinken Modul befindet sich im Setup
- Rot Dauerlicht Modul mit Busfehler
- Grün Dauerlicht Bus OK
In den Arduino-Projeken gibt es eine Datei Namens "Config.h" in dieser müsst Ihr Eure Einstellungen bezüglich der Ethernet Adresse und i2c Adresse (momentan nur Adresse 1 und 2 möglich) vornehmen. Im Codesys Projekt beim Modus Slave ebenfalls die Adresse für den Arduino anpassen.
In meinen Projekten gehe ich immer etwas sparsam mit Kommentaren um, das ist nicht in Ordnung und ich werde bei Gelegenheit dies verbessern. Wenn jemand Fragen zum Code hat kann er sich gerne nochmals melden. Das Codesys Projekt habe ich getestet. Bei entsprechendem Aufbau sollten bei Euch ein paar LEDs blinken. Falls der Modbusteilnehmer ausfällt wird am Raspberry der GPIO Pin 17 eingeschalten. Dieser kann zur Signalisierung mit einer 3mA LED + Vorwiderstand bestückt werden.
Verbesserungsvorschläge sind ausdrücklich erwünscht.
Da ich mich größtenteils an Projekten aus diesem oder anderen Foren orientiere könnte es vorkommen, das der ein oder andere Bruchstücke seines Codes in diesem Projekt wiederkennt, ich behaupte auch nicht das der Code ausschließlich von mir stammt.
Viele Grüße Jürgen
20150620_RaspberryDemo.zip [59.54 KiB]
Hi Leute,
hab ich vor einiger Zeit beim Googeln gefunden und wird aktuell als Vorlage für eine Hausautomatisierung verwendet:
Beispielprojekt Codesys + µC-Programm für Arduino Mega2560+Uno:
http://www.fleaplc.it/en/tutorials/33-a ... io-codesys
Habs probiert --> voll funktionsfähig
LG
Markus
Hallo Jürgen,
vielen Dank für die Informationen. Werde mich kommendes WE damit auseinander setzen.
@Markus
auch vielen Dank für den Hinweis. Das sieht auch interessant aus.
Gruß Jörg
Danke für eure Hilfe.... hab's hinbekommen.... aber für die Haus Automatisierung bleibe ich doch lieber bei wago und beckhoff in Verbindung mit raspi und codesys v3
hat son jemand ein arduino nano mit ENC28J60 ethernet card als modbus slave in codesys zum laufen gebracht? ich habe die lib von https://github.com/andresarmento/modbus-arduino benutzt. es funktioniert aber nicht richtig, der status wechselt im sekunden takt zwisch läuft,läuft nicht, busfehler. leider finde ich den fehler nicht. Mudbus lib von https://code.google.com/p/mudbus/downloads/list funktioniert dagegen mit dem "teurem ethernet shield" ohne probleme. leider lässt sie sich nicht mit dem ENC28J60 nutzen
Hallo,
diese 1 Sekunde hört sich für mich nach dem Timeout "Response Timeout(ms)" 1000 an (oder aber im Master gibt's den auch)
den bitte mal erhöhen und im Watchfenster den Name deines Slaves eingeben (jeder Slave hat eine Implizit angelegten FB der dann Diagnose mitbringt)
Grüße
Edwin
hallo,
der ausdruck:
"Device.Application.Modbus_TCP_Slave.byModbusError"
wechselt immer zwischen "RESPONSE_SUCCESS" und "TCP_COMMUNICATION_ERROR" bei eingeschalteted auto-reconnect.
auch die erhöhung des "Response Timeout" beim master oder slave brachte keine änderung.
hier mal der code vom arduino:
/
Modbus-Arduino Example - Lamp (Modbus IP)
Copyright by André Sarmento Barbosa
http://github.com/andresarmento/modbus-arduino
/
#include <ethercard.h>
#include <modbus.h>
#include <modbusip_enc28j60.h></modbusip_enc28j60.h></modbus.h></ethercard.h>
//Modbus Registers Offsets (0-9999)
const int LAMP1_COIL = 100;
//Used Pins
const int ledPin = 9;
//ModbusIP object
ModbusIP mb;
void setup() {
// The media access control (ethernet hardware) address for the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// The IP address for the shield
byte ip[] = { 192, 168, 178, 8 };
//Config Modbus IP
mb.config(mac, ip);
//Set ledPin mode
pinMode(ledPin, OUTPUT);
// Add LAMP1_COIL register - Use addCoil() for digital outputs
mb.addCoil(LAMP1_COIL);
}
void loop() {
//Call once inside loop() - all magic here
mb.task();
//Attach ledPin to LAMP1_COIL register
digitalWrite(ledPin, mb.Coil(LAMP1_COIL));
}
Die Mudbus.h lib für das "große ethernet shield funktioniert dagegen ohne probleme, nur halt dieses enc28j60 nicht.
Hi,
dann noch dein CODESYS Projekt.. damit ich sehe was du konfiguriert hast.
Grüße
Edwin
hi,
hier mein raspberry testprojekt.
https://onedrive.live.com/redir?resid=5 ... file%2czip m
Hi,
hm.. nicht so falsch.
Ich würde einfach mal mit den Offsets rumspielen.
(vielleicht mal auf beiden seiten auf 0, aber vielleicht hast du das schon probiert..?)
Grüße
Edwin
Habe ich schon versucht, an sich funktioniert es ja, die Led blinkt..... Aber der Zyklus passt nicht, weil die Verbindung immer kurz weg ist...... Bin auch ratlos....
Hi,
mach doch bitte mal den autoreconnect weg,
dann sieht man vielleicht an den Meldungen der FB's genauer was passiert und Reponse Timout und vielleicht auch mal den Socket Timeout
erhöhen.
Grüße
Edwin
hallo,
sorry für die späte Meldung, hier mal ein Bild ohne auto connect.
mfg