Simulink代码生成: 基本数据类型

文章目录

  • 1 引言
  • 2 Simulink中的基本数据类型
  • 3 数据类型实例
    • 3.1 浮点类型
    • 3.2 整数类型
    • 3.3 布尔类型
  • 3 数据类型使用的注意点
    • 3.1 浮点数等于比较
    • 3.2 整形数溢出
    • 3.3 布尔类型的位域
  • 4 关于定点数的说明
  • 5 总结

1 引言

正如C语言中为变量区分了不同的数据类型一样,Simulink中也有不同的数据类型,并且与C语言数据类型关系紧密。本文研究Simulink中的基本数据类型的用法和一些相关的配置。

2 Simulink中的基本数据类型

在Simulink中,基本数据类型分为浮点类型、整数类型和布尔类型,具体有以下几种。

数据类型名称含义存储大小范围
double双精度浮点型4字节-1.7E-308~1.7E+308
single单精度浮点型8字节1.2E-38 ~ 3.4E+38
int8有符号 8 位整数1字节-128 ~ 127
uint8无符号 8 位整数1字节0 ~ 255
int16有符号 16 位整数2字节-32,768 ~ 32,767
uint16无符号 16 位整数2字节0 ~ 65,535
int32有符号 32 位整数4字节-2,147,483,648 ~ 2,147,483,647
uint32无符号 32 位整数4字节0 ~ 4,294,967,295
boolean布尔类型1字节0~1

后文会举例说明不同类型的使用方法及一些注意点。

3 数据类型实例

3.1 浮点类型

浮点类型就是具有浮动小数点的数据类型,用于表示小数。
首先,通过下面的Simulink建模示例,可以清楚地了解浮点类型的用法。

1)新建一个Simulink模型<Data_Type_Basics.slx>,在模型中搭建以下简单模块;
在这里插入图片描述
2)分别双击Inport1和Inport2,打开配置界面,将Data type分别配置为single和double;

在这里插入图片描述

3)分别双击Gain模块,并对应配置DataType为single和double;

在这里插入图片描述
4)在Debug工具栏中点击Base Data Types,可以在信号线上显示数据类型;

在这里插入图片描述

完成后Ctrl + D更新模型,就可以看到信号线上的数据类型分别是single和double。

在这里插入图片描述
在模型中配置浮点数的方法如上文所示。接着,通过将模型生成代码,可以在C语言的层面上进一步理解Simulink中的浮点类型,以及和C语言中浮点类型的关系。

1)生成代码前,先配置好Embedded Coder,并且Ctrl + B生成代码;

在这里插入图片描述
在<Data_Type_Basics.h>头文件中可以看到Inport1和Inport2的类型是real32_T和real_T。

2)接着打开<rtw_types.h>头文件;

在这里插入图片描述
在该文件中通过typedef关键字将real32_T和real_T分别定义为C语言的基础类型float和double,也就是单精度和双精度浮点型数。这种做法在C语言中很常见,是为了不直接使用C语言中的基础类型,而是在新的名称中可以直观地看出该类型所占的字节数。

这些被定义好的新的类型名称,也是在Simulink中可以配置的,具体参照下图。

在这里插入图片描述

3.2 整数类型

整数类型用于表示整数,和浮点类型在代码生成方面类似,都是通过typedef定义一个新的类型名称,再以此去定义变量名。

类似浮点类型的建模,建模时将Inport中的Data type 选中成整型。在生成代码的形式方面,整数类型和浮点类型除类型定义外,没有差别,这里不再赘述。

3.3 布尔类型

布尔类型用于表示“真”或“假”,常用于条件判断或者逻辑运算中。首先,通过下面的Simulink建模示例,可以清楚地了解布尔类型的用法。

1)将Inport1和Inport2配置成single类型,并且通过一个关系运算符(小于等于)来输出判断结果,如果Inport1 < Inport2,则输出True,否则输出False;

在这里插入图片描述

2)配置好显示端口数据类型,然后Ctrl + D更新模型,就可以看到关系运算符输出的信号为boolean,即布尔类型;

在这里插入图片描述

同理,逻辑运算符的输入输出都是boolean类型,进行与、或、非等逻辑运算。

3)生成代码前,先配置好Embedded Coder,并且Ctrl + B生成代码;

在这里插入图片描述
在这里插入图片描述

在生成的<Data_Type_Basics_Bool.h>文件中,Outport的类型为boolean_T。在 rtwtypes.h文件中可以看到通过typedef关键字将unsigned char类型定义为boolean_T,也就是说boolean_T的背后是无符号 8 位整数,和uint8_T是一样的。

