本示例将演示汽车悬架系统联合仿真过程。汽车悬架系统由车身、悬挂系统以及虚拟路面构成,车身、悬挂系统以及路面通过移动副串联。同时,为模拟路面颠簸,在模型中为虚拟路面模型添加了正弦形式的驱动约束。汽车悬架系统如图9-33所示。
图9-33 汽车悬架系统
除了定义机械系统模型外,还需创建控制系统。控制系统为整个悬挂系统提供参考位移和参考速度,并与从多体系统中获得的位移和速度信息进行比较,根据比较结果输出控制信号。控制系统框图如图9-34所示,Gc(S)表示多输入多输出控制器;D(S)表示在汽车悬挂系统模型中,车体集中质量位移信息;V(S)表示在汽车悬挂系统中;车体集中质量速度信息;Rd(S)表示参考位移信号;Rv(S)表示参考速度信号;E1(S)表示监测到的位移信号与参考位移信号之差;E2(S)表示监测到的速度信号与参考速度信号之差;Y1(S)表示控制器输出控制信号1,Y2(S)表示控制器输出控制信号2。
图9-34 汽车悬架控制系统框图
控制器的传递函数为
式中,A为状态矩阵,B为输入矩阵,C为输出矩阵,D为直接反馈矩阵。
下面给出了控制器的状态空间:
A=[00;00],B=[10;01],C=[100;020],D=[100000;020000],
u=[车体集中质量位移,车体集中质量速度],y=[输出力(刚度),输出力(阻尼)]
在本练习中,控制系统将检测车体集中质量的位移和速度信息,并与参考位移和速度信号进行比较,根据比较结果,输出控制信号,包括悬挂系统刚度和阻尼的控制信息,保证系统平稳运转。
在本练习中,将学习以下内容:
● 在MotionView中建立车身及悬挂系统多体动力学模型,通过MotionSolve关键字Control_Stateeqn Element建立内置的控制方程,对多体系统进行试算,获取基本计算结果。
● 编辑MotionSolve XML格式模型,添加Control_Plantinput和Control_Plantoutput关键字,为联合仿真建立输出信号和输入信号。
● 在Simulink中对控制器模型进行调试。
● 进行联合仿真,并与使用MotionSolve内置控制模型的计算结果进行对比。
1.创建机械系统模型
STEP 01 创建几何点
(1)启动MotionView。
(3)在弹出的Add Point or PointPair对话框中,设置标题为road_cg。
(4)使用默认的变量名,单击OK按钮。
(5)在Point面板中,定义该点的空间坐标为(0,0,0)。
(6)类似地,定义标题为suspension_cg的点,空间坐标为(0,0,0.1);标题为bus_cg的点,空间坐标为(0,0,0.2)。
STEP 02 创建几何体
(1)右击工具栏中的Body按钮。
(2)在弹出的Add Body or Bodypair对话框中,设置标题为road dummy。
(3)使用默认的变量名,单击OK按钮,创建虚拟路面体。
(4)在Body面板中,进入Properties标签,根据图9-35定义体参数。
图9-35 Body面板(road dummy)
(5)进入CM Coordinates标签,激活Use center of mass coordinate systems选项,设置体质心为road_cg。
(6)类似地,定义标题为suspension的几何体,根据图9-36定义该体质量和转动惯量参数。
图9-36 Body面板(suspension)
(7)进入CM Coordinates标签,激活Use center of mass coordinate systems选项,设置体质心为suspension_cg。
(8)类似地,定义标题为bus的几何体,根据图9-37定义该体质量和转动惯量参数。
图9-37 Body面板(bus)
(9)进入CM Coordinates标签,激活Use center of mass coordinate systems选项,设置体质心为bus_cg。
STEP 03 创建图形
(1)右击工具栏中的Graphic按钮 。
(2)在弹出的Add Graphic对话框中,设置标题为road。
(3)使用默认的变量名,设置图形类型为Box。
(4)单击OK按钮,创建虚拟路面体图形。
(5)在Graphic面板中,进入Connectivity标签,根据图9-38定义图形的关联对象。
图9-38 Graphic面板Connectivity标签(road)
(6)进入Properties标签,根据图9-39定义图形参数。
图9-39 Graphic面板Properties标签(road)
(7)类似地,创建标题为suspension的图形,设置图形类型为Cylinder。
(8)在Graphic面板中,进入Connectivity标签,根据图9-40定义图形的关联对象。
图9-40 Graphic面板Connectivity标签(suspension)
(9)进入Properties标签,根据图9-41定义图形参数。
(10)类似地,创建标题为bus的图形,设置图形类型为Cylinder。
(11)在Graphic面板中,进入Connectivity标签,根据图9-42定义图形的关联对象。
图9-41 Graphic面板Properties标签(suspension)
图9-42 Graphic面板Connectivity标签(bus)
(12)进入Properties标签,根据图9-43定义图形参数。
图9-43 Graphic面板Properties标签(bus)
STEP 04 创建弹簧
(1)右击工具栏中的Spring Damper按钮。
(2)在弹出的Add SpringDamper or SpringDamperPair对话框中,设置标题为road_suspension。
(3)使用默认的变量名,设置弹簧类型为Coil Spring(拉伸弹簧)。
(4)单击OK按钮。
(5)在Spring Damper面板中,进入Connectivity标签,根据图9-44定义弹簧阻尼单元的关联对象。
(6)进入Properties标签,根据图9-45定义弹簧刚度阻尼参数。
(7)类似地,创建标题为suspension_bus的弹簧,设置弹簧类型为Coil Spring(拉伸弹簧)。
图9-44 Spring Damper面板Connectivity标签(road_suspension)
图9-45 Spring Damper面板Properties标签(road_suspension)
(8)在Spring Damper面板中,进入Connectivity标签,根据图9-46定义图形的关联对象。
图9-46 Spring Damper面板Connectivity标签(suspension_bus)
(9)进入Properties标签,根据图9-47定义弹簧刚度阻尼参数。
图9-47 Spring Damper面板Properties标签(suspension_bus)
STEP 05 创建弹簧图形
(1)右击工具栏中的Graphic按钮 。
(2)在弹出的Add Graphic or GraphicPair对话框中,设置标题为Spring_road_suspension。
(3)使用默认的变量名,设置图形类型为Spring。
(4)单击OK按钮。
(5)在Graphic面板中,进入Connectivity标签,根据图9-48定义图形的关联对象。
图9-48 Graphic面板Connectivity标签(Spring_road_suspension)
(6)进入Properties标签,根据图9-49定义图形外形参数。
图9-49 Graphic面板Properties标签(Spring_road_suspension)
(7)类似地,创建标题为Spring_suspension_bus的图形,设置图形类型为Spring。
(8)在Graphic面板中,进入Connectivity标签,根据图9-50定义图形的关联对象。
图9-50 Graphic面板Connectivity标签(Spring_suspension_bus)
(9)进入Properties标签,根据图9-51定义弹簧图形的外形参数。
图9-51 Graphic面板Properties标签(Spring_suspension_bus)
STEP 06 创建约束副
(1)右击工具栏中的Joint按钮。
(2)在弹出的Add Joint or JointPair对话框中,设置标题为road_ground。
(3)使用默认的变量名,设置图形类型为Translational Joint(平移副)。
(4)单击OK按钮。
(5)在Joint面板中,进入Connectivity标签,根据图9-52定义铰的关联对象。
图9-52 Joint面板Connectivity标签(road_ground)
(6)类似地,创建标题为suspension_ground的平移副。
(7)在Joint面板中,进入Connectivity标签,根据图9-53定义铰的关联对象。
图9-53 Joint面板Connectivity标签(suspension_ground)
(8)类似地,创建标题为bus_ground的平移副。
(9)在Joint面板中,进入Connectivity标签,根据图9-54定义铰的关联对象。
图9-54 Joint面板Connectivity标签(bus_ground)
STEP 07 创建驱动约束
(1)右击工具栏中的Motion按钮。
(2)在弹出的Add Motion or MotionPair对话框中,使用默认的标题和变量名,单击OK按钮。
(3)在Motion面板中,进入Connectivity标签,根据图9-55定义驱动的关联对象。
图9-55 Motion面板Connectivity标签
(4)进入Properties标签,定义驱动类型为Expression,定义驱动函数为`sin(2*pi*TIME)*0.05`。
STEP 08 创建输出请求
(1)右击工具栏中的Output按钮。
(2)在弹出的Add Output对话框中,设置标题为original_disp_vel。
(3)使用默认的变量名,单击OK按钮。
(4)在Output面板中,将输出类型设置为Expressions。
(5)单击F2处的文本框,输入`DZ({b_2.cm.idstring},{b_0.cm.idstring})-0.2`,输出bus与road之间的相对位移。
(6)单击F3处的文本框,输入`VZ({b_2.cm.idstring},{b_0.cm.idstring})`,输出bus与road之间的相对速度。
STEP 09 设置工作环境
(1)单击打开模型浏览树Form文件夹,单击Gravity,进入重力设置面板。
(2)将Gravity由On切换成Off,关闭重力设置面板。
(3)单击打开模型浏览树中的Units项,进入单位制设置面板。
(4)将LENGTH设置为METER,其他单位不变。
当前单位制系统为m-kg-s-N。
STEP 10 求解模型
(1)在工具栏下单击按钮,进入Run面板。
(2)在Sim Type下,选择Transient,并指定文件名bus_suspension_original.xml。
(3)激活Export MDL snapshot选项,将模型保存为.mdl格式的文件。
(4)在Simulation Parameters标签下的End Time中,输入5。
(5)回到Main标签,并单击Run按钮。
(6)单击Animate按钮,进入HyperView,查看汽车悬架系统运动历程动画。
(7)单击Plot按钮,进入HyperGraph。按照图9-56分别绘制bus相对road的位移和速度曲线,结果如图9-57所示。
图9-56 Build Plots面板
a)bus相对road的位移曲线 b)bus相对road的速度曲线
图9-57 仿真结果
由图9-57可以看到bus在road的正弦激励作用下振动,接下来将设计控制系统,减轻振动效果。
2.在MotionSolve中创建控制系统模型
STEP 01 创建求解器变量
(1)返回窗口1的MotionView界面。
(2)右击工具栏中的Solver Variable按钮。
(3)在弹出的Add Solver Variable对话框中,设置标题为disp_bus_road。
(4)使用默认的变量名,单击OK按钮。
(5)在Solver Variable面板中,将求解器变量类型设置为Expression。
(6)单击文本框,输入`DZ({b_2.cm.idstring},{b_0.cm.idstring})-0.2`。
(7)类似地,创建标题为vel_bus_road的求解器变量。
(8)定义该求解器变量值为`VZ({b_2.cm.idstring},{b_0.cm.idstring})`。
STEP 02 定义系统状态与输入矢量
(1)右击工具栏中的Solver Array按钮。
(2)在弹出的Add Solver Array对话框中,指定标题为U。(www.daowen.com)
(3)使用默认的变量名。
(4)在Solver Array面板的Properties标签中,将Array type设置为U。
(5)单击SolverVariable按钮,选择上步定义的求解器变量disp_bus_road。
(6)单击Append按钮,增加一个求解器变量,并设置该变量为vel_bus_road,如图9-58所示。
图9-58 Solver Array面板(U)
(7)新建一个标题名为X的Solver Array。
(8)在Solver Array面板的Properties标签中,将Array type设置为X。该矢量用于定义系统状态。
(9)新建一个标题名为Y的Solver Array。
(10)在Solver Array面板的Properties标签中,将Array type设置为Y。该矢量用于定义系统状态。
(11)新建一个标题名为IC的Solver Array。
(12)在Solver Array面板的Properties标签中,将Array type设置为IC。该矢量用于定义初始值状态。
(13)进入Values标签,激活Edit选项,单击Append按钮增加一个初始值项目,并定义两个初值为0,如图9-59所示。
STEP 03 定义控制力
(1)右击工具栏中的力按钮。
(2)在弹出的Add Force or ForcePair对话框中,指定标题为bus_suspension_1。
(3)使用默认的变量名,单击OK按钮,创建力。
图9-59 Solver Array面板(IC)
(4)在Force面板的Connectivity标签中,根据图9-60所示的内容定义力加载对象。
图9-60 Force面板(bus_suspension_1)
(5)进入Trans Properties标签,将力类型设置为Expression,并定义力函数表达式为`-1*ARYVAL({sa_2.id},1)`。
(6)类似地,定义标题为bus_suspension_2的力,根据图9-61所示的内容定义力加载对象。
图9-61 Force面板(bus_suspension_2)
(7)进入Trans Properties标签,将力类型设置为Expression,并定义力函数表达式为`-1*ARYVAL({sa_2.id},2)`。
STEP 04 定义线性系统常数矩阵
目前,MotionView不支持矩阵对象的建模,因此需要手动编辑求解器文件。本步首先将上述创建的模型导出,然后对其进行编辑。
(1)在File菜单中选择Save As→Model命令,另存模型为bus_suspension_motionsolve.mdl。
(2)单击Export Solver Deck按钮。
(3)在弹出的Export Solver Deck对话框中,单击“文件浏览”按钮 ,指定工作路径。
(4)输出模型为bus_suspension_motionsolve.xml。
(5)使用文本编辑器打开bus_suspension_motionsolve.xml。
(6)在命令行</Model>前定义常数矩阵A。
(7)定义常数矩阵B。
(8)定义常数矩阵C。
(9)定义常数矩阵D。
(10)定义状态方程。
(11)修改状态矢量与输出矢量维数为2。
(12)保存模型。
STEP 05 求解模型
(1)启动MotionSolve。
(2)单击Input file(s)栏的“文件浏览”按钮,打开上步保存的bus_suspension_motionsolve.xml文件。
(3)单击Run按钮,求解模型。
(4)返回MotionView界面,单击Page Window Layout按钮,将当前界面设置为。
(5)激活窗口4,将窗口4切换到HyperGraph程序。
(6)根据图9-62绘制MotionSolve控制系统作用下bus相对road的位移和速度曲线。 可以看出,在控制系统的作用下,1.25s后由路面激励产生的振动消失。
图9-62 MotionSolve控制仿真结果
接下来联合Simulink设计控制系统,并进行联合仿真分析。
3.联合Simulink设计控制系统
STEP 01 定义环境变量
联合仿真前需要定义环境变量以实现在Matlab Simulink中调用MotionSolve求解模型。
(1)设置环境变量指向求解器执行文件工作目录。
这里<installation directory>为HyperWorks完整安装路径,<platform>为软件版本,如win32指32-bit Windows版,win64指64-bit Windows版。
例如,在Windows 64-bit操作系统中设置NUSOL_DLL_DIR=E:\Altair\HW11.0\hwsolvers\bin\win64。
(2)设置环境变量指向许可证。
注:HyperWorks工作路径已经由PATH定义。
STEP 02 定义系统变量
(1)回到MotionView界面。
(2)右击工具栏中的Solver Variable按钮。
(3)在弹出的Add Solver Variable对话框中,设置标题为FZ_disp_bus_road。
(4)使用默认的变量名,单击OK按钮,创建求解器变量。
(5)在Solver Variable面板中,将求解器变量类型设置为Expression。
(6)单击文本框,输入`SFORCE({frc_0.id},{0},{4},{0})`。
SFORCE用于返回施加的力值,调用格式为SFORCE(id,jflag,comp,RM)。其中,id为力对象编号;jflag值为0或1,分别表示返回力对象作用物体的I标记点或J标记点;comp可取值1~8,1、2、3、4分别为合力、X轴分量、Y轴分量以及Z轴分量 的力,5、6、7和8分别为合力矩、X轴分量、Y轴分量以及Z轴分量的力矩;RM表示参考的坐标系,RM=0时,表示参看全局坐标系。
(7)类似地,创建标题为vel_bus_road的求解器变量。
(8)定义该求解器变量值为`SFORCE({frc_1.id},{0},{4},{0})`。
STEP 03 定义控制系统输入/输出矢量
(1)在项目浏览树中右击Solver Array文件夹,选择Delete命令,删除已创建的系统状态与输入矢量。这里将定义输入/输出量用于接收来自Simulink的信息。
(2)右击工具栏中的Solver Array按钮。
(3)在弹出的Add Solver Array对话框中,指定标题为PlantInput。
(4)使用默认的变量名,单击OK按钮,创建控制系统输入量。
(5)在Solver Array面板的Properties标签中,将Array type设置为Plant Input。
(6)单击Append按钮,增加一个SolverVariable。
(7)单击SolverVariable按钮,根据图9-63定义求解器输入量。
图9-63 Solver Array面板(PlantInput)
(8)类似地,创建标题名为PlantOutput的矢量。
(9)在Solver Array面板的Properties标签中,将Array type设置为Plant Output。
(10)单击Append按钮,增加一个SolverVariable。
(11)单击SolverVariable按钮,根据图9-64定义求解器输出量。
图9-64 Solver Array面板(Plant Output)
STEP 04 修改控制力
(1)打开项目浏览树中的Force文件夹,单击bus_suspension_1,进入Force面板。
(2)进入Trans Properties标签,可以看到Expression处有错误提示“Error Evaluating”。这是由于第二部分定义的控制力中使用的输入矢量被删除了,表达式找不到相应的对象造成的。下面将修复该错误。
(3)单击Expression处的文本框,输入`-1*PINVAL({sa_0.id},1)`。
PINVAL用于返回控制系统输入单元的值,其调用格式为PINVAL(id,comp)。其中,id为控制系统输入单元编号,comp表示其分量。与该函数对应的是POUVAL(id,comp),POUVAL用于返回控制系统输出单元的值。
(4)类似地,单击项目浏览树bus_suspension_2,进入Trans Properties标签。
(5)单击Expression处的文本框,将bus_suspension_2的表达式修改为`-1*PINVAL({sa_0.id},2)`。
可以看到,当前表达式评估是正确的。
STEP 05 求解模型
联合仿真时,Simulink以S-Function的形式调用MotionSolve求解机械系统模型。需要使用XML文件向机械系统输出被控信号,使用MRF文件从机械系统获得控制信号。本步将首先输出XML模型,然后求解该模型,获取MRF文件。
(1)在File菜单中选择Save As→Model命令,另存模型为bus_suspension_simulink.mdl。
(2)单击工具栏中的按钮,进入Run面板。
(3)在Sim Type下,选择Transient,并指定文件名bus_suspension_simulink.xml。
(4)在Simulation Parameters标签下的End Time中,输入5。
(5)回到Main标签,并单击Run按钮求解模型。
此时工作文件夹下将生成MRF、H3D、ABF等格式的结果文件。
STEP 06 定义控制系统
(1)启动Matlab。
(2)选择File→Set Path命令,在弹出的Set Path对话框中单击Add Folder按钮,选择工作路径。
(3)单击Save按钮,将工作路径加入到Matlab工作路径中。
(4)单击Close按钮,关闭Set Path对话框。
(5)返回Matlab主界面,单击Current Folder处的Browse for folder按钮。
(6)在弹出的Select a new folder对话框中选择工作文件夹,单击OK按钮关闭该对话框。
此时Matlab主界面中的Current folder栏将显示工作文件夹中的所有文件。
(7)单击Simulink按钮,进入Simulink界面。
(8)单击New Model按钮,新建一个Simulink模型。
(9)创建Simulink控制系统,如图9-65所示。
图9-65 Simulink控制系统模型(草图)
(10)双击State-Space,根据图9-66修改传递函数参数。
(11)双击S-Function1,弹出Function Block Parameters对话框。
(12)将S-function name修改为mscosim。
(13)在S-function parameter文本框中输入:'bus_suspension_simulink.xml','bus_suspension_simulink.mrf','',如图9-67所示。
(14)单击OK按钮,关闭Function Block Parameters对话框。为提高控制系统框图的可读性,接下来修改对象名称。
(15)双击To Workspace,将Variable name修改为Pin。
(16)单击Scope图标下的名称,将其修改为Scope_PIn。
(17)双击To Workspace 1,将Variable name修改为POut。
(18)单击Scope1图标下的名称,将其修改为Scope_Pout。
(19)双击To Workspace 2,将Variable name修改为Time。修改完毕的控制系统如图9-68所示。
(20)单击Save按钮,将模型保存为BusSuspension.mdl。注意,Simulink模型文件的扩展名也为.mdl,与MotionView相同。至此,已将机械控
制系统模型全部定义完毕,接下来进行联合求解。
STEP 07 联合仿真
(1)在Simulink模型界面上选择Simulation→configuration parameters命令,弹出Configuration parameter对话框。
图9-66 传递函数参数设置
图9-67 Function Block Parameters对话框
图9-68 Simulink控制系统模型(最终)
(2)进入Solver标签,将Stop time修改为5。
(3)将求解器类型设置为Variable-step,并选择ode45求解器。
(4)设置Max step size为0.01,保持其他参数不变,如图9-69所示。
(5)单击OK按钮,保存设置并退出Configuration parameter对话框。
(6)单击Save按钮,保存模型。
(7)单击Start simulation按钮,求解模型。
(8)求解结束后,双击Scope按钮,可查看控制系统输入/输出信号,如图9-70所示。
STEP 08 比较MotionSolve自求解结果与联合仿真结果
(1)返回HyperView,激活窗口4。
(2)根据图9-71绘制联合仿真中Simulink控制系统作用下bus相对road的位移和速度曲线。
图9-69 Configuration parameter对话框
图9-70 控制系统输入/输出信号
a)输出信号 b)输入信号
图9-71 MotionSolve联合控制仿真结果
由图9-71可以看出两种方法获得的结果一致。
注:联合仿真时,仅获得bus_suspension_simulink.mrf和bus_suspension_simulink.log结果文件。因此,绘制曲线时,打开的结果文件是bus_suspension_simulink.mrf。
(3)选择File→Save→Session命令,将整个窗口保存为一个会话文件。
(4)选择File→Exit,退出程序。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。