Float in Real für Pluggit Lüftungsgerät?

Begonnen von HopeITworks, 30. Januar 2017, 11:08:42

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

HopeITworks

Ich bekomme von meiner Pluggit Lüftungsanlage mehrere Werte in Float geliefert. Es sind jeweils 2 Registeradressen die für einen Wert benutzt werden.

Modbus Adresse 40133 und 40134 in dem Fall.

Ich lege diese als DWord ab. Jetzt muss ich allerdings die Bytes schieben. Aus Byte A B C D muss C D A B werden und danach in Real gewandelt werden. Wie mache ich das am einfachsten?

Ich habe damit leider noch keinerlei Erfahrungen, daher die wahrscheinlich recht doofe Frage  ;D

HopeITworks

Ich hab mir jetzt mal nen SCL Baustein dafür gebaut und es scheint zu funktionieren :) Die Werte sind plausibel.

Über Verbesserungsvorschläge würde ich mich sehr freuen :)

FUNCTION_BLOCK "Pluggit_Float_to_Real"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_OUTPUT
      OUT : Real;
   END_VAR

   VAR_IN_OUT
      "dword" { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DWord;
   END_VAR

   VAR_TEMP
      DWord_Temp : DWord;
      idword : DWord;
   END_VAR


BEGIN
#DWord_Temp := #dword;


#idword.%B2 := #DWord_Temp.%B0;
#idword.%B3 := #DWord_Temp.%B1;
#idword.%B0 := #DWord_Temp.%B2;
#idword.%B1 := #DWord_Temp.%B3;


#OUT := DWORD_TO_REAL(#idword);
END_FUNCTION_BLOCK

mattsches

Sieht in SCL für mich nach der einfachsten Lösung aus, ich würde den Baustein so lassen.

In AWL ginge es auch ohne Hilfsvariablen. Aber AWL mögen ja viele nicht mehr so gern, und auf 1200ern geht das eh nicht. Dennoch, der Vollständigkeit halber:


L #Eingangsvariable
TAW
TAD
TAW
T #Ausgangsvariable


TAW wechselt die Bytes 0 und 1 im Akku, TAD dreht die gesamte Reihenfolge der vier Bytes um. Damit ergibt sich dann folgender Verlauf im Akku:

A B C D (Ausgangszustand)
B A C D (1. TAW)
D C B A (TAD)
C D B A (2. TAW)

Manchmal hat die betagte AWL auch ihre Vorteile.  :)

HopeITworks

Oh das freut mich aber jetzt sehr  ;D Ich musste mir diese Lösung leider wieder hart erarbeiten, aber dafür bleibt sie hoffentlich im Kopf :)