Esta secção apresenta um conjunto de modelos, desenvolvidos no âmbito do presente trabalho, para a implementação do formalismo dos Statecharts em linguagem Modelica. Até ao momento da realização deste trabalho, a implementação disponível da linguagem Modelica, especificação 1.4, ainda não contempla listas de componentes; por isso, foram desenvolvidos modelos de estados com várias transições de saída e de entrada.
Na implementação proposta são usados dois tipos de terminais para criar ligações entre estados: terminais para estabelecer ligações estado-transição-estado e terminais usados na definição da hierarquia de estados do statechart.
Os modelos de terminais, para estabelecer ligações estado-transição-estado, são idênticos aos definidos por Mosterman, em [Mosterman97], para a implementação do formalismo das Redes de Petri em Modelica.
As classes FireCut e SetCut representam, respectivamente, terminais para ligação de transições ao seu estado origem e ligações ao seu estado destino, Figura 3.11. A ligação através de terminais do tipo FireCut permite transportar o status do estado origem para a transição (sinal state) e a sinalização do status da transição (sinal fire) para o estado destino.
connector FireCut Boolean state; Boolean fire; end FireCut;
A ligação SetSCut é usada para sinalizar o estado destino do disparo de uma transição de entrada (sinal set). Este sinal permite a activação do estado destino.
connector SetCut Boolean set; end SetCut; Estado destino Estado origem FireCut FireCut SetCut SetCut set fire state Transição event
Figura 3.11 Uniões para ligação duma transição ao estado origem e ao estado destino
Os terminais que estabelecem ligações hierárquicas entre estados (definição da hierarquia) são representados pela classe HierarchicalConnection. Estas ligações permitem o envio de eventos de activação e desactivação hierárquica de estados.
connector HierarchicalConnection Boolean act;
Boolean deact;
end HierarchicalConnection;
A classe BasicState é a classe base para representação de estados. Define as características estruturais e funcionais comuns a todos os tipos de estados. Utiliza variáveis do tipo Boolean para sinalizar a sua activação e desactivação e, também, a operacionalidade da sua actividade. Possui igualmente terminais para activação e desactivação hierárquica.
model BasicState
Boolean activate, deactivate, active; HierarchicalConnection hConIn; HierarchicalConnection hConOut; equation
hConOut.act = activate; hConOut.deact = deactivate;
active = (pre(active) or activate) and not deactivate; end BasicState;
O modelo Transition representa uma transição. Contem terminais para ligação ao estado origem e ao estado destino, e usa variáveis do tipo Boolean para guardar o status do seu evento e da sua protecção, e também para sinalizar que a sua acção pode ser executada.
model Transition FireSCut inp; SetSCut out;
Boolean event, guard (start = true), action; equation
out.set = inp.state and event and guard; inp.fire = out.set;
action = out.set; end Transition;
Se for activada a história, o estado deve recordar o seu último status (activo ou inactivo). Depois, na próxima entrada da activação do seu estado ancestral directo (estado pai), de que é notificado pelo seu terminal de activação hierárquica, o presente estado será activado. A variável do tipo Boolean, lastState, guarda o status anterior do estado quando é usada história.
Um estado pode ser activado quando se dá o disparo de uma transição de entrada ou quando o seu estado pai for activado. O sinal activate sinaliza que a acção associada à entrada num estado pode ser executada. Um estado pode ser desactivado quando uma transição de saída é activada ou quando o seu estado pai for desactivado. O sinal deactivate sinaliza que a acção associada à saída do estado pode ser executada. Na desactivação hierárquica, e quando existe história, a variável
lastState é actualizada. Somente quando eventos de desactivação hierárquica ocorrem é necessário
guardar o último status do estado. É também necessário sinalizar o status do estado a transições de saída do estado.
model State
extends BasicState;
parameter Boolean defaultState = false, history = false; SetCut inp;
FireCut out;
Boolean lastState (start = defaultState); equation
activate = if history then pre(inp.set) or (hConIn.act and lastState) else pre(inp.set) or (hConIn.act and defaultState); deactivate = pre(out.fire) or hConIn.deact;
when (hConIn.deact and history) then lastState = pre(active);
end when; out.state = active; end State;
O modelo State representa um estado com uma transição de entrada e uma transição de saída. Foram também desenvolvidos outros modelos para representar estados com várias transições de entrada e/ou saída. Por exemplo, os modelos seguintes representam modelos com duas transições de entrada e uma transição de saída e vice-versa.
model StateSIn2Out1 extends BasicState;
parameter Boolean defaultState = false; parameter Boolean history = false;
SetSCut inp1, inp2; FireSCut out;
Boolean lastState (start = defaultState); equation
activate = if history then pre(inp1.set) or pre(inp2.set) or (hConIn.act and lastState) else pre(inp1.set) or pre(inp2.set) or (hConIn.act and defaultState); deactivate = pre(out.fire) or hConIn.deact;
when (hConInp.deact and history) then lastState = pre(active);
end when; out.state = active; end StateSIn2Out1;
model StateSIn1Out2 extends BasicState;
parameter Boolean defaultState = false; parameter Boolean history = false; SetSCut inp;
FireSCut out1, out2;
Boolean lastState (start = defaultState); equation
activate = if history then pre(inp.set) or (hConIn.act and lastState) else pre(inp.set) or (hConIn.act and defaultState); deactivate = pre(out1.fire) or pre(out2.fire) or hConIn.deact;
when (hConInp.deact and history) then lastState = pre(active);
end when;
out1.state = active; out2.state = active; end StateSIn1Out2;
Um estado ortogonal, representado pela classe OrthogonalState, é o estado descendente directo (estado filho) de um estado AND. Este tipo de estado não permite propriedades de história ou estado default pois será sempre activado quando o seu estado pai for activado. Além disso, na presente sintaxe, também não são permitidas transições.
model OrthogonalState extends BasicState; equation activate = hConIn.act; deactivate = hConIn.deact; end OrthogonalState;
O estado raiz, representado pela classe RootState, só gera eventos de activação e desactivação hierárquica no início e no final da execução do statechart, uma vez que está sempre activo.
model RootState HierarchicalConnection hConOut; equation hConOut.act = initial(); hConOut.deact = terminal(); end RootState;