找回密码
 注册
Simdroid-非首页
查看: 68|回复: 1

[其他] ANSYS使用经验及二次开发

[复制链接]
发表于 2012-4-10 15:55:18 | 显示全部楼层 |阅读模式 来自 辽宁沈阳

如何定制Beam188/189单元的用户化截面
     ANSYS提供了几种通用截面供用户选用,但有时不能满足用户的特殊需求。为此,ANSYS提供了用户创建截面(库)的方法。如果你需要创建一个非通用横截面,必须创建一个用户网格文件。具体方法是,首先创建一个2-D实体模型,然后利用SECWRITE命令将其保存(Main Menu>Preprocessor>Sections> -Beam-Write Sec Mesh)。该过程的细节如下:
1.       创建截面的几何模型(二维面模型)。
2.       对所有线设置单元份数或者单元最大尺寸 (Main Menu>Preprocessor> -Meshing-Size Cntrls>-Lines-Picked Lines或使用MeshTool)。记住:保证模型中的区格(cell)数目不能超过250个。
3.       选择菜单Main Menu>Preprocessor>Sections>-Beam-Write Sec Mesh,弹出一个拾取窗口,单击Pick All拾取包含区格的所有面。
4.       ANSYS自动在所有面上创建区格。在划分网格时,ANSYS可能显示单元形状差的消息,也可以被忽略不显示,但是总能看到一条消息“Unable to mesh area....”。如果已经完成上述工作,你清除所有面上的单元(Main Menu>Preprocessor>-Meshing-Clear> Areas),并重复第2、3、4步,即必须重新控制网格密度。
5.       如果第4步成功则弹出Write Section Library File对话框,File Name域填入一个未用过SECT文件名,Drives域指定一个截面文件存放驱动器,Directories域指定一个截面文件存放目录,然后单击按钮OK,完成用户截面文件建立。如果在第3步中给线指定太多单元份数,区格和节点的数目可能超过限制范围,必须清除所有面上的单元2~4步,直到获得合适数量的区格和节点。
   一旦完成上述工作,用户可以在以后分析中读取用户网格文件 (Main Menu > Preprocessor > Sections > -Beam-Read Sect Mesh),定义成适当的截面ID号,就与通用梁完全一致。要想检查用户截面,只要绘制截面(网格)图(Main Menu>Preprocessor>Sections>Plot Section)或者列表截面属性(Main Menu>Preprocessor>Sections>List Sections)。

ANSYS 查询函数(Inquiry Function)
在ANSYS操作过程或条件语句中,常常需要知道有关模型的许多参数值,如选择集中的单元数、节点数,最大节点号等。此时,一般可通过*GET命令来获得这些参数。现在,对于此类问题,我们有了一个更为方便的选择,那就是查询函数 — Inquiry Function。
    Inquiry Function类似于ANSYS的 *GET 命令,它访问ANSYS数据库并返回要查询的数值,方便后续使用。ANSYS每执行一次查询函数,便查询一次数据库,并用查询值替代该查询函数。
   
假如你想获得当前所选择的单元数,并把它作为*DO循环的上界。传统的方法是使用*GET命令来获得所选择的单元数并把它赋给一个变量,则此变量可以作为*DO循环的上界来确定循环的次数
*get, ELMAX,elem,,count
*do, I, 1, ELMAX


*enddo
现在你可以使用查询函数来完成这件事,把查询函数直接放在*DO循环内,它就可以提供所选择的单元数
*do, I, ELMIQR(0,13)


*enddo
这里的ELMIQR并不是一个数组,而是一个查询函数,它返回的是现在所选择的单元数。括弧内的数是用来确定查询函数的返回值的。第一个数是用来标识你所想查询的特定实体(如单元、节点、线、面号等等),括弧内的第二个数是用来确定查询函数返回值的类型的(如选择状态、实体数量等)。
    同本例一样,通常查询函数有两个变量,但也有一些查询函数只有一个变量,而有的却有三个变量。
