next up previous contents index
Next: Monorail System Up: Monorail System Previous: Monorail System   Contents   Index

Station

First of all, a macro REMEMBERING in the first line in Station.cs file is defined for testing the effect of monitoring the next station's status using nso.
#define REMEMBERING // for testing the effect of using nso

The class Station has several state variables: m_phase being one of enum PHASE {Sending, Empty, Loading, Waiting, Collided}; bool init_occupied indicating the initial occupation state of the station, bool nso indicating if the next station is occupied or not; and the constant variable double loading_t indicating the lifespan of a state when its phase is Loading.

Station has two input port ipull and ivehicle, one output port ovehicle. These variables, including ports, are assigned in the constructor as follows.

    public class Station: Atomic
    {
        enum PHASE {Sending, Empty, Loading, Waiting, Collided}
        PHASE m_phase;

        readonly bool   init_occupied;
        bool   nso; //next_state_occpied
        readonly double loading_t;

        public InputPort ipull, ivehicle;
        public OutputPort ovehicle;

        public Station(string name, bool occupied, double lt):
            base(name, TimeUnit.Sec)
        {
            init_occupied =occupied;
            loading_t = lt;
            nso =true;
            ipull = AddIP("pull"); ivehicle = AddIP("vehicle");
            ovehicle = AddOP("vehicle");
            init();
        }

Station::init() initializes m_phase depending on init_occupied such that m_phase = Sending if init_occupied is true, otherwise, m_phase = Empty.

    public override void init()
    {
        if(init_occupied == true)
            m_phase = PHASE.Sending;
        else
            m_phase = PHASE.Empty;
    }
Station::::tau() returns the lifespan of each state; 10 for Sending; loading_t for Loading; $ \infty$ otherwise.
    public override double tau()
    {
        if (m_phase == PHASE.Sending)
            return 10;
        else if (m_phase == PHASE.Loading)
            return loading_t;
        else
            return double.MaxValue;
    }
Station::delta_x defines the input transition such that if it receives an input through ipull, it marks nso = false which means that ``the next station is not occupied any more''. At that time, if the station's phase is Waiting, delta_x then changes the phase to Sending. To remember the next station be occupied by this Sending action, Station::delta_x sets nso=tru and returns true.

When a station receives a vehicle through ivehicle port, if phase is Empty, its phase changes into Loading; otherwise the phase changes into Collided.

    public override bool delta_x(PortValue x)
    {
        if( x.port == ipull) {
            nso = false;
            if (m_phase == PHASE.Waiting)
            {
#if REMEMBERING
            nso = true;
#endif
                m_phase = PHASE.Sending;
                return true;
            }
        }
        else if(x.port == ivehicle) {
            if(m_phase == PHASE.Empty)
                m_phase = PHASE.Loading;
            else // rest cases lead to Colided!
                m_phase = PHASE.Collided;
            return true;
        }
        return false;
    }
Station::delta_y defines the output transition behavior such that, at the end of Loading phase, if nso=true, then delta_y changes the stations' phase into Waiting. But if nso=false, delta_y marks nso=true for remembering the next station's occupation and changes the station's phase to Sending. At the end of Sending phase, it sends out the vehicle through ovehicle port and changes the station's phase to Empty.
    public override void delta_y(ref PortValue y)
    {
        if (m_phase == PHASE.Loading)
        {
            if(nso == true)
                m_phase = PHASE.Waiting;
            else {
#if REMEMBERING
            nso = true;
#endif
                m_phase = PHASE.Sending;
            }
        }
        else if (m_phase == PHASE.Sending)
        {
            y.Set(ovehicle);
            m_phase = PHASE.Empty;
        }
    }
The displaying function Get_s() is overridden to return a string containing information about m_phase and nso as follows.
    public override string Get_s()
    {
        return string.Format("phase= {0}, nso= {1}", m_phase, nso);
    }


next up previous contents index
Next: Monorail System Up: Monorail System Previous: Monorail System   Contents   Index
MHHwang 2007-05-08