# Codesys V3.5 Modbus Master -> Real senden



## Kayle (4 Januar 2015)

Hallo zusammen,

ich versuche einen Real Wert per MODBUS an einen Slave zu senden. Ich kann aber unter "Write Single Register" oder "Write Multiple Registers" kein REAL einstellen und somit auch kein REAL Wert mappen. Geht das überhaupt, also direkt einen REAL Wert senden ? 




Gruß Kay


----------



## wolfi-sps (5 Januar 2015)

Hallo Kay,

Du kannst nur ein Word senden und empfangen.
Nimm Dein Realwert am Sender mal zehn dann real_to_word --> am Empfänger word_to_real durch 10.
Willst Du zwei Steuerungen damit verbinden??

Wolfgang


----------



## Kayle (5 Januar 2015)

Hallo Wolfgang,

danke für Deine Antwort. Ich möchte Temperaturwerte von der einen Codesys Steuerung zur anderen schicken. Das ganze könnte ich auch über die Netzwerkvariablen machen, möchte ich aber nicht. Ich würde das gerne per Modbus machen, da ich noch nicht weiß ob die zu sendende Steuerung eine Codesys bleibt. 

Ich werde das mit real_to_word probieren. Danke.

Gruß Kay


----------



## wolfi-sps (5 Januar 2015)

Hallo Kay,

Ja, auf die Netzwerkvar wollte ich hinaus :lol:
Wenn Du eine andere Steuerung nehmen willst, kann die auch Netzwerk Var ? Sollte dann Port 1202 nutzen.
Geht halt viel einfacher.

Wolfgang


----------



## Kayle (5 Januar 2015)

Hallo Wolfgang,

die eigentliche Steuerung die ich einsetzen will ist ein reines embedded Linuxsystem ( ohne CODESYS Runtime ). Dort habe ich nicht die Möglichkeit Netzwerkvariablen einzusetzen. Ich habe gerade im CODESYS Simulator den Test mit real_to_word und word_to_real gemacht. Funktioniert tadellos. Danke für den Tip.

Gruß Kay


----------



## MarkusP (5 Januar 2015)

Ein REAL einfacher Genauigkeit benötigt zwei Register. Dazu einfach eine Variable als REAL deklarieren und über die Adresse auf den gleichen Adressbereich zweier aufeinanderfolgender Register legen. Der Empfänger muss dann lediglich den Registerinhalt entsprechend auch so interpretieren. Damit können bei Bedarf alle Datentypen (LREAL, DINT etc.) per Modbus übertragen werden.

Beispiel:


----------



## Kayle (5 Januar 2015)

Hallo,

ok das habe ich verstanden. Nur eins will mir nicht in den Sinn -> Wie übertrage ich negative Werte ? Real kann ja sowohl positiv als auch negativ.

Gruß Kay


----------



## Lars Weiß (6 Januar 2015)

Du kannst den Inhalt eines oder mehreren REAL´s als WORD übertragen wenn du auf die Daten über UNION abgreifst:


```
TYPE REALCONVERT : UNION
 rVar : REAL;
 wVar : ARRAY[0..1] OF WORD;
 END_UNION
END_TYPE
```

Ich stand genau vor dem selbigen Problem.


----------



## Kayle (6 Januar 2015)

Hallo,

danke für Eure Lösungsvorschläge. Als nicht SPS Programmierer habe ich allerdings einen anderen Weg gefunden:


```
temperatur := -8.5;
temp_1 := temperatur + 100;
temp_2 := temp_1 * 100;
temp_word := REAL_TO_WORD(temp_2);

(*####################################*)

temp_real := WORD_TO_REAL(temp_word);
temp_real_2 := temp_real / 100;
temp_real_3 := temp_real_2 - 100;
```

Ich sorge einfach dafür das ich keine negativen Werte übertragen muss. Ist vielleicht nicht elegant, funktioniert aber fürs erste.

Gruß Kay


----------



## MarkusP (6 Januar 2015)

Kayle schrieb:


> Hallo,
> 
> ok das habe ich verstanden. Nur eins will mir nicht in den Sinn -> Wie übertrage ich negative Werte ? Real kann ja sowohl positiv als auch negativ.
> 
> Gruß Kay



Wenn Du mein Beispiel genau angeschaut hast, dort ist die Temperatur negativ. (habe ich extra so gemacht)
Des Rätsel Lösung ist, dass das höchstwertige Bit als Vorzeichen interpretiert wird.
Daher gibt es z.B. auch INT und UINT, bei INT stehen nur 15 Bit für den Wert zur Verfügung, das 16. Bit ist für das
Vorzeichen.
Gruße Markus


----------



## Kayle (6 Januar 2015)

Hallo Markus,

ja Dein Beispiel habe ich gesehen und auch gleich versucht umzusetzen. Bis auf den Punkt das die Register vertauscht sind finde ich das Ergebnis gut 




Gruß Kay


----------



## MarkusP (7 Januar 2015)

Hallo Kay,

nun das ist das nächste "Problem". Man war sich leider von Anfang an (INTEL und MOTOROLA) nicht einig, welche Byteorder zu verwenden ist, also welches BYTE oder Register das erste bzw. das zweite ist. Ich möchte gar nicht wissen, wie viele Probleme sich  vermieden ließen, wenn das einheitlich wäre.
http://teaching.idallen.com/cst8281/10w/notes/110_byte_order_endian.html
Wahrscheinlich hast Du genau dieses Problem.
Fein, wenn es jetzt bei Dir läuft.

Gruß Markus


----------



## Kayle (7 Januar 2015)

Hallo Markus,

ich sende die Daten per pymodbus. In der Dokumentation finde ich:




Wenn ich von Little auf BIG umstelle dann ändert sich nur die Byte Order innerhalb der Adresse, aber nicht die "Address Order".

Gruß Kay


----------