查询函数的种类和数量很多,下面是一些常用、方便而快速快捷的查询函数
1 AREA—arinqr(areaid,key)
areaid—查询的面,对于key=12,13,14可取为0;
key—标识关于areaidr的返回信息
=1, 选择状态
=12,定义的数目
=13,选择的数目
=14,定义的最大数
=-1,材料号
=-2,单元类型
=-3,实常数
=-4,节点数
=-6,单元数

arinqr(areaid,key)的返回值
对于key=1
=0, areaid未定义
=-1,areaid未被选择
=1, areaid被选择

2 KEYPOINTS—kpinqr(kpid,key)
kpid—
查询的关键点,对于key=12,13,14为0
key —标识关于kpid的返回信息

=1,选择状态
=12,定义的数目
=13,选择的数目
=14,定义的最大数目
=-1,数料号
=-2,单元类型
=-3,实常数
=-4,节点数,如果已分网
=-7,单元数,如果已分网
kpinqr(kpid,key)的返回值
对于key=1
=-1,未选择

=0,未定义
=1, 选择

3 LINE—lsinqr(lsid,key)
lsid—
查询的线段,对于key=12,13,14为0
key—标识关于lsid的返回信息

=1, 选择状态
=2, 长度
=12,定义的数目
=13,选择的数目
=14,定义的最大数
=-1,材料号
=-2,单元类型
=-3,实常数
=-4,节点数
=-6,单元数

4 NODE—ndinqr(node,key)
node—
节点号,对于key=12,13,14为0
key—标识关于node的返回信息

=1, 选择状态
=12,定义的数目
=13,选择的数目
=14,定义的最大数
=-2,超单元标记
=-3,主自由度
=-4,激活的自由度
=-5,附着的实体模型
ndinqr(node,key)的返回值
对于key=1
=-1,未选择

=0,未定义
=1, 选择

5 VOLUMES—vlinqr(vnmi,key)
vnmi—
查询的体,对于key=12,13,14为0
key—标识关于vnmi的返回信息

=1,选择状态
=12,定义的数目
=13,选择的数目
=14,定义的最大数目
=-1,数料号
=-2,单元类型
=-3,实常数
=-4,节点数
=-6,单元数
=-8,单元形状
=-9,中节点单元
=-10,单元坐标系
vlinqr(vnmi,key)的返回值
对于key=1
=-1,未选择

=0,未定义
=1, 选择

ANSYS是否具有混合分网的功能?
ANSYS具有混合网格剖分的功能。例如两个粘在一起的面,可以对一个面进行三角形划分,再对另一个面进行四边形划分。过程见下列命令:
/prep7
et,1,42
rect,,1,,1
rect,1,2,,1
aglue,all
mshape,0,2d
amesh,1
mshape,1,2d
amesh,3

机器人结构的优化分析
摘要 机器人结构的有限元优化设计中,需要对设计方案多次修改、计算。除了计算工作以外,结构的修改工作通常是由手工完成,在整个设计工作量中所占比重是比较大的。本文给出一种利用ANSYS软件提供的APDL语言对设计方案进行优化的方法。利用这种方法,结构的修改不再需要人工干预,整个优化过程在使用APDL语言编写的用户优化程序的控制下自动进行,能够有效地提高优化工作的效率和可靠性。
关键词:有限元,结构优化
1. 问题的提出
   工业机器人是计算机技术出现后发展起来的一种新型机械结构,工作效率和机动性比传统机械高很多。随之而来的是,机器人的结构设计在减少质量、提高刚度方面比传统机械结构有更高的要求。在设计工作中,结构的最优化显得更为重要。
   在结构的优化设计中,有限元法是一个比较有效的方法。通常,建立模型和模型的修改都是手工完成的。对于结构比较复杂或者需要修改的地方很多的情况下,优化的时间比较长。其中计算时间相对较少,建模和结构修改所占比重较大。如何减少建模和结构修改的的时间,是提高结构优化效率的关键。
   APDL语言 是ANSYS软件提供给用户的一个依赖于ANSYS程序的交互式软件开发环境。APDL语言具有类似一般计算机语言的常见功能 ,如类似于常数定义、变量定义和赋值的参数定义,分支和循环控制语句,类似于子程序调用的宏调用等功能。除此以外,还包含有比较强的数学运算能力,如算术运算、比较、取整和标准FORTRAN的三角函数、指数函数、双曲函数等。利用APDL语言还可以读取ANSYS程序数据库中的数据进行数学运算,以及建立分析模型,控制ANSYS程序的运行过程等功能。
   1所示是一个三杆并联的机器人结构的原始设计方案。机器人的机座采用门式结构,三个驱动杆的长度可变,使得末端件能够完成指定的运动。由于采用三个驱动杆,上横梁的核心部分呈等边三角形,如图2所示。结构沿立柱平面无法设计成对称形式,横梁在两个立柱之间沿x方向的位置难以确定。而且,原始设计方案的有限元分析结果表明,横梁与1驱动杆相联的悬伸端沿z向变形比较大,刚性比与23杆相联的部分弱很多,约为其它两个杆所在部位刚度的十分之一。这种刚度的不一致性给末端件在高工作载荷下的运动精度带来一定的影响。确定上横梁沿x方向的位置是很有必要的。
