第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx

上传人:b****7 文档编号:11097304 上传时间:2023-02-25 格式:DOCX 页数:32 大小:67.44KB
下载 相关 举报
第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx_第1页
第1页 / 共32页
第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx_第2页
第2页 / 共32页
第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx_第3页
第3页 / 共32页
第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx_第4页
第4页 / 共32页
第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx

《第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx》由会员分享,可在线阅读,更多相关《第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx(32页珍藏版)》请在冰豆网上搜索。

第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用.docx

第9章ADAMS用户子程序陈立平机械系统动力学分析及ADAMS应用

第9章ADAM用户子程序

本章对ADAMS用户子程序做了简要介绍,着重介绍了CONSUB、

GFOSUB和REQSUB的使用方法,以及在用户子程序中两个最常用的功能子程序SYSARY和SYSFNC的使用情况。

通过本章的学习,读者将具备基本的开发用户子程序的能力。

9.1ADAMS用户子程序简介

一般情况下,ADAMS的大部分功能可以通过函数表达式完成,函数表达式很容易操作,因为不必编译或连接程序,而且ADAMS/Solver还会实时地提供函数表达式。

但函数表达式提供的只是有限的编程结构,因此有些复杂的情况,特别是涉及到一些逻辑表达,用函数表达式则很难表达出来。

因此在需要采用一些ADAMS没有提供的特殊函数时,可以采用用户子程序。

用户子程序更具有通用性,可以利用编程语言来定义模型元素或者特定的输出。

用户可以将函数表达式写成子程序的形式并将其与ADAMS/View连接,它具有函数表达式所没有的通用性和灵活性。

子程序利用通用程序设计语言(FORTRAN或C)的功能来定义ADAMS/View不能提供的函数,并使之按照需要而量身设计。

通过连接用户子程序,不会失去ADAMS/View的任何功效,也不会降低仿真速度。

当出现下列情况时,通常会使用到用户子程序:

(1)数学函数很难表达。

(2)需要定义多用户使用的函数。

(3)GSE和UCON声明时,需要用户子程序。

(4)需要控制复杂仿真运行时,以及需要作决策逻辑时。

使用用户子程序时要小心,因为不正确的用户子程序会很难调试。

9.1.1用户子程序的种类

根据用户子程序的功能,可以将它们分为三类:

(1)DriverSubroutine——驱动子程序

(2)EvaluationSubroutines——计算子程序

(3)Restartsubroutines重启子程序

1.驱动子程序(DriverSubroutine)

驱动子程序(DriverSubroutine)--CONSUB--用来驱动ADAMS/Solver。

这样ADAMS/Solver在仿真时可更进一步地完成对模型的分析和修改的自动化工作。

CONSUB发出request(请求),regulate(调整),和varysimulations(改变仿真)的命令,并通过作出的交互式命令来修改数据,或者进行不同的分析。

大多数运行ADAMS/Solver的情况都是交互式,或者是以批处理的形式,一次只涉及到单个的分析。

使用CONSUB,可以完成对数据的动态分析,改

变前提条件,并重复动态分析。

2•计算子程序(EvaluationSubroutines)

计算子程序(EvaluationSubroutines)为用户自定义。

ADAMS/Solver可写子程序来对某些非标准的或复杂的计算式计算其数值。

计算子程序

(EvaluationSubroutine)的程序名和功能如表9-1所示。

表9-1计算子程序(EvaluationSubroutine)的程序名和功能

子程序

功能

COUSUB,CONXX,COUXX2

定义用户自定义的COUPLER

CURSUB

计算曲线坐标以及CURVE的导数

DIFSUB

计算DIFF的微分方程值

DMPSUB

计算FLEXBODY的模型的阻尼比

FIESUB

对FIELD计算力和力矩以及它们的导数

GFOSUB

对GFORCE计算数值

GSE_DERIV

GSE_UPDATE

GSE_OUTPUT

GSESAMP

用GSE来计算当前状态和输出的偏导数值

MFOSUB

对MFORCE计算模型值

