Modbus ohne Plan Kein Erfolg NO SUCCESS

**!!ATTATION ACHTUNG!! ES Funktioniert so nicht BITTE NICHT Weiterlesen **
####################
BITTE Jemand den TREAD Löschen
####################

Guten Tag
Ich dachte es wäre sooooo Einfach
Wärmepumpe Daten auf ein Websockel.
Modbus RTU
float Temp = node.readHoldingregister(2,118);

ABER NIX ist
Modbus braucht einen Request den ich zusammenbauen muss
und ein Antwort DataBlock der dann bytes enthält die wiederum verarbeitet werden müssen .

Ich brauche hilfe ECHT!
Word 118 enthält die temperatur

// Function to construct a Modbus request frame
void constructModbusRequest(byte *frame, byte address, byte function, byte startHigh, byte startLow, byte countHigh, byte countLow) {
  frame[0] = address;          // Address of the slave device
  frame[1] = function;         // Function code
  frame[2] = startHigh;        // High byte of the starting address
  frame[3] = startLow;         // Low byte of the starting address
  frame[4] = countHigh;        // High byte of the number of registers to read
  frame[5] = countLow;         // Low byte of the number of registers to read

  // Calculate and append the CRC to the request frame
  uint16_t crc = calculateCRC(frame, 6);
  frame[6] = crc & 0xFF;         // CRC low byte
  frame[7] = (crc >> 8) & 0xFF;  // CRC high byte
}

mit daten

// Define Modbus parameters
const byte slaveAddress = 0x02;          // Address= 2 of the Modbus slave device
const byte functionCode = 0x03;          // Function code to read holding registers
const byte startAddressHigh = 0x00;      // High byte of the starting address
const byte startAddressLow = 0x00;       // Low byte of the starting address
const byte registerCountHigh = 0x00;     // High byte of the number of registers to read
const byte registerCountLow = 0x02;      // Low byte of the number of registers to read

FRAGE WAS IST die 118 0x76

Antwort

// Read and process the Modbus response frame
  if (mySerial.available()) {
    // Create a buffer to store the response frame
    byte responseFrame[9];
    // Read the response frame from the slave device
    readModbusResponse(responseFrame, 9);
    // Verify the CRC of the received response frame
    if (verifyCRC(responseFrame, 9)) {
      // Process the response frame to extract data
      processModbusResponse(responseFrame);
    } else {
      // Print an error message if CRC verification fails
      Serial.println("CRC error.");
    }
  } else {
    // Print an error message if no response is received
    Serial.println("No response from slave.");
  }

und wie bekomme ich denn da die FLOAT heraus
es sind ja 2 byte MSB LSB ist das genormt welches byte welches ist

BITTE um Beistand Danke

Nimm eine fertige Library.
Zum Beispiel die Modbus Master von Doc Walker.

Passe das Beispiel entsprechend an.
Wenn es nicht funktioniert, poste deinen abgeänderten Code und die Serielle Ausgabe dazu.
Es soll ein vollständiger Code sein.

Das ist Deine Startadresse.

Das find ich ungewöhnlich.
Ich kenn das nur anders rum. (Adresse, Anzahl)

Vor allem würde ich als erstes ausprobieren mit einem Laptop und einer Modbus Software ob die WP überhaupt Antwortet damit hat man schon mal die halbe Miete.

modbusView TCP

Mit dieser Software kannst du 30 Minuten nutzten ohne Registrierung danach stoppt die kann man aber unmittelbar wieder Starteten.
Achtung hier steht zwar TCP der kann aber auch seriell. Dann kann man alles einstellen der einzelnen Register und schauen ob die WP auch antwortet. Mann muss hier aber auch die richtige ID einstellen bei RTU.

Dann kann man mit den entsprechenden LIBs die Anfrage im Arduino auch entsprechend zusammenbauen.
Denn wenn man probiert weiß man nicht ob die WP einfach nicht Antwortet weil die Anfrage falsch zusammen gebaut ist oder die WP grundsätzlich nicht antwortet.
Dann kann man bei den Libraries über die Beispiele dann entsprechend anpassen das es für dich passt.

Gruß

DerDani

Das kann die freie software nano red auch !
ich werde mal eine byte sniffer setzen und mir den datenstrem anschauen was da an btes fliest und dann regieren ist ja 1zu eins ich muss nur auslesen nichts setzen !

so ich habe mal was zusammengeschustert
SOLLTE das so gehen

#include <ModbusMaster.h> // docwalter lib https://forum.arduino.cc/t/modbusmaster-vondocwalker/645373
// instantiate ModbusMaster object
ModbusMaster node;