对于上述问题,一般的优化策略是不断地改变上横梁的位置,经多次试算,最终找到一个合适的位置。每次试算,都要根据计算结果修改模型,重新建模。手工操作迭代过程,如果迭代次数比较多,很难避免出现失误,优化失败的几率比较高。模型修正以后,上横梁的壁板和筋板形状会发生变化。由于上横梁的内部结构形状比较复杂,壁板和筋板形状的变化对上横梁刚度的影响难以预测,试算的次数比较多,修改模型的工作量也相应比较大。

图1 原始设计方案
   本文利用ANSYS程序的APDL语言对上述的横梁位置优化问题给出了一个优化策略。在第一次的分析模型建立起来后,利用命令记录文件中生成的建模指令构造用户的优化控制程序,后续的迭代优化过程都由APDL语言编写的用户控制程序完成,不再需要人工干预。对图1所示的模型进行修改所需的时间减少到可以忽略的程度,整个优化过程的效率有很大提高。
2. 分析模型的建立
   1所示结构由三部分组成:两个立柱,一个横梁和三个驱动杆。立柱和横梁通过图1所示立柱上部第一个水平筋板处的螺钉联接。由于主要考虑横梁的变形,驱动杆部分可以略去,在联接部位代之以等效力。
   横梁部分的核心是三个与驱动杆联接的部位和中间的有特殊用途的孔,尺寸必须保证。其它部分则与立柱能有效联接即可。为建模的方便,在ANSYS程序中将横梁的核心部分做成一个元件(component)。在优化过程中,这一部分几何形状保持不变,只改变它与立柱沿x轴的相对位置,即只改变联接部分的几何形状。需要注意的是,联接部分在优化迭代过程中只改变几何尺寸,不改变拓扑结构,可以通过程序自动完成。

2  横梁的核心部分
   横梁与每个立柱通过六个螺栓联接。在螺栓联接部位,结点应当耦合。在非螺栓联接部位,结合面不能承受拉应力,应设置接触单元。模型中包含接触单元以后,求解过程需要大量的非线性迭代计算,机时增加很多。将横梁与立柱作为一体进行的试算表明,立柱的外侧受拉,内侧受压。考虑到主要分析对象是上横梁与三个驱动杆处的联接刚度,可以将接触单元略去,在立柱外侧建立图2所示的联接面几何模型。横梁与立柱的联接处,有螺栓的部位,上下面共享一个关键点,没有螺栓的部位,上下面各自拥有一个关键点。这样做的好处是,网格剖分时,在公共关键点处自动生成一个结点,建立起立柱和横梁之间的耦合关系。在非公共关键点处,横梁和立柱上的结点则不会有这种耦合关系。在立柱的内侧,立柱与横梁在接触面上联成一体,所有结点都将是耦合的,立柱和横梁共享这些结点,而不仅仅是在螺栓联接处。这样做的好处是,既省去了接触单元,又能反映螺栓联接的特点。
   立柱底部与基础的联接处理成刚性的全约束。
