# Beckhoff und KSB Modbus-RTU-Modul PumpDrive 2



## JarJarBinks (23 Januar 2019)

Hallo,

ich muss mit einer Beckhoff Steuerung KSB Pumpen auslesen und ansteuern.
Das Auslesen funktioniert und bei den KSB Calio sind die Werte auch plausiebel.
Beim Pumpdrive 2 werden allerdings 2 Register (DWORD) ausgelesen
und die Werte sind alles andere als plausibel.

Auch mit einem Modbus Scanner der nicht von KSB ist kommen nur
Werte die unplausibel sind.
Beim KSB Modbus Tool trage ich Float ein und dort sind die Werte plausibel.

Wer kann helfen.

Danke im vorraus


----------



## Thruser (23 Januar 2019)

Hallo,


JarJarBinks schrieb:


> Beim Pumpdrive 2 werden allerdings 2 Register (DWORD) ausgelesen
> und die Werte sind alles andere als plausibel.



vertausch mal die beiden Register/Wörter. 

Da der 32 Bit Wert in zwei 16 Bit Werte aufgeteilt wird muß man schauen in welchem Regiser die oberen und in welchem die unteren 16 Bit gelandet sind.

Gruß


----------



## JarJarBinks (23 Januar 2019)

Hab ich alles ausprobiert, wird DWORD gelesen, Register getauscht und
dann in verschiedene Werte umgewandelt (Real, USINT, UDINT .... )
Ohne Erfolg.
Bei einem Modbus Scanner zeigt er ja auch die einzelnen Register.


----------



## Thruser (23 Januar 2019)

Könntest Du mal Beispielwerte posten? Am besten die Register als int oder hex Wert und welcher  float32 Wert das sein soll, falls Du da konstante Werte auslesen kannst.


----------



## oliver.tonn (23 Januar 2019)

Vielleicht reicht ja auch bei beiden Registern das High und das Low Byte zu tauschen, oder beides, also Register tauschen und in diesen High Byte und Low Byte.


----------



## JarJarBinks (23 Januar 2019)

oliver.tonn schrieb:


> Vielleicht reicht ja auch bei beiden Registern das High und das Low Byte zu tauschen, oder beides, also Register tauschen und in diesen High Byte und Low Byte.


Das hab ich noch nicht probiert.


----------



## B3nutz3rname (23 Januar 2019)

JarJarBinks schrieb:


> Das hab ich noch nicht probiert.



Probiers über ModbusPoll, hier kannst du relativ einfach die Datentypen umstellen inkl. Byte oder Word Swap.
Register Offset +/- 1 könnte auch noch sein.

Gruß


----------



## Fireman_Frank (24 Januar 2019)

Ich hab neulich Pumpdrive 2 via Profinet angebunden. Da gab es keine 32-Bit Werte. Bei den Eingangswerten kommen erst 16 Statusbits, dann eine Prozesswertrückmeldung als int (16 Bit), und dann zwei Status-Bytes. Bei den Ausgangswerten kommen zuerst 8 Steuerbits, dann zwei Steuerbytes, und dann der Sollwert wieder als int. Vielleicht mußt du deine DWORD entsprechend auseinanderziehen?


----------



## JarJarBinks (2 Februar 2019)

@Fireman Frank
So etwas hab ich befürchtet, den ihr eigenes Modbus Tool wandelt es warscheinlich intern um.
Mit Modbus Poll bekomm ich dann halt für mich nicht sinnvolle Werte.
Woher hast du die Info der Zusammensetzung der Eingangs und Ausgangswerte?
Danke


----------



## B3nutz3rname (3 Februar 2019)

Hast du eine Bedienungsanleitung bzw. Eine Datenpunktliste mit Registeradressen, Datentypen und Einheiten. Über Modbus Poll bekommst du nur unsinnige Werte?


----------



## Fireman_Frank (4 Februar 2019)

Meine Daten habe ich aus dem Handbuch, beziehen sich aber wie schon geschrieben auf Profinet. Bei Bedarf leite ich das Handbuch aber gerne weiter.


----------



## JarJarBinks (13 Februar 2019)

Hallo,
Problem gelöst.

Punkt 1

Das DWORD ( Float ) muss gemäß IEEE754 in Real umgewandelt werden,
mit DWORD_TO_REAL funktioniert das nicht.

Beckhoff macht das So:

(* von DWORD ==> REAL *)
pt := ADR(dwDwordValue);
rMeinRealValue:=pt^;


(* von REAL==> DWORD *)
pt01:= ADR(rRealValue);
dwMeinDWORD:= pt01^;

Punkt 2

High und Low Byte muss getauscht werden

Mach ich mit ROL(16, XXX)


Was ein Kack, ehrlich.
Vielen Dank für die Hilfe


----------



## PN/DP (14 Februar 2019)

JarJarBinks schrieb:


> Das DWORD ( Float ) muss gemäß IEEE754 in Real umgewandelt werden,
> mit DWORD_TO_REAL funktioniert das nicht.
> 
> Beckhoff macht das So:
> ...


Daß in Codesys-Dialekten bei DWORD_TO_REAL und REAL_TO_DWORD nicht das Bitmuster 1:1 übernommen wird sondern unerwünscht konvertiert wird, hatte ich Dir schon vor 2 Jahren geschrieben. Bei Codesys 3 und Twincat 3 braucht man für das korrekte Kopieren des Bitmusters zwischen DWORD <---> REAL keine Pointer mehr, sondern kann UNION verwenden.




JarJarBinks schrieb:


> High und Low Byte muss getauscht werden
> 
> Mach ich mit ROL(16, XXX)


Damit tauschst Du nicht Bytes sondern H- und L-Word - ich denke das meintest Du auch.

Harald


----------



## JarJarBinks (15 Februar 2019)

@Harald
Danke, hatte ich damals nicht so wargenommen.
Und du hast auch recht, Meine High und Low Word.

Und noch ein kleiner Fehler von mir, tausche erst High und Low Word und wandle dann in Real um.

 Danke


----------

