Solar Wechselrichter/Hex Befehle über Com1: senden,empfangen

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Franky2000
Beiträge: 1
Registriert: 31.10.2011 12:05

Solar Wechselrichter/Hex Befehle über Com1: senden,empfangen

Beitrag von Franky2000 »

Hallo,

bin neu im Forum und möchte mich gerne kurz vorstellen.

Ich heiße Frank und bin 42 Jahre alt, wohne in Wuppertal.

Meine Hobby's wie sollte es anders sein, Computer und allgemeine Elektronik.

So nun zur Sache:

Ich möchte von einen Solar Wechselrichter (Soladin 600 von Mastervolt.de) die Daten einlesen.
Also Status, Volt, Amp., usw.

Leider komme ich nicht mit diesen Hexadezimalen senden,empfangen, auswerten nicht zurecht.

In der Procedure Soladin600Beschreibung habe ich alles zusammen getragen was ich im Netz finden konnte, da der Hersteller sich dazu nicht äußern möchte.

Vielleicht könntet Ihr mir ein wenig unter die Arme greifen.

Besten Dank im vorraus!
Frank

Code: Alles auswählen

Port$ = "COM1"
PortNr= 1
Laenge=1024

InBuffer$=Space(1024)
*InBuffer=@InBuffer$

String$="00000000C1000000C1"

*OutBuffer=@String
OutLaenge=9

Procedure Soladin600Beschreibung()
  
 ;Maximale Leistungsaufnahme 	 600 W 
 ;MPP-Spannung 40-125 V 
 ;Maximale Spannung 155 V 
 ;Nom.Nennstrom 8A 
 ;Net-Spannung 184-265 V 
 ;Cos phi 0,99 
 ;Europäischer Wirkungsgrad 91% 
 ;Maximale Effizienz 93% 

 ;Hardware-Schnittstelle 
 ;Obwohl Mastervolt beschreibt die Schnittstelle als RS485, ist es nicht vereinbar.  
 ;Die Schnittstelle arbeitet mit zwei Linien für jede Richtung der Kommunikation mit zwei Optokoppler im Soladin.  
 ;Eine RS232-Adapter mit der Bezeichnung PC-Link kann von Mastervolt zum Anschluss an einen PC gekauft werden. 
 ;Die Kommunikation läuft bei 9.600 bps mit 8 Datenbits und keine Parität. 
 
 ;Serielles Protokoll 
 ;Jedes Paket hat folgende gemeinsame Felder: 
 ;Die ersten 4 Bytes enthalten die Pakete Quell-und Ziel: 
 ;0x0000: 16-Bit-Zieladresse für das Paket. 
 ;0x0000: 16-Bit-Quell-Adresse für das Paket. 
 ;0x0000: 16-Bit-Befehls-ID. 
 ;Das Master-Gerät (Computer) verwendet Adresse 0x0000.  
 ;In der Sonde Befehl aus der Windows-Software werden die Quell-und Zieladressen beide auf 0x0000.  
 ;Dies könnte darauf hindeuten das Paket ist ein Broadcast-Paket für alle Nicht-Master-Geräte auf dem Bus bestimmt.  
 ;Alle Daten werden als übertragen Big-Endian (wichtigstes Byte zuerst). 
 ;0x00: Das letzte Byte eines jeden Pakets ist eine Prüfsumme.  
 ;Es ist die unteren 8 Bits der Summe aller vorherigen Bytes im Paket. 
 ;Ich habe die Antworten auf jeden Befehl aus meiner Soladin 600, Adresse 0x0011 enthalten.  
 ;Dies scheint auf die gleiche Adresse für alle Soladin 600 ist. 
 
 ;0xC1: Probe 
 ;Das erste Paket übertragen scheint eine Sonde Befehl sein.  
 ;Beachten Sie, dass die Quell-und Zieladressen beide auf 0x0000 sind. 
 
 ;TX: 00 00 00 00 C1 00 00 00 C1 

 ;RX: 00 00 11 00 C1 F3 00 00 C5
 ;Anders als die Geräte-Adresse, wird die Antwort von meinem Soladin 600 scheint keine Informationen enthalten. 
 ;In Fällen, in denen es mehr als einmal Gerät, werden sie alle, um diesen Befehl zu reagieren? 
 ;Kann ein Geräte-Adresse geändert werden? 
 
 ;0xB4: Firmware-Informationen 
 ;Liefert Informationen zur Version von der Firmware. 
 
 ;TX: 11 00 00 00 B4 00 00 00 C5 

 ;RX: 00 00 11 00 B4 F3 00 00 00 00 00 00 00 E3 00 04 01 34 06 00 00 00 00 00 00 00 00 00 00 00 DA
 ;0xE3: Firmware ID 
 ;0x0104: Firmware-Version (1,04) 
 ;0x0634: Firmware-Datum 
 
 ;0xB6: Device Stats 
 ;Gibt Statistiken über die Bedienung des Gerätes. 
 
 ;TX: 11 00 00 00 B6 00 00 00 C7 

 ;RX: 00 00 11 00 B6 F3 00 00 04 03 35 00 8A 13 F4 00 00 00 24 00 90 0B 00 1F DB BC 01 00 00 00 FD
 ;0x06: 0x0000: Flags, den normalen Betrieb in der Antwort oben 
 ;0x08: 0x0304: PV-Spannung * 10 = 77,2 V in der Antwort oben 
 ;0x0A: 0x0035: PV Stromstärke * 100 = 0,53 A 
 ;0x0C: 0x138A: Netzfrequenz * 100 = 50,02 Hz 
 ;0x0E: 0x00F4: Netzspannung = 224 V 
 ;0x10: 0x0000: Unknown 
 ;0x12: 0x0024: Grid Leistung = 36 W 
 ;0x14: 0x000B90: Total Gitter Leistung * 100 = 29,60 kWh 
 ;0x17: 0x1F: Device Temperatur = 31 ° C 
 ;0x18: 0x0001BCDB: Total Betriebszeit = 113883 Minuten 
 ;0x1C: 0x0000: Unknown 
 
 ;Flags 
 ;Flags sind Bitmap-und repräsentieren aktuelle Status des Wechselrichters.  
 ;Normaler Betrieb des Wechselrichters ist ohne Flagge gesetzt identifiziert. 
 ;0x0001: Usolar zu hoch 
 ;0x0002: Usolar zu niedrig 
 ;0x0004: No Grid 
 ;0x0008: Uac zu hoch 
 ;0x0010: Uac zu niedrig 
 ;0x0020: Fac zu hoch 
 ;0x0040: Fac zu niedrig 
 ;0x0080: Temperatur zu hoch 
 ;0x0100: Hardware-Fehler 
 ;0x0200: Ab 
 ;0x0400: Max Power 
 ;0x0800: Max. Strom 
 
 ;0xB9: Lesen Maximum Power 
 ;Gibt maximale Ausgangsleistung des Wechselrichters. 
 
 ;TX: 11 00 00 00 B9 00 00 00 CA 

