2017-03-14 1 views
1

j'ai un modèle Modelica artificiel dans lequel une ont une variable de machine d'état manipulé par plusieurs when déclarations:Trop d'équations pour les variables de machine d'état discret dans lors des déclarations dans Modelica

model WhenExample 
    type State = enumeration(first, second, third); 

    State state; 
initial equation 
    state = State.first; 

equation 
    when sample(0, 1) then 
    state = State.second; 
    end when; 

    when sample(0, 3) then 
    state = State.third; 
    end when; 
end WhenExample; 

Lors de la compilation sous OpenModelica OMC, I l'erreur suivante:

[1] 16:46:39 Symbolic Error 
Too many equations, over-determined system. The model has 2 equation(s) and 1 variable(s). 

Cela fait un peu de sens que je faire ont deux équations pour ma seule variable state. Cependant, ces équations ne s'appliquent qu'à des moments précis, n'est-ce pas? Dois-je m'assurer que toutes les «manipulations» d'une variable particulière ne se produisent que dans une seule déclaration when?

+0

Oui; ajouter deux quand les équations font que l'état a deux équations et il n'est pas possible pour un Modelica de créer une priorité entre les événements, donc 'elsewhen' doit être utilisé (ou une section d'algorithme comme montré ci-dessous). –

Répondre

4

Voir Modelica Spec, section 8.5 Evénements et synchronisation: https://www.modelica.org/documents/ModelicaSpec33Revision1.pdf

Juste avant la section 8.6, il est un exemple qui devrait vous aider. Un code basé sur cela est donné ci-dessous:

model WhenExample 
    parameter Integer multiplySample = 3; 
    Boolean fastSample, slowSample; 
    Integer ticks(start=0); 
    type State = enumeration(first, second, third); 
    State state(start = State.first); 
equation 
    fastSample = sample(0,1); 
algorithm 
    when fastSample then 
    ticks := if pre(ticks) < multiplySample then pre(ticks)+1 else 0; 
    slowSample := pre(ticks) == 0; 
    state := State.second; 
    end when; 
    when slowSample then 
    state := State.third; 
    end when; 
end WhenExample; 
+0

Merci. Mettre mes instructions 'when' dans une section' algorithm' a fonctionné - et cela a plus de sens. – watkipet