Raspberry als ModBus/TCP SLAVE-Server: C.M.I über ModBus/TCP mit Raspi verbinden und analoge/digitale Ein-und Ausgänge von UVR16xx über ModBus lesen und schreiben

Es gibt 117 Antworten in diesem Thema, welches 57.432 mal aufgerufen wurde. Der letzte Beitrag () ist von GOETSCHHOFER.

  • Hallo Karl,


    also der Fehler im Log vom iobroker tritt dann auf, wenn der diagslave nicht läuft und der iobroker versucht einen connect zum diagslave aufzubauen.


    Ich habe bei mir den Fehler nachstellen können, indem ich den diagslave mit Ctrl-C gestoppt habe und im iobroker die modbus-Instanz

    nochmal durchgestartet habe, dann standen die gleichen Fehler bei mir auch im Log vom iobroker.


    ...

    modbus.0 2021-11-20 12:41:39.259 error (2168) Socket Error

    modbus.0 2021-11-20 12:40:38.255 error (2168) Client in error state.

    modbus.0 2021-11-20 12:40:38.254 error (2168) Socket Error

    modbus.0 2021-11-20 12:39:37.246 error (2168) Client in error state.

    modbus.0 2021-11-20 12:39:37.244 error (2168) Socket Error

    host.raspberrypi 2021-11-20 12:39:35.102 info instance system.adapter.modbus.0 started with pid 2168

    ...


    Kontrollieren ob der diagslave läuft kannst im linux am einfachsten mit dem ps -e Befehl in der console.

    Wenn der diagslave läuft, dann sollte er in der liste der Prozesse mit eine PID (Prozess-ID) erscheinen.

    Das Beispiel von einer solchen Abfrage sieht so aus:


    pi@raspberrypi:~ $ ps -e | grep -i "diagslave"

    2325 pts/1 00:00:00 diagslave

    pi@raspberrypi:~ $


    Gruß

    Jürgen

    Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44, BL-NET und CMI ;
    2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; zentrale Wasserenthärtung;

    PV 3,2 kWp EEG; PV-Insel 6 kWp mit Victron MultiPlus-II 48/5000/70-50 und 8 x PylonTech LiFePo4 Modul 48V 2,4 kWh US2000 mit BMS; Victron Cerbo-GX;

    Herkules SE 5000 DF DIESEL Elektrostart Stromerzeuger Generator 2x220V-1x380V, Dauerleistung 4.200 Watt, 11 Stunden Dauerbetrieb, Tankinhalt 13,3 l

  • Hallo Jürgen,


    wen ich deinen Befehl eingebe, bekomme ich keine Info.

    Dies bedeutet ja, dass er nicht läuft ?

    holzheizer-forum.de/attachment/28808/





    Die Datei diagslave ist ja vorhanden lt. Abfrage:

    holzheizer-forum.de/attachment/28809/



    Ich verstehe es nicht ganz, ich habe ja mit mit dem Befehl: sudo ./diagslave -m tcp -p 503 den diagslave gestartet ?

    "Server startet up successsfully".


    holzheizer-forum.de/attachment/28806/



    Nach Start des diagslave und Abfrage ist der Port 503, aber nicht offen ?


    Danke für die Hilfe.



    Sonnige Grüße



    Karl

  • Hallo Karl,


    "wen ich deinen Befehl eingebe, bekomme ich keine Info.

    Dies bedeutet ja, dass er nicht läuft ?


    ja, genau, dann läuft er nicht, oder nicht mehr.


    Das kann verschiedene Gründe haben.

    Da müsste ich einige Fragen stellen zum NUC und zum Linux auf deinem NUC,

    um das herauszufinden ohne spekulieren zu wollen.


    Vielleicht kannst kurz dein System beschreiben,

    was für ein Linux da drauf läuft (mit oder ohne Desktop, mit oder ohne Bildschirm, Tastatur, Maus)

    und wie du ausser mit putty noch darauf zugreifen kannst.

    Ich vermute es hat was mit dem Desktop zu tun.


    Gruß

    Jürgen

    Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44, BL-NET und CMI ;
    2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; zentrale Wasserenthärtung;

    PV 3,2 kWp EEG; PV-Insel 6 kWp mit Victron MultiPlus-II 48/5000/70-50 und 8 x PylonTech LiFePo4 Modul 48V 2,4 kWh US2000 mit BMS; Victron Cerbo-GX;

    Herkules SE 5000 DF DIESEL Elektrostart Stromerzeuger Generator 2x220V-1x380V, Dauerleistung 4.200 Watt, 11 Stunden Dauerbetrieb, Tankinhalt 13,3 l

  • Hallo Jürgen,


    dies habe ich auch schon vermutet, dass es mit meinem NUC zusammenhängt.


    Gerne beschreibe ich mein System.


    Mein System läuft über proxmox auf einem INTELNUC.

    Iobroker auf einer VM=Virtual machine u. Grafana u. InfluxDB auf einem LXC=Container.


    Kurz der Unterschied zwischen VM u. LXC ist, dass ein LXC-Container bezüglich Software nicht soviel Oberhead benötigt.


    Der Vorteil von VM`s u. LXC´s ist, wenn ein Bereich abrauscht, so braucht man nur diesen Bereich z. B. LXC-InfluxDB wieder restoren, so hat man dies mir im iobroker-forum erklärt.


    Ich weiß jetzt nicht auf die Schnelle, wie ich die von mir verwendete Debian Version abfragen kann.

    Letzte Woche habe ich in proxmox ein Upgrade gemacht, ich denke es ist so ca. Debian 10.11.


    Ich kann auch über die Konsole in Proxmox - iobroker einsteigen, nicht nur über putty.






    Falls ich dir noch weitere Infos zur Verfügung stellen kann, damit du dir ein Bild machen kannst, gerne.


    Danke


    LG




    Karl

  • Hallo Jürgen,


    könnte es vielleicht auch ein Problem mit der Linux-Firewall sein ?


    Debian: Port in Firewall freigeben - so geht's
    Um in Linux Debian einen Port in der Firewall freigeben zu können, sind nur wenige Klicks erforderlich. Wie das genau funktioniert, verraten wir Ihnen in…
    praxistipps.chip.de

    Port in Debian-Firewall freigeben – so klappt's

    • Öffnen Sie zunächst die Konsole als Administrator in Debian Linux.
    • Um Ports in der Firewall freigeben zu können, verwenden Sie den Befehl "iptables -A".
    • Ein Beispiel: Möchten Sie den UDP-Port 33333 in der Firewall freigeben, nutzen Sie den Befehl "iptables -A INPUT -p udp --dport 33333 -j ACCEPT".
    • Für einen TCP-Port tauschen Sie das "udp" gegen ein "tcp" aus und bestätigen Sie mit [Enter].
    • Sofern Sie einen anderen Port freigeben möchten, müssen Sie einfach die "33333" gegen einen anderen Port austauschen.


    Linux iptables – Hilfe-server.de

    m in Linux Debian / Ubuntu einen Port in der Firewall freigeben zu können, sind nur wenige Klicks nötig.


    LG




    Karl

  • Hallo Karl,


    ja, so wie du es beschreibst kannst nur mit putty-Fenster und mit der proxmox-console auf dein Linux zugreifen.

    Daraus schliesse ich dass keinen Desktop installiert hast oder nicht weisst wie auf den zugreifen kannst.


    Ich betreibe Linux auf allen Rechnern auch Raspi immer mit Desktop, weil ich viele Programme verwende die laufen nicht ohne Desktop.

    Ohne Desktop kannst dann nur auf Programme zugreifen die server-fähig sind, wie die Programme InfluxDB und Grafana.

    Die laufen im Hintergrund als Dienst und haben meist eine Web-Oberfläche oder ein Client-Programm mit dem man auf den Server zugreifen kann.

    Aber es gibt viele tausend Linux-Programme die laufen nicht ohne Linux-Desktop und ich verwende viele davon.


    Auf einem Desktop (wie Windows-Oberfläche) kannst beliebig viele Terminal-Fenster oder andere Fenster-Programme öffnen und direkt zugreifen mit Maus und Tastatur.

    Man kann den Desktop z.B. mit einem VNC-Client auch vom Server auf den PC holen, wenn der Server (mit installiertem Desktop) sich an einem entfernten Ort befindet.


    Ich habe z.B. auch einen Raspi (mit installiertem Desktop) ohne Bildschirm, ohne Tastatur und ohne Maus schon viele Jahre in der Scheune (20m weg vom Büro) direkt neben dem SMA-Wechselrichter laufen.

    Der Raspi braucht halt die Nähe zum Wechselrichter weil das ganze über eine Bluetooth-Verbindung vom Raspi zum Wechselrichter läuft.

    Aber ich kann über einen VNC-Client den Raspi-Desktop von der Scheune in mein Büro holen,

    wenn Bedarf besteht und ich auf dem Raspi an sbfspot oder der sqlite-DB oder am MQTT-Script was ändern müsste.


    Mit putty hast nur ein Terminal-Fenster geöffnet in dem ein Script oder ein Programm läuft,

    und das läuft nur solange wie auch die putty-Session läuft.

    Wenn putty beendest dann wird z.B. das diagslave Programm, das in dem Fenster gelaufen ist automatisch mitbeendet.


    Also Server-Betrieb ist deutlich schwerer und mit den bereits genannten und nachfolgenden Einschränkungen zu machen.

    Denn dann muss so ein python-script oder ein programm wie diagslave nicht im Fenster sondern muss als Service laufen und wenn es Ausgaben produziert, müssen diese unterdrückt oder umgeleitet werden z.B. in eine Datei geschrieben werden.

    Server-Betrieb ist eigentlich nicht für den normalen Endbenutzer vorgesehen. Weder im Windows noch im Linux.


    Im privaten Bereich, also ohne Not verzichte ich nicht auf einen Desktop, weder in Linux noch in Windows.

    Das macht man fast nur im komerziellen Betrieb und das hat viele andere Gründe.

    Meist monetäre (Lizenzgebühren) oder Sicherheitsgründe, Datenschutz, Bandbreite im Netz usw..


    Also finde mal raus was für ein Linux auf deinem NUC läuft und wie du auf den Linux-Desktop kommst.


    Und wenn ein Linux ohne Desktop laufen hast dann kannst ja einen neuen LXC=Container mit einem Linux mit Desktop installieren, das geht ja ratz faz mit proxmox.


    Gruß

    Jürgen

    Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44, BL-NET und CMI ;
    2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; zentrale Wasserenthärtung;

    PV 3,2 kWp EEG; PV-Insel 6 kWp mit Victron MultiPlus-II 48/5000/70-50 und 8 x PylonTech LiFePo4 Modul 48V 2,4 kWh US2000 mit BMS; Victron Cerbo-GX;

    Herkules SE 5000 DF DIESEL Elektrostart Stromerzeuger Generator 2x220V-1x380V, Dauerleistung 4.200 Watt, 11 Stunden Dauerbetrieb, Tankinhalt 13,3 l

  • Hallo Jürgen,


    vielen Dank für die detaillierten Infos.


    Daraus schliesse ich dass keinen Desktop installiert hast oder nicht weisst wie auf den zugreifen kannst

    Ja, ich denke hier liegst du richtig.


    Also finde mal raus was für ein Linux auf deinem NUC läuft und wie du auf den Linux-Desktop kommst.


    Und wenn ein Linux ohne Desktop laufen hast dann kannst ja einen neuen LXC=Container mit einem Linux mit Desktop installieren, das geht ja ratz faz mit proxmox.


    Werde ich mal machen !


    LG



    karl

  • Hallo Jürgen,


    habe mich zu meinem Problem im iobroker-Forum schlau gemacht und hier hat jemand gemeint, man könnte den diagslave entweder als Service starten oder in ein 'screen' im Terminal kapseln.


    Zum Thema Service starten habe ich folgendes gefunden:

    How to Start, Stop, and Restart Services in Linux (phoenixnap.com)

    So starten Sie einen Dienst

    Um einen Dienst in Linux manuell zu starten, geben Sie Folgendes in das Terminal ein:

    sudo systemctl start SERVICE_NAME


    Weitere Info aus dem iobroker-Forum:

    "Vermutlich musst man hier lt. Info aber noch eine service-Datei schreiben. Die wird dann beim Start gelesen und der dort reingelegte Befehl wird ausgeführt".


    systemd Service Unit Beispiel › Howto › Wiki › ubuntuusers.de


    Was hältst du von dieser Lösung ?


    Hier steige ich echt aus. :/


    Danke für deine Info.


    LG



    Karl


  • Hallo Karl,


    ja wie vorher schon beschrieben, wenn im Server-Betrieb ohne Desktop den diagslave betreiben willst, dann bleibt nur diagslave als "Service" als Alternative.

    Die 'screen' Variante ist eigentlich nur für Puristen gedacht die mit einer Linux-Kiste ohne Netz und nur mit seriellem Anschluss als Systemconsole arbeiten müssen.


    Ich habe auch die Version diagslave als "Service" auf dem Raspi getestet und der diagslave läuft dort auch als "service".

    Einen Langzeittest hab ich mit dem diagslave in dieser Variante noch nicht gemacht.


    Aber damit es bei dir weitergeht, kannst das bei dir zuerst auf deinem Raspi installieren wie folgt:


    Eine neue Datei mit dem Namen diagslave.service erstellen und folgende Zeilen reinkopieren.


    Unit]

    Description=diagslave Service

    After=multi-user.target


    [Service]

    Type=idle

    User=root

    ExecStart=/home/pi/diagslave/arm-linux-gnueabihf/diagslave -m tcp -p 503

    Restart=always


    [Install]

    WantedBy=multi-user.target



    Diese Datei mit dem Namen diagslave.service ins Verzeichnis /etc/systemd/system/ reinkopieren.

    dazu benötigst allerdings rootrechte.


    Am einfachsten mit dem mc, den kennst ja inzwischen.

    den mc vorher mit sudo mc starten, dann hat er rootrechte und kann die Datei diagslave.service ins Verszeichnis /etc/systemd/system/ kopieren.

    weisst ja wie das geht mit F5 kopieren vom linken ins rechte Fenster...


    Dann den mc wieder beenden und zwei Befehle im Terminal-Fenster ausführen:


    sudo systemctl daemon-reload

    sudo systemctl enable diagslave.service


    Das wars dann schon.

    Der Raspi muss nun neu gestartet werden!


    Nach dem Neustart kannst dann prüfen ob der diagslave läuft mit der Prozessliste,

    den Befehl kennst ja schon:


    pi@raspberrypi:~ $ ps -e | grep -i "diagslave"


    Da muss dann ein Eintrag erscheinen, sonst läuft der diagslave nicht.


    Die Informationen vom diagslave die er beim starten vorher im Terminalfenster ausgegeben hat

    findest jetzt im syslog das befindet sich im nachfolgenden Verzeichnis:


    /var/log/syslog


    ...

    Nov 22 21:10:48 raspberrypi systemd[1]: Started diagslave.service.

    Nov 22 21:10:56 raspberrypi diagslave[386]: diagslave 3.4 - FieldTalk(tm) Modbus(R) Diagnostic Slave Simulator

    Nov 22 21:10:56 raspberrypi diagslave[386]: Copyright (c) 2002-2021 proconX Pty Ltd

    Nov 22 21:10:56 raspberrypi diagslave[386]: Visit https://www.modbusdriver.com for Modbus libraries and tools.

    Nov 22 21:10:56 raspberrypi diagslave[386]: Protocol configuration: MODBUS/TCP

    Nov 22 21:10:56 raspberrypi diagslave[386]: Slave configuration: address = -1, master activity t/o = 3.00s

    Nov 22 21:10:56 raspberrypi diagslave[386]: IP configuration: port = 503, connection t/o = 60.00s

    Nov 22 21:10:56 raspberrypi diagslave[386]: Server started up successfully.

    Nov 22 21:10:56 raspberrypi diagslave[386]: Listening to network (Ctrl-C to stop)

    ...

    Nov 22 21:11:49 raspberrypi diagslave[386]: ..................

    Nov 22 21:11:49 raspberrypi diagslave[386]: validateMasterIpAddr: accepting connection from 192.168.15.130

    Nov 22 21:11:49 raspberrypi diagslave[386]: .#015Slave 1: readCoils from 4, 1 references

    ...


    hier kannst auch nachschauen was der diagslave so treibt.

    Das syslog ist leider sehr unübersichtlich da kannst nur mit Suchfunktion arbeiten wenn was sehen willst.


    Gruß

    Jürgen

    Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44, BL-NET und CMI ;
    2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; zentrale Wasserenthärtung;

    PV 3,2 kWp EEG; PV-Insel 6 kWp mit Victron MultiPlus-II 48/5000/70-50 und 8 x PylonTech LiFePo4 Modul 48V 2,4 kWh US2000 mit BMS; Victron Cerbo-GX;

    Herkules SE 5000 DF DIESEL Elektrostart Stromerzeuger Generator 2x220V-1x380V, Dauerleistung 4.200 Watt, 11 Stunden Dauerbetrieb, Tankinhalt 13,3 l

  • HILFE .... Newbee sucht Starthilfe für die Verbindung meiner UVR16x2 über CMI zum Raspi.


    und erst einmal ein herzliches Hallo und auch einen guten Start ins 2022!


    Im Moment habe ich eine UVR16x2 laufen, die die Solaranlage und die Heizung regelt. Leider reichen mir die Eingänge bei weitem nicht. Andererseits habe ich diverse Sensoren (z.B. DS18B20) an einem Raspi3 hängen, deren Werte ich in der UVR16x2 bräuchte.


    Bisher dachte ich, dass die UVR16x2 per CAN mit der CMI gekoppelt wird und CMI per Modbus dann mit dem Raspi (Python) redet ...
    Die CAN-Verbindung zum CMI steht - aber ich bekomme die Verbindung per pymodbus zum raspi nicht hin ... verstehe ständig nur Bahnhof.


    ALSO...

    wer kann mir bei den Grundlagen zu einer ersten Modbus-Verbindung etwas unter die Arme greifen bzw mit ersten, einfachen CodeSchnipseln auf die Sprünge helfen?


    oder sollte ich es wagen, eine direkte Verbindung per CAN einzurichten?


    Herzliche Grüße
    Stefan

  • Hallo Stefan,


    wenn UVR16x2 und CMI und Raspi3 mit diagslave und pymodbus am laufen hast, dann geht der Weg vom Raspi über Modbus/TCP zum CMI.

    Ein Temperaturwert vom Sensor (z.B. DS18B20) hast mit einem python-script eingelesen.


    Wenn soweit gekommen bist, dann fehlt nur noch ein weiteres python-script mit dem der Temperaturwert vom Sensor in ein Modbus-Register vom diagslave geschrieben wird.


    Von dort kann das CMI diesen Temperaturwert aus dem Modbus-Register vom diagslave auslesen und in einem Modbus-Eingang vom CMI ablegen.


    Dann gehts im CMI vom Modbus über den CAN-Bus zur UVR16x2 weiter.


    Ich kann dir ein Beispiel von einem python-script zum Schreiben von Temperaturwert vom Sensor in ein Modbus-Register vom diagslave im Dateianhang einstellen.


    Damit alles automatisch läuft musst dein Lese-script und mein Schreib-script zusammenbauen.


    Gruß

    Jürgen



    Ausgaben vom Schreib-script mit eingeschaltetem debug-modus:


    pi@raspi4red:~ $ python3 Modbus_write_single_register.py

    define modbus localhost:502

    is open --> to connect to localhost:502

    Tx

    [E6 7F 00 00 00 06 01] 06 00 19 03 09

    Rx

    [E6 7F 00 00 00 06 01] 06 00 19 03 09

    write ok

    while true localhost:502

    is open --> to connect to localhost:502

    Tx

    [85 FF 00 00 00 06 01] 06 00 19 03 09

    Rx

    [85 FF 00 00 00 06 01] 06 00 19 03 09

    write ok

    while true localhost:502

    is open --> to connect to localhost:502

    Tx

    [7D E9 00 00 00 06 01] 06 00 19 03 09

    Rx

    [7D E9 00 00 00 06 01] 06 00 19 03 09

    write ok



    Ausgaben der Aktivitäten vom diagslave:


    pi@raspi4red:~ $ sudo ./diagslave -m tcp

    diagslave 3.4 - FieldTalk(tm) Modbus(R) Diagnostic Slave Simulator

    Copyright (c) 2002-2021 proconX Pty Ltd

    Visit https://www.modbusdriver.com for Modbus libraries and tools.


    Protocol configuration: MODBUS/TCP

    Slave configuration: address = -1, master activity t/o = 3.00s

    IP configuration: port = 502, connection t/o = 60.00s


    Server started up successfully.

    Listening to network (Ctrl-C to stop)

    ...........................................................................................................

    validateMasterIpAddr: accepting connection from 127.0.0.1

    Slave 1: writeHoldingRegisters from 26, 1 references

    Slave 1: writeHoldingRegisters from 26, 1 references

    Slave 1: writeHoldingRegisters from 26, 1 references

    Dateien

    Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44, BL-NET und CMI ;
    2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; zentrale Wasserenthärtung;

    PV 3,2 kWp EEG; PV-Insel 6 kWp mit Victron MultiPlus-II 48/5000/70-50 und 8 x PylonTech LiFePo4 Modul 48V 2,4 kWh US2000 mit BMS; Victron Cerbo-GX;

    Herkules SE 5000 DF DIESEL Elektrostart Stromerzeuger Generator 2x220V-1x380V, Dauerleistung 4.200 Watt, 11 Stunden Dauerbetrieb, Tankinhalt 13,3 l

  • Hallo Jürgen,


    WOW - es sieht genau nach dem "Schnipsel" aus, bei dem ich hängen geblieben war - das ich nicht zustande gebracht hatte...

    zum Thema "zusammenbauen" .. da sehe ich kein Problem ... kann es aber im Moment nicht ausprobieren -
    wenn es endgültig klappt melde ich Vollzug :) ..... (Wäre eventuell etwas für ein Wiki bei TA oder so ... :saint: )


    Im Moment ist mein Modbus-Ausgang SO konfiguriert - stimmt das so... Bei "DateiTyp" und "Bytereihenfolge" habe ich noch Kenntnis-/Verständnissprobleme.


    Und wenn mehrere (viele) Messwerte (vorr. 10 x Temperatur) zur Übertragung anstehen ... besser per Einzelwertübertragung oder als Array?


    Zur Vollständigkeit hätte ich noch eine Bitte bzw. eine kleine Nachfrage:
    ist es schwierig, dein Skript auch noch mit einer Datenübertragung UVR16x2 => CMI => (ModbusTCP) => Raspi zu ergänzen?
    Dann wären beide Richtungen verfügbar und ich könnte (eventuell / zukünftig) auf diesem Weg vom Raspi auch noch Aktionen ausführen lassen ...
    Ich vermute, dass das per "read_input_Registers" erfolgt ... NUR wie ist auf CMI einzustellen bzw. zu beachten ?
    Das brauch ich im Moment noch nicht aber - wer weiß ... ;)


    Jedenfalls VIELEN, VIELEN Dank!


    herzliche Grüße
    Stefan


    PS. Nachfrage zum Script:
    - mit "localhost" ist schon die IP-Adresse des ModbusServer / CMI gemeint - oder?

  • hmmm .... zu früh gefreut ......


    von meinem Laptop mit bestehender VPN-Verbindung (Fritzbox-VPN)


    "diagslave -m tcp -a 0 -p 502" meldet:

    No permission to access serial or TCP port!

    Shutting down server.


    Mein aktueller Aufbau:

    a) entferntes LAN:

    - Fritzbox 7590, CMI, UVR16x2, Raspi 3 (mit div. DS18B20)
    - Verbindung über Fritz-VPN (funktioniert und hat im entfernen LAN eine eigen IP)
    b) lokales LAN:
    - Laptop mit Ubuntu18.04 mit Python 3.6 + pyModbusTCP, diagslave /
    VPN: zugriff auf CMI funktioniert


    Als TEST-Aufbau will ich erst einmal von meinem Laptop aus die Modbusverbindung aufbauen und erst nach erfolgtem Funktionsnachweis auf den Raspi3 übertragen.


    Tja - ist bei meinem Kenntnisstand vll doch etwas zu optimistisch gewesen ....

    Hoffe auf Nachhilfe...

  • Hallo Stefan,


    ja, das hört sich schonmal gut an. Bin gespannt wenn das ganze Zusammenspiel von Erfolg gekrönt wird.


    Anbei im Dateianhang ein Beispiel von einem python-script zum lesen und schreiben von Modbus-Register zum/vom diagslave.


    Mit localhost ist die ip-adresse vom Raspi gemeint. Auf dem raspi läuft der diagslave-server (Modbus-Slave), der hat die ip-adresse vom Raspi, also localhost.

    Das CMI (Modbus-Master) hat eine eigene, andere ip-adresse.


    Das senden der Temperaturwerte vom python-sript (Modbus-Client) auf dem Raspi zum diagslave-server (Modbus-Slave) auf dem Raspi kannst einzeln oder alle 10 Messwerte im array.

    "Ist gehopst wie gesprungen".

    Wie das CMI den Wert vom diagslave abholt/ausliest wird im Modbus-Eingang vom CMI definiert.


    In deinen beiden Bildern wird der Modbus-Ausgang zum Ausgeben von Werten über Modbus irgenwohin angezeigt.


    Wir wollen vom Modbus irgendwoher (vom diagslave) Daten (Temperaturwerte) einlesen in einen Modbus-Eingang vom CMI.

    Also umgekehrt. Datenflussrichtung beachten.


    Wenn da was unklar ist, dann solltes deinen gesamten Datenfluss aufzeigen (Tdw.-Datei von Tapps2 (UVR),

    dann brauchen wir nicht alles mit einzelnen Bildern aufzeigen) und dein python-script vom Raspi.


    diagslave braucht root-rechte um auf ports zugreifen zu dürfen. (sudo nicht vergessen)

    sudo ./diagslave -m tcp


    Gruß

    Jürgen




    Ausgaben vom Schreib-Lese-Script mit eingeschaltetem debug-modus:


    pi@raspi4red:~/daten/projekte/Modbus UVR1611 CMI $ python3 Modbus_write_read_single_register.py

    define modbus localhost:502

    is open --> to connect to localhost:502

    Tx

    [A0 7A 00 00 00 06 01] 06 00 19 03 09

    Rx

    [A0 7A 00 00 00 06 01] 06 00 19 03 09

    write ok

    Tx

    [CF 16 00 00 00 06 01] 03 00 19 00 0A

    Rx

    [CF 16 00 00 00 17 01] 03 14 03 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    reg ad #25 to 35: [777, 0, 0, 0, 0, 0, 0, 0, 0, 0]

    while true localhost:502

    is open --> to connect to localhost:502

    Tx

    [73 6F 00 00 00 06 01] 06 00 19 03 09

    Rx

    [73 6F 00 00 00 06 01] 06 00 19 03 09

    write ok

    Tx

    [EB EE 00 00 00 06 01] 03 00 19 00 0A

    Rx

    [EB EE 00 00 00 17 01] 03 14 03 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

    reg ad #25 to 35: [777, 0, 0, 0, 0, 0, 0, 0, 0, 0]



    Ausgaben der Aktivitäten vom diagslave:


    pi@raspi4red:~ $ sudo ./diagslave -m tcp

    diagslave 3.4 - FieldTalk(tm) Modbus(R) Diagnostic Slave Simulator

    Copyright (c) 2002-2021 proconX Pty Ltd

    Visit https://www.modbusdriver.com for Modbus libraries and tools.


    Protocol configuration: MODBUS/TCP

    Slave configuration: address = -1, master activity t/o = 3.00s

    IP configuration: port = 502, connection t/o = 60.00s


    Server started up successfully.

    Listening to network (Ctrl-C to stop)

    .......................................

    validateMasterIpAddr: accepting connection from 127.0.0.1

    Slave 1: writeHoldingRegisters from 26, 1 references

    Slave 1: readHoldingRegisters from 26, 10 references

    Slave 1: writeHoldingRegisters from 26, 1 references

    Slave 1: readHoldingRegisters from 26, 10 references

    Dateien

    Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44, BL-NET und CMI ;
    2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; zentrale Wasserenthärtung;

    PV 3,2 kWp EEG; PV-Insel 6 kWp mit Victron MultiPlus-II 48/5000/70-50 und 8 x PylonTech LiFePo4 Modul 48V 2,4 kWh US2000 mit BMS; Victron Cerbo-GX;

    Herkules SE 5000 DF DIESEL Elektrostart Stromerzeuger Generator 2x220V-1x380V, Dauerleistung 4.200 Watt, 11 Stunden Dauerbetrieb, Tankinhalt 13,3 l

  • Hallo Jürgen,
    mein aktueller Status - bzw. die getesteten Varianten:

    wenn dein pyModbusTCP-Code (:= "mod.py") läuft, dann entsprechen die Meldungen deinem vorherigen Beitrag


    Ablauf:

    zuerst habe ich "sudo diagslave -m TCP" in Terminal gestartet:


    A) "mod.py" mit SERVER_HOST:= "localhost":

    "mod.py" läuft, diagslave meldet Verbindung zu "127.0.0.1" und quittiert die Aktivität


    B) "mod.py" mit SERVER_HOST:= "PC.IP-LAN":

    "mod.py" läuft, diagslave meldet Verbindung zu "PC.IP-LAN" und quittiert die Aktivität von "mod.py"


    C) VPN gestartet:

    diagslave meldet Verbindung zu "CMI.IP" und meldet ab und zu eine Aktivität. (ich vermute dass das die CMI-Ausgaben sind)


    D) VPN offen + "mod.py" mit SERVER_HOST:= "localhost":

    "mod.py" läuft, diagslave meldet Verbindung zu "CMI.IP" und meldet die "mod.py"-Aktivität + ab und zu eine Aktivität. (?CMI)


    E) VPN offen + "mod.py" mit SERVER_HOST:= "PC.IP-VPN:

    "mod.py" läuft, diagslave meldet Verbindung zu "CMI.IP" und meldet die "mod.py"-Aktivität + ab und zu eine Aktivität. (?CMI)


    F) VPN offen + "mod.py" mit SERVER_HOST:= "CMI.IP"

    "mod.py" bricht mit Fehlermeldung ab:
    define modbus 192.168.188.29:502

    while true 192.168.188.29:502

    not c.is_open or reconnect 192.168.188.29:502" .... Abbruch mit Ctrl C


    diagslave meldet Verbindung zu "CMI.IP" und meldet ab und zu eine Aktivität. (?CMI)



    Es scheint so, als ob die Modbus-Verbindung von "mod.py" zum CMI nicht aufgebaut werden kann.


    Eine *.tdw-Datei gibt es derzeit noch nicht, da ich noch im reine Ausprobieren der UVR16x2-Funktionen bin.
    Im Moment habe ich diverse Eingänge im UVR definiert/belegt und in der WebOberfläche der UVR - quasi "vor Ort" - diverse Funktionen angelegt.

    Um die Modbus-Koppelung zu probieren habe ich "händisch" den UVR.Eingang "T.Außen" auf den UVR.CAN-Ausgang.1 gelegt und dann im CMI mit CMI-CAN-Eingang.1 gekoppelt und anschließend als CMI-Modbus-Ausgang.1 angelegt. - bis hierher funktioniert es denn es erscheinen hier die richtigen Werte.


    ... in der Hoffnung, dass ich nun (erst mal auf meinem Laptop über VPN und später lokal auf dem Raspi3) mit als ModbusSlave mit dem CMI koppeln und diesen Wert im Python.Modbus.Slave.Modul empfangen zu können.


    Das klappt aber leider noch nicht. Diagslave erkennt die CMI.IP (validateMasterIpAddr: accepting connection from 192.168.188.29)
    aber dein/mein "mod.py" kann sich nicht verbinden.

    hmmmm....

  • Hallo Stefan,


    da scheint ja schon einiges zu funktionieren, super.


    Die ip-Verbindung zwischen CMI und diagslave ist nicht permanent.

    Die wird nach einem timeout wieder abgebaut, ist also kein Fehler.

    Die Häufigkeit der Aktivitäten hängt von diversen Einstellungen ab.


    In den diagslave infos von den Aktivitäten steht immer eine ip-adresse davor.

    So kannst immer unterscheiden von welcher ip-Adresse (server) die nachfolgende Aktivität ausgeführt wurde.


    "Im Moment habe ich eine UVR16x2 laufen, die die Solaranlage und die Heizung regelt. Leider reichen mir die Eingänge bei weitem nicht.

    Andererseits habe ich diverse Sensoren (z.B. DS18B20) an einem Raspi3 hängen, deren Werte ich in der UVR16x2 bräuchte."


    Da muss ja eine *.twd-Datei vom aktuellen Stand in der UVR16x2 Steuerung existieren.

    Wenn keine *.twd-Datei hast, dann erstell eine neue mit Tapps2 und such dir aus den Beispielen was ähnliches aus

    und trägst die Verbindungen von Modbus bis zur UVR richtig ein,

    damit man den Datenfluss erkennen und richtig testen kann.


    Aber ohne *.tdw-Datei wird das nix.Darin kann ich sehen wie die Daten vom Can-Bus in die UVR16x2 Steuerung übernommen werden.. usw.


    Die *.tdw-Datei kann ich hier laden und auch mit dem Simulator genauer anschauen

    und eine geänderte Version mit Korrekturen erstellen, falls wichtige Änderungen notwendig wären..usw


    Weiterhin sind 3 ip-Adressen im Spiel.


    ip-Adresse vom CMI =??

    ip-Adresse vom raspi3 (=ip-adresse von diagslave auf dem raspi) =??

    ip-Adresse von deinem Laptop (=ip-adresse von 2. diagslave auf dem Laptop) =??


    wenn ich das richtig verstanden habe.


    localhost ist mit zwei Rechnern natürlich etwas verwirrend. Das kann localhost vom Raspi oder localhost vom Laptop sein.

    Da sind Missverständnisse vorprogammiert.

    Dann hast ja 2 diagslaves am laufen. Einmal auf dem Raspi und einmal auf dem Laptop.


    Schick mal die zwei Dateien (*.tdw von tapps2 und *.py vom Raspi), dann machen wir weiter,

    denn dein Remote-Testaufbau ist ganz schön verwirrend für mich, sorry.


    Gruß

    Jürgen

    Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44, BL-NET und CMI ;
    2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; zentrale Wasserenthärtung;

    PV 3,2 kWp EEG; PV-Insel 6 kWp mit Victron MultiPlus-II 48/5000/70-50 und 8 x PylonTech LiFePo4 Modul 48V 2,4 kWh US2000 mit BMS; Victron Cerbo-GX;

    Herkules SE 5000 DF DIESEL Elektrostart Stromerzeuger Generator 2x220V-1x380V, Dauerleistung 4.200 Watt, 11 Stunden Dauerbetrieb, Tankinhalt 13,3 l

    Einmal editiert, zuletzt von SolarEngel ()

  • wow - schon wieder so schnell und ausführlich - DANKE!


    den Raspi (VPN.LAN) ist bis jetzt noch nicht für die Modbus-Kommunikation genutzt - ist zur Zeit per SSH leider nicht erreichbar - vmtl. abgestürzt ....

    Deshalb kann ich i.M. auch keine Messwerte einbinden bzw. das gesamte Python.Programm zur Verfügung stellen - sorry

    Aus diesem Grund versuche ich gerade erst einmal von meinem Laptop(Ubuntu 18.04 + Python3.6) aus die Verbindung aufzubauen bzw. zu testen. Die VPN-Verbindung zum entfernten LAN funktioniert schon seit längerem .. damit hatte ich die Messdaten-Logs des Raspi ausgewertet. Eigentlich sollte der Raspi die CMI.json-Logs mitschreiben - ist aber leider offline :-(.


    Die IP-Adressen sind (im VPN.LAN): Laptop 192.168.188.201, CMI 192.168.188.291


    das *.tdw muss ich erst noch erstellen ... dauert vmtl etwas ... hab in der letzten Zeit ziemlich viel herumprobiert ... ;)


    Jedenfalls bisher großen Dank und Lieben Gruß,

    Stefan

  • so - hier ist nun die *.tdw

    Allerdings weiß ich nicht, wie ich in TAPPS2 den Datenkanal UVR <=> CAN <=> CMI <=> Modbus <=> Raspi einbauen kann/soll...

    Über Modbus sollen folgende Funktionen ermöglicht werden:

    - im vorhandenen Link3-Pufferspeicher min. 4 Temp.Ebenen

    - Ansteuerung des Buderuskessel GB15 (Neufassung)

    - Niveau im Öltank (mit ESP32+Ultraschall)
    - evtl. Stromzähler


    Es handelt sich um das Ferienhaus meiner Eltern in Österreich. Letzten Sommer wurde die alte Buderusheizung mit einer Solaranlage + Link3-Pufferspeicher erweitert und die Steuerung auf der UVR16x2 realisiert. Leider klappt manches noch nicht so wie es soll ...


    Das zukünftige Python-Messprogramm für die Modbus-Kommunikation ist noch nicht geschrieben, soll aber aus einem vorhandenen Messprogramm, das schon existiert und mit 15 DS18B20 läuft, erstellt werden. Aufgrund von Covid kann ich nur sehr selten vor Ort sein und will/muss die Struktur von zuhause aus als "Trockenübung" vorbereiten...
    Dazu will ich erst einmal den Weg der Datenübertragung von UVR ...zum Raspi verstehen, und in einer DemoVersion (ohne reale Sensoren) nachvollziehen bzw. zum laufen bringen.


    Danke + Gruß

    Stefan

  • Hallo Jürgen,


    irgendwie verstehe ich noch nicht, welche Aufgabe diagslave in dem System übernimmt. Inzwischen habe ich auch deinen Austausch mit Karl gelesen, zugegebener Maßen kaum etwas davon verstanden.

    Ist es richtig, dass es schwierig ist eine direkte Koppelung Raspi - CMI per Modbus funktional zu gestalten.

    Hmmm ... oder ist diagslave eine Art Übersetzung-/Koppelmodul für die Kommunikation?

    Ich habe den Eindruck, dass ich mich mit dem Projekt heftig überfordere...
    Gute Nacht und vielen Dank für deine Hilfestellungen.

    Stefan

  • Hallo Stefan,


    ich kann dich beruhigen, mir ging es am Anfang auch so, habe nur Bahnhof verstanden.

    Aber ich kann dir versichern, nach dem Hügel kommt der Bahnhof und danach hast du freie Sicht. :)

    Geduld, Geduld und natürlich Zeit löst fast alle Probleme.

    So ein komplexes Thema geht nur in kleinen Schritten, habe es bei mir gesehen, man will in kurzer Zeit oft mehr, als wirklich möglich ist.

    Aber mit der Zeit wird man bescheiden, auch wenn es nur in kleinen Schritten vorwärts geht.


    Mit Jürgen haben wir hier einen ausgezeichneten Lektor mit sehr viel praktischer Erfahrung und bemerkenswerter Geduld. :thumbup:


    #76: Donnerstag 15:37

    "Im Moment habe ich eine UVR16x2 laufen, die die Solaranlage und die Heizung regelt. Leider reichen mir die Eingänge bei weitem nicht.

    Andererseits habe ich diverse Sensoren (z.B. DS18B20) an einem Raspi3 hängen, deren Werte ich in der UVR16x2 bräuchte."


    Mich würde folgendes interessieren:

    In der UVR16x2 hast du nur 16 Eingänge. Wenn alle belegt sind, was machst du dann mit den zusätzlichen Informationen damit ?


    Du kannst ja meines Erachtens weitere analoge Werte über das CMI-Modbus-TCP-Eingang - CAN-Ausgang nur ins Datenlogging schicken, da ja alle Eingänge laut deiner Info schon belegt sind oder verwendest du diese analogen Werte über den CAN-Eingang in den Funktionen ?


    Ich habe im Jänner 2021 ja auch mit einem RSPPi3+ angefangen, aber ab Mai 2021 auf einen INTELNUC-Proxmox (iobroker, influxdb u. Grafana) umgesattelt, so wie Jürgen.


    Wie gesagt ich kenne python nur vom hören sagen, habe damit noch nichts gemacht.


    Was machst du im RSPPi3+ mit deinen Daten ? Dient dieser nur um die Daten zu erfassen und anschließend an das CMI zu senden ?

    Oder möchtest du im RSPPi3+ auch Werte abspeichern und visualisieren ?


    Nur einige Infos zu deinem besseren Verständnis:

    Modbus Häufig gestellte Fragen


    Über Modbus TCP | Einfach Modbus Software (simplymodbus.ca)

    Modbus TCP/IP

    TCP/IP

    TCP ist Transmission Control Protocol und IP ist Internet Protocol. Diese Protokolle werden zusammen verwendet und sind das Transportprotokoll für das Internet. Wenn Modbus-Informationen mit diesen Protokollen gesendet werden, werden die Daten an TCP übergeben, wo zusätzliche Informationen angehängt und an IP weitergegeben werden. IP legt die Daten dann in ein Paket (oder Datagramm) und überträgt sie.

    TCP muss vor der Datenübertragung eine Verbindung herstellen, da es sich um ein verbindungsbasiertes Protokoll handelt. Der Master (oder Client in Modbus TCP) baut eine Verbindung mit dem Slave (oder Server) auf. Der Server wartet auf eine eingehende Verbindung vom Client. Sobald eine Verbindung hergestellt ist, antwortet der Server auf die Anfragen des Clients, bis der Client die Verbindung schließt.


    Das CMI kann leider nur Master (=client), d. h. kann nur Daten von einem Slave(=Server) abholen oder an einen Slave(=Server) senden.

    D. h. das CMI kann nicht als Slave-Hilfsserver betrieben werden, daher Zwischenschaltung diagslave-Hilfsserver.


    1. Master (=Client) - "Daten senden" - AN Slave (=Server):

    Z. B. Ich sende mit meinem CMI als Master analoge und digitale Werte meiner UVR16x2 an den iobroker in meinem INTELNUC (proxmox), Abspeicherung in Datenbank (=influxdb) und Visualisierung in Grafana (=Visualisierungsprogramm).

    Der INTELNUC ist mein digitaler Zwilling (=Datenspiegelung 1:1) zur UVR16x2 und dem Smartfox Pro.


    2. Master (=Client) - "Daten abholen" - VON Slave (=Server):

    Dein Beispiel: Das CMI als Master holt vom Hilfsserver-Slave (=diagslave) Daten ab, welche der RSPPi3+ als Master an den Hilfsserver-Slave(=diagslave) gesendet hat.

    D. h. der diagslave-Hilfsserver ist nur eine Brücke oder Kommunikationsschnittstelle.


    Wäre das CMI schon multi-connectfähig bräuchte man meines Erachtens keinen diagslave-Hilfsserver.


    Der Modbus-Adapter (=Software) im iobroker(=Datensammelsystem, Datendrehscheibe) kann master/slave in beide Richtungen.


    Hoffe, dass das neue CMI multi-connectfähig wird.



    SolarEngel:

    Jürgen bitte korrigieren oder ergänzen, falls hier Infos oder Bemerkungen fachlich falsch oder nicht ganz richtig sind.

    Vielen Dank.


    In diese Sinne, nicht aufgeben. :)


    LG



    Karl

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!