From 8963f36e4f59cb41d4699f2e8b904c5e24f41c37 Mon Sep 17 00:00:00 2001 From: Stefan Besler Date: Sun, 12 May 2024 21:10:46 +0200 Subject: [PATCH] ported(fc925fe0): different min/max acceleration in second order --- .../Position/PositionSecondOrderStep1.TcPOU | 18 +++--- .../Position/PositionSecondOrderStep2.TcPOU | 14 ++--- .../Struckig/Profile/ProfileDesc.TcPOU | 60 ++++++++++--------- ruckig | 2 +- 4 files changed, 48 insertions(+), 46 deletions(-) diff --git a/Struckig/Struckig/Struckig/Struckig/Position/PositionSecondOrderStep1.TcPOU b/Struckig/Struckig/Struckig/Struckig/Position/PositionSecondOrderStep1.TcPOU index f1b2d9d..c44eef9 100644 --- a/Struckig/Struckig/Struckig/Struckig/Position/PositionSecondOrderStep1.TcPOU +++ b/Struckig/Struckig/Struckig/Struckig/Position/PositionSecondOrderStep1.TcPOU @@ -297,14 +297,14 @@ VAR_INPUT END_VAR]]> @@ -333,13 +333,13 @@ profile.t[6] := 0; IF ABS(v0) > Constants.DoubleEpsilon THEN profile.t[3] := pd / v0; - IF (profile.CheckForSecondOrder(ProfileJerkSigns.Uddu, ReachedLimits.None, 0.0, vMax, vMin)) + IF (profile.CheckForSecondOrder(ProfileJerkSigns.Uddu, ReachedLimits.None, 0.0, 0.0, vMax, vMin)) THEN time_all_single_step := TRUE; END_IF ELSIF ABS(pd) < Constants.DoubleEpsilon THEN - IF (profile.CheckForSecondOrder(ProfileJerkSigns.Uddu, ReachedLimits.None, 0.0, vMax, vMin)) + IF (profile.CheckForSecondOrder(ProfileJerkSigns.Uddu, ReachedLimits.None, 0.0, 0.0, vMax, vMin)) THEN time_all_single_step := TRUE; END_IF @@ -369,8 +369,8 @@ THEN // Solution 1 profile.t[0] := -(v0 + h1)/aMax; profile.t[1] := 0; - profile.t[2] := -(vf + h1)/aMax; - IF profile.CheckForSecondOrder(ProfileJerkSigns.Uddu, ReachedLimits.None, aMax, vMax, vMin) + profile.t[2] := (vf + h1)/aMin; + IF profile.CheckForSecondOrder(ProfileJerkSigns.Uddu, ReachedLimits.None, aMax, aMin, vMax, vMin) THEN AddProfile(profile); IF return_after_found @@ -383,8 +383,8 @@ THEN // Solution 2 profile.t[0] := (-v0 + h1)/aMax; profile.t[1] := 0; - profile.t[2] := (-vf + h1)/aMax; - IF profile.CheckForSecondOrder(ProfileJerkSigns.Uddu, ReachedLimits.None, aMax, vMax, vMin) + profile.t[2] := (vf - h1)/aMin; + IF profile.CheckForSecondOrder(ProfileJerkSigns.Uddu, ReachedLimits.None, aMax, aMin, vMax, vMin) THEN AddProfile(profile); IF return_after_found diff --git a/Struckig/Struckig/Struckig/Struckig/Position/PositionSecondOrderStep2.TcPOU b/Struckig/Struckig/Struckig/Struckig/Position/PositionSecondOrderStep2.TcPOU index 12dbf93..a886986 100644 --- a/Struckig/Struckig/Struckig/Struckig/Position/PositionSecondOrderStep2.TcPOU +++ b/Struckig/Struckig/Struckig/Struckig/Position/PositionSecondOrderStep2.TcPOU @@ -107,12 +107,12 @@ VAR_INPUT vMax, vMin, aMax, aMin : LREAL; END_VAR]]> - = 0 THEN h1 := SQRT(h1); - profile.t[0] := vd/(2*aMax) + (tf - h1)/2; + profile.t[0] := (aMax*vd - aMax*aMin*(tf - h1))/(aMax*(aMax - aMin)); profile.t[1] := h1; profile.t[2] := tf - (profile.t[0] + h1); profile.t[3] := 0; @@ -120,7 +120,7 @@ THEN profile.t[5] := 0; profile.t[6] := 0; - IF profile.CheckForSecondOrderVelocityWithTiming2(ProfileJerkSigns.Uddu, ReachedLimits.Acc0, tf, aMax, vMax, vMin) + IF profile.CheckForSecondOrderWithTiming(ProfileJerkSigns.Uddu, ReachedLimits.Acc0, tf, aMax, aMin, vMax, vMin) THEN profile.pf := profile.p[7]; time_acc0 := TRUE; @@ -142,7 +142,7 @@ THEN profile.t[5] := 0; profile.t[6] := tf - (profile.t[0] + profile.t[1]); - IF profile.CheckForSecondOrderVelocityWithTiming2(ProfileJerkSigns.Uddu, ReachedLimits.Acc0, tf, aMax, vMax, vMin) + IF profile.CheckForSecondOrderWithTiming(ProfileJerkSigns.Uddu, ReachedLimits.Acc0, tf, aMax, aMin, vMax, vMin) THEN profile.pf := profile.p[7]; time_acc0 := TRUE; @@ -160,7 +160,7 @@ profile.t[4] := 0; profile.t[5] := 0; profile.t[6] := vd/aMax; -IF profile.CheckForSecondOrderVelocityWithTiming2(ProfileJerkSigns.Uddu, ReachedLimits.Acc0, tf, aMax, vMax, vMin) +IF profile.CheckForSecondOrderWithTiming(ProfileJerkSigns.Uddu, ReachedLimits.Acc0, tf, aMax, aMin, vMax, vMin) THEN profile.pf := profile.p[7]; time_acc0 := TRUE; @@ -187,7 +187,7 @@ THEN profile.t[5] := 0; profile.t[6] := 0; - IF profile.CheckForSecondOrderVelocityWithTiming2(ProfileJerkSigns.Uddu, ReachedLimits.None, tf, aMax, vMax, vMin) + IF profile.CheckForSecondOrderWithTiming(ProfileJerkSigns.Uddu, ReachedLimits.None, tf, aMax, aMin, vMax, vMin) THEN profile.pf := profile.p[7]; time_none := TRUE; @@ -208,7 +208,7 @@ profile.t[6] := 0; af := vd*vd/h1; -IF ((aMin - 1E-12 < af) AND_THEN (af < aMax + 1E-12) AND_THEN profile.CheckForSecondOrderVelocityWithTiming2(ProfileJerkSigns.Uddu, ReachedLimits.None, tf, af, vMax, vMin)) +IF ((aMin - 1E-12 < af) AND_THEN (af < aMax + 1E-12) AND_THEN profile.CheckForSecondOrderWithTiming(ProfileJerkSigns.Uddu, ReachedLimits.None, tf, af, -af, vMax, vMin)) THEN profile.pf := profile.p[7]; time_none := TRUE; diff --git a/Struckig/Struckig/Struckig/Struckig/Profile/ProfileDesc.TcPOU b/Struckig/Struckig/Struckig/Struckig/Profile/ProfileDesc.TcPOU index add4301..49b5c70 100644 --- a/Struckig/Struckig/Struckig/Struckig/Profile/ProfileDesc.TcPOU +++ b/Struckig/Struckig/Struckig/Struckig/Profile/ProfileDesc.TcPOU @@ -24,7 +24,7 @@ METHOD CheckForSecondOrder : BOOL VAR_INPUT jerkSigns : ProfileJerkSigns; limits : ReachedLimits; - af : LREAL; + aUp, aDown : LREAL; vMax, vMin : LREAL; END_VAR VAR @@ -83,21 +83,21 @@ END_IF IF jerkSigns = ProfileJerkSigns.Uddu THEN - j[0] := SEL(t[0] > 0, 0, af); + j[0] := SEL(t[0] > 0, 0, aUp); j[1] := 0; - j[2] := SEL(t[2] > 0, 0, -af); + j[2] := SEL(t[2] > 0, 0, aDown); j[3] := 0; - j[4] := SEL(t[4] > 0, 0, -af); + j[4] := SEL(t[4] > 0, 0, aDown); j[5] := 0; - j[6] := SEL(t[6] > 0, 0, af); + j[6] := SEL(t[6] > 0, 0, aUp); ELSE - j[0] := SEL(t[0] > 0, 0, af); + j[0] := SEL(t[0] > 0, 0, aUp); j[1] := 0; - j[2] := SEL(t[2] > 0, 0, -af); + j[2] := SEL(t[2] > 0, 0, aDown); j[3] := 0; - j[4] := SEL(t[4] > 0, 0, af); + j[4] := SEL(t[4] > 0, 0, aUp); j[5] := 0; - j[6] := SEL(t[6] > 0, 0, -af); + j[6] := SEL(t[6] > 0, 0, aDown); END_IF direction := SEL(vMax > 0, ProfileDirection.Down, ProfileDirection.Up); @@ -145,7 +145,7 @@ METHOD CheckForSecondOrderVelocity : BOOL VAR_INPUT jerkSigns : ProfileJerkSigns; limits : ReachedLimits; - af : LREAL; + aUp : LREAL; END_VAR VAR i : INT; @@ -183,7 +183,7 @@ j[5] := 0; j[6] := 0; a[0] := 0; -a[1] := af; +a[1] := aUp; a[2] := 0; a[3] := 0; a[4] := 0; @@ -198,7 +198,7 @@ END_FOR THIS^.JerkSigns := jerkSigns; THIS^.Limits := limits; -THIS^.Direction := SEL(af > 0, ProfileDirection.Down, ProfileDirection.Up); +THIS^.Direction := SEL(aUp > 0, ProfileDirection.Down, ProfileDirection.Up); // Velocity limit can be broken in the beginning if both initial velocity and acceleration are too high CheckForSecondOrderVelocity := ABS(v[6] - vf) < Constants.VelocityPrecision;]]> @@ -210,7 +210,7 @@ METHOD CheckForSecondOrderVelocityWithTiming : BOOL VAR_INPUT jerkSigns : ProfileJerkSigns; limits : ReachedLimits; - af : LREAL; + aUp : LREAL; END_VAR VAR i : INT; @@ -218,7 +218,7 @@ VAR aLowLim : LREAL; END_VAR]]> - + @@ -228,7 +228,7 @@ VAR_INPUT jerkSigns : ProfileJerkSigns; limits : ReachedLimits; tf : LREAL; - af : LREAL; + aUp : LREAL; aMax : LREAL; aMin : LREAL; END_VAR @@ -239,18 +239,19 @@ VAR END_VAR]]> + (aMin - Constants.Epsilon < aUp) + AND_THEN (aUp < aMax + Constants.Epsilon) + AND_THEN CheckForSecondOrderVelocityWithTiming(jerkSigns, limits, aUp); // AND_THEN (ABS(t[6] - tf) < t_precision);]]> - + - + - + - + diff --git a/ruckig b/ruckig index 35c57f8..fc925fe 160000 --- a/ruckig +++ b/ruckig @@ -1 +1 @@ -Subproject commit 35c57f8a95a062c39388394977229a82375e1507 +Subproject commit fc925fe0aeac6c51017c440886899a21440be888