Forum: Mikrocontroller und Digitale Elektronik Strommessgerät mit Raspberry Pi auslesen


von Mari R. (maru2648)


Lesenswert?

Hallo zusammen,

ich bin gerade dabei eine alte Produktionsanlage zu digitalisieren. 
Dabei möchte ich den Energie-/Stromverbrauch der Maschine zusammen mit 
den Steuerungsdaten in der Cloud veröffentlichen.
Jetzt habe ich ein Problem bzgl. dem Energiemessgerät. Ich würde gerne 
die aufgenommenen Daten (sei es per Bluetooth, Wifi, I2C usw. ist egal) 
an einen Raspberry Pi senden zur Weiterverarbeitung der Daten.
Leider finde ich kein geeignetes Energie-/Strommessgeräte, welches mir 
die Rohdaten an mein Raspberry sendet.
Hat hier jmd. eine Idee?

Gruß
Marius

von Falk B. (falk)


Lesenswert?

Es gibt Multimeter mit RS232 oder USB-Schnittstelle, damit kann man 
zumindest einen Strom messen, vor allem an Netzspannung. Energie bzw. 
Leistung messen die nicht, da braucht man schon spezielle Meßgeräte.

von Frank K. (fchk)


Lesenswert?

Was brauchst Du? einphasig oder dreiphasig? Wieviel A? 16? 32A? 63A?

Für Drehstrom gibts das hier:
https://stromzähler.eu/stromzaehler/drehstromzaehler/fuer-hutschiene-ungeeicht/25/sdm630modbus-v2-3phasen-4te-multifunktions-lcd-drehstromzaehler

Für Wechselstrom bis 10A gibts das hier:
https://stromzähler.eu/stromzaehler/wechselstromzaehler/fuer-hutschiene-ungeeicht/24/sdm230modbus-1p-2te-lcd-wechselstromzaehler?c=105

Die Teile haben Modbus über RS485, d.h. Du brauchst einen passenden 
Transceiver an Deinem Pi.

Ansteuerung über libmodbus.

fchk

von Dieter D. (Firma: Hobbytheoretiker) (dieter_1234)


Lesenswert?

