专栏
标签

reinit使用问题
一般问题

发布于 2026-07-28 19:38:37
查看 17过去1天

请问以下代码如何修改才能使得theta值限定在0-90°之内
model Model1
annotation(__MWORKS(version="2025b"));

parameter Real J=0.0077;
parameter Real T1=100;
Real w;
Real theta;
parameter Real wind= 0.05;
Real Tw;
Real tmax=90;
Real tmin=0;
Integer stop;
equation
if T1<48 and w==0 then
der(w)=0;
else
J*der(w)=T1-Tw;
end if;

Tw=abs(w)wwind;
der(theta)=w;
if theta<= tmin then
stop=-1;
elseif theta>=tmax then
stop=1;
else
stop=0;
end if;
when stop<>0 then
reinit(w,0);
reinit(theta,if stop<0 then tmin else tmax);
end when;

end Model1;

所属专栏:Sysplorer基础平台
产品信息:Sysplorer系统建模仿真环境
同元软控产品体验官计划

全部回答 1

发布于 2026-07-29 10:00:24

您好,您可以参考以下代码,后续遇到此类问题,可以升级到最新版本的MWORKS去使用MWORKS AI修改。

model Model1
  parameter Real J = 0.0077;
  parameter Real T1 = 100;
  Real w(start=0);
  Real theta(start=0);
  parameter Real wind = 0.05;
  Real Tw;
  parameter Real tmax = 90;
  parameter Real tmin = 0;
  Integer stop;
equation
  Tw = abs(w);

  // 边界标志
  if theta <= tmin then
    stop = -1;
  elseif theta >= tmax then
    stop = 1;
  else
    stop = 0;
  end if;

  // 角加速度(含边界锁定)
  if stop == 1 and T1 - Tw >= 0 then
    // 上边界 + 净力矩向上 → 锁定(阻止继续超出)
    der(w) = 0;
  elseif stop == -1 and T1 - Tw <= 0 then
    // 下边界 + 净力矩向下 → 锁定(阻止继续超出)
    der(w) = 0;
  elseif T1 < 48 and w == 0 then
    // 原静摩擦逻辑
    der(w) = 0;
  else
    // 正常动力学
    J * der(w) = T1 - Tw;
  end if;

  der(theta) = w;

  // 安全兜底:数值漂移时拉回边界
  when stop <> 0 then
    reinit(w, 0);
    reinit(theta, if stop < 0 then tmin else tmax);
  end when;
end Model1;
用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天