Ansys ACT案例----挖掘机斗杆、动臂、铲斗工作分析案例

Part11. Ansys Mixed Wizard简介

  1. 在ANSYS Workbench项目标签页和一个或多个支持脚本功能的目标应用程序中执行;
  2. 混合向导在Project标签页和目标应用程序中都提供了仿真向导,支持在目标应用中进行界面交互。
  3. 结合了项目向导和目标应用向导的功能,提供全流程的仿真流程的封装与定制。向导可用于启动和控制不同的目标应用程序 向导可能以混合向导(在此过程中使用不同的应用程序)或简单向导(一个唯一的目标应用程序)的形式出现 如果可能,向导可用于WorkBnech平台和独立应用程序 仅Workbench应用环境下:
  • DesignModeler
  • Mechanical Workbench和独立应用程序:
  • SpaceClaim
  • Fluent、Fluent Meshing
  • Electronics Desktop

Part2挖掘机斗杆、动臂、铲斗工作分析案例

1创建项目

在Project界面创建仿真分析流程,设置流程名称、分析材料。
首先通过XML文件定义界面,定义界面所使用的语法并不复杂,都是常用的几种,在以前写的文章Ansys向导简介中都有详细介绍,此处不再多赘述。Ansys ACT案例----挖掘机斗杆、动臂、铲斗工作分析案例的图1XML文件定义界面如下所示:

  <wizard name="ExcavatorWizard" caption="Excavator Simulation" version="1" context="Project" icon="ExcavatorAutomation.png">
    <step name="projectStep" version="0" caption="创建项目" HelpFile="help/projectStep.html" Layout="ProjectLayout@ExcavatorAutomation">
      <property control="text" name="projectName" caption="项目名称" persistent="False" parameterizable="False" />
      <propertygroup name="grpBararmMat" caption="斗杆动臂材料定义" persistent="False" parameterizable="False">
        <property control="text" name="matBararmName" caption="材料名称" persistent="False" parameterizable="False" default="15MnV钢" />
        <property control="float" name="matBararmDensity" caption="密度(kg/m^3):" persistent="False" parameterizable="False" default="7850" />
        <property control="float" name="matBararmYoung" caption="杨氏模量(Mpa):" persistent="False" parameterizable="False" default="206000" />
        <property control="float" name="matBararmPoi" caption="泊松比" persistent="False" parameterizable="False" default="0.3" />
        <property control="float" name="matBararmTensileY" caption="屈服强度(Mpa):" persistent="False" parameterizable="False" default="540" />
      </propertygroup>
      <propertygroup name="grpBucketMat" caption="铲斗材料定义" persistent="False" parameterizable="False">
        <property control="text" name="matBucketName" caption="材料名称" persistent="False" parameterizable="False" default="HQ100" />
        <property control="float" name="matBucketDensity" caption="密度(kg/m^3):" persistent="False" parameterizable="False" default="7850" />
        <property control="float" name="matBucketYoung" caption="杨氏模量(Mpa):" persistent="False" parameterizable="False" default="206000" />
        <property control="float" name="matBucketPoi" caption="泊松比" persistent="False" parameterizable="False" default="0.3" />
        <property control="float" name="matBucketTensileY" caption="屈服强度(Mpa):" persistent="False" parameterizable="False" default="900" />
      </propertygroup>
      <callbacks>
        <onupdate>onupdateStep</onupdate>
      </callbacks>
      <description>定义项目名称及材料属性</description>
    </step>

定义完XML界面后,编写对应的回调函数 onupdateStep,实现创建分析流程和创建材料的功能,主要用到Workbench Project界面脚本脚本,这些脚本完全可以通过录制的方式实现,只需要将录制完成的脚本中数据参数化,使用XML界面对应的数据即可完成。

