Select in Modelica
Modelica does not have built-in support for concurrency or channels like some other languages. However, we can simulate a similar behavior using Modelica’s discrete event handling capabilities. Here’s an approximation of the concept:
model Select
Real startTime;
Boolean c1Active, c2Active;
String msg1, msg2;
equation
when initial() then
startTime = time;
c1Active = false;
c2Active = false;
end when;
when time >= startTime + 1 then
c1Active = true;
msg1 = "one";
end when;
when time >= startTime + 2 then
c2Active = true;
msg2 = "two";
end when;
when c1Active then
Modelica.Utilities.Streams.print("received " + msg1);
end when;
when c2Active then
Modelica.Utilities.Streams.print("received " + msg2);
end when;
when time >= startTime + 2 then
terminate("Simulation complete");
end when;
end Select;
In this example, we use Modelica’s event handling to simulate the behavior of channels and select statements. Here’s how it works:
We define two boolean variables
c1Active
andc2Active
to represent the state of our simulated channels.We use
when
equations to trigger events after 1 and 2 seconds, simulating the delayed channel sends in the original example.When each event occurs, we set the corresponding channel to active and assign a message.
Additional
when
equations detect when each channel becomes active and print the received message.Finally, we terminate the simulation after 2 seconds to mimic the behavior of the original program.
To run this model:
$ modelica Select.mo
received one
received two
Note that the execution in Modelica is inherently different from the concurrent execution in the original example. Modelica uses a time-based simulation approach, where events occur at specific time points during the simulation.
While this doesn’t directly translate the concurrency aspects of the original code, it demonstrates how you can handle multiple events and selective execution based on those events in Modelica.