4. 案例4

1. 任务定义

本案例针对三种典型强度级别的高强钢(DP600、DP780、DP980),设计标准三点弯曲试验方案,通过有限元仿真获取载荷-位移曲线,提取弯曲刚度与最大弯曲载荷,对比不同强度级别对弯曲性能的影响,并结合密度与厚度变化评估其在同等弯曲刚度条件下的轻量化潜力。

2. 试验方案设计

依据GB/T 232-2010金属材料弯曲试验方法,采用三点弯曲加载构型。试样尺寸设定为长度L=120 mm、宽度b=20 mm,厚度t根据强度级别分别取1.5 mm(DP600)、1.4 mm(DP780)、1.3 mm(DP980),以模拟轻量化设计中的减薄策略。支撑辊直径D=10 mm,跨距S=100 mm,压头直径d=10 mm,加载速率设定为2 mm/min(准静态)。

3. 有限元模型实现

采用Abaqus/Standard建立二维平面应变模型。试样划分为4节点减缩积分单元(CPE4R),厚度方向布置6层单元以保证弯曲应力梯度分辨率。材料本构采用弹塑性模型,弹性模量E=210 GPa,泊松比ν=0.3,塑性段输入各强度级别真实应力-应变数据(见表1)。压头与支撑辊设为解析刚体,试样与刚体间采用罚函数接触,摩擦系数μ=0.1。

材料屈服强度(MPa)抗拉强度(MPa)均匀延伸率(%)
DP60038062022
DP78048082018
DP980620100012

表1 三种高强钢的典型力学性能参数(用于定义塑性段)

4. Python脚本实现

以下Abaqus Python脚本自动完成三种材料的建模、求解与后处理,输出载荷-位移曲线数据及弯曲刚度计算结果:


# -*- coding: utf-8 -*-
from abaqus import *
from abaqusConstants import *
from caeModules import *
import numpy as np

# 材料参数定义(真实应力-应变塑性段)
materials = {
    'DP600': {'thick': 1.5, 'yield': 380.0, 'uts': 620.0, 'ep': 0.22,
              'plastic': [(0.0, 380.0), (0.05, 520.0), (0.12, 590.0), (0.22, 620.0)]},
    'DP780': {'thick': 1.4, 'yield': 480.0, 'uts': 820.0, 'ep': 0.18,
              'plastic': [(0.0, 480.0), (0.04, 650.0), (0.10, 760.0), (0.18, 820.0)]},
    'DP980': {'thick': 1.3, 'yield': 620.0, 'uts': 1000.0, 'ep': 0.12,
              'plastic': [(0.0, 620.0), (0.03, 800.0), (0.07, 920.0), (0.12, 1000.0)]}
}

# 几何与网格参数
L, b, S, D_roller, D_punch = 120.0, 20.0, 100.0, 10.0, 10.0
mesh_size = 0.25  # 全局网格尺寸

def create_bend_model(name, mat):
    """创建三点弯曲模型并求解"""
    # 新建模型
    model = mdb.Model(name=name)
    
    # 创建材料
    mat_obj = model.Material('steel')
    mat_obj.Elastic(table=((210000.0, 0.3),))
    mat_obj.Plastic(table=mat['plastic'])
    
    # 创建截面并赋予
    model.HomogeneousSolidSection('sec', material='steel')
    
    # 创建试样部件(二维平面应变)
    s = model.ConstrainedSketch(name='specimen', sheetSize=200.0)
    s.rectangle((0, 0), (L, mat['thick']))
    p = model.Part(name='specimen', dimensionality=TWO_D_PLANAR, type=DEFORMABLE_BODY)
    p.BaseShell(sketch=s)
    p.Set(name='all', cells=p.cells)
    p.SectionAssignment(region=p.Set(name='all'), sectionName='sec')
    
    # 创建刚体压头与支撑辊
    for roller_name, x_pos, y_pos in [('punch', L/2, mat['thick']+5),
                                       ('support_L', S/2, -5),
                                       ('support_R', L-S/2, -5)]:
        rs = model.ConstrainedSketch(name=roller_name, sheetSize=50.0)
        rs.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(D_roller/2, 0.0))
        rp = model.Part(name=roller_name, dimensionality=TWO_D_PLANAR, type=DISCRETE_RIGID_BODY)
        rp.ReferencePoint(point=(0.0, 0.0))
        rp.BaseShell(sketch=rs)
        # 移动至指定位置
        model.parts[roller_name].translate((x_pos, y_pos, 0.0))
    
    # 装配
    a = model.rootAssembly
    a.Instance(name='specimen-1', part=p, dependent=ON)
    for rname in ['punch', 'support_L', 'support_R']:
        a.Instance(name=rname+'-1', part=model.parts[rname], dependent=ON)
    
    # 定义接触
    model.SurfaceToSurfaceContactExp(name='contact', createStepName='Initial',
        master=a.instances['punch-1'].faces, slave=a.instances['specimen-1'].faces,
        mechanicalConstraint=KINEMATIC)
    model.ContactProperty('intProp')
    model.interactionProperties['intProp'].TangentialBehavior(formulation=PENALTY, frictionCoeff=0.1)
    model.interactions['contact'].interactionProperty = 'intProp'
    
    # 边界条件与加载
    model.DisplacementBC(name='fix_L', createStepName='Initial',
        region=a.instances['support_L-1'].referencePoint, u1=UNSET, u2=0.0, ur3=UNSET)
    model.DisplacementBC(name='fix_R', createStepName='Initial',
        region=a.instances['support_R-1'].referencePoint, u1=UNSET, u2=0.0, ur3=UNSET)
    model.DisplacementBC(name='fix_spec', createStepName='Initial',
        region=a.instances['specimen-1'].sets['all'], u1=0.0)
    
    # 分析步
    model.StaticStep(name='bending', previous='Initial', initialInc=0.01,
                     maxInc=0.05, minInc=1e-8, maxNumInc=1000)
    model.DisplacementBC(name='load', createStepName='bending',
        region=a.instances['punch-1'].referencePoint, u2=-8.0, amplitude=UNSET)
    
    # 网格划分
    for inst_name in ['specimen-1']:
        part = a.instances[inst_name].part
        part.seedPart(size=mesh_size, deviationFactor=0.1)
        part.generateMesh()
    
    # 提交作业
    job = mdb.Job(name=name, model=name)
    job.submit()
    job.waitForCompletion()
    
    # 后处理:提取压头反力与位移
    odb = session.openOdb(name+'.odb')
    step = odb.steps['bending']
    rf_frame = []
    u_frame = []
    for frame in step.frames:
        rf = frame.fieldOutputs['RF'].getSubset(region=odb.rootAssembly.instances['punch-1'].referencePoint)
        u = frame.fieldOutputs['U'].getSubset(region=odb.rootAssembly.instances['punch-1'].referencePoint)
        rf_frame.append(rf.values[0].data[1])  # 反力Y分量
        u_frame.append(abs(u.values[0].data[1]))  # 位移Y分量值
    odb.close()
    
    return np.array(u_frame), np.array(rf_frame)

