Der PQ Plus CMD 68-52 MID ist ein 3-Phasen Energiezähler mit Modbus-Schnittstelle. Hier soll die Kommunikation mit einem Raspberry Pi beschrieben werden. Wahrscheinlich gilt diese Beschreibung auch für diese sehr ähnlichen Energiezähler:
Getestet wurde die Modbus-Kommunikation mit dem USB-RS485 Konverter DIGITUS DA-70157 und einem Raspberry Pi 2B. Am RS485 Konverter wurden Pull-up und Pull-down Widerstände mit je 820Ω angeschlossen. Die für den Pull-up Widerstand benötigten 5V stellt der RS485 Konverter selbst zur Verfügung. Zusätzlich sind am RS485 Konverter und am Energiezähler je ein 120Ω Abschlusswiderstand angeschlossen. GND und +5V können nicht mit dem PQ Plus CMD 68-52 verbunden werden.
An Stelle eines USB-RS485 Konverters kann auch eine Konverter verwendet werden, der direkt auf den Raspberry Pi aufgesteckt wird: RS485 Breakout Kit
Diese Leiterplatte enthält einen Pull-up, einen Pull-down und einen Abschlusswiderstand. Deshalb muss nur der 120Ω Abschlusswiderstand am Energiezähler angebracht werden. Achtung: Die Anschlussbelegung der Sub-D Buchse unterscheidet sich vom USB-RS485 Konverter. Beschriftung auf dem Board beachten!
Bei Verwendung dieses Konverters ändert sich die Schnittstelle von /dev/ttyUSB0 auf /dev/ttyAMA0
Diese Beschreibung gilt für folgende Einstellungen am Energiezähler:
Die Anzahl der Stopbits ist nicht einstellbar (immer 1).
Eine einfache Möglichkeit wird hier beschrieben: Volkszaehler auf einem Raspberry Pi mittels fertigem Image installieren
Es wird mindestens Version 3.1.3 von libmodbus benötigt. Wenn diese oder eine neuere Version bereits in der Distribution enthalten ist, können libmodbus und libmodbus-dev einfach über die Paketverwaltung installiert werden:
sudo apt install libmodbus-dev
Sonst muss die auf Eastron SDM 630 beschriebene manuelle Installation durchgeführt werden.
cd ~ git clone https://github.com/gitaeuber/mbrtu cd mbrtu make sudo make install
Beispiel für das Auslesen eines Wertes im Hex Format:
mbrtu -d/dev/ttyUSB0 -b9600 -pN -s1 -a1 -f3 -thex -n1 -r0x1060
Liefert dieses Ergebnis:
ADDR=1 REG=4192 DATA=0x5
Beispiel für das Auslesen eines Wertes im Float Format:
mbrtu -d/dev/ttyUSB0 -b9600 -pN -s1 -a1 -f3 -tF32_dcba -n2 -r0x2008
Liefert die Netzspannung von L1:
ADDR=1 REG=8200 DATA=231.20
Parameter | Beschreibung |
---|---|
-d/dev/ttyUSB0 | USB-RS485 Konverter |
-b9600 | Baudrate 9600. Muss der Einstellung am Energiezähler entsprechen. |
-pN | Kein Parity Bit. Am Energiezähler muss Parity: None eingestellt sein. |
-s1 | Ein Stoppbit. Der CMD68-52 verwendet immer ein Stoppbit. |
-a1 | Modbus Adresse 1. Der Energiezähler muss auf Adresse 1 eingestellt sein. |
-f3 | Function code für das Lesen von Registern. |
-thex | Für das Auslesen von Registern, die hexadezimale Zahlen enthalten. |
-tF32_dcba | Für das Auslesen von Registern, die Werte im Float Format enthalten. |
-n1 | Ein 16 Bit Register (für hexadezimale Zahlen) |
-n2 | Zwei 16 Bit Register (für Float Zahlen) |
-r0x1060 | Messbereich (5A Beim CMD 68-52, tatsächlicher Messbereich hängt vom Stromwandler ab) |
-r0x2008 | Spannung von Phase L1 |
Eine Liste der Modbus Register ist auf den letzten Seiten dieses Dokuments: Bedienungsanleitung KDK PRO380
Das folgende Script exec-modbus
kann über einen vzlogger exec-Kanal angebunden werden. Achtung: Mit diesem Script können nur Werte im Float-Format ausgelesen werden.
#!/bin/bash set -e set -u usage() { cat <<EOF $0 [options] register ... -t|--tty -b|--baudrate -p|--parity -s|--stopbits -a|--addr EOF } TEMP="$(getopt -n installremote \ -l tty:,baudrate:,parity:,stopbits:,addr: -- \ +t:b:p:s:a: "$@")" eval set -- "${TEMP}" MBRTU="mbrtu" TTY="" BAUDRATE="" PARITY="" STOPBITS="" ADDR="" while test "$1" != "--"; do case $1 in -t|--tty) shift TTY="$1" ;; -b|--baudrate) shift BAUDRATE="$1" ;; -p|--parity) shift PARITY="$1" ;; -s|--stopbits) shift STOPBITS="$1" ;; -a|--addr) shift ADDR="$1" ;; esac shift done shift checkparameter() { PARMNAME="${1:-}" CONTENT="${2:-}" if [ -z "${CONTENT}" ]; then printf "%s must not be empty\\n" "${PARMNAME}" exit 1 fi } checkparameter tty "${TTY}" checkparameter baudrate "${BAUDRATE}" checkparameter parity "${PARITY}" checkparameter stopbits "${STOPBITS}" checkparameter addr "${ADDR}" for reg in "$@"; do NOW="$(date +%s)" METER="$($MBRTU -d"${TTY}" -b"${BAUDRATE}" -p"${PARITY}" -s"${STOPBITS}" -Q -P -a"${ADDR}" -f3 -tF32_dcba -n2 -r"${reg}" | cut -d\ -f3)" if [ -z "${METER}" ]; then printf >&2 "no data received on modbus\\n" else printf "%d: %s = %f\\n" "${NOW}" "${reg}" "${METER:-0}" fi done # end of file
Dieser Kanal liefert die Gesamtleistung aller 3 Phasen in kW. Bei Netzeinspeisung ist die Leistung negativ.
// Meter configuration "meters": [ { "enabled": true, "allowskip": true, "protocol": "exec", "command": "/home/pi/exec-modbus --tty /dev/ttyUSB0 --baudrate 9600 --parity N --stopbits 1 --addr 0x1 0x2080", "format": "$t: $i = $v", "interval": 30, "channels": [ { "api": "volkszaehler", "uuid": "72c65340-4a72-11ea-acb1-d536b07bbb9d", "identifier": "0x2080", "middleware": "http://localhost/middleware.php" } ] }, ]
Der hier beschriebene vzlogger exec-Kanal liefert die aktuelle Leistung in kW. Im Frontend muss unter Kanal hinzufügen/Kanal erstellen also folgendes ausgewählt bzw. eingetragen werden:
Eigenschaft | Wert |
---|---|
Typ | El. Energie (Leistungswerte) |
Auflösung | 0.001 |