**!!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
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.
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.
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.
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);
}
Im Fehlerfall nicht nur einen Fixtext rausschreiben sondern gib dir den Fehlercode aus. In der Lib steht, was die einzelnen Fehlercodes im Langtext bedeuten
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!
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!!
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?