Seite 2 von 2

Re: Abfrage Wechselrichter

Verfasst: 03.05.2023 13:38
von SMaag
Modbus lässt sich kinderleicht mit PB umsetzen (hab ich vor ein paar Jahren gemacht), da braucht's kein Pascal Geraffel.
Ich hab es mal kurz angefangen und wieder aufgegeben, da man aus den diversen Codes, die ich gefunden habe die Essenz nicht rauslesen kann.
Man muss sich wohl zuerst mit den ModBus Spezifikationen beschäftigen - das hab ich bisher noch nicht gemacht.

Was bedeuted "kinderleicht"? Ein einfacher Register-Read auf einen Slave oder die Komplette Umsetzung von Modbus Master und Slave, so dass ich einen Datenaustausch in beide Richtungen mit SPS-CPU's hinbekomme (d.h. die SPS lese- und Schreibbefehle auf den PC ausführen kann)!

" da braucht's kein Pascal Geraffel."
ja, das braucht's nicht! Aber dort ist es eben für Industriezwecke komplett umgesetzt (aber im Detail schwer zu verstehen)!
Leider ist Pascal (wie Delphi oder Lazarus) mittlerweile extrem komplex.
Nikolaus Wirth hat selbst gesagt, dass man Programmiersprachen mit viel weniger Komplexität braucht - und deshalb Oberon entwickelt, was weit weniger komplex ist!

PureBasic bietet genau die niedrige Komplexität von der Wirth spricht, so dass eine Person theoretisch in der Lage ist, das ganze System zu verstehen (pratkisch ist das bei PB Fred).
Ich habe lange darüber gebrütet, meine Projekte mit Lazarus oder PureBasic umzusezen. Letzlich aus vielfältigen Gründen für PureBasic entschieden.

... aber ganz ehrlich: das ist jetzt hier voll die Anfängerfrage, oder?
ja, sieht nach Anfängerfrage aus! Ist es aber in der Umsetzung leider nicht!

Re: Abfrage Wechselrichter

Verfasst: 03.05.2023 17:10
von mk-soft
Modbus/TCP ist wirklich easy. Ich such dir was raus

Re: Abfrage Wechselrichter

Verfasst: 03.05.2023 20:51
von HeX0R
Ich hatte keinen Master gebraucht, nur einen Client, der unterstützte aber alles was Modbus so zu bieten hat.
Read/Write von Holding Register, Analog Input Registern (dann natürlich nur lesen), Coils, exception Handling,...

Es war zwar "nur" Modbus RTU, aber TCP ist quasi nix anderes als ein kleiner Prefix vor dem RTU Packet, und natürlich Sockets dann anstatt COM.
Hatte TCP damals sogar optional eingebunden, aber mangels Devices nie ausprobiert.

Kann Dir aber leider nichts davon zukommen lassen, das ganze war als Plugin-DLL konzipiert für ein anderes Projekt von mir.
So nutzt Dir das nicht viel.

Ach ja, wenn Du die Spezifikationen suchst, das hier ist sehr praktisch:
https://www.simplymodbus.ca/index.html

Und wenn Du einen Mastersimulator brauchst, kannst Du z.B. das hier nehmen:
https://forumautomation.com/t/free-modb ... lator/5649

Bei uns in der Firma wird sehr viel Modbus genutzt, ganz einfach weil es ein Protokoll mit sehr kleinen Paketen ist und es sich auf das wesentliche konzentriert.
Gibt fast nix schnelleres.

[Edit]
Ich war nicht ganz auf der Höhe gestern, tatsächlich müsstest Du überall in meinem Text "Master" und "Client" tauschen :freak:
Der, der Register anfrägt ist natürlich der Master, und das ist was ich erstellt hatte.

Re: Abfrage Wechselrichter

Verfasst: 07.05.2023 13:59
von SMaag
@HexOr
Danke für die Info, werd mich nochmals damit beschäftigen und das dann auch veröffentlichen.
Wird dann Teil des Frameworks für Purebasic, das ich vor einiger Zeit angefangen habe.

Re: Abfrage Wechselrichter

Verfasst: 07.05.2023 20:47
von mk-soft
All word are Hi Lo byte Notation. Use bswap16

Code: Alles auswählen

;- Struktur Modbus Query und Response 

Structure udtQuery
  TransactionID.w
  ProtocolID.w
  DataLen.w
  UnitID.a
  Functioncode.a
  Register.w
  Count.w
  ByteCount.a
  wData.w[128]
EndStructure

Structure udtResponse
  TransactionID.w
  ProtocolID.w
  DataLen.w
  UnitID.a
  Functioncode.a
  ByteCount.a
  wData.w[128]
EndStructure

Re: Abfrage Wechselrichter

Verfasst: 07.05.2023 23:11
von HeX0R
Hier noch eine Checksummenberechnung für Modbus RTU, einfach den Buffer und die Länge übergeben:

Code: Alles auswählen

#CRC16POLY = $A001
Procedure CRC16(*MEMStart.BYTE, L)                                                      ;Modbus uses CRC16 to check integrity of the data (when in RS232 mode!)
	Protected P, k, MyCRC = $FFFF
	;
	While L
		P = *MEMStart\b & $FF
		For k = 1 To 8
			If (P ! MyCRC) & 1 = 1
				MyCRC >> 1
				MyCRC ! #CRC16POLY
				MyCRC & $FFFF
			Else
				MyCRC >> 1
			EndIf
			P >> 1
		Next
		*MEMStart + 1
		L - 1
	Wend

	ProcedureReturn MyCRC
EndProcedure

Re: Abfrage Wechselrichter

Verfasst: 07.05.2023 23:24
von mk-soft
Für Modbus/TCP wird die CRC nicht benötigt. Ist entfernt im Protokoll, da diese vom TCP/IP erledigt wird

Re: Abfrage Wechselrichter

Verfasst: 08.05.2023 19:20
von HeX0R
ähm ja, daher stand da ja auch Modbus RTU