EPS32 Leistung SMA Tripower Modbus TCP auslesen

OP #7767918
Lesenswert?

Hallo in die Runde,

ich habe einen ESP 32. Per WLAN in das Netzwerk einwählen ist nicht so schwer weil es genügend Beispiele gibt. Leider hapert es bei mir mit Registern und dem ganzen Zeug.

Konkret möchte ich gern die aktuelle Einspeiseleistung aus dem Register 30867 auslesen (Unit-ID 2) und auf dem Serial Port ausgeben.

Würde sich jemand bitte erbarmen, den Code zu posten und für mich/ andere erklären? sollten Ja nicht so viele Zeiten sein und für einen geübten Programmierer "einfach" sein. Ich wäre sehr dankbar :-).

bisher habe ich folgenden Code:

1
#include "WiFi.h"
2

3
const char * ssid = "yyyyyyyyy";
4
const char * password = "xxxxx";
5

6

7
void setup() 
8

9
{
10
  // put your setup code here, to run once:
11
Serial.begin(9600);
12
 WiFi.begin(ssid, password);
13
  while (WiFi.status() != WL_CONNECTED) 
14
    {
15
    delay(500);
16
    Serial.println("Connecting to WiFi..");
17
    }
18
  Serial.println("Connected to the WiFi network");
19

20
}
21

22
void loop() 
23

24
{
25

26

27
}
#7768468
Lesenswert?

Du solltest erstmal MODBUS verstehen. Hier ist die Originalspafifikation, quasi die Primärquelle, von der alle anderen abgeschrieben haben:

https://modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf https://modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf

Da steht alles drin, was es zu dem Thema zu wissen gibt.

Dann hat sich da schon mal jemand die Arbeit gemacht, das auf einem ESP32 zu implementieren. Lies das: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/protocols/modbus.html Du wirst den TCP-Master haben wollen. https://github.com/espressif/esp-idf/tree/ce608534/examples/protocols/modbus/tcp/mb_tcp_master

Damit hast Du jetzt alle erforderlichen Informationen.

fchk

OP #7770221
Lesenswert?

Hallo und Danke für dein Feedback.

Hab mir es mal angeschaut. So wie ich das sehe sind bei

esp-idf/examples/protocols/modbus/tcp/mb_tcp_master/main /tcp_master.c

mehr als 500 Zeilen Code ? Korrekt ?

Ich hatte die gleiche Anwendung mal auf einem Arduino Mega mit Ethernet Shield laufen, da waren es nur effektiv die anliegenden überschaubaren Zeilen

1
#include <Ethernet.h>
2
#include <ArduinoModbus.h>
3

4
// Enter a MAC address for your controller below.
5
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
6
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
7

8
EthernetClient ethClient;
9
ModbusTCPClient modbus(ethClient);
10

11
const IPAddress serverAddress(192,168,0,33);
12
const byte CONSUMPTION_METER_UID = 241;
13
unsigned int AC_POWER_REGISTER_ADDR = 40087;
14
unsigned int AC_POWER_SF_REGISTER_ADDR = 40091;
15
const byte AC_POWER_REQUEST_LENGTH = AC_POWER_SF_REGISTER_ADDR - AC_POWER_REGISTER_ADDR + 1;
16

17
void setup() {
18
  Serial.begin(115200);
19

20
  // start the Ethernet connection:
21
  Serial.println("Initialize Ethernet with DHCP:");
22
  Ethernet.init(10);
23
  if (Ethernet.begin(mac) == 0) {
24
    Serial.println("Failed to configure Ethernet using DHCP");
25
      while (true) {
26
        delay(1); // do nothing, no point running without Ethernet hardware
27
      }
28
  } else {
29
    Serial.print("  DHCP assigned IP ");
30
    Serial.println(Ethernet.localIP());
31
  }
32

33
}
34

35
void loop() {
36
  int err = modbusConnection();
37
  if (err != 0) {
38
    Serial.println(err);
39
    Serial.println("ich kann mich nicht verbunden");
40
  } else {
41
    Serial.println("ich bin verbunden");
42

43
    int l = modbus.requestFrom(3, INPUT_REGISTERS, 30867, 2);
44
    if (l != 2) {
45
      Serial.println(modbus.lastError());
46
    } else {
47
      short daten[2];
48
      daten[0] = modbus.read(); 
49
      daten[1] = modbus.read();
50
      /*
51
      Serial.println("ersten 16bit");
52
        Serial.println(daten[0]);
53
      Serial.println("zweiten 16bit");
54
          */
55
      Serial.println(daten[1]);
56
    }
57

58
  }
59
  delay(1000);
60
}
61

62
int modbusConnection() {
63
  if (!modbus.connected()) {
64
    modbus.stop();
65
    if (!modbus.begin(serverAddress, 502))
66
      return -1;
67
  }
68
  return 0;
69
}

warum zum Geier ist das mit dem ESP32 scheinbar so kompliziert oder lieg ich da falsch ? Gehts auch einfacher ? Leider will die Mega lib nicht auf dem ESP laufen.

Dankeschön

#7783910
Lesenswert?

Manfred P. schrieb:

Das ändert nichts daran, dass viele Arduino-Libs auf den ESP-µCs nicht funktionieren, weil sie meistens nur für die AVR-Welt geschrieben wurden.

Dafür gibt es Berge an Libraries, und wenn die eine nicht tut (oder nicht gefällt, weil allzu gefrickelt) schaut man halt die nächste an.

Für den TO evtl interessant: https://github.com/bertmelis/esp32ModbusTCP/blob/master/examples/SMA/SMA.ino

Da müsste er erstmal nur die Register-Config anpassen, und wenn man das WLan-Handling ausblendet auch nicht wirklich umfangreicher als sein AVR-Beispiel...

#7803587
Lesenswert?

Εrnst B. schrieb:

Manfred P. schrieb:

Das ändert nichts daran, dass viele Arduino-Libs auf den ESP-µCs nicht funktionieren, weil sie meistens nur für die AVR-Welt geschrieben wurden.

Dafür gibt es Berge an Libraries, und wenn die eine nicht tut (oder nicht gefällt, weil allzu gefrickelt) schaut man halt die nächste an.

Für den TO evtl interessant: https://github.com/bertmelis/esp32ModbusTCP/blob/master/examples/SMA/SMA.ino

Da müsste er erstmal nur die Register-Config anpassen, und wenn man das WLan-Handling ausblendet auch nicht wirklich umfangreicher als sein AVR-Beispiel...

Hallo Ernst, alles Gute und Gesundheit für 2025 sowie alle anderen hier. Besten Dank für das perfekte Beispiel, was ich nach 3 inhaltlichen Fehlern (Arduino Command change) zum Laufen bringen konnte. Das hat mir wirklich sehr geholfen den Anfang zu finden.

Danke

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren