Hallo,
um externe Messwerte in die UVR16xx über das C.M.I reinzubekommen, führt kein Weg an Modbus/TCP vorbei.
in diesem Beitrag wird beschrieben wie man den diagslave (Modbus/TCP-Slave Server) in einer PROXMOX-VM (Linux Container LXC) als Dienst zum laufen bringen kann.
Proxmox VE ist eine auf Debian-Linux basierende Open-Source-Virtualisierungsplattform zum Betrieb von virtuellen Maschinen mit einem Webinterface zur Einrichtung und Steuerung von x86-Virtualisierungen.
Zur Installation vom Proxmox Virtual Environment gibt es im Internet viele Videos, damit klappt die Installation reibungslos.
Ich persönlich finde es ist eine einfach zu bedienende Web-Oberfläche zur Verwaltung von virtuellen Maschinen. Besonders gut gefällt mir, dass man sowohl die Web-Oberfläche nutzen kann, oder das CLI (also Kommandozeile).
Als Hardware verwende ich für das Proxmox VE einen Intel-NUC(Next-Unit-of-Computing) Mini-PC mit einer leistungsfähigen CPU mit 12 CPU-Kernen (i7-10710U), viel Arbeitsspeicher (64GB)
und einer schnellen SSD-Platte (HP SSD EX900 M.2 1TB) damit das ganze auch super schnell läuft und die nächsten Jahre viel mehr Spass macht als mit einem Windows-Rechner.
Das Proxmox VE verwende ich zum lernen und forschen und kann damit einfach sehr viele Rechner und einzelne Dienste separat virtualisieren und doch alles übers Netzwerk miteinander betreiben wie wenn alles theoretisch ein Rechner wäre.
Das organisieren oder aufteilen von einzelnen Diensten (wie ioBroker, NodeRed, Fhem, HomeAssistant, Influx-DB usw.) und mehrere verschiedene Rechner in einzelne VM's erspart beim wilden austesten und rumspielen manchen kompletten Neuaufbau eines gesamten Systems, sodaß man beim arbeiten ohne Rücksicht alles ausprobieren kann.
Wenn mal was nicht mehr läuft, dann braucht man nur die entsprechende VM recovern (zurückspielen) oder neu aufbauen.
PROXMOX Web-Oberfläche --> create CT LXC Container
Also zuerst mit der Web-Oberfläche einen neuen LXC Container mit dem Namen ModbusSlave erstellen und starten und in die console reingehen und nachfolgende Befehle eingeben.
1.schauen wie das aktuelle Verzeichnis heisst und die net-tools und den mc installieren
pwd
apt install net-tools
apt install mc
2. tarball downloaden:
wget https://www.modbusdriver.com/downloads/diagslave.tgz
3. tarball auspacken:
tar xzf diagslave.tgz
4. ins /systemd/system/ Verzeichnis wechseln und mit dem nano-Editor die Datei diagslave.service anlegen
cd /etc/systemd/system/
nano diagslave.service
5. dann nachfolgenden Datei-Inhalt mit copy und paste ins Editor-Fenster reinkopieren
Unit]
Description=diagslave Service
After=multi-user.target
[Service]
Type=idle
User=root
ExecStart=/root/diagslave/x86_64-linux-gnu/diagslave -m tcp -p 502
Restart=always
[Install]
WantedBy=multi-user.target
6. und danach speichern mit (ctrl-o) und den nano-Editor beenden mit (ctrl-x) und die zwei nachfolgenden Befehle im Terminal-Fenster ausführen:
systemctl daemon-reload
systemctl enable diagslave.service
Das wars dann schon.
Der Modbus-disgslave LXC Container muss nun neu gestartet (reboot) werden!
Danach läuft ein PROXMOX-diagslave ModBus/TCP SLAVE-Server mit eigener Ip-Adresse
und wartet auf connects vom CMI und connects von iobroker oder Node-RED usw..
Nach dem Neustart in der console vom LXC Container prüfen ob der diagslave läuft mit der Prozessliste:
ps -e | grep -i "diagslave"
root@modbus-diagslave:~# ps -e | grep -i "diagslave"
99 ? 00:00:00 diagslave
root@modbus-diagslave:~#
oder mit folgendem Befehl kann man sich den status vom service diagslave anzeigen lassen:
service diagslave status
root@modbus-diagslave:~# service diagslave status
* diagslave.service
Loaded: loaded (/etc/systemd/system/diagslave.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2021-12-03 20:59:05 UTC; 15min ago
Main PID: 99 (diagslave)
Tasks: 1 (limit: 4915)
Memory: 50.3M
CGroup: /system.slice/diagslave.service
`-99 /diagslave/x86_64-linux-gnu/diagslave -m tcp -p 502
console von der LXC Container(VM) --> mit den abgefahrenen Befehlen
Die Informationen vom diagslave die er beim starten sonst im Terminalfenster ausgeben würde
findet man im syslog. Das befindet sich im nachfolgenden Verzeichnis:
/var/log/syslog
...
Dec 09 18:40:07 ModbusSlave systemd[1]: dmesg.service: Succeeded.
Dec 09 18:40:09 ModbusSlave diagslave[100]: diagslave 3.4 - FieldTalk(tm) Modbus(R) Diagnostic Slave Simulator
Dec 09 18:40:09 ModbusSlave diagslave[100]: Copyright (c) 2002-2021 proconX Pty Ltd
Dec 09 18:40:09 ModbusSlave diagslave[100]: Visit https://www.modbusdriver.com for Modbus libraries and tools.
Dec 09 18:40:09 ModbusSlave diagslave[100]: Protocol configuration: MODBUS/TCP
Dec 09 18:40:09 ModbusSlave diagslave[100]: Slave configuration: address = -1, master activity t/o = 3.00s
Dec 09 18:40:09 ModbusSlave diagslave[100]: IP configuration: port = 502, connection t/o = 60.00s
Dec 09 18:40:09 ModbusSlave diagslave[100]: Server started up successfully.
Dec 09 18:40:09 ModbusSlave diagslave[100]: Listening to network (Ctrl-C to stop)
Dec 09 18:40:09 ModbusSlave diagslave[100]: validateMasterIpAddr: accepting connection from 192.168.15.208 HomeAssistent
Dec 09 18:40:09 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 7, 1 references
Dec 09 18:40:09 ModbusSlave diagslave[100]: .
Dec 09 18:40:09 ModbusSlave diagslave[100]: validateMasterIpAddr: accepting connection from 192.168.15.130 CMI
Dec 09 18:40:09 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 7, 1 references
Dec 09 18:40:09 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 8, 1 references
Dec 09 18:40:09 ModbusSlave diagslave[100]: .#015Slave 1: readCoils from 11, 1 references
Dec 09 18:40:11 ModbusSlave diagslave[100]: .
Dec 09 18:40:11 ModbusSlave diagslave[100]: validateMasterIpAddr: accepting connection from 192.168.15.205 NodeRED
Dec 09 18:40:16 ModbusSlave diagslave[100]: ..#015Slave 1: readHoldingRegisters from 7, 1 references
Dec 09 18:40:19 ModbusSlave diagslave[100]: .#015Slave 1: readCoils from 11, 1 references
Dec 09 18:40:19 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 7, 1 references
Dec 09 18:41:55 ModbusSlave diagslave[100]: ..
Dec 09 18:41:55 ModbusSlave diagslave[100]: validateMasterIpAddr: accepting connection from 192.168.15.221 python-script
Dec 09 18:41:55 ModbusSlave diagslave[100]: .#015Slave 1: readCoils from 5, 1 references
Dec 09 18:41:55 ModbusSlave diagslave[100]: .#015Slave 1: writeCoils from 5, 1 references
Dec 09 18:41:55 ModbusSlave diagslave[100]: .#015Slave 1: readCoils from 5, 1 references
Dec 09 18:41:55 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 2, 9 references
Dec 09 18:41:55 ModbusSlave diagslave[100]: .#015Slave 1: writeHoldingRegisters from 7, 2 references
Dec 09 18:41:56 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 7, 1 references
Dec 09 18:41:56 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 8, 1 references
Dec 09 18:42:05 ModbusSlave diagslave[100]: ..
Dec 09 18:42:05 ModbusSlave diagslave[100]: validateMasterIpAddr: accepting connection from 192.168.15.204 ioBroker
Dec 09 18:42:05 ModbusSlave diagslave[100]: .#015Slave 1: readInputDiscretes from 1, 16 references
Dec 09 18:42:05 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 7, 2 references
Dec 09 18:42:06 ModbusSlave diagslave[100]: .#015Slave 1: writeHoldingRegisters from 7, 1 references
Dec 09 18:42:06 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 7, 1 references
Dec 09 18:42:06 ModbusSlave diagslave[100]: .#015Slave 1: readHoldingRegisters from 8, 1 references
Dec 09 18:42:06 ModbusSlave diagslave[100]: .#015Slave 1: readCoils from 11, 1 references
Dec 09 18:42:32 ModbusSlave diagslave[100]: .
...
hier im syslog kann man nachschauen was der diagslave so treibt.
Im syslog stehen sehr viel mehr Informationen, deshalb erscheint es etwas unübersichtlich.
Mein Intel-NUC PROXMOX Mini-PC --> mit Modbus/TCP Verbindungen von verschiedenen SmartHome über diagslave zum CMI und zur UVR16xx Umgebung
Wer es ganz genau wissen will, welche ModBus/TCP - Kommunikation zwischen den einzelnen Komponenten wie CMI, diagslave, iobroker, python-client stattfindet, kann auch mit dem tool tcpdump die einzelnen Modbus-Befehle im Hex-Format sichtbar machen.
Ich lasse dazu in der console vom LXC Container(194) ModbuSlave einen speziell für TCP-Pakete parametrisierten tcpdump
(tcpdump -l -i net2 -vvX proto 6 | cat) laufen,
der auf dem Netzwerkgerät net2 lauscht und alle TCP-Pakete mit den Modbus-Befehlen (protokoll 6) mitliest
und somit die TCP-Pakete von dem ganzen ModBus/TCP-Verkehr auf der diagslave (VM) anzeigen kann.
Auffallend ist, dass bei den TCP-Paketen zwischen CMI und diagslave die ersten beiden Bytes vom Modbus-Header (00 00) sind. Bei allen anderen TCP-Paketen ist in den ersten beiden Bytes eine ID enthalten.
Die weiteren Infos zu den tcpdump-TCP-Paketen befinden sich im Dateianhang.
Das Modbus-Thema beim CMI ist etwas komplex und nicht einfach und übersichtlich darzustellen und zu beschreiben.
Ich habe mich mit dem Thema beschäftigt, weil es immer wieder Probleme mit Modbus/TCP-Verbindung
im direkten Kontakt zum CMI (Control and Monitoring Interface) gibt.
Mit dem dazwischengeschalteten diagslave funktionieren die Modbus/TCP-Verbindungen übers Netzwerk in die Aussenwelt sehr gut.
Gruß
Jürgen