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

2024-03-02 03:30

本文主要是介绍第二周作业、停车场门禁控制系统状态机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

状态机设计分析

根据要求,可以分为四个状态,令起落杆上限位传感器为TopSensor,下限位传感器为BottomSensor,汽车入闸传感器为CarIn,汽车出闸传感器为CarOut,则有

  • S1:Idle
    • 进入时设置通行灯为红灯,电机停止。
    • 当汽车入闸传感器CarIn变为True时,转移到状态S2
  • S2: BarrierRising
    • 进入时设置电机正转,保持通行灯状态
    • 当上限位传感器TopSensor变为True时,转移到状态S3
  • S3: CarDriving
    • 进入时设置通行灯为绿灯,电机停止
    • 当汽车出闸传感器CarOut变为True时,转移到状态S4
  • S4:BarrierFalling
    • 进入时设置电机反转,保持通行灯状态
    • 当下限位传感器BottomSensor变为True时,转移到状态S1

根据以上设计,建立模型。

状态机建模

状态机模型

运行示例

模拟运行

模型文件

见Github仓库

C++ 实现

以Simulink Stateflow的模块为模板,作出以下设计。

状态机抽象

首先,设计三个类:一个用于表示状态,可以通过一个函数,检查绑定的触发条件,并返回符合条件的下一状态。类声明如下:

class State {
public:std::string Name;State(std::string);State* Trigger(void);void Add(std::function<bool(void)> fn, State* NextState);void SetEntry(void(*fn)(void));void Entry(void);private:std::vector<std::function<bool(void)>> Condition;std::vector<State*> NextState;void (*FnEntry)(void);
};class Machine {
public:Machine(State *InitState);void SetState(State *state);State *Curr;void Trigger(void);
};

一个类为布尔型传感器类,继承于传感器类模版。声明分别为:

template <typename T>
class TSensor {
protected:T value;public:TSensor(){}TSensor(T value) {this->Set(value);}void Set(T value) {this->value = value;}T Get(void) {return this->value;}
};class BoolSensor: public TSensor<bool> {
public:BoolSensor(bool value);bool IsTrue(void);bool IsFalse(void);
};

另一个类则为模拟机,模拟触发状态检查,并维护状态机的当前状态,同时在改变状态时能够触发相应的进入操作。类声明如下:

class Machine {
public:Machine(State *InitState);void SetState(State *state);State *Curr;void Trigger(void);
};

组装模型


// 定义传感器// 测试模型时所有传感器默认值均设为true,正常情况应默认为falseBoolSensor CarIn{true};BoolSensor CarOut{true};BoolSensor TopSensor{true};BoolSensor BottomSensor{true};// 定义状态State S1{"Idle"};State S2{"Barrier Rising"};State S3{"Car Driving"};State S4{"Barrier Falling"};// 设置状态转移及入口动作S1.SetEntry(&S1_Entry);S1.Add(std::bind(&BoolSensor::IsTrue, &CarIn), &S2);S2.SetEntry(&S2_Entry);S2.Add(std::bind(&BoolSensor::IsTrue, &TopSensor), &S3);S3.SetEntry(&S3_Entry);S3.Add(std::bind(&BoolSensor::IsTrue, &CarOut), &S4);S4.SetEntry(&S4_Entry);S4.Add(std::bind(&BoolSensor::IsTrue, &BottomSensor), &S1);

其中,SetEntry为设置状态机的进入状态时的触发动作。

初始化并模拟运行

初始状态为S1,即Idle状态。

    Machine simulate{&S1};while (1) {simulate.Trigger();sleep(1);}

运行效果

Set State <Idle>
Light: Red
Motor: Stop
Switch From <Idle> to <Barrier Rising>
Light: Red
Motor: Forward Revolute
Switch From <Barrier Rising> to <Car Driving>
Light: Green
Motor: Stop
Switch From <Car Driving> to <Barrier Falling>
Light: Green
Motor: Backward Revolute
Switch From <Barrier Falling> to <Idle>
Light: Red
Motor: Stop
...

源代码

见Github仓库

References

[1] [https://cn.mathworks.com/help/stateflow/ug/programming-your-chart-with-matlab-syntax.html]

转载于:https://www.cnblogs.com/passerby233/p/rtcsd_w2_design_parking_lot_barrier_control_system.html

这篇关于第二周作业、停车场门禁控制系统状态机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/764764

相关文章

详解Java中三种状态机实现方式来优雅消灭 if-else 嵌套

《详解Java中三种状态机实现方式来优雅消灭if-else嵌套》这篇文章主要为大家详细介绍了Java中三种状态机实现方式从而优雅消灭if-else嵌套,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录1. 前言2. 复现传统if-else实现的业务场景问题3. 用状态机模式改造3.1 定义状态接口3

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

基于人工智能的智能家居语音控制系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 随着物联网(IoT)和人工智能技术的发展,智能家居语音控制系统已经成为现代家庭的一部分。通过语音控制设备,用户可以轻松实现对灯光、空调、门锁等家电的控制,提升生活的便捷性和舒适性。本文将介绍如何构建一个基于人工智能的智能家居语音控制系统,包括环境准备

Java高级Day38-网络编程作业

112.网络编程作业 //1.使用字符流的方式,编写一个客户端程序和服务器端程序//2.客户端发送"name",服务器端接收到后,返回"我是nova"//3.客户端发送"hobby",服务器端接收到后,返回"编写java程序"//4.不是这两个问题,回复"你说啥呢"​​===============//客户端//===============public class SocketT

0906作业+思维导图梳理

一、作业: 1、创捷一个类似于qq登录的界面 1)源代码 #include "widget.h"#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget){ui->setupUi(this);//QPushbutton:登录、退出this->join = new QP

基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述        基于PI控制算法的异步感应电机转速控制系统simulink建模与仿真。PI控制器是一种经典的线性控制器,它通过将控制量的比例部分和积分部分相结合来实现对系统输出的调节。比例部分用于快速响应偏差,而积分部分则用于消除稳态误差。 2.系统仿真结果 (完整程

什么是网络准入控制系统?网络准入控制系统七大品牌介绍!

在当今信息化时代,企业网络安全面临着前所未有的挑战。网络准入控制系统(NAC, Network Access Control)作为一种重要的网络安全技术,扮演着守护企业网络安全大门的关键角色。网络准入控制系统通过对接入网络的设备进行身份验证、安全状态评估和权限控制,以确保只有符合安全策略的设备才能访问网络资源。 1.Cisco ISE Cisco ISE是一款全面的NAC解决方案,旨在确保

基于51单片机的智能小车转向控制系统设计与实现

文章目录 前言资料获取设计介绍功能介绍具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品