; RX: 00 00 11 00 B9 F3 00 00 20 00 00 00 1B 00 21 00 22 00 00 00 E5 02 7E 48 36 00 00 00 00 00 1E
; 0x18: 0x0036: Maximale Leistung = 54 W 

; 0x97: Reset Maximum Power 
; Setzt maximale Ausgangsleistung von Befehl 0xB9 zurückgegeben. 
; TX: 11 00 00 00 97 01 00 00 A9 

; RX: 00 00 11 00 97 01 00 00 A9

; 0x9A: History-Daten 
; Der Umrichter speichert Daten (Raster Energie und Zeit) für die letzten 10 Tage.  
; Der Wechselrichter hat keine Uhr eingebaut, ein Tag ist daher als Betriebssystem Saison definiert. 

; TX: 11 00 00 00 9A 00 00 00 AB
; 0x05: 0x00: Day zu lesen.  0 - heute, von 9 bis 9 Tage vor heute. 
; RX: 00 00 11 00 9A 54 05 00 04
; 0x05: 0x54: Täglich Betriebszeit * 5 min = 420 Minuten 
; 0x06: 0x0005: Grid-Ausgang * 100 = 0,05 kWh 


EndProcedure
  
Procedure SerialOpen(PortNr,Port$,Laenge)
  
  ;#PB_SerialPort_NoHandshake     : Kein "handshaking"
  ;#PB_SerialPort_RtsHandshake    : Kein "handshaking", aber RTS wird auf 1 gesetzt
  ;#PB_SerialPort_RtsCtsHandshake : RTS/CTS
  ;#PB_SerialPort_XonXoffHandshake: Xon/Xoff

  
  If OpenSerialPort(PortNr, Port$, 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_RtsCtsHandshake, Laenge, Laenge)

    Debug "Serial Port "+Port$+" ist geöffnet."    ;MessageRequester("Information", "SerialPort ist offen")
    
  Else
  
    Debug "Serial Port "+Port$+" konnte nicht geöffnet werden!."   ;MessageRequester("Error", "Der Port: "+Port$+" konnte nicht geöffnet werden!")
    
  End
  
EndIf

EndProcedure
Procedure SerialKorrekt(PortNr)
  
  Ergebnis= IsSerialPort(PortNr)
  
  If Ergebnis <>0
    Debug "Serial Port ist gültig : "+Str(Ergebnis)
  Else
    Debug "Schnittstelle ungültig : "+Str(Ergebnis)
  EndIf
  
;Überprüft, ob die angegebene #SerialPort Nummer eine gültige und korrekt initialisierte serielle Schnittstelle ist. 

