Hallo,
hier nun endlich die benötigten Infos.
die Programmierung mit Real-Zahlen sieht so aus:
i := (i + 1) MOD Zyklen;
MW := MW + (Rohwert - buffer[i]) / INT_TO_REAL(Zyklen);
buffer[i] := Rohwert;
wobei diese Befehle nur einmal pro Bausteinaufruf bearbeitet werden.
Dann habe ich das auf REAL2 umgesetzt:
i:= (i + 1) MOD Zyklen;
MW_Double:= R2_ADD2(X:= MW_Double, Y:= R2_MUL(X:= (R2_ADD2(X:= Rohwert_Double, Y:= R2_MUL(X:= buffer[i], Y:= -1))), Y:= Eins_Zyklen));
buffer[i]:= Rohwert_Double;
. Das Ergebnis ist in beiden fällen identisch, auch der *.R1 Anteil bleibt 0.
Die “fehlerfreie” Variante wäre:
FOR k:= 0 TO 3599 DO
STD_MW_neu:= STD_MW_neu + STD_buffer[k] / 3600;
END_FOR;
und das dauert zu lange.
Inzwischen habe ich mit den Funktionen von REAL2 etwas experimentiert und habe ein kleines Testprojekt aufgesetzt. In der Doku steht:
“Möchte man bis zu Mehreren Mwh (Megawattstunden) an Gesamtverbrauch Aufsummieren und dabei eine kleinste Leistung von 1mW (Milliwatt) im Abstand von 10ms Messen und berücksichtigen, so benötigt man eine Auflösung von 3.6 * 10^7 (entspricht 10MWs) und dabei würde man 1 * 10^-5 Ws aufaddieren wollen.
Um dies zu bewerkstelligen benötigt man eine Auflösung von 12 Stellen.”
Also habe ich folgendes programmiert:
CALL “R2_SET”
X :=1.0 E-5
RET_VAL:=“Test”.Eingang1
CALL "R2_SET"
X :=3.6 E7
RET_VAL:="Test".Eingang2
CALL "R2_ADD2"
X :="Test".Ergebnis
Y :="Test".Eingang2
RET_VAL:="Test".Ergebnis
und habe das im OB1 zyklisch mit 1 ms laufen lassen. Das läuft jetzt schon 48 Stunden. Dann hätte eigentlich der Ausgangswert sich um 172.800.000, also sichtbar verändern müssen. Aber der ausgang steht immer noch bei RX=3.6 E7 und R1=0.
Was habe ich dabei falsch gemacht ?
Danke und Gruß