2017-02-07 11 views
1

Я пытаюсь моделировать кулоновское трение в Modelica. основная концепция состоит в том, чтобы проверить, не является ли относительная скорость скорости между поверхностями меньше, чем постоянная, а внешняя сила, которая пыталась скользить по поверхностям снова друг с другом, меньше максимальной силы статического трения (normalForce * staticFrictionCoefficient), тогда сила трения равна отрицательной внешней силы сдвига. в противном случае сила трения равна силе кинетического трения (normalForce * kineticFrictionCoefficient) в противоположном направлении скольжения. я реализовал эту концепцию в Modelica, как показано ниже:Моделирование OpenModelica Кулоновское трение: Ошибка перевода, модуль пост-оптимизации findZeroCrossings (имитация) не удалось

function coulombFriction 

    input Real relVel; 
    input Real shearForce; 
    input Real normalForce; 
    input Real statfricco; 
    input Real kinfricco; 
    output Real fricForce; 

algorithm 
    if relVel==0 and abs(shearForce)<statfricco*normalForce then 
    fricForce:=shearForce; 
    else 
    fricForce:=kinfricco*normalForce*sign(relVel); 
    end if; 
end coulombFriction; 

, но когда я вызываю эту функцию из модели, как показано ниже:

model fricexample_1 

    extends coulombFriction; 

    //parameters 
    parameter Real kco=0.3; 
    parameter Real sco=0.4; 
    parameter Real nfo=1.0; 

    Real sfo; 
    Real ffo; 
    Real x; 
    Real v; 

    initial equation 
    x=0; 
    v=0; 

    equation 
    v=der(x); 
    der(v)=sfo-ffo; 
    sfo=time; 
    ffo=coulombFriction(relVel=v, shearForce=sfo, normalForce=nfo, statfricco=sco, kinfricco=kco); 

    end fricexample_1; 

Я вижу ошибку:

Translation Error

post-optimization module findZeroCrossings (simulation) failed.

Если я удалите функцию abs из определенной функции, она решает проблему компиляции, но модель неверна! Я был бы признателен, если бы вы могли мне помочь:

  1. как я могу решить эту проблему?
  2. как смоделировать трение иначе?
+0

Вы можете попробовать использовать noEvent (условие): если noEvent (relVel == 0) и noEvent (абс (shearForce)

+0

Вау, спасибо большое, это фактически решило мою проблему! вам нравится писать это как ответ? В противном случае я это сделаю. – Foad

+0

Какую версию OpenModelica вы используете? Я думаю, это могло быть исправлено в последней версии. –

ответ

3

Ваша модель действительно работает с выпуском 1.11. Вопрос заключается в заявлении extends coulombFriction;. После того, как вы удалили его, он должен работать нормально даже без noEvent звонков:

package Friction 
    function coulombFriction 
    input Real relVel; 
    input Real shearForce; 
    input Real normalForce; 
    input Real statfricco; 
    input Real kinfricco; 
    output Real fricForce; 
    algorithm 
    if relVel==0 and abs(shearForce)<statfricco*normalForce then 
     fricForce:=shearForce; 
    else 
     fricForce:=kinfricco*normalForce*sign(relVel); 
    end if; 
    end coulombFriction; 

    model fricexample_1 
    parameter Real kco=0.3; 
    parameter Real sco=0.4; 
    parameter Real nfo=1.0; 

    Real sfo; 
    Real ffo; 
    Real x; 
    Real v; 

    initial equation 
    x = 0; 
    v = 0; 

    equation 
    v = der(x); 
    der(v) = sfo-ffo; 
    sfo = time; 
    ffo = coulombFriction(relVel=v, shearForce=sfo, normalForce=nfo, statfricco=sco, kinfricco=kco); 
    end fricexample_1; 
end Friction; 
+0

Вы на самом деле правдивы. расширение является основной проблемой. но вопрос в том, если не расширить, то как я могу включить .mo-файл в другую модель. Я хочу сделать некоторые функции, которые я могу использовать в других моделях. – Foad

+0

Следовательно, вы, вероятно, могли бы использовать систему пакетов в Modelica: http://book.xogeny.com/components/packages/ – lochel

3

Вы можете использовать noEvent для условий, которые могут генерировать события в функции. Обратите внимание, что вам не нужно расширять модель с помощью функции. На самом деле это не должно работать (чтобы расширить модель от функции), но, похоже, мы ее не проверяем.

Модель, которая составляет для меня ниже:

package Friction 

    function coulombFriction 
    input Real relVel; 
    input Real shearForce; 
    input Real normalForce; 
    input Real statfricco; 
    input Real kinfricco; 
    output Real fricForce; 
    algorithm 
    if noEvent(relVel==0) and noEvent(abs(shearForce)<statfricco*normalForce) then 
     fricForce:=shearForce; 
    else 
     fricForce:=kinfricco*normalForce*sign(relVel); 
    end if; 
    end coulombFriction; 

    model fricexample_1 

    //parameters 
    parameter Real kco=0.3; 
    parameter Real sco=0.4; 
    parameter Real nfo=1.0; 

    Real sfo; 
    Real ffo; 
    Real x; 
    Real v; 

    initial equation 
    x = 0; 
    v = 0; 

    equation 
    v = der(x); 
    der(v) = sfo-ffo; 
    sfo = time; 
    ffo = coulombFriction(relVel=v, shearForce=sfo, normalForce=nfo, statfricco=sco, kinfricco=kco); 
    end fricexample_1; 

end Friction; 
2

Я бы рекомендовал повторно использовать государственную машину трения, доступную в стандартной библиотеке Modelica. Пример, который работает в OpenModelica и других инструментах, дается https://github.com/dzimmer/ZimmersModelicaTutorial/blob/master/Tutorial2015/BaseComponents/Friction/IdealDryFriction.mo.

+0

Я попытался взглянуть на код, но я этого не понимаю. в чем разница между их реализацией и моей? – Foad

 Смежные вопросы

  • Нет связанных вопросов^_^