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

author author     2022-08-16     639

关键词:

画出动作转换图为:

技术分享

 

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

 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 }

测试程序运行结果:

技术分享

 

实时软件控制第二周作业

停车场门禁控制系统的状态机设计门禁控制系统的输入信号包括:起落杆位置传感器:有两个位置值信号(升起/落下)汽车入闸传感器:有两个值(True/False)汽车出闸传感器:有两个值(True/False)门禁控制系统的输出信号包括... 查看详情

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

作者:李君威U201310747  状态机图示: 将起落杆的位置状态和通行灯信号作为两个类对象,汽车出入闸传感器信号作为输入,编写代码:1//qichemenjin.cpp2//CopyrightbyJustin.34#include"stdafx.h"5#include<iostream>6usingnamespacestd;7cla... 查看详情

实时控制软件设计第二周作业

一.汽车出入门禁系统状态机设计状态机所有状态:入闸传感器(两种状态):Ture False (分别用ET和EF表示)出闸传感器(两种状态):Ture False (分别用OT和OF表示)起落杆(两种状态):    UPDOWN  ... 查看详情

第二周作业停车场门禁控制系统状态机

根据要求一、输入信号1、入闸传感器:汽车进入carin2、出闸传感器:汽车离开carout3、起落杆上传感器,起落杆上升sensorup4、起落杆下传感器,起落杆下降sensordown二、输出动作1、起落杆的生降2、红绿灯的变换三、状态跃迁及触... 查看详情

实时控制软件设计作业_02_停车场门禁系统状态机

根据课堂内容,该状态机系统的状态图可描述如下: 根据状态图设计的状态机系统,C语言代码如下:1#include<iostream.h>2usingnamespacestd;34boolin=false;//汽车入闸传感器值5boolout=false;//汽车出闸传感器值6boolpos=false;//起落杆位置... 查看详情

《实时控制软件设计》第二周作业

 状态分析由题目描述,只有两种不同事件,一个是车辆进入,一个是车辆离开,与之对应的传感器信号,起落杆信号,通行灯信号都是一同变化,因此可以简化成两种复合状态。 代码实现 传感器头文件////Createdbyzhuha... 查看详情

《实时控制软件》第二周作业

首先制定各个变量名称入闸传感器:sensor_in;出闸传感器:sensor_out;起落杆上升:gan.raise();起落杆下降:gan.down();信号灯:light(1为绿,0为红);通行状态:A0为禁止通行,A1为允许通行;竖着写(在状态中判断事件)C代码片段cur_st... 查看详情

第二周作业

状态机的所有状态等待汽车起落杆上升汽车通行起落杆下降 状态机所接收到的外部事件入闸传感器:汽车进入门禁s_in出闸传感器:汽车通过门禁s_out起落杆位置传感器:起落杆到达顶部s_up起落杆位置传感器:起落杆到达底... 查看详情

停车场门禁系统状态机

...杆位置传感器到达落下位置。通行灯变为红灯。所描述的控制系统的状态机包括:状态机的所有状态状态机所接收到的外部事件状态机所产生的动作状态机的所有状态跃迁:( 查看详情

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

其状态机如下图:#include<iostream>usingnamespacestd;voidmain(){charenter_or_out;//1表示入闸传感器ture,0表示出闸传感器tureintup_or_downt=0;//1表示起落杆升起,0表示起落杆落下cout<<"状态初始化..."<<‘ ‘;cout<<"当前状态为起落杆... 查看详情

《实时控制软件设计》第一周作业

以汽车ABS系统做案例分析:工作原理:在制动时,ABS根据每个车轮速度传感器传来的速度信号,可迅速判断出车轮的抱死状态,关闭开始抱死车轮上面的常开输入电磁阀,让制动力不变,如果车轮继续抱死,则打开常闭输出电磁... 查看详情

实时软件系统设计第一次作业

实时控制软件设计第一次作业ABS系统:简称:制动防抱死系统(antilockbrakesystem)。作用:在汽车制动时,自动控制制动器制动力的大小,使车轮不被抱死,处于边滚边滑(滑移率在20%左右)的状态,以保证车轮与地面的附着力... 查看详情

《实时控制软件设计》第一周作业

查看详情

实时控制软件设计第一周作业-汽车abs软件系统案例分析

...频增压,保压,减压,防止车轮抱死。Q1.该系统有哪些强实时功能 查看详情

《实时控制软件设计》第一周作业欧梓峰u201317662

CNC插补计算程序分析一、该系统有哪些强实时功能需求?需要对哪些实时事件进行实时响应,对允许的实时延迟的数量级进行估计。答:该系统对如何控制刀具或工具的运动有强的实时控制需求,通过插补控制和位置控制以及主... 查看详情

第三次作业-实时控制软件设计

 1.阅读笔记结合本周课堂所讲的实时操作系统知识内容,浏览如下商用和开源实时操作系统网站,写一段文字向其他同学简要介绍下某个实时操作系统的性能特点或进行操作系统间性能的比较:Vxworks:www.windriver.com/products/vxwor... 查看详情

实时控制软件第二次作业

0.Fork例程到自己的GitHub账号:开发环境搭建1.QEMU安装建议使用qemu-system-gnuarmeclipse,该qemu分支对stm32f4有更好的支持,主要面向Eclipse开发环境。到网页 https://github.com/gnu-mcu-eclipse/qemu/releases/tag/gae-2.8.0-20161227 下载二进制文件... 查看详情

实时控制软件设计第一周作业

... 以汽车ABS系统的软件系统进行案例分析: 一、强实时功能需求有:1.汽车车轮转速的实时监测,实时计算出轮速、参考车速、车轮加速度、滑移率等参数;              &... 查看详情