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

    Du hast Probleme beim Login? Schreibe uns im Forum "Probleme mit der Registrierung".
      • 1

      • # 162439

      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

      Hallo,

      um externe Messwerte in die UVR16xx reinzubekommen, habe ich den Weg über den Modbus vom C.M.I gewählt.
      Mit einem Modbus/TCP-Slave Server z.B. ("diagslave"), der auf dem Raspi läuft, lässt sich z.B eine UVR16xx, RSM610 oder CANIOxx über C.M.I über Modbus/TCP übers Netzwerk mit der Aussenwelt verbinden.

      Ich hab mir inzwischen eine C.M.I für meine UVR16xx Steuerungen zugelegt und bin fleissig am erkunden der vielen Schnittstellen, Busse und Protokolle.
      Das übertragen der Funktionsdaten von TAPS2 in die Steuerung und vieles andere ist mit der C.M.I sehr komfortabel geworden
      und die meisten Programme dazu sind auch in Linux verfügbar.

      Im C.M.I arbeitet ein ModBus/TCP-Master-Server, der über die ModBus-Eingänge 64 analoge und 64 digitale Werte einlesen kann.
      Über die ModBus-Ausgänge können die analogen und digitalen Werte ausgegeben werden.

      Für meine Solar und Heizungssteuerung hab ich zum Testen die Werte vom Lamdacheck in die UVR16xx übertragen. Damit können in der UVR die Werte vom
      Abgassensor, Restsauerstoff usw. des Lambdachecks verwendet werden, obwohl z.B. kein Abgassensor an der UVR hängt, man spart sich doppelte Sensoren durch
      Mehrfachverwendung von Sensordaten.

      Eine weitere wichtige Anwendung ist für mich das Versorgen von meinen Test-UVR16xx im Testumfeld mit Echtdaten, also mit Sensorwerten vom produktiv-System vom produktivem CAN-Bus.
      Das Testumfeld mit eigenem CAN-Bus kann ich wie ein Simulator mit Echtwerten betreiben. Z.B wenn ich im Testumfeld einen bestimmen Wert benötige, den mir die Prod-Anlage grad nicht liefert,
      dann überschreibe ich zum testen auf dem Raspi im Modbus/TCP-Slave Server einfach das entprechende Modbus-Register mit dem benötigten Wert für den Testfall (ist wie ein digitales Simboard).
      Mein Ziel wird sein: Mit einem Python-Script gespeicherte produktiv-Werte von einem ganzen Tag im Zeitraffer im Test-UVR16xx durchzuspielen.
      Damit kann z.B ein ganzer Tag im Testsystem simuliert, mit gespeicherten Logdaten beliebig oft nachgefahren werden, um z.B. einen Programmfehler zu finden
      oder komplexe Funktionsbausteine besser zu verstehen.

      Weiterhin hab ich zum testen an den Modbus/TCP-Slave Server der auf dem Raspi läuft den iobroker angeschlossen, um dort die UVR-Werte weiter zu verarbeiten,
      oder von dort Werte zur UVR zu schicken.

      Bevor die externen Werte von den ModBus-Eingängen über die C.M.I zur UVR16xx übertragen werden können,
      ist ein sorgfältiges Mapping der C.M.I Ein- und Ausgänge vom Modbus zum CAN-Bus und zu den Netzwerkeingängen der UVR16xx notwendig.
      Diese Arbeit ist sehr aufwendig, muss aber nur einmal gemacht werden und sollte dokumentiert werden um später noch einen Überblick zu haben
      woher oder wohin die vielen Werte von und zum Modbus ihren Weg zur UVR16xx nehmen. Bei der Fehlersuche ist eine Dokumentation dieses Mappings auch sehr hilfreich.

      Da die über den Modbus übertragbaren C.M.I Werte nur einen kleinen Teil der zur Verfügung stehenden Modbus-Register belegen,
      habe ich bei mir grosszügig die Adressen der verwendeten Modbus-Register im ModBus/TCP SLAVE-Server auf dem Raspi ausgewählt.

      C.M.I Modbus-Ausgang-Analog Adresse 1-64 für Analog Ausgänge unit 1 zur Adresse 101-164 Modbus-HoldingRegister schreiben mit Funktion 06
      C.M.I Modbus-Eingang-Analog Adresse 1-64 für Analog Eingänge unit 1 von Adresse 201-264 Modbus-HoldingRegister lesen mit Funktion 03
      C.M.I Modbus-Ausgang-digital Adresse 1-64 für digital Ausgänge unit 1 zur Adresse 301-364 Modbus-Coils schreiben mit Funktion 05
      C.M.I Modbus-Eingang-digital Adresse 1-64 für digital Eingänge unit 1 von Adresse 401-464 Modbus-Coils lesen mit Funktion 01

      Wenn der "diagslave" auf dem Raspberry Pi im TCP-Mode gestartet ist und das Mapping im C.M.I fehlerfrei ist, beginnt der C.M.I sofort mit der Datenübertragung (schreiben und lesen)
      der Modbus-Register und coils) zum ModBus/TCP-Slave-Server auf dem Raspberry Pi.

      Ich habe zum Testen und Programmieren auf dem Raspberry Pi die Python Modbus Pakete pyModbus und pyModbusTCP installiert.
      Dazu gibt es eine pyModbus.console mit der man sich als Client an den ModBus/TCP-Slave-Server auf dem Raspberry Pi connecten kann und Modbus-Register lesen und schreiben kann
      oder man programmiert sich mit einem Python-script einen Python Client zum individuellen auslesen und schreiben der Modbus-Register.

      Der ModBus/TCP-Slave-Server auf dem Raspberry Pi lässt sich mehrfach connecten.
      Z.B. lassen sich auch SmartHome-Systeme, wie iobroker direkt an den "diagslave" anschliessen.

      Im iobroker muss dazu der Master-Mode im modbus-adapter gesetzt werden und die ipadresse vom "diagslave" eingetragen werden
      und ein mapping (konfigurieren) der verwendeten Modbus-Register auf die Adressen im iobroker durchgeführt werden.
      Dann beginnt der iobroker nach start der modbus-Instanz auch sofort mit der Datenübertragung der UVR16xx-Werte. Die Objektstruktur für die Modbus-Register
      Werte wird intern angelegt und steht sofort zur Verfügung. Wenn man diese Struktur aufklappt, dann sieht man sofort die aktuell übertragenen Werte
      und kann durch farbliche Markierung der einzelnen Felder ein Update der einzelnen Werte verfolgen.

      Gruß
      Jürgen
      Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44 und BL-NET,CMI ;
      2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; PV 3,2kW; Wasserenthärtung
      • 2

      • # 162452
      Hallo Jürgen,

      dein Projekt zum Thema Verbindung UVR16x2k über CMI mit Modbus/TCP-IP über Netzwerk mit der Aussenwelt und Visualisierung im Schema interessiert mich brennend.

      Ich habe mir zwar vor ca. 2 Jahren einen Rasperry-pi gekauft, bin aber aber aufgrund meiner fehlenden technischen Kenntnisse bei der Realisierung nicht weiter gekommen.

      Mich würde interessieren, ob man mit dem Raspi auch Json-Abfragen mit einem Jsonparser machen kann und diese Werte vielleicht dann über den genannten Modbus/TCP-Slave Server z.B. ("diagslave")

      in die UVR16x2k übernehmen kann.

      Ich habe den Smartfox eingesetzt und mein Ziel wäre Bezug/Einspeisewerte Gesamt und je Phase im Schema zu visualisieren.
      Ebenso die Leistungs- und Ertragsdaten meines Wechselrichters Piko 5.5.

      Der alte Smartfox kann noch nicht Modbus TCP-IP. Der neue SmartfoxPro schon.

      Herzlichen Dank im Voraus für deine Info.


      Sonnige Grüße



      Karl
      Files
      • 3

      • # 162463
      Hallo Karl,

      mit dem Raspi kannst natürlich auch Json-Abfragen machen, je nach Programmiersprache die verwendet werden soll.

      Meine Erfahrungen mit Json-Abfragen habe ich bisher mit einem javascript im iobroker und dem C.M.I gemacht.
      Das C.M.I hat leider nur zum auslesen der Daten eine Json-API.
      Über diese Json-API. habe ich mit einem javascript testweise Daten von der UVR1611 über C.M.I direkt in den iobroker eingelesen und dort Datenpunkte erzeugt.
      Das geht aber bestimmt mit fast allen Programmiersprachen auf dem Raspi unter linux.

      Und nun wieder zu Modbus:
      Ich habe inzwischen meine gesammelten Daten von allen meinen Geräten in MQTT Messages mit entsprechenden topics am laufen.
      Zum Schreiben der externen Werte in den ("diagslave") ModBus/TCP SLAVE-Server hinein hab ich ein python-script (client) verwendet.

      z.B. der Datenrahmen1 von der UVR1611 ist eine Message mit topic uvr1
      Beispiel-Message der uvr1611 vom prod-System über BL-NET ausgelesen:
      set UVR uvr1: 21.0 83.8 30.4 47.4 25.7 58.9 82.8 81.1 36.2 34.8 28.7 16.4 28.1 23.0 31.6 0.0 0 0 1 27 0 0 0 0 0 0 0 0 0 0 0 1 0 0.0 32414.8 8.1 103458.1

      Im nachfolgenden python-script lese (subsribe) ich die MQTT Messages und filtere das topic uvr1 gezielt raus und zerlege dann die message in die einzelen Werte
      und schreibe dann jeden Wert (S1-S16) einzeln in einer Schleife in die Modbus-Register.

      #!/usr/bin/env python3
      import paho.mqtt.client as mqtt
      from pyModbusTCP.client import ModbusClient
      import time

      SERVER_HOST = "localhost"
      SERVER_PORT = 502
      c = ModbusClient()
      c.debug(True)
      c.host(SERVER_HOST)
      c.port(SERVER_PORT)

      def write_modbus_Hregister(hregister, wertr):
      if not c.is_open():
      if not c.open():
      print("unable to connect to "+SERVER_HOST+":"+str(SERVER_PORT))

      if c.is_open():
      if c.write_single_register(hregister, wertr):
      print(" write ok ")
      else:
      print(" write error")

      def topic1(p_topic, p_payload):
      if p_topic == "uvr1":
      s_payload = str(p_payload)
      l_dr1 = s_payload.split()
      for sx in range(1, 16):
      write_modbus_Hregister(sx+200, int(float(l_dr1[sx+2])*10))

      def on_connect(client, userdata, flags, rc):
      print("Connected with result code " + str(rc))
      client.subscribe("#")

      def on_message(client, userdata, msg):
      topic1(msg.topic, msg.payload)

      def on_log(client, obj, level, string):
      print(string)

      client = mqtt.Client()
      client.on_connect = on_connect
      client.on_message = on_message
      client.on_log = on_log
      client.connect("localhost", 1883, 60)
      client.loop_forever()


      Ich hab ein bisschen gegoogelt und für den Kostal Piko eine interessante Webseite gefunden:

      h t t p s://wiki.volkszaehler.org/hardware/channels/solar_inverters/kostal_pico?redirect=1

      Kostal Piko
      Diese Wikiseite zeigt zwei Ansätze zur Einbindung von Kostal Wechselrichtern an den Volkszähler durch Auslesen des Webfrontends der Wechselrichter.
      Die Wechselrichter zeigen sowohl die aktuelle Leistung als auch den gesamten Stromertrag über das Webfrontend an.
      Diese Daten werden per script ausgelesen und in die Volkszähler-Datenbank geschrieben.

      Das script zum Auslesen des Webfrontends, wenn es für deine Zwecke brauchbar ist, müßte so geändert werden, dass nur die ausgelesenen Daten weiter verarbeiten kannst.
      Ich habe leider keinen Kostal Piko Wechselrichter, deshalb kann ich hier nichts testen und nichts zu den scripten sagen und Ferndiagnosen sind mir zu aufwendig.

      Meine PV Anlage arbeitet mit SMA Wechselrichter, den ich über bluetooth und SBFspot auslesen kann.

      Jeder hat so seine Infrastruktur und ein Konzept für die Datenquellen.
      Bei mir hab ich die Daten von den verschiedensten Geräten ausgelesen und in MQTT-Messages eingepackt
      und somit eine einheitliche Datenquelle (Mosquitto-Message-Broker) zum weiterverarbeiten.

      Gruß
      Jürgen
      Atmos D15P mit A25; LambdaCheck; UVR1611 mit CAN-I/O44 und BL-NET,CMI ;
      2x1000l Puffer mit 2x10m² VRK und glykolfreie Solarthermie(Ost-West); WW-FWS; PV 3,2kW; Wasserenthärtung
      • 4

      • # 162467
      Hallo Jürgen,

      vielen Dank für die Info.

      Aktuell habe ich in meinem UVR-Schema einen Hyperlink auf die Json-Abfrage. Pfeil von links nach rechts. Die Daten sind somit mit einem Link auf der 2. Ebene sichtbar.

      Aktuell geht es vom CMI bezüglich Daten nur hinaus und hinein nur über Modbus-TCP-Master - Slave. Oder siehst du dies anders ?

      Die andere von mir bereits angedachte Variante wäre einen CAN-EZ3 mit einer zusätzlichen Wandlermessung einzusetzen, obwohl ich schon eine sehr genau Wandlermessung über den Smartfox habe.

      Damit könnte man die Visualsierung der Stromdaten auf der 1. Ebene im Schema darstellen.

      Der neue WR Kostal Plenticore Plus und der neue SamrtfoxPro können Modbus-TCP-IP schon und somit wäre die Visualisierung über das CMI und Modbus-TCP-Master realisierbar.


      LG



      Karl
      Files

    Webutation