Opened 13 years ago
Last modified 7 years ago
#1715 closed defect
Simulation code for gearbox-model generates divide by zero ( during initialization ?) — at Initial Version
Reported by: | perob88 | Owned by: | perob88 |
---|---|---|---|
Priority: | high | Milestone: | Future |
Component: | Simulation Code Generation | Version: | trunk |
Keywords: | Cc: | perob88, Jens Frenkel |
Description
I have made a simple manual gearbox with clutch.
In Dymola I couln't get it to simulate using instantatnious gear shifts because of issues with signals without well defined derivative. As workaround I added a first order system for the speed equation, as follows:
{{{model IdealGearBox
extends
Modelica.Mechanics.Rotational.Interfaces.PartialElementaryTwoFlangesAndSupport2;
parameter Real ratios[:]={1}
"Transmission ratios (flange_a.phi/flange_b.phi)";
parameter Real Tg=0.1 "Time constant for change of gear ratio.";
Modelica.Blocks.Interfaces.IntegerInput Gear "Gear number";
Modelica.SIunits.Angle phi_a
"Angle between left shaft flange and support";
Modelica.SIunits.Angle phi_b
"Angle between right shaft flange and support";
Real gearRatio(start=1, fixed=true);
equation
der(gearRatio) = ((if Gear == 0 then 1 else ratios[Gear]) - gearRatio)/Tg;
der(phi_a) = gearRatio*der(phi_b);
phi_a = flange_a.phi - phi_support;
phi_b = flange_b.phi - phi_support;
0 = gearRatio*flange_a.tau + flange_b.tau;
end IdealGearBox;}}}
When simulatig a simple vehicle with this gearbox solution i get the following:
{{{"Following Error has occurred.
Unknown error throw | [line] 42 | [file] util/division.c
| division by zero"}}}
Running the executable manually gives:
{{{ warning | division by zero in partial equation: $DER.simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_a / simplevehicle1.chassis.Wheel.w because simplevehicle1.chassis.Wheel.w == 0
| [line] 1102 | [file] TestModel.c
throw | [line] 42 | [file] util/division.c
| division by zero}}}
If I remove
der(gearRatio) = ((if Gear == 0 then 1 else ratios[Gear]) - gearRatio)/Tg;
and replace with
gearRatio = (if Gear == 0 then 1 else ratios[Gear]);
everyting is running smoothly but in my opinion this shouln't happen.
An instantiation of the model is:
{{{function Modelica.Math.tempInterpol1 "Temporary function for linear interpolation (will be removed)"
input Real u "input value (first column of table)";
input Real[:, :] table "table to be interpolated";
input Integer icol "column of table to be interpolated";
output Real y "interpolated input value (icol column of table)";
protected Integer i;
protected Integer n "number of rows of table";
protected Real u1;
protected Real u2;
protected Real y1;
protected Real y2;
algorithm
n := size(table,1);
if n <= 1 then
y := table[1,icol];
else
if u <= table[1,1] then
i := 1;
else
i := 2;
while i < n and u >= table[i,1] loop
i := 1 + i;
end while;
i := i + -1;
end if;
u1 := table[i,1];
u2 := table[1 + i,1];
y1 := table[i,icol];
y2 := table[1 + i,icol];
assert( u2 > u1, "Table index must be increasing");
y := y1 + (y2 - y1 * (u - u1)) / (u2 - u1);
end if;
end Modelica.Math.tempInterpol1;
}}}
{{{class TestModel
input Real simplevehicle1.ThrottlePedal;
input Real simplevehicle1.BrakePedal;
input Real simplevehicle1.ClutchPedal;
input Integer simplevehicle1.Gear;
Real simplevehicle1.Wheel.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.Wheel.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.Vehicle.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.Vehicle.f(quantity = "Force", unit = "N") "cut force directed into flange";
parameter Boolean simplevehicle1.chassis.WheelRadius.useSupportR = false "= true, if rotational support flange enabled, otherwise implicitly grounded";
parameter Boolean simplevehicle1.chassis.WheelRadius.useSupportT = false "= true, if translational support flange enabled, otherwise implicitly grounded";
Real simplevehicle1.chassis.WheelRadius.flangeR.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.chassis.WheelRadius.flangeR.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.chassis.WheelRadius.flangeT.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.WheelRadius.flangeT.f(quantity = "Force", unit = "N") "cut force directed into flange";
input Real simplevehicle1.chassis.WheelRadius.internalSupportR.tau(quantity = "Torque", unit = "N.m") = -simplevehicle1.chassis.WheelRadius.flangeR.tau "External support torque (must be computed via torque balance in model where InternalSupport is used; = flange.tau)";
Real simplevehicle1.chassis.WheelRadius.internalSupportR.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "External support angle (= flange.phi)";
Real simplevehicle1.chassis.WheelRadius.internalSupportR.flange.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.chassis.WheelRadius.internalSupportR.flange.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
input Real simplevehicle1.chassis.WheelRadius.internalSupportT.f(quantity = "Force", unit = "N") = -simplevehicle1.chassis.WheelRadius.flangeT.f "External support force (must be computed via force balance in model where InternalSupport is used; = flange.f)";
Real simplevehicle1.chassis.WheelRadius.internalSupportT.s(quantity = "Length", unit = "m") "External support position (= flange.s)";
Real simplevehicle1.chassis.WheelRadius.internalSupportT.flange.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.WheelRadius.internalSupportT.flange.f(quantity = "Force", unit = "N") "cut force directed into flange";
parameter Real simplevehicle1.chassis.WheelRadius.ratio(unit = "rad/m", start = 1.0) = 3.3333333333333335 "Transmission ratio (flange_a.phi/flange_b.s)";
parameter Real simplevehicle1.chassis.WheelRadius.fixedR.phi0(quantity = "Angle", unit = "rad", displayUnit = "deg") = 0.0 "Fixed offset angle of housing";
Real simplevehicle1.chassis.WheelRadius.fixedR.flange.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.chassis.WheelRadius.fixedR.flange.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
parameter Real simplevehicle1.chassis.WheelRadius.fixedT.s0(quantity = "Length", unit = "m") = 0.0 "fixed offset position of housing";
Real simplevehicle1.chassis.WheelRadius.fixedT.flange.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.WheelRadius.fixedT.flange.f(quantity = "Force", unit = "N") "cut force directed into flange";
parameter Real simplevehicle1.chassis.VehicleMass.L(quantity = "Length", unit = "m", start = 0.0) = 0.0 "Length of component, from left flange to right flange (= flange_b.s - flange_a.s)";
Real simplevehicle1.chassis.VehicleMass.flange_a.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.VehicleMass.flange_a.f(quantity = "Force", unit = "N") "cut force directed into flange";
Real simplevehicle1.chassis.VehicleMass.flange_b.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.VehicleMass.flange_b.f(quantity = "Force", unit = "N") "cut force directed into flange";
parameter Real simplevehicle1.chassis.VehicleMass.m(quantity = "Mass", unit = "kg", min = 0.0, start = 1.0) = 1520.0 "mass of the sliding mass";
parameter enumeration(never, avoid, default, prefer, always) simplevehicle1.chassis.VehicleMass.stateSelect = StateSelect.default "Priority to use s and v as states";
Real simplevehicle1.chassis.VehicleMass.a(quantity = "Acceleration", unit = "m/s2", start = 0.0) "absolute acceleration of component";
Real simplevehicle1.chassis.VehicleMass.s(quantity = "Length", unit = "m", start = 0.0, StateSelect = StateSelect.default) "Absolute position of center of component (s = flange_a.s + L/2 = flange_b.s - L/2)";
Real simplevehicle1.chassis.VehicleMass.v(quantity = "Velocity", unit = "m/s", start = 0.0, StateSelect = StateSelect.default) "absolute velocity of component";
Real simplevehicle1.chassis.Wheel.flange_a.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.chassis.Wheel.flange_a.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.chassis.Wheel.flange_b.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.chassis.Wheel.flange_b.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
parameter Real simplevehicle1.chassis.Wheel.J(quantity = "MomentOfInertia", unit = "kg.m2", min = 0.0, start = 1.0) = 0.1 "Moment of inertia";
parameter enumeration(never, avoid, default, prefer, always) simplevehicle1.chassis.Wheel.stateSelect = StateSelect.default "Priority to use phi and w as states";
Real simplevehicle1.chassis.Wheel.a(quantity = "AngularAcceleration", unit = "rad/s2") "Absolute angular acceleration of component (= der(w))";
Real simplevehicle1.chassis.Wheel.phi(quantity = "Angle", unit = "rad", displayUnit = "deg", StateSelect = StateSelect.default) "Absolute rotation angle of component";
Real simplevehicle1.chassis.Wheel.w(quantity = "AngularVelocity", unit = "rad/s", StateSelect = StateSelect.default) "Absolute angular velocity of component (= der(phi))";
parameter Integer simplevehicle1.chassis.speedDependentForce.n = 3;
Real simplevehicle1.chassis.speedDependentForce.speedSensor.flange.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.speedDependentForce.speedSensor.flange.f(quantity = "Force", unit = "N") "cut force directed into flange";
output Real simplevehicle1.chassis.speedDependentForce.speedSensor.v "Absolute velocity of flange as output signal";
Real simplevehicle1.chassis.speedDependentForce.Flange_b.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.speedDependentForce.Flange_b.f(quantity = "Force", unit = "N") "cut force directed into flange";
parameter Boolean simplevehicle1.chassis.speedDependentForce.Force.useSupport = false "= true, if support flange enabled, otherwise implicitly grounded";
Real simplevehicle1.chassis.speedDependentForce.Force.s(quantity = "Length", unit = "m") = simplevehicle1.chassis.speedDependentForce.Force.flange.s - simplevehicle1.chassis.speedDependentForce.Force.s_support "distance between flange and support (= flange.s - support.s)";
Real simplevehicle1.chassis.speedDependentForce.Force.flange.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.speedDependentForce.Force.flange.f(quantity = "Force", unit = "N") "cut force directed into flange";
protected Real simplevehicle1.chassis.speedDependentForce.Force.s_support(quantity = "Length", unit = "m") "Absolute position of support flange";
input Real simplevehicle1.chassis.speedDependentForce.Force.f "driving force as input signal";
parameter Real simplevehicle1.chassis.speedDependentForce.Cpol[1] = 0.0;
parameter Real simplevehicle1.chassis.speedDependentForce.Cpol[2] = -13.275;
parameter Real simplevehicle1.chassis.speedDependentForce.Cpol[3] = -0.23328;
input Real simplevehicle1.chassis.speedDependentForce.speedToForce.u "Connector of Real input signal";
output Real simplevehicle1.chassis.speedDependentForce.speedToForce.y "Connector of Real output signal";
parameter Integer simplevehicle1.chassis.speedDependentForce.speedToForce.n = simplevehicle1.chassis.speedDependentForce.n "Polynomial order";
parameter Real simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[1] = simplevehicle1.chassis.speedDependentForce.Cpol[1] "Polynomial coefficients for c1 + c2*u + ... + cn * u(n-1)";
parameter Real simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[2] = simplevehicle1.chassis.speedDependentForce.Cpol[2] "Polynomial coefficients for c1 + c2*u + ... + cn * u(n-1)";
parameter Real simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[3] = simplevehicle1.chassis.speedDependentForce.Cpol[3] "Polynomial coefficients for c1 + c2*u + ... + cn * u(n-1)";
protected Real simplevehicle1.chassis.speedDependentForce.speedToForce.upow[1];
protected Real simplevehicle1.chassis.speedDependentForce.speedToForce.upow[2];
protected Real simplevehicle1.chassis.speedDependentForce.speedToForce.upow[3];
Real simplevehicle1.chassis.DriveShaft.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.chassis.DriveShaft.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.chassis.VehicleChassis.s(quantity = "Length", unit = "m") "absolute position of flange";
Real simplevehicle1.chassis.VehicleChassis.f(quantity = "Force", unit = "N") "cut force directed into flange";
parameter Boolean simplevehicle1.chassis.brake.useSupport = false "= true, if support flange enabled, otherwise implicitly grounded";
Real simplevehicle1.chassis.brake.flange_a.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.chassis.brake.flange_a.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.chassis.brake.flange_b.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.chassis.brake.flange_b.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
protected Real simplevehicle1.chassis.brake.phi_support(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute angle of support flange";
parameter Real simplevehicle1.chassis.brake.w_small(quantity = "AngularVelocity", unit = "rad/s") = 10000000000.0 "Relative angular velocity near to zero if jumps due to a reinit(..) of the velocity can occur (set to low value only if such impulses can occur)";
Real simplevehicle1.chassis.brake.w_relfric(quantity = "AngularVelocity", unit = "rad/s") "Relative angular velocity between frictional surfaces";
Real simplevehicle1.chassis.brake.a_relfric(quantity = "AngularAcceleration", unit = "rad/s2") "Relative angular acceleration between frictional surfaces";
Real simplevehicle1.chassis.brake.tau0(quantity = "Torque", unit = "N.m") "Friction torque for w=0 and forward sliding";
Real simplevehicle1.chassis.brake.tau0_max(quantity = "Torque", unit = "N.m") "Maximum friction torque for w=0 and locked";
Boolean simplevehicle1.chassis.brake.free "true, if frictional element is not active";
Real simplevehicle1.chassis.brake.sa(unit = "1") "Path parameter of friction characteristic tau = f(a_relfric)";
Boolean simplevehicle1.chassis.brake.startForward(start = false, fixed = true) "true, if w_rel=0 and start of forward sliding";
Boolean simplevehicle1.chassis.brake.startBackward(start = false, fixed = true) "true, if w_rel=0 and start of backward sliding";
Boolean simplevehicle1.chassis.brake.locked(start = false) "true, if w_rel=0 and not sliding";
constant Integer simplevehicle1.chassis.brake.Unknown = 3 "Value of mode is not known";
constant Integer simplevehicle1.chassis.brake.Free = 2 "Element is not active";
constant Integer simplevehicle1.chassis.brake.Forward = 1 "w_rel > 0 (forward sliding)";
constant Integer simplevehicle1.chassis.brake.Stuck = 0 "w_rel = 0 (forward sliding, locked or backward sliding)";
constant Integer simplevehicle1.chassis.brake.Backward = -1 "w_rel < 0 (backward sliding)";
protected constant Real simplevehicle1.chassis.brake.unitAngularAcceleration(quantity = "AngularAcceleration", unit = "rad/s2") = 1.0;
protected constant Real simplevehicle1.chassis.brake.unitTorque(quantity = "Torque", unit = "N.m") = 1.0;
parameter Real simplevehicle1.chassis.brake.mue_pos[1,1] = 0.0 "[w,mue] positive sliding friction coefficient (w_rel>=0)";
parameter Real simplevehicle1.chassis.brake.mue_pos[1,2] = 0.5 "[w,mue] positive sliding friction coefficient (w_rel>=0)";
parameter Real simplevehicle1.chassis.brake.peak(min = 1.0) = 1.0 "peak*mue_pos[1,2] = maximum value of mue for w_rel==0";
parameter Real simplevehicle1.chassis.brake.cgeo(min = 0.0) = 1.0 "Geometry constant containing friction distribution assumption";
parameter Real simplevehicle1.chassis.brake.fn_max(quantity = "Force", unit = "N", min = 0.0, start = 1.0) = 30000.0 "Maximum normal force";
Real simplevehicle1.chassis.brake.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Angle between shaft flanges (flange_a, flange_b) and support";
Real simplevehicle1.chassis.brake.tau(quantity = "Torque", unit = "N.m") "Brake friction torqu";
Real simplevehicle1.chassis.brake.w(quantity = "AngularVelocity", unit = "rad/s") "Absolute angular velocity of flange_a and flange_b";
Real simplevehicle1.chassis.brake.a(quantity = "AngularAcceleration", unit = "rad/s2") "Absolute angular acceleration of flange_a and flange_b";
Real simplevehicle1.chassis.brake.mue0 "Friction coefficient for w=0 and forward sliding";
Real simplevehicle1.chassis.brake.fn(quantity = "Force", unit = "N") "Normal force (=fn_max*f_normalized)";
input Real simplevehicle1.chassis.brake.f_normalized "Normalized force signal 0..1 (normal force = fn_max*f_normalized; brake is active if > 0)";
Integer simplevehicle1.chassis.brake.mode(min = -1, max = 3, start = 3, fixed = true);
input Real simplevehicle1.chassis.BrakePedal;
parameter Boolean simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.useSupport = false "= true, if support flange enabled, otherwise implicitly grounded";
Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
protected Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_support(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute angle of support flange";
parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[1] = 16.0 "Transmission ratios (flange_a.phi/flange_b.phi)";
parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[2] = 7.5 "Transmission ratios (flange_a.phi/flange_b.phi)";
parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[3] = 4.5 "Transmission ratios (flange_a.phi/flange_b.phi)";
parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[4] = 3.2 "Transmission ratios (flange_a.phi/flange_b.phi)";
parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[5] = 2.5 "Transmission ratios (flange_a.phi/flange_b.phi)";
parameter Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Tg = 0.1 "Time constant for change of gear ratio.";
input Integer simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Gear "Gear number";
Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_a(quantity = "Angle", unit = "rad", displayUnit = "deg") "Angle between left shaft flange and support";
Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_b(quantity = "Angle", unit = "rad", displayUnit = "deg") "Angle between right shaft flange and support";
Real simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio(start = 1.0, fixed = true);
Real simplevehicle1.clutchAndGearbox.clutch.a_rel(quantity = "AngularAcceleration", unit = "rad/s2", start = 0.0) "Relative angular acceleration (= der(w_rel))";
Real simplevehicle1.clutchAndGearbox.clutch.tau(quantity = "Torque", unit = "N.m") "Torque between flanges (= flange_b.tau)";
Real simplevehicle1.clutchAndGearbox.clutch.flange_a.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.clutchAndGearbox.clutch.flange_a.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.clutchAndGearbox.clutch.flange_b.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.clutchAndGearbox.clutch.flange_b.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
parameter Real simplevehicle1.clutchAndGearbox.clutch.phi_nominal(quantity = "Angle", unit = "rad", displayUnit = "rad") = 0.0001 "Nominal value of phi_rel (used for scaling)";
parameter enumeration(never, avoid, default, prefer, always) simplevehicle1.clutchAndGearbox.clutch.stateSelect = StateSelect.prefer "Priority to use phi_rel and w_rel as states";
parameter Real simplevehicle1.clutchAndGearbox.clutch.w_small(quantity = "AngularVelocity", unit = "rad/s") = 10000000000.0 "Relative angular velocity near to zero if jumps due to a reinit(..) of the velocity can occur (set to low value only if such impulses can occur)";
Real simplevehicle1.clutchAndGearbox.clutch.w_relfric(quantity = "AngularVelocity", unit = "rad/s") "Relative angular velocity between frictional surfaces";
Real simplevehicle1.clutchAndGearbox.clutch.a_relfric(quantity = "AngularAcceleration", unit = "rad/s2") "Relative angular acceleration between frictional surfaces";
Real simplevehicle1.clutchAndGearbox.clutch.tau0(quantity = "Torque", unit = "N.m") "Friction torque for w=0 and forward sliding";
Real simplevehicle1.clutchAndGearbox.clutch.tau0_max(quantity = "Torque", unit = "N.m") "Maximum friction torque for w=0 and locked";
Boolean simplevehicle1.clutchAndGearbox.clutch.free "true, if frictional element is not active";
Real simplevehicle1.clutchAndGearbox.clutch.sa(unit = "1") "Path parameter of friction characteristic tau = f(a_relfric)";
Boolean simplevehicle1.clutchAndGearbox.clutch.startForward(start = false, fixed = true) "true, if w_rel=0 and start of forward sliding";
Boolean simplevehicle1.clutchAndGearbox.clutch.startBackward(start = false, fixed = true) "true, if w_rel=0 and start of backward sliding";
Boolean simplevehicle1.clutchAndGearbox.clutch.locked(start = false) "true, if w_rel=0 and not sliding";
constant Integer simplevehicle1.clutchAndGearbox.clutch.Unknown = 3 "Value of mode is not known";
constant Integer simplevehicle1.clutchAndGearbox.clutch.Free = 2 "Element is not active";
constant Integer simplevehicle1.clutchAndGearbox.clutch.Forward = 1 "w_rel > 0 (forward sliding)";
constant Integer simplevehicle1.clutchAndGearbox.clutch.Stuck = 0 "w_rel = 0 (forward sliding, locked or backward sliding)";
constant Integer simplevehicle1.clutchAndGearbox.clutch.Backward = -1 "w_rel < 0 (backward sliding)";
protected constant Real simplevehicle1.clutchAndGearbox.clutch.unitAngularAcceleration(quantity = "AngularAcceleration", unit = "rad/s2") = 1.0;
protected constant Real simplevehicle1.clutchAndGearbox.clutch.unitTorque(quantity = "Torque", unit = "N.m") = 1.0;
parameter Real simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1] = 0.0 "[w,mue] positive sliding friction coefficient (w_rel>=0)";
parameter Real simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2] = 0.5 "[w,mue] positive sliding friction coefficient (w_rel>=0)";
parameter Real simplevehicle1.clutchAndGearbox.clutch.peak(min = 1.0) = 1.0 "peak*mue_pos[1,2] = maximum value of mue for w_rel==0";
parameter Real simplevehicle1.clutchAndGearbox.clutch.cgeo(min = 0.0) = 1.0 "Geometry constant containing friction distribution assumption";
parameter Real simplevehicle1.clutchAndGearbox.clutch.fn_max(quantity = "Force", unit = "N", min = 0.0, start = 1.0) = 1000.0 "Maximum normal force";
Real simplevehicle1.clutchAndGearbox.clutch.mue0 "Friction coefficient for w=0 and forward sliding";
Real simplevehicle1.clutchAndGearbox.clutch.fn(quantity = "Force", unit = "N") "Normal force (fn=fn_max*f_normalized)";
input Real simplevehicle1.clutchAndGearbox.clutch.f_normalized "Normalized force signal 0..1 (normal force = fn_max*f_normalized; clutch is engaged if > 0)";
Real simplevehicle1.clutchAndGearbox.clutch.phi_rel(quantity = "Angle", unit = "rad", displayUnit = "deg", start = 0.0, nominal = simplevehicle1.clutchAndGearbox.clutch.phi_nominal, StateSelect = StateSelect.prefer) "Relative rotation angle (= flange_b.phi - flange_a.phi)";
Real simplevehicle1.clutchAndGearbox.clutch.w_rel(quantity = "AngularVelocity", unit = "rad/s", start = 0.0, StateSelect = StateSelect.prefer) "Relative angular velocity (= der(phi_rel))";
Integer simplevehicle1.clutchAndGearbox.clutch.mode(min = -1, max = 3, start = 3, fixed = true);
Real simplevehicle1.clutchAndGearbox.ClutchAxle.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.clutchAndGearbox.ClutchAxle.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.clutchAndGearbox.GearboxAxle.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.clutchAndGearbox.GearboxAxle.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
input Real simplevehicle1.clutchAndGearbox.ClutchPedal;
input Integer simplevehicle1.clutchAndGearbox.Gear;
parameter Real simplevehicle1.engine.J(quantity = "MomentOfInertia", unit = "kg.m2") = 0.1 "Moment of inertia for the engine";
parameter Boolean simplevehicle1.engine.engineTorque.useSupport = false "= true, if support flange enabled, otherwise implicitly grounded";
Real simplevehicle1.engine.engineTorque.flange.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.engine.engineTorque.flange.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
protected Real simplevehicle1.engine.engineTorque.phi_support(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute angle of support flange";
input Real simplevehicle1.engine.engineTorque.tau "Accelerating torque acting at flange (= -flange.tau)";
input Real simplevehicle1.engine.ThrottleRef;
Real simplevehicle1.engine.CrankShaft.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.engine.CrankShaft.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
parameter Real simplevehicle1.engine.torqueMax.k(start = 1.0) = 350.0 "Gain value multiplied with input signal";
input Real simplevehicle1.engine.torqueMax.u "Input signal connector";
output Real simplevehicle1.engine.torqueMax.y "Output signal connector";
Real simplevehicle1.engine.engineInertia.flange_a.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.engine.engineInertia.flange_a.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
Real simplevehicle1.engine.engineInertia.flange_b.phi(quantity = "Angle", unit = "rad", displayUnit = "deg") "Absolute rotation angle of flange";
Real simplevehicle1.engine.engineInertia.flange_b.tau(quantity = "Torque", unit = "N.m") "Cut torque in the flange";
parameter Real simplevehicle1.engine.engineInertia.J(quantity = "MomentOfInertia", unit = "kg.m2", min = 0.0, start = 1.0) = simplevehicle1.engine.J "Moment of inertia";
parameter enumeration(never, avoid, default, prefer, always) simplevehicle1.engine.engineInertia.stateSelect = StateSelect.default "Priority to use phi and w as states";
Real simplevehicle1.engine.engineInertia.a(quantity = "AngularAcceleration", unit = "rad/s2") "Absolute angular acceleration of component (= der(w))";
Real simplevehicle1.engine.engineInertia.phi(quantity = "Angle", unit = "rad", displayUnit = "deg", StateSelect = StateSelect.default) "Absolute rotation angle of component";
Real simplevehicle1.engine.engineInertia.w(quantity = "AngularVelocity", unit = "rad/s", StateSelect = StateSelect.default) "Absolute angular velocity of component (= der(phi))";
output Real Throttle.y "Connector of Real output signal";
parameter Real Throttle.k(start = 1.0) = 0.3 "Constant output value";
output Real Clutch.y "Connector of Real output signal";
parameter Real Clutch.k(start = 1.0) = 1.0 "Constant output value";
output Real Break.y "Connector of Real output signal";
parameter Real Break.k(start = 1.0) = 0.0 "Constant output value";
output Integer Gear.y "Connector of Integer output signal";
parameter Integer Gear.offset = 1 "Offset of output signal y";
parameter Real Gear.startTime(quantity = "Time", unit = "s") = 5.0 "Output y = offset for time < startTime";
parameter Integer Gear.height = 1 "Height of step";
equation
simplevehicle1.chassis.WheelRadius.internalSupportR.flange.tau = simplevehicle1.chassis.WheelRadius.internalSupportR.tau;
simplevehicle1.chassis.WheelRadius.internalSupportR.flange.phi = simplevehicle1.chassis.WheelRadius.internalSupportR.phi;
simplevehicle1.chassis.WheelRadius.internalSupportT.flange.f = simplevehicle1.chassis.WheelRadius.internalSupportT.f;
simplevehicle1.chassis.WheelRadius.internalSupportT.flange.s = simplevehicle1.chassis.WheelRadius.internalSupportT.s;
simplevehicle1.chassis.WheelRadius.fixedR.flange.phi = simplevehicle1.chassis.WheelRadius.fixedR.phi0;
simplevehicle1.chassis.WheelRadius.fixedT.flange.s = simplevehicle1.chassis.WheelRadius.fixedT.s0;
simplevehicle1.chassis.WheelRadius.flangeR.phi - simplevehicle1.chassis.WheelRadius.internalSupportR.phi = simplevehicle1.chassis.WheelRadius.ratio * (simplevehicle1.chassis.WheelRadius.flangeT.s - simplevehicle1.chassis.WheelRadius.internalSupportT.s);
0.0 = simplevehicle1.chassis.WheelRadius.ratio * simplevehicle1.chassis.WheelRadius.flangeR.tau + simplevehicle1.chassis.WheelRadius.flangeT.f;
simplevehicle1.chassis.VehicleMass.v = der(simplevehicle1.chassis.VehicleMass.s);
simplevehicle1.chassis.VehicleMass.a = der(simplevehicle1.chassis.VehicleMass.v);
simplevehicle1.chassis.VehicleMass.m * simplevehicle1.chassis.VehicleMass.a = simplevehicle1.chassis.VehicleMass.flange_a.f + simplevehicle1.chassis.VehicleMass.flange_b.f;
simplevehicle1.chassis.VehicleMass.flange_a.s = simplevehicle1.chassis.VehicleMass.s + (-simplevehicle1.chassis.VehicleMass.L) / 2.0;
simplevehicle1.chassis.VehicleMass.flange_b.s = simplevehicle1.chassis.VehicleMass.s + simplevehicle1.chassis.VehicleMass.L / 2.0;
simplevehicle1.chassis.Wheel.phi = simplevehicle1.chassis.Wheel.flange_a.phi;
simplevehicle1.chassis.Wheel.phi = simplevehicle1.chassis.Wheel.flange_b.phi;
simplevehicle1.chassis.Wheel.w = der(simplevehicle1.chassis.Wheel.phi);
simplevehicle1.chassis.Wheel.a = der(simplevehicle1.chassis.Wheel.w);
simplevehicle1.chassis.Wheel.J * simplevehicle1.chassis.Wheel.a = simplevehicle1.chassis.Wheel.flange_a.tau + simplevehicle1.chassis.Wheel.flange_b.tau;
simplevehicle1.chassis.speedDependentForce.speedSensor.v = der(simplevehicle1.chassis.speedDependentForce.speedSensor.flange.s);
0.0 = simplevehicle1.chassis.speedDependentForce.speedSensor.flange.f;
simplevehicle1.chassis.speedDependentForce.Force.flange.f = -simplevehicle1.chassis.speedDependentForce.Force.f;
simplevehicle1.chassis.speedDependentForce.Force.s_support = 0.0;
simplevehicle1.chassis.speedDependentForce.speedToForce.y = simplevehicle1.chassis.speedDependentForce.speedToForce.upow[1] * simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[1] + (simplevehicle1.chassis.speedDependentForce.speedToForce.upow[2] * simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[2] + simplevehicle1.chassis.speedDependentForce.speedToForce.upow[3] * simplevehicle1.chassis.speedDependentForce.speedToForce.Cpol[3]);
simplevehicle1.chassis.speedDependentForce.speedToForce.upow[1] = 1.0;
simplevehicle1.chassis.speedDependentForce.speedToForce.upow[2] = simplevehicle1.chassis.speedDependentForce.speedToForce.upow[1] * simplevehicle1.chassis.speedDependentForce.speedToForce.u;
simplevehicle1.chassis.speedDependentForce.speedToForce.upow[3] = simplevehicle1.chassis.speedDependentForce.speedToForce.upow[2] * simplevehicle1.chassis.speedDependentForce.speedToForce.u;
simplevehicle1.chassis.brake.mue0 = Modelica.Math.tempInterpol1(0.0,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2);
simplevehicle1.chassis.brake.phi = simplevehicle1.chassis.brake.flange_a.phi - simplevehicle1.chassis.brake.phi_support;
simplevehicle1.chassis.brake.flange_b.phi = simplevehicle1.chassis.brake.flange_a.phi;
simplevehicle1.chassis.brake.w = der(simplevehicle1.chassis.brake.phi);
simplevehicle1.chassis.brake.a = der(simplevehicle1.chassis.brake.w);
simplevehicle1.chassis.brake.w_relfric = simplevehicle1.chassis.brake.w;
simplevehicle1.chassis.brake.a_relfric = simplevehicle1.chassis.brake.a;
simplevehicle1.chassis.brake.flange_a.tau + (simplevehicle1.chassis.brake.flange_b.tau - simplevehicle1.chassis.brake.tau) = 0.0;
simplevehicle1.chassis.brake.fn = simplevehicle1.chassis.brake.fn_max * simplevehicle1.chassis.brake.f_normalized;
simplevehicle1.chassis.brake.tau0 = simplevehicle1.chassis.brake.mue0 * (simplevehicle1.chassis.brake.cgeo * simplevehicle1.chassis.brake.fn);
simplevehicle1.chassis.brake.tau0_max = simplevehicle1.chassis.brake.peak * simplevehicle1.chassis.brake.tau0;
simplevehicle1.chassis.brake.free = simplevehicle1.chassis.brake.fn <= 0.0;
simplevehicle1.chassis.brake.tau = if simplevehicle1.chassis.brake.locked then simplevehicle1.chassis.brake.sa else if simplevehicle1.chassis.brake.free then 0.0 else simplevehicle1.chassis.brake.cgeo * (simplevehicle1.chassis.brake.fn * (if simplevehicle1.chassis.brake.startForward then Modelica.Math.tempInterpol1(simplevehicle1.chassis.brake.w,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2) else if simplevehicle1.chassis.brake.startBackward then -Modelica.Math.tempInterpol1(-simplevehicle1.chassis.brake.w,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2) else if pre(simplevehicle1.chassis.brake.mode) == 1 then Modelica.Math.tempInterpol1(simplevehicle1.chassis.brake.w,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2) else -Modelica.Math.tempInterpol1(-simplevehicle1.chassis.brake.w,{{simplevehicle1.chassis.brake.mue_pos[1,1],simplevehicle1.chassis.brake.mue_pos[1,2]}},2)));
simplevehicle1.chassis.brake.phi_support = 0.0;
simplevehicle1.chassis.brake.startForward = pre(simplevehicle1.chassis.brake.mode) == 0 and (simplevehicle1.chassis.brake.sa > simplevehicle1.chassis.brake.tau0_max or pre(simplevehicle1.chassis.brake.startForward) and simplevehicle1.chassis.brake.sa > simplevehicle1.chassis.brake.tau0) or pre(simplevehicle1.chassis.brake.mode) == -1 and simplevehicle1.chassis.brake.w_relfric > simplevehicle1.chassis.brake.w_small or initial() and simplevehicle1.chassis.brake.w_relfric > 0.0;
simplevehicle1.chassis.brake.startBackward = pre(simplevehicle1.chassis.brake.mode) == 0 and (simplevehicle1.chassis.brake.sa < -simplevehicle1.chassis.brake.tau0_max or pre(simplevehicle1.chassis.brake.startBackward) and simplevehicle1.chassis.brake.sa < -simplevehicle1.chassis.brake.tau0) or pre(simplevehicle1.chassis.brake.mode) == 1 and simplevehicle1.chassis.brake.w_relfric < -simplevehicle1.chassis.brake.w_small or initial() and simplevehicle1.chassis.brake.w_relfric < 0.0;
simplevehicle1.chassis.brake.locked = not simplevehicle1.chassis.brake.free and not (pre(simplevehicle1.chassis.brake.mode) == 1 or simplevehicle1.chassis.brake.startForward or pre(simplevehicle1.chassis.brake.mode) == -1 or simplevehicle1.chassis.brake.startBackward);
simplevehicle1.chassis.brake.a_relfric = if simplevehicle1.chassis.brake.locked then 0.0 else if simplevehicle1.chassis.brake.free then simplevehicle1.chassis.brake.sa else if simplevehicle1.chassis.brake.startForward then simplevehicle1.chassis.brake.sa - simplevehicle1.chassis.brake.tau0_max else if simplevehicle1.chassis.brake.startBackward then simplevehicle1.chassis.brake.sa + simplevehicle1.chassis.brake.tau0_max else if pre(simplevehicle1.chassis.brake.mode) == 1 then simplevehicle1.chassis.brake.sa - simplevehicle1.chassis.brake.tau0_max else simplevehicle1.chassis.brake.sa + simplevehicle1.chassis.brake.tau0_max;
simplevehicle1.chassis.brake.mode = if simplevehicle1.chassis.brake.free then 2 else if (pre(simplevehicle1.chassis.brake.mode) == 1 or pre(simplevehicle1.chassis.brake.mode) == 2 or simplevehicle1.chassis.brake.startForward) and simplevehicle1.chassis.brake.w_relfric > 0.0 then 1 else if (pre(simplevehicle1.chassis.brake.mode) == -1 or pre(simplevehicle1.chassis.brake.mode) == 2 or simplevehicle1.chassis.brake.startBackward) and simplevehicle1.chassis.brake.w_relfric < 0.0 then -1 else 0;
der(simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio) = ((if simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Gear == 0 then 1.0 else simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.ratios[simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Gear]) - simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio) / simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Tg;
der(simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_a) = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio * der(simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_b);
simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_a = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.phi - simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_support;
simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_b = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.phi - simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_support;
0.0 = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.gearRatio * simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.tau + simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.tau;
simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.phi_support = 0.0;
simplevehicle1.clutchAndGearbox.clutch.mue0 = Modelica.Math.tempInterpol1(0.0,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2);
simplevehicle1.clutchAndGearbox.clutch.w_relfric = simplevehicle1.clutchAndGearbox.clutch.w_rel;
simplevehicle1.clutchAndGearbox.clutch.a_relfric = simplevehicle1.clutchAndGearbox.clutch.a_rel;
simplevehicle1.clutchAndGearbox.clutch.fn = simplevehicle1.clutchAndGearbox.clutch.fn_max * simplevehicle1.clutchAndGearbox.clutch.f_normalized;
simplevehicle1.clutchAndGearbox.clutch.free = simplevehicle1.clutchAndGearbox.clutch.fn <= 0.0;
simplevehicle1.clutchAndGearbox.clutch.tau0 = simplevehicle1.clutchAndGearbox.clutch.mue0 * (simplevehicle1.clutchAndGearbox.clutch.cgeo * simplevehicle1.clutchAndGearbox.clutch.fn);
simplevehicle1.clutchAndGearbox.clutch.tau0_max = simplevehicle1.clutchAndGearbox.clutch.peak * simplevehicle1.clutchAndGearbox.clutch.tau0;
simplevehicle1.clutchAndGearbox.clutch.tau = if simplevehicle1.clutchAndGearbox.clutch.locked then simplevehicle1.clutchAndGearbox.clutch.sa else if simplevehicle1.clutchAndGearbox.clutch.free then 0.0 else simplevehicle1.clutchAndGearbox.clutch.cgeo * (simplevehicle1.clutchAndGearbox.clutch.fn * (if simplevehicle1.clutchAndGearbox.clutch.startForward then Modelica.Math.tempInterpol1(simplevehicle1.clutchAndGearbox.clutch.w_rel,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2) else if simplevehicle1.clutchAndGearbox.clutch.startBackward then -Modelica.Math.tempInterpol1(-simplevehicle1.clutchAndGearbox.clutch.w_rel,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2) else if pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 then Modelica.Math.tempInterpol1(simplevehicle1.clutchAndGearbox.clutch.w_rel,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2) else -Modelica.Math.tempInterpol1(-simplevehicle1.clutchAndGearbox.clutch.w_rel,{{simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,1],simplevehicle1.clutchAndGearbox.clutch.mue_pos[1,2]}},2)));
simplevehicle1.clutchAndGearbox.clutch.phi_rel = simplevehicle1.clutchAndGearbox.clutch.flange_b.phi - simplevehicle1.clutchAndGearbox.clutch.flange_a.phi;
simplevehicle1.clutchAndGearbox.clutch.w_rel = der(simplevehicle1.clutchAndGearbox.clutch.phi_rel);
simplevehicle1.clutchAndGearbox.clutch.a_rel = der(simplevehicle1.clutchAndGearbox.clutch.w_rel);
simplevehicle1.clutchAndGearbox.clutch.flange_b.tau = simplevehicle1.clutchAndGearbox.clutch.tau;
simplevehicle1.clutchAndGearbox.clutch.flange_a.tau = -simplevehicle1.clutchAndGearbox.clutch.tau;
simplevehicle1.clutchAndGearbox.clutch.startForward = pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 0 and (simplevehicle1.clutchAndGearbox.clutch.sa > simplevehicle1.clutchAndGearbox.clutch.tau0_max or pre(simplevehicle1.clutchAndGearbox.clutch.startForward) and simplevehicle1.clutchAndGearbox.clutch.sa > simplevehicle1.clutchAndGearbox.clutch.tau0) or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == -1 and simplevehicle1.clutchAndGearbox.clutch.w_relfric > simplevehicle1.clutchAndGearbox.clutch.w_small or initial() and simplevehicle1.clutchAndGearbox.clutch.w_relfric > 0.0;
simplevehicle1.clutchAndGearbox.clutch.startBackward = pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 0 and (simplevehicle1.clutchAndGearbox.clutch.sa < -simplevehicle1.clutchAndGearbox.clutch.tau0_max or pre(simplevehicle1.clutchAndGearbox.clutch.startBackward) and simplevehicle1.clutchAndGearbox.clutch.sa < -simplevehicle1.clutchAndGearbox.clutch.tau0) or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 and simplevehicle1.clutchAndGearbox.clutch.w_relfric < -simplevehicle1.clutchAndGearbox.clutch.w_small or initial() and simplevehicle1.clutchAndGearbox.clutch.w_relfric < 0.0;
simplevehicle1.clutchAndGearbox.clutch.locked = not simplevehicle1.clutchAndGearbox.clutch.free and not (pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 or simplevehicle1.clutchAndGearbox.clutch.startForward or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == -1 or simplevehicle1.clutchAndGearbox.clutch.startBackward);
simplevehicle1.clutchAndGearbox.clutch.a_relfric = if simplevehicle1.clutchAndGearbox.clutch.locked then 0.0 else if simplevehicle1.clutchAndGearbox.clutch.free then simplevehicle1.clutchAndGearbox.clutch.sa else if simplevehicle1.clutchAndGearbox.clutch.startForward then simplevehicle1.clutchAndGearbox.clutch.sa - simplevehicle1.clutchAndGearbox.clutch.tau0_max else if simplevehicle1.clutchAndGearbox.clutch.startBackward then simplevehicle1.clutchAndGearbox.clutch.sa + simplevehicle1.clutchAndGearbox.clutch.tau0_max else if pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 then simplevehicle1.clutchAndGearbox.clutch.sa - simplevehicle1.clutchAndGearbox.clutch.tau0_max else simplevehicle1.clutchAndGearbox.clutch.sa + simplevehicle1.clutchAndGearbox.clutch.tau0_max;
simplevehicle1.clutchAndGearbox.clutch.mode = if simplevehicle1.clutchAndGearbox.clutch.free then 2 else if (pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 1 or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 2 or simplevehicle1.clutchAndGearbox.clutch.startForward) and simplevehicle1.clutchAndGearbox.clutch.w_relfric > 0.0 then 1 else if (pre(simplevehicle1.clutchAndGearbox.clutch.mode) == -1 or pre(simplevehicle1.clutchAndGearbox.clutch.mode) == 2 or simplevehicle1.clutchAndGearbox.clutch.startBackward) and simplevehicle1.clutchAndGearbox.clutch.w_relfric < 0.0 then -1 else 0;
simplevehicle1.engine.engineTorque.flange.tau = -simplevehicle1.engine.engineTorque.tau;
simplevehicle1.engine.engineTorque.phi_support = 0.0;
simplevehicle1.engine.torqueMax.y = simplevehicle1.engine.torqueMax.k * simplevehicle1.engine.torqueMax.u;
simplevehicle1.engine.engineInertia.phi = simplevehicle1.engine.engineInertia.flange_a.phi;
simplevehicle1.engine.engineInertia.phi = simplevehicle1.engine.engineInertia.flange_b.phi;
simplevehicle1.engine.engineInertia.w = der(simplevehicle1.engine.engineInertia.phi);
simplevehicle1.engine.engineInertia.a = der(simplevehicle1.engine.engineInertia.w);
simplevehicle1.engine.engineInertia.J * simplevehicle1.engine.engineInertia.a = simplevehicle1.engine.engineInertia.flange_a.tau + simplevehicle1.engine.engineInertia.flange_b.tau;
Throttle.y = Throttle.k;
Clutch.y = Clutch.k;
Break.y = Break.k;
Gear.y = Gear.offset + (if time < Gear.startTime then 0 else Gear.height);
simplevehicle1.Wheel.tau = 0.0;
simplevehicle1.Vehicle.f = 0.0;
simplevehicle1.chassis.WheelRadius.flangeR.tau + simplevehicle1.chassis.brake.flange_b.tau = 0.0;
simplevehicle1.chassis.WheelRadius.flangeT.f + simplevehicle1.chassis.VehicleMass.flange_a.f = 0.0;
simplevehicle1.chassis.WheelRadius.internalSupportR.flange.tau + simplevehicle1.chassis.WheelRadius.fixedR.flange.tau = 0.0;
simplevehicle1.chassis.WheelRadius.internalSupportT.flange.f + simplevehicle1.chassis.WheelRadius.fixedT.flange.f = 0.0;
simplevehicle1.chassis.WheelRadius.fixedR.flange.phi = simplevehicle1.chassis.WheelRadius.internalSupportR.flange.phi;
simplevehicle1.chassis.WheelRadius.fixedT.flange.s = simplevehicle1.chassis.WheelRadius.internalSupportT.flange.s;
simplevehicle1.chassis.VehicleMass.flange_b.f + simplevehicle1.chassis.speedDependentForce.Flange_b.f + -simplevehicle1.chassis.VehicleChassis.f = 0.0;
simplevehicle1.chassis.Wheel.flange_a.tau + -simplevehicle1.chassis.DriveShaft.tau = 0.0;
simplevehicle1.chassis.Wheel.flange_b.tau + simplevehicle1.chassis.brake.flange_a.tau = 0.0;
simplevehicle1.chassis.speedDependentForce.speedSensor.flange.f + -simplevehicle1.chassis.speedDependentForce.Flange_b.f + simplevehicle1.chassis.speedDependentForce.Force.flange.f = 0.0;
simplevehicle1.chassis.speedDependentForce.Flange_b.s = simplevehicle1.chassis.speedDependentForce.Force.flange.s;
simplevehicle1.chassis.speedDependentForce.Flange_b.s = simplevehicle1.chassis.speedDependentForce.speedSensor.flange.s;
simplevehicle1.chassis.speedDependentForce.Force.f = simplevehicle1.chassis.speedDependentForce.speedToForce.y;
simplevehicle1.chassis.speedDependentForce.speedSensor.v = simplevehicle1.chassis.speedDependentForce.speedToForce.u;
-simplevehicle1.Wheel.tau + simplevehicle1.chassis.DriveShaft.tau + simplevehicle1.clutchAndGearbox.GearboxAxle.tau = 0.0;
-simplevehicle1.Vehicle.f + simplevehicle1.chassis.VehicleChassis.f = 0.0;
simplevehicle1.chassis.VehicleMass.flange_a.s = simplevehicle1.chassis.WheelRadius.flangeT.s;
simplevehicle1.chassis.Wheel.flange_b.phi = simplevehicle1.chassis.brake.flange_a.phi;
simplevehicle1.chassis.WheelRadius.flangeR.phi = simplevehicle1.chassis.brake.flange_b.phi;
simplevehicle1.chassis.BrakePedal = simplevehicle1.chassis.brake.f_normalized;
simplevehicle1.chassis.DriveShaft.phi = simplevehicle1.chassis.Wheel.flange_a.phi;
simplevehicle1.chassis.VehicleChassis.s = simplevehicle1.chassis.VehicleMass.flange_b.s;
simplevehicle1.chassis.VehicleChassis.s = simplevehicle1.chassis.speedDependentForce.Flange_b.s;
simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.tau + simplevehicle1.clutchAndGearbox.clutch.flange_b.tau = 0.0;
simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.tau + -simplevehicle1.clutchAndGearbox.GearboxAxle.tau = 0.0;
simplevehicle1.clutchAndGearbox.clutch.flange_a.tau + -simplevehicle1.clutchAndGearbox.ClutchAxle.tau = 0.0;
simplevehicle1.clutchAndGearbox.ClutchAxle.tau + simplevehicle1.engine.CrankShaft.tau = 0.0;
simplevehicle1.clutchAndGearbox.clutch.flange_b.phi = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_a.phi;
simplevehicle1.clutchAndGearbox.ClutchAxle.phi = simplevehicle1.clutchAndGearbox.clutch.flange_a.phi;
simplevehicle1.clutchAndGearbox.GearboxAxle.phi = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.flange_b.phi;
simplevehicle1.clutchAndGearbox.Gear = simplevehicle1.clutchAndGearbox.gearboxAndFinalDrive.Gear;
simplevehicle1.clutchAndGearbox.ClutchPedal = simplevehicle1.clutchAndGearbox.clutch.f_normalized;
simplevehicle1.engine.engineTorque.flange.tau + simplevehicle1.engine.engineInertia.flange_a.tau = 0.0;
-simplevehicle1.engine.CrankShaft.tau + simplevehicle1.engine.engineInertia.flange_b.tau = 0.0;
simplevehicle1.engine.engineTorque.tau = simplevehicle1.engine.torqueMax.y;
simplevehicle1.engine.ThrottleRef = simplevehicle1.engine.torqueMax.u;
simplevehicle1.engine.engineInertia.flange_a.phi = simplevehicle1.engine.engineTorque.flange.phi;
simplevehicle1.engine.CrankShaft.phi = simplevehicle1.engine.engineInertia.flange_b.phi;
simplevehicle1.ThrottlePedal = simplevehicle1.engine.ThrottleRef;
simplevehicle1.clutchAndGearbox.ClutchAxle.phi = simplevehicle1.engine.CrankShaft.phi;
simplevehicle1.Gear = simplevehicle1.clutchAndGearbox.Gear;
simplevehicle1.Wheel.phi = simplevehicle1.chassis.DriveShaft.phi;
simplevehicle1.Wheel.phi = simplevehicle1.clutchAndGearbox.GearboxAxle.phi;
simplevehicle1.ClutchPedal = simplevehicle1.clutchAndGearbox.ClutchPedal;
simplevehicle1.BrakePedal = simplevehicle1.chassis.BrakePedal;
simplevehicle1.Vehicle.s = simplevehicle1.chassis.VehicleChassis.s;
Gear.y = simplevehicle1.Gear;
Break.y = simplevehicle1.BrakePedal;
Clutch.y = simplevehicle1.ClutchPedal;
Throttle.y = simplevehicle1.ThrottlePedal;
end TestModel;}}}