Simulink相关配置:枚举量配置

发布时间:2026/6/12 18:43:58

Simulink相关配置:枚举量配置 汇聚博主多年工程经验的新书《Simulink嵌入式开发实战》现已上市针对Simulink与MBD开发技术形成了一套完整的知识体系和方法论。详细介绍和优惠链接可以参考博客《Simulink嵌入式开发实战》新书上市感谢粉丝长期以来的支持文章目录1 问题引入2 在sldd中创建枚举量2.1 枚举量的创建2.2 代码生成2.3 其他配置3 在m文件中创建枚举量3.1 枚举量的创建3.2 代码生成3.3 其他配置4 总结枚举量是Simulink数据字典中的一种对象。本文研究在数据字典中配置枚举量以及生成的代码。1 问题引入博主对枚举量的理解是通过字母而不是数字来清晰地表达某种状态。举个例子假如我们有一个灯泡它有两种状态“亮”和“灭”。在外接电压为5V的时候灯泡亮外接电压为0V的时候灯泡灭。化为一个简单的模型的话模型的输入接口就是电压输出就是灯泡状态可以建模如下。Inport1是电压值当电压等于5的时候输出的是上路的浮点数1电压不为5时输出的是下路的浮点数0。这里用数字1和0来标志灯泡是亮还是灭的状态后面的模型可以根据Switch模块的输出来做进一步的策略。这样的做法在功能上没有问题但是数字看起来很不直观也就是所谓的“魔法数字”。假如状态有十几个就要用十几个数字来表示时间长了还能回忆起谁是谁吗把数字换成字母也就是枚举量就可以解决这个问题。2 在sldd中创建枚举量2.1 枚举量的创建1新建一个模型、一个数据字典文件并将两者关联。如何建立数据字典可以参考博主另一篇博客《Simulink代码生成数据字典的建立、关联模型》。2在Model Explorer界面中选中Design Data–点击Add–点击Simulink Enumerated Type3将新建的枚举量名字改为BulbStatus意为表示灯泡状态的枚举量。4选中这个枚举量在右侧的窗口添加两个成员变量On和Off并将数值设为01。5将Default选为Off表示这个枚举量的默认值是OffStorageType选为uint8DataScope选为Auto最后Apply。6最后右键保存数据字典。7然后回到模型把Switch模块上下路的常数值替换成枚举量成员变量。用法是先写上枚举量名称BulbStatus再加个点再加上成员变量名称。运行一下模型后在图中可以看到信号线上的类型变成了枚举量名称也就是说枚举量是个类型枚举成员的背后才是个数值。2.2 代码生成Ctrl B生成下代码看看。由上图可以看出在demo.c中的if条件中把On或者Off这个枚举量成员赋值给了输出变量。那么这个On和Off又是在哪儿定义的呢打开demo_types.h文件看看。首先把BulbStatus这个枚举量定义为了uint8类型然后再用宏定义定义了枚举成员变量数值和类型都和数据字典中的配置相对应。2.3 其他配置枚举量配置也有一定的操作空间不只是上文所说的配置。1Storage Class可以配置成其他的类型会影响到typedef那个语句。2DataScope改成Exported并加上头文件可以把枚举量配置在特定的头文件中。3勾选Add Class Name To Enum Names可以将枚举量名称作为前缀表现在成员变量名字里。这一点比较实用可以看出成员属于哪个枚举量。3 在m文件中创建枚举量3.1 枚举量的创建1在当前目录或者matlab搜索路径中创建一个类文件BulbStatus.m粘贴如下枚举量定义的类classdef BulbStatus uint8 enumeration On(0) Off(1) end end这里的classdef后面的类名要和文件名一致号后面是类型2不用做任何引入只要该文件在Matlab的搜索路径中2.1的模型就可以引用到该处的枚举量定义3.2 代码生成按照3.1中的定义代码生成和上文一致。另外如果将类定义改成如下所示即类型从uint改成Simulink.IntEnumType生成的代码就会有所不同。classdef BulbStatus Simulink.IntEnumType enumeration On(0) Off(1) end endCtrlB生成代码后可以看到定义枚举量的方式从宏定义的方式变成了typedef的方式。这种方式更符合学校里学到的C语言的枚举量定义习惯。博主没有研究出在sldd中定义枚举量怎样生成这种typedef的形式所以如果有需要这种形式的话可以在m文件中定义。3.3 其他配置用m文件的方式定义枚举量也可以定义头文件等配置。例如将类文件改为如下所示classdef BulbStatus Simulink.IntEnumType enumeration On(0) Off(1) end methods (Static) function retVal getDefaultValue() % 定义默认值 retVal BulbStatus.On; end function retVal getDescription() % 描述信息 retVal 灯泡的状态; end function retVal getHeaderFile() % 头文件 retVal BulbStatusDef.h; end function retVal getDataScope() % DataScope retVal Exported; end function retVal addClassNameToEnumNames() % 将枚举量名称作为前缀表现在成员变量名字里 retVal true; end end endmethods下的每个函数都对应了在sldd中手动配置的方法这里就不再生成代码演示。4 总结枚举量在建模的过程中十分常用所以应该熟练地掌握枚举量的创建方法并对代码了如指掌。返回个人博客总目录

相关新闻