Select Git revision
labcomm2006_compat_vxworks.h
Forked from
Anders Blomdell / LabComm
Source project has a limited visibility.
-
Anders Blomdell authoredAnders Blomdell authored
GPS_pw_modeling.mo NaN GiB
package GPS_pw_modeling
model GPS_pw_simulator_old
//prima versione - obsoleta
//
//parameters
parameter Integer required_satellites = 4;
//number of satellites required for sufficient accuracy
//parameter Integer number_of_channels = 16;
//number of channels available in the device
parameter Real power_consumption_over_time = 387.2;
//power consumed when antenna is on (assumed constant) [mW]
parameter Real time_to_get_ephemeris = 59;
//time to get ephemeris data after freq&phase are locked (wrost case default)
parameter Real freq_and_phase_acquisition_time = 0.01;
//frequency and phase acquisition time when exaustive search is required (random)
parameter Real freq_and_phase_acquisition_time_fast = 0.005;
//frequency and phase acquisition time for hot start (random)
parameter Real ephemeris_duration = 1800;
//how long the eohemeris data will be reliable
parameter Real time_lose_hot_start = 10;
//how long it takes to lose possibility of hot start
//states
Integer sv_tracked_freq_phase(start = 0);
//number of satellites of which frequency and phase are available
Integer sv_ephemeris(start = 0);
//number of satellites of which ephemeris data are available;
Real expiration_time(start = -1.0);
//time at which ephemeris data will expire
//Inputs and outputs
Modelica.Blocks.Interfaces.IntegerInput visible_satellites annotation(
Placement(visible = true, transformation(origin = {-167, 101}, extent = {{-11, -11}, {11, 11}}, rotation = 0), iconTransformation(origin = {-94, 2}, extent = {{-26, -26}, {26, 26}}, rotation = 0)));
Modelica.Blocks.Interfaces.BooleanInput on_signal annotation(
Placement(visible = true, transformation(origin = {-132, 118}, extent = {{-12, -12}, {12, 12}}, rotation = 0), iconTransformation(origin = {-40, 100}, extent = {{-20, -20}, {20, 20}}, rotation = -90)));
Modelica.Blocks.Interfaces.BooleanOutput position_out annotation(
Placement(visible = true, transformation(origin = {176, 0}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {95, -15}, extent = {{25, -25}, {-25, 25}}, rotation = 0)));
Modelica.Blocks.Interfaces.RealOutput power_consumption annotation(
Placement(visible = true, transformation(origin = {-160, 84}, extent = {{-8, -8}, {8, 8}}, rotation = 0), iconTransformation(origin = {95, 41}, extent = {{-25, -25}, {25, 25}}, rotation = 180)));
//States
inner Modelica.StateGraph.StateGraphRoot stateGraphRoot annotation(
Placement(visible = false, transformation(origin = {-90, -90}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.InitialStep GPS_off(nIn = 4) annotation(
Placement(visible = true, transformation(origin = {-150, 58}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.Step warm_start(nOut = 3) annotation(
Placement(visible = true, transformation(origin = {34, -12}, extent = {{10, -10}, {-10, 10}}, rotation = -90)));
Modelica.StateGraph.Step hot_start(nIn = 2, nOut = 3) annotation(
Placement(visible = true, transformation(origin = {72, -20}, extent = {{10, -10}, {-10, 10}}, rotation = -90)));
Modelica.StateGraph.Step warm_start_available(nIn = 2, nOut = 2) annotation(
Placement(visible = true, transformation(origin = {80, -90}, extent = {{-10, -10}, {10, 10}}, rotation = 180)));
Modelica.StateGraph.Step hot_start_available(nIn = 2, nOut = 3) annotation(
Placement(visible = true, transformation(origin = {130, -20}, extent = {{-10, -10}, {10, 10}}, rotation = -90)));
Modelica.StateGraph.Step position_available(nIn = 4, nOut = 3) annotation(
Placement(visible = true, transformation(origin = {100, 58}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.Step freq_and_phase(nIn = 3, nOut = 2) annotation(
Placement(visible = true, transformation(origin = {-4, 58}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.Step cold_start(nIn = 2, nOut = 2) annotation(
Placement(visible = true, transformation(origin = {-82, 58}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
//Transitions
Modelica.StateGraph.Transition lock_freq_and_phase(enableTimer = true, waitTime = freq_and_phase_acquisition_time) annotation(
Placement(visible = true, transformation(origin = {-40, 58}, extent = {{-10, 10}, {10, -10}}, rotation = 0)));
Modelica.StateGraph.Transition lock_freq_and_phase_1(condition = sv_ephemeris >= required_satellites, enableTimer = true, waitTime = freq_and_phase_acquisition_time) annotation(
Placement(visible = true, transformation(origin = {34, 24}, extent = {{-10, 10}, {10, -10}}, rotation = 90)));
Modelica.StateGraph.Transition lock_freq_and_Phase_3(condition = sv_ephemeris < required_satellites, enableTimer = true, waitTime = freq_and_phase_acquisition_time) annotation(
Placement(visible = true, transformation(origin = {-32, 18}, extent = {{-10, 10}, {10, -10}}, rotation = 90)));
Modelica.StateGraph.Transition lock_freq_and_phase_2(condition = sv_ephemeris >= required_satellites, enableTimer = true, waitTime = freq_and_phase_acquisition_time_fast) annotation(
Placement(visible = true, transformation(origin = {70, 24}, extent = {{-10, 10}, {10, -10}}, rotation = 90)));
Modelica.StateGraph.Transition lock_freq_and_Phase_4(condition = sv_ephemeris < required_satellites, enableTimer = true, waitTime = freq_and_phase_acquisition_time_fast) annotation(
Placement(visible = true, transformation(origin = {-2, 18}, extent = {{-10, 10}, {10, -10}}, rotation = 90)));
Modelica.StateGraph.Transition get_ephemeris_data(enableTimer = true, waitTime = time_to_get_ephemeris) annotation(
Placement(visible = true, transformation(origin = {40, 58}, extent = {{-10, 10}, {10, -10}}, rotation = 0)));
Modelica.StateGraph.Transition update_ephemeris_data(enableTimer = true, waitTime = time_to_get_ephemeris) annotation(
Placement(visible = true, transformation(origin = {154, 58}, extent = {{-10, 10}, {10, -10}}, rotation = 0)));
Modelica.StateGraph.Transition lose_hot_start(enableTimer = true, waitTime = time_lose_hot_start) annotation(
Placement(visible = true, transformation(origin = {128, -78}, extent = {{-10, 10}, {10, -10}}, rotation = -90)));
Modelica.StateGraph.Transition ephemeris_data_expire_1(condition = time > expiration_time) annotation(
Placement(visible = true, transformation(origin = {-126, -104}, extent = {{10, 10}, {-10, -10}}, rotation = 0)));
Modelica.StateGraph.Transition ephemeris_data_expire_2(condition = time > expiration_time) annotation(
Placement(visible = true, transformation(origin = {-138, -110}, extent = {{10, 10}, {-10, -10}}, rotation = 0)));
//turn on transitions
Modelica.StateGraph.TransitionWithSignal turn_on annotation(
Placement(visible = true, transformation(origin = {-116, 58}, extent = {{-10, 10}, {10, -10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_on_hot_start annotation(
Placement(visible = true, transformation(origin = {100, -44}, extent = {{10, 10}, {-10, -10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_on_warm_start annotation(
Placement(visible = true, transformation(origin = {32, -60}, extent = {{10, 10}, {-10, -10}}, rotation = -90)));
//turn off transition
Modelica.StateGraph.TransitionWithSignal turn_off_antenna annotation(
Placement(visible = true, transformation(origin = {130, 18}, extent = {{-10, 10}, {10, -10}}, rotation = -90)));
Modelica.Blocks.MathBoolean.Not not1 annotation(
Placement(visible = true, transformation(origin = {22, 118}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_off_antenna2 annotation(
Placement(visible = true, transformation(origin = {-126, 14}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_off_antenna3 annotation(
Placement(visible = true, transformation(origin = {-126, -30}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_off_antenna4 annotation(
Placement(visible = true, transformation(origin = {104, 2}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_off_antenna5 annotation(
Placement(visible = true, transformation(origin = {66, -60}, extent = {{-10, 10}, {10, -10}}, rotation = -90)));
Modelica.StateGraph.Transition satellite_outage annotation(
Placement(visible = true, transformation(origin = {158, 100}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
connect(satellite_outage.outPort, hot_start.inPort[2]) annotation(
Line(points = {{160, 100}, {212, 100}, {212, -40}, {72, -40}, {72, -30}, {72, -30}}));
connect(position_available.outPort[3], satellite_outage.inPort) annotation(
Line(points = {{110, 58}, {130, 58}, {130, 100}, {154, 100}}, thickness = 0.5));
connect(on_signal, turn_on.condition) annotation(
Line(points = {{-132, 118}, {-116, 118}, {-116, 70}}, color = {255, 0, 255}));
connect(not1.u, on_signal) annotation(
Line(points = {{8, 118}, {-132, 118}}, color = {255, 0, 255}));
connect(turn_on_hot_start.condition, on_signal) annotation(
Line(points = {{100, -34}, {100, 22}, {-106, 22}, {-106, 118}, {-132, 118}}, color = {255, 0, 255}));
connect(turn_on_warm_start.condition, on_signal) annotation(
Line(points = {{44, -60}, {50.75, -60}, {50.75, -50}, {-106, -50}, {-106, 118}, {-132, 118}}, color = {255, 0, 255}));
connect(not1.y, turn_off_antenna.condition) annotation(
Line(points = {{34, 116}, {190, 116}, {190, 18}, {142, 18}}, color = {255, 0, 255}));
connect(not1.y, turn_off_antenna2.condition) annotation(
Line(points = {{34, 116}, {56, 116}, {56, 130}, {-190, 130}, {-190, -6}, {-126, -6}, {-126, 2}}, color = {255, 0, 255}));
connect(turn_off_antenna3.condition, not1.y) annotation(
Line(points = {{-126, -42}, {-126, -48}, {-190, -48}, {-190, 130}, {56, 130}, {56, 116}, {34, 116}}, color = {255, 0, 255}));
connect(not1.y, turn_off_antenna4.condition) annotation(
Line(points = {{34, 116}, {200, 116}, {200, -16}, {104, -16}, {104, -10}}, color = {255, 0, 255}));
connect(turn_off_antenna5.condition, not1.y) annotation(
Line(points = {{78, -60}, {200, -60}, {200, 116}, {34, 116}}, color = {255, 0, 255}));
connect(update_ephemeris_data.inPort, position_available.outPort[2]) annotation(
Line(points = {{150, 58}, {131.25, 58}, {131.25, 56}, {110.5, 56}}));
connect(update_ephemeris_data.outPort, position_available.inPort[2]) annotation(
Line(points = {{155.5, 58}, {185.5, 58}, {185.5, 88}, {75.5, 88}, {75.5, 56}, {89, 56}}));
connect(turn_off_antenna5.outPort, warm_start_available.inPort[2]) annotation(
Line(points = {{66, -62}, {66, -62}, {66, -70}, {102, -70}, {102, -90}, {92, -90}, {92, -90}}));
connect(turn_off_antenna5.inPort, warm_start.outPort[3]) annotation(
Line(points = {{66, -56}, {52, -56}, {52, 4}, {34, 4}, {34, -2}, {34, -2}}));
connect(turn_off_antenna4.outPort, hot_start_available.inPort[2]) annotation(
Line(points = {{106, 2}, {130, 2}, {130, -8}, {130, -8}}));
connect(turn_off_antenna4.inPort, hot_start.outPort[3]) annotation(
Line(points = {{100, 2}, {72, 2}, {72, -10}, {72, -10}}));
connect(hot_start_available.outPort[2], ephemeris_data_expire_2.inPort) annotation(
Line(points = {{130, -30.5}, {130, -44}, {172, -44}, {172, -110}, {-134, -110}}, thickness = 0.5));
connect(turn_on_hot_start.inPort, hot_start_available.outPort[3]) annotation(
Line(points = {{104, -44}, {130, -44}, {130, -30.5}}));
connect(lose_hot_start.inPort, hot_start_available.outPort[1]) annotation(
Line(points = {{128, -74}, {128, -52.25}, {130, -52.25}, {130, -30.5}}));
connect(hot_start_available.inPort[1], turn_off_antenna.outPort) annotation(
Line(points = {{130, -9}, {130, 18}}, thickness = 0.5));
connect(turn_on_hot_start.outPort, hot_start.inPort[1]) annotation(
Line(points = {{98.5, -44}, {72, -44}, {72, -31}}));
connect(hot_start.outPort[2], lock_freq_and_Phase_4.inPort) annotation(
Line(points = {{72, -9.5}, {72, 8}, {-2, 8}, {-2, 14}}, thickness = 0.5));
connect(hot_start.outPort[1], lock_freq_and_phase_2.inPort) annotation(
Line(points = {{72, -9.5}, {70, -9.5}, {70, 20}}, thickness = 0.5));
connect(warm_start_available.inPort[1], lose_hot_start.outPort) annotation(
Line(points = {{91, -90}, {91, -90.125}, {105, -90.125}, {105, -90.25}, {128, -90.25}, {128, -79.5}}, thickness = 0.5));
connect(turn_on_warm_start.inPort, warm_start_available.outPort[2]) annotation(
Line(points = {{32, -64}, {32, -87.25}, {69.5, -87.25}, {69.5, -90}}));
connect(warm_start_available.outPort[1], ephemeris_data_expire_1.inPort) annotation(
Line(points = {{69.5, -92}, {4.75, -92}, {4.75, -104}, {-122, -104}}, thickness = 0.5));
connect(ephemeris_data_expire_2.outPort, GPS_off.inPort[2]) annotation(
Line(points = {{-137.5, -110}, {-172, -110}, {-172, 58}, {-161, 58}}));
connect(ephemeris_data_expire_1.outPort, GPS_off.inPort[1]) annotation(
Line(points = {{-125.5, -104}, {-172, -104}, {-172, 58}, {-161, 58}}));
connect(warm_start.inPort[1], turn_on_warm_start.outPort) annotation(
Line(points = {{34, -23}, {34, -40.75}, {30, -40.75}, {30, -58.5}}, thickness = 0.5));
connect(turn_off_antenna3.outPort, GPS_off.inPort[4]) annotation(
Line(points = {{-128, -30}, {-172, -30}, {-172, 58}, {-160, 58}, {-160, 58}}));
connect(freq_and_phase.outPort[2], turn_off_antenna3.inPort) annotation(
Line(points = {{6, 58}, {14, 58}, {14, -30}, {-122, -30}, {-122, -30}}, thickness = 0.5));
connect(turn_off_antenna2.inPort, cold_start.outPort[2]) annotation(
Line(points = {{-122, 14}, {-60, 14}, {-60, 58}, {-72, 58}, {-72, 58}, {-72, 58}}));
connect(turn_off_antenna2.outPort, GPS_off.inPort[3]) annotation(
Line(points = {{-128, 14}, {-172, 14}, {-172, 58}, {-160, 58}, {-160, 58}}));
connect(lock_freq_and_phase_2.outPort, position_available.inPort[3]) annotation(
Line(points = {{70, 26}, {70, 26}, {70, 58}, {90, 58}, {90, 58}}));
connect(get_ephemeris_data.outPort, position_available.inPort[1]) annotation(
Line(points = {{41.5, 58}, {65.25, 58}, {65.25, 56}, {89, 56}}));
connect(lock_freq_and_phase_1.outPort, position_available.inPort[4]) annotation(
Line(points = {{34, 25.5}, {34, 39.5}, {72, 39.5}, {72, 56}, {89, 56}}));
connect(turn_off_antenna.inPort, position_available.outPort[1]) annotation(
Line(points = {{130, 22}, {130, 56}, {110.5, 56}}));
connect(get_ephemeris_data.inPort, freq_and_phase.outPort[1]) annotation(
Line(points = {{36, 58}, {6.5, 58}}));
connect(lock_freq_and_phase.outPort, freq_and_phase.inPort[1]) annotation(
Line(points = {{-38, 58}, {-15, 58}}));
connect(lock_freq_and_Phase_4.outPort, freq_and_phase.inPort[3]) annotation(
Line(points = {{-2, 20}, {-2, 38}, {-24, 38}, {-24, 58}, {-15, 58}}));
connect(lock_freq_and_Phase_3.outPort, freq_and_phase.inPort[2]) annotation(
Line(points = {{-32, 20}, {-32, 38}, {-24, 38}, {-24, 58}, {-15, 58}}));
connect(warm_start.outPort[2], lock_freq_and_Phase_3.inPort) annotation(
Line(points = {{34, -2}, {34, -2}, {34, 4}, {-32, 4}, {-32, 14}, {-32, 14}}, thickness = 0.5));
connect(warm_start.outPort[1], lock_freq_and_phase_1.inPort) annotation(
Line(points = {{34, -2}, {34, -2}, {34, 20}, {34, 20}}, thickness = 0.5));
connect(turn_on.inPort, GPS_off.outPort[1]) annotation(
Line(points = {{-120, 58}, {-137.5, 58}}));
connect(cold_start.inPort[1], turn_on.outPort) annotation(
Line(points = {{-93, 58}, {-112.5, 58}}, thickness = 0.5));
connect(lock_freq_and_phase.inPort, cold_start.outPort[1]) annotation(
Line(points = {{-44, 58}, {-73.5, 58}}));
//power consumption OUTPUT
power_consumption = if on_signal then power_consumption_over_time else 0;
//is position available OUTPUT
position_out = position_available.active;
algorithm
when {pre(lock_freq_and_phase.fire), pre(lock_freq_and_phase_1.fire), pre(lock_freq_and_phase_2.fire)} then
sv_tracked_freq_phase := pre(visible_satellites);
end when;
when {pre(on_signal) == false} then
sv_tracked_freq_phase := 0;
end when;
when {pre(visible_satellites) < pre(sv_tracked_freq_phase)} then
sv_tracked_freq_phase := pre(visible_satellites);
end when;
when {pre(visible_satellites) < pre(sv_ephemeris)} then
sv_ephemeris := pre(visible_satellites);
end when;
when {pre(get_ephemeris_data.fire), pre(update_ephemeris_data.fire)} then
sv_ephemeris := visible_satellites;
expiration_time := pre(time + ephemeris_duration);
end when;
when {time > pre(expiration_time)} then
sv_ephemeris := 0;
end when;
annotation(
uses(Modelica(version = "3.2.1")),
Icon(graphics = {Rectangle(fillColor = {0, 201, 223}, fillPattern = FillPattern.Solid, extent = {{-100, 100}, {100, -100}}), Text(origin = {-40, 66}, extent = {{-14, 12}, {14, -12}}, textString = "ON"), Text(origin = {-13, -58}, lineColor = {30, 33, 177}, extent = {{-75, 66}, {109, -94}}, textString = "GPS device"), Text(origin = {-97, 45}, extent = {{59, -43}, {9, -5}}, textString = "Visible SV"), Text(origin = {26, -24}, extent = {{-22, 12}, {60, -32}}, textString = "Position available"), Text(origin = {34, 30}, extent = {{-32, 0}, {54, -12}}, textString = "pw consumption")}, coordinateSystem(initialScale = 0.1)),
experiment(StartTime = 0, StopTime = 1000, Tolerance = 1e-6, Interval = 0.002),
__OpenModelica_simulationFlags(lv = "LOG_STATS", s = "dassl"));
end GPS_pw_simulator_old;
model test_GPS
GPS_pw_modeling.GPS_pw_simulator GPS_pw_simulator1 annotation(
Placement(visible = true, transformation(origin = {70, -30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Sources.BooleanTable const_on(table = {5, 71, 80, 81, 90, 91, 100, 101, 110, 111, 120, 261, 270, 271, 280, 281, 290, 291}) annotation(
Placement(visible = true, transformation(origin = {-10, -30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Sources.IntegerConstant stellites_constant(k = 5) annotation(
Placement(visible = true, transformation(origin = {-10, 90}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Sources.BooleanTable slow_and_fast(table = {10, 70, 90, 91, 110, 111, 130, 131, 150, 151, 1840, 1841, 1850, 1851, 1860, 1861, 1870, 1871, 1880, 1881, 1890, 1891, 1900, 1971, 1980, 1981, 1990, 1991, 2000, 2001}) annotation(
Placement(visible = true, transformation(origin = {-10, 50}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.Blocks.Sources.IntegerTable satellites(table=[0,5;100,3; 200,4]) annotation(
Placement(visible = true, transformation(origin = {-10, 10}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
connect(GPS_pw_simulator1.visible_satellites, satellites.y) annotation(
Line(points = {{70, -20}, {70, -20}, {70, 10}, {2, 10}, {2, 10}}, color = {255, 127, 0}));
connect(const_on.y, GPS_pw_simulator1.on_signal) annotation(
Line(points = {{2, -30}, {58, -30}, {58, -30}, {60, -30}}, color = {255, 0, 255}));
annotation(
experiment(StartTime = 0, StopTime = 2000, Tolerance = 1e-6, Interval = 0.0006),
__OpenModelica_simulationFlags(lv = "LOG_STATS", s = "dassl"));
end test_GPS;
model GPS_pw_simulator
// not modeled hot start
/////////////////
// parameters //
/////////////////
//number of satellites required for sufficient accuracy
parameter Integer required_satellites = 4;
//power consumed when antenna is on (assumed constant) [mW]
parameter Real power_consumption = 387.2;
//time to get ephemeris data after freq&phase are locked (wrost case default)
parameter Real time_to_get_ephemeris = 59;
//frequency and phase acquisition time when exaustive search is required (random)
parameter Real freq_and_phase_acquisition_time = 0.05;
//how long the eohemeris data will be reliable
parameter Real ephemeris_duration = 1800;
///////////////////////
//Inputs and outputs //
///////////////////////
Modelica.Blocks.Interfaces.IntegerInput visible_satellites annotation(
Placement(visible = true, transformation(origin = {-101, 101}, extent = {{-11, -11}, {11, 11}}, rotation = 0), iconTransformation(origin = {-2, 102}, extent = {{-26, -26}, {26, 26}}, rotation = -90)));
Modelica.Blocks.Interfaces.BooleanInput on_signal annotation(
Placement(visible = true, transformation(origin = {-158, 92}, extent = {{-12, -12}, {12, 12}}, rotation = 0), iconTransformation(origin = {-100, 0}, extent = {{-20, -20}, {20, 20}}, rotation = 0)));
Modelica.Blocks.Interfaces.RealOutput power annotation(
Placement(visible = true, transformation(origin = {54, 104}, extent = {{8, -8}, {-8, 8}}, rotation = 0), iconTransformation(origin = {95, 43}, extent = {{-25, -25}, {25, 25}}, rotation = 180)));
//not really an input signal but just the negation of the on signal, still used as an input
Modelica.Blocks.Logical.Not off_signal annotation(
Placement(visible = true, transformation(origin = {162, -24}, extent = {{8, -8}, {-8, 8}}, rotation = 0)));
/////////////
// states //
/////////////
//number of satellites of which frequency and phase are available
Integer sv_freq_phase(start = 0);
//number of satellites of which ephemeris data are available;
Integer sv_ephemeris(start = 0);
//time at which ephemeris data will expire
Real expiration_time(start = -1.0);
//states of the state machine
inner Modelica.StateGraph.StateGraphRoot stateGraphRoot annotation(
Placement(visible = false, transformation(origin = {-90, -90}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.InitialStep no_info(nIn = 3) annotation(
Placement(visible = true, transformation(origin = {-110, 48}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.Step cold_start(nIn = 4, nOut = 2) annotation(
Placement(visible = true, transformation(origin = {-40, 48}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.Step read_ephemeris(nIn = 2, nOut = 3) annotation(
Placement(visible = true, transformation(origin = {38, 48}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.StepWithSignal position_available(nIn = 3, nOut = 4) annotation(
Placement(visible = true, transformation(origin = {112, 48}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.Step warm_start_available(nIn = 2, nOut = 2) annotation(
Placement(visible = true, transformation(origin = {70, -90}, extent = {{-10, -10}, {10, 10}}, rotation = 180)));
Modelica.StateGraph.Step warm_start(nIn = 3, nOut = 3) annotation(
Placement(visible = true, transformation(origin = {50, -38}, extent = {{10, -10}, {-10, 10}}, rotation = -90)));
/////////////////
// transitions //
/////////////////
Modelica.StateGraph.TransitionWithSignal turn_on1 annotation(
Placement(visible = true, transformation(origin = {-76, 48}, extent = {{-10, 10}, {10, -10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_on2 annotation(
Placement(visible = true, transformation(origin = {50, -66}, extent = {{10, -10}, {-10, 10}}, rotation = -90)));
Modelica.StateGraph.Transition fetch_signal1(enableTimer = true, waitTime = freq_and_phase_acquisition_time) annotation(
Placement(visible = true, transformation(origin = {-4, 48}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.Transition get_ephemeris1(enableTimer = true, waitTime = time_to_get_ephemeris) annotation(
Placement(visible = true, transformation(origin = {74, 48}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_off1 annotation(
Placement(visible = true, transformation(origin = {130, -24}, extent = {{-10, 10}, {10, -10}}, rotation = -90)));
Modelica.StateGraph.TransitionWithSignal turn_off2 annotation(
Placement(visible = true, transformation(origin = {90, -38}, extent = {{10, -10}, {-10, 10}}, rotation = 90)));
Modelica.StateGraph.Transition fetch_signal2(enableTimer = true, waitTime = freq_and_phase_acquisition_time) annotation(
Placement(visible = true, transformation(origin = {74, 18}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_off3 annotation(
Placement(visible = true, transformation(origin = {-52, 84}, extent = {{10, 10}, {-10, -10}}, rotation = 0)));
Modelica.StateGraph.TransitionWithSignal turn_off4 annotation(
Placement(visible = true, transformation(origin = {-10, 88}, extent = {{10, 10}, {-10, -10}}, rotation = 0)));
Modelica.StateGraph.Transition get_ephemeris2(enableTimer = true, waitTime = time_to_get_ephemeris) annotation(
Placement(visible = true, transformation(origin = {126, 78}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.StateGraph.Transition ephemeris_expire1(condition = time > expiration_time or sv_ephemeris < required_satellites) annotation(
Placement(visible = true, transformation(origin = {-18, -90}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.StateGraph.Transition ephemeris_expire2(condition = time > expiration_time or sv_ephemeris < required_satellites) annotation(
Placement(visible = true, transformation(origin = {0, -10}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.StateGraph.Transition ephemeris_expire3(condition = time > expiration_time or sv_ephemeris < required_satellites) annotation(
Placement(visible = true, transformation(origin = {72, 86}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.StateGraph.Transition lose_visibility1(condition = sv_freq_phase < required_satellites) annotation(
Placement(visible = true, transformation(origin = {-4, 18}, extent = {{10, -10}, {-10, 10}}, rotation = 0)));
Modelica.StateGraph.Transition lose_visibility2(condition = sv_freq_phase < required_satellites) annotation(
Placement(visible = true, transformation(origin = {110, -6}, extent = {{10, -10}, {-10, 10}}, rotation = 90)));
Modelica.Blocks.Interfaces.BooleanOutput position annotation(
Placement(visible = true, transformation(origin = {162, 30}, extent = {{10, -10}, {-10, 10}}, rotation = 0), iconTransformation(origin = {95, -27}, extent = {{25, -25}, {-25, 25}}, rotation = 0)));
equation
connect(lose_visibility2.outPort, warm_start.inPort[2]) annotation(
Line(points = {{110, -8}, {110, -8}, {110, -58}, {50, -58}, {50, -48}, {50, -48}}));
connect(lose_visibility2.inPort, position_available.outPort[4]) annotation(
Line(points = {{110, -2}, {110, -2}, {110, 10}, {130, 10}, {130, 48}, {122, 48}, {122, 48}}));
connect(turn_off2.outPort, warm_start_available.inPort[2]) annotation(
Line(points = {{90, -39.5}, {90, -88}, {81, -88}}));
connect(turn_off1.outPort, warm_start_available.inPort[1]) annotation(
Line(points = {{130, -25.5}, {130, -88}, {81, -88}}));
connect(turn_on2.inPort, warm_start_available.outPort[1]) annotation(
Line(points = {{50, -70}, {50, -88}, {59.5, -88}}));
connect(ephemeris_expire1.inPort, warm_start_available.outPort[2]) annotation(
Line(points = {{-14, -90}, {23, -90}, {23, -88}, {59.5, -88}}));
connect(turn_off1.inPort, position_available.outPort[1]) annotation(
Line(points = {{130, -18}, {130, 50}, {122.5, 50}}));
connect(fetch_signal2.outPort, position_available.inPort[2]) annotation(
Line(points = {{75.5, 20}, {93.5, 20}, {93.5, 50}, {101, 50}}));
connect(get_ephemeris1.outPort, position_available.inPort[1]) annotation(
Line(points = {{75.5, 48}, {88.5, 48}, {88.5, 50}, {101, 50}}));
connect(ephemeris_expire3.inPort, position_available.outPort[3]) annotation(
Line(points = {{76, 86}, {140, 86}, {140, 50}, {122.5, 50}}));
connect(get_ephemeris2.inPort, position_available.outPort[2]) annotation(
Line(points = {{130, 78}, {140, 78}, {140, 50}, {122.5, 50}}));
connect(get_ephemeris2.outPort, position_available.inPort[3]) annotation(
Line(points = {{124.5, 78}, {94.5, 78}, {94.5, 50}, {101, 50}}));
connect(get_ephemeris1.inPort, read_ephemeris.outPort[1]) annotation(
Line(points = {{70, 50}, {59.25, 50}, {59.25, 48}, {48.5, 48}}));
connect(lose_visibility1.inPort, read_ephemeris.outPort[3]) annotation(
Line(points = {{0, 18}, {56, 18}, {56, 50}, {48.5, 50}}));
connect(fetch_signal1.outPort, read_ephemeris.inPort[1]) annotation(
Line(points = {{-2.5, 48}, {12.5, 48}, {12.5, 50}, {27, 50}}));
connect(turn_off4.inPort, read_ephemeris.outPort[2]) annotation(
Line(points = {{-6, 88}, {54, 88}, {54, 50}, {48.5, 50}}));
connect(ephemeris_expire3.outPort, read_ephemeris.inPort[2]) annotation(
Line(points = {{70, 86}, {20, 86}, {20, 50}, {27, 50}}));
connect(lose_visibility1.outPort, cold_start.inPort[3]) annotation(
Line(points = {{-6, 18}, {-60, 18}, {-60, 50}, {-51, 50}}));
connect(fetch_signal1.inPort, cold_start.outPort[1]) annotation(
Line(points = {{-8, 48}, {-27.25, 48}, {-27.25, 50}, {-29.5, 50}}));
connect(turn_on1.outPort, cold_start.inPort[1]) annotation(
Line(points = {{-74.5, 48}, {-52.4375, 48}, {-52.4375, 50}, {-51, 50}}));
connect(turn_off3.inPort, cold_start.outPort[2]) annotation(
Line(points = {{-48, 84}, {-22, 84}, {-22, 50}, {-29.5, 50}}));
connect(ephemeris_expire2.outPort, cold_start.inPort[2]) annotation(
Line(points = {{-2, -10}, {-60, -10}, {-60, 50}, {-51, 50}}));
connect(ephemeris_expire2.inPort, warm_start.outPort[3]) annotation(
Line(points = {{4, -10}, {50, -10}, {50, -28}, {50, -28}}));
connect(fetch_signal2.inPort, warm_start.outPort[2]) annotation(
Line(points = {{70, 20}, {50, 20}, {50, -26}}));
connect(ephemeris_expire1.outPort, no_info.inPort[3]) annotation(
Line(points = {{-20, -90}, {-128, -90}, {-128, 48}, {-120, 48}, {-120, 48}}));
connect(on_signal, off_signal.u) annotation(
Line);
connect(turn_off1.condition, off_signal.y) annotation(
Line(points = {{142, -24}, {153, -24}}, color = {255, 0, 255}));
connect(turn_off2.condition, off_signal.y) annotation(
Line(points = {{102, -38}, {150, -38}, {150, -24}, {154, -24}, {154, -24}, {154, -24}}, color = {255, 0, 255}));
connect(turn_off3.condition, off_signal.y) annotation(
Line(points = {{-52, 96}, {-52, 114}, {150, 114}, {150, -24}, {154, -24}}, color = {255, 0, 255}));
connect(turn_off4.condition, off_signal.y) annotation(
Line(points = {{-10, 100}, {-10, 114}, {150, 114}, {150, -24}, {154, -24}}, color = {255, 0, 255}));
connect(turn_off2.inPort, warm_start.outPort[1]) annotation(
Line(points = {{90, -32}, {90, -32}, {90, -20}, {50, -20}, {50, -26}, {50, -26}}));
connect(turn_on2.outPort, warm_start.inPort[1]) annotation(
Line(points = {{50, -64.5}, {50, -47.5}}));
connect(on_signal, turn_on2.condition) annotation(
Line(points = {{-158, 92}, {-140, 92}, {-140, -66}, {38, -66}}, color = {255, 0, 255}));
connect(turn_off4.outPort, no_info.inPort[2]) annotation(
Line(points = {{-11.5, 90}, {-127.5, 90}, {-127.5, 50}, {-119.5, 50}, {-119.5, 50}}));
connect(turn_off3.outPort, no_info.inPort[1]) annotation(
Line(points = {{-53.5, 86}, {-127.5, 86}, {-127.5, 50}, {-119.5, 50}, {-119.5, 50}}));
connect(turn_on1.inPort, no_info.outPort[1]) annotation(
Line(points = {{-80, 50}, {-100, 50}, {-100, 50}, {-100, 50}}));
connect(on_signal, turn_on1.condition) annotation(
Line(points = {{-158, 92}, {-74, 92}, {-74, 60}}, color = {255, 0, 255}));
//power consumption OUTPUT
power = if on_signal then power_consumption else 0;
position = min(sv_ephemeris, sv_freq_phase) > required_satellites;
algorithm
when {pre(fetch_signal1.fire), pre(fetch_signal2.fire)} then
sv_freq_phase := pre(visible_satellites);
end when;
when {pre(off_signal.y) == false} then
sv_freq_phase := 0;
end when;
when {pre(visible_satellites) < pre(sv_freq_phase)} then
sv_freq_phase := pre(visible_satellites);
end when;
when {pre(visible_satellites) < pre(sv_ephemeris)} then
sv_ephemeris := pre(visible_satellites);
end when;
when {pre(get_ephemeris1.fire), pre(get_ephemeris2.fire)} then
sv_ephemeris := visible_satellites;
expiration_time := pre(time + ephemeris_duration);
end when;
when {time > pre(expiration_time)} then
sv_ephemeris := 0;
end when;
annotation(
Icon(graphics = {Rectangle(fillColor = {115, 210, 22}, fillPattern = FillPattern.Solid, extent = {{-96, 96}, {96, -96}}), Text(origin = {-54, 2}, extent = {{-20, 8}, {20, -8}}, textString = "turn_on"), Text(origin = {-45, 73}, extent = {{-17, 9}, {91, -15}}, textString = "visible_satellites"), Text(origin = {44, 41}, extent = {{-72, 15}, {22, -9}}, textString = "power_consumption"), Text(origin = {20, -27}, extent = {{-50, 11}, {50, -11}}, textString = "position_avaialble"), Text(origin = {11, -80}, extent = {{-97, 32}, {79, -24}}, textString = "GPS device")}, coordinateSystem(initialScale = 0.1)),
experiment(StartTime = 0, StopTime = 400, Tolerance = 1e-6, Interval = 0.0008));
end GPS_pw_simulator;
annotation(
uses(Modelica(version = "3.2.1")));
end GPS_pw_modeling;