3 数据类型使用的注意点

3.1 浮点数等于比较

两个浮点数可以通过比较运算模块,输出true或者false的布尔值。但是在建模的过程中,不可以使用 == 比较运算符来比较两个浮点数相等。即如下情况。
在这里插入图片描述
因为计算机在进行浮点数运算的时候会产生精度损失,所以两个浮点类型变量在小数点后的很多位就可能看不一样的,从现实物理意义上来说,基本可以等同一致,但是 == 运算符会判定为不一样,就产生了相反的效果。

在Model Advisor中的Check comparison of floating point types in Simulink项可以检查出模型中进行浮点数等于比较的错误。

在这里插入图片描述
建模中判断浮点数相等的正确做法应该是,两个浮点数的差值的绝对值,小于一个定义好的误差量,例如0.00001.

在这里插入图片描述

3.2 整形数溢出

由于浮点类型可表示的范围很大,所以一般不需要考虑数值溢出的问题。但是整数类型必须很清楚该类型所对应的范围是否满足信号的需要。例如int8类型可以表示-128~127的整数,但是超出该范围就会溢出,造成了数值的错误。

新建一个模型<Data_Type_Basics_IntOverflow.slx>,如图所示,输入的数值是80,乘以二之后超出了int8类型可以表示的范围。如果将Diagnostics中的Wrap on overflow选配置为error,那么Ctrl + T运行模型仿真时就会检测到溢出而报错。
在这里插入图片描述
如果将Wrap on overflow选配置为warning再Ctrl + T运行模型仿真,就会输出-96的错误值。

在这里插入图片描述
这里需要注意,仅通过Ctrl + D更新模型是不会报错的,或者输入输出为Inport或者Outport模块时也不会报错。必须首先配置好模型诊断项,以及使用导致溢出的数值输入后,通过Ctrl + T进行仿真后,Simulink才会报错。因此,测试用例需要能够覆盖这种情况。

3.3 布尔类型的位域

布尔类型只需要一个比特就可以存储0和1两种状态,但是C语言最小的整数数据类型是char,也就是一个字节,占据8个比特,这样造成了控制器内存资源的浪费。一种解决方法是把布尔量打包成位域。

通过下面的Simulink示例,可以清楚地了解布尔类型打包成位域的方法。

1)首先,建立一个Matlab脚本<Bitfield_Parameter.m>,输入如下脚本并运行,用于创建Bool_Param_1和Bool_Param_2两个参数;

Bool_Param_1 = Simulink.Parameter;
Bool_Param_1.Value = 0;
Bool_Param_1.CoderInfo.StorageClass = 'Custom';
Bool_Param_1.CoderInfo.Alias = '';
Bool_Param_1.CoderInfo.Alignment = -1;
Bool_Param_1.CoderInfo.CustomStorageClass = 'BitField';
Bool_Param_1.CoderInfo.CustomAttributes.StructName = '';
Bool_Param_1.Description = '';
Bool_Param_1.DataType = 'boolean';
Bool_Param_1.Min = [];
Bool_Param_1.Max = [];
Bool_Param_1.DocUnits = '';Bool_Param_2 = Simulink.Parameter;
Bool_Param_2.Value = 1;
Bool_Param_2.CoderInfo.StorageClass = 'Custom';
Bool_Param_2.CoderInfo.Alias = '';
Bool_Param_2.CoderInfo.Alignment = -1;
Bool_Param_2.CoderInfo.CustomStorageClass = 'BitField';
Bool_Param_2.CoderInfo.CustomAttributes.StructName = '';
Bool_Param_2.Description = '';
Bool_Param_2.DataType = 'boolean';
Bool_Param_2.Min = [];
Bool_Param_2.Max = [];
Bool_Param_2.DocUnits = '';

这里注意,CustomStorageClass配置成了BitField。

2)运行脚本<Bitfield_Parameter.m>,在Matlab工作空间中生成两个Parameter参数;

在这里插入图片描述

3)接着在Simulink中建模如下,包含两个Const模块和两个Outport模块,Const模块中的值引用工作空间中的两个参数,直接输出给Outport模块;

在这里插入图片描述
4)在Simulink的配置界面中,勾选上Pack Boolean data into bitfields,并将
Bitfield declarator type specifier选择位uchar_T;

在这里插入图片描述
这里的选择表示将Boolean类型的数据打包到位域中,并且共享一个uint_T的类型。

5)保存模型后,先配置好Embedded Coder,Ctrl + B生成代码;

