5.2 Kontrollutfordringer i relasjonen
5.2.3 Utfordringer ved rollefordelinger i relasjoner
A descrição textual de um SFC é composta por uma seqüência de diretivas que descrevem os elementos que compõem o diagrama. A ordem na qual as diretivas aparecem no texto é irrelevante. Entretanto, é aconselhável que essas diretivas sigam a mesma seqüência do diagrama, facilitando o eventual processo de manutenção do código.
Passo Inicial:
✁✂✁✄ ✁☎ ✆✝✄ ✞ ✟ ✠✂✡ ☛✞ ☞✡ ✞✝✄☎ ☞✡ ✁✂✌✁☎ ✆ ✍
✠✌✎ ☞✁✏✡ ✞☛ ✁ ✆ ✟☎ ✑☎ ☞✞ ✒✁✂✁✑ ☎ ☎ ✓✔✡ ✞✕ ✞✌✖✄☎ ☞☎ ✟✡ ✑ ✞✝✄ ✞ ✟☎ ✝✝✡ ✍ ✞✂☞✝✄ ✞ ✟
No processo de tradução é suposto que existe uma variável booleana declarada na interface de programação com o nome igual ao nome do estado. No programa em IL gerado, essa variável estará associada à atividade deste estado, ou seja, quando ela estiver verdadeira, o estado estará ativo e vice-versa. Cabe ao programador declarar esta variável na tabela de variáveis da interface de programação, pois o programa tradutor não faz isso automaticamente.
Passo regular:
✝✄ ✞ ✟ ✠✂✡ ☛✞ ☞✡ ✞✝✄☎ ☞✡ ✍
✠✌✎ ☞✁✏✡ ✞☛ ✁ ✆ ✟☎ ✑☎ ☞✞ ✒✁✂✁✑ ☎ ☎ ✓✔✡ ✞✕ ✞✌✖✄☎ ☞☎ ✟✡ ✑ ✞✝✄ ✞ ✟☎ ✝✝✡ ✍ ✞✂☞✝✄ ✞ ✟
Todos os comentários feitos sobre o estado inicial valem para o estado regular.
Forces:
Nas diretivas passo inicial e passo regular, opcionalmente, após o nome do estado, podem ser colocados os modificadores:
✒✡ ✑✌✞✡ ✂ ✠ ✗✁✄ ✒✡ ✑✌ ✞ ✡ ✂✍
: Faz que o estado modificado por esta expressão torne-se ativo quando o ✠ ✗✁✄ ✒✡ ✑✌ ✞ ✡ ✂✍
SFC, resultando daí o nome ✁ ✂✄ ☎ (forçar).
✁ ✂✄☎✁ ✆ ✝✞✟ ✁ ✂✄ ☎ ✁ ✠ : Faz que o estado modificado por esta expressão torne-se
inativo quando o ✆✝✞✟ ✁ ✂✄ ☎ ✁ ✠ for verdadeiro. Como no modificador anterior, isto
ocorrerá independemente da evolução normal do SFC.
O mecanismo de retorno implícito ao estado inicial seguro (X1) quando ocorre um erro, citado nos capítulos 6 e 7, usa esses modificadores.
Transição: ✡ ✟ ✂☛ ☞✌✞✟ ✞✁ ☞ ✆☞✁ ✍☎ ✎☛ ✟ ✂☛ ☞✌✞✏✑✁ ✠ ✂✁ ✍ ✆☎✌✟☛ ✎✁ ✁ ✂✞✒☎✍✠ ✆✄✓ ✎✞✒✁ ☎✍ ✞ ✔ ✕☛ ✂☛ ✎☎ ✞☞✞✂ ☛ ✄✁ ☞✎✞✏✑✁ ✎☛ ✟ ✂☛ ☞✌✞✏✑✁ ✠ ✡ ✟✁ ✆☎✌✟☛ ✎✁ ✎☎✌✟ ✞☞✁ ✠
Tal como nas diretivas anteriores, o programador deve declarar na interface de programação uma variável booleana com o mesmo nome da transição que irá indicar seu estado lógico no código IL gerado.
✆☎✌✟☛ ✎✁ ✁ ✂✞✒☎✍✠ se refere ao estado anterior à transição e ✆☎✌✟☛ ✎✁ ✎ ☎✌✟ ✞☞✁✠ se refere
ao estado posterior à transição. O tradutor não faz nenhum tipo de verificacão se os estados origem e destino existem. Uma transição pode ter vários estados de origem e/ou destino e este recurso é usado para implementarmos o paralelismo de operações apresentado mais adiante.
Existe uma restrição ao código em IL associado a uma transição: ele deve sempre deixar um valor booleano no topo da pilha interna do IL, para comunicarmos o estado booleano da condição associada à transição.
Temporização de transições:
Diretiva para facilitar a construção de transições disparadas por tempo. Tem a seguinte forma:
✖ ✗ ✘✙✚ ✛ ✜✢✣✤ ✘ ✗✣ ✗ ✘✙✚ ✛ ✥ ✦✧✣ ✤ ✜★✩✪ ✗ ✘ ✩ ✢✩✫✩✣✥ ✜✪ ✘✤ ✬✣ ✥ ✜ ✭✢✩✗✚ ✗ ✘✥ ✪ ✣ ✜ ★✩✪ ✧✘✮ ✭✙✪✚ ✗✣ ✥
✆☞✁ ✍☎ ✎✁ ✎ ☎✔☛ ✯✠: É o nome da variável temporizador que será usada em IL para
implementar este atraso. Será necessário que o programador declare na interface de programação esta variável.
✆✝✞✟ ✎☎ ✞☞ ✞✄ ✞✁✠: É a variável booleana que vai deflagrar o início da contagem do
temporizador. Caso esta variável não tenha ainda sido declarada, deve ser, então, incluída na lista de variáveis boolenas da interface de programação.
✆✟ ☎✍ ✕✁ ✠: Conjunto de dígitos que vai indicar quantas unidades de tempo irá durar o
atraso.Uma alternativa é colocar o nome de uma variável declarada na tabela de variáveis da interface de programação. Assim procedendo, a temporização irá durar o número de unidades
X1 ENTRADA1 X2 ENTRADA2 X3 ENTRADA3 SAIDA1 = 1 SAIDA2 = 1 SAIDA3 = 1 y1 y2 y3
Fig. B.1 Primeiro exemplo de SFC
correspondente ao valor acumulado nesta variável.
✁✂✄☎✆ ☎✝✞
: Pode ser uma das palavras: ✟ ✝✂ ✟ ✠✡ ☛ ✠ ✁✂☎ ✡ ou ✟ ✠☞ ✁ ✡ para indicar,
respectivamente, décimos de segundo, centésimos de segundo ou milésimos de segundo.
✌✄ ✟ ✍ ✝ ✡ ✁✎ ✟ ✆ ☎ ☞ ✞
: Variável booleana (geralmente bit auxiliar) que irá se tornar verdadeiro ao fim da contagem. Normalmente, este bit é usado numa transição temporizada.
B.2 Exemplos de representação textual de SFCs
No primeiro exemplo, iremos implementar um SFC seqüencial bastante simples, no qual existem três estados (X1, X2 e X3), um deles sendo o inicial. A condição de transição da atividade desses estados (Y1, Y2 e Y3) será dada por chaves conectadas nas entradas digitais do PLC (ENTRADA1, ENTRADA2 e ENTRADA3). Como ação associada a cada estado, iremos energizar uma saída digital correspondente a cada estado (SAIDA1 ou SAIDA2 ou SAIDA3) e desligar as outras duas.
✏ ✑✒ ✑✓ ✑✔ ✕✖✓ ✗✘ ✙ ✚ ✛✜✢ ✣✤✤ ✛ ✛✥✦✧ ✜✤ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✚ ✛✜✢ ✣✤✤ ✛ ✜ ✪★ ✛✥✦✧ ✜✤ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✫ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✬ ✏ ✗✒✭ ✖✓ ✗✘ ✏ ✓ ✮✔ ✒✖ ✑✓ ✑✯ ✒ ✰ ✚ ✱ ✮✯✲ ✙ ✚ ✛✜✢ ✣✤✤ ✛ ✪✳✩ ✴✧✜✧ ✚ ✏ ✓✯ ✙ ✫ ✏ ✖✓ ✗✘ ✙ ✫ ✛✜✢ ✣✤✤ ✛ ✛✥✦✧ ✜✤ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✫ ✛✜✢ ✣✤✤ ✛ ✜ ✪★ ✛✥✦✧ ✜✤ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✚ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✬ ✏ ✗✒✭ ✖✓ ✗✘ ✏ ✓ ✮✔ ✒✖ ✑✓ ✑✯ ✒ ✰ ✫ ✱ ✮✯✲ ✙ ✫ ✛✜✢ ✣✤✤ ✛ ✪✳✩ ✴✧✜✧ ✫ ✏ ✓✯ ✙ ✬ ✏ ✖✓ ✗✘ ✙ ✬ ✛✜✢ ✣✤✤ ✛ ✛✥✦✧ ✜✤ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✬ ✛✜✢ ✣✤✤ ✛ ✜ ✪★ ✛✥✦✧ ✜✤ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✚ ★✩✢ ✣✤✤ ✛ ★✧ ✥✜✧ ✫ ✏ ✗✒✭ ✖✓ ✗✘ ✏ ✓ ✮✔ ✒✖ ✑✓ ✑✯ ✒ ✰ ✬ ✱ ✮✯✲ ✙ ✬ ✛✜✢ ✣✤✤ ✛ ✪✳✩ ✴✧✜✧ ✬ ✏ ✓✯ ✙ ✚
X1 ENTRADA1 X2 ENTRADA2 X3 ENTRADA3 SAIDA1 = 1 SAIDA2 = 1 SAIDA3 = 1 y1 y2 y3 y4 ENTRADA4
Fig. B.2 Segundo exemplo de SFC
No segundo exemplo, é apresentado um grafo SFC em que existem dois caminhos paralelos não executados simultaneamente (divergência e convergência OU). A Fig. B.2 mostra o diagrama deste exemplo. Na listagem a seguir, está a transcrição textual do diagrama acima.
O estado X1 é estado de origem de mais de uma transição (Y1 e Y2) e é estado de destino de mais de uma transição (Y3 e Y4). Este é o mecanismo usado para descrevermos caminhos alternativos na seqüência de ativação de estados. ✁✂ ✄☎ ✄✆ ✝✞☎ ✟✠ ✡ ☛ ☞✌✍ ✎✏✏ ☞ ☞ ✁✑✒ ✌✏ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ☛ ☞✌✍ ✎✏✏ ☞ ✌ ✔ ✞ ☞ ✁✑✒ ✌✏ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ✕ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ✖ ✟✂✗ ✘☎ ✟✠ ☎ ✙✆ ✂✘ ✄☎ ✄✚ ✂ ✛ ☛ ✜ ✙✚✢ ✡ ☛ ☞✌✍ ✎✏✏ ☞ ✔✣ ✓ ✤✒ ✌ ✒ ☛ ☎✚ ✡ ✕ ☎ ✙✆ ✂✘ ✄☎ ✄✚ ✂ ✛ ✕ ✜ ✙✚✢ ✡ ☛ ☞✌✍ ✎✏✏ ☞ ✔✣ ✓ ✤✒ ✌ ✒ ✕ ☎✚ ✡ ✖ ✘☎ ✟✠ ✡ ✕ ☞✌✍ ✎✏✏ ☞ ✌ ✔ ✞ ☞ ✁✑✒ ✌✏ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ☛ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ✖ ☞✌✍ ✎✏✏ ☞ ☞ ✁✑✒ ✌✏ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ✕ ✟✂✗ ✘☎ ✟✠ ✘☎ ✟✠ ✡ ✖ ☞✌✍ ✎✏✏ ☞ ✌ ✔ ✞ ☞ ✁✑✒ ✌✏ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ☛ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ✕ ☞✌✍ ✎✏✏ ☞ ☞ ✁✑✒ ✌✏ ✞✓ ✍ ✎✏✏ ☞ ✞✒ ✁ ✌ ✒ ✖ ✟✂✗ ✘☎ ✟✠ ☎ ✙✆ ✂✘ ✄☎ ✄✚ ✂ ✛ ✖ ✜ ✙✚✢ ✡ ✕ ☞✌✍ ✎✏✏ ☞ ✔✣ ✓ ✤✒ ✌ ✒ ✖ ☎✚ ✡ ☛ ☎ ✙✆ ✂✘ ✄☎ ✄✚ ✂ ✛ ✥ ✜ ✙✚✢ ✡ ✖ ☞✌✍ ✎✏✏ ☞ ✔✣ ✓ ✤✒ ✌ ✒ ✥ ☎✚ ✡ ☛
X1 ENTRADA1 X2 X3 SAIDA1 = 1 SAIDA2 = 1 SAIDA3 = 1 y1 X4 SAIDA4 = 1
Fig. B.3 Terceiro exemplo de SFC
O objetivo do terceiro exemplo é descrever um grafo SFC em que existem dois caminhos paralelos executados em paralelo (divergência e convergência AND). A Fig. B.3 mostra o diagrama deste grafo. Usamos transicões com mais de um estado de destino (de Y1 para X2 e X3) ou com mais de um estado de origem (de X2 e X4 para Y3) para indicar que os estado X2 e X3 ou X4 entram em atividade simultaneamente. ✁✂ ✁✄ ✁☎ ✆✝✄✞ ✟ ✠ ✡ ☛☞✌ ✍✎✎ ☛ ☛✏✑✒ ☞✎ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✡ ☛☞✌ ✍✎✎ ☛ ☞ ✕✓☛✏✑✒ ☞✎ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✖ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✗ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✘ ✞✂✙ ✝✄✞ ✟ ✄ ✚☎ ✂✝ ✁✄ ✁✛✂ ✜ ✡ ✢ ✚✛✣ ✠ ✡ ☛☞✌ ✍✎✎ ☛ ✕✤✔ ✥✒ ☞✒ ✡ ✄ ✛ ✠ ✖ ✠ ✗ ✝✄✞ ✟ ✠ ✖ ☛☞✌ ✍✎✎ ☛ ☛✏✑✒ ☞✎ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✖ ☛☞✌ ✍✎✎ ☛ ☞ ✕✓☛✏✑✒ ☞✎ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✡ ✞✂✙ ✝✄✞ ✟ ✝✄✞ ✟ ✠ ✗ ☛☞✌ ✍✎✎ ☛ ☛✏✑✒ ☞✎ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✗ ☛☞✌ ✍✎✎ ☛ ☞ ✕✓☛✏✑✒ ☞✎ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✡ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✘ ✞✂✙ ✝✄✞ ✟ ✄ ✚☎ ✂✝ ✁✄ ✁✛✂ ✜ ✖ ✢ ✚✛✣ ✠ ✗ ☛☞✌ ✍✎✎ ☛ ✕✤✔ ✥✒ ☞✒ ✖ ✄ ✛ ✠ ✘ ✝✄✞ ✟ ✠ ✘ ☛☞✌ ✍✎✎ ☛ ☛✏✑✒ ☞✎ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✘ ☛☞✌ ✍✎✎ ☛ ☞ ✕✓☛✏✑✒ ☞✎ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✡ ✓✔✌ ✍✎✎ ☛ ✓✒ ✏☞✒ ✗ ✞✂✙ ✝✄✞ ✟ ✄ ✚☎ ✂✝ ✁✄ ✁✛✂ ✜ ✗ ✢ ✚✛✣ ✠ ✖ ✠ ✘ ☛☞✌ ✍✎✎ ☛ ✕✤✔ ✥✒ ☞✒ ✗
X1 T / X1 / 10 ds X2 T / X2 / 100 cs X3 T / X3 / 1000 ms SAIDA1 = 1 SAIDA2 = 1 SAIDA3 = 1 y1 y2 y3
Fig. B.4 Quarto exemplo de SFC
A topologia do quarto exemplo (mostrado na Fig. B.4) é semelhante à do primeiro exemplo sendo que as transições por chaves foram subtituídas por transições por tempo.
No diagrama acima, usaram-se nas transições a notação para temporizadores dada pela norma IEC848. Existem três elementos separados por barras ( / ). O primeiro é a letra T, para indicar temporização. O segundo elemento mostra qual variável booleana dispara o início da contagem de tempo. O terceiro é composto de um número e uma unidade de tempo indica quanto tempo o temporizador
deve contar antes de tornar sua saída verdadeira. As unidades usadas são décimos de segundo (ds), centésimos de segundo (cs) e milésimos de segundo (ms). O grafo do quarto exemplo irá ativar os estados X1, X2 e X3 em seqüência durante um segundo cada. Na descrição textual do quarto exemplo, foram acrescentados modificadores force nas diretivas initialstep e step. Isto faz com que X1 se torne ativo e os estados X2 e X3 se tornem inativos quando o bit ENTRADA4 se torna verdadeiro. O SFC volta a evoluir normalmente quando ENTRADA4 se torna falsa.
✁✂✁✄ ✁☎✆✝✄ ✞✟ ✠ ✡ ☛☞ ✌✍✞☞✂ ✞✂✄ ✌☎✎☎ ✏ ✑✒✓ ✔✕ ✕ ✑ ✑✖✗✘ ✒✕ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✡ ✑✒✓ ✔✕ ✕ ✑ ✒ ✛✙✑✖✗✘✒✕ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✜ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✢ ✞✂✎✝✄ ✞✟ ✎ ✞✆☎✣ ✎ ✡ ☛ ✌☞✤ ✠ ✡ ✡✥ ✄✞ ✂✄✦ ✝ ✄☞ ✘ ✧ ✠ ✡ ✄ ✌☎✂ ✝✁✄ ✁☞ ✂ ★ ✡ ☛ ✌☞✤ ✠ ✡ ✑✒✓ ✔✕ ✕ ✑ ✘ ✧ ✠ ✡ ✄☞ ✠ ✜ ✝✄ ✞✟ ✠ ✜ ☛☞ ✌✍✞☞ ☛☛ ✞ ✂✄ ✌☎✎ ☎✏ ✑✒✓ ✔✕ ✕ ✑ ✑✖✗✘ ✒✕ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✜ ✑✒✓ ✔✕ ✕ ✑ ✒ ✛✙✑✖✗✘✒✕ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✡ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✢ ✞✂✎✝✄ ✞✟ ✎ ✞✆☎✣ ✎ ✜ ☛ ✌☞✤ ✠ ✜ ✡✥✥ ✦ ✩✂✎ ✝ ✄☞ ✘ ✧ ✠ ✜ ✄ ✌☎✂ ✝✁✄ ✁☞ ✂ ★ ✜ ☛ ✌☞✤ ✠ ✜ ✑✒✓ ✔✕ ✕ ✑ ✘ ✧ ✠ ✜ ✄☞ ✠ ✢ ✝✄ ✞✟ ✠ ✢ ☛☞ ✌✍✞☞ ☛☛ ✞ ✂✄ ✌☎✎ ☎✏ ✑✒✓ ✔✕ ✕ ✑ ✑✖✗✘ ✒✕ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✢ ✑✒✓ ✔✕ ✕ ✑ ✒ ✛✙✑✖✗✘✒✕ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✡ ✙✚ ✓ ✔✕ ✕ ✑ ✙✘ ✖✒✘ ✜ ✞✂✎✝✄ ✞✟ ✎ ✞✆☎✣ ✎ ✢ ☛ ✌☞✤ ✠ ✢ ✡✥✥ ✥ ✄ ✦☞ ✩✝ ✄☞ ✘ ✧ ✠ ✢ ✄ ✌☎✂ ✝✁✄ ✁☞ ✂ ★ ✢ ☛ ✌☞✤ ✠ ✢ ✑✒✓ ✔✕ ✕ ✑ ✘ ✧ ✠ ✢ ✄☞ ✠ ✡