# Bitte um Hilfe: Libnodave C# Real-Wert in Datenbaustein von S7 schreiben



## SPS_Michael (8 April 2009)

Hallo

Erst einmal der Hintergrund:
Ich besitze eine Homematic CCU (Hausautomatisierung über Funk).
Die Zustände diverser Sensoren/Aktoren kann ich mittels eines C# Programms über TCPIP auslesen (Das Originalprogramm stammt von A.Krypthul aus dem FHZ-Board -- Vielen Dank dafür) - Dieses Progamm habe ich für meine Zwecke angepasst und funktioniert - Wobei ich erwähnen sollte das ich vorher nie etwas wit C# zu tun hatte, und das Programm mit "learning by doing" angepasst habe.

Nun möchte ich die ausgelesenen Homematic-Daten mittels Libnodave
in einen Datenbaustein meiner S7 übertragen.

Ich habe bereits die libnodave.net.cs in mein Programm importiert und erfolgreich eine Verbindung zu meiner S7 aufgebaut.
(Verbindung über TCPIP mit CP343-1)
Das auslesen von Merker-Bytes und Real-Werten (Floating) habe ich anhand der Libnodave C#-Beispiele nachvollzogen und Funktioniert. 

Mein Problem ist nun Folgendes:
1. Blutiger Anfänger mit C# (und allen anderen Hochsprachen)-wie gesagt
2. Ich möchte den Inhalt einer Text-Box (z.B textBox2.Text="19,70")
in den Datenbaustein DB100.DBD0 schreiben (Wobei dieser als Real       definiert ist (4Bytes).

Ich habe es bereits mit dem  dc.writeBytes befehl probiert:

res = dc.writeBytes(libnodave.daveDB, 100, 0, 4, XXXX);

-erhalte jedoch in meinem Datenbaustein nur unsinnige Werte.

Ich vermute (nach durchlesen der Libnodave-Hilfe) das ich den Realwert, den ich schreiben möchte (hier mit XXXX dargestellt)in 4 Bytes zerlegen muß, und diese dann anschließend noch vertauschen muß (Low-Highbyte), bevor man diese dann an die S7 senden kann.
- und schätzungsweise vorher noch den String von textBox2.Text
in einen Zahlenwert wandeln muss.

-Wobei genau das mein Problem ist, das ich ja von C# keine wirkliche Ahnung habe, ich es aber benutzen muß, da es für meine Homematic CCU nur ein Programm-Modul in c# gibt.

Könnte jemand der C# kann mir ein Codebeispiel posten ???

Gruß
Michael


----------



## Rainer Hönle (8 April 2009)

Die Byteorder zwischen PC und SPS ist unterschiedlich. Wurde die Konvertierung bzw. Drehung vorgenommen?


----------



## SPS_Michael (8 April 2009)

Rainer Hönle schrieb:


> Die Byteorder zwischen PC und SPS ist unterschiedlich. Wurde die Konvertierung bzw. Drehung vorgenommen?


Nein wurde nicht - Ich weiß ja nicht wie -Mein C# - Problem !


----------



## Ralle (8 April 2009)

Es gibt folgende Funktionen in libnodave:

 float  toPLCfloat(float ff);
 short  daveSwapIed_16(short ff);
 int  daveSwapIed_32(int ff);

Die sollten das machen.

Hier noch ein Beitrag zum Thema: http://www.sps-forum.de/showthread.php?t=5485&highlight=float


----------



## SPS_Michael (8 April 2009)

Ralle schrieb:


> Es gibt folgende Funktionen in libnodave:
> 
> float  toPLCfloat(float ff);
> short  daveSwapIed_16(short ff);
> ...




Hallo

Habe folgendes probiert:
C#:

float z= 0;
z = libnodave.toPLCfloat(19.7f);
dc.writeBytes(libnodave.daveDB, 1, 0, 4, BitConverter.GetBytes(z));

Problem: im DB1 DBD0(Real) steht dann -6.353337e-023 und nicht 19.7 !

Hat jemand eine Idee was ich falsch mache ?

-------Nachtrag------

  jetzt funktionierts - hatte noch ein Probem in der S7 ! (Falls jemand mal das selbe Problem hat)



Vielen Dank nochmal an Ralle fürs "auf die Sprünge helfen".


Michael


----------



## Tonfilm (8 April 2011)

Hallo SPS_Michael,
ich habe exakt das gleiche Problem mit einer SIMATIC S7-1200.
Wenn ich mittels LibNoDave einen 'normalen' Float-Wert (z.B. 30.1) in DB1.DBD46 (als Datentyp 'Real' im DB1 angelegt) schreibe, sehe ich in der Beobachtungsliste des "TIA-Portals 10.5" (vergleichbar mit Step 7) einen sehr kleinen Wert -?.???????e-023.

Du schreibst als Nachtrag:
"jetzt funktionierts - hatte noch ein Probem in der S7 ! (Falls jemand mal das selbe Problem hat)"

WELCHES PROBLEM HATTEST DU IN DER SPS ???

Kannst Du mir da mal "auf die Sprünge helfen" ?

Roland


----------



## Bensen83 (15 August 2011)

*woher libnodave*

Hey leute, wo bekomme ich das Libnodave bzw. die datei, die ich in c# einbinden kann? und wo die beispiele?


----------



## MW (16 August 2011)

Bensen83 schrieb:


> Hey leute, wo bekomme ich das Libnodave bzw. die datei, die ich in c# einbinden kann? und wo die beispiele?



versuchs mal da http://sourceforge.net/projects/libnodave/

Beispiele sind da auch dabei, ansonsten gibts hier im Forum auch einige Codeauschnitte (Suchfunktion nutzen)


----------



## Jochen Kühner (16 August 2011)

Bensen83 schrieb:


> Hey leute, wo bekomme ich das Libnodave bzw. die datei, die ich in c# einbinden kann? und wo die beispiele?



Libnodave bekommst du hier:
http://libnodave.sourceforge.net/

Beispiele sind dabei!

Kannst aber auch 

S7Net Probieren:
http://s7net.codeplex.com/ (auch Beispiele dabei)

oder 

SiemensPLCToolBoxLib:
http://siemensplctoolboxlib.codeplex.com/ (Auch viele Beispiele dabei)
(nutzt libnodave)


----------



## tomtom-do (24 September 2013)

Hallo,
Bin neu hier im Forum und möchte gerne diese spannende Thema wieder aufgreifen.

Haben eine Homematic CCU1 und eine S7-300 mir CP Baugruppe.
S7 programmieren kann ich gut aber an der Kopplung beider Systeme mit C# hapert es.

Zudem würde mich mal interessieren welches Programm SPS_Michael meint zum Auslesen der CCU.

Oder gibt es da heute schon ein All-In-One programm?

Gruß Thomas


----------

