OpenModelica modelling Coulomb friction: Translation Error, post-optimization module findZeroCrossings (simulation) failed

前端 未结 4 1564
名媛妹妹
名媛妹妹 2021-01-23 11:44

I\'m trying to simulate Coulomb friction in Modelica. The basic concept is to check if relative velocity speed between to surfaces is less than a constant and the external force

4条回答
  •  面向向阳花
    2021-01-23 12:24

    Actually, the model I have developed above for Columb friction is wrong. Thanks to this post I could find the correct version:

    package friction1D
    
      final constant Real eps=1.e-15 "Biggest number such that 1.0 + eps = 1.0";
    
      function sgn
        input Real inputVar;
        output Real outputVar;
      algorithm
        if noEvent(inputVar < 0) then
         outputVar := -1;
        else
          outputVar := 1;
        end if;
      end sgn;
    
      function coulombFriction
        input Real relVel;
        input Real shearForce;
        input Real normalForce;
        input Real statfricco;
        input Real kinfricco;
        output Real fricForce;
      algorithm
          if noEvent(abs(relVel) < eps) and noEvent(abs(shearForce) < statfricco * normalForce) then
            fricForce := shearForce;
        else
          fricForce := kinfricco * normalForce * sgn(relVel);
        end if;
      end coulombFriction;
    
      model fricexample_1
        //parameters
        parameter Real kco = 0.3;
        parameter Real sco = 0.4;
        parameter Real nfo = 1.0;
        parameter Real mass = 1.0;
    
        Real sfo;
        Real ffo;
        Real x;
        Real v;
    
      initial equation
        x = 0;
        v = 0;
    
      algorithm
        sfo := 0.7 * sin(time);
        ffo := coulombFriction(relVel = v, shearForce = sfo, normalForce = nfo, statfricco = sco, kinfricco = kco);
    
      equation
        v = der(x);
        mass * der(v) = sfo - ffo;
    
      annotation(
          experiment(StartTime = 0, StopTime = 10, Tolerance = 1e-8, Interval = 0.02),
          __OpenModelica_simulationFlags(lv = "LOG_STATS", outputFormat = "mat", s = "dassl"));
    
      end fricexample_1;
    
    end friction1D;
    

提交回复
热议问题