MOTSUB

对MOTION计算绞点位移,速度和加速度

REQSUB

对REQUEST计算输出值

SENSUB

对SENSOR计算感应值

SFOSUB

对SFORCE计算力的大小

TIRSUB

对于轮胎接触,定义三个力和三个力矩

UCOSUB

对UCON计算约束值和其导数

VARSUB

对VARIABLE计算其代数值

VFOSUB

对VFOSUB计算力的分量

VTOSUB

对VTORUE计算力矩的分量

3.重启子程序(RestartSubroutines)

重启子程序(Restartsubroutines)由一对子程序组成,SAVESUB和

RELSUB。

它们可以保存和重新加载子程序运行过程中的某些状态变量,这

些状态变量是那些相关的用户子程序在重新启动或进行某些变量初始化时所必须的数据。

如果在用户子程序之间相互调用时,需要使用它们在子程序

内部保存数据。

如果没有使用RELSUB和SAVSUB,在保存仿真文件时,

内部数据就会丢失。

虽然SAVE命令可将模型和仿真数据保存到文件中去,而且可以通过使

用RELOAD命令重新调入保存文件,并可以从该保存点重新启动仿真。

但SAVE和RELOAD不可能对用户子程序的内部数据进行特殊操作,在RELOAD命令之后,ADAMS/Solver会从仿真流程中断点继续调用用户子程序,但用户子程序中某些感兴趣的内部变量却没有得到保存。

例如,假设SFOSUB子程序中力的系数是一个内部状态变量,如果打算将第一次调用SFOSUB子程序时所计算的力的系数保存以作今后使用,若用“SAVE”和“RELOAD”时会产生数据丢失。

可用SAVSUB将计算出

来的系数保存在文件中并用RELSUB重新调入它们,或者力仅仅用RELSUB

来重新计算系数。

重启子程序(RestartSubroutine)的程序名和功能如表9-2所示。

表9-2重启子程序(RestartSubroutine)的程序名和功能

子程序

功能

RELSUB

:

加载能使用户子程序重新启动的信息

SAVSUB

保存以后能重新启动用户子程序的信息

9.1.2子程序的使用

相对于ADAMS/View来讲,用户定义子程序有两个任务:

输入和输出。

输入就是在相应的命令或状态,或在表明当前系统状态的计算结果中,

提供给ADAMS/View的相关信息。

输出就是从ADAMS/View中获得的相关信息。

1.声明浮点变量

为了保证数值在子程序之间或者ADAMS/Solver和子程序之间能够正

确地传递,需要声明浮点变量,就像在ADAMS/Solver中作的声明一样。

在UNIX和Windows机器上,ADAMS/Solver使用双精度浮点变量。

为未声明的浮点变量通常都是单精度的(如REAL),所以应当明确声明所有

的浮点变量都是双精度的。

2.参数的使用

ADAMS/View会从FUNCTION=USER()的表达式中提供给用户子程序参数值。

例如,如果你使用FUNTION=(4.O,5.0,6.0),ADAMS/View通过

精品资料推

一个包含4.0,5.0,6.0的PAR数组参数,以及通过一个值为3的NPAR参

数传递这些数值。

通过使用这些功能使得用户子程序更加灵活。

例如,如果计算需要markerlOl和marker102的距离,可以将这些标志符直接写进用户子程序。

3.避免不连续

在运行表达式中,当使用子程序来定义运动,传感器,力,或者模型中的状态平衡方程时,应当保证这些函数是连续的。

不连续的函数很难处理,因为大多数数学理论都是假定系统方程是连续的。

如果违反了该规则,ADAMS/Solver就会得出出人意料的结果。

当使用

IF声明,将分段函数连接起来时,常常会产生不连续函数。

为了保证函数是连续的,在使用该类型的函数时,一定要小心。

4.创建用户子程序

为了创建自己的用户子程序,ADAMS提供了子程序模板并将它们放在

安装目录install_dir/adams/solver/usersubs中。

子程序不能以C语言为模板。

