Hallo.
Gerne würde ich einen EPEVER Solarladeregler auslesen. Verwendet wird ein RS458 zu TTL Converter (mit RX/TX Pins). Der originale Code war für den ESP32 gedacht und scheint auf solchem zu funktionieren. Nach der Anforderung kommen Antworten vom Laderegler. Allerdings werden hier RX2 und TX2 genutzt.
Portiert auf den ESP8266 funktioniert es aber nicht mehr. Es werden Daten gesendet, der Laderegler antwortet nicht.
Kann es sein dass hier der serielle Port irgendwie falsch konfiguriert ist?
Hier der Original Code
#include <ModbusMaster.h>
#define ARRAY_SIZE(A) (sizeof(A) / sizeof((A)[0]))
float battChargeCurrent, battDischargeCurrent, battOverallCurrent, battChargePower;
float bvoltage, ctemp, btemp, bSOC, lpower, lcurrent, pvvoltage, pvcurrent, pvpower;
float stats_today_pv_volt_min, stats_today_pv_volt_max;
uint8_t result;
unsigned long previousMillis = 0;
ModbusMaster node;
void preTransmission() {
}
void postTransmission() {
}
// A list of the regisities to query in order
typedef void (*RegistryList[])();
RegistryList Registries = {
AddressRegistry_3100,
AddressRegistry_3106,
AddressRegistry_310D,
AddressRegistry_311A,
AddressRegistry_331B,
};
// keep log of where we are
uint8_t currentRegistryNumber = 0;
// function to switch to next registry
void nextRegistryNumber() {
currentRegistryNumber++;
if (currentRegistryNumber >= ARRAY_SIZE(Registries)) {
currentRegistryNumber = 0;
}
}
// exec a function of registry read (cycles between different addresses)
void executeCurrentRegistryFunction() {
Registries[currentRegistryNumber]();
}
void AddressRegistry_3100() {
result = node.readInputRegisters(0x3100, 6);
if (result == node.ku8MBSuccess) {
pvvoltage = node.getResponseBuffer(0x00) / 100.0f;
pvcurrent = node.getResponseBuffer(0x01) / 100.0f;
pvpower = (node.getResponseBuffer(0x02) | node.getResponseBuffer(0x03) << 16) / 100.0f;
bvoltage = node.getResponseBuffer(0x04) / 100.0f;
battChargeCurrent = node.getResponseBuffer(0x05) / 100.0f;
}
}
void AddressRegistry_3106() {
result = node.readInputRegisters(0x3106, 2);
if (result == node.ku8MBSuccess) {
battChargePower = (node.getResponseBuffer(0x00) | node.getResponseBuffer(0x01) << 16) / 100.0f;
}
}
void AddressRegistry_310D() {
result = node.readInputRegisters(0x310D, 3);
if (result == node.ku8MBSuccess) {
lcurrent = node.getResponseBuffer(0x00) / 100.0f;
lpower = (node.getResponseBuffer(0x01) | node.getResponseBuffer(0x02) << 16) / 100.0f;
}
}
void AddressRegistry_311A() {
result = node.readInputRegisters(0x311A, 2);
if (result == node.ku8MBSuccess) {
bSOC = node.getResponseBuffer(0x00) / 1.0f;
btemp = node.getResponseBuffer(0x01) / 100.0f;
}
}
void AddressRegistry_331B() {
result = node.readInputRegisters(0x331B, 2);
if (result == node.ku8MBSuccess) {
battOverallCurrent = (node.getResponseBuffer(0x00) | node.getResponseBuffer(0x01) << 16) / 100.0f;
}
}
void setup() {
Serial.begin(115200);
// Modbus slave ID 1
node.begin(1, Serial);
// callbacks to toggle DE + RE on MAX485
node.preTransmission(preTransmission);
node.postTransmission(postTransmission);
}
void loop() {
unsigned long currentMillis = millis();
const long interval = 5000;
if (currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
executeCurrentRegistryFunction();
nextRegistryNumber();
}
}

