Simulink代码生成: 查表模块及其代码

本文描述查表模块的建模并研究生成的代码。

文章目录

  • 1 Simulink中的查表模块
  • 2 查表模块示例模型
    • 2.1 设置Table and Breakpoints
    • 2.2 设置Algorithm
    • 2.3 设置DataType
    • 2.4 简单仿真
  • 3 代码生成
  • 4 总结

1 Simulink中的查表模块

查表模块中定义了断点和查表值(都是数组)的对应关系,然后通过输入数值在断点中的位置,“查出”对应在查表值中的数值,然后输出。

查表模块是汽车软件开发中的一种常用的模块,因为在实际工作中,很多物理量之间的对应关系是难以用数学公式来表达的,但是可以通过实验测量出关系曲线,然后截取其中对应的坐标点。例如方向盘转角和车轮转角的对应关系、发动机特性曲线、制动踏板和制动主缸压力对应关系等,都可以用查表模块来处理。

下图中是1D查表模块,也就是通过一个断点数组查表得出数值。
Simulink代码生成: 查表模块及其代码_第1张图片

2 查表模块示例模型

本节研究1D查表模块的建模用法,更高维度的查表模块类似。

假如现在的目标是通过方向盘转角的输入查表得出左前轮转角的输出,那么应该做如下几步。

2.1 设置Table and Breakpoints

在Table and Breakpoints选项卡中需要设置断点和查表值,这是对输入信号进行查表的依据。
Simulink代码生成: 查表模块及其代码_第2张图片
模块中默认定义了断点和查表值为[-5:5]和tanh([-5:5])的常数,这就意味着这张“表”是写死在软件里,不能更改的。比较合理的做法是将其配置成标定量,在Simulink中对应的就是Parameter对象。所以首先在Matlab工作空间中定义方向盘转角和车轮转角的数组参数,如下。
Simulink代码生成: 查表模块及其代码_第3张图片
其中Value代表查表值或参数的数组,DataType类型。数值是随便设置的。这里的断点数组最好是从小到大排序的,否则容易出现理解上的问题,虽然模型不会有什么问题。

然后把这两个参数写在查表模块里面。
Simulink代码生成: 查表模块及其代码_第4张图片
下方的Edit table and breakpoints按钮也可以方便地查看两个参数。

2.2 设置Algorithm

接下来要设置插值算法,Algorithm选项卡如下:
Simulink代码生成: 查表模块及其代码_第5张图片
这里重点关注的是Interpolation method和Extrapolation method这两项,也就是内插和外插。

内插表示输入值落在断点数组范围之内,此时可以用线性、就近原则等进行插值。这里用用线性的方式进行插值,也就是说在前后两个断点中间等比例地计算。

外插表示输入值落在断点数组范围之外,此时可以选用线性或者禁止外插改用端点的方式(Clip),这里用了Clip的方式,因为超出了边界后,数据就没有意义了,起到了一个防止溢出的效果。
Simulink代码生成: 查表模块及其代码_第6张图片

2.3 设置DataType

查表模块涉及到很多变量的数据类型,包括输入输出、断点、中间值等,在DataType可以配置这些类型。
Simulink代码生成: 查表模块及其代码_第7张图片
博主在工作中习惯将断点和查表值配成继承数据字典,将中间值配置成内部规则,规则改为速度优先(Speed),如下:
Simulink代码生成: 查表模块及其代码_第8张图片
工作中感觉类型相关的的配置差别不大。

2.4 简单仿真

保存之前的设置,然后给模块一个输入,仿真得出输出如下。
Simulink代码生成: 查表模块及其代码_第9张图片
这个模块计算的过程是这样的:

  1. 首先输入数值为350,输入值是落在了断点数组之内的,所以要用内插;
  2. 由于断点数组是[-500 -400 -300 -200 -100 0 100 200 300 400 500],输入的350处于300~400之间,所以索引是8(从0开始计数);
  3. 计算350在300~400之间增加了多少比例,也就是frac。计算过程为frac = (350 - 300)/(400 - 300) = 0.5
  4. 寻找索引8在查表值数组中的数值,[-32 -25 -19 -11 -4 0 4 11 19 25 32]中的第8个应该是19;
  5. 查出的数值再加上增量乘以比例值frac,计算如下:out = 19 + 0.5*(25 - 19) = 22;

以上就是上文配置的线性内插的过程。外插的方法比较简单,这里就不再描述。

3 代码生成

将前文的模型替换成inport和ouport如下:
Simulink代码生成: 查表模块及其代码_第10张图片
Ctrl + B生成代码:
Simulink代码生成: 查表模块及其代码_第11张图片
上图可以看出,查表模块封装成一个函数look1_iflf_binlcapw,传入断点、输入值、查表值等参数,在step函数内调用。

look1_iflf_binlcapw内的实现,与上一节的分析过程相同。
Simulink代码生成: 查表模块及其代码_第12张图片

4 总结

本文研究了查表模块的使用和代码生成。该模块在汽车软件开发中是很常用的,很好的处理了很多非线性关系。

>>返回个人博客总目录

你可能感兴趣的