;Diese Funktion ist "kugelsicher" und kann mit jedem Wert verwendet werden. Wenn 'Ergebnis' ungleich Null ist, 
;dann ist das Objekt gültig und initialisiert, andernfalls wird Null zurückgegeben. 
;Dies ist der korrekte Weg, um sicherzugehen, dass eine serielle Schnittstelle bereit zur Benutzung ist. 

EndProcedure

Procedure SerialStatus(PortNr)
  
  Ergebnis = GetSerialPortStatus(PortNr, Attribut)

  ;Gibt den angegebenen #SerialPort Status zurück. 'Attribut' kann einer der folgenden Werte sein: 
  ;#PB_SerialPort_RI : Ermittelt den RI Signal Status (0 oder 1)
  ;#PB_SerialPort_DCD: Ermittelt den DCD Signal Status (0 oder 1)
  ;#PB_SerialPort_DSR: Ermittelt den DSR Signal Status (0 oder 1)
  ;#PB_SerialPort_CTS: Ermittelt den CTS Signal Status (0 oder 1)
  ;#PB_SerialPort_XonCharacter : Zeichen, welches für die "Xon/Xoff Handshaking Sequenz" verwendet wird (zwischen 1 und 255)
  ;#PB_SerialPort_XoffCharacter: Zeichen, welches für die "Xon/Xoff Handshaking Sequenz" verwendet wird (zwischen 1 und 255)


EndProcedure
Procedure SerialSetStatus(PortNr)
  
  SetSerialPortStatus(PortNr, Attribut, Wert)


  ;Ändert den angegebenen #SerialPort Status. 'Attribut' kann einer der folgenden Werte sein: 
  ;#PB_SerialPort_DTR: Setzt den DTR Signal Status (0 oder 1)
  ;#PB_SerialPort_RTS: Setzt den RTS Signal Status (0 oder 1)
  ;#PB_SerialPort_TXD: Setzt den TXD Signal Status (0 oder 1)
  ;#PB_SerialPort_XonCharacter : Zeichen, welches für die "Xon/Xoff Handshaking Sequenz" verwendet wird (zwischen 1 und 255). Standardwert ist $11.
  ;#PB_SerialPort_XoffCharacter: Zeichen, welches für die "Xon/Xoff Handshaking Sequenz" verwendet wird (zwischen 1 und 255). Standardwert ist $13.

  
EndProcedure

Procedure SerialRead(PortNr,*InBuffer,InLaenge)
  
  
  Ergebnis = ReadSerialPortData(PortNr, *InBuffer, InLaenge)
  
  Debug "Es wurden "+Str(Ergebnis)+" aus dem Eingangspuffer gelesen."

  ;Liest eine frei wählbare Menge an Daten vom #SerialPort'. Die Anzahl Bytes, welche aktuell gelesen wurden, 
  ;werden als 'Ergebnis' zurückgegeben. Wenn der Eingabepuffer leer war, wird diese Funktion das Programm blockieren, 
  ;bis Daten verfügbar sind. Wenn ein Lesefehler auftritt, wird die Funktion 0 zurückgeben. 

  ;Um zu überprüfen, ob Daten verfügbar sind, verwenden Sie AvailableSerialPortInput(). 
EndProcedure
Procedure SerialWrite(PortNr,*OutBuffer,OutLaenge)
  
  
  Ergebnis = WriteSerialPortData(PortNr, *OutBuffer, OutLaenge)
  Debug "Es wurden "+Str(Ergebnis)+" Bytes gesendet!"


  ;Schreibt eine frei wählbare Menge an Daten auf den #SerialPort'. 
  ;Die Anzahl Bytes, welche aktuell geschrieben wurden, werden als 'Ergebnis' zurückgegeben. 

  ;Um zu überprüfen, wie viele Daten im Ausgabepuffer verfügbar sind, verwenden Sie AvailableSerialPortOutput(). 

EndProcedure
Procedure SerialWriteString(PortNr,String$)
  
  Ergebnis = WriteSerialPortString(PortNr, String$ )        ; [, Format])

  ;Schreibt einen 'String$' auf den #SerialPort. 'Format' kann PB_Ascii, PB_UTF8 oder PB_UTF16 sein 
  ;(Standard ist PB_Ascii, siehe Unicode für weitere Informationen). 

  ;Um zu überprüfen, wie viele Daten im Ausgabepuffer verfügbar sind, verwenden Sie AvailableSerialPortOutput(). 
  
EndProcedure

Procedure SerialEigangspufferAnz(PortNr)    ;Gibt die Anzahl verbleibender Bytes im #SerialPort Eingabepuffer zurück. 
  
  Ergebnis = AvailableSerialPortInput(PortNr)
  
  Debug "Im Eingangspuffer sind nun noch : "+Str(Ergebnis)+" Bytes."
  
  ProcedureReturn Ergebnis
  
  
