Ansys ACT案例----挖掘機斗桿、動臂、鏟斗工作分析案例
瀏覽:3296 評論:2 收藏:3
Part11. Ansys Mixed Wizard簡介
-
在ANSYS Workbench項目標簽頁和一個或多個支持腳本功能的目標應用程序中執行; -
混合向導在Project標簽頁和目標應用程序中都提供了仿真向導,支持在目標應用中進行界面交互。 -
結合了項目向導和目標應用向導的功能,提供全流程的仿真流程的封裝與定制。向導可用于啟動和控制不同的目標應用程序 向導可能以混合向導(在此過程中使用不同的應用程序)或簡單向導(一個唯一的目標應用程序)的形式出現 如果可能,向導可用于WorkBnech平臺和獨立應用程序 僅Workbench應用環境下:
-
DesignModeler -
Mechanical Workbench和獨立應用程序: -
SpaceClaim -
Fluent、Fluent Meshing -
Electronics Desktop
Part2挖掘機斗桿、動臂、鏟斗工作分析案例
1創建項目
在Project界面創建仿真分析流程,設置流程名稱、分析材料。
首先通過XML文件定義界面,定義界面所使用的語法并不復雜,都是常用的幾種,在以前寫的文章Ansys向導簡介中都有詳細介紹,此處不再多贅述。XML文件定義界面如下所示:
<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中創建模型,并創建加載邊界、約束邊界的命名集合。 XML文件定義界面如下所示:
<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選擇工況
在分析流程中共有五種工況,包含兩種動臂工況,一種斗桿工況,兩種鏟斗工況,在這個案例中,一次只能分析一種工況,需要用戶在界面選擇。
<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不支持腳本錄制,需要用戶手動編寫,腳本編寫非常容易上手,此處展示部分內容。
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操作演示如下:
以上就是本期內容,關注微信公眾號,有技術問題或項目合作可以直接在微信公眾號后臺留言。
技術鄰APP
工程師必備
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
3
2
3




