def onupdateStep(step):
    global mechSys
    mechSys = GetTemplate(TemplateName="Static Structural", Solver="ANSYS").CreateSystem()
    engData = mechSys.GetContainer(ComponentName="Engineering Data")
    projectName = step.Properties["projectName"].Value
    mechSys.DisplayText = projectName
    def CreateMaterial(name, density, young, poiRation,tensileY):
        mat = engData.CreateMaterial(Name=name)
        mat.CreateProperty(Name="Density").SetData(Variables=["Density"],Values=[["%s [kg m^-3]" % density]])
        mat.CreateProperty(Name="Elasticity", Behavior="Isotropic").SetData(Variables=["Young's Modulus"], Values=[["%s [MPa]"%young]])
        mat.GetProperty(Name="Elasticity").SetData(Variables=["Poisson's Ratio"], Values=[["%s"%poiRation]])
        mat.CreateProperty(Name="Tensile Yield Strength").SetData(Variables=["Tensile Yield Strength"], Values=[["%s [MPa]"%tensileY]])
    matBararmName = step.Properties["grpBararmMat/matBararmName"].Value
    matBararmDensity = step.Properties["grpBararmMat/matBararmDensity"].Value
    matBararmYoung = step.Properties["grpBararmMat/matBararmYoung"].Value
    matBararmPoi = step.Properties["grpBararmMat/matBararmPoi"].Value
    matBararmTensileY = step.Properties["grpBararmMat/matBararmTensileY"].Value 
    matBucketName = step.Properties["grpBucketMat/matBucketName"].Value
    matBucketDensity = step.Properties["grpBucketMat/matBucketDensity"].Value
    matBucketYoung = step.Properties["grpBucketMat/matBucketYoung"].Value
    matBucketPoi = step.Properties["grpBucketMat/matBucketPoi"].Value
    matBucketTensileY = step.Properties["grpBucketMat/matBucketTensileY"].Value 
    CreateMaterial(matBararmName, matBararmDensity, matBararmYoung, matBararmPoi, matBararmTensileY)
    CreateMaterial(matBucketName, matBucketDensity, matBucketYoung, matBucketPoi, matBucketTensileY)
    ExtAPI.ExtensionManager.CurrentExtension.Attributes["matInfo"] = [matBararmName, matBucketName]  

