.jpeg)
特种和道路施工设备分销商的设计
在这个例子中,我们将考虑挖掘机截面分配器的设计,即阀芯对(阀芯和套筒)的几何形状。 想象一下,在测试期间,电流分配器不处理来自液压操纵杆的控制信号-有一个区域,当操纵杆偏转到最大时,没有达到工作体液压缸延伸的所需速度。 调整和脱落受到在阀芯皮带上铣削的槽(槽)的几何形状的很大影响。 为了纠正这种情况,设计师开发了一种新的槽几何形状,并在AnyMath中应用了建模,以便对分布器部分的溢出进行虚拟实验。 图中示出了带有凹槽的阀芯的一个例子。
.jpg)
打开模型
include("geometry_core.jl")
include("parameters_exporter.jl")
modelName = "DCV_HCD"
if !(modelName in [m.name for m in engee.get_all_models()])
engee.load("$(@__DIR__)/$(modelName).engee");
end
对液压控制的阀芯分配器进行了建模。 为了简化浇注程序,研究了液压缸的延伸,涉及分配器通道P-A和B-T。 从0到30bar(过量)的压力控制信号施加到阀芯的右端,分配器向左移位,压缩复位弹簧并打开相应的通道。 恒定流量源,1000l/min,连接到分配器的P通道。 在溢出期间,在分配器的端口A(与气缸的活塞腔的连接端口)中检查流量,具体取决于阀芯的运动。
.png)
沟槽参数化
凹槽的复杂形状是使用几个区域设置的。 用户参数化每个区域的几何参数,并设置一个皮带上的凹槽数量。
在一个皮带上有几种不同类型的槽(例如,2个有一个几何形状,2个有另一个几何形状)的情况下,要对这条皮带进行建模,两个几何参数相同的皮带块(皮带和颈部的直径,但槽的大小不同)平行连接,每个块中的槽的数量将是两个。 每个人都有。 为了从功率计算中排除阀芯重复端部的影响(考虑到液体的影响),放置了适当的标志,用于禁用复合带的其中一个表面的功率计算。
有5种类型的区域几何(请参阅文档带缺口的线轴边缘(IL))。
参数化的解释在下面的假脱机参数化代码中给出。
设置线轴皮带的参数
升级几何体
让我们比较2组在凹槽配置中彼此不同的参数-第一个选项是升级的,第二个是原始的。
# ==============================================================================
# 模型中任意数量的阀芯槽块的参数化
# ==============================================================================
# 所有类型表单的通用区域结构参数赋值字典:
#
# 参数顺序:(shape,length,radial_depth_start,radial_depth_end,width_start,width_end,r_edge)
#
# 1. shape="circular"(分配槽死端的圆形喷口)
# -长度:圆形喷口的物理轴向长度(ΔZ),mm
# -radial_depth_start:该段铣刀的恒定径向切削深度(hRmin),mm
# -radial_depth_end:未使用(重复radial_depth_start值以保持连续性)
# -width_start:轮廓的初始宽度(在死端极值点始终等于0.0),mm
# -width_end:喷嘴圆弧平滑延伸到的最终圆周宽度,mm
# -r_edge:不用于这种类型的形式(总是等于0.0)
#
# 2. shape="triangular"(三角形/V形控制区域)
# -长度:圆锥开口段的轴向长度(ΔZ),mm
# -radial_depth_start:整个截面的恒定径向切削深度(hRmin),mm
# -radial_depth_end:未使用(重复radial_depth_start值)
# -width_start:区域左边界凹槽的初始圆周宽度,mm
# -width_end:区域右边界的最终圆周宽度(定义开口角),mm
# -r_edge:不用于这种类型的形式(总是等于0.0)
#
# 3. shape="rectangular"(具有倾斜底部可能性的矩形工作区域)
# -长度:截面的物理轴向长度(ΔZ),mm
# -radial_depth_start:区域左边缘的径向深度(底部斜坡的初始水平),mm
# -radial_depth_end:区域右边缘的径向深度(楔形的最终凹陷水平),mm
# -width_start:槽的恒定圆周宽度(width_start必须严格等于width_end),mm
# -width_end:槽的恒定圆周宽度(width_start必须严格等于width_end),mm
# -r_edge:不用于这种类型的形式(总是等于0.0)
#
# 4. 形状="梯形"(经典的梯形截面与锋利的侧边)
# -长度:颊部线性扩张段的轴向长度(ΔZ),mm
# -radial_depth_start:整个截面的恒定径向切削深度(hRmin),mm
# -radial_depth_end:未使用(重复radial_depth_start值)
# -width_start:区域左交界处轮廓的初始圆周宽度,mm
# -width_end:区域右出口处的最终圆周宽度(最大锥套),mm
# -r_edge:不用于这种类型的形式(总是等于0.0)
#
# 5. shape="trapezoidal_rounded"(由铣刀的成形圆形成的梯形截面)
# -长度:沿Z轴的区域的轴向长度(lengthtrapr1),mm
# -radial_depth_start:区域的恒定深度(hRmin1),mm
# -radial_depth_end:复制radial_depth_start值以确保连续性
# -width_start:阀芯边缘处的初始圆周宽度(inwidthr1),mm
# -width_end:与下一个区域交界处的最终圆周宽度(endwidthr1),mm
# -r_edge:形成边的圆的半径(dedger1/2.0),mm
# ==============================================================================
# 实验1:升级块参数
# ==============================================================================
список_блоков_case1 = [
# 1号块:放电边缘P-A槽几何形状1
SpoolComponent(
"Кромка Нагнетания P-A_1",
"DCV_HCD/Spool Edge with Notches (IL)",
45.0, # spool_diameter(线轴直径),mm
28.0, # 杆径(颈/杆直径),mm
2, # nslots(插槽/插槽数量)
20.0, # chamber_length_0(0偏移时的相机长度),mm
-4.0, # underlap(重叠/位移量),mm
16.0, # underlap_max_area(最大重叠。 面积),毫米
29.5, # edge_to_edge(边缘之间的距离),mm
0.003, # 间隙(直径间隙),mm
0.0, # 偏心系数(偏心系数)
true, # enable_annular_area(打开时是否考虑到插槽的面积)
true, # enable_pressure_force(考虑压力和体积变化)
true, # couette_effect(考虑流体摩擦的Couette效应)
[
UniversalRegion("circular", 4.0, 8.0, 8.0, 0.0, 4.0, 0.0),
UniversalRegion("rectangular", 6.0, 8.0, 8.0, 4.0, 4.0, 0.0)
]
),
# 2号块:放电边缘P-A槽几何形状2
SpoolComponent(
"Кромка нагнетания P-A_2",
"DCV_HCD/Spool Edge with Notches (IL)-1",
45.0, # spool_diameter(线轴直径),mm
28.0, # 杆径(颈/杆直径),mm
2, # nslots(插槽/插槽数量)
20.0, # chamber_length_0(0偏移时的相机长度),mm
-5.0, # underlap(重叠/位移量),mm
15.0, # underlap_max_area(最大重叠。 面积),毫米
29.5, # edge_to_edge(边缘之间的距离),mm
0.003, # 间隙(直径间隙),mm
0.0, # 偏心系数(偏心系数)
false, # enable_annular_area(打开时是否考虑到插槽的面积)
false, # enable_pressure_force(考虑压力和体积变化)
false, # couette_effect(考虑流体摩擦的Couette效应)
[
UniversalRegion("circular", 4.0, 7.0, 7.0, 0.0, 4.0, 0.0),
UniversalRegion("rectangular", 5.0, 7.0, 7.0, 4.0, 4.0, 0.0)
]
),
# 3号块:排水边缘B-T槽几何形状1
SpoolComponent(
"Кромка слива B-T_1",
"DCV_HCD/Spool Edge with Notches (IL)-2",
45.0, # spool_diameter(线轴直径),mm
28.0, # 杆径(颈/杆直径),mm
2, # nslots(插槽/插槽数量)
20.0, # chamber_length_0(0偏移时的相机长度),mm
-12.0, # underlap(重叠/位移量),mm
8.0, # underlap_max_area(最大重叠。 面积),毫米
96.0, # edge_to_edge(边缘之间的距离),mm
0.003, # 间隙(直径间隙),mm
0.0, # 偏心系数(偏心系数)
true, # enable_annular_area(打开时是否考虑到插槽的面积)
true, # enable_pressure_force(考虑压力和体积变化)
true, # couette_effect(考虑流体摩擦的Couette效应)
[
UniversalRegion("circular", 4.0, 5.0, 5.0, 0.0, 4.0, 0.0),
UniversalRegion("rectangular", 3.0, 5.0, 5.0, 4.0, 4.0, 0.0)
]
),
# 4号块:排水边缘B-T槽几何形状2
SpoolComponent(
"Кромка Слива B-T_2",
"DCV_HCD/Spool Edge with Notches (IL)-3",
45.0, # spool_diameter(线轴直径),mm
28.5, # 杆径(颈/杆直径),mm
2, # nslots(插槽/插槽数量)
20.0, # chamber_length_0(0偏移时的相机长度),mm
-5.0, # underlap(重叠/位移量),mm
15.0, # underlap_max_area(最大重叠。 面积),毫米
95.0, # edge_to_edge(边缘之间的距离),mm
0.003, # 间隙(直径间隙),mm
0.0, # 偏心系数(偏心系数)
false, # enable_annular_area(打开时是否考虑到插槽的面积)
false, # enable_pressure_force(考虑压力和体积变化)
false, # couette_effect(考虑流体摩擦的Couette效应)
[
UniversalRegion("circular", 4.0, 8.0, 8.0, 0.0, 4.0, 0.0),
UniversalRegion("rectangular", 11.0, 8.0, 8.0, 4.0, 4.0, 0.0)
]
)
]
被比较的线轴块的参数化(初始几何)
# ==============================================================================
# 实验2:块的初始参数(集合完全从头开始编写)
# ==============================================================================
# 在这里,您可以手动修改任何参数以执行比较分析。
список_блоков_case2 = [
# 1号块:放电边缘P-A槽几何形状1(修改)
SpoolComponent(
"Кромка Нагнетания P-A_1 (Мод)",
"DCV_HCD/Spool Edge with Notches (IL)",
45.0, # spool_diameter(线轴直径),mm
25.0, # 杆径(颈/杆直径),mm
2, # nslots(插槽/插槽数量)
20.0, # chamber_length_0(0偏移时的相机长度),mm
-4.0, # underlap(重叠/位移量),mm
16.0, # underlap_max_area(最大重叠。 面积),毫米
36.0, # edge_to_edge(边缘之间的距离),mm
0.003, # 间隙(直径间隙),mm
0.0, # 偏心系数(偏心系数)
true, # enable_annular_area(打开时是否考虑到插槽的面积)
true, # enable_pressure_force(考虑压力和体积变化)
true, # couette_effect(考虑流体摩擦的Couette效应)
[
UniversalRegion("circular", 4.0, 4.0, 4.0, 0.0, 4.0, 0.0),
UniversalRegion("rectangular", 12.5, 4.0, 4.0, 4.0, 4.0, 0.0)
]
),
# 第二座(修改)
SpoolComponent(
"Кромка нагнетания P-A_2 (Мод)", "DCV_HCD/Spool Edge with Notches (IL)-1",
45.0, 25.0, 2, 20.0, -4.0, 16.0, 36.0, 0.003, 0.0, false, false, false,
[
UniversalRegion("circular", 4.0, 4.0, 4.0, 0.0, 4.0, 0.0),
UniversalRegion("rectangular", 12.5, 4.0, 4.0, 4.0, 4.0, 0.0)
]
),
# 第三座(修改)
SpoolComponent(
"Кромка слива B-T_1 (Мод)", "DCV_HCD/Spool Edge with Notches (IL)-2",
45.0, 25.0, 2, 20.0, -4.0, 16.0, 96.0, 0.003, 0.0, true, true, true,
[
UniversalRegion("circular", 4.0, 4.0, 4.0, 0.0, 4.0, 0.0),
UniversalRegion("rectangular", 12.5, 4.0, 4.0, 4.0, 4.0, 0.0)
]
),
# 第4座(修改)
SpoolComponent(
"Кромка Слива B-T_2 (Мод)", "DCV_HCD/Spool Edge with Notches (IL)-3",
45.0, 25.0, 2, 20.0, -4.0, 16.0, 96.0, 0.003, 0.0, false, false, false,
[
UniversalRegion("circular", 4.0, 4.0, 4.0, 0.0, 4.0, 0.0),
UniversalRegion("rectangular", 12.5, 4.0, 4.0, 4.0, 4.0, 0.0)
]
)
]
渲染假脱机组件
我们直观地检查几何形状-凹槽的参数和位置,阀芯的直径以及每个缺口边缘组件的窗口
# 从数组中绘制第一个组件以控制几何(例如,从案例1)
# 让我们在3D和2D投影中显示所需的元素。
draw_spool_component_3d(список_блоков_case1[1])
模型启动参数
我们选择要检查的线轴-第一个,第二个或同时检查两者。
# ==============================================================================
# 启动设置:选择现在要运行的实验
# ==============================================================================
run_case1 = true # 我应该运行实验1号(升级)的计算吗?
run_case2 = true # 运行实验2号(初始)的计算?
启动实验并收集数据。 绘制图表
# =============================================================================
# 用于执行和收集单个实验的功能(原始逻辑)
# =============================================================================
function run_simulation_case(список_блоков_case)
println("\n--> Шаг 1: Запись параметров в блоки Engee...")
for блок in список_блоков_case
send_params_to_engee(блок)
end
println("--> Шаг 2: Запуск расчета модели '$(modelName)'...")
try
engee.run("$(modelName)")
println(",计算已成功完成!")
catch e
println(" 计算误差: ", e)
return nothing
end
println("-->步骤3:导出结果并细化点。..")
# 直接从AnyMath仿真结果的结构中抽出工件线
df_Disp_DCV = collect(WorkspaceArray{Float64}("$(modelName)/Displacement_DCV"))
df_Disp_Cylinder = collect(WorkspaceArray{Float64}("$(modelName)/Displacement_Cylinder"))
df_q_Piston = collect(WorkspaceArray{Float64}("$(modelName)/Расходомер-1/Q_Piston"))
step_decim = 100
# 我们分离时间和值的结构,将它们转换成纯Float64向量
time_cylinder = df_Disp_Cylinder.time[1:step_decim:end]
val_cylinder = df_Disp_Cylinder.value[1:step_decim:end]
val_disp_dcv = df_Disp_DCV.value[1:step_decim:end]
val_q_piston = df_q_Piston.value[1:step_decim:end]
return Dict(
"time_cylinder" => time_cylinder,
"val_cylinder" => val_cylinder,
"val_disp_dcv" => val_disp_dcv,
"val_q_piston" => val_q_piston
)
end
# =============================================================================
# 在会话中保存以前数据的同时运行模拟
# =============================================================================
if !@isdefined(res1) global res1 = nothing end
if !@isdefined(res2) global res2 = nothing end
if run_case1
println("===模拟#1:启动===")
global res1 = run_simulation_case(список_блоков_case1)
else
println("===模拟#1:跳过(使用内存中的数据)===")
end
if run_case2
println("===模拟#2:启动===")
global res2 = run_simulation_case(список_блоков_case2)
else
println("===模拟#2:跳过(使用内存中的数据)===")
end
# =============================================================================
# 自适应图构建和叠加(本地GR后端)
# =============================================================================
using Plots.PlotMeasures
has_data1 = !isnothing(res1)
has_data2 = !isnothing(res2)
if !has_data1 && !has_data2
println(" 没有数据显示图形。 运行至少一个实验(设置为true)。")
else
# 将后端切换到GR以生成轻量级静态PNG图像。
gr()
println("\nКомпоновка графиков (Режим: ",
(has_data1 && has_data2) ? "Сравнение двух комплектов" :
(has_data1 ? "Только Эксперимент 1 (Исходный)" : "Только Эксперимент 2 (Модифицированный)"), ")...")
# ---图1:来自DISLEMENT_DCV线轴位移的Q_Piston消耗 ---
p1 = plot(
title = "静态特性:由于阀芯位移而产生的活塞流量",
xlabel = "阀芯位移_DCV(mm)",
ylabel = "Расход Q_Piston (л/мин)",
grid = true,
titlefont = font(10),
bottom_margin = 15mm
)
if has_data1
p_idx1 = sortperm(res1["val_disp_dcv"])
plot!(p1, res1["val_disp_dcv"][p_idx1], res1["val_q_piston"][p_idx1],
label="实验1(升级)", lw=2.5, color=:blue)
end
if has_data2
p_idx2 = sortperm(res2["val_disp_dcv"])
plot!(p1, res2["val_disp_dcv"][p_idx2], res2["val_q_piston"][p_idx2],
label="实验2(初始)", lw=2.5, color=:red, style=:dash)
end
# ---图2:液压缸位移从时间t开始的位移 ---
p2 = plot(
title = "挖掘机油缸延长随时间的动力学",
xlabel = "模拟时间t(s)",
ylabel = "气缸活塞位移(m)",
grid = true,
titlefont = font(10),
top_margin = 10mm
)
if has_data1
plot!(p2, res1["time_cylinder"], res1["val_cylinder"],
label="实验1(升级)", lw=2.5, color=:darkgreen)
end
if has_data2
plot!(p2, res2["time_cylinder"], res2["val_cylinder"],
label="实验2(初始)", lw=2.5, color=:orange, style=:dash)
end
# 将两个画布合并为一个垂直报表(2行,1列)
combined_canvas = plot(p1, p2, layout=(2, 1), leg=true, size=(1200, 950))
# 强制将结果导出到文件并将其呈现为静态PNG
savefig(combined_canvas, "final_simulation_report.png")
display("image/png", read("final_simulation_report.png"))
# 我们正在返回PlotlyJS交互式后端,以便在剩余的单元格中进行舒适的3D工作。
plotlyjs()
end
结论
从图表中可以看出,不对称槽的使用给分配器阀芯的设计带来了积极的结果-当控制信号从0施加到30bar时,死区消失,分配器在从0到1000升/分钟的整个流
液压阀设备的结构和几何设计库的组件大大简化了阀门的开发,并加快了设计时间,显着降低了开发人员成本。
该工具包和方法可用于开发各种特殊设备产品的液压分配器和阀门-液压挖掘机,起重机,装载机,机械手,钻井平台调平系统和特殊用途的自行式车辆。 液压阀设备结构和几何设计库的组件大大简化了阀的开发,加快了设计时间。
.png)