在这里插入图片描述

在<Data_Type_Basics_Bitfield.h>头文件中,将两个参数定义到一个结构体内,并且后面带了个冒号和数字1。这代表这两个参数共用一个类型uint_T,并且分别只占了这个类型的1个比特。位域就是通过这种共享类型的方式,节省了控制器的内存资源。

4 关于定点数的说明

在早期的模型开发中,常用定点数表示浮点数。定点数的类型配置如下图所示。

在这里插入图片描述
定点数就是把小数点固定下来,来表示浮点数。这样做的目的时牺牲一定的小数精度,来换取内存资源空间的节省。

简单举个例子,通过1个字节,也就是8个比特的内存空间表示小数,假如小数点固定在从右往左第三位,如图所示。

在这里插入图片描述
整数部分分配到5个比特,也就是整数最大能表示2^5 - 1,即十进制的31。小数部分分配到3个比特,也就是可以把数字1等分成8份,每份是0.125。这样的话小数可以表示的精度就是0.125。也就是说,小数只能是0.0,0.125,0.25,0.375,0.5,0.625,0.75,0.875这几种。0.125和0.25之间的小数值无法表示,因为精度不够。想要表达更精准的小数,就要把小数点往左移,但是这样的话整数的最大值又减小了。因此定点数需要按照需求去一个平衡。

由于集成电路的发展,现在的嵌入式芯片已经有了充足的资源和空间,以及浮点运算单元。不再需要旧时代的定点化的操作,笔者在工作的时候已经没有再见过定点化相关的技术了。

5 总结

本文研究了Simulink中的浮点型(double、single)、整型(int8、uint8等)和布尔型数据类型。建模时需注意浮点数比较的精度、整数溢出问题以及布尔类型的位域优化,以提升模型效率和可靠性。

返回个人博客总目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/30436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark日志有哪些?

spark.log&#xff1a;记录作业运行日志&#xff0c;包括Spark框架内部日志和用户通过日志接口输出的日志。 executor 启动结束日志&#xff1a; job&#xff0c;stage&#xff0c;task提交结束日志&#xff1a; pmap.log&#xff1a;周期性地截取Driver或Executor的pmap和…

Java 17的新特性

Java 17引入了多项新特性&#xff0c;以下是一些重要的更新&#xff1a; 增强的伪随机数生成器&#xff08;JEP 356&#xff09; Java 17为伪随机数生成器&#xff08;PRNG&#xff09;提供了新的接口类型和实现&#xff0c;包括可跳转的PRNG和另一类可拆分的PRNG算法&#xf…

公开整理-中国海关进出口增减数据(2008-2024年)

数据来源&#xff1a;东方财富网 时间跨度&#xff1a;2008年至今 数据范围&#xff1a;全国范围 数据指标&#xff1a; 年月 当月出口额-金额 当月出口额-同比增长 当月出口额-环比增长 当月进口额-金额 当月进口额-同比增长 当月进口额-环比增长 累计…

SCI一区TOP|常青藤优化算法(IVYA)原理及实现【免费获取Matlab代码】

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4 .参考文献5.代码获取 1.背景 2024年&#xff0c;M Ghasemi受到自然界中常青藤生长行为启发&#xff0c;提出了常青藤优化算法&#xff08;Ivy Algorithm, IVYA&#xff09;。 2.算法原理 2.1算法思想 IVYA模拟常青…

【Linux】环境基础开发工具使用(yum、vim、gcc/g++、gdb、make/Makefile)

文章目录 Linux 软件包管理器 yumLinux开发工具Linux编辑器-vim使用vim的基本概念vim下各模式的切换vim命令模式各命令汇总vim底行模式各命令汇总批量化注释和批量化去注释vim简单的配置解决一个小问题 Linux编译器-gcc/g作用gcc/g 语法预处理编译汇编链接什么是函数库 Linux调…

【后端】websocket学习笔记

文章目录 1. 消息推送常见方式1.1 轮询 VS 长轮询1.2 SSE&#xff08;server-sent event)服务器发送事件 2. websocket介绍2.1 介绍2.2 原理2.3 websoket API2.3.1 客户端【浏览器】API2.3.2 服务端API 3. 代码实现3.1 流程分析3.2 pom依赖3.3 配置类3.4 消息格式3.5 消息类 4.…

Weevil-Optimizer象鼻虫优化算法的matlab仿真实现

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 Weevil-Optimizer象鼻虫优化算法的matlab仿真实现&#xff0c;仿真输出算法的优化收敛曲线&#xff0c;对比不同的适应度函数。 2.测试软件版本以及运行结果展示…

