Inhaltsverzeichnis

PQ Plus CMD 68-52 MID

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:

Hardware

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.

Anschluss direkt am Sub-D Stecker des DIGITUS DA-70157:

Anschluss an den Klemmen des mitgelieferten Adapters:

Alternativer RS485 Konverter

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

Einstellungen am Energiezähler

Diese Beschreibung gilt für folgende Einstellungen am Energiezähler:

Die Anzahl der Stopbits ist nicht einstellbar (immer 1).

Softwareinstallation

Basisinstallation auf Raspberry Pi

Eine einfache Möglichkeit wird hier beschrieben: Volkszaehler auf einem Raspberry Pi mittels fertigem Image installieren

libmodbus

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.

mbrtu

cd ~
git clone https://github.com/gitaeuber/mbrtu
cd mbrtu
make
sudo make install

Test der Kommunikation

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/ttyUSB0USB-RS485 Konverter
-b9600Baudrate 9600. Muss der Einstellung am Energiezähler entsprechen.
-pNKein Parity Bit. Am Energiezähler muss Parity: None eingestellt sein.
-s1Ein Stoppbit. Der CMD68-52 verwendet immer ein Stoppbit.
-a1Modbus Adresse 1. Der Energiezähler muss auf Adresse 1 eingestellt sein.
-f3Function code für das Lesen von Registern.
-thexFür das Auslesen von Registern, die hexadezimale Zahlen enthalten.
-tF32_dcbaFür das Auslesen von Registern, die Werte im Float Format enthalten.
-n1Ein 16 Bit Register (für hexadezimale Zahlen)
-n2Zwei 16 Bit Register (für Float Zahlen)
-r0x1060Messbereich (5A Beim CMD 68-52, tatsächlicher Messbereich hängt vom Stromwandler ab)
-r0x2008Spannung von Phase L1

Eine Liste der Modbus Register ist auf den letzten Seiten dieses Dokuments: Bedienungsanleitung KDK PRO380

Einbindung über einen vzlogger exec-Kanal

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.

exec-modbus
#!/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
Eintrag in vzlogger.conf

Dieser Kanal liefert die Gesamtleistung aller 3 Phasen in kW. Bei Netzeinspeisung ist die Leistung negativ.

vzlogger.conf
// 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"
        }
     ]
    },
]

Anlegen des Kanals im Frontend

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:

EigenschaftWert
TypEl. Energie (Leistungswerte)
Auflösung0.001