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

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

相关文章

作业提交过程之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等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机设计精品

STM32F4按键状态机--单击、双击、长按

STM32F4按键状态机--单击、双击、长按 一、状态机的三要素二、使用状态机原因2.1资源占用方面2.2 执行效率方面:2.3 按键抖动方面: 三、状态机实现3.1 状态机分析3.1 程序实现 百度解析的状态机概念如下 状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心。有限状态机简写为FSM(

基于CPIH系列彩灯循环控制系统

1.设计目标 见下图所示: 2.设计方案 本次设计采用欧姆龙公司CHIP系列,基于CX_ONE PROGRAM软件实现 梯形图如下 3.方案论证 1.正常1S循环 其PLC_数据跟踪波形图如下 2.设定循环时间波形图如下 4.外围接线图 5.备注 可能很多人不知道数据跟踪这个功能怎么使用,本人觉得有必要说明一下 虽然自带的数据跟踪可以得到每个地址的数据,

2024.9.6 作业

1> 手写unique_ptr指针指针 #include <iostream>using namespace std;template <typename T>class my_unique_ptr{public:explicit my_unique_ptr(T *p = nullptr) noexcept // 构造函数{ptr = p;}~my_unique_ptr() noexcep