So etwas würde ich Dir empfehlen:
https://www.berrybase.de/neu/shelly-3em-3-phasen-wlan-energiemessger-228-t
(https://geizhals.de/shelly-3em-3-phase-wifi-energy-meter-a2368858.html)

Das würde am Besten meiner Ansicht nach zum Raspberry passen.

von Mari R. (maru2648)


Lesenswert?

Guten Morgen,

erstmal viele Dank für eure schnellen Antworten.
Ich konkretisier das Ganze mal ein wenig. Es handelt sich dabei um einen 
Versuchsaufbau mit einer SPS.
In diesen Versuchsaufbau wird ein Bauteil integriert welches an die 
Power Supply Box (24DC/10A) des Aufbaus angeschlossen wird, also ist 
einphasig ausreichend.
Da während der Versuchsdurchführung nur das eine Bauteil betrieben wird, 
wäre auch ein Messgerät für die Steckdose ebenfalls noch in Ordnung.
Wichtig ist nur, dass ich die Daten direkt an den Raspberry senden und 
diese dort weiterverarbeiten kann.

Oder empfehlt ihr hier ein Aufbau mit einem Arduino, damit kenn ich mich 
leider gar nicht aus.

von kenny (Gast)


Lesenswert?

Bevor wir dir hier Lösungen zeigen, solltest Du die Anforderungen 
genauer spezifizieren.
- Welche Parameter sollen gemessen werden?
- Welche Genauigkeit wird benötigt?
- ....

von Mari R. (maru2648)


Lesenswert?

Prinzipiell möchte ich auf den Energieverbauch abzielen. Da ich jedoch 
die Betriebsspannung des Bauteil/der Supply Box kenne, wäre der 
Stromverbrauch ebenfalls ausreichend. Daten sollen sowieso 
weiterverarbeitet werden.
Da es sich nur um einen Versuchsaufbau handelt, spielt die Genauigkeit 
des Messgerätes keine allzu große Rolle.
Entschuldige meine unpräzisen Angaben, bin noch relativ neu auf dem 
Gebiet.
Gerne melden falls noch mehr Informationen benötigt werden.

von Frank K. (fchk)


Lesenswert?

Ich überwache mit einem SDM230Modbus Stromzähler den Stromverbrauch an 
einer Außensteckdose, wo im Sommer eine Grundwasserpumpe betrieben wird.

https://www.amazon.de/Tech-SDM230Modbus-Wechselstromz%C3%A4hler-Stromz%C3%A4hler-Schnittstelle/dp/B01N8XMS2J

Bei mir hängt das Teil an einem BeagleBone, aber ein Pi würde genauso 
gut funktionieren. Ich habe einen USB-RS485-Adapter verwendet, der die 
Datenrichtungsumschaltung selber macht.

https://www.amazon.de/USB-RS485-Adapter-mit-Gehäuse/dp/B00I9H5J02

Da sind schon die Terminierungs- und Failsafe-Widerstände mit drin, am 
SDM230 braucht es noch einen 100...120Ohm Terminierungswiderstand, falls 
das dreiadrige Kabel (A, B, GND) länger ist (bei mir ca 10m, 100m sind 
aber auch kein Problem).

Unter Linux musst Du diese beiden Bibliotheken installieren.
1
libmodbus-dev
2
  Entwicklungsdateien für die Modbus-Protokollbibliothek
3
4
libmodbus5
5
  Bibliothek für das Modbus-Protokoll

Dann brauchst Du die Bedienungsanleitung
https://stromzähler.eu/media/pdf/0e/ca/1d/SDM230-Modbus.pdf

In Deinem Programm brauchst Du diese Funktionen:
1
#include <mutex> 
2
#include <modbus.h>
3
4
modbus_t* g_mb;
5
std::mutex mtx;
6
7
modbus_t* mb_connect(void)
8
{
9
  modbus_t *mb;
10
  mb = modbus_new_rtu("/dev/modbus", 9600, 'N', 8,1);
11
  modbus_set_slave(mb,0);
12
  modbus_connect(mb);
13
  return mb;
14
}
15
16
void mb_disconnect(modbus_t* mb)
17
{
18
  modbus_close(mb);
19
  modbus_free(mb);
20
}
21
22
float mb_get_inputreg(modbus_t* mb, int16_t regnum)
23
{
24
  uint16_t reg_in[2];
25
  uint16_t reg_swap[2];
26
  
27
  std::unique_lock<std::mutex> lck (mtx,std::defer_lock);
28
  lck.lock();
29
  modbus_read_input_registers(mb, regnum, 2, reg_in);
30
  reg_swap[0]=reg_in[1];
31
  reg_swap[1]=reg_in[0];
32
  float rc=modbus_get_float(reg_swap);
33
  lck.unlock();
34
  return rc;
35
}

Der Code geht davon aus, dass der Stromzähler auf Adresse 0 und 9600 
Baud, 1 Stopbit, No Parity eingestellt ist. Du kannst mehrere 
Stromzähler gleichzeitig abfragen, musst dann aber bei jeden eine andere 
Adresse einstellen und im Programm bei modbus_set_slave() das passende 
Gerät auswählen. Und statt /dev/modbus musst Du halt das bei dir 
passende Device (/dev/ttyUSB0 oder so) eintragen.

In Deinem Programm musst Du als allererstes die Schnittstelle öffnen:
1
g_mb=mb_connect();

Die musst Du dann nach Gebrauch wieder schließen:
1
mb_disconnect(g_mb);

Werte fragst Du so ab:
1
float val=mb_get_inputreg(g_mb,idx);
wobei idx die Registernummer ist, die Du aus der Tabelle unter "1.2 
Input Registers" in der Anleitung rausbekommst. Für die momentane 
Wirkleistung "Active Power" ist das 0x000c, für die akkumulierte 
Wirkleistung (Zählerstand, "Total active energy") wäre das 0x0156. In 
der Tabelle siehst Du auch, was Du alles abfragen kannst: Strom, 
Spannung, Frequenz, Wirk- Blind- und Scheinleistung,...

So, damit hast Du eigentlich alles, was Du brauchst.

fchk

: Bearbeitet durch User
von Mari R. (maru2648)


Lesenswert?

Hallo fchk,

erst einmal vielen vielen Dank für deine ausführliche Hilfe! Das hat 
mich dem Ganzen schon ein großes Stück näher gebracht.

Jetzt hab ich da noch eine Frage, da ich auch in der Programmierung 
relativ neu unterwegs bin. Ist eine durchgängige Datenabfrage möglich, 
sprich kann ich die Daten kontinuierlich (festgelegt Taktung oder bei 
jedem neuen Wert) damit abfragen?
Die Daten sollen zusammen mit den Steuerdaten der eingebauten SPS 
gegenüber gestellt werden. Sprich es soll ein zeitlicher Verlauf der 
beiden Datensätze erstellt werden, der anschließend in die Cloud geladen 
wird.

Beste Grüße und nochmals vielen Dank für eure Hilfe!!

von Frank K. (fchk)


Lesenswert?

Mari R. schrieb:

> Jetzt hab ich da noch eine Frage, da ich auch in der Programmierung
> relativ neu unterwegs bin. Ist eine durchgängige Datenabfrage möglich,
> sprich kann ich die Daten kontinuierlich (festgelegt Taktung oder bei
> jedem neuen Wert) damit abfragen?

Kontinuierlich im eigentlichen Sinne geht das eh bei digitalen Systemen 
nicht, und der Stromzähler aktualisiert seine internen Werte auch nur 
mit einer bestimmten Frequenz, maximal 50 mal pro Sekunde, 
wahrscheinlich sehr viel weniger.

Wenn Du einen Messwert haben willst, musst Du ihn Dir mit 
mb_get_inputreg() holen. Wenn Du dann den nächsten haben willst, musst 
Du ihn dir wieder holen. Von selber geht da nix, der Stromzähler macht 
genau das, was Du ihm sagst, und wann du es ihm sagst. Wenn Du alle 10s 
einen Wert haben willst, musst Du alle 10s eine Anfrage stellen. Das 
hast Du selber in der Hand.

Denke auch daran, das der RS485-Bus nur mit 9600 bps läuft, d.h. pro 
Sekunde gehen maximal 1000 Bytes über die Leitung, und ein Sende- oder 
Empfangspaket sind etwa 10 Bytes.

fchk

von Mari R. (maru2648)


Lesenswert?

Mit dem kontinuierlich hast du natürlich recht. Aber die Anzahl an 
Werten wäre vollkommen ausreichend.

Weißt Du zufällig ob B+G E-Tech SDM230Modbus auch mit Node-Red 
ausgelesen werden kann. Ich hab den Siemens Reihe Sentron pac gesehen, 
bei diesem ist das auf jeden Fall möglich und da ist es ja fast schon 
spielerisch die Daten in eine CSV-Datei zu schreiben.

Bzw. was müsste man an deinem Code noch ändern, damit die Daten 
fortlaufend in eine CSV-Datei geschrieben werden. Entschuldige die evtl. 
dumme Frage, aber ich tue mir noch sehr schwer mit dem 
Programmierverständnis.

von Pete K. (pete77)


Angehängte Dateien:

Lesenswert?

Du könntest auch ein Sonoff Power R2 nutzen zusammen mit Grafana auf dem 
Raspi.
Der Sonoff schickt die Messdaten per MQTT an den RPi.
Wenn das 24VDC Netzteil in einer Steckdose steckt, dass geht auch eine 
WLAN Steckdose mit ESP8266 Chip (z.B. Gosund SP1).
Auf die Geräte kannst Du Tasmota (->google) spielen und hast somit alles 
im Griff (ohne Cloud).

Sieht dann so aus wie im Anhang.

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Mari R. schrieb:
> Weißt Du zufällig ob B+G E-Tech SDM230Modbus auch mit Node-Red
> ausgelesen werden kann. Ich hab den Siemens Reihe Sentron pac gesehen,
> bei diesem ist das auf jeden Fall möglich und da ist es ja fast schon
> spielerisch die Daten in eine CSV-Datei zu schreiben.

Nein, nichts damit gemacht. Ich logge das letztendlich mit mrtg, aber 
das ist hier zu speziell.

> Bzw. was müsste man an deinem Code noch ändern, damit die Daten
> fortlaufend in eine CSV-Datei geschrieben werden. Entschuldige die evtl.
> dumme Frage, aber ich tue mir noch sehr schwer mit dem
> Programmierverständnis.
1
bool ende=false;
2
float val;
3
FILE* fp=fopen("log.csv","w");
4
time_t now;
5
int idx=12; //Momentane Wirkleistung
6
g_mb=mb_connect();
7
while(!ende)
8
{
9
  val=mb_get_inputreg(g_mb,idx);
10
  now=time(); // aktueller Unix Timestamp, Sekunden seit 1.1.1970
11
  fprintf(fp, "%ld,%f\r\n",now,val);
12
  sleep(1); // eine Sekunde warten
13
}
14
mb_disconnect(g_mb); 
15
fclose(fp);

So ungefähr, ohne das wirklich durchcompiliert zu haben.

Der Rest sind C- und Unix-Grundlagen. Für die Vermittlung von 
Grundlagenwissen ist dieses Forum nicht gedacht und auch nicht geeignet, 
das wirst Du Dir selber anderweitig aneignen müssen. Sorry, ist halt so.

Noch einfacher kann ich es Dir nicht mehr machen.

fchk

: Bearbeitet durch User
von Mari R. (maru2648)


Lesenswert?

Moin fchk,

kein Thema. Da hast du natürlich recht. Aber ich bedanke mich wirklich 
recht herzlich für deine Hilfe! Jetzt fühl ich mich auch gewappnet den 
Rest selbstständig hinzubekommen.

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.