如果需要一个C语言的子程序,必须通过修改FORTRAN文件来创建它,或者使用FORTRAN模板作为向导,创建自己的C语言格式子程序。

创建用户子程序的步骤:

⑴决定需要创建什么样的用户子程序。

例如,如果有GFORCE的声

明,可以创建GFOSUB的用户子程序。

(2)决定要计算什么,需要什么输入参数。

(3)将合适的用户子程序模板从安装目录拷贝到当前目录。

模板目录中包含了要使用的所有子程序模板。

(4)使用文字编辑器来察看用户子程序模板。

(5)按需要修改用户子程序。

从用户子程序中调用功能子程序,或者其他FORTRAN或C语言子程序。

(6)保存用户子程序。

因为可能对不同的模型会使用相同的子程序,所以最好给文件起一个容易区分的名字。

5.调用用户子程序

可以通过使用声明或者命令来调用用户子程序。

通过使用前面定义的用

户子程序的名字来让ADAMS/Solver知道调用哪一个子程序。

也可以使用子程序来定义一些模型元素。

能调用用户子程序的声明或命令如表9-3所示。

表9-3调用用户子程序的声明或命令

要调用的子程序

使用的声明/命令

CONSUB

CONTROL

COUSUB,COUXX,COUXX2

COUPLER

CURSUB

CURVE

DIFSUB

DIFF

FIESUB

FIELD

GFOSUB

GFORCE

GSE_DERIV,GSE_UPDATE,

GSEOUTPUT,GSESAMP

GSE

MOTSUB

MOTION

RELSUB

RELOAD

REQSUB

REQUEST

SAVSUB

SAVE

SENSUB

SENSOR

SFOSUB

SFORCE

TIRSUB

TIRE

UCOSUB

UCON

VARSUB

VARIABLE

VFOSUB

VFORCE

VTOSUB

VTORQUE

可以从用户子程序中调用功能子程序。

这些子程序的功能就像是在用户

的数据和用户使用的用户子程序的接口一样。

例如,在driveruserwritten

subroutine(驱动用户子程序)中,可以使用control,access功能子程序。

从evaluationuserwrittensubroutines(计算用户子程序)中,也可以调用

access,function,以及某些情况下setup函数。

换句话说,可以从上面任何一个用户子程序中调用access和function函数,但用户只能从driver

subroutine中调用control函数,从某个evaluationsubroutines中调用setup函数。

6.编译,连接和运行库

在写完定制的子程序后,必须要将它们编译并连接到ADAMS以创建

到ADAMS/Solver的用户库文件中去。

然后,可以连同该库与ADAMS/Solver一同运行。

必须有一个FORTRAN编译器,因为ADAMS本身不提供编译器,由用户子程序生成动态连接库的详细过程参见1245节后半部分的介绍。

9.2常用ADAM用户子程序简介

9.2.1使用GFOSU用户子程序实例

为了使读者对用户子程序有一个直观印象,本节首先给出声明和调用GFOSUB子程序的例子,通过与GFORCE函数表达式的对比,说明使用用户子程序的必要性。

有关GFOSUB用户子程序的更详细内容,将在922小节进行介绍。

另外,在1244节的结尾部分提供了GFOSUB用户子程序的具体工程应用实例。

现假定有如下一个GFORCE函数表达式的声明,其函数表达式定义了小球和斜面之间的某种相互作用力关系(此处相互作用力不一定有确切的物

理含义,仅为了说明GFORCE的定义过程),包括力矢量和力矩矢量。

如下图所示,为了在GFORCE中描述这种相互作用力关系,在小球球心上定义了标架Mark」(ID为2001),在斜面上定义了标架Mark_R(ID为2003),同时为了确定小球对斜面的反作用力点的位置,生成与标架Mark」时刻重

叠的标架Mark_J(ID为2002),Mark_J隶属于斜面。

Mark_R:

ID=2003

图9-1小球与斜面的坐标定义及相对关系

于是可以使用GFORCE函数表达式的声明,如下面所示(该GFORCE自身的ID为100):

