如何在OpenModelica中测量梁挠度?附代码问题求助
OpenModelica悬臂梁挠度问题排查:载荷变化后挠度无响应
针对你用OpenModelica求解悬臂梁挠度时,更改载荷后挠度无变化的问题,直接梳理核心问题和修复方案:
核心问题分析
- 未定义变量
N:代码中计算挠度时使用了eMBS_Body.frame_node[N],但N从未被定义,编译器无法识别目标节点,导致读取的不是梁端部的位置数据。 - 载荷未实际作用到梁上:仅给
tipForce赋值了力分量,但未将tipForce的frame_b接口连接到梁的端部节点,载荷完全没有传递到梁体,自然挠度不会随载荷变化。 - 仿真设置冗余:StopTime设为500秒对于静态挠度计算来说过长,建议改用稳态求解器或缩短至足够梁达到稳态的时长。
修正后的代码
model FlexibleBeam_Deflection extends Modelica.Icons.Example; inner Modelica.Mechanics.MultiBody.World world(label2 = "z", g = 9.81, n = {0, 0, -1}) annotation(Placement(transformation(origin = {0, 10}, extent = {{-80, -10}, {-60, 10}}))); // 定义节点数常量,避免未定义变量问题 parameter Integer numNodes = 3; Components.EMBS_Body eMBS_Body(numModes = 10, SIDfileName = Modelica.Utilities.Files.loadResource("modelica://EMBSlib/tt4.SID_FEM"), numNodes = numNodes, d = 0.1) annotation(Placement(transformation(origin = {-30, 10}, extent = {{-10, -10}, {10, 10}}))); Modelica.Mechanics.MultiBody.Parts.Fixed fixed annotation(Placement(transformation(origin = {-66, 34}, extent = {{10, -5}, {21, 12}}))); Modelica.Blocks.Interfaces.RealOutput tipDeflection annotation(Placement(transformation(origin = {14, -18}, extent = {{28, -28}, {35, 7}}), iconTransformation(extent = {{40, -10}, {60, 10}}))); Modelica.Blocks.Sources.Constant Fz(k = -400); // z方向载荷(牛顿) Modelica.Mechanics.MultiBody.Forces.WorldForce tipForce(diameter = 0.008, color = {255, 255, 0}, resolveInFrame = Modelica.Mechanics.MultiBody.Types.ResolveInFrameB.world) annotation(Placement(transformation(origin = {-6, 10}, extent = {{40, -10}, {60, 10}}), iconTransformation(extent = {{40, -10}, {60, 10}}))); equation connect(fixed.frame_b, eMBS_Body.frame_node[1]) annotation(Line(points = {{-45, 37.5}, {-40, 37.5}, {-40, 10}, {-20, 10}}, color = {95, 95, 95})); connect(world.frame_b, eMBS_Body.frame_ref); // 连接载荷到梁的端部节点,确保载荷生效 connect(tipForce.frame_b, eMBS_Body.frame_node[numNodes]); // 使用定义好的节点数计算端部挠度 tipDeflection = eMBS_Body.frame_node[numNodes].r_0[3] - eMBS_Body.frame_ref.r_0[3]; tipForce.force[3] = Fz.y; // z方向载荷分量 tipForce.force[1] = 0; // x方向无载荷 tipForce.force[2] = 0; // y方向无载荷 // 调整仿真设置,改用稳态求解器提升效率 annotation(experiment(StopTime = 10, Interval = 1e-3, __DSSOLVER__ = "DASSL"), Diagram(coordinateSystem(preserveAspectRatio = false, extent = {{-100, -100}, {100, 100}}))); end FlexibleBeam_Deflection;
关键修改说明
- 新增
parameter Integer numNodes = 3,统一节点数定义,解决未定义变量N的问题; - 添加
connect(tipForce.frame_b, eMBS_Body.frame_node[numNodes]);,将载荷连接到梁的端部节点,确保载荷传递到梁体; - 调整仿真设置,改用DASSL求解器并缩短StopTime,更快得到稳态挠度结果;
- 替换挠度计算中的
N为numNodes,确保读取的是梁端部节点的位置数据。
内容的提问来源于stack exchange,提问作者Kabir Sharma
相关产品推荐
相关产品推荐

