Se si desidera utilizzare i componenti condizione, ci sono alcune restrizioni è necessario essere a conoscenza. La sezione 4.4.5 della specifica Modelica 3.3 lo riassume bene. Dice "Se la condizione è falsa, il componente, i suoi modificatori e qualsiasi equazione di connessione che coinvolge il componente, vengono rimossi". Ti mostrerò come usarlo per risolvere il tuo problema in un secondo, ma prima voglio spiegare perché la tua soluzione non funziona.
Il problema ha a che fare con il controllo del modello. Nel tuo caso, è ovvio che l'equazione component.x
e il componente component
esistono entrambi o nessuno dei due esiste. Questo perché li hai legati alla stessa variabile booleana. Ma cosa succede se tu avessi non questo:
parameter Real some_number;
Component component if some_number*some_number>4.0;
equation
if some_number>=-2 and some_number<=2 then
component.x = 0;
end if;
possiamo vedere che questo logicamente identico al vostro caso. Non esiste alcuna possibilità che lo component.x
esista quando lo component
è assente. Ma possiamo provare cose del genere in generale? No.
Così, quando sono stati introdotti i componenti condizionali, la semantica conservatori sono stati implementati che possono sempre banalmente garantire che i set di variabili ed equazioni coinvolte non arrivano mai "fuori sincrono".
Cerchiamo di tornare a ciò che la specifica dice: "Se la condizione è falsa, la componente, i suoi modificatori, e qualsiasi equazioni di connessione che coinvolgono la componente, vengono rimossi"
Per il vostro caso, la soluzione potrebbe potenzialmente essere abbastanza semplice. A seconda di come dichiari "x", puoi semplicemente aggiungere una modifica a component
, ad es.
parameter Boolean use_component=false;
Component component(x=0) if use_component;
L'eleganza di questo è che la modifica si applica solo a component
e se component
non è presente, né è la modifica (equazione). Quindi la variabile x
e la sua equazione associata sono "sincronizzati". Ma questo non funziona per tutti i casi (IIRC, x
deve avere un qualificatore input
perché funzioni ... forse è possibile nel tuo caso?).
Ci sono due alternative rimanenti. Per prima cosa, metti l'equazione component.x
all'interno di component
. Il secondo è quello di introdurre un connettore su component
che, se connesso, genererà l'equazione desiderata. Come nel caso di modifica (questa non è una coincidenza), si potrebbe associare x
con un connettore di ingresso di qualche tipo e poi fare questo:
parameter Boolean use_component;
Component component if use_component;
Constant zero(k=0);
equation
connect(k.y, component.x);
Ora, potevo immaginare che dopo aver considerato tutti e tre i casi (modifica, internalizzare l'equazione e utilizzare connect
), si arriva alla conclusione che nessuno di essi funzionerà. In questo caso, vorrei suggerire umilmente che hai un problema con il modo in cui hai progettato il componente. Il motivo per cui tali restrizioni si presentano è legato alla necessità di verificare i componenti da soli per la correttezza. Ciò richiede che il componente sia completo ("bilanciato" nella terminologia della specifica).
Se non riesci a risolvere il problema con gli approcci che ho menzionato sopra, allora sospetto che tu abbia davvero un problema di bilanciamento e che tu abbia probabilmente bisogno di ridefinire i confini del tuo componente in qualche modo. Se questo è il caso, ti suggerirei di aprire un'altra domanda qui con i dettagli di ciò che stai cercando di fare.