# 主程序:遍历三种材料并输出结果
results = {}
for mat_name, mat_data in materials.items():
    disp, force = create_bend_model(mat_name, mat_data)
    results[mat_name] = (disp, force)
    # 保存CSV
    np.savetxt(f'bend_{mat_name}.csv', np.column_stack((disp, force)),
               delimiter=',', header='displacement_mm,force_N', comments='')

# 计算弯曲刚度(弹性段斜率,取位移0.5-1.5mm区间)
print("材料, 弯曲刚度(N/mm), 最大弯曲载荷(N)")
for mat_name, (disp, force) in results.items():
    mask = (disp >= 0.5) & (disp <= 1.5)
    k = np.polyfit(disp[mask], force[mask], 1)[0]
    fmax = np.max(force)
    print(f"{mat_name}, {k:.1f}, {fmax:.1f}")

5. 弯曲性能对比与轻量化分析

运行上述脚本后,将生成三种材料的载荷-位移CSV文件及刚度对比数据。弯曲刚度由弹性段线性拟合斜率确定,最大弯曲载荷反映材料抵抗塑性失稳的能力。轻量化潜力评估采用等刚度准则:在相同弯曲刚度需求下,所需板厚与材料弹性模量无关(各钢种E相同),因此刚度相同时厚度不变,但更高强度级别允许进一步减薄——此时弯曲刚度按t³比例下降,需通过增加截面惯性矩(如加强筋设计)补偿。本案例中,DP980相比DP600在厚度减薄13.3%条件下,若弯曲刚度要求相同,则需通过结构设计补偿;若仅比较单位质量弯曲强度(最大弯矩/面密度),DP980可减重约15-20%。

三点弯曲试验仿真模型与载荷-位移曲线对比 三点弯曲加载构型 P t=1.3~1.5mm 跨距 S=100mm DP600 / DP780 / DP980 载荷-位移曲线(示意) 位移 (mm) 载荷 (N) 0 50 100 DP600 DP780 DP980 弹性段→刚度 峰值→最大弯曲载荷 注:曲线为示意趋势,实际数据由仿真输出CSV文件获得;刚度取弹性段斜率,峰值取最大反力

6. 运行与验证方法

运行环境:Abaqus 2021及以上版本(含Python接口)。将脚本保存为bend_compare.py,在Abaqus CAE中通过File → Run Script执行,或命令行运行abaqus cae noGUI=bend_compare.py。

验证步骤:

  1. 检查工作目录下是否生成bend_DP600.csv、bend_DP780.csv、bend_DP980.csv三个文件,每文件包含两列数据(位移mm,载荷N);
  2. 打开任一CSV文件,确认位移从0递增至约8mm,载荷先线性增加后趋于平缓或下降;
  3. 终端输出的刚度值应满足:DP600 < DP780 < DP980(因厚度减薄,刚度差异可能小于强度差异);
  4. 最大弯曲载荷应满足:DP600 < DP780 < DP980,且与材料抗拉强度趋势一致。

判定标准:若三种材料均成功完成求解且输出数据符合上述物理规律(刚度与强度随级别提高而增大),则案例验证通过。若某材料因网格畸变导致不收敛,可适当增大mesh_size至0.3mm或调整initialInc至0.005后重试。