GFORCE/,1001=2001,JFL0AT=2002,RM=2003,

FX=-10.0*VX(2001,2003,2003)

FY=-10.0*VY(2001,2003,2003)

FZ=-10.0*VZ(2001,2003,2003)

TX=—100.0*WX(2001,2003,2003)

TY=—100.0*WY(2001,2003,2003)

TZ=—100.0*WZ(2001,2003,2003)

如果力和力矩的表达比较冗长,则可以使用GFOSUB用户子程序来代替GFORCE声明。

以及,用下面语句调用已创建好的GFOSUB子程序,并

向其传递参数。

GFORCE/,100I=2001,JFLOAT=2002,RM=2003,

FUNCTION=USER(10.0,100.0,2001,2003,2003)

精品资料推

GFOSUB用户子程序的程序体创建如下:

SUBROUTINEGFOSUB(ID,TIME,PAR,NPAR,DFLAG,

&IFLAG,RESULT)

=======================定义与声明===================

—————————————外部变量定义——————————

INTEGERID

DOUBLEPRECISIONTIME

DOUBLEPRECISIONPAR(*)

INTEGERNPAR

LOGICALDFLAG

LOGICALIFLAG

DOUBLEPRECISIONRESULT(6)

ID标志号,在内部程序中调用

TIME仿真时间

PAR不定维的数组,用以向程序传递参数,本例中维数为5,分

别为:

PAR(

1)

=10.0

PAR(

2)

=100.0

PAR(

3)

=2001

PAR(

4)

=2002

PAR(

5)

=2003

NPARPAR数组的维数,本例中NPAR=5

DFLAG积分标志位,IFLAG初始标志位

RESULT返回的程序值,每一次调用可以返回六个值,本例中:

RESULT

(1)为FX的值

RESULT

(2)为FY的值

RESULT(3)为FZ的值

RESULT(4)为TX的值

RESULT(5)为TY的值

RESULT(6)为TZ的值

———————————本地变量和参数定义—————————

DOUBLEPRECISIONFCT,TCR,VEL(6)

INTEGERIPAR(3),IM,JM,RM,NSTATES

LOGICALERRFLG

========================可执行代码=====================

FCT=PAR

(1)TCR=PAR

(2)IM=PAR(3)JM=PAR(4)RM=PAR(5)

IFLAG的值为true,则将子

调用SYSARY子程序获得计算信息:

如果变量程序初始化。

.

———————将标架的移动和转动速度值赋给VEL数组

IPAR

(1)=IM

IPAR

(2)=JM

IPAR(3)=RM

3,VEL,NSTATES,ERRFLG)

检查SYSARY调用效果

