Arduino Mudbus

Versuch mal im Sketch einfache Brötchen zu backen:


// Libary für Modbus
#include <Mudbus.h>
#include <Ethernet.h>
#include <SPI.h>

 
// Definition der IP-Adresse
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x67 };
IPAddress ip( 192, 168, 3, 50);
IPAddress gateway( 192, 168, 3, 1 ); //DNS und GATEWAY
IPAddress subnet( 255, 255, 255, 0 );

// Modbus aufrufen
Mudbus Mb;

void setup(void)
{

pinMode (3, INPUT);

//Serial initalisieren für das debugging
 Serial.begin(9600);

//Ethernetschnittstelle initalisieren
 Ethernet.begin(mac, ip, gateway, gateway, subnet);

//Warten bis alle Einstelungen übernommen wurden
 delay(5000);
 
Serial.print("Server startet at ");
 Serial.println(Ethernet.localIP());
}

void loop(void)
{
 //Modbus starten
 Mb.Run();

Mb.C[3] = digitalRead(3);
}


Dann sollte das eigentlich funktionieren!

Check mal im Debug ob der Arduino läuft evvtl im Loop noch ein


Serial.println(digitalRead(3));

einbauen.

Dann sollte der Arduino sich mit seiner IP Adresse am Anfang melden und dann zyklisch den Zustand des PIN ausgeben.

Server startet at 0.0.0.0

Das is seine Antwort

Setz mal

EthernetServer server(80);

nach IPAddress subnet( 255, 255, 255, 0 ); ein. Scheinbar nimmt er die Einstellungen nicht.

Server startet at 192.168.3.50

jetzt geht schon mal die IP, es stand 2 mal Gateway drin

 Ethernet.begin(mac, ip, gateway, gateway, subnet);

Aber die Verbindung über ModBus geht immer noch nicht

Ich glaub jetzt hab ich´s, hatte den falschen ModBus Gateway genommen.

anstelle von (Splitter) ModBus Gateway
den (ModBus) ModBus Gerät

glaub ich…alles bissel verwirrend grad.
Aber riesen Dank für deine Hilfe!

Edit:

Geht leider doch nicht

Das gibt der Debug vom Client Socket raus

Während der Übertragung ist die Verbindung OK, sobald er fertig ist geht er wieder auf Störung.
Scheit wohl so zu müssen.

Wie leg ich denn jetzt die Variablen im IPS an oder wie verknüpfe ich sie mit den ModBus Adressen
OK wenn ich beim ModBus Adress Bit(1Bit) einstelle kann ich schon mal den Arduino Eingang 3 sehen.

Einfach eine Modus Instanz anlegen und dort die Adresse der Variable aus dem Arduino eintragen.

Bei 1 Bit = Mb.C[1] => in IP-Symcon = 1

Du wählst noch das Intervall aus wie oft gelesen wird. Dort siehst Du im übrigen auch lesen und schreiben. Kann für eine Variable in IP-Symcon auch zwei Variablen im Arduino sein!
Den Intervall würde ich maximal auf 1 Sekunde stellen. Eher langsamer… Ich verarbeitet zurzeit rund 500 ModbusVariablen da kommen meine Controller echt ins Schwitzen bei häufigen abfragen.

Wie mach ich das denn wenn ich 1Byte nehme da hätte ich ja 8Bit, da könnte ich doch 8 DigitalPins abfragen oder?
Muß ich das dann so schreiben

Mb.C[8] = digitalRead(3);
Mb.C[8] = digitalRead(5);
Mb.C[8] = digitalRead(7);

Was is mit Schreibadresse und Leseadresse gemeint?

oder wie muß ich das schreiben wenn ich nen DHT11 mit Temperatur und Luftfeuchtigkeit übergeben möchte?

Hab es heute Morgen mal auf einem Raspberry Pi eingerichtet, dort ist mir aufgefallen das es sobald ich das ModBus Device einfüge die ModBus Sache auf Störung geht.

Hoffe ich nerve dich noch nicht

EDIT

Hab die Verbindung jetzt hin bekommen, zwar nicht dauerhaft aber geht schon, nur hab ich jetzt das Problem das er nicht bei jedem verbinden alle Werte aktualisiert oder muß man das beim Arduino anstoßen?
Hier mal der Sketch

// Libary für Modbus
#include <SPI.h>
#include <Ethernet.h>
#include <Mudbus.h>
#include „DHT.h“

#define DHTPIN A0
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

// Definition der IP-Adresse
byte mac = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip( 192, 168, 3, 50);
IPAddress gateway( 192, 168, 3, 1 ); //DNS und GATEWAY
IPAddress subnet( 255, 255, 255, 0 );

