Rampengenerator

Yogixxx

Level-1
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr!

Ich muß euch mal wieder was fragen.
Und zwar habe ich einen Rampenbaustein, welcher eigentlich sehr gut funktioniert.

Ich habe eine Beschleunigungsphase - Konstantfahrt - und Abbremsphase.
Schön und gut.
Jetzt bin ich leider gezwungen worden, während meiner Konstantfahrt die Geschwindigkeit zu verändern.
Das geht leider nicht so einfach.
Ich habe schon probiert rumzudoktorn, aber klappt nicht.
fVelocity : bekommt einen anderen Wert...

Vielleicht könnt ihr mir weiter helfen:


INFO:
Am besten alle IN/Out-Variablen mal zu dem Baustein:

VAR_INPUT
bStart : BOOL;
bStop : BOOL;
fStartPos : LREAL;
fTargetPos : LREAL;
fVelocity : LREAL; (* > 0 *)
fAcceleration : LREAL; (* > 0 *)
fDeceleration : LREAL; (* > 0 *)
END_VAR
VAR_OUTPUT
bDone : BOOL; (*fertig*)
fSetPos : LREAL; (* generierter Sollposition *)
fSetVelo : LREAL; (* generierte Sollgeschwindigkeit *)
END_VAR



Hier der Baustein (nur der wichtige Teil):
..

...

MOVE_CONSTANT: (*Phase 2*)
(* weiter mit konstanter Geschwindigkeit *)
fTimePhase2 := fTimePhase2 + FastCycleTime; (*Zähler für Phase 2 = t+Zykluszeit *)
fDistancePhase2 := fDistancePhase1 + fSetVelo * fTimePhase2 * diSetDirection; (* s = v * t + s0 *)
fSetPos := fPosPhase1 + fSetVelo * fTimePhase2; (* s = v * t + s0 *)
fSetVelo := fVelocity * diSetDirection;
fSetAcc := 0;

fBreakTime := ABS(fSetVelo / fDeceleration); (* t = v / a *)
fBreakDistance := ABS(fDeceleration/2 * fBreakTime * fBreakTime); (* s = 1/2 a * t^2 *)
fDistanceLeft := fSetDistance - fDistancePhase2;

IF (fBreakDistance < fDistanceLeft) AND NOT bStop THEN
(* weiter mit konstanter Geschwindigkeit *)
fVeloPhase2 := fSetVelo; (*setze aktuelle Geschw. = Geschwind. Phase 2*)
fPosPhase2 := fSetPos; (*setze aktuelle Position = Position. Phase 2*)
ELSE
bAborted := bStop; (*abgebrochen*)
fPosPhase2 := fSetPos; (*setze aktuelle Geschw. = Geschwind. Phase 2*)
fVeloPhase2 := fSetVelo;(*setze aktuelle Position = Position. Phase 2*)
state := DECELERATE; (*wechsel zu Abbremsen*)

END_IF
 
Zurück
Oben