• Aucun résultat trouvé

Nesta secção apresentam-se as características essenciais dos Statecharts, muito especialmente dos Statecharts híbridos, ao nível sintáctico e semântico, com vista à sua implementação em linguagem Modelica.

Um statechart é descrito através de estados, transições, eventos e condições. Os estados e eventos são considerados a maneira mais natural de descrição da dinâmica de sistemas complexos. Contudo, em sistemas complexos poderão existir dezenas de estados distintos que, organizados de acordo com o formalismo de um só nível como é o formalismo das FSMs, resultam em diagramas de estado complicados e difíceis de analisar; de facto, pode ser difícil, senão mesmo impossível, mostrar todos os estados num único diagrama. A dependência e o paralelismo de acções de subsistemas concorrentes aumenta exponencialmente o número de estados e transições no modelo FSMs. O mesmo comportamento da FSM da Figura 3.1 pode ser descrito num statechart com metade das transições, já que os Statecharts oferecem construções próprias para representar subsistemas concorrentes.

a) A2B1 A1B1 A1B2 A2B2 t2 t1 t2 t1 t4 t3 t4 t3 b) A Root A2 A1 B B1 B2 t2 t1 t3 t4

Figura 3.1 Descrição de actividades paralelas com a) FSM, b) Statecharts

Os estados permitem a especificação de diferentes contextos do sistema e são representados graficamente através de rectângulos. Quando um estado está activo descreve uma determinada situação no sistema representado pelo statechart. Existem três tipos de estados: básicos, OR e AND. No exemplo da Figura 3.2 os estados “A1”, “A2”, “A3”, “B11”, “B12”, “B21”, “B22”, “B23”, “B311”, “B312” e “B32” são estados básicos.

Root B B2 B22 B23 B3 B1 B21 H B11 B12 B32 B31 B311 B312 A A1 A3 A2 t9:e9[c9]/e11 t8:e8 t10:e10 t4:e4 t3:e3[c3] t5:e5 t2:e2/e9 t1:e1 t7:e7 t6:e6 t12:e12 t11:e11

Uma das diferenças, relativamente às FSMs, é a possibilidade de decomposição hierárquica de estados, permitindo assim o agrupamento de estados noutros estados formando diferentes níveis hierárquicos. Esta forma hierárquica de organizar informação encoraja a utilização de ferramentas de ampliação para a movimentação fácil entre níveis de abstracção. O formalismo dos Statecharts introduz o conceito de profundidade nos diagramas de estados através da decomposição OR de um estado FSM convencional. A ortogonalidade representa o dual da profundidade e corresponde a uma decomposição AND de um FSM.

A decomposição OR ou AND de estados dá origem a sub-estados. Um estado é um sub-estado de outro quando este for ancestral directo ou indirecto ao longo da hierarquia. Os estados "Root", "A", "B1", “B2” e “B3” são decomposições do tipo OR. O estado "B1" contém os sub-estados "B11" e "B12", que são denominados estados filhos de "B1", sendo este o seu estado pai. Um statechart possui sempre um estado sem estado pai (neste caso o estado "Root") a que se chama raiz do statechart. Quando um estado OR está activo um e só um sub-estado está também activo. Tomando o exemplo, quando "A" está activo, somente um dos estados "A1", "A2" ou "A3" está activo. A concorrência dentro de um statechart pode ser descrita através de estados AND, permitindo a descrição de actividades concorrentes num mesmo modelo através de estados ortogonais. Estes estados ortogonais são todos simultaneamente activados, ou desactivados, aquando da entrada, ou saída, de um estado AND. A este tipo de activação e desactivação dos sub-estados chama-se activação e desactivação hierárquica. Os estados “B1”, “B2” e “B3” são sub-estados ortogonais resultantes da decomposição AND do estado “B”. O processo de decomposição AND e OR de estados pode prosseguir até que seja atingida a descrição de baixo nível pretendida. Quando a modelação de sistemas produz statecharts complexos, pode-se decompor o statechart em diagramas separados conservando-se a mesma hierarquia. Esses diagramas podem ser visualizados através de ferramentas de ampliação, normalmente fornecidas pelos editores gráficos.

As transições são consideradas o único meio pelo qual um estado pode ser activado explícita ou implicitamente. Desta forma, a interacção e a evolução de um statechart são geridas por eventos internos ou externos que originam o disparo de transições e, subsequentemente, o relacionamento sequencial entre estados. Os eventos podem também estar associados às próprias transições através da execução de acções associadas ao seu disparo, como são o caso das transições "t9" e "t2" que têm associadas as acções “e11” e “e9” respectivamente. As transições são representadas por setas unidireccionais que ligam os estados origem aos estados destino. Algumas implementações (Statemate, Stateflow) do formalismo dos Statecharts permitem a utilização de transições compostas (combinação de segmentos de transições de modo a formar transições completas). Na presente proposta não são implementadas as transições compostas, considerando-se que, neste caso só têm um estado origem e um estado destino. Existem, porém, as transições denominadas default,

que só têm um estado destino e que são disparadas quando um estado OR é activado. Por exemplo, quando o estado “B1” é activado a transição default é disparada activando o seu estado destino, “B11”, que é considerado o estado default de “B”. A sintaxe genérica de rótulo de uma transição num statechart é “event[guard]/action”, onde event é uma expressão contendo os eventos necessários para que a transição ocorra, guard é uma expressão condicional que protege a transição inibindo-a do disparo caso o seu valor lógico seja falso. A expressão guard pode ser uma especificação de um domínio de uma variável, a avaliação dos componentes de um estado ortogonal ou pode ser usada para estabelecer prioridades nas transições. Em resumo, uma transição só pode ser disparada quando o seu estado origem estiver activo, ocorram os eventos definidos em

event e a expressão condicional guard seja verdadeira. O disparo duma transição provoca a

desactivação do seu estado origem e a activação do seu estado destino. Aquando do disparo duma transição, as acções definidas na expressão action são executadas. Estes mecanismos de geração de eventos, associados ao disparo de transições, permitem especificar comunicações entre componentes ortogonais e podem ser usados para a sincronização de tarefas concorrentes. Outro tipo de eventos é despoletado por acções externas, por exemplo, no caso de modelos de sistemas reactivos, devido a acções dos utilizadores da aplicação.