首页 > 编程语言 >C/C++思考:命令模式在控制中的应用

C/C++思考:命令模式在控制中的应用

时间:2023-05-12 18:12:21浏览次数:38  
标签:控制 模块 电机 模式 命令 Command C++ 信号 思考

目录

意义

先说结论:命令模式能有效对代码模块进行解耦,增强模块的扩展性以及可移植性。

问题

为了方便说明问题,假设现在有一个电机Motor,在识别到外界信号后,通过软件控制其旋转。需要支持的旋转方式为3种:正转、反转、振动。

最直接,也是最传统方法,是通过软件设置一个电机控制器MotorController模块(或类),周期性读取从外界信号,当信号满足一定条件时,就驱动电机按所想方式旋转。如下图所示:

注:上面框图省略了控制电机的驱动电路

这种模式优点是简单、直接,但有个缺点是MotorController不仅要控制电机,还绑定了具体的输入信号signal1、signal2、signalN。这就导致了,一旦信号种类、个数,甚至决策方式发生改变,就需要修改MotorController代码。

而电机的旋转方式,实际上跟信号本身并无直接关系,信号只是触发条件。如果把电机控制这部分功能由MotorController实现,而信号决策专门抽象出来形成新的模块ModuleA~ModuleM(根据具体项目需要来决定),决策模块通过向电机控制模块发生命令,以驱动电机。从而实现信号决策与电机控制解耦。

用命令模式解决电机控制与输入信号耦合问题

根据上面的分析,我们可以设置2个模块:
1)决策模块,专门用来处理输入信号,决定向电机控制模块发送何种(请求)命令。因为输入信号可能由多个模块产生,又有不同组合,因此,可能存在多个决策模块实例。

2)电机控制模块,专门用来接收控制命令,然后根据当前电机状态来决定如何执行命令,也可以不执行。因为电机(控制电路)通常只有一个,所以电机控制模块通常只有一个实例。

于是,可以写出如下伪代码:

  • 电机控制模块
// 电机控制命令
typedef enum : int{
    Command_None = 0, // 空命令
    Command_CW,    // 正转
    Command_CCW,   // 反转
    Command_SHAKE, // 振动
} Command;

/// 电机控制模块
class MotorController {
public:
    // 定时轮询接口, 提供电机控制任务main函数入口
    static void mainTask();
    void sendCommand(Command command);


private:
    void handleCommand();


    Command currentCommand_;
    Command newCommand_;
};
  • 决策模块

这里只写2个作为示意:

class ModuleA {
public:
    void receiveSignal(int signalNo, int signalVal);

    static void mainTask();
};

class ModuleB {
public:
    void receiveSignal(int signalNo, int signalVal);

    static void mainTask();
};

实践中, 通常具体的决策模块只会接收固定的信号。如果对应信号产生源,则便于程序员理解。例如,车载ESP产生车速信号,BCM产生带扣信号,那么可以在程序中设置虚拟的ESP、BCM模块,作为控制模块,专门分别用来接收车速信号、带扣信号,决策是否向电机控制模块发送控制命令。

与标准命令模式的区别异同

当然,这并非标准的命令模式。标准命令模式通常包含了执行命令的代码,而我们上面用来控制电机的命令,仅仅是一个枚举类型,并不包含任何绑定的函数。

然而,我们仔细分析命令模式,其意图是这样的:

命令模式通过将请求封装到一个命令(Command)对象中,实现了请求调用者和具体实现者之间的解耦。

可以将枚举类型的命令看做一个对象,实现请求调用者与具体实现者的解耦。因为,决策者希望电机旋转,但又不必了解电机如何旋转;实现者不关心各种输入信号,只关心执行何种命令,如何控制电机端细节。
可见,其基本思想是相同点。

标签:控制,模块,电机,模式,命令,Command,C++,信号,思考
From: https://www.cnblogs.com/fortunely/p/17395986.html

相关文章

  • 对工厂模式一次感悟
    从开始接触设计模式的“什么都可以用设计模式去设计”,到接触一段时间之后的“用什么设计模式,直接莽就是了”。一直到现在,对设计模式的认知一直都处在一个模糊的状态。之前虽然也自己尝试在项目中使用一些设计模式,但总是体会不到设计模式在实际使用中的好处,直到最近,接触到了一种业......
  • 台达PLC-EH3.铆压机,3轴,Z轴(SMC)电缸下降的距离用的是位置加扭矩模式,台达PLC MODBUS通
    台达PLC-EH3.铆压机,3轴,Z轴(SMC)电缸下降的距离用的是位置加扭矩模式,台达PLCMODBUS通讯控制台达A2伺服扭矩,自动上下料,每个点位可跳点,可设位置和扭矩,PLC程序有完整的注释,触摸屏程序,伺服参数设定程序.电气BOM.电气CAD图纸。ID:3618670233899230......
  • Java设计模式【单例模式】
    Java设计模式【单例模式】单例模式单例模式(SingletonPattern)是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供对该实例的唯一访问点。优缺点优点:提供了对唯一实例的受控访问。由于在系统内存中只存在一个对象,因此可以节约系统资源。缺点:单例类的......
  • Java设计模式简介(总结)
    Java设计模式简介(总结)什么是设计模式Java设计模式是一组经过验证的解决特定问题的编程技术,这些技术可以帮助开发人员快速、有效地开发高质量的软件。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式分类设计模式一般分为三大类:创建型、结构......
  • java 的 JDK JRE , android 的 SDK NDK , native c++ 的概念
       ......
  • 网络中的数据传输模式有哪些-镭速
    数据传输模式定义了两个通信设备之间信息流的方向,也称为数据通信或定向模式,同事也规定了信息在计算机网络中从一处流向另一处的方向。在开放系统互连(OSI)层模型中,物理层专用于网络中的数据传输。它主要决定数据到达接收器系统或节点所需的数据方向。因此,在本文中,我们将了解基于......
  • 三菱FX3U分切机程序,采用三菱伺服的速度与力矩模式,收料采 用锥度与恒张力两种控制模式,
    三菱FX3U分切机程序,采用三菱伺服的速度与力矩模式,收料采用锥度与恒张力两种控制模式,程序包含锥度计算详细步骤,有模拟量输入输出,有张力检测,有PID调节,是锂电行业分切机通用程序模板ID:928663490034512......
  • 西门子 s7-1200和V90伺服3轴PTO 原创,配西门子触摸屏,PTO模式控制3轴
    西门子s7-1200和V90伺服3轴PTO原创,配西门子触摸屏,PTO模式控制3轴,CAD图/PTO伺服控制方法详解。只有RFID读写FB块是SCL语言,真实项目,可作学习,也可以用到别的项目,我已写好伺服FB块,调用时只要写上相应的地址就可以用,不用再每个轴写大量梯形图,非常方便省事,程序没有密码可以增减功能。ID......
  • python Django项目以Debug模式启动和外网访问启动
    一、Django介绍介绍:完善的web框架,包括前端和后端的管理,django项目管理;管理后台访问:后面补充前端页面访问:根据app/settings.py文件下配置的访问地址1.1项目结构1.1.1app项目配置文件存放settings.py、urls.py、wsgi.py等1.1.2子应用配置Migrations:数据库模型的脚本,......
  • 【C++之内联函数和模板】
    内联函数(inline):1.使用关键字inline修饰的函数叫做内联函数,内联函数可以提升程序运行效率。2.内联函数是一种用空间换取时间的方法,省去了调用函数的时间,会将函数代码拷贝过来占用空间,所以很长的代码不适合转变内联函数。3.如果定义为inline的函数体过大,编译器优化时会忽略掉内......