Hallo,
ich möchte einen ModbusZähler von Finder mit Modbus Schnittstelle auslesen. Modbus ist per Software Serial an den Arduino angeschlossen, Lib = ModbusMaster.h, verwendet wir dein Max485;
Mein Problem, ich bekomme keine Daten vom Zähler geschickt, soweit ich es beurteilen kann, liegt das Problem im Bereich des MAX485;
soweit ich dass mit einem Oszi messen kann, sind auf dem Bus zum Zähler Daten unterwegs, und wenn die ID des Zählers vorhanden ist, kommen auf dem Bus sofort nach den Senden eine Antwort zurück. Auf der TTL Seite des MAX ist auf TX-Leitung im sec. Takt eine Anfrage zu sehen, auf der RX kommt jedoch keine Antwort mehr an. ? Ich denke das Problem liegt an den RE/DO Pins , diese sind parallel geschaltet an Pin 3 des Uno's; Signal ist dauerhaft high; soweit ich den Bus bislang verstanden hab sollte high für senden und low für empfangen stehen,
aber wieso schaltet der Uno die Steuerleitung nicht um?
Was mir komisch vorkommt, im Code ist nirgends definiert an welchem Pin die Steuerleitung angeschlossen ist. ist dieser evtl. fest in der ModBusMaster.h definiert und ich die Steuerleitung an einem falschen Pin angeschlossen? oder mache ich sonst etwas falsch? ?
Ich hab mit Modbus (RS485) bislang überhaupt keine Erfahrung, ist mein erstes Projekt mit Modbus.
Eigentliche Aufgabe sollte sein:
3 Drehstromzähler (Finder 7M.38 Modbus') auszulesen, damit ich die jeweilige aktuelle Gesamtleistung in W je Zähler bekomme. Die Werte möchte ich dann verrechnen und entsprechend meinen Pufferspeicher beheizen, also eine Art Nulleinspeise-PV Steuerung aufbauen. Die Laststeuerung an sich steht soweit schon fest, die Heizkörper werden in 26 Schaltstufen '(reihe, parallell, gemischt) verschaltet und heizen dann je nach möglicher Leistung; Restliche Leistung wird als Überschuss ins Netz eingespeist.
Mein Problem ist aktuell das Auslesen der Zähler;
Geräteadresse ist 33, 8N1; 19200Baud;
der gewünschte Wert liegt in 30140 und 30141;
Ich denke das Senden funktioniert, da auf dem Bus wenn ich ID33 anspreche auch eine Antwort zu sehen ist, welche bei anderen Id's fehlt, den Inhalt der Antwort kann ich aktuell jedoch nicht sagen.
Ich hoffe hier ist ein Spezialist für Modbus unterwegs der mir helfen kann .. komme nicht weiter..
Hier der Code den ich für die ersten Tests verwendet hab:
er sollte die beiden Register auslesen und den Inhalt einfach anzeigen.
#include <ModbusMaster.h> // Modbus Master Library
#include <SoftwareSerial.h> // SoftwareSerial Library
SoftwareSerial modbusSerial(4, 5); // RX, TX for Modbus
ModbusMaster node; // ModbusMaster Objekt
void setup() {
Serial.begin(9600); // Serielle Kommunikation mit der
Baudrate 9600 für Debugging
modbusSerial.begin(19200); // Serielle Kommunikation mit der
Baudrate 19200 für Modbus
node.begin(33, modbusSerial); // ModbusSlave ID und Serielle Objekt
initialisieren
}
void loop() {
uint16_t registerValue;
uint8_t result;
// Senden einer Modbus-Anfrage an Slave-Adresse 33, Funktion 04,
Register 30140 (2 Register lesen)
result = node.readInputRegisters(30140, 2); // Lesen von 2
Input-Registern ab Adresse 30140
if (result == node.ku8MBSuccess) { // Überprüfen, ob das Lesen
erfolgreich war
registerValue = node.getResponseBuffer(0); // Wert des ersten
Registers in der Antwort
Serial.print("Register 30111: ");
Serial.println(registerValue);
registerValue = node.getResponseBuffer(1); // Wert des zweiten
Registers in der Antwort
Serial.print("Register 30112: ");
Serial.println(registerValue);
} else {
Serial.println("Fehler beim Lesen der Register!");
}
delay(1000); // Wartezeit zwischen den Anfragen
}
ich denke mein primäres Problem liegt in der Steuerung der Datenrichtung RE/DO Pin's;
Auf der TX Leitung des Unos sind die Daten da, auf der RX ist nicht zu sehen.
Vielen Dank!