next up previous contents index
Next: Vending Machine Up: Atomic DEVS Examples Previous: Atomic DEVS Examples   Contents   Index


Timer

An example, Ex_Timer, shows how to define a concrete atomic class from Atomic. In Timer.cs file, Timer is defined to generat an output op every 3.3 seconds as illustrated in Figure 3.1.

Figure 3.1: Timer (a) State Transition Diagram (b) Event Segment (c) $ t_e$ Trajectory
\begin{figure}\centering\mbox {\epsfig{file=Timer,width=.8\columnwidth}}
\end{figure}

Thus Timer has one output port op that is op is assigned by calling AddOP in the constructor. The function init() does nothing because the class has no internal variable. The function tau() returns 3.3 all the time.

    public class Timer : Atomic
    {
        private OutputPort op;

        public Timer(string name): base(name, TimeUnit.Sec)
        {   op = AddOP("op"); init(); }
        public override void init(){}
        public override double tau() { return 3.3; }

Since there is no input transition defined, delta_x has the null body except returns false 4.1. However, delta_y returns the output op by making the output event y set to op.

        public override bool delta_x(PortValue x) { return false; }
        public override void delta_y(ref PortValue y) { y.Set(op);  }
The display function Get_s() returns the current status, which is constantly Working.
        public override string Get_s() { return "Working"; }
    }

The file Program_Timer.cs has the main function for a console application as follows. As we can see, we make an instance timer from Timer class. And then we make an instance of SRTEngine. Here, we don't have to pass the third Callback function argument because this Timer example doesn't need the user input. Finally, this codes run the console menu of SRTEngine class.

    class Program
    {
        static void Main(string[] args)
        {
            Timer timer = new Timer("STimer");
            SRTEngine Engine = new SRTEngine(timer, 10000, null);
            Engine.RunConsoleMenu();
        }
    }

If you try step, you can see the animation is increasing the elapsed time. The following display shows the state at time 2.188 where the schedule time t_s=3.3 and the elapsed time t_e=2.188.

    (STimer:Working, t_s=3.300, t_e=2.188) at 2.188
The simulation run will stop at 3.3 because its run mode is step-by-step when using step. At that time, it will display the discrete state transition as follows.
    (STimer:Working, t_s=3.300, t_e=3.300)
     --({!STimer.op},t_c=3.3)-->
    (STimer:Working, t_s=3.300, t_e=0.000)
The first state is the source of state transition. An arc shows a triggering event which is the output op of STimer at the current time=3.3. The second state is the destination of the state transition in which the lifespan is also 3.3 but the elapsed time has been reset to zero.

Exercise 4.1   Consider the example Ex_Timer.
a.
Let's change the display mode from te to tr by applying the command dtmode. Then preset the simulation ending time to ``5'' by pause_at 5. Now run until the simulation stops. When it stops at t_c=5, print the total state using pinrt with option q. What are the values of t_s and t_r, respectively? Guess the value of t_e at this moment.
b.
Add one more state variable int n in Timer class. n should be set = zero in init(), and it should increase by one in delta_y(). Get_s() shows n in the string format
 string.Format("Working, n={0}", n);


next up previous contents index
Next: Vending Machine Up: Atomic DEVS Examples Previous: Atomic DEVS Examples   Contents   Index
MHHwang 2007-05-08