目录
1.常用虚拟样机软件
2.在Solidworks中建立虚拟样机,导入 Adams计算和后处理
1.Solidworks 中简化模型
2.进入motion模块操作
3.adm 导入 Adams
4.后处理模块 Postprocessor
3.Solidworks 提供三维模型,Adams 完成虚拟样机搭建和计算及后处理
1.Solidworks 中简化模型
2.Adams 中动力学模型
3.后处理模块 Postprocessor
4.Adams提供子系统与Matlab完成联合仿真
1.常用虚拟样机软件
自然界广泛存在四种物理场:温度场、电磁场、结构(位移、应力、应变)场、流场
不同的工程所应用的物理场不同,各物理场所使用的公式理论和仿真软件也不一 样。 本人在比赛中主要在结构场和流场中进行建模分析。涉及到多体动力学分析和静力学分析以及流体力学分析。软件有 Solidworks、Adams、Ansys workbench、Fluent... 等
Solidworks 主要进行三维建模设计也可进行关键零件的简单力学分析 (Simulition 模块)。
Adams 是多体动力学仿真中最常用软件,也是本文的重点阐述软件。可以进 行动力学模型搭建(View模块)、仿真求解(Solver模块)以及仿真数据处理 (Postprocessor模块)。
Ansys 是有限元仿真常用软件,可以进行静力学分析(Static Structural 模块)、 碰撞分析(LS-dyna 模块)以及流体流场分析(Fluid Flow 模块)等,Workbench 集 成了许多仿真模块,各模块的结果数据可以共享使 Ansys的功能异常强大。
结构场是最常用的分析场。本文是在结构场中以中心供弹为例,展开该虚拟样机搭建过程的阐述。诣在研究 17mm 弹丸在弹仓中的运动状态和拨轮受力情况,用于指导拨弹模块的改进,进而提高射频满足需求。
2.在Solidworks中建立虚拟样机,导入 Adams计算和后处理
1.Solidworks 中简化模型
在 solidworks 中简化拨弹模块,压缩不影响本次研究问题的无关零件(电机及其相关固定零件、轴承、底部板材和主框架板材等)。并添加上子弹,子弹如是阵列生成,需要右键解散阵列.所 有零件应赋材料(子弹材料 TPE,用 PA 代替)如图 2-1 到图 2-2 的简化
图2-1 简化前模型
图2-2 简化后模型
2.进入motion模块操作
打开【motion】插件 进入 motion 模块(如没有在![](https://img-blog.csdnimg.cn/direct/41ea925dbf61429083db8ba8322b0eeb.png)
→【插件】中勾选 motion), 在左下角将页面切换至【运动算例 1】,将下拉菜单【动画】切换到【motion 分 析】,依次添加各个实体间的接触力 contact(球与球之间、球与拨轮之间、球与弹 舱之间),检查弹舱为固定状态,最后设置重力.到此为止,模型搭建完毕,驱动马达 可以不添加,放在 Adams 中操作.图 2-3 是各按钮位置.
图2-3 motion 模块的操作界面
在动力学模型中每个实体之间的物理碰撞检测是靠添加两个物体间的接触力实 现的,在 Adams 和 Solidworks 中每个接触均有 8 个参数(图 2-7 中标出),四个碰 撞参数:Stiffness(刚度系数)、Force Exponent(刚度指数)、Damping(阻尼系 数)、Penetration Depth(最大穿透值),四个库仑摩擦参数:Static Coefficient(静摩 擦系数)、Dynamic Coefficient(动摩擦系数)、Stiction Transition Vel(静摩擦过 渡速度)、Friction Transition Vel(动摩擦过渡速度), 表 2-1 给出大致参数确定方法,如图 2-4 和图 2-5 方便理解各个参数的意义.
表 2-1 Impact 接触参数与 Coulomb 摩擦参数
Impact接触参数 Coulomb摩擦参数 Stiffness (刚度系数) 由附件中stiffness.m计算给出,所需要的参数 参考《常用材料的弹性模量与泊松比》(注意单位) Static Coefficient (静摩擦系数) Force Exponent (刚度指数) 计算瞬时法向力中材料刚度项贡献值的指数 通常取1.5,橡胶取2~3,金属1.3~1.5 Dynamic Coefficient (动摩擦系数) Damping (阻尼系数) 一般取Stiffness的0.1~1% Stiction Transition Vel (静摩擦过渡速度) 取0.1mm/s Penetration Depth (最大穿透值) 一般取0.1mm,渗透量大于该值时,阻尼开始起作用 Friction Transition Vel (静摩擦过渡速度) 取10mm/s
图2-4 Impact 接触参数参考图
图2-5 Coulomb 摩擦参数参考图
图2-6 各球之间接触
图2-7 各球之间的接触参数设置
图 2-6 为添加球和球接触中实体选择操作,可以看出不勾选接触组时,添加的是所 选择各实体间的接触,17 颗球之间一共有 136 个接触.图 2-7 为球和球之间的接触参数设置(数据需要自己计算).
图2-8 球和轨道的接触
图2-9 球与弹舱之间的接触参数设置
图 2-8 使用【接触组】添加接触,球和拨轮以及球和轨道的接触需要使用接触组, 即球为一组与另外四个零件分别添加接触,各球之间接触不会被重复添加,在图中 看出 17 个子弹与四个零件间分别添加接触,共 68 个接触. 图 2-9 为球和轨道之间的接触参数设置. 使用 Solidworks 方便交互式批量添加各实体间的接触力,Adams 中接触力的添加比较难操作.多个实体之间只有用脚本命令进行添加才比较方便
3.adm 导入 Adams
动力学模型导入到 Adams 中,检查模型,稍作修改,一些复杂的约束用简单约束来 替换,在 Solidworks 中的互相固连的零件可以进行两种操作①两个零件用 Fixed 约束锁死②使用 Boolean 运算进行零件合并,给拨轮添加 Revolute 铰接约束,在铰接约束上添加 motion 驱动.打开求解器进行仿真运算即可.(Adams2017 计算速度会稍快些)
图2-10 计算按钮
图2-11 Solidworks 与 Adams 的接口
把模型按照第一第二步搭建完之后,点击【计算】按钮(图 2-10),计算结果一般都 会报错可以忽略,Solidworks 中的求解器计算很容易失败,所以只用 motion 做模 型搭建这种前处理工作.右键模型名称输出 Adams(图 2-11),输出英文命名 的.adm 文件和一些.xmt_bin 以及.res 文件均保存在英文路径下.
图2-12 导入.adm 文件
图2-13 MKS 单位制设置
打开 Adams 导入.adm 文件,新建模型“loader_0”,设置单位制.如图 2-12 和图 2-13
图2-14 连接约束
图2-15 Fixed(固定)和 Revolute(旋转)约束
如图 2-14 在 Adams 中删除【连接】中所有约束,将几个固定零件间添加 Fixed 约束(固定锁死)
图2-16 右键→外观
图2-17 Appearance→Color
更改拨轮颜色为 Red,方便观察和操作,如图 2-16 和图 2-17也可以根据需要更 改其他零件颜色.图 2-17 中【可见性】点选 off 即可隐藏该零件,该操作同样适 用于其他类型信息,如 Connectors、Motion、Force 等
图2-18 添加 Revolute(旋转)约束
图2-19 Revolute(旋转)约束结果
在拨轮和弹舱中间添加旋转副,操作如图 2-18 结果如图 2-19
图2-20 Rotational Joint motion(旋转驱动)
将旋转驱动添加到拨轮的旋转副上
图2-21 motion 结果
图2-22 motion 参数
在 joint_1 上添加 motion_1,参数设置如图 2-22
17mm 子弹材料为 TPE,密度 970 kg/m³弹性模量 3.4GPa,泊松比 0.32(近似)
图2-23 新建材料
图2-24 TPE 材料参数
【物体】树下右键其中一个球单击【修改】, 出现对话框如图 2-23 在 【定义质量方式】下拉菜单选择【、几何形状和材料类型】,在 【材料类型】中右键出现图中对话框,依次选取【材料】→【创建】 会跳出对话框如图 2-24,按照 TPE 参数设置单击【应用】→【确定】,然后单击 图 2-24 中【Apply】即发现图中材料参数刷新至新建 TPE 材料.依次添加剩余球的材料和弹仓材料(【材料】→【推测】→【aluminum】)
注:17 个球的材料用命令流可以批量添加,后面会重点讲解命令流建模方法
模型搭建完毕,进入 simulation 进行求解计算
图2-25 仿真参数设置
如图 2-25 仿真正在进行中,左上角为仿真计算过的模型时间,在 Simulation Control 对话框中【终止时间】为仿真总时长,下面为仿真步长,根据模型复杂程度给定,合理的步长节省仿真时间、提高仿真 精度.如果计算报错则检查模型有无物理干涉和严重死点,调整仿真步长和接触参 数继续进行仿真计算,多次仿真计算应勾选【运行前复位】保证每次仿真计算前参数重置.仿真时间由模型复杂度和电脑 CPU 以及内存而定,如果模 型复杂则仿真时间会十几个小时甚至几天,电脑配置稍好些会加快运算效率.另 外合理的模型化简和模型搭建也会影响仿真时间. 关于充分利用电脑性能加快仿真速度,可以从开启多线程运算和增大可调用内存两个方面入手多线程运算途径>在 Adams/View 界面下通过“设置>求解器>执行” 菜单打开设置窗口,并勾选“更多”选项,在 “线程数量”位置输入参与计算的线程数(128).如图 2-26和2-27
图2-26
图2-27
4.后处理模块 Postprocessor
进入后处理模块 Postprocessor,观察动画可以看到子弹在拨轮中的运状态,进行 子弹轨迹追踪和一些感兴趣物理量的测量.比如输出电机的驱动扭矩值,进行电机 选型.通过仿真动画和数据指导版本迭代改进.(可参考下一章 3-3)
3.Solidworks 提供三维模型,Adams 完成虚拟样机搭建和计算及后处理
1.Solidworks 中简化模型
Solidworks 简化模型,操作过程和流程和 2.1 中相同,最后将装配体另存成 Parasolid(*.x_t)格式如图 3-1,导入 Adams 做前处理.注意:Adams 不支中文路 径和中文文件名.
图3-1 导出 x_t
打开 Adams View,新建模型导入.x_t 文件.单击【New Model】输入自定义模型 名称(英文),单击【ok】会新建一个空白模型,【主菜单】>【File】>【import】下 拉菜单第一个【File Type】中选择 Parasolid,在【File To Read】中右键>【Browse】 浏览到目标.x_t 文件,在【Model Name】右键选择新建的模型名称.单击【Ok】. 模型导入完成.如图 3-2
图3-2 导入 Adams
2.Adams 中动力学模型
在 Adams 中搭建动力学模型.在此之前应掌握 Adams 图形界面基本操作和工具栏的分布.模型需要用 cmd 脚本搭建,准确高效,所以要求能读懂简单的编程语言.本章节均用一些简单的命令语言来实现建模操作.这里的脚本编辑器使用的是 VScode,桌面新建.txt 英文命名后缀改为.cmd,用 VScode 打开编辑后保存即 可.也可用别的编程工具.
【主菜单】>【View】>【Command Window】打开命令窗口,每一步界面操作
的命令都会在命令窗口中滚动.可以复制出来修改后使用.
Cmd 脚本对拨弹部分建模流程如下:①修改 Bodies Name②布尔运算操作③定
义材料④添加约束⑤添加驱动⑥定义接触力(部分步骤的先后顺序可调)
① 基本设置
设置单位制(MKS)和重力方向(-Z)
!-------------setting----------------------!
default units length=meter mass=kg force=newton &
time=Second angle=degrees frequency=hz!units!
int dia disp dia=gravity_panel!打开对话框重力设置对话框!
force modify body gravitational gravity = ACCGRAV_1 &
x_comp = 0 &
y_comp = 0 &
z_comp = -9806.65 !-Z轴gravity!
!-----------------end------------------------!
②
修改
Bodies Name
在模型树中【
Bodies
】下可以查看各个实体
.
如果在
Solidworks
中是中文命名
,
导入后会重新命名
,
但是命名均有规律
.
现需要修改实体名字
,
方便查看和操作
.
图形界面操作按钮如图
5-3,
【模型树】
>
【
Bodies
】
>
【任意一组件右键】
>
【
Rename
】
图 3
-3 Rename
按钮
根据模型树中的信息
,
编写
modify_name
命令如下
,
!-------------modify_part_name---------------!
entity modify entity =_____1 new = driving_gear
entity modify entity =_17_1 new = _17_1_1
for variable_name=ip start_value=1 end_value=17 !for循环批量修改球的name,ip为变量名!
entity modify entity =(eval("_17_1_"//rtoi(ip))) new = (eval("ball_"//rtoi(ip)))
end
for variable_name=ip start_value=1 end_value=2
entity modify entity =(eval("___"//rtoi(ip))) new = (eval("bullet_tray_related_"//rtoi(ip)))
end
for variable_name=ip start_value=1 end_value=7
entity modify entity =(eval("_"//rtoi(ip))) new = (eval("main_track_related_"//rtoi(ip)))
end
!-------------------end----------------------!
通过【主菜单】>【File】>【import】导入.cmd 实现对模型的操作如图 3-4
图 5-4 .cmd 导入 Adams
操作前后的对比如图 5-5 和图 5-6
图
5-5 Bodies Name
修改前
图
5-6 Bodies Name
修改后
③
布尔运算操作
三维模型一般是面向制造的设计
,
布尔运算也是简化模型
,
不影响功能情况下
,
使
用布尔运算将多个零件合成一个
.
图形界面操作按钮如图 3
-7,
【功能区】
>
【
Bodies
】
>
【
Booleans
】
图3-7 图 5-7 Booleans 操作按钮
根据模型
,
编写
Booleans
命令操作如下
,
!-------------Booleans_parts-----------------!
part merge rigid_body part_name=bullet_tray_related_2 into_part=bullet_tray_related_1!将bullet_tray_related_2合并到bullet_tray_related_1!
for variable_name=ip start_value =2 end_value=7
part merge rigid_body part_name = (eval("main_track_related_"//rtoi(ip))) into_part = main_track_related_1
end
!-------------------end----------------------!
图 3-8 布尔合并前
图 3-9 布尔合并后
④
定义材料
图形界面操作按钮
,
【模型树】
>
【
Bodies
】
>
【任意一个构件右键】
>
【
Modify
】接下来的操作设置如图 3
-10
和图 3
-11
图 3
-10
新建材料
图 3
-11TPE
材料参数
三个材料参数
:
①密度
(Density)
②弹性模量
(Youngs Modulus)
③泊松比
(Poissons Ratio)
根据模型,编写 Modify_Material 命令操作如下,
!-------------modify_material-----------------!
material create & !新建材料TPE!
material_name = .materials.TPE &
density = 0.97e-6 &
youngs_modulus = 3400 &
poissons_ratio = 0.32
for variable_name=ip start_value=1 end_value=17!for循环批量修改!
part modify rigid mass_properties &
part_name = (eval("ball_"//rtoi(ip))) &
material_type = .materials.TPE
end
part modify rigid mass_properties &
part_name = driving_gear &
material_type = .materials.aluminum
part modify rigid mass_properties &
part_name = bullet_tray_related_1 &
material_type = .materials.aluminum
part modify rigid mass_properties &
part_name = main_track_related_1 &
material_type = .materials.aluminum
!-------------------end----------------------!
修改前后对比如图 3-12 和图 3-13
图 3
-12
新建材料
图 3
-13 TPE
材料参数
⑤
添加约束
在此模型中每个子弹都有
6
个自由度
,
不存在约束
,
剩余零部件都有自己的约束
方式
.
如图 3
-14
中
,wheel_loader
和
ground
之间有个旋转约束
,
其余零件和
ground
都是固定约束
图 3
-14
模型树中需要约束的零部件
图形界面操作按钮如图 3
-15
图3-15 Fixed(固定)和 Revolute(旋转)约束
·固定约束
(Fixed Joint)
根据模型
,
编写
Fixed_joint
命令操作如下
,
!---------------Fixed_Joint------------------!
marker create marker=.ground.MAR_fixed_1 & !在ground上创建一个marker点命名为MAR_fixed_1!
location=(LOC_RELATIVE_TO({0,0, 0},ground.cm)) & !MAR_fixed_1和点ground.cm位置重合!
orientation=0.0, 0.0, 0.0 !MAR_fixed_1和点ground.cm位置重合!
marker create marker=.main_track_related_1.MAR_fixed_1 & !在driving_gear上创建一个marker点命名为MAR_fixed_1!
location=(LOC_RELATIVE_TO({0,0, 0},ground.cm)) & !MAR_fixed_1和点ground.cm位置重合!
orientation=0.0, 0.0, 0.0 !MAR_fixed_1和点ground.cm位置重合!
constraint create joint Fixed & !在上述创建的两个marker间创建一个固定约束!
joint_name=fixed_2 & !Fixed约束的名称!
i_marker_name=.main_track_related_1.MAR_fixed_1 &
j_marker_name=.ground.MAR_fixed_1
!-------------------end----------------------!
创建
Fixed
后如图 3
-16
图 3
-16
固定约束的结果图
·旋转约束
(Revolute Joint)
需要在拨盘
(wheel_loader)
和
ground
之间添加旋转约束
根据模型
,
编写
Revolute_joint
命令操作如下
!-------------Revolute_Joint----------------!
variable create variable_name=wheel_name string_value="driving_gear" !定义变量"wheel_name",string_value代表字符串类型!
marker create marker=.ground.run_MAR_1 &
location=(LOC_RELATIVE_TO({0,0,0},(eval(wheel_name//".cm")))) &!
orientation=(ORI_RELATIVE_TO({0,0,0},(eval(wheel_name//".cm"))))
marker create marker=.driving_gear.run_MAR_2 &
location=(LOC_RELATIVE_TO({0,0,0},(eval(wheel_name//".cm")))) &
orientation=(ORI_RELATIVE_TO({0,0,0},(eval(wheel_name//".cm"))))
constraint create joint Revolute & !创建joint_Revolute!
joint_name=run_1 & !约束名称!
i_marker_name=.ground.run_MAR_1 &
j_marker_name=.driving_gear.run_MAR_2
variable modify variable_name=wheel_name &
string=bullet_tray_related_1
marker create marker=.ground.run_MAR_2 &
location=(LOC_RELATIVE_TO({0,0,0},(eval(wheel_name//".cm")))) &!
orientation=(ORI_RELATIVE_TO({0,0,0},(eval(wheel_name//".cm"))))
marker create marker=.bullet_tray_related_1.run_MAR_3 &
location=(LOC_RELATIVE_TO({0,0,0},(eval(wheel_name//".cm")))) &
orientation=(ORI_RELATIVE_TO({0,0,0},(eval(wheel_name//".cm"))))
constraint create joint Revolute & !创建joint_Revolute!
joint_name=run_2 & !约束名称!
i_marker_name=.ground.run_MAR_2 &
j_marker_name=.bullet_tray_related_1.run_MAR_3
variable delete variable_name=wheel_name !删除变量!
!-------------------end----------------------!
Adams
中建模命令均是对是通过对
Marker
点的操作来完成的
,
拿创建旋转副举
例
(
固定约束同理
),
分为三步
i.
创建一个坐标点
run_MAR_1,
该点在
ground
上
,
与
wheel_loader.cm
重合
.
ii.
创建另外一个坐标点
run_MAR_2,
该点在
wheel_loader
上
,
依旧与
wheel_loader.cm
重合
.
iii.
创建一个转动副
,
转动副名字为
.loader_2.run_1,
他是由于两个坐标点发生
相对转动构成的
,
这两个坐标点分是上述两步创建的坐标
.
注:创建
Marker
点时
orientation=(ORI_RELATIVE_TO({90,90,0},(eval(wheel_name//".cm"))))
是旋转命令,数字是绕
XYZ
周旋转的度数,如果初始
Marker
点的坐标角度需要旋转可以使用此命令。此外上述脚本开头定义了一个字符串变量 wheel_name
,在创建
Joint
中使用,
结尾删除。使用变量可以方便代码移植。
⑥
添加驱动
Adams
中驱动一般添加在旋转副或者移动副上
,
拨弹模块只需添加拨盘旋转
图形界面操作按钮如图 3-17
图3-17 Rotational Joint motion(旋转驱动)
根据模型
,
编写
Joint Motion
命令操作如下
!-------------Revolute_Joint----------------!
variable creat variable_name=MC_run_1 string_value="step(time,0.1,0,0.3,-360d)"!电机转速!
constraint create motion motion_name=.model_1.motion_1 &
joint=.model_1.run_1 & !motion添加在run_1上!
type=rotational & !类型是转动!
time_derivative=velocity & !驱动类型为velocity(速度)!
function=(eval(MC_run_1))
!-------------------end----------------------!
使用
step
函数定义驱动
(
代码中棕色部分
),step
函数应用含义举例如下:
STEP(
time
,
1
,
0d
,
2
,
20d
)
+STEP
(
time
,
6
,
0d
,
12
,
-40
)
意义:
1
秒到
2
秒:从
0
递增至
20d
;
2
秒到
6
秒:保持电机输出数值为
20d
不变;
6
秒到
12
秒:由
20d
递减
40d
,结果为
-20d
注:“
d
”是角度单位“度”
旋转约束和驱动添加之后的结果如图 3
-18
图 3
-18
添加旋转约束和驱动
⑦
定义接触力
在
Adams
中所有的碰撞接触的均应添加接触力
该模型中接触力的添加操作要稍微复杂
,
每个球都有
6
个自由度
,
所以每两个球
之间都要添加接触力
,
第四节中已经说明球之间需要添加
136
个接触力
,
需要使
用命令批量添加,准确高效
.
图形界面操作按钮如图 3
-19
【功能区】
>
【
Forces
】
>
【
Special Forces
】
>
【
Create a contact
】
图3-19 添加实体间接触力按钮
根据模型
,
编写
Create contact
命令操作如下
!------------create_contact_between_solids--------------!
variable create variable_name=MODEL_name string_value="model_1"!模型名称!
variable create variable_name=part_box string_value="CSG_4"!被接触对象!
variable create variable_name=add_1 integer_value=10 !子弹Body名称和SOLID名称的序号差!
variable create variable_name=MC_stiffness real_value=164 !刚度系数,计算公式参考stiffness.m!
variable create variable_name=MC_damping real_value=0.5 !阻尼系数!
variable create variable_name=MC_exponent real_value=2 !指数!
variable create variable_name=MC_dmax real_value=0.00005!最大实体入侵!
variable create variable_name=MC_mu_static real_value=0.7 !静摩擦系数!
variable create variable_name=MC_mu_dynamic real_value=0.65!动摩擦系数!
variable create variable_name=MC_sti_tra_vel real_value=0.1!静摩擦过渡速度!
variable create variable_name=MC_fri_tra_vel real_value=10 !动摩擦过渡速度!
!---------------bullet_tray_related_1-------------!
variable modify variable_name=part_box &
string=SOLID3 !修改part_box为bullet_tray_related_1的Solid!
variable modify variable_name=MC_stiffness real_value=164
variable modify variable_name=MC_damping real_value=5e4
variable modify variable_name=MC_exponent real_value=1.5
variable modify variable_name=MC_dmax real_value=0.01
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent)) &
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
variable modify variable_name=part_box &
string=SOLID7
variable modify variable_name=MC_stiffness real_value=164
variable modify variable_name=MC_damping real_value=5e4
variable modify variable_name=MC_exponent real_value=1.5
variable modify variable_name=MC_dmax real_value=0.01
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent)) &
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
!---------------main_track_related_1-------------!
variable modify variable_name=part_box &
string=SOLID1
variable modify variable_name=MC_stiffness real_value=4.4e8
variable modify variable_name=MC_damping real_value=5e4
variable modify variable_name=MC_exponent real_value=1.3
variable modify variable_name=MC_dmax real_value=0.01
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent)) &
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
variable modify variable_name=part_box &
string=SOLID2
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent))&
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
variable modify variable_name=part_box &
string=SOLID5
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent))&
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
variable modify variable_name=part_box &
string=SOLID6
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent))&
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
variable modify variable_name=part_box &
string=SOLID8
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent))&
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
variable modify variable_name=part_box &
string=SOLID10
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent))&
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
variable modify variable_name=part_box &
string=SOLID28
for variable_name=ipp start_value=1 end_value=17
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_"//rtoi(ipp+add_1)//"_"//(eval(part_box)))) &
i_geometry_name = (eval("SOLID"//rtoi(ipp+add_1))) &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent))&
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
!---------------driving_gear-------------!
variable modify variable_name=part_box &
string=SOLID4
variable modify variable_name=MC_stiffness real_value=35000
variable modify variable_name=MC_damping real_value=28
variable modify variable_name=MC_exponent real_value=1.5
variable modify variable_name=MC_dmax real_value=0.01
variable modify variable_name=MC_mu_static real_value=0.25 !静摩擦系数!
variable modify variable_name=MC_mu_dynamic real_value=0.2!动摩擦系数!
contact create &
contact_name = .(eval(MODEL_name)).(eval("con_SOLID7"//"_"//(eval(part_box)))) &
i_geometry_name = SOLID7 &
j_geometry_name = (eval(part_box)) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent)) &
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
end
!---------------contact_between_balls-------------------!
variable modify variable_name=MC_stiffness real_value=164
variable modify variable_name=MC_damping real_value=2e4
variable modify variable_name=MC_exponent real_value=2
variable modify variable_name=MC_dmax real_value=0.1
variable modify variable_name=MC_mu_static real_value=0.35 !静摩擦系数!
variable modify variable_name=MC_mu_dynamic real_value=0.3!动摩擦系数!
!---------------------------------------!
variable create variable_name=ipp integer_value=1
variable create variable_name=a integer_value=1!第一颗子弹的序号!
variable create variable_name=b integer_value=17!最后一颗子弹的序号!
variable create variable_name=add_2 integer_value=1
for variable_name=num_1 start_value=(eval(a)) end_value=(eval(b-1))!两个for循环,依次添加子弹之间的各约束!
for variable_name=num_2 start_value=(eval(a)) end_value=(eval(b-ipp))
contact create &
contact_name =.(eval(MODEL_name)).(eval("con_"//rtoi(num_1)//"_"//rtoi(num_1+add_2))) &
i_geometry_name = (eval("SOLID"//rtoi(num_1+add_1))) &
j_geometry_name = (eval("SOLID"//rtoi(num_1+add_1+add_2))) &
stiffness = (eval(MC_stiffness)) &
damping =(eval(MC_damping)) &
exponent =(eval(MC_exponent))&
dmax =(eval(MC_dmax)) &
coulomb_friction = on &
mu_static =(eval(MC_mu_static)) &
mu_dynamic =(eval(MC_mu_dynamic)) &
stiction_transition_velocity =(MC_sti_tra_vel) &
friction_transition_velocity =(MC_fri_tra_vel)
variable modify variable_name=add_2 integer_value=(eval(add_2+1))
end
variable modify variable_name=ipp integer_value=(eval(ipp+1))
variable modify variable_name=add_2 integer_value=1
end
variable delete variable_name=ipp
variable delete variable_name=a
variable delete variable_name=b
variable delete variable_name=MODEL_name
variable delete variable_name=part_box
variable delete variable_name=add_1
variable delete variable_name=add_2
!-----------------------end------------------------------!
stiffness
标准值是在
1.0*e7~1.0*e9(N/m)
之间,阻尼系数一般取
stiffness
的
0.01%
材料参数表3-1
材料密度(kg/m³)弹性模量(GPa)泊松比TPE9703.40.32铝合金2700700.34纲78002070.27
⑧
模型自检
通过模型自检可以发现建模过程中的错误,
Adams
会自动检查一些错误,如
未连接的约束、动力系统中无质量的部件、无约束的部件等,并给出警告可能
引发的问题。
(1)
在
Adams
窗体右下角,右键单击
Information(
信息
)
按钮
(2)
在弹出的级联坐标中选择
Verification
图标 ,弹出信息窗口如图 3
-20
,一
共有
17
颗子弹,每颗
6
个自由度,拨弹轮旋转的一个自由度由驱动限制
(
驱动
的本质也是限制自由度
)
,共计
102
个自由度。
图3-20 Information of model
(3)
模型验证完毕,关闭窗口
.
⑨
设置仿真时长和步长开始仿真
本模型中有
17
个子弹
,200
个接触
,
如果
40
个子弹
,
各部分接触达到
1000
个
.
仿
真时长取决于具体物理场景,仿真步长取决于模型复杂度,步长越小,计算结
果越容易收敛,模型越精确,步长过大结果发散后就会报错。但是步长过小计
算就变慢,所以合适的步长有利于模型仿真计算。
本案例步长给
0.0005~0.001
比较合适
,
时长给
2s
即可说明问题如图 3
-21
。
图3-21 仿真细节参数
⑩
查看仿真结果输出物理量曲线或者动画
,
细化模型参数
,
模型正确即可指导方
案迭代
3.后处理模块 Postprocessor
后处理模块将样机的虚拟数据输出成曲线或者生成直观的动画来查看
.
后处理数据需要在模型中调用,采用
measure
命令即可调取其中的参数,本例
中关心拨弹电机的扭矩是否符合使用工况,故在【模型树】
>
【
motions
】
>
【右
键
motion_1
】
>
【
measure
】按照如图 3
-23
设置
>
【
apply
】
图3-23 Measure 按钮
输出的扭矩图如 3
-24
图3-24 拨弹电机扭矩曲线
输出的转速(对比)图如 3
-25
3-25 拨弹电机转速曲线
另外可以通【功能区】
>
【
Results
】
>
【
Postprocessor
】进入后处理模块【空白
页右键】
>
【
Load Animation
】进行动画输出如图 3
-26
,红色框中是播放暂停好
和录制按钮
图3-26 录制动画
4.Adams提供子系统与Matlab完成联合仿真
|