EndProcedure
Procedure SerialAusgangspufferAnz(PortNr)   ;Gibt die Anzahl verbleibender Bytes im #SerialPort Ausgangspuffer zurück. 
   
  Ergebnis = AvailableSerialPortOutput(PortNr)
  
  Debug "Im Ausgangspuffer sind nun noch : "+Str(Ergebnis)+" Bytes."
  
  ProcedureReturn Ergebnis
  
EndProcedure

Procedure SerialError(PortNr)
  
  
  Ergebnis = SerialPortError(PortNr)

  ;Gibt den Fehler auf dem #SerialPort zurück, wenn ReadSerialPortData(), WriteSerialPortData() oder 
  ;WriteSerialPortString() fehlschlagen. 

  ;'Ergebnis' kann eine Kombination der folgenden Werte sein: 
  ;#PB_SerialPort_RxOver: Ein Eingabepuffer Überlauf (englisch "Overflow") ist aufgetreten.
  ;                       Es ist entweder kein Platz im Eingabepuffer oder ein Zeichen wurde
  ;                       nach dem "End-of-file" (EOF; "Ende der Datei") empfangen.
  ;#PB_SerialPort_OverRun: Ein Zeichen-Puffer Überlauf ist aufgetreten.
  ;                        Das nächste Zeichen geht verloren.
  ;#PB_SerialPort_RxParity : Die Hardware stellte einen "Parity" (Parität) Fehler fest.
  ;#PB_SerialPort_Frame    : Die Hardware stellte einen "Framing" Fehler fest.
  ;#PB_SerialPort_Break    : Die Hardware stellte eine "Break" Bedingung fest.
  ;#PB_SerialPort_TxFull   : Die Applikation versuchte ein Zeichen zu senden, aber der Ausgabepuffer war voll.
  ;#PB_SerialPort_IOE      :  Ein I/O Fehler trat während der Kommunikation mit dem Gerät (englisch "device") auf.
  ;#PB_SerialPort_WaitingCTS  : Definiert, ob die Übertragung auf das zu sendende CTS (clear-To-send) Signal wartet.
  ;#PB_SerialPort_WaitingDSR  : Definiert, ob die Übertragung auf das zu sendende DSR (Data-set-ready) Signal wartet.
  ;#PB_SerialPort_WaitingRLSD : Definiert, ob die Übertragung auf das zu sendende RLSD (receive-line-signal-detect) Signal wartet.
  ;#PB_SerialPort_XoffReceived: Definiert, ob die Übertragung wartet, weil ein XOFF Zeichen empfangen wurde.
  ;#PB_SerialPort_XoffSent    : Definiert, ob die Übertragung wartet, weil ein XOFF Zeichen übertragen wurde.
  ;                             Die Übertragung hält an, wenn das XOFF Zeichen an ein System übertragen wird, welches das
  ;                             nächste Zeichen als XON annimmt, unabhängig vom aktuellen Zeichen.
  ;#PB_SerialPort_EOFSent: Definiert, ob das End-of-file (EOF) Zeichen empfangen wurde.
  
EndProcedure

Procedure SerialClose(PortNr)
  
  CloseSerialPort(PortNr)
  
EndProcedure

;PROGRAMMSTART =======================================================================================

SerialOpen(PortNr,Port$,Laenge)
SerialKorrekt(PortNr)

Debug ""
Debug *OutBuffer
Debug "Es sollen "+Str(OutLaenge)+ " Bytes in Hex gesendet werden."

SerialWrite(PortNr,*OutBuffer,OutLaenge)
SerialAusgangspufferAnz(PortNr)

Debug ""
SerialEigangspufferAnz(PortNr)  

While AvailableSerialPortInput(PortNr) > 0
  If ReadSerialPortData(PortNr, *InBuffer, 1) ; Read Byte
    Debug Buffer  
    Text$ = Text$ + Chr(*InBuffer)
    Debug Text$
    Receive = 1
  EndIf
Wend


SerialClose(PortNr)

ende:
End
[Edit]
Der Surce-Code war hinter den Tags code /code eingefügt.
Korrigiert von Falko
[/Edit]
Benutzeravatar
HeX0R
Beiträge: 2954
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Solar Wechselrichter/Hex Befehle über Com1: senden,empfa

Beitrag von HeX0R »

Hallo Frank und willkommen im Board!

Die Code-Tags müssen den Code umschliessen, ansonsten nützt das nichts, und code-Beispiele werden ziemlich unleserlich im Board.
Ausserdem scheint es du hast die ganzen Kommentare im Code durch irgendeinen Englisch-Deutsch-Übersetzer gejagt?
Es wäre wohl besser gewesen das in Englisch zu lassen, das würde man auf jeden Fall besser verstehen.
Antworten