2创建模型

  • 几何建模:在Project界面设置模型尺寸,根据界面参数自动在SpaceClaim中创建模型,并创建加载边界、约束边界的命名集合。 Ansys ACT案例----挖掘机斗杆、动臂、铲斗工作分析案例的图2XML文件定义界面如下所示:
 <step name="geoStep" version="1" caption="几何建模" HelpFile="help/geoStep.html" Layout="ProjectLayout@ExcavatorAutomation" >
      <propertygroup name="grpPoleParams" caption="斗杆参数定义" persistent="False" parameterizable="False">
        <property control="float" name="polelength" caption="斗杆长(mm):" persistent="False" parameterizable="False" default="12000" />
        <property control="float" name="polewidth" caption="斗杆宽(mm):" persistent="False" parameterizable="False" default="900" />
        <property control="float" name="polethick" caption="斗杆厚(mm):" persistent="False" parameterizable="False" default="600" />
        <property control="float" name="polecorner" caption="斗杆圆角(mm):" persistent="False" parameterizable="False" default="192" />
        <property control="float" name="polediscenter" caption="斗杆中心距(mm):" persistent="False" parameterizable="False" default="2030" />
        <property control="float" name="poleshell" caption="斗杆厚度(mm):" persistent="False" parameterizable="False" default="-20" />
      </propertygroup>
      <propertygroup name="grpHandleParams" caption="斗柄参数定义" persistent="False" parameterizable="False">
        <property control="float" name="handlejupcorner" caption="斗柄上圆角(mm):" persistent="False" parameterizable="False" default="305" />
        <property control="float" name="handledowncorner" caption="斗柄下圆角(mm):" persistent="False" parameterizable="False" default="216" />
      </propertygroup>
      <propertygroup name="grpConrodParams" caption="连杆参数定义" persistent="False" parameterizable="False">
        <property control="float" name="conrodangle1" caption="连杆草图角度1:" persistent="False" parameterizable="False" default="45" />
        <property control="float" name="conrodangle2" caption="连杆草图角度2:" persistent="False" parameterizable="False" default="30" />
        <property control="float" name="conrodlength" caption="连杆长(mm):" persistent="False" parameterizable="False" default="550" />
      </propertygroup>
      <propertygroup name="grpBucketParams" caption="铲斗参数化定义" persistent="False" parameterizable="False">
        <property control="float" name="bucketlength" caption="铲斗长(mm):" persistent="False" parameterizable="False" default="2000" />
        <property control="float" name="bucketwidth" caption="铲斗宽(mm):" persistent="False" parameterizable="False" default="2000" />
        <property control="float" name="bucketheight" caption="铲斗高(mm):" persistent="False" parameterizable="False" default="3000" />
        <property control="float" name="bucketthick" caption="铲斗厚(mm):" persistent="False" parameterizable="False" default="100" />
        <property control="float" name="bucketAcircle" caption="铲斗铰接圆(mm):" persistent="False" parameterizable="False" default="190" />
        <property control="float" name="liftlugcircle" caption="吊耳圆(mm):" persistent="False" parameterizable="False" default="300" />
        <property control="float" name="toothlength" caption="斗齿长(mm):" persistent="False" parameterizable="False" default="300" />
        <property control="float" name="toothwidth" caption="斗齿宽(mm):" persistent="False" parameterizable="False" default="16" />
        <property control="float" name="toothheight" caption="斗齿高(mm):" persistent="False" parameterizable="False" default="350" />
        <property control="float" name="toothobliquelength" caption="斗齿斜边长(mm):" persistent="False" parameterizable="False" default="325" />
      </propertygroup>
      <propertygroup name="grpMovarmParams" caption="动臂参数化定义" persistent="False" parameterizable="False">
        <property control="float" name="Movarmlength" caption="动臂长(mm):" persistent="False" parameterizable="False" default="15000" />
        <property control="float" name="Movarmwidth" caption="动臂宽(mm):" persistent="False" parameterizable="False" default="1600" />
        <property control="float" name="Movarmdowncircle" caption="动臂下圆(mm):" persistent="False" parameterizable="False" default="547" />
        <property control="float" name="Movarmupcircle" caption="动臂上圆(mm):" persistent="False" parameterizable="False" default="200" />
        <property control="float" name="Movarmdownhole" caption="动臂支踵孔(mm):" persistent="False" parameterizable="False" default="150" />
        <property control="float" name="Movarmshell" caption="动臂厚度(mm):" persistent="False" parameterizable="False" default="-20" />
        <property control="float" name="Movarmlug" caption="动臂吊耳(mm):" persistent="False" parameterizable="False" default="150" />
      </propertygroup>
      <propertygroup name="grpBushhandleParams" caption="轴套扶柄参数化定义" persistent="False" parameterizable="False">
        <property control="float" name="Tuiyacir" caption="轴套扶柄外圆(mm):" persistent="False" parameterizable="False" default="250" />
        <property control="float" name="tuiyacir" caption="轴套扶柄内圆(mm):" persistent="False" parameterizable="False" default="150" />
      </propertygroup>
      <propertygroup name="grpAssembleParams" caption="装配体设置参数化定义" persistent="False" parameterizable="False">
        <property control="float" name="MovingDistance" caption="移动距离(mm):" persistent="False" parameterizable="False" default="3497.97" />
        <property control="float" name="Angleofrotation" caption="旋转角度:" persistent="False" parameterizable="False" default="-45" unit="" />
      </propertygroup>
      <property control="boolean" name="Movarm" caption="抑制动臂" persistent="False" parameterizable="False" default="false" />
      <property control="boolean" name="polebucket" caption="抑制斗杆铲斗" persistent="False" parameterizable="False" default="false" />
      <callbacks>
        <onupdate>onupdateGeoStep</onupdate>
      </callbacks>
      <description>创建参数化工作装置模型</description>
    </step>
  • 创建模型回调函数 onupdateStep,主要用到SpaceClaim脚本创建参数化模型,SpaceCliam同样支持脚本录制,只需要将录制完成的脚本中数据参数化,使用XML界面对应的数据即可完成。创建模型脚本比较多,此处只做部分展示。
