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


    画出动作转换图为:

    使用模块化设计,将起落杆、出入传感器和通行灯设计成四个模块,分别继承设计好的系统模块接口:

     1 //FSM_Interface.h
     2 #pragma once
     3 
     4 namespace FSM
     5 {
     6     
     7     class ISystemUnit                        //系统单元接口        
     8     {
     9     public:
    10         
    11         virtual void Initialize() = 0;            //初始化
    12 
    13         virtual void Execute() = 0;                //执行动作
    14 
    15         virtual void SetState(bool state) = 0;        //更改状态
    16 
    17         virtual bool GetState() const = 0;        //获得当前状态
    18 
    19         virtual void Shutdown() = 0;            //关闭
    20 
    21     protected:
    22 
    23         bool State;
    24     };
    25 }        
      1 //FSM.h
      2 #pragma once
      3 
      4 #include "FSM_Interface.h"
      5 #include <iostream>
      6 
      7 using std::cout;
      8 using std::endl;
      9 
     10 #define Up       true
     11 #define Down     false
     12 #define Green    true
     13 #define Red      false
     14 #define CarIn    true
     15 #define CarOut    false
     16 
     17 #ifdef _IOSTREAM_
     18 #define ErrorReport(ERR)
     19         {
     20             cout << #ERR << endl;
     21         }
     22 
     23 #define StateReport(STATE)
     24         {
     25             cout << #STATE << endl;
     26         }
     27 #else
     28 #define ErrorReport(ERR)
     29 #define StateReport(STATE)
     30 #endif
     31 
     32 namespace FSM
     33 {
     34     class ControlSystem sealed                     //控制系统类
     35     {
     36     public:
     37 
     38         void SystemInitialize();                  //系统初始化
     39             
     40         void SystemShutdown();                     //系统关闭
     41 
     42         void Update(bool CarState);                 //根据车的进入或进出状态更新系统状态
     43 
     44         static ControlSystem* GetInstance();      //单例模式
     45 
     46     private:
     47 
     48         static ControlSystem* pInstance;          //指向该单例的指针
     49 
     50         ControlSystem();                          //不允许显式创建对象
     51         ~ControlSystem();
     52     };
     53 
     54     class LiftLever :public ISystemUnit            //栏杆类
     55     {
     56     public:
     57 
     58         static LiftLever* GetInstance();
     59 
     60         void Initialize();
     61 
     62         void Shutdown();
     63 
     64         void Execute();
     65 
     66         void SetState(bool state);
     67 
     68         bool GetState() const;
     69 
     70     private:
     71 
     72         bool State = Down;
     73 
     74         static LiftLever* pInstance;
     75 
     76         LiftLever();
     77         ~LiftLever();
     78     };
     79 
     80     class InSensor :public ISystemUnit            //入闸传感器类
     81     {
     82     public:
     83 
     84         static InSensor* GetInstance();
     85 
     86         void Initialize();
     87 
     88         void Shutdown();
     89 
     90         void Execute();
     91 
     92         void SetState(bool state);
     93 
     94         bool GetState() const;
     95 
     96     private:
     97 
     98         bool State = false;
     99 
    100         static InSensor* pInstance;
    101 
    102         InSensor();
    103         ~InSensor();
    104     };
    105 
    106     class OutSensor :public ISystemUnit            //出闸传感器类
    107     {
    108     public:
    109 
    110         static OutSensor* GetInstance();
    111 
    112         void Initialize();
    113 
    114         void Shutdown();
    115 
    116         void Execute();
    117 
    118         void SetState(bool state);
    119 
    120         bool GetState() const;
    121 
    122     private:
    123 
    124         bool State = false;
    125 
    126         static OutSensor* pInstance;
    127 
    128         OutSensor();
    129         ~OutSensor();
    130     };
    131 
    132     class Light :public ISystemUnit                //信号灯类
    133     {
    134     public:
    135 
    136         static Light* GetInstance();
    137 
    138         void Initialize();
    139 
    140         void Shutdown();
    141 
    142         void Execute();
    143 
    144         void SetState(bool state);
    145 
    146         bool GetState() const;
    147 
    148     private:
    149 
    150         bool State = Red;
    151 
    152         static Light* pInstance;
    153 
    154         Light();
    155         ~Light();
    156     };
    157 
    158 }
      1 //FSM.cpp
      2 #include "FSM.h"
      3 
      4 namespace FSM
      5 {
      6     ControlSystem* ControlSystem::pInstance = nullptr;
      7 
      8     ControlSystem * ControlSystem::GetInstance()
      9     {
     10         if (pInstance == nullptr)
     11         {
     12             pInstance = new ControlSystem();
     13         }
     14         return pInstance;
     15     }
     16 
     17     void ControlSystem::SystemInitialize()
     18     {
     19         LiftLever::GetInstance()->Initialize();
     20         InSensor::GetInstance()->Initialize();
     21         OutSensor::GetInstance()->Initialize();
     22         Light::GetInstance()->Initialize();
     23     }
     24 
     25     void ControlSystem::SystemShutdown()
     26     {
     27         Light::GetInstance()->Shutdown();
     28         OutSensor::GetInstance()->Shutdown();
     29         InSensor::GetInstance()->Shutdown();
     30         LiftLever::GetInstance()->Shutdown();
     31     }
     32     
     33     ControlSystem::ControlSystem()
     34     {
     35     }
     36 
     37     ControlSystem::~ControlSystem()
     38     {
     39     }
     40 
     41     LiftLever* LiftLever::pInstance = nullptr;
     42 
     43     LiftLever* LiftLever::GetInstance()
     44     {
     45         if (pInstance == nullptr)
     46         {
     47             pInstance = new LiftLever();
     48         }
     49         return pInstance;
     50     }
     51 
     52     void LiftLever::Initialize()
     53     {
     54     }
     55 
     56     void LiftLever::Shutdown()
     57     {
     58         if(pInstance)
     59             delete pInstance;    
     60     }
     61 
     62     void LiftLever::SetState(bool state)
     63     {
     64         State = state;
     65     }
     66 
     67     bool LiftLever::GetState() const
     68     {
     69         return State;
     70     }
     71 
     72     LiftLever::LiftLever()
     73     {
     74     }
     75 
     76     LiftLever::~LiftLever()
     77     {
     78     }
     79 
     80     InSensor* InSensor::pInstance = nullptr;
     81 
     82     InSensor* InSensor::GetInstance()
     83     {
     84         if (pInstance == nullptr)
     85         {
     86             pInstance = new InSensor();
     87         }
     88         return pInstance;
     89     }
     90 
     91     void InSensor::Initialize()
     92     {
     93     }
     94 
     95     void InSensor::Shutdown()
     96     {
     97         if (pInstance)
     98             delete pInstance;
     99     }
    100 
    101     void InSensor::SetState(bool state)
    102     {
    103         State = state;
    104     }
    105 
    106     bool InSensor::GetState() const
    107     {
    108         return State;
    109     }
    110 
    111     InSensor::InSensor()
    112     {
    113     }
    114 
    115     InSensor::~InSensor()
    116     {
    117     }
    118 
    119     OutSensor* OutSensor::pInstance = nullptr;
    120 
    121     OutSensor* OutSensor::GetInstance()
    122     {
    123         if (pInstance == nullptr)
    124         {
    125             pInstance = new OutSensor();
    126         }
    127         return pInstance;
    128     }
    129 
    130     void OutSensor::Initialize()
    131     {
    132     }
    133 
    134     void OutSensor::Shutdown()
    135     {
    136         if (pInstance)
    137             delete pInstance;
    138     }
    139 
    140     void OutSensor::SetState(bool state)
    141     {
    142         State = state;
    143     }
    144 
    145     bool OutSensor::GetState() const
    146     {
    147         return State;
    148     }
    149 
    150     OutSensor::OutSensor()
    151     {
    152     }
    153 
    154     OutSensor::~OutSensor()
    155     {
    156     }
    157 
    158     Light* Light::pInstance = nullptr;
    159 
    160     Light* Light::GetInstance()
    161     {
    162         if (pInstance == nullptr)
    163         {
    164             pInstance = new Light();
    165         }
    166         return pInstance;
    167     }
    168 
    169     void Light::Initialize()
    170     {
    171     }
    172 
    173     void Light::Shutdown()
    174     {
    175         if (pInstance)
    176             delete pInstance;
    177     }
    178 
    179     void Light::SetState(bool state)
    180     {
    181         State = state;
    182     }
    183 
    184     bool Light::GetState() const
    185     {
    186         return State;
    187     }
    188 
    189     Light::Light()
    190     {
    191     }
    192 
    193     Light::~Light()
    194     {
    195     }
    196 }

    在FSM_Execute.cpp中实现系统响应和模块动作:

      1 //FSM_Execute.cpp
      2 #include "FSM.h"
      3 
      4 namespace FSM
      5 {
      6     void ControlSystem::Update(bool CarState)
      7     {
      8         //-----------检测到汽车进入,入闸传感器置为true-----------//
      9         //------------------触发入闸传感器执行动作---------------//
     10         if (CarState == CarIn)
     11         {
     12             StateReport(Car_In);
     13             if ((LiftLever::GetInstance()->GetState() == Down)
     14                 && (Light::GetInstance()->GetState() == Red))
     15             {
     16                 InSensor::GetInstance()->SetState(true);
     17                 StateReport(InSensor_Set_True);
     18                 InSensor::GetInstance()->Execute();
     19             }
     20             else
     21             {
     22                 ErrorReport(Check_State_Of_LiftLever_And_Light);
     23             }
     24         }
     25         //-----------检测到汽车出闸,出闸传感器置为true-----------//
     26         //------入闸传感器置为true,触发出闸传感器执行动作--------//
     27         else
     28         {
     29             StateReport(Car_Out);
     30             if ((LiftLever::GetInstance()->GetState() == Up)
     31                 && (Light::GetInstance()->GetState() == Green))
     32             {
     33                 InSensor::GetInstance()->SetState(false);
     34                 OutSensor::GetInstance()->SetState(true);
     35                 StateReport(InSensor_Set_False);
     36                 StateReport(OutSensor_Set_True);
     37                 OutSensor::GetInstance()->Execute();
     38             }
     39             else
     40             {
     41                 ErrorReport(Check_State_Of_LiftLever_And_Light);
     42             }
     43         }
     44     }
     45 
     46     void LiftLever::Execute()
     47     {
     48         if (InSensor::GetInstance()->GetState() == true)    //入闸和出闸时栏杆的执行动作不同
     49         {
     50             if (this->State == Up)                            //检查状态是否被正确切换,下同
     51             {
     52                 Light::GetInstance()->SetState(Green);
     53                 StateReport(Light_Set_Green);
     54                 Light::GetInstance()->Execute();
     55             }
     56             else
     57             {
     58                 ErrorReport(LiftLever_May_Brokendown);
     59             }
     60         }
     61         else if (OutSensor::GetInstance()->GetState() == true)
     62         {
     63             if (this->State == Down)
     64             {
     65                 Light::GetInstance()->SetState(Red);
     66                 OutSensor::GetInstance()->SetState(false);
     67                 StateReport(Light_Set_Red);
     68                 StateReport(OutSensor_Set_False);
     69             }
     70             else
     71             {
     72                 ErrorReport(LiftLever_May_Brokendown);
     73             }
     74         }
     75     }
     76 
     77     void InSensor::Execute()
     78     {
     79         if ((LiftLever::GetInstance()->GetState() == Down)
     80             && (this->State == true))
     81         {
     82             LiftLever::GetInstance()->SetState(Up);
     83             StateReport(LiftLever_Up);
     84             LiftLever::GetInstance()->Execute();
     85         }
     86         else
     87         {
     88             ErrorReport(Check_State_Of_LiftLever_Or_The_InSensor_May_Brokedown);
     89         }
     90     }
     91 
     92     void OutSensor::Execute()
     93     {
     94         if ((this->State == true))
     95         {
     96             LiftLever::GetInstance()->SetState(Down);
     97             StateReport(LiftLever_Down);
     98             LiftLever::GetInstance()->Execute();
     99         }
    100         else
    101         {
    102             ErrorReport(OutSensor_May_Brokendown);
    103         }
    104     }
    105 
    106     void Light::Execute()
    107     {
    108         if ((this->State == Green)
    109             && (LiftLever::GetInstance()->GetState() == Up))
    110         {
    111             ControlSystem::GetInstance()->Update(CarOut);        //在栏杆升起且灯变绿后汽车
    112         }                                                        //可通行,更新系统状态
    113         else
    114         {
    115             ErrorReport(Light_May_Brokendown);
    116         }
    117     }
    118 }

    以下为测试程序:

     1 //main.cpp
     2 #include "FSM.h"
     3 
     4 using namespace FSM;
     5 
     6 int main(void)
     7 {
     8     ControlSystem::GetInstance()->SystemInitialize();
     9     ControlSystem::GetInstance()->Update(CarIn);
    10     ControlSystem::GetInstance()->SystemShutdown();
    11     system("pause");
    12     return 0;
    13 }

    测试程序运行结果:

  • 相关阅读:
    有return的情况下try catch finally的执行顺序
    java面试题
    JSTL常用标签
    文件引入路径设置
    JavaScript配合button.onclick()使用总结
    Java NIO vs IO
    如何在Oracle官网下载历史版本JDK
    常量池之String.intern()方法
    MyeclipseJRE版本设置
    JVM常用参数配置
  • 原文地址:https://www.cnblogs.com/leafwaltz/p/6129988.html
Copyright © 2020-2023  润新知