【MBD开发】Simulink中的枚举
按百度百科的词条【枚举】是在编程语言中用来存储一组固定的常量。不同编程语言的枚举语法也不一样,以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挡位。但是对程序本身一点影响都没有。
可能看完上面对枚举的描述后,先来看看不带枚举的Simulink模型,作为baseline。模型的大致逻辑是使用Stateflow搭建一个状态机,实现两个ECU的握手交互。
其中
auto_drive_req:boolean;
vcu_status:uint8;
system_status:uint8;
stateflow中赋值与判断直接使用数值
仿真测试中,得到的system_status以为数值形式进行表示。如果不去看协议,哪里知道这1、2、3、4分别代表什么?而且,实际项目中这种情况很多,有可能记错啥的,最后debug的话简直蛋疼到不行!
在数据字典中创建枚举,在【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对比后,你们觉得哪个比较优秀呢?