ADAMS二次开发基础研究.docx
《ADAMS二次开发基础研究.docx》由会员分享,可在线阅读,更多相关《ADAMS二次开发基础研究.docx(21页珍藏版)》请在冰豆网上搜索。
![ADAMS二次开发基础研究.docx](https://file1.bdocx.com/fileroot1/2022-11/15/9db8f945-82b6-4452-b4e5-29e5547d8684/9db8f945-82b6-4452-b4e5-29e5547d86841.gif)
ADAMS二次开发基础研究
ADAMS二次开发基础研究
摘要:
本文对ADAMS二次开发中的用户子程序与用户界面定制进行了简单探讨。
关键词:
ADAMS,二次开发,Subroutine,用户界面定制
1概述
ADAMS具有很强的二次开发功能,包括ADAMS/View界面的用户化设计,利用cmd语言实现自动建模和仿真控制,通过编制用户子程序满足用户的某些特定需求,甚至可以拓展ADAMS的功能,还有就是使用ADAMS/SDK来把运动仿真功能完全集成到自己的软件包中,脱离ADAMS软件环境来进行自己的运动仿真。
由于ADAMS/SDK能在脱离ADAMS其它前处理环境使用,因此使用它的都是一些脱离ADAMS环境自己开发运动仿真工具的高级用户使用,普通用户在不脱离ADAMS环境的条件下,使用Subroutines、自定义用户界面等二次开发功能就能满足用户所需的需求。
因此本文只对不脱离ADAMS环境的二次开发技术做一定的探讨,对ADAMS/SDK只作简单的介绍。
2ADAMS/SDK介绍
ADAMS/SDK是ADAMS软件开发工具包。
利用ADAMS/SDK,用户可以把运动仿真功能完全集成到自己的软件包中,也可以为已有的产品增加更强的运动仿真能力。
集成后的工具包与ADAMS具有同样的仿真分析功能。
ADAMS/SDK使用流行的C或C++语言作为编程接口环境。
可以快速、简单、有效地在用户的软件包中增加运动仿真功能。
用户通过集成ADAMS在各行业中已验证的经验,可以大大地节省在运动仿真开发方面的投资。
ADAMS/SDK可以广泛地应用于CAD软件中的运动学和动力学工具,CAD软件中装配位置的确定,制造业中的动态仿真,数字化装配运动回放及工业特殊用途的运动仿真。
3ADAMS用户子程序
3.1用户子程序简介
一般情况下,ADAMS的大部分功能可以通过函数表达式完成,函数表达式很容易操作,因为不必编译或连接程序,而且ADAMS/Solver还会实时地提供函数表达式。
但函数表达式提供的只是有限的编程结构,因此有些复杂的情况,特别是涉及到一些逻辑表达,用函数表达式则很难表达出来。
因此在需要采用一些ADAMS没有提供的特殊函数时,可以采用用户子程序。
用户子程序更具有通用性,可以利用编程语言来定义模型元素或者特定的输出。
用户可以将函数表达式写成子程序的形式并将其与ADAMS/View连接,它具有函数表达式所没有的通用性和灵活性。
子程序利用通用程序设计语言(FORTRAN或C)的功能来定义ADAMS/View不能提供的函数,并使之按照需要而量身设计。
通过连接用户子程序,不会失去ADAMS/View的任何功效,也不会降低仿真速度。
当出现下列情况时,通常会使用到用户子程序:
(1)数学函数很难表达。
(2)需要定义多用户使用的函数。
(3)GSE和UCON声明时,需要用户子程序。
(4)需要控制复杂仿真运行时,以及需要作决策逻辑时。
使用用户子程序时要小心,因为不正确的用户子程序会很难调试。
3.2用户子程序的种类
根据用户子程序的功能,可以将它们分为三类:
(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可写子程序来对某些非标准的或复杂的计算式计算其数值。
3.重启子程序(RestartSubroutines)
重启子程序(Restartsubroutines)由一对子程序组成,SAVESUB和RELSUB。
它们可以保存和重新加载子程序运行过程中的某些状态变量,这些状态变量是那些相关的用户子程序在重新启动或进行某些变量初始化时所必须的数据。
如果在用户子程序之间相互调用时,需要使用它们在子程序内部保存数据。
如果没有使用RELSUB和SAVSUB,在保存仿真文件时,内部数据就会丢失。
虽然SAVE命令可将模型和仿真数据保存到文件中去,而且可以通过使用RELOAD命令重新调入保存文件,并可以从该保存点重新启动仿真。
但SAVE和RELOAD不可能对用户子程序的内部数据进行特殊操作,在RELOAD命令之后,ADAMS/Solver会从仿真流程中断点继续调用用户子程序,但用户子程序中某些感兴趣的内部变量却没有得到保存。
3.3子程序的使用
相对于ADAMS/View来讲,用户定义子程序有两个任务:
输入和输出。
输入就是在相应的命令或状态,或在表明当前系统状态的计算结果中,提供给ADAMS/View的相关信息。
输出就是从ADAMS/View中获得的相关信息。
1.声明浮点变量
为了保证数值在子程序之间或者ADAMS/Solver和子程序之间能够正确地传递,需要声明浮点变量,就像在ADAMS/Solver中作的声明一样。
在UNIX和Windows机器上,ADAMS/Solver使用双精度浮点变量。
因为未声明的浮点变量通常都是单精度的(如REAL),所以应当明确声明所有的浮点变量都是双精度的。
2.参数的使用
ADAMS/View会从FUNCTION=USER()的表达式中提供给用户子程序参数值。
例如,如果你使用FUNTION=(4.0,5.0,6.0),ADAMS/View通过一个包含4.0,5.0,6.0的PAR数组参数,以及通过一个值为3的NPAR参数传递这些数值。
通过使用这些功能使得用户子程序更加灵活。
例如,如果计算需要marker101和marker102的距离,可以将这些标志符直接写进用户子程序。
3.避免不连续
在运行表达式中,当使用子程序来定义运动,传感器,力,或者模型中的状态平衡方程时,应当保证这些函数是连续的。
不连续的函数很难处理,因为大多数数学理论都是假定系统方程是连续的。
如果违反了该规则,ADAMS/Solver就会得出出人意料的结果。
当使用IF声明,将分段函数连接起来时,常常会产生不连续函数。
为了保证函数是连续的,在使用该类型的函数时,一定要小心。
4.创建用户子程序
为了创建自己的用户子程序,ADAMS提供了子程序模板并将它们放在安装目录install_dir/adams/solver/usersubs中。
子程序不能以C语言为模板。
如果需要一个C语言的子程序,必须通过修改FORTRAN文件来创建它,或者使用FORTRAN模板作为向导,创建自己的C语言格式子程序。
创建用户子程序的步骤:
(1)决定需要创建什么样的用户子程序。
例如,如果有GFORCE的声明,可以创建GFOSUB的用户子程序。
(2)决定要计算什么,需要什么输入参数。
(3)将合适的用户子程序模板从安装目录拷贝到当前目录。
模板目录中包含了要使用的所有子程序模板。
(4)使用文字编辑器来察看用户子程序模板。
(5)按需要修改用户子程序。
从用户子程序中调用功能子程序,或者其他FORTRAN或C语言子程序。
(6)保存用户子程序。
因为可能对不同的模型会使用相同的子程序,所以最好给文件起一个容易区分的名字。
5.调用用户子程序
可以通过使用声明或者命令来调用用户子程序。
通过使用前面定义的用户子程序的名字来让ADAMS/Solver知道调用哪一个子程序。
也可以使用子程序来定义一些模型元素。
能调用用户子程序的声明或命令如表1所示。
表1调用用户子程序的声明或命令
要调用的子程序
使用的声明/命令
CONSUB
CONTROL
COUSUB,COUXX,COUXX2
COUPLER
CURSUB
CURVE
DIFSUB
DIFF
FIESUB
FIELD
GFOSUB
GFORCE
GSE_DERIV,GSE_UPDATE,
GSE_OUTPUT,GSE_SAMP
GSE
MOTSUB
MOTION
RELSUB
RELOAD
REQSUB
REQUEST
SAVSUB
SAVE
SENSUB
SENSOR
SFOSUB
SFORCE
TIRSUB
TIRE
UCOSUB
UCON
VARSUB
VARIABLE
VFOSUB
VFORCE
VTOSUB
VTORQUE
可以从用户子程序中调用功能子程序。
这些子程序的功能就像是在用户的数据和用户使用的用户子程序的接口一样。
例如,在driveruser——writtensubroutine(驱动用户子程序)中,可以使用control,access功能子程序。
从evaluationuser——writtensubroutines(计算用户子程序)中,也可以调用access,function,以及某些情况下setup函数。
换句话说,可以从上面任何一个用户子程序中调用access和function函数,但用户只能从driversubroutine中调用control函数,从某个evaluationsubroutines中调用setup函数。
6.编译,连接和运行库
在写完定制的子程序后,必须要将它们编译并连接到ADAMS以创建到ADAMS/Solver的用户库文件中去。
然后,可以连同该库与ADAMS/Solver一同运行。
必须有一个FORTRAN(Fortran语言)或C(用C语言)编译器,因为ADAMS本身不提供编译器。
下面给出编译和连接的过程。
(1)软件平台
在ADAMS中可以用FORTRAN或C进行User-subroutine的编写,文中实例使用的相应版本和编译命令如下:
∙MSC.ADAMS的版本是2005.0.0
∙C语言的编译器是MicrosoftVirtualC++v6.0+SP5,编译命令为:
Cl/c/G6/Ox/MDxxx.c
我们在使用的时候不需要计上面的命令,在ADAMS2005中可以直接把源代码编译成动态链接库(dll)。
(2)编译和连接
在命令行Command窗口下输入ADAMS05->CR-USER->xxx.c,之后会在你的工作目录下自动生成xxx.dll文件。
图1编译和连接命令行窗口
图2编译和连接命令行窗口
(3)运行加载dll链接库
运行和加载dll的方法有两种:
第一种是在命令行下面运行加载,其命令为:
adams05aviewru-ui–nxxx.dll
另外一种方法是在ADAMS/View用户界面中通过设置来加载dll,如图3所示。
图3加载用户子程序
加载后就可以在函数编辑器中使用自己定义的用户子程序了。
4用户界面的定制
ADAMS/View的界面对象都是以层次结构存储在模型数据库中,类似于零件模型的层次结构。
所有定制的界面对象都存储在名为GUI的数据库中,该数据库可以很方便地管理所有的标准界面对象。
界面对象的层次结构如图4所示。
图4界面对象的层次结构
最上层的界面对象是窗口和对话框。
如果主要建模窗口起名为main的话,其数据库全名应为.gui.m