关键词:
画出动作转换图为:
使用模块化设计,将起落杆、出入传感器和通行灯设计成四个模块,分别继承设计好的系统模块接口:
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.汽车车轮转速的实时监测,实时计算出轮速、参考车速、车轮加速度、滑移率等参数; &... 查看详情