"Raspberry pi SPS" und arduino uno als Modbus Slave

almot89
2015-06-18
2015-09-30
  • almot89 - 2015-06-18

    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

     
  • Jürgen - 2015-06-19

    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

     
  • joerg.esser - 2015-06-20

    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

     
  • Jürgen - 2015-06-20

    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]

     
  • maxus - 2015-06-22

    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

     
  • joerg.esser - 2015-06-22

    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

     
  • almot89 - 2015-07-31

    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

     
  • almot89 - 2015-09-06

    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

     
  • eschwellinger

    eschwellinger - 2015-09-07

    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

    IMG: ResponseTimeout.jpg

     
  • almot89 - 2015-09-07

    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.

     
  • eschwellinger

    eschwellinger - 2015-09-08

    Hi,

    dann noch dein CODESYS Projekt.. damit ich sehe was du konfiguriert hast.
    Grüße
    Edwin

     
  • eschwellinger

    eschwellinger - 2015-09-09

    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

     
  • almot89 - 2015-09-09

    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....

     
  • eschwellinger

    eschwellinger - 2015-09-09

    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

     
  • almot89 - 2015-09-30

    hallo,

    sorry für die späte Meldung, hier mal ein Bild ohne auto connect.

    mfg

    IMG: modbus.JPG

     

Log in to post a comment.