Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名

Vehicle攻城狮

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 1

The people who are crazy enough to think they can change the world are the …

作为Simulink Tutorial系列的第二篇,这次楼主介绍的会有点多,内容主要包括:

1、枚举类型变量的定义和使用

2、宏定义和使用

3、强制类型转换

4、数据类型别名

1枚举类型-enum

在实际问题中我们总会遇到这样的情形:一场比赛结果只有胜、负、平和取消四种情况;一星期只有星期一、星期二…星期日七天等。将变量的值一一列举出来,便构成了一个枚举类型,在C语言中枚举类型的声明形式如下:enum 枚举变量名 {变量值列表};

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 2

枚举变量的一些特性可查阅C语言书籍,这里就不做详细介绍了。

Simulink如何实现如下代码?

typedef enum {

Win =0,

Fail

} Result;

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 3

首先用M语言创建一名为Result的枚举类,如下:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 4

利用Enumerated Constant模块创建如下模型:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 5
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 6

然后双击Enumerated Constant模块,对该模块进行如下设置:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 7

此时,在Command Window中输入如下命令,创建一Test参数,并对Result类实例化一初始值:Test = Simulink.Parameter(Result.Win)

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 8

在Model Explorer中将可看到创建的Test参数,如下:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 9

再对多选开关模块Block Parameters属性进行设置:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 10

生成代码后可看到定义的枚举变量:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 11
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 12

有时枚举变量是在别的.h文件中定义,而模块需要引用.h文件,此时需要修改Result.m文件,使用method方法,将定义的Result的枚举类放在自己定义的头文件中。

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 13

修改完成后再生成代码,将会发现该模块的代码会将定义枚举变量的头文件Result.h一起集成进来。

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 14
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 15

2宏定义-#define

宏定义在嵌入式开发中可以说占有举足轻重的作用,底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行。而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多。但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加。在C语言中,常用#define来定义符号常量。

Simulink如何实现如下代码?

#define K 13;

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 16

首先创建如下模型:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 17

然后在数据字典中创建如下几个变量:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 18

配置完成后将生成如下代码:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 19

但有时我们创建的某个功能模块中会使用其它头文件中已定义好的宏,例如已有定义好的头文件my_params.h文件,内容如下:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 20

而开发的某一功能中要使用该宏,那如何用Simulink实现呢?同样按照上面的创建同样的模型、信号变量和参数,进入Model Explorer,主要对参数K需要做一定的配置处理:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 21

此时生成代码,可发现参数K来自于其他头文件(此例即来自于预先定义好的my_params.h头文件)

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 23
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 24

3强制类型转换

对于某些类型的转换编译器可隐式地自动进行,不需人工干预,称这种转换为自动类型转换;而有些类型转换需要编程者显式指定,通常,把这种类型转换称为强制类型转换。虽然自动类型转换不需要人工干预,使用方便,但有利也有弊,尤其当自动类型转换是从较高类型转换为较低类型时,将会降低精度或截断数据,可能得不到预期的结果。为了给程序设计人员提供更多的类型转换控制权限,使程序设计更加灵活,转换的目的更加清晰,C 语言提供了可显式指定类型转换的语法支持,通常称之为强制类型转换。

Simulink如何实现强制类型转换?

y1 = (double)u1;

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 22

有三种方式:

3.2 Matlab Function Block

3.3 Stateflow Chart

下面分别用上面三种模块创建如下模型:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 25

然后内容及配置按照如下设置:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 26
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 27
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 28

在数据字典中创建信号变量并设置属性,并将模型信号与信号字典中的对应信号相关联

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 29

配置完成后将生成如下代码:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 30
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 31

因此可看到代码已经被强制转换成double类型,但我们可能希望看到更直接的代码表达,此时需如下所示进行如下设置:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 32

再次生成代码即可得到我们希望得到的代码:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 34

4数据类型别名-typedef

C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样,起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有unsigned char类型的变量,在定义变量时就得这样写:unsigned char a ;unsigned char看起来就是多余的,但不写又会报错,如果为unsigned char 起了一个别名u8,书写起来就简单了:u8 a ;这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名。

Simulink如何实现数据类型别名?

typedef unsigned char u8;

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 33

使用Simulink.AliasType数据对象

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 35
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 36
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 37

创建一个Simulink.AliasType对象后,在Workspace将会看到创建的对象,如下:

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 38

此时创建如下模型,并在数据字典中创建对应的信号变量和参数

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 39
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 40

此时生成代码,在代码中将会看到unsigned char数据类型将会被u8取代。

Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 41
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 42
Simulink Tutorial 2:枚举、宏定义、强制类型转换及类型别名:原文配图 43

这次篇幅有点长,主要介绍了如何用Simulink在枚举变量、宏定义、强制类型转换和类型别名四方面做一些配置从而生成可读性强的代码,啰嗦的有点多,谬误之处还请大家指正。

5参考文献

Mathworks官方文档

← 返回文章列表