图1 火箭发射质量变化
在Adams 2020之前的版本中,针对变质量问题多采用等效方案(力、力矩等效),这种方案一是建模比较复杂,二是不能很好解决转动惯量的问题,三是对无法改变质心的位置与方向。因此,等效方案未能解决客户的深层次需求,需要Adams给出更完整、成熟的变质量系统的运动学仿真方案,Adams 2020FP1版本在Adams原来强大功能的基础上,升级求解器、子程序以及动态链接库,使得完善的变质量系统运动学仿真方案成为现实。
在Adams中,由于质量、转动惯量、质心位置属于设计变量,不属于状态变量,在一次仿真,部件的质量是无法产生改变的,因此需要将一次完整的仿真离散化为多段短时间仿真,此段仿真完成后,保存仿真结果,调整部件质量,再将上段仿真的结果载入,进行新一段仿真,如此循环,直至仿真结束。方法思路如下所示:
图2 变质量方案逻辑流程
在Adams中,consub.f或consub.c子程序,具有分段仿真并调整模型的功能,下面以consub.c为例,阐述变质量方案的子程序逻辑。
程序内容分为两部分:
下面详细介绍consub.c程序主体。
第一个输入参数PAR[0]为双精度,赋给变量end_time;第二个输入参数PAR[1]为整型,赋给变量steps。
PAR[0]、PAR[1]来源于仿真脚本中User函数定义的参数,0、1表示参数顺序。见第4章说明。
一段时长为“end_time”的完整仿真,被离散化为数量为“steps”的小段仿真,每小段仿真的时长为“stepsize”。
iniflg:定义为整型,此为一个逻辑参数,在仿真调用(c_analys)中会引用,确定Adams Solver每次开始仿真时是否重新生成运动方程,在仿真启动时进行模型装配。1表示是,0表示否。
status:定义为整型,此为一个逻辑参数,在仿真调用(c_modify、c_analys)中会引用,表明此调用是否成功。
time:定义为双精度,用来存储仿真时间。
mass:定义为双精度,用来存储部件质量。
cmd:定义为字符串,长度为100,用来存储solver命令。
(4)每段仿真循环体
将一整段仿真离散为“steps”个小段,每小段仿真的定义与赋值都类似,因此,进入循环定义。
c_getstm(&time)
获取当前仿真时间,该命令在已在头文件slv_c_utils.h中定义,对标Fortran语言中的getstm命令,将获取到的当前仿真时间存储到time变量中,用指针的方式赋值。
mass = 100-0.5*time
获取当前仿真时刻部件的质量,100是初始质量(可以自定义),0.5是质量减少速率(可以自定义),此速率可以为变量,直接从Adams中调用。
sprint(cmd, “PART/2, MASS = %f”, mass)
定义cmd字符串,并将mass双精度数值转换为字符串,存储到cmd字符串中。
c_modify(cmd, &status)
调用Fortran中的modify命令,该调用在已在头文件slv_c_utils.h中定义。执行cmd所存储的命令语句,将执行状态存储到status变量中,用指针的方式赋值。status赋值为0,表明执行成功。通过该行命令,在每次仿真开始前,先调整好部件的质量。
c_analys("TRANSIEN", "DYN", i*stepsize, (i 1)*stepsize, iniflg, &status)
图3 status赋值含义
if(status)
c_errmes(status, "Error calling ANALYS for DYN.",status, "STOP");
调用Fortran中的errmes命令,该调用在已在头文件slv_c_utils.h中定义。如果仿真执行不成功,status赋值不为0,则弹出报错信息窗口,并停止仿真。
c_datout(&status)
调用Fortran中的datout命令,该调用在已在头文件slv_c_utils.h中定义。输出由analys命令子程序发起的仿真的所有数据(注:该数据存储于“DYN”文件所在内存中)。并在下一步仿真开始时,自动将此输出的数据作为模型的初态,赋到模型中去。
当子程序编辑完成后,对consub.c或consub.f子程序进行编译,生成动态链接库dll文件(Adams子程序编译过程在此不赘述):
图4 编译生成动态链接库
dll文件引用方式如下:
图5 动态链接库调用
CONTROL/FUN=USER(100,1000)
其中PAR[0]=100,PAR[1]=1000,即将100s的仿真分成1000段。
软件版本要求:Adams 2020FP1及更新版本。