Suchergebnisse
Suchergebnisse 1-24 von insgesamt 24.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
-
Hallo Leute, ich bin gerade dabei die Werte meines Photovoltaik-Wechselrichters per Modbus TPC auszulesen. Mit dem entsprechenden Nu-Get Paket (easyModbus) geht das auch relativ einfach: VB.NET-Quellcode (44 Zeilen) Mit ModClient.ReadHoldingRegisters(start,length) lese ich Integerwerte pro Register aus. In der Tabelle anbei sieht man einige Registeradressen und dann den Datentyp und Quantity. Leider habe ich keinen Schimmer wie ich die echten Werte (Integer, Double, Long, String) rausbekomme Mö…
-
Vielen Dank für die vielen Antworten. Leider habe ich keine Ahnung welcher Wert pro Register drin stehen sollte. Zudem habe ich festgestellt, dass beim ersten Aufruf von ModClient.ReadHoldingRegisters einmal nur Nullen übermittelt werden. Beim zweiten Aufruf eine Fehlermeldung und beim Dritten Aufruf dann Werte (siehe Screenshots - Fehlermeldung auf dem Button). Ich bin mir aber gar nicht sicher, ob diese Werte dann noch vom Modbus kommen oder einfach nur Fehler sind (obwohl die Verbindung immer…
-
Hallo Leute, ich habe nun diese Modbus-Sache wieder aufgegriffen und mir ein .NET Plugin dafür zugelegt. Da kann ich die Abfragen auch einfach durchführen und erhalte die gewünschten Werte. Bei Werten mit nur einer Registerstelle ist das Auslesen der INT16 Daten sehr einfach. Bei UINT32 und INT32 und UINT 16 hat die .NET Komponente sogar eigene Konvertierungsfunktionen wo ich einfach beide Registerwerte übermittle und dann den "zusammengebastelten" Wert erhalten. So weit so gut. Nun gibt es auch…
-
@VaporiZed Zitat: „Wie wandle ich die einzelnen Werte dann in einen String? Entweder verstehe ich die Frage nicht oder die Antwort lautet einfach DerWert.ToString“ Laut Schnittstellendefinition ist in den 15 Werten (Character String) die Wechselrichterbezeichnung enthalten. Wenn ich das mit chrW(wert) umwandle, dann kommen chinesische Zeichen raus. Genauso bei der Seriennummer (Adresse 30015 und Länge 10 Zeichen). Diese SHORT (INT16) Werte umgewandelt ergeben nix lesbares. Das mit den Bits werde…
-
@BitBrösel Vielen Dank, Du bist der Beste. Auf das wäre ich nie gekommen. Das US2N00-001TK-L1M hatte ich auch schon irgendwie mal rausbekommen, aber konnte es nicht zuordnen.
-
@BitBrösel Mit Dim res As String = System.Text.Encoding.Default.GetString(l.ToArray()) bekomme ich den String in die Variable. Soweit passt das. Nun habe ich aber ein Problem mit dem Encoding dieses Strings. Beispiel: VB.NET-Quellcode (4 Zeilen) Dann zeigt er mir alles nach "res" nicht an. Ich vermute etwas mit dem Textencoding das nicht zusammenpasst. Habs auch mit UTF8 statt Default probiert, keine Änderung. EDIT: Habe es herausgefunden. Die Funktion oben gibt leider 32 Zeichen zurück, obwohl …
-
@BitBrösel Habe es jetzt so gemacht: VB.NET-Quellcode (10 Zeilen) War wohl ein "Nothing" im String schuld. Aber so geht das für mich und ist unabhängig von der Stringlänge. Danke für Deine Hilfe.
-
@BitBrösel Vielen lieben Dank für Deine Hilfe hier zu dieser Frage. Soweit funktioniert alles was ich mir im ersten Schritt vorgenommen habe. Ich kann vom Wechselrichter wichtige Daten über "Read Holding Registers" abfragen. Dazu verwende ich die .NET DLL "WSMBT". Die Verwendung ist relativ einfach. Hier ein vereinfachter Code um die Funktion zu beschreiben: VB.NET-Quellcode (5 Zeilen) Strings und Int32 und alle anderen Datentypen konnte ich auch auslesen. Vielen Dank dafür. Nun geht es im zweit…
-
@BitBrösel Zitat: „Eine Frage habe ich noch. Dieser Inverter ist sicherlich ein Slave oder?“ Die Konfiguration sieht so aus: Auf dem Hautpwechselrichter (Modbus ID 2) steckt ein WLAN Dongle (Modbus ID 0) und der zweite Wechselrichter hat (Modbus ID 3). Mein Rechner ist Master und die Zielgeräte sind Slave. Die 34 Optimierer sind auf Wechselrichter zwei (Modbus ID 3) installiert. Zitat: „Morgen Nachmittag schaue ich weiter, gucke mir dann mal das hier genauer an:modbus.org/docs/Modbus_Applicati…
-
@BitBrösel Habe da etwas gefunden für Funktionscode 65. Das würde sich mit Kapitel 6.3.7.1.1 der Schnittstellenbeschreibung decken. docs.osisoft.com/bundle/pi-int…age/function-code-65.html Zitat: „ Some PLC's are able to understand function code 65, which is a non-standard Modbus function code. One type of PLC that understands function code 65 is called an HTMUX box. If such a PLC receives function code 65, it knows that a 4-byte floating point should be returned. Each register that can be read …
-
@BitBrösel Ich habe etwas interessantes gefunden um das Rad nicht zweimal erfinden zu müssen. Damit kann ich schon normale "HoldingRegister" auslesen. Es läuft mit Sockets und nur mit .NET Boardmitteln. Vielleicht kann man das als Basis für die Funktion 65 (0x41) verwenden. Ich bin leider zu wenig schlau um das hinzubekommen ;-).
-
@BitBrösel Vielen Dank für Deinen Einsatz. Ich habe das so verstanden (kann mich aber auch irren). 1. Es wird ein Befehl 65 (0x41) mit 4 Bytes gesendet. 2. Eine definierte Zeitspanne warten (2 Sekunden laut Huawei) 3. Response auslesen Und das irgendwie ein paar mal hin und her. Eine Echte "Datei" wird zwar nicht gesendet, aber ein paar Daten über den Socket (das nennen die Dann fileupload). Ich habe auch schon kontakt mit dem Huawei-Support aufgenommen. Auch der Deutschland-Huawei-Vertreter ist…
-
@BitBrösel Habe folgenden Code dazu erstellt. Aber es kommt keine Rückmeldung vom Inverter: VB.NET-Quellcode (69 Zeilen) Alternativ habe ich auch noch das versucht: VB.NET-Quellcode (1 Zeile) Fehlermeldung bei Zeile 60: Zitat: „Verbinde mit Server OK Sende Daten OK Empfange Daten Ausnahme ausgelöst: "System.Net.Sockets.SocketException" in System.dllEin Ausnahmefehler des Typs "System.Net.Sockets.SocketException" ist in System.dll aufgetreten. Ein Verbindungsversuch ist fehlgeschlagen, da die Geg…
-
Das hatte ich auch noch versucht (ging irgendwie in meinem Post oben unter): VB.NET-Quellcode (9 Zeilen) Aber ja, Du könnstes Recht haben. Da gibts immer high und low. Werde ich morgen gleich mal ausprobieren.
-
@BitBrösel Habe mich bis halb drei in der Früh damit gespielt. Ich erhalte nun Rückmeldungen, mit denen kann ich aber nichts anfangen. Womöglich passt das Datenpaket noch nicht. Ich hänge mal den kompletten Code ran. Habe alles etwas gekürzt um es übersichtlicher zu machen. Die original "Read Holding Register" Funktion ist auch noch dabei (die funktioniert ja), damit man dies 1:1 vergleichen kann. Im Anhang habe ich Screenshots gemacht mit welchen Eingabewerte ich welche Ausgabewerte erhalten ha…
-
@BitBrösel Hier die Antwort (siehe Screenshot). Bei jeder weiteren Anfrage erhöht sich der Protocol identifier beim senden und empfangen (Frame 2). Das mitschicken von Customdata (egal welchen Wert diese haben) brachte das selbe Ergebnis.
-
@BitBrösel ich war zu voreilig und du zu schnell mit der Antwort. Vergiss meine erste Antwort. Ich habe diese überarbeitet. Ich habe nur new New Byte(6) {} VB.NET-Quellcode (13 Zeilen) durch New Byte(6 + dataLenght) {} ersetzt, da obiger Code keine Rückmeldung brachte. Die Datenlänge ist ja alles nachkommende. VB.NET-Quellcode (13 Zeilen)
-
@BitBrösel Zitat: „Ah ja, da war ein Missverständnis, daher siehe meinen letzten Post. Gedacht war schreibe den mbap, nächste Zeile schreibe den frame, dann die Antwort lesen. Edit @dive26 Weil wir im MBAP die Länge angeben, wird die Gegenseite versuchen so viele Bytes zu lesen, da du den frame nicht geschrieben hast, konnte auch nichts kommen. Kombiniere meine beiden Codes. Und probier es dann noch einmal.“ Ich steh irgendwie auf dem Schlauch und weis nicht was Du damit meinst. Was solle ich wa…
-
@BitBrösel Danke für Deinen ergänzten Code. Auch hier ergibt sich das selbe Ergebnis (siehe Screenshot). In der Funktion GetMBAP habe ich Deinen Code rauskommentiert und den funktionierenden reingeschrieben. Mit Deiner Zeile gibt es keine Socket-Rückmeldung. VB.NET-Quellcode (14 Zeilen) Ich finde es super, dass Du so viel Energie in die Sache steckts. Aber ich möchte das auch nicht überstrapazieren. Ich würde mal sagen wir lassen ein paar Tage vergehen. Vielleicht bekomme ich inzwischen von Huaw…
-
@BitBrösel Wenn ich den anderen Wechselrichter (mit Modbus ID 2) anspreche, der KEINE Optimierer hat, Dann erhalte ich 00 00 00 00 00 03 02 80 04 zurück. Wenn ich den einen Wechselrichter (mit Modbus ID 3) anspreche, der Optimierer hat, Dann erhalte ich 00 00 00 00 00 03 03 80 01 zurück. Die drei (oder zwei) an 7. Stelle ist die übergebene Modbus ID. Also wohl doch nur Zufall ;-).
-
@BitBröselnull Huawei hat nach langem hin- und her zumindest die Modbus-Beschreibung geliefert. Ich habe mal "klein" angefangen und eine normale Registerabfrage durchgeführt. Zur Erklärung des Screenshots: VB.NET-Quellcode (27 Zeilen) Request: * Byte 0,1,2 und 3: individuell - werden beim Response 1:1 zurückgegeben. * Byte 4 und 5 sind die Länge des nachfolgenden Datensatzes (in diesem Fall 6 Bytes) * Byte 6 ist die Modbus-Adresse (in meinem Fall 3) * Byte 7 ist der Modbus Funktionscode (3 = nor…
-
@BitBrösel Einen halben Schritt bin ich weiter und habe jetzt die Funktionsweise verstanden. In der Modbus-Beschreibung (oben bereits verlinkt - ist öffentlich zugängig, also auch von Huawei ok) auf Seite 91 oben ist das Schema abgebildet. 1. Man sendet ein Datenpaket (Tabelle 6-15) mit Funktionscode 65 und SubCode 5 und erhält dann ein Response-Datenpaket wie in Tabelle 6-16 beschrieben zurück. Das funktioniert bereits ohne Fehlermeldungen (bisher hatten wir beide immer den Wert 83 - was Fehler…
-
@BitBrösel Nach einigem Schriftverkehr mit dem Huawei-Support bin ich nun endlich soweit, dass ich die gewünschten Daten bekomme. XML-Quellcode (8 Zeilen) Funktion: Die erste Anfrage beginnt den Abruf der Daten. Als Response kommt die Datenlänge zurück. Dann ruft man in einer Schleife alle Datenframes ab (oben ist testweise nur ein Frame abgebildet). Am Ende gibt es eine abschließende "Abschlussmeldung". Der zweite Block muss mehrmals abgerufen werden, bis alle Daten heruntergeladen wurden. Wie …
-
Nun wie besprochen der komplette Code. Ich habe das Modul soweit umgebaut, dass es die Daten der Modbus-Spezialabfrage in einem Byte-Array übergibt (bei Fehler Nothing). Abragen: FileUpload Optimierer Infos und Optimierer Real-time-Data und zusätzlich noch eine ganz normale Modbus-Register-Abfrage. Huawei_Modbus_GetOptimizerSysInfo = Funktioniert so einwandfrei und übergibt bei 34 Optimierern 15 Datenframes. Huawei_Modbus_GetOptimizerRealtime = Funktioniert ebenfalls, nur werden hier 5-Minutige …