CALLSYSARY('VEL',IPAR,

————————通过ERRMES

CALLERRMES(ERRFLG,'ErrorcallingSYSARYforVEL,ID,''STOP')

——————————返回GFORCE的计算结果

RETURN

END

9.2.2常用用户定义子程序简介下面给出了几个常用用户定义子程序的简介。

对每个子程序,都提供了定义、例子、相关说明等等。

1.CONSUB用户子程序

定义:

CONSUB驱动子程序用于驱动ADAMS/Solver。

只能通过交互式命令CONTROL激活CONSUB,而别的用户子程序则不能调用CONSUB。

调用:

相应的调用命令为:

C0NTR0L/[FUNCTI0N=USER(r1[,…,r30])[\]]

[[]]中的内容表示是可选的。

输入参数构成:

C0NSUB用户子程序的输入参数构成为:

SUBR0UTINEC0NSUB(par,npar)

输入参数说明:

npar整型变量,其值为par数组的维数。

par――双精度常数数组,按顺序匹配CONTROL命令中的USER括

号内的参数值。

主要功能:

ADAMS/Solver将C0NTR0L中的常数以实数数组的形式传递给FUNCTI0N=USER()。

从C0NSUB中,会调用一些功能子程序,如SYSARY,SYSFNC或者AKISPL等,可实现以下主要功能:

(1)M0DIFY功能子程序以交互式的方式调用,用来改变ADAMS/Solver的声明。

(2)调用ANALYS功能子程序的目的就是激活某一个ADAMS/Solver的

分析子程序。

精品资料推

(3)调用DATOUT功能子程序的目的就是处理从ADAMS/Solver仿真的输出。

当CONSUB停止执行时,ADAMS/Solver会提醒你使用其他命令。

如果程序的控制权交给了CONSUB,那么输出的自动生成会停止,如果想处理输出,则要调用DATOUT功能子程序。

CONSUB子程序的结构:

下面给出CONSUB子程序的结构,从而可以看出该子程序是怎样工作的。

SUBROUTINECONSUB(PAR,NPAR)

=======================定义与声明===================

—————————————外部变量定义——————————

INTEGERNPAR

DOUBLEPRECISIONPAR(*)

———————————本地变量和参数定义—————————

========================可执行代码=====================————————————用户自己的程序代码—————————

RETURN

END

CONSUB子程序示例:

下面给出一个CONSUB子程序应用的例子,在该例中,首先对模型进行了一次静力学仿真(StaticSimulation),然后改变Part1的质量后,进行一次动力学仿真(DynamicSimulation),并输出每次仿真的结果。

首先,用交互式的命令激活CONSUB:

CONTROL/FUNCTION=USER(r1[,...,r30])

相应的CONSUB用户子程序为:

SUBROUTINECONSUB(PAR,NPAR)

=======================定义与声明===================—————————————外部变量定义——————————

INTEGERNPAR

DOUBLEPRECISIONPAR(*)

———————————本地变量和参数定义—————————

CHARACTER*10ATYPE

CHARACTER*20TITLE

LOGICALERRFLG,INIFLG

CHARACTER*80COMMND,MESSGE

INTEGERSTATUS

DOUBLEPRECISIONDPZERO

PARAMETER(DPZERO=0.0)

========================可执行代码=====================——————————首先进行一次静力学分析—————————指明分析类型和此次分析的名称

ATYPE='STATIC'

TITLE='STATIC2_003'

INIFLG=.TRUE.

调用功能子程序ANALYS进行静力学分析

CALLANALYS(ATYPE,TITLE,DPZERO,DPZERO,INIFLG,

&STATUS)

如果仿真中出现错误,则调用ERRMES功能子程序返回错误信息并终止仿真

ERRFLG=STATUS.NE.0

MESSGE='ErrorcallingANALYSforSTATIC_1.'

CALLERRMES(ERRFLG,MESSGE,STATUS,'STOP')

调用DATOUT功能子程序输出分析数据

CALLDATOUT(STATUS)

调用MODIFY功能子程序改变PART/1的质量

COMMND='PART/1,MASS=100'

CALLMODIFY(COMMND,STATUS)

指明分析类型和分析的名称进行动力学分析

ATYPE='DYNAMIC'TITLE='DYNAMIC_2003INIFLG=.TURE.

CALLANALYS(ATYPE,TITLE,DPZERO,DPZERO,INIFLG,

&STATUS)

ERRFLG=STATUS.NE.0

MESSGE='ErrorcallingANALYSforSTATIC_2.'

CALLERRMES(ERRFLG,MESSGE,STATUS,'STOP')

CALLDATOUT(STATUS)

RETURN

END

2.GFOSUB用户子程序

定义:

GFOSUB计算子程序用于计算GFORCE声明中的变量值。

GFORCE的函数表达式太复杂或计算流程需要作特殊控制时可以使用GFOSUB用户子程序。

调用:

相应的调用命令为

GFOCE/id,I=id,JFLOAT=id,RM=id

FUNCTION=USER(r1[,…,r30])

([])中的内容表示是可选的。

输入参数构成:

GFOSUB用户子程序的输入参数构成为:

SUBROUTINEGFOSUB(id,time,par,npar,dflag,iflag,result)输入参数说明:

dflag——逻辑型变量;当ADAMS/Solver调用GFOSUB子程序求解某些特定的偏微分方程

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1