Linux - 进程

一、什么是进程 首先&#xff0c;Linux是一个多用户多进程的操作系统&#xff0c;系统上可以同时运行多个进程。 进程的产生&#xff1a;①是在执行程序或者命令时产生的&#xff1b;②定时任务进程 进程的类型&#xff1a;前台进程/后台进程 前台进程&#xff1a;一个终端…

WDC西部数据闪存业务救赎之路,会成功吗?

一、序言 在存储界的江湖里&#xff0c;WDC就像是一位手握两大秘籍&#xff08;闪迪和铠侠NAND工厂&#xff09;的武林高手&#xff0c;本以为能在企业级SSD的擂台上大展身手&#xff0c;结果却发现自己更像是被误邀参加学霸聚会的学渣&#xff0c;心里那个苦啊&#xff0c;只…

Java15-API

目录 Math类 概述 常见方法 练习 System类 概述 常见方法 Runtime 概述 常见方法 Object类 概述 常见方法 一.演示toString方法 二.演示equals方法 三、对象克隆 分类&#xff1a; 浅克隆 深克隆&#xff1a; Objests类 概述 常见方法 BigInteger类 概…

jenkins安装和使用 (二)

参考视频资料 https://www.bilibili.com/video/BV1bS4y1471A?p10&vd_sourcee0dcd147bd5d730317de804d788cd6f9 安装maven插件 新建item 配置构建信息 项目地址替换为自己的实际地址 其余保持先保持默认 先然后在主页就看到了这个项目 查看控制台输出 稍等一…

李宏毅2023机器学习作业HW06解析和代码分享

ML2023Spring - HW6 相关信息&#xff1a; 课程主页 课程视频 Sample code HW06 视频 HW06 PDF 个人完整代码分享: GitHub | Gitee | GitCode P.S. HW06 是在 Judgeboi 上提交的&#xff0c;出于学习目的这里会自定义两个度量的函数&#xff0c;不用深究&#xff0c;遵循 Sugge…

【计算机毕业设计】211校园约拍微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w

01 中国电信股份有限公司浙江分公司 &#x1f537;招聘岗位&#xff1a;系统架构师 &#x1f537;岗位职责&#xff1a; 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护&#xff0c;做好相关产数项目的支撑。 2、根据信息安全管理要求&#xff0c;负责客户…

调取Windows系统虚拟键盘

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using System.Diagnostics;namespace 调取Windows虚拟键盘 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void richTextBox1_DoubleClick(object sender, EventArgs e){Proces…

Cloudflare API 令牌完整指南:快速掌握查询与创建(手把手教你查询和创建 Cloudflare API 令牌)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Cloudflare API 令牌 📒📝 查询 Cloudflare API 令牌📝 创建编辑区域 DNS 令牌⚓️ 相关链接 ⚓️📖 介绍 📖 在管理网站和应用程序时,Cloudflare 提供了强大的 API 接口,可以极大地简化各种操作。本文将详细介绍如…

Debian12安装Nvidia官方驱动

1、下载驱动&#xff08;下载到一个英文目录例如你的用户目录/home/用户名下&#xff0c;我下载到dowload目录&#xff0c;由于默认显示中文&#xff0c;在命令行不支持中文显示的是一串数字&#xff0c;当然你仍然可以cd 那串数字进目录&#xff0c;显示有有引号就加引号&…

【宠粉赠书】科技图表绘制:R语言数据可视化

为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套科研绘图的必备书籍——《R语言数据可视化&#xff1a;科技图表绘制》。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 图书介绍 《R语言数据可视化&#xff1a;科技图表绘制》结合编者多年的数据分析…

PLC模拟量和数字量到底有什么区别?

PLC模拟量和数字量的区别 在工业自动化领域&#xff0c;可编程逻辑控制器&#xff08;PLC&#xff09;是控制各种机械设备和生产过程的核心组件。PLC通过处理模拟量和数字量来实现对工业过程的精确控制。了解模拟量和数字量的区别对于设计高效、可靠的自动化系统至关重要。 1. …

C++之STL(二三)

1、vector源码刨析 1.1、数据结构以及动态扩充算法 其实vector内部有三个指针&#xff0c;分别是数据的第一个元素Myfirst、数据的最后一个元素的下一个位置Mylast&#xff0c;最后一个空间的下一个位置Myend&#xff1b;当你插入数据的时候&#xff0c;先判断当前容量够不够&…