# Set Sketch Plane
ViewHelper.SetSketchPlane(Plane.PlaneXY)
# 斗杆
SketchLine.Create(Point2D.Origin,Point2D.Create(MM(polelength),-MM(0)))
SketchLine.Create(Point2D.Create(MM(polelength),-MM(0)),
Point2D.Create(MM(polelength),-MM(polewidth)))
SketchLine.Create(Point2D.Create(MM(polelength),-MM(polewidth)),
Point2D.Create(-MM(0),-MM(polewidth)))
SketchLine.Create(Point2D.Create(-MM(0),-MM(polewidth)),Point2D.Origin)
cirRes=ViewHelper.SetViewMode(InteractionMode.Solid)
cirSel=Selection.Create(cirRes.CreatedBodies[0].Faces)
ExtrudeFaces.Execute(cirSel,Direction.DirZ,MM(polethick),ExtrudeFaceOptions())

ViewHelper.SetSketchPlane(Plane.PlaneZX)
endthick=0.41*polewidth
endlength=0.7*polelength
endlength1=0.074*polelength
ske1=polethick-endthick
ske2=math.tan(endangle1)
ske3=math.tan(endangle2)

SketchLine.Create(Point2D.Create(MM(endthick),MM(0)),Point2D.Create(MM(endthick),MM(endlength)))
SketchLine.Create(Point2D.Create(MM(endthick),MM(endlength)),Point2D.Create(MM(polethick),MM(endlength+(ske1)/ske2)))

SketchLine.Create(Point2D.Create(MM(polethick),MM(endlength+ske1/ske2+endlength1)),
Point2D.Create(MM(endthick),MM(ske1/ske3+endlength+ske1/ske2+endlength1)))
SketchLine.Create(Point2D.Create(MM(endthick),MM(ske1/ske3+endlength+ske1/ske2+endlength1)),
Point2D.Create(MM(endthick),MM(polelength)))

SketchLine.Create(Point2D.Create(MM(polethick),MM(0)),Point2D.Create(MM(polethick),MM(endlength+ske1/ske2)))
SketchLine.Create(Point2D.Create(MM(polethick),MM(endlength+ske1/ske2+endlength1)),Point2D.Create(MM(polethick),MM(polelength)))
SketchLine.Create(Point2D.Create(MM(endthick),MM(0)),Point2D.Create(MM(polethick),MM(0)))
SketchLine.Create(Point2D.Create(MM(endthick),MM(polelength)),Point2D.Create(MM(polethick),MM(polelength)))

if GetRootPart().Bodies.Count==1:
    Fill.Execute(Selection.Create(GetRootPart().Curves))
    Delete.Execute(Selection.Create(GetRootPart().Curves))
polyFaceSel=Selection.Create(GetRootPart().Bodies[1].Faces)

ExtrudeFaces.Execute(polyFaceSel,-Direction.DirY,MM(polewidth),ExtrudeFaceOptions(ExtrudeType=ExtrudeType.Cut))
ViewHelper.SetViewMode(InteractionMode.Solid,None)
roundSel1=[edge for edge in GetRootPart().GetDescendants[IDesignEdge]()
if edge.Shape.Length==MM(polewidth)and edge.EvalMid().Point.X==MM(0) ]
roundSel=Selection.Create(roundSel1)
ConstantRound.Execute(roundSel,MM(polecorner),ConstantRoundOptions(),None)
roundSel2=[edge for edge in GetRootPart().GetDescendants[IDesignEdge]()
if edge.Shape.Length==MM(endthick)and edge.EvalMid().Point.X==MM(polelength) ]
roundSel=Selection.Create(roundSel2)
ConstantRound.Execute(roundSel,MM(handlejupcorner),ConstantRoundOptions(),None)