void setup()
{
  // use Serial (port 0); initialize Modbus communication baud rate
  Serial.begin(9600);
  Serial1.begin(9600, SERIAL_8N1, 16, 17);  // Use UART2 
  
  // communicate with Modbus slave ID 2 over Serial (port 0)
  node.begin(2, Serial1);
  delay(1000); //Delay to the init 
}
uint16_t loopcount=1;
void loop(){
  if (loopcount > 10){// wait 10sec to init the connection then read
    float temp_outside = 0.0; 
    static uint32_t i;
    uint8_t j, result;
    uint16_t data[6];
    // set word 0 of TX buffer to least-significant word of counter (bits 15..0)
    node.setTransmitBuffer(0, lowWord(i));
    // set word 1 of TX buffer to most-significant word of counter (bits 31..16)
    node.setTransmitBuffer(1, highWord(i));
    
    // slave: read (4) 16-bit registers starting at register 118 to RX buffer
    result = node.readHoldingRegisters(0x76, 4);
    
    // do something with data if read is successful
    if (result == node.ku8MBSuccess)
    {
      for (j = 0; j < 4; j++)
      {
        data[j] = node.getResponseBuffer(j);
        Serial.print(j);
        Serial.print("data :");
        Serial.println(data[j]);
       }
      memcpy(temp_outside, data, 4);
     Serial.print("TEMP outdoor: ");
     Serial.println(temp_outside);
    }else{Serial.println("no DATA");
    }
    loopcount=0;
    }
delay(1000);
loopcount++;
Serial.println(loopcount);
}

Danke für jede rückantwort!

Für was für einen Controller ist das geschrieben?

Und mach sowas nicht:

Wenn das delay sich ändert oder aufgelöst wird, hast Du ein Problem.

Da ich nicht weiss für was das kompilieren soll:

constexpr uint32_t _ONESECOND {1000};
uint32_t lastReadTime;
  if (millis() - lastReadTime > _ONESECOND)
  {
    lastReadTime=millis();
    float temp_outside = 0.0;
[....]

und das ganze Geraffel mit delay und dem Zähler weg lassen.

Im Fehlerfall nicht nur einen Fixtext rausschreiben sondern gib dir den Fehlercode aus. In der Lib steht, was die einzelnen Fehlercodes im Langtext bedeuten

Serial.println(result, HEX) ;

Danmke Das mit den Millisec weis ich Es geht nur darum das der PLC scheinbar eine vorlauf braucht laut datenblatt soll man 10sec warten nach der init und dann erst auslesen und das ist halt schnell mal so geschrieben ich bekomme ja überhaupt nichts von der unit

Mein Grundverständniss ist da bei Modbus nicht vorhanden !? LEIDER
Fängt ja schon an
WAS ist die PLC master oder slave. Muss ich da in den ESP32 32D wroom 30Pin
etwa ein Slave draus machen. andere LIB DocWalker Modbus Master ist da geladen.

Momentna schalte ich das gerät 30min aus nach jedem versuch um den PLC neu zustarten!
der scheint die RS-485 Anfrage überhaupt nicht zu mögen!

Die Anlage läuft ohne Probleme weiter.

jetzt schreibe mal die exakten Typen und verlinke die Datenblätter.

  • Im Eingangspost hast du von einer Wärmepumpe geschrieben.
  • Jetzt schreibst du auf einmal von einer PLC - das ist üblicherweise ein programmable logic controller

weiters hat der ESP32 kein RS485.

  • Welchen Wandler hast du am ESP32 hängen? Auch von diesem einen Link und wenn geht ein Datenblatt.

und am Schluss ladest noch ein Bild von deiner Verkabelung hoch - ich muss genau erkennen können, welches Kabel von wo nach wo geht.

UND Die Verrwirrung steigert sich TESTSETUP
ESP8266 sender -> China TTLto485 /twisted pair das gleiche wie zum Modbus nur 2m
China ttlto485 -> ESp32Wroom 32D 30 pin siehe Bild
Der Esp sended einem Buchstaben alle 500ms myserial.write


der ESP32 sllte das empfangen Jedoch geht der Esp8266 aus wenn ich den Converter connecte TXD RXD ??? jetzt lese ich das diese Teiel die TXD und RXD vertauscht haben LOL

ich war so zuversichtlich eine Temp aus einer Wärmepumpe auszulesen und im Webinterface anzuzeigen das wird ein mamut projekt und forder stunden an testen!!

im Bild sehe ich nun

  • NodeMCU/ESP8266
    mit einem RS485 Adapter vermutlich Autosensing

und

  • ESP32 WROOM
    mit einem RS485 Adapter - vermutlich Autosensing

Ich seh keine Wärmepumpe.
Ich sehe keine PLC.
Ich sehe keine Datenblätter,
ich sehe keine Links auf deine Produkte.
Ich sehe keine Echtbilder was du wirklich hast.

Worauf läuft der Sektch den du in #6 gepostet hast?

Du weist wenn du auf VIN Spannung hast, dann ist es 5V.
Der MAX485 arbeitet auch mit 3,3V, nicht das du diervdie Rx Eingänge kaputt machst.