Hallo zusammen, ich versuche, Messdaten von einer Sensoreinheit (Jumo BlackLine + Jumo CR ST10) mit meinem Arduino auszulesen. Leider bekomme ich nur fehlerhafte Werte wie 0,00
, ovf
oder den Fehlercode 224
/ 226. Ich vermute, dass der Arduino zwar Daten sendet, aber keine empfängt, da nur die TX-LED am Arduino leuchtet, nicht jedoch die RX-LED. Ich habe auch einen Logic Analyzer verwendet, aber konnte bisher keine Lösung finden.
Anbei findet ihr meinen Code, die Ausgabe des Logic Analyzers und den Schaltplan meiner Verdrahtung.
#include <ModbusMaster.h>
const int DE_RE = 2; // Pin für DE/RE auf dem RS-485 Modul
ModbusMaster node; // ModbusMaster Objekt erstellen
void preTransmission() {
digitalWrite(DE_RE, HIGH); // Umschalten auf Senden
}
void postTransmission() {
delay(10); // Verzögerung, um sicherzustellen, dass die Übertragung abgeschlossen ist
digitalWrite(DE_RE, LOW); // Umschalten auf Empfangen
}
void setup() {
// Pin für DE/RE setzen
pinMode(DE_RE, OUTPUT);
// Serielle Schnittstelle 1 (RX1/TX1) für die Modbus-Kommunikation initialisieren
Serial1.begin(9600, SERIAL_8N2);
// Modbus-Instanz konfigurieren; Sensoradresse 42 (Modbus-ID des Sensors)
node.begin(42, Serial1); // Serial1 für Modbus verwenden
// Callbacks für die Steuerung von DE/RE vor und nach der Übertragung setzen
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
// Standard-Serial für Debugging initialisieren
Serial.begin(9600);
Serial.println("Sensorabfrage gestartet...");
}
void loop() {
uint8_t result;
uint16_t highRegister, lowRegister;
uint32_t sensorValue;
float sensorFloatValue; // Variable für den Float-Wert
// Modbus-Anfrage: Ein bestimmtes Register vom Sensor lesen
result = node.readHoldingRegisters(9728, 2);
// Überprüfe, ob die Abfrage erfolgreich war
if (result == node.ku8MBSuccess) {
highRegister = node.getResponseBuffer(0); // Register 1 (high bytes)
lowRegister = node.getResponseBuffer(1); // Register 2 (low bytes)
// Bytes in der richtigen Reihenfolge kombinieren
sensorValue = (static_cast<uint32_t>(highRegister) << 16) | lowRegister;
// Gelesene Daten als float interpretieren
sensorFloatValue = *reinterpret_cast<float*>(&sensorValue);
// Sensorwert ausgeben
Serial.print("Aktueller Sensorwert: ");
Serial.println(sensorFloatValue); // Wert ausgeben
} else {
// Fehler ausgeben, wenn die Kommunikation fehlschlägt
Serial.print("Fehlercode: ");
Serial.println(result);
}
// 5 Sekunden warten, bevor der nächste Messwert abgefragt wird
delay(5000);
}
Bin für jede Hilfe dankbar