• 实时软件控制第二周作业


    停车场门禁控制系统的状态机设计

    门禁控制系统的输入信号包括:

    • 起落杆位置传感器:有两个位置值信号(升起/落下)
    • 汽车入闸传感器:有两个值(True/False)
    • 汽车出闸传感器:有两个值(True/False)

    门禁控制系统的输出信号包括:

    • 起落杆电机控制信号:(上升/下降)
    • 通行灯信号:(红灯/绿灯)

    一辆汽车的通过流程为:

    • 起落杆处于落下状态,通行灯为红灯。
    • 汽车进入门禁系统,入闸传感器值变为True。
    • 控制起落杆上升,直到起落杆位置传感器到达升起位置。
    • 通行灯为绿灯。
    • 汽车离开门禁,触发汽车出闸传感器值为True。
    • 控制起落杆下降,直到起落杆位置传感器到达落下位置。
    • 通行灯变为红灯。

    所描述的控制系统的状态机包括:

    • 状态机的所有状态
    • 状态机所接收到的外部事件
    • 状态机所产生的动作
    • 状态机的所有状态跃迁:(原状态、新状态、触发条件、产生动作)

    首先设:

    Q1代表可以通行的状态;

    Q2代表不能通行的状态;

    W1代表汽车进入门禁系统这个事件;

    W2代表汽车离开门禁系统这个事件;

    E1代表起落杆上升,通行灯变绿灯;

    E2代表起落杆下降,通行灯变红灯;

     

     

    当前状态

    Q1

    Q2

    事件

     

    ---

    E1/Q1

    W1

     

    E2/Q2

    ---

    W2

     

    竖着写(在状态中判断事件)C代码片段:

    cur_state = nxt_state;  

    switch(cur_state) //在当前状态中判断事件

    {           

        case Q2: //在s1状态

            if(W1_event) //如果发生W1事件,那么就执行E1动作,并将状态转移到Q1态;

            {                

               Lifting_lever.raise();//执行E1动作;

             nxt_state = Q1;

            }          

            else

            {

          break;

            }

     

     case Q1: //在Q1状态  

            if(W2_event) //如果发生W2事件,那么就执行E2动作,并将状态转移到Q2;

            {  

               Lifting_lever.down();//执行E2动作;              

            nxt_state = Q2;

            }

          

            else

            {

                break;   

            }  

    }

     

    在http://kb.cnblogs.com/page/528972/上面了解到状态机的两种写法,横写和竖写

    横竖两种写法的代码片段,实现的功能完全相同,但是,横着写的效果明显好于竖着写的效果。理由如下:

      1、竖着写隐含了优先级排序(其实各个事件是同优先级的),排在前面的事件判断将毫无疑问地优先于排在后面的事件判断。这种if/else if写法上的限制将破坏事件间原有的关系。而横着写不存在此问题。

      2、由于处在每个状态时的事件数目不一致,而且事件发生的时间是随机的,无法预先确定,导致竖着写沦落为顺序查询方式,结构上的缺陷使得大量时间被浪费。对于横着写,在某个时间点,状态是唯一确定的,在事件里查找状态只要使用switch语句,能一步定位到相应的状态,延迟时间可以预先准确估算。而且在事件发生时,调用事件函数,在函数里查找唯一确定的状态,并根据其执行动作和状态转移的思路清晰简洁, 效率高,富有美感。

    这里之所以使用竖着写的方法,是因为这是个小项目,逻辑不太复杂,功能精简,同时为了节约内存耗费,所以竖着写的方法也不失为一种合适的选择。

  • 相关阅读:
    【shell】日志切割
    【PHP】SVN版本差异导出
    Linux服务器上安装JDK
    Linux 下node环境安装
    CentOS 7.3安装mariadb
    Centos 7.4 自动初始化docker环境,配置docker镜像仓库
    Shell 模板 (Yes or NO)
    Linux修改时间和时区
    lvm方式挂载盘及扩容
    安装ansible
  • 原文地址:https://www.cnblogs.com/jzhyb/p/6138828.html
Copyright © 2020-2023  润新知