Ich möchte einen EARU DDS 661 Leistungsmesser von Ali per Modbus RTU mittels Arduino auslesen. Es ist eher als Spaßprojekt zu verstehen, um etwas zu lernen.
Vorhanden sind:
DDS 661
RS485-USB Dongle
RS485-TTL Adapterplatine ( JZK 5 Stück TTL auf RS485 Modul, 485 auf serielle Schnittstelle, UART-Ebene gegenseitige Konvertierung, automatische Hardware-Durchflusskontrolle, TTL Turn RS485 3,3 V 5 V: Amazon.de: Computer & Zubehör)
Arduino Uno R3
Das Datenblatt des DDS 661 wurde mir recht schnell zugesandt (wenn ich dürfte würde ich es hier hochladen), sodass ich es bisher geschafft habe, den Leistungsmesser mittels RS485-USB Dongle und dem Windows Programm Gmodbus (war in der Bedienung für mich am einfachsten verständlich) auslesen zu können.
Auf
01 04 00 00 00 02 71 CB
(01=Adresse, 04="Befehl", 00 00 = Start Lesen Register 0, 00 02= 2 Worte und 4 Bytes an Daten, 71 CB = Checksumme)
kommt dann zurück
01 04 04 43 68 66 66 C4 56
(01=Adresse, 04="Befehl", 04=4 Bytes an Daten, 43 68 66 66= Daten nach IEEE754
entspricht am Ende des Tages einer Spannung von 232,4 Volt. Passt.
Mit dem Arduino habe ich es bisher nur geschafft, Daten zu senden (überprüft mit dem RS485-USB Dongle) und Modbus Slave als "Listener".
Der Befehl 01 04 00 00 00 02 71 CB wird korrekt auf den Bus gesendet, eine Antwort vom Leistungsmesser kommt aber nicht; wie als wäre der Bus überlastet.
Dann habe ich mit sendendem Arduino und Gmodbus den Befehl gesendet, und bekomme ganz normal etwas vom Leistungsmesser zurück.
Hierbei war auffällig, dass die RX LED des RS485-TTL Moduls kurz leuchtet.
Code anbei - mein RS485-TTL Modul von Amazon hat leider den DE/RE Pin nicht, soll selbst umschalten zwischen senden und empfangen.
#include<ModbusMaster.h>
#include <SoftwareSerial.h>
#define RX_PIN 11
#define TX_PIN 10
//#define MAX485_REDE_PIN 12
SoftwareSerial modbusSerial(RX_PIN, TX_PIN);
ModbusMaster node; //object node for class ModbusMaster
void setup()
{
Serial.begin(9600); //Baud Rate as 9600
modbusSerial.begin(9600); //Baud Rate as 9600
node.begin(1, modbusSerial); //Slave ID as 1 on SoftwareSerial
}
void loop()
{
uint8_t result = node.readInputRegisters(0,2);
if (result == node.ku8MBSuccess)
{
Serial.print("data : ");
Serial.print(node.getResponseBuffer(0));
}
Serial.print("\n");
delay(3000);
}
Vielen Dank im Voraus für Eure Hilfe!