Leistung mit array berechnen

timod79

Level-1
Beiträge
26
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ich nehme Leistungsdaten auf und speicher diese in einem Array ab zugleich nehme ich auch die Zeit auf und speicher diese in einem zweiten Array.Jetzt möchte ich die durchschnitlliche Leistung berechnen.Dazu habe ich die Algemeine Formel A=(fn + fn+1)/2 * (tn+1 - tn).
Dies hab ich als Code so umgesetzt.
Leistung:=(F[n] + F[n+1])/2
Zeit:=(T[h+1) -T[h])
FlaecheLeistung:=Leistung*Zeit
Habe Impuls vorgeschaltet der mir alle 100ms die Werte in die Arrays schreibt.I und H werden dabei immer um 1 erhöht.Bekomme aber nur komische Werte bei den Berechnungen heraus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
(*Energieoptimiert*)
IF Zaehler.CV =1 THEN
rt1 (CLK:=AN);(*Mit steigender Flanke bei Ansaugen wird Speicher auf True gesetzt*)
SP1(SET:=rt1.Q);
SP1(RESET1:=rt2.Q );(*Ausschalten unseres Impulses wenn Messung + Nachlaufzeit beendet ist*)
IF rt1.Q THEN
Leistungref:=0.0;
Leistungges:=0.0;
Laufzeit:=T#0s;
LZR:=0.0;
LVar[1]:=fileTime.dwLowDateTime;
Minwert:=1000.0;
END_IF

(*Array alle 100 ms mit Messwerten des Durchflusses füllen*)
Timer1 (IN:=SP1.Q1 AND NOT Timer2.Q,PT:=T#50ms);
Timer2 (IN:=NOT Timer1.Q,PT:=T#50ms);
ft1 (CLK:=Timer2.Q);(*Bei negativer Flanke an Ausgang von Timer 1, wird Messwert in Array geschrieben*)
IF ft1.Q THEN
MVar:=LeistungI;(*Messwert in Array schreiben*)
i:=i+1;(*Array um eins hochzählen*)
Leistungref:=leistungref+Leistung;
Maxwert:=MAX(Leistung,Maxwert);
Minwert:=MIN(Leistung,Minwert);
DTime:=fileTime.dwLowDateTime-LVar[1];
RTime:=DWORD_TO_REAL(DTime);
LRVar[H]:=RTime/10000000.00;
H:=H+1;
LesitungFlaeche:=(MVar[i-1]+MVar)/2.0;
FlaecheZeit:=(LRVar[H]-LRVar[H-1]);
END_IF
 
So auf die Schnelle fällt mir kein Fehler auf. Mir fehlt aber leider gerade die Zeit dazu, mir dein Programm näher anzuschauen.

Was mir allerdings auffällt, ist deine umständliche Benutzung der 2 Timer. Wieso nimmst du nicht einfach einen Timer, der 100 ms läuft?
 
Hallo,
was mir hier auffällt ist, dass keine Flanke für das Hochzählen des Index und das Abspeichern der Werte verwendet wird. Der Zyklus des Programms wird ja wohl sehr viel kleiner sein als die Timer-Laufzeit.
Versuch doch mal folgendes :
Code:
IF ft1.Q and not Flanke THEN
...
end_if ;
Flanke := ft1.Q ;
Gruß
LL
 
Zurück
Oben