分析的主要目标是横梁的刚性,可以认为上横梁在与三个驱动杆的联接处承受相同的载荷。这样可以根据计算得到的变形结果,直接评价三个联接部位的刚度。
结构采用薄壁铸件,在分析模型中采用板壳单元shell63模拟。结构的外壁与筋板厚度不同,需要为板壳单元设置两组不同的实常数(real constant)。
同样,为了建模的方便,将两个立柱做成另一个元件。进而将立柱核心部分建立的元件与立柱元件做成一个部件(assembly)。这样,在修改模型的时候,可以很容易地将立柱与横梁的联接部分选择出来,完成修改过程。
   经过上述的处理,可以建立类似图1所示的分析模型。由于模型和载荷的对称性,实际计算可以只取一半,总的单元数就只有8927个,总结点数为4341个,全部使用三角形网格剖分。
3. 优化策略
优化过程本质上是一个试算-修改的迭代过程。以原始设计方案作为迭代计算的初始条件,迭代过程结束的条件是:三个驱动杆联接处的刚度接近相等或者迭代次数过多。对于这个具体问题,可以预知三个联接部位刚度相等时的横梁位置是存在的,如果迭代不收敛,只能是移动量不合适或者初始位置不合适。为了迭代过程能够快速有效地收敛,采用对分搜索的变步长算法,自动修正移动量。算法稍微复杂一些,但是对初值的要求不高,有比较好的通用性。

3    立柱外侧与横梁的几何联接
下面给出优化策略的控制流程。
1 从备份文件中读出横梁在初始位置时的模型数据;
2 修改横梁的位置;
3 求解修改后的模型;
4 读出与三个驱动杆联接部位的变形;
5 判断是否满足收敛条件,不满足,修改移动量后返回3,满足,则退出循环;
6 存储求解结果后退出。
下面是程序的主要控制代码及其功能的注释。其中具体的建模指令被省略,代之以省略号,为了便于同控制流程对照,加了部分必要的注释。
/BATCH                              ANSYS的批处理文件标记
RESUME,,robbak,db,,0                从备份文件robbak.db中读入原始数据
/PREP7                              进入前处理器,
。。。                              删除横梁与立柱的联接部分
。。。                              将横梁核心元件移动一个初始step
。。。                              在几何模型上施加载荷和约束

。。。                              网格划分
FINISH                              退出前处理器
/SOLU                               进入求解器
SOLVE                               求解
FINISH                              退出求解器
/POST1                              进入后处理器
*GET,front,NODE,2013,U,Z            读第一个驱动杆联接处的结点变形至front
*GET,back,NODE,1441,U,Z            
读第二个驱动杆联接处的结点变形至
back
lastdif=1                           
上一次frontback差值的绝对值

flag=-1                             优化结果可行性的标记
step=0.05                           从初始位置到最优位置的移动量初值
*DO,I,1,10,1                        迭代循环开始,循环变量I,取值范围110,步长1
dif=abs(front-back)                 
本次计算结果中frontback的差的绝对值

*IF,dif,LE,1.0E-6,THEN              判断差值dif是否满足要求
flag=1                              满足,则标记置1
*EXIT                              
退出迭代计算

*ELSEIF,dif,GE,lastdif,THEN         判断差值dif是否变大
flag=2                              差值变大,标记置2
。。。                              对分法修改
step
。。。                              继续以前一次位置作起点,以修改后的step为当前step,开始新一轮

                                    
迭代计算

*ELSE                               差值不小于期望值,且逐渐变小,需继续移动上横梁
。。。                              从备份文件中读入初始状态数据
。。。                              进入前处理器
AGEN, ,P51X, , , ,step, , , ,1      移动上横梁的核心部分,移动量step
。。。                              构造横梁和立柱的联接部分