3选择工况

在分析流程中共有五种工况,包含两种动臂工况,一种斗杆工况,两种铲斗工况,在这个案例中,一次只能分析一种工况,需要用户在界面选择。Ansys ACT案例----挖掘机斗杆、动臂、铲斗工作分析案例的图3

    <step name="ChooseStep" version="1" caption="选择工况" HelpFile="help/geoStep.html" Layout="ProjectLayout@ExcavatorAutomation" >
      <property control="select" name="Operating mode selection" caption="工作工况选择" persistent="False" parameterizable="False" default="请选择工况...">
        <attributes options="请选择工况...,MovarmsoluStep1,MovarmsoluStep2,polesoluStep,bucketsoluStep1,bucketsoluStep2" />
        <callbacks>
          <onvalidate>OnSelectContext</onvalidate>
        </callbacks>
      </property>
   <callbacks>
        <onupdate>onupdateChooseStep1</onupdate>
      </callbacks>
    </step>
  • 通过下拉框选择工况,对应的回调函数是 OnSelectContext,此处需要根据界面选择,跳跃到对应的 Step中,实现方法如下:
def OnSelectContext(step, prop):
    MovarmsoluStep1=step.NextStep
    MovarmsoluStep2=MovarmsoluStep1.NextStep
    polesoluStep=MovarmsoluStep2.NextStep
    bucketsoluStep1=polesoluStep.NextStep
    bucketsoluStep2=bucketsoluStep1.NextStep
    firstStep = step.NextStep
    if prop.Value == "MovarmsoluStep1":
        MovarmsoluStep1.IsEnabled = True
        MovarmsoluStep2.IsEnabled = False
        polesoluStep.IsEnabled = False
        bucketsoluStep1.IsEnabled = False
        bucketsoluStep2.IsEnabled = False
    if prop.Value == "MovarmsoluStep2":
        MovarmsoluStep1.IsEnabled = False
        MovarmsoluStep2.IsEnabled = True
        polesoluStep.IsEnabled = False
        bucketsoluStep1.IsEnabled = False
        bucketsoluStep2.IsEnabled = False
    if prop.Value == "polesoluStep":
        MovarmsoluStep1.IsEnabled = False
        MovarmsoluStep2.IsEnabled = False
        polesoluStep.IsEnabled = True
        bucketsoluStep1.IsEnabled = False
        bucketsoluStep2.IsEnabled = False
    if prop.Value == "bucketsoluStep1":
        MovarmsoluStep1.IsEnabled = False
        MovarmsoluStep2.IsEnabled = False
        polesoluStep.IsEnabled = False
        bucketsoluStep1.IsEnabled = True
        bucketsoluStep2.IsEnabled = False
    if prop.Value == "bucketsoluStep2":
        MovarmsoluStep1.IsEnabled = False
        MovarmsoluStep2.IsEnabled = False
        polesoluStep.IsEnabled = False
        bucketsoluStep1.IsEnabled = False
        bucketsoluStep2.IsEnabled = True
    elif prop.Value == "请选择工况...":
        MovarmsoluStep1.IsEnabled = False
        MovarmsoluStep2.IsEnabled = False
        polesoluStep.IsEnabled = False
        bucketsoluStep1.IsEnabled = False
        bucketsoluStep2.IsEnabled = False
    panel = step.UserInterface.Panel.GetComponent("Steps")
    panel.UpdateData()
    panel.Refresh()

4分析工况

分析中共包含5种工况,XML与回调函数都是类似的,此处以动臂工况一作为示例,XML界面如下:

