Codesys V3.5 Modbus Master -> Real senden

Kayle

Level-1
Beiträge
161
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
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 ?

modbus.JPG

Gruß Kay
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
Codesys.jpg
 
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
 
Du kannst den Inhalt eines oder mehreren REAL´s als WORD übertragen wenn du auf die Daten über UNION abgreifst:

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

Ich stand genau vor dem selbigen Problem.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

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

Code:
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
 
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
 
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 :)

modbus.JPG

Gruß Kay
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Hallo Markus,

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

pymodbus.PNG

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

Gruß Kay
 
Zurück
Oben