// Modbus aufrufen
Mudbus Mb;

void setup(void)
{
pinMode (3, INPUT);
pinMode (9, INPUT);
//Serial initalisieren für das debugging
Serial.begin(9600);

//Ethernetschnittstelle initalisieren
Ethernet.begin(mac, ip, gateway, subnet);

//Warten bis alle Einstelungen übernommen wurden
delay(5000);

Serial.print("Server startet at ");
Serial.println(Ethernet.localIP());
Serial.println(digitalRead(3));
Serial.println(digitalRead(5));
Serial.println(digitalRead(9));

}

void loop(void)

{
float feuchte = dht.readHumidity();
float temperatur = dht.readTemperature();
int hmfeuchte = (feuchte * 100);
int hmtemperatur = (temperatur * 100);

//Modbus starten
Mb.Run();

Mb.C[20] = digitalRead(3);
Mb.C[30] = digitalRead(9);
Mb.R[0] = dht.readTemperature();
Mb.R[1] = dht.readHumidity();
Mb.R[3] = hmfeuchte;
Mb.R[4] = hmtemperatur;

Serial.print("Humidity: „);
Serial.print(feuchte);
Serial.print(“ % „);
Serial.println(“ ");
Serial.print("Temperature: „);
Serial.print(temperatur);
Serial.print(“ *C „);
Serial.println(“ ");

Serial.print("Int Humidity: "); 

Serial.print(hmfeuchte);
Serial.print(" % „);
Serial.println(“ ");
Serial.print("Int Temperature: „);
Serial.print(hmtemperatur);
Serial.print(“ *C „);
Serial.println(“ ");
delay(5000);
}



Hallo,

ich habe dank der Beiträge hier im Forum meinen Arduino uno mit Ethernetshield problemlos über eine Modbus-Instanz angeschlossen und kann Analog- und Digitalangänge als Variablen in IPS anzeigen. Als nächster Schritt soll jetzt
der 1-wire Temperatursensor DS18B20 am Arduiono ausgelesen werden, da der Chip nur einen Wert liefert, sollte das
kein Problem sein. Arduinoseitig gibt es da ja im Netz entprechende Sketeches.

Meine Frage: Interessant wäre auch der Anschluss z. B. des DS2408 (8-fach Switch) oder des DS2450 (4-fach A/D).
Muss ich dann für jeden Ein-/ Ausgang in IPS ein Modbus-Gerät anlegen (z. B. jeder Eingang des DS2450 -> entspricht
einem Modbus-Gerät)? Oder geht das auf einem anderen Weg?

Danke & Grüße

Ecoli

Hi,
ich denke das für jeden ein eigener gebraucht wird, aber genau weis ich das nicht.

Ist bei dir die Verbindung zwischen IPS und Uno dauerhaft oder nur wenn IPS die Daten abfragt?
Ecoli könntest du mir dein Sketch mal posten, das ich mal schauen kann wie du das gemacht hast?

Gruß
Stefan

Hallo Stefan,

ein Sketch habe ich dazu noch noch nicht geschrieben. Ich werde jetzt erst einmal den Tempartursensor DS18B20 testen und mich dann an die „komplexeren“ Bauteile DS2408/ DS2450 wagen. Wenn ich soweit bin, werde ich mich wieder melden und mein Sketch posten. Sicher brauche in da noch Hilfe…

Danke für die schnelle Rückmeldung & Grüße

Ecoli

Ich bin gespannt ob die Verbindung bei dir dauerhaft besteht oder wie bei mir nur wenn die Werte abgerufen werden.

Gruß
Stefan

Hat einer einen Tip, wie das mit einem ESP8266 hinbekomme ?

Habe eine Libary für den ESP und Arduino IDE gefunden:

Adafruit customer service forums • View topic - MODBUS TCP via WiFi Shield

Damit klappt es wunderbar…

Hallo,
ich habe das Problem, dass ich die Modbus Libarie nicht eigbunden bekomme.


Users/christian/Documents/Arduino/modbus001/modbus001.ino:2:20: fatal error: Mudbus.h: No such file or directory
 #include <Mudbus.h>

Die Libarie ist aber drin…?

In der Bibliotheksverwaltung steht „ModbusMaster by Doc Walker Version 2.0.1 INSTALLED“

Arduino Version: 1.8.1 auf Mac installiert.

kann mir jemand einen Tipp geben?
Gruß
Christian

ich hab das Problem gefunden, ich habe die falsche Libary eingebunden, die Libary die im ersten genannt ist gibt es nicht mehr.
kann mir jemand die Libary geben?

Hi mit welchem Gerät willst du die Lib. verwenden ? Wenn du Sie mit einem ESP verwenden willst, dann brauchst du diese:

https://dl.dropboxusercontent.com/u/2476467/IPS/Modbus.zip

Guten Abend,

ich würde mich gerne mit einer Frage in dieses Thema einklinken.

Ich möchte gerne mit IPS einen Wert (0-255) an den Arduino senden und ihn dort in eine Variable schreiben.
Hat Jemand Werte, die ich auf Arduino-, sowie auf IPS-Seite eintragen muss?

Arduino:

analogWrite(rot, Mb.R[7]); //rot ist in diesem Fall die Variable, in welche der 0-255-Wert geschrieben werden soll, mit der ich dann ein LED-Strip dimmen möchte.

IPS:

Byte (8Bit-unsigned),
Funktion (schreiben): Write Single Register (06),
Adresse (schreiben): 7
Faktor: keine
(X) Status emulieren,
Intervall 500ms

Bin für jede Hilfe Dankbar.

MfG

screamue

Schon diesen Beitrag gesehen? Empfehle das Zip mal zu schauen.
Gruß Helmut

Danke für die schnelle Antwort, jedoch hilft mir der verlinkte Beitrag/Thread nur bedingt weiter.

Hier mal ein Code, mit dem ich (erfolgreich) DHT-, sowie ‚normale‘ Feuchtigkeitssensoren ausgelesen habe:

#include „DHT.h“
#include <SPI.h>
#include <Ethernet.h>
#include „Mudbus.h“

Mudbus Mb;

#define DHT1PIN 5
#define DHT2PIN 6
#define DHTTYPE DHT22 //DHT11, DHT21, DHT22

DHT dht1(DHT1PIN, DHTTYPE);
DHT dht2(DHT2PIN, DHTTYPE);

void setup()
{
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);

uint8_t mac = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xBD };
uint8_t ip = { 192, 168, 4, 20 };
uint8_t gateway = { 192, 168, 4, 1 };
uint8_t subnet = { 255, 255, 255, 0 };
Ethernet.begin(mac, ip, gateway, subnet);
//Avoid pins 4,10,11,12,13 when using ethernet shield

dht1.begin();
dht2.begin();

}

void loop()
{
float hinnen = dht1.readHumidity(); //Luftfeuchte auslesen
float tinnen = dht1.readTemperature(); //Temperatur auslesen
float haussen = dht2.readHumidity(); //Luftfeuchte auslesen
float taussen = dht2.readTemperature(); //Temperatur auslesen
float feuchte01=0;
float feuchte01prozent=0;
float feuchte02=0;
float feuchte02prozent=0;
float helligkeit01=0;
float helligkeit01norm=0;

{
feuchte01=analogRead(A0);
feuchte01prozent=(100 - ((100 / 1023.0) * feuchte01));
feuchte02=analogRead(A2);
feuchte02prozent=(100 - ((100 / 1023.0) * feuchte02));
helligkeit01=analogRead(A1);
helligkeit01norm=(100 - ((100 / 1023.0) *helligkeit01));
}

{
Mb.Run();
//Modbus read
Mb.R[1] = tinnen100;
Mb.R[2] = hinnen
100;
Mb.R[3] = taussen100;
Mb.R[4] = haussen
100;
Mb.R[5] = feuchte01prozent100;
Mb.R[6] = feuchte02prozent
100;
Mb.R[7] = digitalRead(7);
Mb.R[8] = digitalRead(8);
Mb.R[9] = digitalRead(9);

//Modbus write
digitalWrite(7,Mb.C[7]);
digitalWrite(8,Mb.C[8]);
digitalWrite(9,Mb.C[9]);

}

}

Die Adressen 7-9 sind zum Schalten der Ausgänge und gleichzeitiger Abfrage des wirklichen Status’.
Ich verstehe nun nicht, warum die Analogwerte in EINE Richtung (Arduino —> IPS) funktionieren und in die andere nicht - schließlich kann ich ja auch die einzelnen Bits an den Arduino schicken. :confused:

Du solltest, wenn Dir geholfen werden soll, alle Deine Dateien zippen und hier anhängen.
Eventuell bist Du mit Deiner Frage, Deinem Wunsch im Arduino Forum besser aufgehoben.

Ob in Deiner MudBus Datei auch write Modbusfunktionen drin sind kann ich nicht erkennen und bitte pack Deinen Code in „Raute Tags“ (Maus über das Rautesymbol halten und klicken)

Gruß Helmut