Step 7 2 Register INT in Real umwandeln PAC3200

onename

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

Ich habe folgendes Problem. Ich lese mit einer S7-400 via Remote IO(IM155 ST) ein PAC3200 über Modbus RTU aus.
Die Werte werden in einem FB im STAT Bereich in einen Array abgefüllt.
Nun ergeben jeweils 2 Register einen float Wert. Ich habe das Ganze mit Schieben des ersten Registers probiert. Ich bekomme zwar einen Wert heraus, zum Beispiel bei der Frequenz von 50.0, ändert sich dieser aber z.B. auf 49.98, gibt mit die Funktion 49.75 aus. Etwas dazwischen gibt es nicht.

Funktion:
L #IN_WORD_1
T #TMP_1_Real

L #TMP_1_Real
SLD 16
T #TMP_2_Real

L #IN_WORD_2
T #TMP_3_Real

L #TMP_2_Real
L #TMP_3_Real
+R
T #OUT_Real

Habt ihr einen Lösungsansatz, damit ich den Wert genauer bekomme?
Da ich das ganze in einem FB erstelle, ist ein Laden/Transferieren absolut, leider nicht gewünscht. (Wenn ich es zu Testzwecken mache, um die Zahl zu kontrollieren, dann funktionert es schon mit Laden/Transferieren).

Danke für eure Hilfe

Grüsse

onename
 
Mit 400 und AWL fallen mir zwei Varianten ein..
Code:
//Variante 1 - Bitschieben (geht auch in KOP/FUP)
L	#IN_WORD_1	//WORD_1 in AKKU1 laden
SLD	16		//Bits um 16 nach links um Platz für WORD_2 zu schaffen
L	#IN_WORD_2	//WORD_2 in AKKU1 laden (verschobenes WORD_1 ist jetzt in AKKU2)
OD			//AKKU1 und AKKU2 logisch Oder-verknüpfen
T    	#OUT		//Ergebnis


//Variante 2 - Registeradressierung (AWL)
LAR1	P#TMP_1_Real	//Adresse des TMP_1_Real in Adressregister 1 laden
L	#IN_WORD_1	//WORD_1 auf Byte 0/1 kopieren 
L	LW[AR1,P#0.0]
L	#IN_WORD_2	//WORD_2 auf Byte 2/3 kopieren 
T	LW[AR1,P#2.0]


L    #TMP_1_Real	//Ergebnis
T    #OUT
Kann sein dass du noch die WORDs noch in der Reihenfolge tauschen musst.
 
Zuletzt bearbeitet:
Zurück
Oben