。。。                              施加载荷和约束
。。。                              网格划分
FINISH                              退出前处理器
/SOLU                               进入求解器
SOLVE                               求解
FINISH                              退出求解器
/POST1                              退出后处理器
*GET,front,NODE,2013,U,Z            front赋值
*GET,back,NODE,1441,U,Z             back赋值
lastdif=dif                         更新lastdif
*ENDIF if-else                     
语句的结尾

*ENDDO *DO                          循环语句的结尾
   上面这个文件比较长,约1000行。主要目的是为了使程序的结构清晰。有很多代码是复用的,如一些建模指令和后处理指令。使用时,可以将这些指令构成相应的宏在主程序中调用,能有效地缩短主程序的长度。此外,文件中多数具体的建模指令是从ANSYS程序的命令记录文件中复制过来的,包含很多在图形界面下才用到的指令。以ANSYS的批处理方式使用时,可以将这些命令删除,也能缩短文件长度。
   在上述程序中,模型指定部位的变形是通过结点读取的。在网格剖分中,为了确保剖分成功,并且不产生形状恶劣的单元,不得已使用了三角形网格。优化过程的每一步迭代,模型的立柱和横梁核心联接部分的几何形状都会不同,这会使剖分出来的网格数量有所不同,指定位置处的结点编号就有可能不同。依据结点编号从数据库中读取的数据就有可能不是指定位置的数据。为此,需要首先剖分横梁的核心部分,这样,横梁上的结点编号在每次迭代过程中都是固定的。
   迭代的最终结果是否是一个可行的结果,需要通过查看参数flag判定。只有flag=1,计算结果才是可行的,否则表示迭代过程并没有找到最佳位置。横梁的移动量存储在参数step中。如果计算结果是可行的,step的值就是横梁从原始设计位置到最优位置的移动量。总的迭代次数存放在参数I中,通过I的最终值,可以估计分析结果的可行性和初始条件是否合适。
4. 分析结果
   优化过程总共进行了7次迭代,耗费机时约2小时37分钟,找到了最优位置。由于机器读入指令的过程比人工修改模型的速度快得多,修改模型的时间基本可以忽略。优化过程所需时间取决于求解时间。与人工完成的优化过程相比,效率有了较大提高,而且避免了复杂模型在建模过程中容易出现的人为失误导致后续迭代计算出错或偏离优化目标等问题。
5. 结论
   分析结果表明,本文给出的优化方法是有效的,达到了预期的优化目的。该方法的优点是可靠性高,优化过程不易出错。其次是通用性比较好,在类似的结构优化设计中,文中给出的控制代码无需作大的改动即可移植使用。缺点是在优化过程中不能改变优化对象的拓扑结构。在不改变拓扑结构的条件下,修改模型的工作量越大,越能体现出该方法的优越性。另外,对于需要改变拓扑结构的优化问题,可以使用ANSYS程序提供的拓扑优化功能。如果将本文的方法与之结合,可以取得更好的优化效果。

参考文献
[1] ANSYS Advanced Analysis Techniques, 3 rd Edition, SAS, IP, Inc.@
[2] ANSYS Commands Reference, Tenth Edition, SAS, IP, Inc.@
[3] APDL Programmer's Guide, Third Edition, SAS, IP, Inc.@

Optimization for Robot Structure

Department of Mechanical Engineering, Xi’an University of Technology

Abstract
In optimal design for robot structures, design model need to be modified and computed time after time. Becauese modifying usually can not automatically be run, it comsumes a lot of time. This paper gives a method that uses APDL language of ANSYS software to make optimal control program, which make optimal procedure run automatically and optimal efficiency be improved.
Key word: finite element, structural optimization

此文由西安理工大学机械与精密仪器学院王世军老师提供
特此表示感谢
发表于 2012-4-10 16:22:56 | 显示全部楼层 来自 湖北武汉
Simdroid开发平台
首先感谢楼主共享资料。
不过建议楼主去看看什么叫二次开发;APDL命令流只是参数化建模
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-9-22 05:30 , Processed in 0.037401 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表