NEWS
Einbindung Stromzähler über RS485 Modbus
-
@ining Jetzt bin ich verwirrt.
Ich habe dir doch die Modbus ID 255 markiert, warum trägst du eine „1“ ein?
-
@wendy2702
Weil am Zähler die 001 angezeigt wird:
-
@ining OK.
Stimmt denn die Baudrate usw. bzw. kannst du die auch am Display ablesen?
Setze im Register den haken bei Poll mal rein.
Dann hat das Register 4 eine Länge von 4 und nicht wie bei dir im Screenshot 2. Ob es dann Float Big oder Little ist musst du mal probieren.
-
@wendy2702 Baudrate wird angezeigt 9600
4 habe ich auf Poll umgestellt die Länge steht aber immer noch auf 2.2022-02-13 12:50:05.321 - error: modbus.2 (24677) Wrong CRC for frame: 113,1,99,177,171,0,27,27,27,27,26,0,153,241,27,27,27,27,1,1,1,1,118,7,0,39,5,76,189,219,98,0,98,0,114,99,1,1,118,1,1,7,0,39,6,178,63,73,11,6,69,77,72,1,4,197,109,202,229,1,1,99,184,183,0,118,7,0,39,5,76,189,220,98,0,98,0,114,99,7,1,119,1,11,6,69,77,72,1,4,197,109,202,229,7,1,0,98,10,255,255,114,98,1 2022-02-13 12:50:05.330 - error: modbus.2 (24677) Wrong CRC for frame: 101,6,178,246,218,118,119,7 2022-02-13 12:50:05.337 - error: modbus.2 (24677) Error response: 82 2022-02-13 12:50:05.342 - error: modbus.2 (24677) Wrong CRC for frame: 1,1,1,4,69,77 2022-02-13 12:50:05.473 - error: modbus.2 (24677) Wrong CRC for frame: 72,1,119,7,1,0,0,0,9,255,1,1,1,1,11,6,69,77,72,1,4,197,109,202,229,1,119,7,1,0,2,8,0,255,100,0,0,162,1,98,30,82,255,86,0,11,220,14,196,1,119,7,1,0,2,8,1,255,1,1,98,30,82,255,86,0,11,220,14,197,1,119,7,1,0,16,7,0,255,1,1,98,27,82,255,85,255,255,114,165,1,119,7,129,129,199,130,5,255,1,114,98,1,101,6,178,246,218,1,1,131,2,161,201,201,244,236,154,107,194,147,73,69,228 2022-02-13 12:50:05.480 - error: modbus.2 (24677) unknown function code: 0x22, 0xfd 2022-02-13 12:50:05.486 - error: modbus.2 (24677) unknown function code: 0x56, 0x40 2022-02-13 12:50:05.493 - error: modbus.2 (24677) Error response: 51 2022-02-13 12:50:05.498 - error: modbus.2 (24677) unknown function code: 0x47, 0x98 2022-02-13 12:50:05.505 - error: modbus.2 (24677) Error response: 45 2022-02-13 12:50:05.511 - error: modbus.2 (24677) unknown function code: 0x59, 0x23 2022-02-13 12:50:05.518 - error: modbus.2 (24677) unknown function code: 0x63, 0xeb 2022-02-13 12:50:05.524 - error: modbus.2 (24677) unknown function code: 0x0, 0x27 2022-02-13 12:50:05.529 - error: modbus.2 (24677) unknown function code: 0x62, 0x0 2022-02-13 12:50:05.536 - error: modbus.2 (24677) Wrong CRC for frame: 99,2,1,113,1,99 2022-02-13 12:50:05.542 - error: modbus.2 (24677) unknown function code: 0x5e, 0x0 2022-02-13 12:50:05.550 - error: modbus.2 (24677) unknown function code: 0x1a, 0x0 2022-02-13 12:50:06.598 - error: modbus.2 (24677) unknown function code: 0x1b, 0x1b 2022-02-13 12:50:06.726 - error: modbus.2 (24677) Wrong CRC for frame: 1,1,118,7,0,39,5,76,189,225,98,0,98,0,114,99,1,1,118,1,1,7,0,39,6,178,63,75,11,6,69,77,72,1,4,197,109,202,229,1,1,99,114,213,0,118,7,0,39,5,76,189,226,98,0,98,0,114,99,7,1,119,1,11,6,69,77,72,1,4,197,109,202,229,7,1,0,98,10,255,255,114,98,1,101,6,178,246,220,118,119,7,129,129,199,130,3,255,1,1,1,1,4,69,77,72,1,119,7,1,0,0,0,9,255,1,1,1,1,11,6,69,77 2022-02-13 12:50:06.734 - error: modbus.2 (24677) Wrong CRC for frame: 72,1,4,197,109,202,229,1,119 2022-02-13 12:50:06.741 - error: modbus.2 (24677) Wrong CRC for frame: 7,1,0,2,8 2022-02-13 12:50:06.748 - error: modbus.2 (24677) unknown function code: 0x64, 0x0 2022-02-13 12:50:06.754 - error: modbus.2 (24677) unknown function code: 0x1e, 0x52 2022-02-13 12:50:06.761 - error: modbus.2 (24677) Error response: e 2022-02-13 12:50:06.766 - error: modbus.2 (24677) Wrong CRC for frame: 7,1,0,2,8 2022-02-13 12:50:06.772 - error: modbus.2 (24677) Wrong CRC for frame: 255,1,1,98,30,82 2022-02-13 12:50:06.779 - error: modbus.2 (24677) unknown function code: 0x56, 0x0 2022-02-13 12:50:06.910 - error: modbus.2 (24677) Wrong CRC for frame: 210,1,119,7,1,0,16,7,0,255,1,1,98,27,82,255,85,255,255,114,165,1,119,7,129,129,199,130,5,255,1,114,98,1,101,6,178,246,220,1,1,131,2,161,201,201,244,236,154,107,194,147,73,69,228,134,123,10,34,253,142,77,252,201,86,64,144,75,5,229,233,81,108,40,215,213,71,152,149,196,189,86,203,69,248,248,198,42,89,35,68,1,1,1,99,129,186,0,118,7,0,39,5,76,189,229,98,0,98,0,114,99,2,1,113,1,99,129,218,0,27,27,27,27 2022-02-13 12:50:08.002 - error: modbus.2 (24677) unknown function code: 0xb, 0x1b 2022-02-13 12:50:08.009 - error: modbus.2 (24677) Wrong CRC for frame: 27,1,1,1,1,118 2022-02-13 12:50:08.013 - error: modbus.2 (24677) unknown function code: 0x0, 0x27 2022-02-13 12:50:08.021 - error: modbus.2 (24677) unknown function code: 0x62, 0x0 2022-02-13 12:50:08.028 - error: modbus.2 (24677) Wrong CRC for frame: 99,1,1,118,1,1 2022-02-13 12:50:08.033 - error: modbus.2 (24677) unknown function code: 0x0, 0x27 2022-02-13 12:50:08.040 - error: modbus.2 (24677) unknown function code: 0xb, 0x6 2022-02-13 12:50:08.252 - error: modbus.2 (24677) Wrong CRC for frame: 1,4,197,109,202,229,1,1,99,66,224,0,118,7,0,39,5,76,189,232,98,0,98,0,114,99,7,1,119,1,11,6,69,77,72,1,4,197,109,202,229,7,1,0,98,10,255,255,114,98,1,101,6,178,246,221,118,119,7,129,129,199,130,3,255,1,1,1,1,4,69,77,72,1,119,7,1,0,0,0,9,255,1,1,1,1,11,6,69,77,72,1,4,197,109,202,229,1,119,7,1,0,2,8,0,255,100,0,0,162,1,98,30,82,255,86,0,11,220,14,224,1,119,7,1,0,2,8,1,255,1,1,98,30,82,255,86,0,11,220,14,225,1,119,7,1,0,16,7,0,255,1,1,98,27,82,255,85,255,255,114,120,1,119,7,129,129,199,130,5,255,1,114,98,1,101,6,178,246,221,1,1,131,2,161,201,201,244,236,154,107,194,147,73,69,228,134,123,10,34,253,142
-
@ining Stell die Länge doch mal wie im Doc beschrieben auf „4“
-
@wendy2702
mit Float und Poll lässt sich die Länge nicht editieren (bleibt fix 29.
Als Double kann ich den Wert auf 4 stellen mit dem gleichen Ergebnis im Log. -
@ining Probiere doch vielleicht mal mit einem dieser Tools ob du was mit deinem Kabel und Adapter bekommst:
RMMS is master simulator
mod_RSsim.exe is slave simulator. It can be that you need Microsoft Visual C++ 2008 SP1 Redistributable Package to start it (because of SideBySide error). -
@ining sagte in Einbindung Stromzähler über RS485 Modbus:
Kabel A an A B an B,Wenn das ein Deutscher (oder EU) Zähler ist, und eine generische RS485 Karte/Stick, dann mal testen, ob kreuzen funktioniert A nach B und B nach A.
Hintergrund: Die Definition ist recht abstrakt und die normbewährten Energiezählerfirmen interpretieren es streng. Die Halbleiterhertseller fast durchgängig leider umgekehrt. Und die Mudul/Stickhersteller folgen den Halbleiterherstellern. -
Moin moin,
ich komme zwar aus der Tasmotafraktion hänge aber an dem gleichen Problem.
Hab auch diesen Zähler und "Probleme" den mit Modbus anzusprechen.
Vorab es wird sicher nicht an der Verkabelung oder dem Adapter liegen.
Dieser Zähler hat iwie nen richtig doofes Protokoll.
Ich weiß nicht genau wie ich es beschreiben soll aber z.b. kann man mit dem Firmen eigenen Tool mit dem Ding reden. (PC - FTDI - duplex rs485 adapter - Zähler) ( https://stromzähler.eu/stromzaehler/drehstromzaehler/fuer-hutschiene-geeicht/252/drt428m-2-zweirichtungs-drehstromzaehler-geeicht-fuer-din-hutschiene-mit-s0-ir-rs485 ) da kann man ein Tool runter laden und mit dem kann ich ohne Probleme mit meinem Zähler reden aber egal was ich versuche mit allem anderen was ich an Tools/Software/Programme versucht habe kann ich mit dem nicht reden. Hätte ich jetzt zugriff auf ein Oszi oder Logikanalyser würde ich gerne mal das Signal "aus dem Tool" auslesen aber leider habe ich da grade keine Möglichkeit das zu machen.
Ich weiß ich helfe vielleicht nicht viel aber vielleicht kann ich hier jemanden in die richtige Richtung lenken.
Gerne mach ich auch diesen Forums Post verweisen. ( https://github.com/arendst/Tasmota/discussions/14746 ) Ich weiß ich weiß da geht es um Tasmota aber da geht es etwas auf die Thematik ein, dass der iwie ein nicht ganz richtiges Signal spricht.So viel geschrieben aber wenig gesagt.
Schönen Abend erstmal noch
Gruß Tom -
@wendy2702
Der USB Stick unterstützt leider kein Windows 10.@klassisch said in Einbindung Stromzähler über RS485 Modbus:
@ining sagte in Einbindung Stromzähler über RS485 Modbus:
Kabel A an A B an B,Hat leider auch kein Ergebnis gebracht
-
@ining OK.
Also können wir auch nicht ausschließen das der Stick eventuell nicht richtig funktioniert.
Mal mit Minicom auf den port geschaut ob da irgendetwas ankommt?
-
@ining sagte in Einbindung Stromzähler über RS485 Modbus:
Der USB Stick unterstützt leider kein Windows 10.
Kann ich kaum glauben. Habe hier etliche. Die billigen um 1 EUR (damals) mit CH340, solche mit FTDI und CP2102
Unter Win 10 liefen die bei mir alle problemlos. Mein ioBroker läuft unter Win.
Mittlerweile habe zwar alle Sticks auf TCP "umgestellt", aber das ist eine andere Sache.
Ein Punkt könnte auch noch sein. Die RS485 haben einen GND Anschluß. Den verbinde ich i.a. mit einem Widerstand an GND des Senders. Zum Potentialausgleich. Das kann man testen, Je nach Konfiguration könnte das helfen. Oder diese GND Verbindung weglassen. Wie gesagt, hängt von Deiner Topologie ab. -
@ining sagte in Einbindung Stromzähler über RS485 Modbus:
@wendy2702
Der USB Stick unterstützt leider kein Windows 10.Ich klinke mich mal hier kurz mit ein, da ich den Zähler leider auch nicht im Modbus Adpater zum laufen bekomme.
Die Sticks funktionieren einwandfrei unter Win 10, ich hab ihn so wie Angeschlossen vom Raspberry abgezogen, an den Laptop angesteckt und konnte mittels der Hersteller Software Daten lesen und schreiben.
Also ist auch die Verdrahtung A/B richtig. -
Hallo,
Vielleicht hilft Euch dies: Ich kämpfe auch gerade mit dem B+G Tech DRT428M (bzw. ich DRT428M-3), das Auslesen einiger Register auf dem Raspberry Pi klappt korrekt (int und float ). Mit iobroker kenne ich mich aber nicht aus.
USB Adapter (QinHeng Electronics CH340 serial converter) funktioniert problemlos
- unter MS Windows 10 am PC mit der B+G Herstellersoftware (wie oben schon verlinkt/beschrieben)
- Auf dem Paspberry Pi 4 B am USB Port mit modbus rtu über python minimalmodbus.
Codebeispiel unten.
Ich musste aber in der Initialisierung die Timings/Konfiguration anpassen, damit das stabil läuft. Aktuell so:
#!/usr/bin/env python3 # see https://minimalmodbus.readthedocs.io/en/stable/apiminimalmodbus.html#minimalmodbus.MODE_RTU import serial import minimalmodbus instrument = minimalmodbus.Instrument(port='/dev/ttyUSB0', slaveaddress=1, mode=minimalmodbus.MODE_RTU, close_port_after_each_call=True, debug=False) instrument.serial.baudrate = 9600 # Baud instrument.serial.parity = serial.PARITY_EVEN instrument.serial.bytesize = 8 instrument.serial.stopbits = 1 instrument.clear_buffers_before_each_transaction = True # False instrument.serial.timeout = 0.30 # 0.05 seconds is too fast try: ## Read value print('--- read values: ---') print('serial number: ', instrument.read_register(registeraddress=int(0x0000), number_of_decimals=0)) print('meter ID: ', instrument.read_register(registeraddress=int(0x0002), number_of_decimals=0)) print('baud rate [bps] ', instrument.read_register(registeraddress=int(0x0003), number_of_decimals=0)) print('CT Rate: ', instrument.read_register(registeraddress=int(0x0008), number_of_decimals=0)) print('Combined Code: ', instrument.read_register(registeraddress=int(0x000B), number_of_decimals=0)) print('Cycletime: [s] ', instrument.read_register(registeraddress=int(0x000D), number_of_decimals=0)) print('SW version: ', instrument.read_float( registeraddress=int(0x0004), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('HW version: ', instrument.read_float( registeraddress=int(0x0006), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('L1 Voltage [V] ', instrument.read_float( registeraddress=int(0x000E), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('L2 Voltage [V] ', instrument.read_float( registeraddress=int(0x0010), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('L3 Voltage [V] ', instrument.read_float( registeraddress=int(0x0012), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('grid frequency [Hz] ', instrument.read_float( registeraddress=int(0x0014), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('L1 Current [A] ', instrument.read_float( registeraddress=int(0x0016), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('L2 Current [A] ', instrument.read_float( registeraddress=int(0x0018), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('L3 Current [A] ', instrument.read_float( registeraddress=int(0x001A), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('TOTAL Active Power[kW] ', instrument.read_float( registeraddress=int(0x001C), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print(' L1 Active Power [kW] ', instrument.read_float( registeraddress=int(0x001E), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print(' L2 Active Power [kW] ', instrument.read_float( registeraddress=int(0x0020), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print(' L3 Active Power [kW] ', instrument.read_float( registeraddress=int(0x0022), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print('TOTAL Active Energy [kWh]', instrument.read_float( registeraddress=int(0x0100), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print(' L1 Total Active Energy[kWh]', instrument.read_float( registeraddress=int(0x0102), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print(' L2 Total Active Energy[kWh]', instrument.read_float( registeraddress=int(0x0104), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) print(' L3 Total Active Energy[kWh]', instrument.read_float( registeraddress=int(0x0106), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) ) except IOError as e: print('ERROR: Failed to read from instrument:\n',e) instrument.serial.close()
Ausgabe mit korrekten Werten:
serial number: 0
meter ID: 1
baud rate [bps] 9600
CT Rate: 0
Combined Code: 9
Cycletime: [s ] 2
SW version: 1.0199999809265137
HW version: 1.0
L1 Voltage [V] 226.3000030517578
L2 Voltage [V] 225.60000610351562
L3 Voltage [V] 227.8000030517578
grid frequency [Hz] 49.9900016784668
L1 Current [A] 0.8299999833106995
L2 Current [A] 8.329999923706055
L3 Current [A] 0.4099999964237213
TOTAL Active Power[kW] 1.972000002861023
L1 Active Power [kW] 0.0860000029206276
L2 Active Power [kW] 1.8480000495910645
L3 Active Power [kW] 0.039000000804662704
TOTAL Active Energy [kWh] 42.720001220703125
L1 Total Active Energy[kWh] 9.989999771118164
L2 Total Active Energy[kWh] 14.619999885559082
L3 Total Active Energy[kWh] 18.110000610351562 -
@j-privat sagte in Einbindung Stromzähler über RS485 Modbus:
', instrument.read_float( registeraddress=int(0x0004), number_of_registers=2, functioncode=3, byteorder=minimalmodbus.BYTEORDER_BIG) )
Basierend auf dieser Zeile könnte man im Modbus Adapter mal ein Holding Register eintragen.
Die Kommunikations Einstellungen müssen natürlich zu denen des Zählers passen.
Dann das loggen für die Instanz mal auf Debug stellen ergebnis nach Adapterstart posten.
-
Danke an @j-privat @wendy2702 Ihr habt mich, wenn auch auf ein paar Umwegen auf den richtigen Weg gebracht. Aktuell läuft der Adapter seit einer Stunde stabil.
Ich hatte vorher den Haken bei "Aliase Benutzen" drin, da ich das beim RelTech RD2D auch so gemacht habe, dann passen aber natürlich nicht die Register Adressen.
Die Register Adressen habe ich aus der Herstellerbeschreibung und die HEX einfach mit dem Windows Taschenrechner auf dezimal umgestellt.
Wichtig ist noch das der Haken bei Zyklisch schreiben bei den Registern draußen ist, sonst ließt der Adapter einmal die Werte aus und geht dann in Störung.Das einzige was mir noch Rätsel aufgibt: In der Herstellerbeschreibung ist die Länge immer mit "4" Angegeben, das passt zum einen aber ja nicht auf die Registernummer ( Beispw. L1 zu L2 und L3) und zum anderen geht es ja mit der Float Einstellung auf eine Länge von 2.
-
@exonder Cool und Danke für das Teilen der Informationen!!!
Kommen denn die Werte für die Register mit den "längen"?
Wenn ja würde ich sagen: Fehler in der Hersteller Doku
-
Hallo,
ich versuche den Zähler auch gerade einzubinden.
Tasmota - Serial to TCP BridgeAnders, als in der Doku und in dem mitglieferten Testprogramm, erwartet der Zähler in der Kommunikationseinstellung nicht 1 sondern 2 Stopbits.
Das konnte ich sogar mit einem Terminalprogramm (HTerm) reproduzieren.Gruß
Axel -
Hi,
ich habe mal eine Frage zur Slave ID und zur Geräte ID.
Da kann man doch sicherlich nicht irgendwelche Werte eintragen. Wie kommt man denn an diese Parameter ran ?Ich habe die Kommunkation soweit alles durch und kommt derzeit bis INing wie er eine Kommikation Adresse 40004 aufbaut. Das ist aber wohl nur die Kommunikation mit dem RS484 zu USB Konverter.
Den Konverter finden übrigens mein Raspberry PI. Mit lsusb bekomme ich folgenden informationen:
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 006: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter Bus 001 Device 004: ID 05e3:0727 Genesys Logic, Inc. microSD Reader/Writer Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Andreas
-
@ahermann86 said in Einbindung Stromzähler über RS485 Modbus:
Anders, als in der Doku und in dem mitglieferten Testprogramm, erwartet der Zähler in der Kommunikationseinstellung nicht 1 sondern 2 Stopbits.
Das konnte ich sogar mit einem Terminalprogramm (HTerm) reproduzieren.Bin verwirrt - in der Doku steht „11bits data (1 start bit, 8 data bit, 1 even check bit, 1 stop bit)“ https://stromzähler.eu/media/pdf/1f/d7/ae/DRT428M-Serie_manual-register.pdf
Die Einstellungen im Modbus-Adapter lassen aber ein Setzen von Startbits nicht zu, so, wie ich das sehe.
Bei zwei Stoppbits wären wir dann zwar auf 11 Bits, aber die Inhalte wären quasi um ein Bit verschoben…?Da ich daran denke, mir auch einen DRT428-M2 zuzulegen, interessiert mich die Lösung meines Rätsels sehr!