Forum: Digitale Signalverarbeitung / DSP / Machine Learning EPS32 Leistung SMA Tripower Modbus TCP auslesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Egon (egon12345)


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
}

von Frank K. (fchk)


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

von Egon (egon12345)


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

von Εrnst B. (ernst)


Lesenswert?

Egon schrieb:
> Leider will die Mega lib nicht
> auf dem ESP laufen.

Ultra-geheimer Geheimtipp: Man kann ESP32 auch mit Arduino bespaßen, man 
muss das nicht direkt auf der IDF-Ebene tun, wenn man nicht will.

von Manfred P. (pruckelfred)


Lesenswert?

Εrnst B. schrieb:
> Egon schrieb:
>> Leider will die Mega lib nicht
>> auf dem ESP laufen.
> Ultra-geheimer Geheimtipp: Man kann ESP32 auch mit Arduino bespaßen

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.

von Εrnst B. (ernst)


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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.