【MBD开发】Simulink中的枚举

01
什么是枚举

按百度百科的词条【枚举】是在编程语言中用来存储一组固定的常量。不同编程语言的枚举语法也不一样,以C语言为例。

typedef enum{ GEAR_P, //0:P挡 GEAR_R, //1:倒挡 GEAR_N, //2:空挡 GEAR_D, //3:前进} _GEAR;

上面枚举了一个_GEAR数据,用GEAR_P表示0,GEAR_R表示1……

if(current_gear== GEAR_P){  ……}

判断P挡,并执行相关逻辑

target_gear=GEAR_D

赋值当前挡位为D挡。好处很明显,方便记忆!不然每次判断挡位或者赋值都要去翻看协议!

typedef enum{    GEAR_P,       //0:P挡    GEAR_N,       //1:空挡    GEAR_R,       //2:倒挡    GEAR_D,       //3:前进} _GEAR;

另外一个好处就是,数据与程序解耦。如上述代码,经过1定义为空挡,2定义为R挡位。但是对程序本身一点影响都没有。

02
没使用枚举的模型

可能看完上面对枚举的描述后,先来看看不带枚举的Simulink模型,作为baseline。模型的大致逻辑是使用Stateflow搭建一个状态机,实现两个ECU的握手交互。

其中

auto_drive_req:boolean;

vcu_status:uint8;

system_status:uint8;

stateflow中赋值与判断直接使用数值

仿真测试中,得到的system_status以为数值形式进行表示。如果不去看协议,哪里知道这1、2、3、4分别代表什么?而且,实际项目中这种情况很多,有可能记错啥的,最后debug的话简直蛋疼到不行!

03
使用枚举的模型

在数据字典中创建枚举,在【Model Explorer】中选择【Add】->【SimulinkEnumerated Type:Simulink枚举类型 】

创建两个枚举分别是VCU_ST和SYS_ST,右边的Design选项卡下,定义具体的枚举内容

并且指派vcu_status的数据类型为VCU_ST,system_status的数据类型为SYS_ST

打开Stateflow可以看到baseline模型中的数值全部被枚举替代,大大提高模型逻辑的可读性!

运行仿真从示波器可以直接看出具体的状态切换,非常直观!

使用Embeed Coder生成代码后,在头文件可以看到生成的枚举类型

而在switch中生成的判断与复制语句也用上了头文件中申明的枚举类型。所以,使用枚举类型与baseline对比后,你们觉得哪个比较优秀呢?

(0)

相关推荐