浏览过很多模型,信号之间的计算错乱复杂,所以很容易使用From,Goto这一对模块,导致模型看起来臃肿难以阅读。如果能够使用Bus模块把所有的模块有序的连接起来,信号流看起来会更加清晰,模型逻辑也更容易追溯。
下面以一个简单的车辆动力学的模型为例子。
01--驾驶员模块
①输入信号:1.目标车速 2.实际车速 3.P项参数 4.I项参数 5.采样时间
输出信号:1.油门踏板 2.制动踏板 3.车速速差
②基本逻辑:目标车速与实际车速差值进行PID计算,得到的正值为油门,负值为制动,且进行0-1范围的限幅,负值需要取绝对值。
比例环节输出为正值时,说明目标车速>实际车速,此时车辆有加速需求;
比例环节输出为负值时,说明目标车速<实际车速,此时车辆有制动需求;
③建模:
模块进行创建子系统:
02--控制器模块
①输入信号:1.油门踏板 2.制动踏板 3.驱动电机转速 4,.减速器速比 5.减速器效率
输出信号:1.驱动电机请求扭矩 2.制动扭矩
②基本逻辑:主要完成基本的电、液制动扭矩分配及驱动扭矩计算,根据车辆运行需求给电机发动扭矩指令。驱动扭矩=加速踏板开度×电机驱动外特性。当电机能满足制动需求时,由电机制动;当电机不能满足制动需求时,优先由电机制动,不足的制动扭矩由液压系统补足。当制动需求扭矩<=电机最大制动扭矩,则电机制动扭矩=制动需求扭矩,液压制动扭矩=0;当制动需求扭矩>电机最大制动扭矩,则电机制动扭矩=电机最大制动扭矩, 液压制动扭矩=制动需求扭矩-电机制动扭矩.
电机端制动需求扭矩=轮端制动需求扭矩/减速器速比/减速器效率
③建模:
创建子系统:
03--电机模块
①输入信号:1.驱动电机请求扭矩 2.驱动电机转速
输出信号:1.电机扭矩指令 2.电机输出功率
②基本逻辑:电机转速,将电机转速作为Lookup Table模块的输入,分别求出电机当前状态下的驱动外特性转矩数据和发电外特性转矩。将扭矩指令与驱动外特性转矩取小,然后再与发电外特性取大。
P=T×n/9550计算输出功率(机械功率)
③电机扭矩指令建模:
创建子系统:
电机输出功率建模:
创建子系统:
电机模块创建子系统:
04--齿轮模块
①输入信号:1.电机扭矩指令 2.轮边转速
输出信号:1.轮边扭矩 2.电机转速
②基本逻辑:通过速比有电机扭矩计算轮边扭矩,通过速比由轮边转速计算电机转速
③建模:
创建子系统:
05--轮边力计算模块
①输入信号:1.轮边扭矩 2.制动扭矩 3.车速
输出信号:1.轮边力 2.轮边转速
②通过公式及速比计算得到轮边力及轮边转速
③建模:
创建子系统:
06--车速计算模块
①输入信号:1.轮边力 2.整车质量 3.重力加速度 4.滚动阻力 5.风阻系数 6.迎风面积 7.空气阻力 8.道路坡度角 9.质量换算系数
输出信号:1.车速 2.行程
基本逻辑:根据公式求得加速度
上式参数从左到右上到下分别为:加速度,车辆驱动力,行驶阻力,质量换算系数,整车质量
汽车行驶阻力的计算公式:
行驶阻力的计算公式
汽车行驶时受到滚动阻力、空气阻力和坡道阻力,如下式所示:
③建模:
行驶阻力:
创建子系统:
加速度计算:
创建子系统:
07--电池模块
①输入信号:1.驱动电机输出功率 2.单体电池内阻 3.单体电池串数 4.单体电池容量 5.SOC初始值 6.SOC最小值
输出信号:1.SOC
②基本逻辑:通过安时积分法求得消耗的SOC,初始SOC-消耗的SOC等于剩余SOC
③建模:
创建子系统:
08--子系统常规连接
那么现在我们有如下7个子系统了
找到对应信号进行连线,如下图:
09--参数设置
①Driver模块
veh_spd_Kp = 0.5;(可标定)
veh_spd_Ki = 0.02;(可标定)
Dt = 0.01;
如下3个饱和模块直接按照下标设置参数。
②控制器模块
gear_ratio = 9.7;减速器速比
gear_efficiency = 0.97;减速器效率
三个查表模块参数如下:
③电机模块
Tq Calc子系统内的查表模块参数MaxTq和MinTq和控制器模块内的一致
Pwr Calc子系统的查表模块参数设置如下
可以创建m脚本,把参数填进去
饱和模块参数如下设置:
④齿轮模块
无参数设置,速比和效率参照前面模块
⑤轮边力模块
roll_rad = 0.327;轮胎的滚动半径,单位:m
⑥车速计算模块
veh_mass = 1500 kg;车辆整备质量
g = 9.8 m/s^2;重力加速度
f = 0.01;车辆滚动阻力系数
Cd = 0.28;车辆风阻系数
A = 2.3;车辆迎风面积,单位:m^2
slpoe = 0;坡度,单位:%
rot_coeff = 0.05;质量换算系数
饱和模块设置如下:
0.377*电机最大转速*轮胎半径*减速器速比*3.6
⑦电池模块
batt_ns = 100;串联个数
cell_resis = 0.003;电池内阻,Ω
batt_np = 40;并联个数
cell_cap = 4.5;电池单体容量,Ah
soc_ini = 95;初始SOC,%
soc_min = 5;最低许用SOC
OCV 电压设置如下:
饱和模块设置如下
10--运行仿真
设置求解器如下:
参数配置好之后总体如下:
tgt_veh_spd = 100;目标速度设置常数100
观测电机转速
观测轮边转速
观测行驶距离
观测soc
发现SOC的值不是从初始值95开始,而是从0开始,导致右边SOC在消耗过程中因为纵轴值过大看上去而没有什么变化。
需要把如下delay模块的初始值从0改为95
再仿真
11--Bus模块提供模型可读性
这个模块搭建完成后,线条杂乱,输入输出不够清晰,可以使用Bus模块来进行模型的美化
①整理输入信号集中进Bus模块
②处理驾驶员模块
输入通过Bus Selector模块进行输入信号的选择
输出信号通过Bus Creator 进行集中起来
这里还有个act_veh_spd的接口等会再处理
③处理控制器模块
同样的方式处理
这里还有个mot_spd_act接口等会再处理
④电机模块
⑤齿轮模块
这里的whl_spd的信号等会处理
⑥轮边力模块
这里的act_veh_spd信号等会处理
⑦电池模块
⑧车速计算模块
⑨输出信号梳理
这里需要使用3个Goto模块,作为前面有些模块的输入信号
把这些信号也可以并入到最开始的输入bus信号内
再把之前的遗留未处理的信号进行处理即可,此处只举下列一个例子,其他同理
最终整体效果如下:
运行仿真,和之前的模型进行对比,结果一致
将子系统外观替换如下:
将子系统进行封装,在封装选项卡中使用下面的代码
text(.52,.01,char(get_param(gcb,'Tag') ), 'horizontalAlignment','center','verticalAlignment','bottom' )
disp(get_param(gcb,'Name'))
总体效果如下:
12--小结
没使用Bus之前,
使用Bus之后,
可以看到每个功能非常清晰,信号线之间没有任何交叉,输入输出都在一起比较明确,这样做的好处是能够大大提高模型阅读的可读性,增加工作效率,尤其是适配较为复杂的模型任务时尤为重要。