实时控制软件第二周 停车场门禁控制系统的状态机的设计

控制系统的状态机设计

控制系统的状态

  • 等待车辆(waiting)
  • 起落杆上升(opening)
  • 等待车辆通过(passing)
  • 起落杆下降(closing)

外部事件 输入信号

  • 入闸传感器:汽车进入 signal_in
  • 出闸传感器:汽车离开 signal_out
  • 起落杆上传感器,起落杆升到顶部 signal_up
  • 起落杆下传感器,起落杆降到底部 signal_down

动作

  • 起落杆的生降
  • 红绿灯的变换

状态跃迁及触发信号

  • waiting 》opening 入闸传感器信号
  • opening 》passing 起落杆上传感器 灯变位绿
  • passing 》closing 出闸传感器
  • closing 》 waiting 起落杆下传感器 灯变位红

状态机的C++实现

#include <iostream>
using namespace std;

enum state { waiting, opening, passing, closing };
enum light { red,green};
enum signal { signal_in, signal_out, signal_up, signal_down};

void state_change(enum signal signal);

int main()
{
    char c=0x00;
    while (1)
    {
        c = getchar();
        switch (c)
        {
        case 'i':state_change(signal_in);
            break;
        case 'u':state_change(signal_up);
            break;
        case 'o':state_change(signal_out);
            break;
        case 'd':state_change(signal_down);
            break;
        default:
            break;
        }

    }

}

void state_change(enum signal signal)
{
    static enum state currentState = waiting;
    static enum light l = red;
    static string str_state="";
    static string str_light="";
    switch (currentState)
    {
    case waiting:
        switch (signal)
        {
        case signal_in:
            currentState = opening;
            break;
        default:
            break;
        }
    case opening:
        switch (signal)
        {
        case signal_up:
            currentState = passing;
            l = green;
        default:
            break;
        }
    case passing:
        switch (signal)
        {
        case signal_out:
            currentState = closing;

        default:
            break;
        }
    case closing:
        switch (signal)
        {
        case signal_down:
            currentState = waiting;
            l = red;
        default:
            break;
        }
    default:
        break;
    }


    //输出状态
    switch (currentState)
    {
    case waiting:
        str_state = "waiting";
        break;
    case opening:
        str_state = "opening";
        break;
    case passing:
        str_state = "passing";
        break;
    case closing:
        str_state = "closing";
        break;
    default:
        break;
    }
    switch (l)
    {
    case red:
        str_light = "red";
        break;
    case green:
        str_light = "green";
        break;
    default:
        break;
    }

    cout << "Current state:"<< str_state.c_str() << endl;
    cout << "Light color:" <<str_light.c_str() << endl;


}

1069498-20161206133919413-314907707.png

Written with StackEdit.

转载于:https://www.cnblogs.com/lvjw/p/6136802.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值