1 数据 对象的 创建
Ctrl+H打开Model Explorer,在Base workspace中点击工具栏add,出现如下界面,
![](https://file.jishuzhan.net/article/1722585307028656130/dd6e77fafd1a10923aca2fa2af4e81c7.webp)
可以看到Simulink提供了多种数据类型
- Matlab Variable:
- Simulink.Parameter:使用该数据对象表示工程应用中的标定量
- Simulink.Signal:用于生成观测量
- Simulink.NumericType:指定浮点数、整数,通常用于数据定点化处理
- Simulink.AliasType:为数据类型创建别名
常用的也就是这些,具体还有其他的可以参考help。
添加两个parameter,如下图所示:
![](https://file.jishuzhan.net/article/1722585307028656130/a1f90e0ce0e5edf917476e64d7d7e1d3.webp)
将参数的名字改为标定量的名字,如下图(通常标定量命名规则按三段来分block_function_uint_C)
![](https://file.jishuzhan.net/article/1722585307028656130/826af864df8135624bc7d9f9a512e770.webp)
然后就是根据需求对数据类型的处理,在右边可以进行选择,如下图
![](https://file.jishuzhan.net/article/1722585307028656130/3bb90dfa142b578bb59b911545407560.webp)
(试想,如果全用这种方式来进行数据的管理有多累,可以采用excel的方式;他们用python可以实现当然,可否用matlab来读取excel写相应脚本?)已完成matlab来处理
然后建立相应的观测量,如下图:
![](https://file.jishuzhan.net/article/1722585307028656130/7d31d840c68c1ef52d5973ebecb30184.webp)
使用constant和out建立如下模型,将constant参数名改为标定量的名称,
![](https://file.jishuzhan.net/article/1722585307028656130/22f6e56ebe6f7aad8df8abd5ba586373.webp)
右键输出信号的信号线,选择properties,命名为观测量(按照依相的方式,也将观测量做出一个类似于constant的模块,需要好好研究一下)
![](https://file.jishuzhan.net/article/1722585307028656130/fcdf53c02e082c8346327e06cea4d4b7.webp)
![](https://file.jishuzhan.net/article/1722585307028656130/74cb32f253e028e40938b6157e939436.webp)
PS:需要注意的是,两个标定量均为uint8类型,而观测量为uint16,这样simulink会出现编译错误,因此可以在加法模块上选择output data type为下图所示,这样就强制与后面的类型相匹配。
![](https://file.jishuzhan.net/article/1722585307028656130/dd3400972dfd320e66ac26f1031fc450.webp)
因此,要想做出自己的模型开发库,要做出标定量模块的封装、常用算数符号封装(与后面数据类型匹配)、观测量封装,(后续继续添加 ) 。
2 Code的配置
至此便完成了一个简单的模型,ctrl+E打开configuration parameter,
![](https://file.jishuzhan.net/article/1722585307028656130/951f9ef855669d239192cfd705e43733.webp)
solve界面下选择定点步长,因为是在单片机上运行。
选择optimization>Signals and Parameters,选取Inline Parameter(为什么?)
选择Code Generation,选择ert.tlc,打钩generate code only
Report>Create code generation report
Interface>data exchange,选择asap2生成相应a2l(不包含头部分)
最后进行编译(ctrl+B),完毕后生成相应的报告
![](https://file.jishuzhan.net/article/1722585307028656130/e108f468cb53ee3d61bbdffc2d3368f9.webp)
在与基础软件集成时,要将Model files和Utility files的文件全部放到基础软件中。(还可以优化数据类型的定义)
![](https://file.jishuzhan.net/article/1722585307028656130/a2bbd813619e9ff4a1889672a3ffc8a2.webp)
3 自动在生成的代码中 添加#prag ma 语句
3.1 为什么 添加#pragma语句
通常情况下,编译器会给变量自动分配内存地址,但是标定来说,标定量和观测量必须放到指定位置才能实现标定和观测的功能, #pragma语句就可以实现上述功能。
不同编译器对于地址的分配的语句不同,例如hightec,从该工程的ld文件中可以看到区域名。
![](https://file.jishuzhan.net/article/1722585307028656130/801144300cd00bc0e231dc8e7655ed0d.webp)
那么在拿到应用层代码之后首先就是要对变量进行地址分配,编译完成后。
![](https://file.jishuzhan.net/article/1722585307028656130/7005b386f16f723c13c09ab075fa4c5f.webp)
但是实际上在工程应用中,标定量的定义常用到ConstVolatile、观测量常用到Volatile
3.2 const, volatile释义
const含义是"请做为常量使用",而并非"放心吧,那肯定是个常量"。
volatile的含义是"请不要做自以为是的优化,这个值可能变掉的",而并非"你可以修改这个值"。
1)const, volatile的作用以及起作用的阶段
const只在编译期有用
在运行期无用。const在编译期保证在C的"源代码"里面,没有对其修饰的变量进行修改的地方(如有则报错,编译不通过),而运行期该变量的值是否被改变则不受const的限制。
volatile在编译期和运行期都有用
在编译期告诉编译器:请不要做自以为是的优化,这个变量的值可能会变掉;
在运行期:每次用到该变量的值,都从内存中取该变量的值。
2)const, volatile同时修饰一个变量
合法性 "volatile"的含义并非是"non-const",volatile 和 const 不构成反义词,所以可以放一起修饰一个变量。
同时修饰一个变量的含义
表示一个变量在程序编译期不能被修改且不能被优化;在程序运行期,变量值可修改,但每次用到该变量的值都要从内存中读取,以防止意外错误。
3.3 模型生成代码自动 添加#pragma语句
如果数据很少的、或者应用层软件标定量和观测量全部集成在一个头文件和c文件中,使用手动的方式进行添加也可以,但是一旦数据量剧增或者变量在不同文件下,这样在做处理时就会比较麻烦,因此考虑在代码生成时将变量集中到一个.h .c文件,并且自动添加相应的#pragma语句。
Simulink数据类型里提供了这样一种方式,
首先创建一个数据类型,例如 Demo_Mea_mp = Simulink.Signal,
![](https://file.jishuzhan.net/article/1722585307028656130/88bc40beec90c6021941bf05f6f1f5c7.webp)
在Storage class下选择Volatile类型。会弹出Custom attribute对话框,输入想生成的文件名.h和.c。生成的代码如下:
![](https://file.jishuzhan.net/article/1722585307028656130/3417d9d9b1da52d3653e3894ac93b793.webp)
可以看到能够将变量统一放到同一文件,但是还是需要手动添加#pragma语句。
如何自动添加该语句呢?我们可以来分析一下Simulin.Parameter这个数据类型的特点。
使用cscdesigner打开自定义类编辑器
![](https://file.jishuzhan.net/article/1722585307028656130/dccd4ba719de816dee2244dd3d256b58.webp)
在memory section中可以看到
![](https://file.jishuzhan.net/article/1722585307028656130/74473eabea7d1dc2a7365362da1e9723.webp)
在这里添加#pragma语句即可,但是simulink自带的类又全是只读的,所以需要自己建立一个类(参考matlab官网help:Define Data Classes)。
首先找到路径%matlabpath%\toolbox\simulink\simulink\dataclasses
![](https://file.jishuzhan.net/article/1722585307028656130/396bd6981341e07ad4b1176d68d22216.webp)
在此目录下建立一个文件夹(以+UserName命名)
![](https://file.jishuzhan.net/article/1722585307028656130/eb9f106df3f6bdda0a54ce7cec67389a.webp)
在+App中添加@Parameter和@Signal两个文件夹,可以将mpt中的parameter.m、signal.m复制过来进行修改。
需要修改的几个地方
![](https://file.jishuzhan.net/article/1722585307028656130/b19f4e3ad1950e753c2d5098fb8e6e1f.webp)
将custom和global注释掉,不然会报错(why)
输入 指令cscdesigner('App')
![](https://file.jishuzhan.net/article/1722585307028656130/df0beeb2dc53d7bc25836241f6de2544.webp)
然后选择编辑数据类型的特性,每一项都需要。这里我们把ConstVolatile进行处理,在Memory section中输入相应的#pragma语句即可。
最后编译生成的文件有
![](https://file.jishuzhan.net/article/1722585307028656130/a81764a9c1ad55fc05a553afa24395a6.webp)
代码如下:
![](https://file.jishuzhan.net/article/1722585307028656130/a50aae198a5733052ef5b849b2477337.webp)
4. 自定义生成完整A2L文件
to be continue...
汽车标定合集:
汽车标定技术(二)--基于XCP的标定测量实战-CSDN博客
汽车标定技术(三)--XCP协议如何支持测量功能-CSDN博客