<step name="MovarmsoluStep1" version="1" caption="动臂工况一分析设置" HelpFile="help/动臂工况一分析设置.html" Layout="ProjectLayout@ExcavatorAutomation">
      <propertygroup name="grpMeshParams" caption="网格参数" persistent="False" parameterizable="False">
        <property control="select" name="meshType" caption="网格划分方法" persistent="False" parameterizable="False" default="Tetrahedrons">
          <attributes options="Automatic,Tetrahedrons,Hex Dominant" />
        </property>
        <property control="integer" name="meshSize" caption="网格单元尺寸(mm):" persistent="False" parameterizable="False" default="50" />
      </propertygroup>
      <propertygroup name="grpLoadParams" caption="约束及载荷定义" persistent="False" parameterizable="False">
        <property control="float" name="ARM Lift" caption="动臂提升力(N):" persistent="False" parameterizable="False" default="-1110000" />
        <property control="float" name="ARM Reel-Tension" caption="动臂提升卷筒拉力(N):" persistent="False" parameterizable="False" default="-1310000" />
        <property control="float" name="ARM Push-pressure" caption="动臂推压力(N):" persistent="False" parameterizable="False" default="-541000" />
        <property control="float" name="ARM wirerope-Tension" caption="动臂变幅钢绳拉力(N):" persistent="False" parameterizable="False" default="-1016000" />
      </propertygroup>
      <property control="boolean" name="earthLoadState" caption="是否考虑自重" persistent="False" parameterizable="False" default="true" />
      <callbacks>
        <onupdate>onupdateSolutionStep</onupdate>
      </callbacks>
      <description>网格、约束及载荷参数设置</description>
    </step>
  • 工况一的回调函数为 onupdateSolutionStep,主要用到Mechanical脚本,Mechanical不支持脚本录制,需要用户手动编写,脚本编写非常容易上手,此处展示部分内容。 Ansys ACT案例----挖掘机斗杆、动臂、铲斗工作分析案例的图4
def CreateLoadMovarmsoluStep1(matInfo,meshType,meshSize,ARM_Lift,ARM_Reel_Tension,ARM_Push_pressure,ARM_wirerope_Tension,earthLoadState):
    with Transaction():
        MaterialAssignByNsName("Mn",matInfo)
        #网格控制
        mesh =Model.Mesh
        mesh.ElementSize = Quantity("%s [mm]"% meshSize)
        if meshType=="Automatic":
            pass
        if meshType=="Tetrahedrons":
            mat=Model.Mesh.AddAutomaticMethod()
            mat.Location =GetNsObjByName("AllBodies")
            mat.Method =MethodType.AllTriAllTet
        if meshType=="Hex Dominant":
            mat=Model.Mesh.AddAutomaticMethod()
            mat.Location =GetNsObjByName("AllBodies")
            mat.Method =MethodType.HexDominant
        mat=Model.Mesh.AddSizing()
        mat.Location =GetNsObjByName("AllBodies")
        mat.ElementSize =Quantity("%s [mm]"% meshSize)
        mesh.GenerateMesh()
        #施加约束载荷
        analysis = Model.Analyses[0]
        #添加动臂固定约束
        fixSup =analysis.AddFixedSupport()
        fixSup.Location =GetNsObjByName("DBFixedSurface")
        #添加自重载荷
        if earthLoadState==True:
            stdEarthGravity = analysis.AddEarthGravity()
            stdEarthGravity.Direction=GravityOrientationType.NegativeYAxis
未完......

5操作演示如下:

Ansys ACT案例----挖掘机斗杆、动臂、铲斗工作分析案例的图5

以上就是本期内容,关注微信公众号,有技术问题或项目合作可以直接在微信公众号后台留言。Ansys ACT案例----挖掘机斗杆、动臂、铲斗工作分析案例的图6

(2条)
默认 最新
感谢分享
评论 点赞
感谢
评论 点赞
点赞 3 评论 2 收藏 2
关注