Professional Documents
Culture Documents
UNIVERSIDADE DA CORUNA
DEPARTAMENTO DE ELECTRNICA E SISTEMAS
TESE DE DOUTORAMENTO
A CORUA, 2004
AGRADECEMENTOS
Aos meus pais e mia irm, a enerxa da mia vida.
mia aboa Ofelia, o seu xeito de ollarme faime invencbel.
mia familia, cos que compartn mis ausencias que presencias, compensareivos.
A Marta, que gusta do Outono. Eu amo o Outono.
Aos meus amig@s, a cada un por unha razn e a tod@s pola mesma, sntome moi afortunado.
Ao meu director de tese, polo seu estmulo intelectual e a sa grande humanidade, algn da
outro mundo ser posbel.
Aos meus compaeiros de departamento, que sempre tiveron unha cara ambel diante dos meus
problemas, non sabedes canto agradezo a vosa paciencia.
A Woody Allen, el xa sabe por qu.
A !NUNCA MIS!
ndice
,
.
CAPITULO 1. INTRODUCCION ...................................................................................................25
1. 3. 4. PCCTS ................................................................................................................. 33
.,
.
.,
ndice
vi
2.3. 6. Integracin da ferramenta con outras aplicacins ............................................. SI
.
.
.
.
.
3.3.1.$. Regra $: Achvacin e desactivacin sunultnea dunha etapa .........................................7
3.3.2.4. Revisin dos postulados temporais baixo a hiptese de sincronismo forte ...................7$
vii
ndice
3.3.3.6. Combinacin de accins .....................................................................................................82
.
,.
. . .
,
, .
. .
4.1.2. Caracteristzcas semanticas ................................................................................
ndice
viii
.
4.2.3.2.2. Estructura xerrquica ...........................................................................
.
4.2.4.2.2. Estructura xerrquica ...........................................................................
.
4.2.5.2.2. Estructura xerrquica ........................................................................... 1
ix
ndice
.
. . . . . Estructura xerrquica ........................................................................... 132
ndice
,
.
211
6.3.1. Extensin da sintaxe C++ para inclur os operadores Grafcet ........................ 216
xi
ndice
6.3.3.3. Substitucin de varibeis ...................................................................................................227
,
,
7.1.2.3.2. Invocacin dos mtodos Suspend e Resume dende outro proceso....... 285
7.1.2.3.4. Inicio dunha operacin asncrona dende outro proceso ....................... 287
287
xii
ndice
311
312
313
314
.,
. ,
.
xiii
ndice
8.4.2. Obtencin de eventos de entrada ....................................................................... 357
389
............................................................................................. 391
ANEXO A.
ANEXO B.
ANEXO C.
ANEXO D.
ANEXO E.
,
GRAMATICA SORCERER .................................................................................421
,
,
ANEXO F.
ndice
xiv
Lista de figuras
Figura I.1: Arquitectura dunha ferramenta CACE dependente das ferramentas .................................... 29
Figura 1.2: Arquitectura de referencia para ferramentas CACE independentes das ferramentas.......... 29
Figura 2.6. Proceso de desenvolvemento dunha aplicacin coa ferramenta implementada . .................. SO
Figura 2. 7. Formas de integracin da ferramenta con outras aplicacins: a) mediante cdigo fonte
C++; b) mediante mdulos compilados; e c) mediante modelos baseados no
metamodelo Grafcet ............................................................................................................. 52
Figura 3.1. Representacin grfica de: (a) unha etapa inactiva; (b) unha etapa activa; (c) unha
etapa inicial . ........................................................................................................................ S7
Figura 3.4. Representacin grfica dunha transicin con receptividade asociada ................................. 58
Figura 3.5. Representacin grfica dunha accin coas tres seccins definidas polo estndar: (a)
Figura 3.6. Representacin grfica de varias accins asociadas mesma etapa: (a) en vertical; e
Figura 3.7. Representacin grfica de etapas: (a) fonte; e (b) sumidoiro ............................................... 60
Figura 3.8. Representacin grfica de transicins: (a) fonte; e (b) sumidoiro . ...................................... 60
Figura 3.9. Representacin grfica dunha: (a) macroetapa; e(b) a sa expansin . .............................. 60
Figura 3.17. Exemplo de sincronizacin: (a) a transicin 1 non est validada; (b) a transicin 1 si
xv
Lista de figuras
xvi
Figura 3.19. Representacin grfica dun semforo -etapa 30- que proporciona un mecanismo
Figura 3.20. Representacin grfzca dun semforo -etapa 200- que proporciona un mecanismo .
Figura 3.23. Representacin grfica dunha estructura que realiza: a) unha acumulacin; e b) unha
reserva . .. ... . . .. .... . . . ... . .. ... .......... ............. .. .... ... . .. ........ ... ........ ..... ..... ... ... .... ......... ... . ...... . . ... .... . 68
Figura 3.25. Estados dunha transicin: (a) transicin non validada; (b) transicin validada, e(c)
Figura 3.26. Franqueamento da transicin 1: (a) situacin anterior; e(b) situacin posterior ............. 70
Figura 3.27. Franqueamento simultneo das transicins 1 e 2: (a) situacin anterior; e(b)
Figura 3.28. Activacin e desactivacin simultnea da etapa 2: (a) situacin anterior; e(b)
Figura 3.33. Xogador ARS con das escalas de tempo baixo a hiptese de sincronismo forte ............... 77
Figura 3.34. Xogador ARS de modelos Grafcet con ordes de forzado . ................................................... 79
Figura 3.36. Posbeis interpretacins dun evento externo na escala de tempo interna: (a) como
Figura 3.37. Exemplo de interpretacins dun mesmo Grafcet considerando: (a) %b e TX3 na escala
externa; (b) ib na escala externa e%X3 na interna; (c) %^ na escala interna e%X3 na
Figura 3.51. Contidos da macro 100 que controla o proceso de taladrado dunha peaa ......................... 93
Figura 3.54. Interface externa dun bloque de control de accins . ........................................................ 100
Figura 3.56. Exemplo do uso dos bloques de control de accins: (a) SFC con distintos tipos de
Figura 3.57. Exemplos de: (a) SFC inseguro; e(b) SFC con etapas inalcanzbeis ..............................102
xvii
Lista de figuras
Figura 4.2 Grafcet utilizado para comprobar o manexo de eventos e varibeis durante as
Figura 4.3. Grafcet utilizado para comprobar a aplicacin das ordes de forzado durante as
Figura 4.4. Contidos do VI que proporciona a estructura dunha aplicacin GrafcetView (versin
multitarefa) . ..........................................................................................................:............112
Figura 4.5. Das posbeis interfaces para a animacin das evolucins dun grafcet no GrafcetView...115
Figura 5.3. Diagrama parcial das clases do metamodelo UML ............................................................ I57
Figura 5.6. Diagrama de clases do paquete Grafcet Core: elementos xerrquicos ............:..................164
Figura 5.12. Diagrama das clases que implementan a declaracin de varibeis . ................................181
Figura 5.13. Diagrama das clases que implementan accins e receptividades .....................................181
Figura 5.14. Diagrama das clases abstractas que dan soporte estructura dos modelos Grafcet.......182
Figura S.1 S. Diagrama das clases que implementan a estructura dos modelos Grafcet .......................183
Figura 5:16. Secuencia de mensaxes da insercin dun nodo nun grafcet parcial . ................................187
Figura 5.17. Secuencia de mensaxes da insercin dun nodo nun grafcet conexo ..................................188
macroetapa . .......................................................................................................................189
Figura 5.19. Secuencia de mensaxes da insercin dunha macroetapa nun grafcet parcial . .................190
Figura 5.21. Secuencia de mensaxes da eliminacin dun grafcet conexo do modelo ............................191
Figura 5.22. Secuencia de mensaxes da modifccacin do identificador dun nodo includo nunha
macroexpansin . ................................................................................................................192
proposto . .. . . . .. .. . .... . ...... . . ....... ... ..... .. .... ............ ..... .... . ..... . . .. .... .... . . ......... .... ....... .. ...... .... .......197
proposto . . .... . ...... .... . ....... ..... ... ... .. .... . ... .. . ... .. .... .. . ....... ........ . . . .... .... .. .. ... ..... .. . .. . ..... ... .... ..... ...199
Figura 5.29. Exemplo de: a) ordes de forzado; e b) representacin co metamodelo proposto . ............ 200
Figura 6.2. Estructura de directorios utilizada polo compilador Grafcet . ............................................ 205
Figura 6.3. Diagrama de clases da estructura de fases do compilador Grafcet .................................... 208
Figura 6.4. Diagrama de clases das fases simples do compilador Grafcet . .......................................... 211
Lista de figuras
xviii
Figura 6.5. Diagrama de clases das fases compostas do compilador Grafcet . ..................................... 211
Figura 6.8. Diagrama de clases da informacin utilizada para a execucin dun modelo Grafcet. ...... 232
Figura 7.2. Diagrama das clases que definen os mdulos e as sas funcionalidades ........................... 272
Figura 7.4. Diagrama de estados do ciclo de vida dun proceso da mguina virtual . ........................... 283
Figura 7.5. Diagrama das clases gue modelan o mecanismo de paso de mensaxes entre procesos. .... 288
Figura 7.6. Secuencias de mensaxes intercambiadas no envo e recepcin dunha mensaxe ................. 289
Figura 7.9. Diagrama das clases que modelan a arquitectura da mquina virtual . ............................. 297
Figura 7.10. Diagrama das clases que modelan os subsistemas da mquina virtual ............................ 297
Figura 7.11. Diagrama das clases que modelan a configuracin dun dispositivo de E/5 ..................... 300
Figura 7.12. Diagrama de obxectos da informacin de configuracin dunha porta serie .................... 305
Figura 7.13. Conexins dos xestores de E/S da mquina virtual ........................................................... 309
Figura 7.14. Diagrama das clases que modelan os xestores de E/5 ...................................................... 310
Figura 7.1 S. Tcnicas para a simulacin de E/S na mquina virtual: a) utilizando un xestor de E/S;
Figura 7.18. Formato das mensaxes utilizadas para o intercambio de informacin de simulacin. .... 314
Figura 7.20. Diagrama das clases utilizadas para modelar un mediador ............................................. 31 S
Figura 7.21. Diagrama das clases utilizadas para implementar o mediador TCP/IP ........................... 316
Figura 7.23. Diagrama das clases utilizadas para a implementacin dun "driver" TCP/IP de
Figura 7.25. Diagrama de clases para a asignacin de varibeis no "driver" de simulacin ............. 320
Figura 7.27. Diagrama das clases que modelan a base de datos de E/5 ............................................... 324
Figura 7.28. Secuencia das mensaxes intercambiadas na creacin dunha nova entrada na BD.......... 325
Figura 7.29. Secuencia das mensaxes intercambiadas no procesamento das mensaxes recibidas
Figura 7.30. Servicios proporcionados polo temporizador bsico: a) temporizacin con bloqueo;
xix
Lista de figuras
Figura 7.32. Formato das mensaxes utilizadas no acceso remoto aos servicios da mquina virtual. .. 331
Figura 7.33. Tipos de mensaxes utilizadas no acceso remoto aos servicios da mquina virtual. ......... 331
Figura 7.34. Protocolo de intercambio de mensaxes no acceso remoto aos servicios da mquina
virtual: a) orde simple sen resposta (resultado correcto); b) orde simple sen resposta
(resultado errneo); c) orde simple con resposta; e d) orde mltiple sen resposta
Figura 7.35. Diagrama das clases utilizadas para modelar o acceso dun cliente aos servicios
Figura 7.36. Clases utilizadas para modelar o acceso dun cliente a mltiples mquinas virtuais en
Figura 7.37. Secuencia de mensaxes intercambiadas no acceso aos servicios remotos da mquina
Figura 7.38. Secuencia das mensaxes intercambiadas para a creacin dunha conexin coa
Figura 7.39. Secuencia das mensaxes intercambiadas para a solicitude de carga dunha DLL na
Figura 7.40. Secuencia das mensaxes intercambiadas para o procesamento dun evento detectado
Figura 7.41. Secuencia das mensaxes intercambiadas para o procesamento dun evento detectado
Figura 8.2. Diagrama das clases utilizadas para implementar a estructura do intrprete Grafcet...... 350
Figura 8.3. Diagrama de clases dos mdulos utilizados para configurar o intrprete Grafcet. ........... 3S1
Figura 8.6. Secuencia de mensaxes da obtencin de novos eventos de entrada .................................... 357
Figura 8.7. Secuencia de mensaxes da evolucin inicial dun modelo Grafcet . ..................................... 3S8
Figura 8.8. Secuencia de mensaxes da evolucin externa dun modelo Grafcet ..................................... 3S9
Figura 8.9. Secuencia de mensaxes da actualizacin das sadas do proceso . ....................................... 360
Figura 8.10. Secuencia de mensaxes da evolucin interna dun modelo Grafcet . .................................. 361
Figura 8.12. Diagrama das clases utilizadas para modelar un xogo Grafcet . ...................................... 363
Figura 8.1 S. Semntica dos temporizadores: a) non redisparbel; e 6) redisparbel . ......................... 375
Figura 8.17. Efecto da latencia de resposta no control dun temporizador: a) comportamento ideal;
Figura 8.18. Secuencia de mensaxes para a xestin das temporizacins Grafcet . ................................ 379
Figura 8.19. Diagrama de estados dun temporizador Grafcet con latencias de resposta ..................... 380
Figura 8.20. Relacin temporal entre o tempo de activacin dunha etapa e o dunha asociacin
asociada a ela: a) TD _< TL _< T(Xi); b) TD _< T(Xi) S TL; e c) T(Xi) _< TD _< TL. ........ 383
Figura 8.21. Semntica temporal dos `flags" dos diferentes tipos de asociacins ............................... 384
Figura 8.22. Semntica temporal dos `Jlags " das asociacins impulsionais ........................................ 385
Figura 8.23. Secuencias de mensaxes da implementacin dos mtodos que acceden aos valores das
Figura B.1. Diagrama de clases dos contedores implementados na librara . ....................................... 401
Figura B.2. Diagrama de clases das varibeis e declaracins implementadas na librara . ................. 406
Lista de tboas
Tboa 3-II. Entradas, sadas e contadores utilizados na automatizacin do posto de fabricacin de bridas..... 93
Tboa 3-V Entradas e varibeis utilizadas na automatizacin da cela de fabricacin flexibel . ............ 95
Tboa 3-VI. Significado do estado de activacin das etapas do Grafcet do robot 1 . ..............................95
Tboa 4-I. Accins que controlan a execucin dos SFCs dependentes no IsaGraph . ...........................122
Tboa 4-III. Sintaxe das accins que modifican directamente o valor dunha varibel no AutomGen. .133
Tboa 4-VII. Resume dos resultados da anlise: funcionalidades das aplicacins ............................... l SO
Tboa 4-VIII. Resume dos resultados da anlise. funcionalidades das aplicacins (continuacin). ....1 Sl
Tboa 4-IX. Resume dos resultados da anlise: caractersticas Grafcet soportadas . ............................152
Tboa 4-X. Resume dos resultados da anlise: caractersticas Grafcet soportadas (continuacin)......153
Tboa S-I. Notificacins relacionadas coa modificacin da estructura dun modelo Grafcet . ..............185
Tboa S-II. Notificacins relacionadas coa identificacin de elementos dun modelo Grafcet ..............186
Tboa 6-I. Valores dos atributos in_condition e timers_allowed nas fases compostas do compilador Grafcet.... 213
Tboa A-II. Caractersticas das transicins e das condicins de transicin . ........................................ 395
Tboa F-I. Cdigos das mensaxes dos servicios de acceso remoto da mquina virtual .................:...... 433
Glosario de abreviaturas
AFCET
ANDECS
ANSI
ANTLR
ARS
AST
CACE
CACSD
CASE
CIM
CIMOSA
CLADP
COCA
CORBA
CSMP
CSSL
DAIS
DCOM
DDC
DDE
DEDS
DLL
DOS
E/S
FBD
GEMMA
GNU
GRAFCET
GRAI
GIM
HDCCS
HMI
ICAM
IDEF
IDN
IEC
IL
ISO
xxiii
Glosario de abreviaturas
JIT
LD
MFC
MIS
MMS
MOF
OCL
OLE
OMT
OPC
PC
PCCTS
PERA
PiCSI
PID
PLC
POU
RdP
RdPI
RNA
RTC
RTOS
RTTL
SA/RT
SADT
SCADA
SFC
SLICE
SLICOT
SRS
SSEE
ST
STL
TCCS
TCP/IP
TIC
TML
TTM
^UML
VEE
VI
VPU
XML
Just In Time
Ladder Diagram
Microsoft Foundation Classes
Management Information System
Manufacturing Message Specification
Meta Object Facility
Object Constraint Language
Object Linking and Embedding
Object Modelling Technique
OLE for Process Control
Personal Computer
Purdue Compiler Construction Tool Set
Purdue Enterprise Reference Architecture
Process Control Systems Integration
Regulador con accin Proporcional, Integral e Derivativa
Programmable Logic Controller
Program Organization Unit
Rede de Petri
Rede de Petri Interpretada
Rede de Neuronas Artificiais
Run To Completion
Real Time Operating System
Real Time Temporal Logic
Structured Analysis / Real Time
Structured Analysis and Design Technique
Supervision, Control And Data Acquisition
Sequential Function Chart
Subroutine Library for Control Engineering
Subroutine Library in Systems and Control Theory
Sans Recherche de la Stabilit
Sistema Experto
Structured Text
Standard Template Library
Timed Calculus for Communicating Systems
Transmission Control Protocol/Internet Protocol
Target Independent Code
Timed Modal Logic
Timed Transition Model
Unified Modelling Language
Virtual Engineering Environment
Virtual Instrument
Visual Pascal Unit
Extensible Markup Language
xxiv
Captulo 1 . Introduccin
1.1. Motivacin
Na actualidade o desenvolvemento de "software" para a implementacin de sistemas de
control por computador unha tarefa realmente complexa para a que os enxeeiros de control
requiren da asistencia de ambientes "software" especializados. Os factores que afectan
complexidade dos sistemas de control son mltiples, entre outros:
1. As tecnoloxas aplicadas nos procesos industriais son cada vez mais complexas.
2. As actividades de control automatizadas son cada vez mais numerosas e ocupan un nivel
cada vez mais alto na xerarqua de control.
3. O nmero de posibilidades tecnolxicas das que se dispn para a realizacin do sistema de
control cada vez maior.
4. A cantidade de aspectos tecnolxicos alleos enxeera de control que preciso
considerar, principalmente os relacionados coas tecnoloxas da informacin e as
telecomunicacins, incremntase a un ritmo que fai moi dificil `estar ao da'.
5. Os sistemas incorporan un nmero cada vez maior de requisitos adicionais aln dos
relacionados directamente co control, como a integracin cos sistemas de informacin da
empresa, interfaces grficas avanzadas, xestin de modelos, simuladores, xestin de
mltiples configuracins, portabilidade, etc.
Os ambientes "software" que proporcionan asistencia ao desenvolvemento de "soflware"
para sistemas de control reciben o nome de ambientes CACE^, e son definidos como [26]: `a
aplicacin do modelado e simulacin asistidos por computador para o deseo e
implementacin de sistemas de control ^realimentadosJ'. Estes ambientes caracterzanse por
^ O termo CACE utilizado na actualidade para indicar a evolucin das ferramentas CACSD a ambientes que
proporcionan asistencia integrada por computador en todas as fases do ciclo de vida dun sistema de control, de
xeito semellante s ferramentas CASE na enxeeria do "software".
25
Captulo 1: Introduccin
26
27
Captulo 1: Introduccin
28
29
Intertace
de usuarlo
Linguaxe
de comandos
SupeMsor
Comandos e datos
\da ferramenta
Ferramenta
Ferramenta
Ferramenta
Figura 1.2: Arquitectura de referencia para ferramentas CACE independentes das ferramentas.
Captulo 1: Introduccin
30
31
Ademais das lias de investigacin anteriores existen outras mis relacionadas cos mtodos
formais utilizados nos ambientes CACE, como por exemplo:
A busca de novos mtodos para a anlise e sntese de sistemas de control mediante
algoritmos numricos, simblicos ou "soft-computing".
A proposta de novos mtodos para a modelado e simulacin de sistemas continuos, de
eventos discretos ou hbridos.
O estudio de novos mtodos de optimizacin multiobxectivo para a anlise e o deseo do
sistema.
1.2. Obxectivos
A finalidade do traballo realizado nesta tese de doutoramento a de desear e implementar
unha ferramenta que proporcione asistencia aos enxeeiros de control no desenvolvemento de
"software" para sistemas industriais e que poda ser integrada nun ambiente de
desenvolvemento heteroxneo, no que se combinen diferentes mtodos e formalismos que
proporcionen asistencia durante todo o ciclo de vida do sistema de control. En concreto a
ferramenta proposta combina un formalismo grfico para a especificacin de controladores
lxicos secuenciais, o Grafcet, cunha aproximacin orientada a obxecto. As funcionalidades
que implementa inclen a estructuracin, modelado e simulacin das secuencias lxicas que
describen o comportamento dos sistemas de control complexos, a integracin de modelos
desenvolvidos con outras ferramentas, e a xeracin automtica de cdigo para a execucin da
aplicacin en arquitecturas de control distribudas e heteroxneas. O desenvolvemento de
"software" para a superyisin e control de DEDS e certos tipos de sistemas hbridos (p.e.
sistemas "batch") son exemplos de posbeis aplicacins da ferramenta.
Captulo 1: Introduccin
32
33
indicados, que son ben coecidos e non requiren maior explicacin, utilizronse outros que se
describen a continuacin.
1.3.1. SGI STL
Implementacin libre da librara STL [123][11] da empresa Silicon Graphics. A STL unha
librara C++ xenrica que proporciona unha implementacin baseada no uso de "templates" das
estructuras de datos mis habituais (listas, colas, conxuntos, etc.) e os algoritmos que permiten
manexalas.
1.3.3. Sidoni
Sidoni [ 146] unha aplicacin para a simplificacin de expresins booleanas extendidas,
nas que ademais dos operadores do lxebra de Boole se utilicen os operadores de evento (T e
^). Esta aplicacin utilizada durante a compilacin dos modelos Grafcet para converter as
expresins con eventos complexas, nas que os eventos afectan a expresins, en expresins con
eventos simples, nas que os eventos afectan unicamente a varibeis.
1.3.4. PCCTS
PCCTS [135] un conxunto de tres ferramentas para a xeracin automtica de analizadores
sintcticos e traductores en C++: DLG, un xerador de analizadores lxicos; ANTLR, un
xerador de analizadores sintcticos pred-LL(k), con k>1 (analizador descendente con
predicados semnticos); e SORCERER, un traductor de rbores sintcticas abstractas (ASTs).
1.4. Sumario
Os contidos desta tese de doutoramento estructranse da maneira seguinte:
No Captulo 2 presntase as ideas principais nas que se basea o traballo realizado e
describese a ferramenta proposta.
No Captulo 3 detllase a sintaxe e semntica do Grafcet, realzase unha comparacin con
outros formalismos, faise unha introduccccin ao estndar IEC 61131-3 e ao SFC e
mostranse algns exemplos de modelado con Grafcet.
No Captulo 4 clasificanse e analzanse diferentes tipos de ferramentas para o
desenvolvemento de sistemas de control que utilicen algunha variante do Grafcet.
Captulo 1: Introduccin
34
Captulo 2 . Fundamentos e
descricin da ferramenta
proposta
35
36
enerxa [87]. Unha clasificacin habitual dos procesos industriais divdeos en tres categoras
dacordo forma en que se obtn o producto:
1. Procesos continuos, nos que se obtn un fluxo continuo de producto.
2. Procesos "batch ", nos que o producto se fabrica por lotes ou coadas.
3. Procesos de fabricacin ou ensamblaxe de compoentes, nos que se obteen cantidades
discretas de producto.
Na prctica un sistema industrial est formado por unha combinacin de procesos, e anda
que estea caracterizado principalmente pola presencia maioritaria dos pertencentes a unha das
categoras anteriores, con frecuencia inclen tamn procesos pertencentes s outras.
Os equipamentos que forman parte dun sistema industrial poden clasificarse funcionalmente
en das categoras: o equipamento de proceso e o equipamento de operacin. O equipamento
de proceso frmano os dispositivos flsicos utilizados para transportar, transformar e almacenar
os productos e a enerxa; mentres que o equipamento de operacin est formado polos
dispositivos que asisten ao persoal no manexo do equipamento de proceso. Como parte do
equipamento de operacin poden considerarse tanto os sistemas de control como os de
informacin de xestin da empresa.
Os equipamentos de proceso e contrl agrpanse dende un punto de vista funcional para
formar unidades de proceso [87]. Cada unidade pode realizar unha ou varias operacins e
habitualmente estar composta por un elemento de proceso relevante (un decantador, un
depsito, un reactor, etc.) e o equipamento auxiliar para o seu manexo (vlvulas, motores,
reguladores, etc.). A Figura 2.1 mostra a estructura xenrica dunha unidade de proceso na que
se combinan equipamentos de proceso e control e se intercambian prod-uctos, enerxa e
informacin con outras unidades. A estructura fisica dun sistema industrial poden representarse
mediante a conexin de mltiples unidades de proceso como a mostrada. Ao conxunto de
unidades que funcionan coordinadamente para a produccin dun ou varios productos se lle
denomina cela de produccin.
:^^^^ enencia
:..................:................. ^ ^^^.........
:
.
Equipamento
de control
= - - - --..._......---------- - ..;
sensores
actuadores `
(ordes) ^ ^ (estado)
................................................^......._;
:
Productos
sen elaborar
Equipamento
de proceso
coordinacibn
Productos
elaborados
37
Fbrica
Area
Cela /
Controlador /
Equipamento
^ Xestin ^
da produccion
Planificacin
de tarefas
Control de coordinacin
Equipamento de control
Equipamento de proceso
+ reactividade
38
1.
O control bsico, que o utilizado para activar e manter un estado determinado nun
equipamento ou proceso. O control bsico incle:
a. A regulacin de magnitudes do proceso arredor dun valor de consigna, realizada
mediante os clsicos lazos de control xeralmente implementados mediante reguladores
PID e nos que se utilizan diferentes configuracins ben coecidas: regulacin simple,
en cascada, por adianto, de relacin, selectivo ("override"), etc.
b. O control discreto ("ON/OFF"), realizado mediante rels e utilizado para producir un
cambio no estado do equipamento de proceso (acendido/apagado de motores,
apertura/peche de vlvulas, etc). O diagrama de contactos a representacin grfica
utilizada tradicionalmente para expresar a lxica booleana do control discreto. Os
PLCs foron inicialmente deseados coa finalidade de executar a lxica dos diagramas
de contactos, substitundo as s implementacins cableadas ou pneumticas anteriores.
c. O control secuencial, baseado no control discreto aplicado en procesos cuxa lxica
de funcionamento consiste na realizacin de operacins organizadas en secuencias
ordenadas de pasos. Este o tipo de control que habitualmente se utiliza en procesos de
fabricacin, ensamblaxe e almacenamento de pezas, no control da secuencia de
fabricacin en procesos "batch" e no control do arranque e a parada de procesos
continuos.
d. A monitorizacin, que consiste na obtencin de informacin sobre o estado e evolucin
do proceso e os eventos que se detecten.
e. O manexo de excepcins, que consiste na automatizacin das accins a realizar para
recuperar un proceso cando se detecta un evento ou condicin anormal.
2.
3.
39
A aproximacin do modelo non lineal dun proceso continuo mediante varios modelos
lineais entre os que se conmuta en funcin de determinadas condicins.
A estructuracin xerrquica do sistema de control utilizando modelos abstractos nos
niveis superiores que son simplificacins discretas dos modelos continuos dos niveis
inferiores.
PLC con
RTOS
;
I^I
^^
Computador
con RTOS
Computador
con RTOS
LAN industrial
- PLC con
R^
Bus de campo
Sensores/Actuadores
40
20 O concepto de empresa utilizado nestas arquitecturas nun sentido amplo, que inclue ao de sistema industrial
definido anteriormente (2.1.1).
41
3. A dimensin das vistas, que son descricins que se concentran en aspectos particulares da
empresa co obxectivo de reducir a complexidade:
a. A visin funcional, que proporciona unha descricin xerrquica das funcins, do
comportamento e da estructura funcional da empresa.
b. A visin da informacin, que proporciona unha descricin estructurada dos obxectos da
empresa identificados nas outras vistas.
c. A visin dos recursos, que proporciona unha descricin da organizacin dos recursos
da empresa.
d. A visin organizativa, que proporciona unha descricin da estructura organizativa da
empresa.
O nmero de vistas non fixo e as vistas non son modelos en si mesmas senn diferentes
puntos de vista do modelo da empresa. O proceso da sa obtencin para cada nivel de
modelado denomnase refinamento por xeracin.
Unha das caractersticas definitorias destas arquitecturas o papel central que adquire a
actividade de modelado e o interese por conseguir a infraestructura que permita dispor de
modelos parciais estandarizados que podan ser reutilizados adaptndoos aos aspectos
particulares de cada sistema. Isto permitira avanzar cara a unha situacin equiparbel que se
da noutras reas como a electrnica ou a enxeera do "software" baseada en compoentes: a
existencia de ambientes abertos que posibiliten o desenvolvemento de arquitecturas
consistentes, modulares e flexbeis mediante a conexin de mdulos estandarizados
dispobeis en forma de libraras ou mdulos "software" precompilados (aproximacin "plug
and-play" [139]).
42
43
44
4. A portabilidade dos modelos, que poden ser compartidos entre diferentes plataformas.
5. A expresividade da orientacin a obxectos, que utiliza un concepto uniforme en diferentes
niveis de detalle e fases do ciclo de vida do sistema. ademais poden obterse versins
executbeis dos modelos de maneira natural utilizando unha linguaxe de programacin
orientada a obxecto.
6. A consistencia entre os distintos puntos de vista do modelo.
7. A dispoibilidade dunha linguaxe unificada de modelado (UML [29]) e dunha
infraestructura de execucin distribuda (CORBA [126]) estandarizadas.
8. A dispoibilidade de multitude de metodoloxas, mtodos, linguaxes e ferramentas para a
anlise, deseo, simulacin e programacin orientada a obxectos.
Como exemplos da aplicacin da aproximacin orientada a obxectos en sistemas industriais
^
poden citarse os seguintes:
45
46
b.
c.
Estas estructuracins estn baseadas na definicin orixinal do Grafcet [84], que estaba
dirixida especificacin de controladores lxicos nos que as varibeis utilizadas eran
unicamente de tipo booleano. Recentemente a revisin do estndar [85] adoptou as
propostas de [75] e[76] para ampliar a aplicabilidade do Grafcet a sistemas hbridos.
Aplicacins do Grafcet na estructuracin do control de sistemas hbridos e"batch" son
descritas en [172] e [95], respectivamente.
4. O estndar Grafcet non incle un medio de representar comportamentos xenricos a partir
dos que poidan derivarse modelos particulares. Existen propostas baseadas en
aproximacins orientadas a obxecto que inclen esta capacidade: parametrizacin de
grafcets, macroetapas e procedementos en [94] ou herdanza e agregacin de modelos
dinmicos en [157].
J ^soo', C
Bool
Real
Control contnuo
Control contnuo
-1 (p . e . posicionador
brazo robotizado)
(p.e. posicionador
brazo robotizado)
(a)
(b)
(c)
Figura 2.4. Formas de estructurar un sistema de control utilizando Grafcet: a) o Grafcet utilizado nalgn dos
mdulos que forman o sistema de control; b) o Grafcet utilizado para a coordinacin dos mdulos do sistema de
control; e c) o sistema de control especificado completamente utilizando o Grafcet.
47
48
22
AnyStates un producto da compaa XJ Technologies. http://www.xjtek.com/
49
propn a utilizacin do SFC para a descricin detallada das accins estticas nos estados
dun StateChart pode consultarse en [ 19J.
6. Ambientes de programacin SFC/Grafcet. Existe unha variedade de ferramentas
dispobeis na actualidade, orientadas sobre todo programacin de PLC's ou "softPLCs",
que inclen o SFC ou algunha versin mis ou menos completa do Grafcet como^ linguaxe
grfica de programacin. Algunhas destas aplicacins son analizadas en detalle no Captulo
4. As principais aportacins da ferramenta proposta, considerando as conclusins extradas
da anlise realizada nese captulo, son as seguintes:
a.
b.
c.
d.
e.
Definese un metamodelo para o Grafcet relacionado co da UML que pode ser utilizado
como formato de intercambio dos modelos Grafcet entre aplicacins ou para integrar o
Grafcet en ambientes CASE baseados en LJML e utilizalo as como alternativa para a
especificacin do comportamento das compoentes dinmicas dos modelos.
As funcionalidades para a representacin, compilacin, simulacin e execucin de
modelos Grafcet poden ser utilizadas de maneira integrada dende o editor grfico da
ferramenta ou de maneira independente dende outras ferramentas que utilicen os
mecanismos de integracin indicados en (2.3.6).
A interpretacin de modelos pode ser configurada para elixir o algoritmo a utilizar e a
fonma en que os eventos, varibeis e accins sern considerados durante as evolucins
internas utilizando interpretacins semnticas ben definidas ( 3.3.2).
Disponse dun ambiente de execucin (a mquina virtual) flexbel, portbel, escalbel e
configurbel dinamicamente, que facilita a aplicabilidade en ambientes distribudos e
heteroxneos. Ademais a sa funcionalidade non se limita interpretacin de modelos
Grafcet, senn que proporciona os mecanismos bsicos (xestin de eventos,
temporizacins e varibeis de E/S) que permitirn integrar intrpretes doutros
formalismos DEDS en futuras versins.
A linguaxe de programacin de accins utilizada o C++, o que posibilita a utilizacin
do grande nmero de libraras externas existentes e que, conxuntamente co
meetamodelo Grafcet definido, permiten integrar o Grafcet cunha aproximacin
orientada a obxecto no desenvolvimento de "software" para sistemas de control
industrial.
50
incluir certas funcionalidades que non foron consideradas na versin actual, como por exemplo
a edicin simultnea de modelos, asistencia compilacin e distribucin automtica de
aplicacins en redes heteroxneas, ou o intercambio de informacin de estado entre mquinas
virtuais.
^
Modelos
Grafcet
Ambiente de desenvolvimento
odelos
rafcet
compilados
Hardware/Sistema Operativo
Ambiente de
desenvolvimento
Compilador GrafceUC++
^
Modelos
Grafcet
compilados
^
odelos
rafcet
^
Editor Grafcet
Hardware/Sistema Operativo
Mquina Vrtual
(b)
(a)
Aplicacin de usuario
^ Depurador ;
'------------ --^
Xstor
Confi uracin
Intrprete Grafcet
gase de datos
^^ Simulador ElS ;^
'--------------
P estor
Tem orizadores
Xestor
Eventos
M3quina virtual
Subsistema de E/S
Hardware/Sistema Operativo
(c)
Figura 2.5. Arquitectura da ferramenta proposta: a) subsistema de desenvolvemento; b) configuracin co
Ed itor
Grafcet
51
No editor grfico o enxeeiro utiliza unha combinacin de C++ e Grafcet para modelar a
estructura do sistema de control a diferentes niveis de abstracin e dende diferentes puntos de
vista. O cdigo C++ utilizado para estructurar os modelos pode codificarse manualmente ou
importarse o xerado automaticamente cunha ferramenta CASE externa. Os mtodos definidos
nas interfaces pblicas das clases que compoen os modelos poden ser utilizados dende o
cdigo de accins e condicins, que tamn ser programado en C++. O Grafcet utilizado no
editor para a especificacin das secuencias de estados de operacin (2.1.1) das compoentes
identificadas nos modelos, s como para a descricin detallada da lxica secuencial deses
estados. As colaboracins entre compoentes e a dinmica global do sistema de control tamn
son modeladas mediante Grafcet.
O editor proporciona asistencia durante a edicin grfca dos modelos Grafcet, facilitando a
sa estructuracin, a sa verificacin sintctica, a codificacin de accins e condicins e a
declaracin das varibeis utilizadas. Unha vez finalizada a edicin obtense unha versin
executbel do modelo mediante o compilador Grafcet. Este converte o modelo Grafcet a unha
representacin C++ equivalente e utiliza un compilador C++ externo para obter unha versin
compilada en forma de DLL. O compilador C++ utilizado pode ser un compilador nativo ou
cruzado, dependendo de se o sistema operativo do equipo no que se executa a mquina virtual
coincide ou non co do equipo no que se executa o subsistema de desenvolvemento.
A versin executbel do modelo pode utilizarse tanto para a validacin do sistema
(simulando as E/S) como para o control do proceso. A mquina virtual pode ser configurada
para axustar os tempos de resposta do sistema dependendo dos requisitos temporais do proceso.
Ademais a mquina virtual implementa un modo de depuracin que permite visualizar no
editor grfco o estado de evolucin do modelo Grafcet e que pode ser utilizado dende
aplicacins externas para a implementacin dunha interface grfica de operador que permita a
monitorizacin e a supervisin do proceso durante a sa operacin.
Ntese que o proceso descrito anteriormente pode repetirse mltiples veces durante o
desenvolvemento dunha aplicacin, xa sexa en fases diferentes (p.e. anlise, deseo,
implementacin, probas, operacin, mantemento); con distintos niveis de refinamento (p.e.
especificacin inicial, especificacin detallada, implementacin); ou concentrndose en partes
diferentes dun mesmo modelo. A ferramenta utilzase de maneira uniforme nas diferentes fases
e niveis de abstraccin, o que a fai especialmente indicada para procesos de desenvolvemento
de "software" iterativos baseados na construccin e refinamento progresivo de modelos
grficos executbeis.
52
externa
__--- '""
_ Cdigo C/C++
dos modelos
; 4InP0/fan
(a)
^---;N
Aplicacin
externa
Verifican/Anlise
^Mtmodlo
^ Grafcet
^------^
(C)
Cdigo obxecto
dos modelos .^
.
Editor
Grafcet
Modelos
Grafcet
^
^
^
^
^
^
;
'
<enlazan ;
^
Compilan
Compilador _______^
Grafcet/C++
Modelos Grafcet
compilados (DLLs)
(b)
Figura 2.7. Formas de integracin da ferramenta con outras aplicacins: a) mediante cdigo fonte C++; b)
2.4. Conclusins
Neste captulo explicronse as funcionalidades bsicas da ferramenta proposta nesta tese de
doutoramento introducndose a sa arquitectura lxica, a sa utilizacin no proceso de
desenvolvemento dunha aplicacin e os mecanismos de integracin con outras aplicacins nun
ambiente heteroxneo de desenvolvemento de "software" de control industrial. As
caractersticas da orientacin a obxectos e o modelado de istemas dinmicos de eventos
discretos foron situadas en contexto dentro do proceso mis xenrico da enxeera de sistemas
industriais utilizando unha aproximacin baseada na dispoibilidade de modelos reutilizabeis.
53
Ca p tu l o 3. O G rafcet
3.1. Introduccin
O Grafcet un formalismo grfico baseado nas RdP definido co propsito de dispor dun
medio normalizado de descricin de controladores lxicos que fora independente da tecnoloxa
utilizada na sa implementacin. Foi inicialmente proposto pola AFCET [ 1], unha asociacin
francesa formada a partes iguais por membros de universidades e empresas. Posteriormente foi
adoptado como estndar, primeiro en Francia [ 164] e con posterioridade a nivel internacional
[84]. O seu uso espallouse na industria europea e na educacin [97], e a sa introduccin no
mercado americano foi medrando progresivamente [15][16]. Coa adopcin no estndar IEC
61131-3 [86] do SFC, unha versin lixeiramente modificada do Grafcet, como linguaxe grfica
para a programacin de PLCs (3.6), o Grafcet converteuse nun formalismo amplamente
recoecido e utilizado. Entre as avantaxes que proporciona poden citarse:
1. un formalismo normalizado, grfico, fcil de entender e utilizar que facilita a
comunicacin entre os tcnicos implicados no desenvolvemento dun sistema de control.
2. independente da tecnoloxa de implementacin utilizada polo que permite a anlise e
especificacin do sistema antes de pasar a considerar os aspectos relacionados coa
implementacin.
3. Pode ser aplicado en diferentes fases e a diferentes niveis de detalle da especificacin, polo
que pode utilizarse con mtodos de deseo baseadas no refinamento sucesivo da solucin.
4. Propn unha interpretacin nica das E/S como valores booleanos o que facilita a
expresin das relacins lxicas que definen o comportamento do controlador.
5. A sa definicin est baseada na das RdP, polo que se dispn dunha base matemtica que
pode ser utilizada en mtodos de anlise e verificacin formal.
6. Disponse dunha versin estandarizada para a programacin de PLCs, polo que o paso
dende a especificacin implementacin en ambientes de programacin IEC case directo.
No que respecta aos aspectos negativos, o Grafcet ten sido criticado por non dispor dunha
semntica formal que permita garantir os requisitos de correccin e seguridade, e tamn por
non existir unha metodoloxa que permita utilizalo no desenvolvemento eficiente de modelos
de calidade cando se traballa con sistemas complexos. Co nimo de superar estas limitacins
desenvolvronse (principalmente en Francia) numerosos traballos de investigacin orientados
basicamente en catro direccins [182]:
55
Captulo 3: O Grafcet
1.
56
57
12
T
12
(a)
(b)
12
(c)
Figura 3.1. Representacin grfica de: (a) unha etapa inactiva; (b) unha etapa activa; (c) unha etapa inicial.
3.2.1.2. Transicins
As transicins representan posbeis evolucins da secuencia de control entre etapas e son
representadas graficamente mediante un trazo groso horizontal (Figura 3.2). Cada transicin
pode ter asociada unha funcin booleana denominada receptividade que determinar, dacordo
s regras de evolucin do Grafcet (3.3.1), cando unha transicin poder ser franqueada (
dicir, cando pode producirse unha evolucin na situacin do modelo). Nunca pode haber mis
dunha transicin entre das etapas calquera e a sa identificacin faise mediante un valor
alfanumrico que pode aparecer entre parnteses esquerda da transicin.
(22) +
58
Captulo 3: O Grafcet
3.2.1.4. Receptividades
As receptividades son condicins lxicas booleanas asociadas s transicins que aparecen
representadas de maneira textual ou simblica dereita das transicins (Figura 3.4). O
resultado da avaliacin da condicin determinar se unha transicin validada pode ou non ser
franqueada e, en consecuencia, se a situacin do modelo pode evoluir (3.3.1). Nas
receptividades poden utilizarse varibeis internas, externas e eventos relacionados mediante os
operadores booleanos AND, OR e NOT. As varibeis internas son as que representan os
valores de activacin das etapas e almacenan clculos internos. As varibeis externas son as
que representan os valores das varibeis do proceso controlado, os sinais de mando
proporcionados polo operador, o estado dos temporizadores e contadores, etc. En xeral, e dende
un punto de vista puramente formal, pode considerarse como varibel externa calquera sinal
que tea un caracter asncrono en relacin evolucin do Grafcet, e como interna a modificada
de forma sncrona coa evolucin do modelo. Os eventos, representados mediante os operadores
T e.^, indican a ocorrencia dun cambio no valor dunha varibel ou condicin lxica e
clasificanse en externos e internos segundo afecten a varibeis externas ou internas
.
respectivamente.
(22) + a (b + c)
3.2.1.5. Accins
As accins estn asociadas s etapas e describen a forma en que son modificadas as
varibeis de sada do modelo cando as etapas estn activas. Represntanse graficamente (Figura
3.5) como unha descricin textual ou simblica no interior dun rectngulo unido mediante unha
lia etapa. Cada accin est asociada a unha nica etapa, mais unha mesma etapa pode ter
asociadas calquera nmero de accins. Cando isto acontece nense os rectngulos das accins
en horizontal ou vertical (Figura 3.6), sen que esta representacin implique ningunha relacin
de orde ou prioridade entre elas. As etapas sen accins asociadas utilzanse normalmente para
modelar estados de espera ou sincronizacin. Cada accin est composta por tres seccins [84]:
1. Unha seccin opcional na que se indica o tipo de accin. Este tipo determina a relacin
temporal entre o estado de activacin da etapa e os valores das sadas modificados pola
accin (3.3.3). O tipo indicase mediante unha ou varias das letras da Tboa 3-I.
2. Unha seccin que contn a descricin da accin. O formato concreto desta seccin non
especificado nas normas, de xeito que poida utilizarse calquera formalismo que se
considere axeitado: cronogramas, organigramas, funcins de transferencia, ecuacins de
estado, etc. A norma IEC 61131-3 un exemplo de proposta dunha sintaxe para a
especificacin dos contidos desta seccin.
3. Unha seccin opcional que contn o identificador da varibel que ser utilizada para
indicar a finalizacin da accin.
59
Continua
Memorizada
Demorada
R, S
D
L
P
Limitada
Impulsional
Condicional
(12^
Figura 3.5. Representacin grfica dunha accin cloas tres seccins definidas polo estndar: (a) tipo; (b) descricin;
e (c) identificacin.
accin 1
12
accin 2 I
(12)
accin 3
(a)
12
(12)
accin 1
accin 1
accin 1
+
(b)
Figura 3.6. Representacin grfica de varias accins asociadas mesma etapa: (a) en vertical; e(b) en horizontal.
60
Captulo 3: O Grafcet
12
(b)
(a)
(a)
3.2.2.2. Macroetapas
As macroetapas (Figura 3.9) son representacins simplificadas dun conxunto de.etapas e
transicins, denominado expansin da macroetapa, que cumpre as seguintes regras sintcticas:
l. Hai unha nica etapa de entrada e unha nica etapa de sada, que se corresponden cos
puntos de conexin da macroetapa no modelo.
2. O conxunto de etapas e transicins forman un grafo conexo (3.2.2.3).
3. A cada macroetapa correspndelle unha nica expansin.
A utilizacin de macroetapas permite introducir diferentes niveis de detalle nos modelos e
facilita a reutilizacin. As macroetapas ocultan os detalles superfluos nun nivel de descricin
dado do modelo, que son especificados nun nivel inferior de detalle no interior das expansins.
As macroetapas poden aniarse ( posbel utilizar novas macroetapas nas expansins doutras
macroetapas) polo que posbel utilizar no modelo tantos niveis de detalle como se precisen.
i
,1
(11>
M10
1z
^^
13
(-^
(13)
14
(a)
(b)
Durante a interpretacin do modelo unha macroetapa estar activa cando o estea algunha das
etapas da sa expansin. A utilizacin de macroetapas introduce distintos niveis de detalle na
descricin do modelo, mais non na xerarqua de forzado (3.2.2.4), do que se deduce que:
1. Dende un grafcet que contea macroetapas non poden forzarse as etapas das sas
expansins.
61
2. O contrario tampouco posbel, dicir, dende a expansin dunha macroetapa non pode
forzarse a situacin do grafcet que contn a macroetapa.
3. Da mesma maneira tampouco poder forzarse dende a expansin dunha macroetapa a
situacin dun grafcet de nivel xerrquico superior ao que contn a macroetapa.
3.2.2.3. Particins
En [165] definense as seguintes particins dun modelo Grafcet:
1. Un grafcet conexo aquel no que todo nodo est conectado directa ou indirectamente aos
demais. Os grafcets conexos modelan secuencias simples que poden combinarse para
formar estructuras complexas de nivel superior.
2. Un grafcet parcial un conxunto de grafcets conexos. Os grafcets parciais modelan os
subsistemas que forman un sistema complexo.
3. Un grafcet global un conxunto de grafcets parciais. O grafcet global correspndese co
modelo do sistema de interese.
As particins definidas permiten estructurar o modelo do sistema formando unha xerarquia
estructural (Figura 3.10), na que un grafcet global est formado por un ou varios grafcets
parciais e estes, sa vez, por un ou varios grafcets conexos que poden conter tantos niveis de
detalle como se desexe mediante o uso de macroetapas (3.2.2.2).
Grafcets Parciais
Grafcet Global
Grafcets Conexos
Figura 3.10. Xerarqua estructural do Grafcet.
Captulo 3: O Grafcet
62
11
^-{ F! G2 : {22}
12
l
21
F/ G3 : {34}
22
F/G4: {42,43}
31
41
23
(31)
32
33
(41)
^
42
43
^
(43)
(33)
34
44
(44)
(34)
J
Figura 3.11. Exemplo dunha xerarqua de forzado.
63
Para manter a coherencia dun modelo estructurado desta maneira e garantir o determinismo
da sa interpretacin, a xerarqua de forzado ten que cumprir as regras seguintes:
1. A xerarqua ten que ser total, dicir, se un grafcet parcial forza directa ou indirectamente a
outro, o contrario non pode acontecer. Esta regra garante que a xerarqua de forzado non
contea ciclos e que os grafcets parciais `forzadores' estean situados en niveisasuperiores
aos forzados. En [103] proponse un mtodo baseado na teora de grafos para comprobar a
coherencia dunha xerarqua de forzado (6.5.1.3).
2. Durante a interpretacin do modelo e para todo instante de funcionamento cada grafcet
parcial forzado ter un nico `forzador'. Esta regra evita os conflictos entre ordes de
forzado durante a interpretacin do modelo.
Estas regras compltanse coa modificacin do algoritmo de interpretacin para ter en conta a
aplicacin das ordes de forzado (3.3.2.5) respectando a xerarqua de forzado e garantindo 0
determinismo e a coherencia da interpretacin.
Captulo 3: O Grafcet
64
H accin 1
^-{ accin 2
H accin 3
(1)
(2)
(3)
a.b
(1)
2
(2)
a.F
accin 2
accin 3
accin 4
accin 1
accin 2
2
(2
(1)^-a
accin 3
(3)
accin 4
accin 1
(1)
L
2
accin 2
a.b
accin 3
accin 4
65
accin 1
accin 2
accin 3
accin 4
accin 1
accin 2
(1)-}- a.b
accin 3
accin 4
(a)
accin 1
accin 3
accin 2
(1)-.^- a.b
4
accin 4
(b)
Figura 3.17. Exemplo de sincronizacin: (a) a transicin 1 non est validada; (b) a transicin 1 si est validada.
3.2.3.7. Ciclo
H accin 1
H accin 1
H accin 2
^^)
H accin 2
(3)
(2)
H accin 3
H accin 4
(5)^
(a)
(3)
3 H accin 3
H accin 4
(5)...L..
(Ib)
3.2.3.8. Semforo
O semforo permite representar a exclusin mutua no acceso a un recurso compartido desde
varias secuencias. Exemplos destes recursos son os postos de almacenaxe de pezas, os carros de
66
Captulo 3: O Grafcet
1
^
(1)
m -I
f1
12
2
30
19
10
20
Figura 3.19. Representacin grfica dun semforo -etapa 30- que proporciona un mecanismo de exclusin
mutua entre das secuencias.
11
f2
2
f9
(91)
12
92
19
99
200
(99)
(19)
10
^^
20
100
Figura 3.20. Representacin grfica dun semforo ^tapa 200- que proporciona un mecanismo de exclusin
mutua entre varias secuencias.
67
30
10
11
^T
f2
12
19
Figura 3.21. Representacin grfica dunha estructura que proporciona un mecanismo de alternancia entre das
secuencias de accins.
^
10
comezar fabricacibn
(10)
11
Fabricar
20
^(20^comezar ensamblaxe
(11^peza preparad^
21
S
=1
(21)
13
Depositar
(13^peza depositada
22
Coller
23 H Ensamblar
(23^fin ensamblaxe
Figura 3.22. Exemplo de alternancia das secuencias de fabricacin e ensamblaxe, coordinadas mediante as
operacins de depsito e recollida de pezas.
68
Captulo 3: O Grafcet
(^)
(2)
RS
(8)
3
(9)
(a)
(b)
Figura 3.23. Representacin grfica dunha estructura que realiza: a) unha acumulacin; e b) unha reserva.
69
14
Captulo 3: O Grafcet
70
a.b = 0
a.b = 1
(1
)
a .b
(1 )
a
.b
(1
.b
^L
2
I
(a)
(b)
(c)
Figura 3.25. Estados dunha transicin: (a) transicin non validada; (b) transicin validada, e(c) transicin validada
e franquebel.
(1 )
a.b
(1^a.b
2
(a)
(b)
Figura 3.26. Franqueamento da transicin 1: (a) situacin anterior; e(b) situacin posterior.
b _ ^
(1)
a.b
^)
(2
a
5
(2)
a.b
(1)
(a)
(b)
Figura 3.27. Franqueamento simultneo das transicins 1 e 2: (a) situacin anterior; e(b) situacin posterior.
Por ltimo definiuse unha regra que se aplica cando unha etapa activada e desactivada
simultaneamente durante unha evolucin do modelo:
3.3.1.5. Regra 5: Activacin e desactivacin simultnea dunha etapa
Se durante unha evolucin do modelo, unha etapa activada e desactivada simultaneamente,
permanecer activa na nova situacin.
71
a=1
b=0
(1)-^a.b
(^)^a.b
3
(a)
(b)
Figura 3.28. Activacin e desactivacin simultnea da etapa 2: (a) situacin anterior; e(b) situacin posterior.
Captulo 3: O Grafcet
72
evolucins internas do modelo poden facerse nun tempo inferior a este lmite grntese a
reactividade (capacidade de resposta ante todos os eventos externos que se produzan) do
modelo.
3.3.2.2. Algoritmos de interpretacin do Grafcet
Ademais dos postulados temporais, na revisin da definicin do Grafcet propuxronse dous
posbeis algoritmos de interpretacin distintos que utilizan as regras de evolucin do modelo
(3.3.1): sen busca da estabilidade (SRS) e con busca da estabilidade (ARS). Estes algoritmos
proporcionan unha referencia terica que pode servir de gua na implementacin dun intrprete
Grafcet considerando as restriccins dunha tecnoloxa especfica. A utilizacin dun ou doutro
algoritmo depender dos requirimentos de reactividade e determinismo (a toda secuencia de
variacin das entradas lle corresponde unha nica secuencia de variacins das sadas) do
sistema, e das restriccins da tecnoloxa utilizada.
As para unha aplicacin especfica, se fose posbel garantir que o tempo preciso para pasar
dunha situacin estbel (situacin dende a que s posbel evoluir debido a ocorrencia dun
evento externo) seguinte sempre inferior ao intervalo mnimo entre dous eventos externos
non relacionados, entn o algoritmo SRS garante os requisitos de determinismo e
reactividade23. Sen embargo na prctica non posbel garantir esa condicin, e o algoritmo
SRS pode resultar nunha interpretacin non determinista do modelo dependendo da relacin
existente entre o tempo preciso para realizar unha evolucin interna do modelo e o intervalo
mnimo entre dous eventos externos non relacionados. Como pode verse no exemplo da Figura
3.29, se se considera a situacin inicial { 1} como situacin de partida, o franqueamento da
transicin 1 producirase coa ocorrencia do evento Ta e a evolucin do modelo depender de se
o evento ^a ocorre antes ou despois da activacin da etapa 2. A demostracin a seguinte: sexa
ta = t(^a) - t(Ta) o tempo transcorrido entre ambos eventos e tr o tempo consumido no
franqueamento da transicin 1; entn se tf < ta a situacin seguinte ser {3}, pois o valor da
varibel a ser 1 cando se avalen as condicins asociadas s transicins 2 e 3, polo contrario,
se tf> taa situacin final ser {4}, pois nese caso o valor da varibel a ser 0.
O segundo dos algoritmos propostos, o algoritmo ARS, resolve en parte este problema. Este
algoritmo garante o determinismo da interpretacin do modelo independentemente do tempo de
franqueamento das transicins, mais co custe de degradar a reactividade. A solucin aportada
por este algoritmo consiste en ter en conta os eventos externos s cando o modelo est nunha
situacin estbel, o que implica que os eventos que se produzan durante a evolucin interna do
modelo (mentres pasa dunha situacin estbel seguinte) perderanse a menos que se
proporcione algn mecanismo externo ao modelo para o seu almacenamento. O algoritmo ARS
presenta un segundo problema, o grafo de situacins do modelo (grafo dirixido no que os
estados representan as situacins do modelo e os arcos as evolucins) pode inclur ciclos
estacionarios (evolucins compostas unicamente por situacins inestbeis). Nese caso a
interpretacin do modelo nunca alcanzara unha situacin estbel e o sistema quedara
bloqueado nunha busca sen fin dentro do ciclo.
3.3.2.3. Semiformalizacin da semntica do Grafcet: o xogador Grafcet
En traballos posteriores [25][106] definicin dos postulados temporais e algoritmos de
interpretacin, propxose unha semiformalizacin dun intrprete de modelos Grafcet xenrico,
23 Ntese que esta condicin, xunto co postulado 2 comentado anteriormente, correspndense co modelo de
funcionamento no modo fundamental dos sistemas secuenciais asncronos.
73
2
(2)
(3)
tr < ta / \ tt > ta
1
(1)^?a
(2)
a
^
(3)
(2)
(3)
O xogador mais elemental (Figura 3.30) basease nunha interpretacin SRS dos modelos.
Este xogador ten unha fase de iniciacin na que" se aplica a regra 1(3.3.1.1) para establecer a
situacin inicial do modelo, lense os valores iniciais das varibeis de entrada e calclanse os
valores iniciais das varibeis de sada. Despois da fase inicial, o xogador entra nun ciclo no que
se repiten as seguintes actividades:
1. Lectura dos valores das varibeis de entrada.
2. Clculo das transicins franquebeis ^acordo ao definido pola regra 2(3.3.1.2^.
3. Evolucin da situacin franqueando as transicins franquebeis -dacordo ao definido
polas regras 3 e 4(3.3.1.3;3.3.1.4)---, aplicando cando sexa preciso a regra 5(3.3.1.5)
para a resolucin dos conflictos de activacin e desactivacin simultnea de etapas.
4. Clculo dos valores das varibeis de sada segundo o especificado polas accins asociadas
s etapas activas na nova situacin do modelo.
Reara 1: Activar etapas iniciais
i
i
T
t
Rearas 3. 4& 5: Evolucibn da situacin
74
Captulo 3: O Grafcet
(3.1)
T^;, o tempo mximo que o ciclo interno precisa para calcular unha nova situacin estbel.
TCei o tempo mximo que o ciclo externo precisa para ler as entradas, calcular a nova
situacin do modelo e calcular as sadas.
75
i
i
,N Re9ra 2: Determinar as transicins franqueabeis
Ler variabeis de entrada
Non
Si
Rearas 3. 4& 5: Evolucin da situacin
Non
Situacin estable
Escreber variabeis de saida
Pdese entn reescribir a inecuacin (3.1) que limita o tempo de resposta do xogador como
0< Otr < Toi + TCe < min(Ode)
(3.3)
Tci Tce
(3.4)
T^; = n T;;
(3.5)
e debido a que
e
sendo:
n, o nmero mximo de iteracins que o ciclo interno precisa para atopar unha nova
situacin estbel (o xogador entra nun ciclo inestbel cando n= oo).
(3.6)
(3.7)
76
Captulo 3: O Grafcet
tempo
/ / p _ Saidas externo
tempo
interno
(Estmulo)
(Resposta)
Variacin
Variacin
dunha.
de ,^ das
entrada ^^.^t ^ saidas
Evolucin interna da
situacin do Grafcet
Escala Interna
Figura 3.32. Escalas de tempo interna e externa na interpretacin do Grafcet.
77
Os postulados temporais do Grafcet (3.3.2.1), revisados para ter en conta as das escalas
temporais definidas, quedan agora da maneira seguinte:
Postulado 1
Na escala de tempo externa, todo evento tido en conta polo modelo no instante,xusto da
sa ocorrencia. Os cambios no estado do modelo e nos valores das sadas que provoque
cada evento son percibidos nesta escala como se sucederan instantaneamente.
Postulado 2
Na escala de tempo interna, a duracin dunha evolucin pode ser tan pequena coma se
desexe mais non pode ser nula. En consecuencia o tempo de activacin dunha etapa
tampouco pode ser nulo.
A consideracin conxunta dambos postulados e das das escalas de tempo independentes
definidas garanten as propiedades de reactividade e determinismo que caracterizan aos sistemas
reactivos ideais. En efecto, o primeiro postulado establece que o tempo de resposta do modelo
na escala de tempo externa instantneo, e polo tanto cumpre coa condicin de causalidade
nula imposta pola hiptese de sincronismo forte. Por outra banda o segundo postulado, xunto
coa utilizacin dunha interpretacin ARS dos modelos, garante simultaneamente o sincronismo
da evolucin e o determinismo da resposta.
As modificacins no xogador ARS que esta revisin dos postulados implican poden verse na
Figura 3.33. As ecuacins que describen os lmites temporais dos dous ciclos deste xogador
cambian agora para ter en conta as das escalas de tempo independentes definidas. O tempo de
ciclo interno (o ciclo que calcula a nova situacin estbel despois da ocorrencia dun evento)
estar medido na escala interna e dacordo ao segundo postulado vir dado por:
(3.8)
T^;(int) > 0
No que respecta ao tempo de ciclo externo (o ciclo que calcula o valor das varibeis de sada
na nova situacin_ estbel) medirase na escala de tempo externa e segundo o primeiro postulado
vir dado por:
(3.9)
TCe(ext) = 0
Regra 1: Activar etapas iniciais
*
Ler variabeis de entrada
Non
Tce (ext) = 0
Situacin estable
Escreber variabeis de saida
Figura 3.33. Xogador ARS con das escalas de tempo baixo a hiptese de sincronismo forte.
Captulo 3: O Grafcet
78
79
explicitamente esta posibilidade, polo que ser preciso engadir no xogador a deteccin desta
condicin durante a propagacin das ordes de forzado.
ReQra 1: Activar etapas iniciais
i
i
Re9ra 2: Determinar as transicins franqueabeis
Ler variabeis de entrada N
Non
Tc^s (ext) = 0
Situacin estable
Escreber variabeis de saida
Si
Non
Forzado mltiple
t2
As complicacins proveen da falla dunha definicin que indique como deben considerarse
os eventos externos, que son flancos instantneos no tempo externo, na escala de tempo interna,
onde os instantes externos son dilatados e, teoricamente, poden ter duracins tan longas como
se desexe. Como pode verse na Figura 3.36 hai das posbeis respostas, que o evento sexa
considerado como unha constante durante todo o perodo, ou ben, que a sa duracin sexa nula
no tempo interno e, polo tanto, poda asimilarse a un flanco ao comezo do perodo dilatado. A
escolla dunha ou outra solucin influir na evolucin interna do modelo, pois a avaliacin do
evento nas receptividades ter valores distintos nun e noutro caso.
80
Captulo 3: O Grafcet
^ tempo
externo
tempo
externo
tem po
interno
^ tempo
interno
(b)
(a)
Figura 3.36. Posbeis interpretacins dun evento externo na escala de tempo interna: (a) como tinha constante; e
(b) como un evento de duracin nula.
------------------------------ , -------------------.----------------------------------------------------------^
r---, ,--, ^-, , .^------^^
0
10
20
X31 , .
(10)
,^
30
(30^ a
F/GP4: {32}
11
31
(21^tX3
32
22
(22)
(32)
TX3
GP4
------------------------'
NF2
GP3
GP2
GP1
^-----------------------------------------------------------' '-------------------------------------NF1
N FO
S32 ^
L___1__L__L
1,
-------fi--------
S22
^-----^-------,
,
,
S20
S30
S22
S21
S21
^-i
S20
S11
S11
S10
S10
S10
S3
S3
S2
S2
S11
S1
S1
^---^---t---L
i
(a)
S31
S22
S3
S31
S30
S20
S32
S21
S32
S30
X3
L___J___l.__L
(b)
(c)
(d)
Figura 3.37. Exemplo de interpretacins dun mesmo Grafcet considerando: (a) Tb e TX3 na escala externa; (b) Tb
na escala externa e TX3 na interna; (c) Tb na escala interna e TX3 na externa; e(d) Tb e TX3 na escala interna.
81
Ademais este problema non afecta unicamente consideracin dos eventos externos [25]. O
mesmo acontece co estado de activacin das etapas, cos valores das varibeis e coa
consideracin das accins. En efecto, durante unha evolucin interna do modelo o estado de
activacin interno dunha etapa pode ser diferente ao seu estado de activacin externo, debido a
que o modelo puido mudar a sa situacin interna, mais a externa s mudara cando se chegue a
unha situacin interna estbel. A cuestin que se suscita cal dos dous valores utilizar durante
unha evolucin interna do modelo. O razoamento para as varibeis e as accins semellante, o
modelo podera inclur varibeis cuxos valores foran significativos s nunha das das escalas, e
accins que fosen consideradas s na escala externa (nunha situacin estbel) ou tamn na
interna (en situacins inestbeis). A Figura 3.37 mostra un exemplo de como a interpretacin
dos eventos, varibeis e accins con respecto s das escalas temporais modifica o
comportamento externo do modelo.
Captulo 3: O Grafcet
82
accin 1
n
(n)
acn 1
acn 1
(n)
_^
(n)
accin 1
accin 1
(m)--F-
(m)
accin 1
si D
i
i i--i
r,
accin 1
^
(n)
^n^
n
D
accin 1
t#4s
i^-r^I
i4s
i
i
i
;E i4s^^,
83
n.X
accin 1
(n^
n
L
accin 1
t#4s
i
i
_ ;4s _
i
i
i
t-I-!
accin 1
(n)
n.X
DS
accin 1
t#4s
(n)
accibn 1
i^4^
m.X
accin 1
n.X
--
^
i< i4s^; i
accin 1
m.X
i
ii
i -
l^^
, :Q
m.X
n.X
accin 1
i4s
>
m.X
Figura 3.45. Cronograma dunha accin SD.
SL
t#4s
accin 1
accin 1
accin 1
m.X
Figura 3.46. Cronograma dunha accin SL.
Captulo 3: O Grafcet
84
S = tl/E/t2
(3.10)
sendo:
S, a varibel booleana obtida como resultado da temporizacin.
E, a varibel booleana utilizada como base para o clculo da temporizacin.
ta(S) = ta(E) + t^
(3.11)
td(S) = ta(E) + t2
(3.12)
Cando algns dos retardos igual a cero pode omitirse, sendo entn E/t2 e t^/E as
representacins utilizadas para o operador. No primeiro caso t^ = 0 e ta(S) = ta(E) e no
segundo tZ = 0 e ta(S) = td(E).
2. O xerador de pulsos, utilizado para xerar un pulso de duracin tan pequena como se precise
nas accins impulsionais (tipo P).
3. A memoria, utilizada para almacenar o estado de activacin das accins memorizadas (tipos
R e S).
3.3.3.8. Resolucin de conflictos entre accins
Unha circunstancia que pode producirse durante a interpretacin dos modelos Grafcet a
modifcacin simultnea dunha mesma varibel desde diferentes accins activas. Se as
modificacins intentan asignar valores diferentes varibel existir unha situacin de conflicto
que pode dan lugar a resultados inesperados. preciso polo tanto ou ben garantir que o modelo
est libre de conflictos mediante tcnicas de anlise a priori, ou ben definir un mtodo para a
resolucin do conflicto cando este se produza. En [114] propense tres psbeis maneiras de
resolver esta situacin:
1. Asignar prioridades s etapas do modelo, de xeito que en caso de conflicto se apliquen
unicamente as accins de maior prioridade.
2. Definir unha relacin de composicin entre os valores asignados polas accins. Por
exemplo, podera utilizarse o OR lxico para os valores booleanos e a suma para os
enteiros.
85
Equipamento
de control
^ Funcins operativas ,
i(temporizacins,_pulso_s)i
o
_`
___^____ f o8 _
Control secuencia^
^ (modelo Grafcet) i
i3
03
Seccins
continua e
numrica
Equipamento
de proceso
Captulo 3: O Grafcet
86
S={si, sz, ... , sm}, conxunto finito non baleiro de etapas. SocS o subconxunto de
etapas iniciais.
L={l^, lz, ... , lP}, conxunto finito non baleiro de arcos orientados que unen unha etapa
a unha transicin ou viceversa; est formado polo par (LI, Lo) de xeito que:
n
LI: S x T--^ {0, 1} a funcin que describe o conxunto de arcos que unen unha
etapa a unha transicin.
Lo: T x S^{0, 1} a funcin que describe o conxunto de arcos que unen unha
transicin a unha etapa.
n
n
R={r^, rz, ... , r}, conxunto finito de receptividades asociadas s transicins; `dt; E T,
r; a receptividade asociada transicin t;, e est formada polo par (E, C) de xeito que:
n
Unha transicin ser franqueada cando ambas partes sexan certas e todas as etapas
que a precedan estean activas.
n
A={a^, az, ... , aW}, conxunto finito de accins asociadas s etapas; t^Is; E S, A(s;) _
{a;l, aiz, ... , a;k} o conxunto de accins asociadas etapa s;, e est formado polo par
(N, P) de xeito que:
n
n
n
87
(3.13)
sendo:
CP(S )= V
r=i
n X ^ n r;
^=i
(3.14)
p o nmero de transicins que anteceden a s,,, e para cada transicin t; E{t^, .. , tP} que
antecede etapa:
n
n X^ a condicin de validacin de t;, que ser certa cando todas as etapas que
l=^
CN(s )= V
r=t
n X^ n r;
^=i
(3.15)
s o nmero de transicins que suceden a sn, e para cada transicin t; E{t^, .. , ts} que
sucede etapa:
n
n X^ a condicin de validacin de t;, que ser certa cando todas as etapas que
j=1
Ntese que este modelo unicamente considera unha escala de tempo e non ten en conta as
ordes de forzado. En [59] pode consultarse un modelo dinmico que ten en conta ambos
aspectos e est baseado na representacin das regras de evolucin do Grafcet como ecuacins
.
diferenciais nun grupo de Galois de orde 2.
Captulo 3: O Grafcet
88
89
Captulo 3: O Grafcet
90
91
para o desprazamento vertical da taladradora (M2) e outro para o xiro do cabezal multibroca
(M 1). O arranque e parada destes motores controlado mediante detectores de fin de carreira
(Dfc 1 e Dfc2 para M 1 e Dfc3 e Dfc4 para M2). Unha vez rematado o proceso de taladrado 0
cilindro 3 retira a tapa dun burato situado baixo anel e este cae na cinta 2 que o transporta
92
Captulo 3: O Grafcet
Dm8
q
CIL. 4
q D
4 Dm7
Bridas
defectuosas
^ PZS != Lim
5
PZS == Lim
0
PZS = 0
DFS = 0
Cinta 3
Dfc1 Dfc3
PZS = 0
?Dc
100
=1
Cil 3
1Dva
1Dpos
9
3
H Cinta2
Cil 2
Visin
Artificial
defectuosa
^X3/2.5s
10
Cil4
vlida
11
DFS++
^X10/2.5s
Cinta 2
si Dc
^Dn
12
^-
PZS++
93
DI
Cil l
Avance do cilindro I
Dpre
Presostato do cilindro 2
Cil2+
Avance do cilindro 2
DFS
Dpos
Cil2-
Retroceso do cilindro 2
Dfc 1
Cil3
Avance do cilindro 3
Dfc2
Ci14
Avance do cilindro 4
Dfc3
Cintal
Arranque da cinta 1
Dfc4
Cinta2
Arranque da cinta 2
Dva
Cinta3
Arranque da cinta 3
Valida
MI+
Avance do motor 1
Defectuosa
Ml-
Retroceso do motor I
Dn
M2+
Avance do motor 2
Dc
M2-
Retroceso do motor 2
Lim
Tboa 3-II. Entradas, sadas e contadores utilizados na automatizacin do posto de fabricacin de bridas.
X105/2.5s
106 H M1Dfc1
107 H M2Dfc3
108
Figura 3.51. Contidos da macro 100 que controla o proceso de taladrado dunha peza.
94
Captulo 3: O Grafcet
un punto de entrada na cela das pezas a procesar e outro de sada da cela das pezas xa
procesadas. Cada peza que entra na cela leva asociado un cdigo que indica as operacins que
xa se realizaron sobre ela e as que quedan por realizar. Este cdigo pode ter un dos valores
indicados na Tboa 3-III.
(t-, f-, t-f-, f-t-)
Entrada
Pals
valeiros
PE
^^
SF
Fresadora
EF
Espera para
fresado
(f-, f-t-)
PT
^^,
Torno
PS
t+,f+t+)
(f+^ t+f+)
^
Espera para
fresado ou saida
(t+, t+f-^ f+t+)
Saida
f*
Peza ara fresado
t*f* Peza ara torneado e fresado nesa orde
f*t* Peza ara fresado e torneado nesa orde
*_+- indica se a o eracin xa foi realizada ou anda hai ue facela.
Tboa 3-III. Valores do cdigo de cada peza.
Os robots encrganse das operacins de movemento das pezas desde as mquinas e puntos
de entrada e sada da cela cara aos pals situados nos postos para a transferencia de pezas (PE,
PS e PT). As o robot 2 move as pezas entre o pal situado no posto PT e o torno, e o robot 1
pode realizar algn dos movementos indicados na Tboa 3-IV.
E^PE
PS^S
PS^EF
SF^PE
SF^S
95
varibeis utilizadas son as indicadas na Tboa 3-V e o grafcet principal de control do robot 1
o amosado na Figura 3.53. O estado de activacin dalgunhas das etapas deste grafcet teen un
significado especfico que se recolle na Tboa 3-VI.
On
Peza
Fin_op
Saida
Fe
na fresadora
Tboa 3-V. Entradas e varibeis utilizadas na automatizacin da cela de fabricacin flexibel.
2
3
4
5
6
7
8
9
10
11
12
100
200
300
EF libre
Peza en PS a ardando a ser movida a EF
Peza en PS a ardando a ser movida sada
Peza a ardando a ser retirada da sada
Movemento dunha eza dun unto a outro
Car a e descar a de als no osto PE
Car a e descar a de als no osto PS
O grafcet de control do robot 1 debe garantir que unicamente unha das cinco posbeis
secuencias de control para o movemento de pezas est activa. Isto consguese pola propia
estructura do grafcet e mediante as condicins asociadas s transicins 2, 4, 7, 9 e 11. Estas
condicins impoen unhas prioridades nos posbeis movementos do robot, sendo mais
prioritarios os movementos que sacan pezas da cela cara ao posto de sada e menos prioritarios
os que introducen pezas dende a entrada cara ao posto PE, co obxectivo de evitar a saturacin
do sistema. A orde de prioridades dos movementos SF^S (transicin 7), PS^S (transicin
11), PS^EF (transicin 9), SF^PE (transicin 4) e E^PE (transicin 2).
Como pode comprobarse no grafcet da Figura 3.53, para que as transicins que dan paso s
secuencias de control dos movementos do robot estean validadas, o robot debe estar inactivo
etapa 3 activa-. Ademais a transicin 7(a mis prioritaria) estar validada unicamente cando
haxa unha peza agardando na sada da fresadora para ser movida sada da cela ^tapa 7
activa- e s ser franqueada cando a sada non estea ocupada ^tapa 12 non activa-. Esta
transicin ten maior prioridade que as transicins 9 e 11, xa que estas transicins s poden ser
franqueadas cando non haxa pezas agardando na sada da fresadora -etapa 7 non activa-.
Ademais as transicins 9 e 11 non poden estar simultaneamente validadas pois as etapas 10 e
11, que representan a presencia dunha peza agardando no posto PS, non poden estar activas
simultaneamente. Como estas transicins son as que dan paso s secuencias de movemento
dunha peza dende o posto PS, s unha delas vai estar validada cando haxa unha peza en PS.
Algo semellante acontece coas transicins 4 e 7 que controlan as secuencias de movemento
de pezas dende a sada da fresadora. Para que a transicin 4 estea validada ten que estar activa a
etapa 5, e para que a transicin 7 estea validada ten que estar activa a etapa 7. Ambas as das
etapas -5 e 7- representan a presencia dunha peza agardando na sada da fresadora e s unha
das das pode estar activa simultaneamente. Ademais para que a transicin 4 sexa franqueada
non pode haber ningunha peza agardando en PS -macro 300 activa-, o que garante que as
Captulo 3: O Grafcet
96
transicins 9 e 11 (que son as que controlan o movemento de pezas dende PS) van ter
prioridade sobre a transicin 4.
A transicin con menor prioridade a transicin 2, que da paso secuencia de control para o
movemento de pezas dende a entrada da cela ata o posto PE. Esta transicin s vai estar
validada cando haxa unha peza agardando na entrada -etapa 2 activa-, o robot 1 estea libre
-etapa 3 activa- e haxa un pal baleiro no posto PE -etapa 4 activa-. Unha vez qu se
cumpran esas condicins, para poder franquear a transicin ten que cumprirse ademais que non
haxa pezas agardando na sada da fresadora ^tapa 6 activa- ou no posto PS -macro 300
activa-. Isto garante que as transicins 4 e 7 e as transicins 9 e 11, respectivamente, van ser
mis prioritarias que a transicin 2.
A secuencia que sigue unha peza dende que chega entrada da cela ate que sae dela a
seguinte:
Cando chega a peza cela (Peza = true), se esta est en funcionamento (ON = true),
actvase a etapa 2.
Unha vez que o robot queda libre -etapa 3 activa-, haxa un pal baleiro no posto PE
etapa 4 activa- e non haxa pezas agardando nin na sada da fresadora nin no posto PS
etapas 6 e 300 activas- inciase a secuencia de movemento da peza dende a entrada ate o
posto PE -secuencia 50, 100-. Ao remate desta secuencia actvanse as etapas 1(para
aceptar novas pezas na entrada da cela), 3(robot libre) e 200 (macro que despraza o pal
ocupado cara zona de espera correcta dacordo ao cdigo da peza e introduce un novo pal
baleiro no posto PE).
Ao rematar a macro 200, actvase a etapa 4 para indicar que un novo pal baleiro est na
posicin PE. A peza estar agora sobre un pal na zona de espera do torno se o seu cdigo
t- ou t-f-, ou na zona de espera do posto PS se o seu cdigo f- ou f-t-. No primeiro dos
casos a peza, despois de ser torneada, posta de novo sobre un pal na zona de espera do
posto PS e o seu cdigo pasar a ser t+ ou t+f-. En calquera caso o pal no que est a peza
ser cargado no posto PS na macro 300. Se xa se remataron todos os procesos sobre ela
(cdigo t+) actvase a etapa 1 l, que indica que a peza est en PS agardando a ser movida
sada da cela. Se anda hai que fresala (cdigos f-, f-t- ou t+f-) activarase a etapa 10 que
indica que hai unha peza en PS agardando a ser movida entrada da fresadora.
Se a peza est agardando en PS a ser movida sada ^tapa 11 activa-, cando o robot
estea libre ^tapa 3 activa-, non haxa outra peza agradando na sada da fresadora
etapa 7 inactiva- e a sada estea libre -etapa 12 inactiva- iniciarase a secuencia 90, 100,
que move a peza dende o posto PS sada. Cando esta secuencia remate liberarase o robot
-actvase a etapa 3-, retirarase o pal baleiro do posto PS -na macro 300- para cargar
un novo pal, e activarase a etapa 12 que indica que hai unha peza na sada da cela
agardando a ser retirada.
97
l"^
X I>.
^
rn
^^
r-N
n
o^
c
LL
v
c^
aNi
co
wa
u u
d
n
II
O_
0
0
Captulo 3: O Grafcet
98
As etapas 5 e 7 actvanse cando remata a operacin de fresado sobre unha peza e esta
depositada na sada da fresadora. A etapa 5 actvase cando peza anda lle queda pasar
polo torno (cdigo f+t-), o que indica que a peza agarda a ser movida a un pal baleiro no
posto PE para ser posteriormente transportada ao torno. En canto etapa 7, actvase cando
xa se remataron todas as operacins sobre a peza (cdigos f+ ou t+f+) e indica que a peza
est agardando a ser movida sada da cela. Este o caso prioritario e abondar con qu o
robot e mais a sada da cela estean libres -etapa 3 activa e 12 inactiva, respectivamente
para que se inicie a secuencia 70, 100 que mover a peza dende a sada da fresadora ate a
sada da cela. Unha vez rematada a secuencia, liberase o robot -actvase a etapa 3-,
indcase que a sada da fresadora est libre ^tapa 6 activa- e que na sada da cela hai
unha peza agardando a ser retirada -etapa 12 activa-.
No caso en que a peza est agardando a ser movida dende a sada da fresadora ate o posto
PE -etapa 5 activa-, cando o robot quede libre -etapa 3 activa-, haxa un pal baleiro
situado no posto PE -etapa 4 activa- e non haxa ningunha peza agardando no posto PS a
ser movida -macro 300 activa-, iniciarase a secuencia 60, 100 para realizar dito
movemento. Ao rematar a secuencia liberarase o robot -etapa 3 activa-, activarase a
macro 200 para dirixir o pal sobre o que est agora a peza cara zona de espera para o
torno, cargarase un novo pal baleiro no posto PE e activarase a etapa 6 que indica que a
sada da fresadora est agora libre.
Os custos de mantemento, a dependencia dun fabricante provoca que non sexa posbel
dispor de equipamentos equivalentes proporcionados por terceiros. Esta ausencia de
competencia provoca que os prezos dos recambios e actualizacins sexa maior.
99
O estndar IEC 61131-3 [86] xurde como un intento de unificar as diferentes linguaxes
utilizadas para a programacin de PLCs co obxectivo de permitir a aparicin de ferramentas
abertas que faciliten a portabilidade e permitan reducir a dependencia dos fabricantes existente
ata ese momento. Unha das linguaxes includa no estndar o SFC, unha versin do Grafcet
adaptada programacin de PLCs. Neste apartado resmense as caractersticas mis relevantes
do SFC, especialmente aquelas que presentan diferencias coa definicin do Grafcet vista
anteriormente. O estndar IEC 61131-3 resume estas caractersticas mediante tboas, que
poden ser consultadas no Anexo A.
3.6.1. O SFC
O SFC utilizado para a estructuracin da secuencia de control interna nos diferentes tipos
de POUs (funcins, bloques funcin e programas) definidos no modelo "software" proposto
como parte do estndar IEC 61131-3. A sa definicin est baseada no estndar IEC 60848
coas modificacins precisas para converter o que un estndar de especificacin e
documentacin nunha linguaxe de programacin.
3.6.1.1. Etapas
Adptase a representacin grfica definida polo estndar IEC 60848 para as etapas e etapas
iniciais (3.2.1.1). Tamn se definen das varibeis que estarn asociadas a cada etapa:
Un `flag" booleano que almacena o estado da etapa, o seu valor inicial ser 0 excepto nas
etapas iniciais que ser 1.
Unha varibel (tipo TIME) que almacena o tempo transcorrido desde a ltima activacin
da etapa, o seu valor inicial t#Os. Esta varibel almacena a informacin mesmo despois da
desactivacin da etapa e non se reinicia ata que a etapa volve activarse.
Ambas varibeis son s de lectura, e o estndar indica que debe considerarse un erro
calquera intento de modificar o seu valor.
^
100
Captulo 3: O Grafcet
corresponde coa especificacin detallada definida no estndar IEC 60848 (Figura 3.5) e est
formada por 4 campos:
1. Campo `a', o tipo da accin.
2. Campo `b', o nome da accin.
3.
Campo `c', o valor booleano utilizado para indicar a finalizacin da accin, condicins de
erro, etc.
4.
Campo `d', o cdigo da definicin da accin, no que pode utilizarse calquera das outras
linguaxes definidas polo estndar, includo o SFC.
O estndar IEC 61131-3 mais especfico que o IEC 60848 na definicin dos tipos de
accins e a sa semntica temporal. Ademais establece que as accins temporizadas (tipos L,
D, SD, DS e SL) tern asociada unha varibel tipo TIME na que se almacene a duracin dende
a activacin da accin.
Encanto resolucin de conflictos entre accins ( 3.3.3.8), o estndar IEC 61131-3 define
un bloque de control de accins ("ACTION_CONTROL function block", Figura 3.54) de uso
interno ( dicir, non accesbel ao usuario) que define a semntica de execucin das accins
cando son activadas simultaneamente desde diferentes etapas. O estndar establece que toda
accin deber ter asociada unha instancia deste tipo de bloque, describe a sa estructura interna
(Figura 3.55) e indica as regras de conexin entre as accins e os bloques que as controlan.
Unha accin ser executada de maneira continua mentres a sada Q do bloque que a controla
sexa certa, e unha vez mis despois dun flanco negativo de Q. A Figura 3.56 mostra un
exemplo da utilizacin dos bloques de control de accin.
A execucin da accin unha vez mis inmediatamente despois dun flanco descendente da
sada Q, aspecto que foi introducido no estndar para penmitir que unha accin poida reiniciar
as varibeis que utiliza, ten creado certa confusin na interpretacin temporal das accins tipo
P, pois con esta especificacin son executadas das veces: unha no flanco de subida da sada Q
e outra no flanco de baixada. Este comportamento pouco intuitivo polo que se propuxeron
dous novos tipos de accins a incorporar nas futuras ampliacins do estndar: as tipo P 1 e P0,
que son executadas respectivamente nos instantes de activacin e desactivacin de Q.
ACTION_CONTROL
bool^ N
bool- R
bool
bool
bool
bool
bool
bool
bool
TIME
^-- bool
S
L
D
P
SD
DS
SL
T
101
>_
S FF
RS
R1
L TMR
TON
IN
Q
PT
D TMR
TON
IN
PT
P_TRIG
R_TRIG
SD FF
SD_TMR
RS
SD
S
R1
TON
IN
O
PT
Q1
DS_TMR
DS_FF
TON
IN
O
PT
DS
RS
S
R1
01
SL FF
SL
SL TMR
TON
IN
O
PT
12
(12).+
13
accionar bomba S FF
H S accionar bomba
D
t#2s
RS
S12.X
S14.X
H R accionar bomba
(a)
Q1
accionar
bomba
activar sinal
activar sinal D TMR
(13)
14
S
R1
S13.X
t#2s
TON
IN
Q1
PT
activar
sinal
(b)
Figura 3.56. Exemplo do uso dos bloques de control de accins: (a) SFC con distintos tipos de accins; e(b)
bloques de control de accin equivalentes.
102
Captulo 3: O Grafcet
2. As receptividades asociadas s transicins que suceden a unha etapa non son avaliadas ata
que os efectos da activacin da etapa sexan propagados na POU que a etapa pertenza.
3. A regra sobre a activacin/desactivacin simultnea dunha etapa non se incle no SFC
(3.3.1.5), non obstante o estndar especifica que a definicin de SFCs inseguros (Figura
3.57.a) que poidan dar lugar a situacins de paralelismo interpretado (3.2.3.10), as como
a definicin de SFCs que contean etapas inalcanzbeis (Figura 3.57.b) deben considerarse
como erros.
Ademais adptase para o SFC o postulado temporal do Grafcet (3.3.2.1) que establece que
o tempo de franqueamento dunha transicin (e polo tanto tamn o de activacin dunha etapa)
poder ser tan pequeno como se queira, mais non nulo. Isto implica que o estndar IEC 61131
3 adopta para o SFC unha semntica SRS (3.3.2.2).
(a)
(b)
Figura 3.57. Exemplos de: (a) SFC inseguro; e(b) SFC con etapas inalcanzbeis.
Un mellor aproveitamento dos recursos humanos, xa que cun menor esforzo en formacin
consguese unha maior aplicabilidade dos coecementos adquiridos.
103
A da de hoxe o proceso de adopcin do estndar est a ser lento e desigual, e pode dicirse
que non se acadaron os niveis de aceptacin que serian previsbeis se se consideran os
beneficios anunciados. As principais reticencias proveen das comunidades de control
americana e asitica nas que teen maior importancia a presin do mercado e a esixencia de
competitividade que o cumprimento do estndar, que percibido como unha cuestin
secundaria. A opinin maioritaria a de estar a expectativa e agardar a que haxa mais
productos dispobeis no mercado de cara a considerar a sa adopcin no futuro [14][167].
Entre as diferentes crticas que se teen realizado [42][138] poden indicarse, por exemplo:
A estandarizacin dun conxunto de linguaxes constite un impedimento innovacin e en
ltimo termo vai en contra dos intereses dos usuarios.
As linguaxes estandarizadas (en concreto IL, FB, LD) estn anticuadas e son linguaxes de
baixo nivel baseadas en conceptos procedentes principalmente do campo da
electromecnica e a electrnica.
A portabilidade completa dos programas dificil de acadar, e probablemente non se
chegue nunca a conseguir completamente.
A adopcin do estndar s proporciona beneficios a longo prazo, xa que a substitucin
dun sistema de control propietario por outro baseado no estndar non proporciona ningn
beneficio inmediato.
No que ao SFC respecta, valrase a sa capacidade de sntese de secuencias complexas
mediante unha representacin grfica de fcil comprensin, mesmo para os non iniciados. As
principais crticas que se Ile realizaron foron as seguintes [42]:
A utilizacin conxunta do SFC e as outras linguaxes do estndar obriga ao programador a
traballar simultaneamente en dous planos: o secuencial definido polo SFC, e o
combinacional, especificado nas accins utilizando as outras linguaxes.
Sen embargo e a pesar destas crticas a percepcin xeral a de que o SFC presenta mis
avantaxes que inconvenientes, por exemplo:
Captulo 3: O Grafcet
3.7. Conclusins
104
Este captulo dedicouse a presentar o Grafcet, que o formalismo grfico utilizado para a
especificacin de secuencias de control complexas na ferramenta proposta nesta tese de
doutoramento. Expuxronse as vantaxes que proporciona e as principais lias de investigacin
relacionadas coa sa utilizacin como parte de metodoloxas de desenvolvemento "soflware".; a
proposta de extensins ao modelo, a verificacin e validacin mediante tcnicas formais, etc.
Describiuse a sa sintaxe, discutronse os aspectos temporais das diferentes posibilidades de
interpretacin dos modelos Grafcet, e incluronse unha formalizacin da relacin entre o
modelo e o seu contorno, unha descricin alxbrica da sintaxe e regras de evolucin, e unha
comparativa con outros formalismos de especificacin de sistemas secuenciais. Mostrronse
algns exemplos da aplicacin do Grafcet no modelado de sistemas industriais reais, e
finalmente, explicouse a relacin entre o SFC proposto no estndar IEC 61131-3 e o Grafcet.
O SFC unha versin do Grafcet adaptada programacin de PLCs que, en resume,
presenta as seguintes diferencias:
O SFC restrinxe a unha o nmero de etapas iniciais en cada rede SFC -que o
equivalente a un grafcet conexo (3.2.2.3^.
28 Esta clasificacin unicamente orientativa, algunha das aplicacins poderan ser includas en varias categoras.
29 Nesta categora tentou inclurse a Cadepa, unha aplicacin xurdida da investigacin sobre Grafcet realizada na
universidade francesa de Nancy nos finais dos 80, mais non se dispuxo dunha versin de demostracin.
105
106
Un aspecto que preciso ter en conta na anlise a proposta do SFC (3.6) como linguaxe
grfica para a programacin de secuencias de control en PLCs no estndar IEC 61131-3 e a sa
influencia nas caractersticas do Grafcet implementadas nas ferramentas. Na actualidade a
conformidade co estndar percibida en xeral como un valor engadido nos productos, sobre
todo a longo prazo, polo que a maiora das aplicacins tenden a implementar a versin
aprobada nas recomendacins do estndar, en prexuzo da maior potencialidade de model'ado
do Grafcet. Estas aplicacins presentan un menor interese dende o punto de vista dos
obxectivos desta tese de doutoramento.
O resto do captulo est organizado da forma seguinte: no apartado (4.1) explcase como se
organizou a anlise das aplicacins e os mtodos utilizados nela; o apartado (4.2) describe en
detalle a anlise de cada aplicacin e, por ltimo, no apartado (4.3) resmense os resultados e
establcense as conclusins.
107
108
O caso bsico (ou rxido), no que unicamente poden modelarse estructuras completas nas
que cada comezo de seleccin (ou paralelismo) ten que ir acompaado dun fin de seleccin
(ou paralelismo).
2. O caso flexbel, no que os comezos e fins de seleccin (ou paralelismo) poden utilizarse sen
restriccins.
1.
As aplicacins do primeiro tipo non permiten modelar grafcets con estructuras complexas.
Para comprobar esta caracterstica utilizouse o modelo da Figura 3.53 que require, para poder
ser editado, dunha utilizacin flexbel das estructuras de seleccin de secuencia e paralelismo.
4.1.1.2. Extensins s estructuras de control bsicas
Dentro desta categora inclense as estructuras sintcticas definidas con posterioridade
norma IEC 60848: etapas (transicins) fonte e sumidoiro (3.2.2.1) as como calquera outra
caracterstica adicional non estndar implementada. Comprobouse se o programa detectaba
como errnea a definicin dunha transicin como fonte e sumidoiro simultaneamente e se as
transicins fonte estaban sempre validadas durante a execucin.
4.1.1.3. Accins e receptividades
Na anlise de accins e receptividades comprobronse os seguintes aspectos, relacionndoos
coas definicins dos estndares IEC 60848 e IEC 61131-3:
Por ltimo tamn se analizou o mecanismo utilizado para resolver os conflictos entre
accins, anda que este aspecto foi includo no apartado dedicado ao algoritmo de
interpretacin ao tratarse dunha caracterstica relacionada coa execucin dos modelos.
4.1.1.4. Identificacin
Neste apartado analzase a forma de identificar as compoentes dun modelo: etapas,
transicins, accins, grafcets parciais, etc. Ademais de comprobar qu elementos poden
identificarse e qu tipo de identificador pode utilizarse, tamn se analizaron os erros detectados
durante a verificacin sintctica: identificadores duplicados, elementos sen identificar,
referencias de salto a etapas inexistentes, etc.; e as opcins dispobeis durante a edicin:
asignacin automtica de identificadores, renumeracin de etapas e transicins ao copiar ou
eliminar partes dun modelo, actualizacin automtica de referencias de salto e varibeis de
etapa nas renumeracins, etc.
109
2s/Xi
SO
{0, 3}^(1, 3)-^{l, 4}, os eventos externos son considerados coma eventos durante a
evolucin interna e os internos son tratados no tempo interno.
b.
{0, 3}^{ 1, 3}^{ 1, 4 }, os eventos externos son considerados coma eventos durante a
evolucin interna e os internos son tratados no tempo externo.
c.
{0, 3}-^(1, 3)-^{2, 4}, os eventos externos son considerados coma constantes durante
a evolucin interna e os internos son tratados no tempo interno.
d.
{0, 3}-^(1, 3)-> {2, 3}^(2, 4)-^ {2, 5}, os eventos externos son considerados coma
constantes durante a evolucin interna e os internos son tratados no tempo externo.
31 As situacins estbeis representanse mediante chaves `{}'e as inestbeis mediante parnteses `Q'.
110
(o)
ta
(3)
iXi
(1)
ta
(4)
iX1
(2)
(5)
Figura 4.2 Grafcet utilizado para comprobar o manexo de eventos e varibeis durante as evolucins internas.
111
2. A aplicacin das ordes de forzado debe manter a coherencia lxica da xerarqua de forzado,
dicir, as ordes son aplicadas recursivamente comezando polo nivel mais alto. Para
comprobalo utilizouse o grafcet da Figura 3.37, no que partindo da situacin { 1, 10, 20,
30}, se as ordes de forzado das etapas 2 e 21 son aplicadas correctamente, ao activarse a
varibel a producirase a evolucin seguinte: {1, 10, 20, 30}^{2, 10, 21, 32}. E.dende esta
situacin, ao producirse o evento Tb, a evolucin correcta sera unha das indicadas na
Figura 3.37 (dependendo da interpretacin dos eventos durante as evolucins internas).
3. Non estn permitidas as situacins de forzado mltiple.
G1
(4)
F/G1:{9)
2
(2'
(5^X2
3
(3)
i
8
(8,
6
b
(6)
.c
9
b
(9)
X2
Figura 4.3. Grafcet utilizado para comprobar a aplicacin das ordes de forzado durante as evolucins internas.
112
ache de lecture
Remphcz ce.ritrole
par yos_ ntrs - -
Remplacez cet'indicateur
pr vos rti ; ,>
Sorties
[rF7
100
:................"" l^'
q
G
rafcet edite
status
q
Ct
al
Nombre d'entrees
du systme
Figura 4.4. Contidos do VI que proporciona a estructura dunha aplicacin GrafcetView (versin multitarefa).
GrafcetView incle controis para todos os elementos sintcticos bsicos do Grafcet, coa
excepcin das estructuras de comezo e fin de seleccin de secuencia, que son realizadas
mediante a conexin dunha etapa a mltiples transicins ou de mltiples transicins a unha
etapa, respectivamente. Estes controis permiten modelar todas as estructuras de control bsicas
do Grafcet e, ademais, as estructuras de comezo e fin de paralelismo poden utilizarse de forma
flexbel, o que permite editar estructuras complexas.
113
A librara tamn soporta algunha das extensins sintcticas como as etapas (e transicins)
fonte/sumidoiro ou as macroetapas. Unha etapa pode utilizarse conectndoa s a transicins
anteriores na secuencia de control (etapa sumidoiro), s a transicins posteriores (etapa fonte)
ou sen conectala a ningunha transicin. O mesmo acontece coas transicins, coa excepcin de
que unha transicin si ten que estar conectada a, cando menos, unha etapa. De non ser as o
GrafcetView o considera un erro de sintaxe. Durante as probas comprobouse que as transicins
fontes non eran interpretadas correctamente ao non ser consideradas como validadas en todo
momento.
Existen algunhas limitacins que afectan edicin dos Grafcets anda que son de pouca
importancia: os controis de comezo e fin de paralelismo non poden conectarse a mais de catro
secuencias de control diferentes ( preciso aniar varios controis cando se precisan mais); e os
arcos orientados que van en sentido contrario secuencia de control (de abaixo a enriba) teen
que conectar sempre unha transicin a unha etapa.
4.2.1.2.2. Estructura xerrquica
No GrafcetView cada etapa pode ter asociada unha accin na que as sadas se indican
mediante a notacin S,,, separndoas con vrgulas no caso de querer activar varias
simultaneamente. As accins poden levar asociada unha condicin na que, mediante os
operadores do lxebra de Boole: AND (.), OR (+) e NOT (-), poden editarse expresins
booleanas que contean entradas (E), varibeis de etapa (X) e temporizacins sobre varibeis
de etapa (t^/X/t2). O seguinte un exemplo de accin condicional na que se activan das
sadas:
S3, S4 si (E4+20/X2/50).-X3
As receptividades teen unha sintaxe que consta de das partes: un evento e unha condicin,
separados pola palabra reservada `et'. Ambas partes son opcionais, e a ausencia simultnea
dambas equivale a unha receptividade sempre certa. A condicin segue a mesma sintaxe que a
114
explicada para as accins condicionais; encanto ao evento, este pode ser un flanco ascendente
(A^ ou descendente (D) aplicado a unha entrada, varibel de etapa ou temporizacin sobre unha
varibel de etapa. Algns exemplos de receptividades son os seguintes:
ME3 et (X2+E0)
D30/X4/60 et 10/X2/50
DXS et -ES.-X 12
O GrafcetView realiza a anlise sintctica dos modelos en das fases. Durante a edicin
identificanse as conexins que non cumpren a regra de alternancia etapa-transicin, as etapas
sen numerar ou os arcos orientados sen conectar; e unha vez que comeza a interpretacin do
modelo detctanse os erros de sintaxe nas accins e receptividades, os identificadores de etapa
duplicados ou as transicins non conectadas.
Un aspecto orixinal do GrafcetView consiste en que cada etapa responsbel da anlise
sintctica da accin que ten asociada (e cada transicin da sa receptividade). Isto posbel
porque tanto as etapas como as transicins estn implementadas mediante controis (un tipo de
VI) e, polo tanto, son realmente programas G representados no modelo mediante unha icona.
4.2.1.2.6. Simulacin e execucin
115
contrapartida, o LabView facilita a edicin de interfaces de usuario nas que se mostre o estado
do proceso e que inclan controis e indicadores que permitan interactuar con el.
4.2.1.2.7. O algoritmo de interpretacin
Figura 4.5. Das posbeis interfaces para a animacin das evolucins dun grafcet no GrafcetView.
4.2.1.3. Conclusins
GrafcetView unha librara que permite a utilizacin de modelos Grafcet como parte das
aplicacins LabView. Incle soporte a todas as estructuras de control bsicas, permite o uso .
flexbel das seleccins de secuencia e paralelismo e a utilizacin de etapas (transicins)
fonte/sumidoiro. A estructuracin xerrquica basease nas capacidades do LabView para o
capsulamento dos programas, non se inclen ordes de forzado e queda baixo responsabilidade
do usuario a utilizacin correcta das macroetapas e Grafcets parciais. Mediante unha sintaxe
simple poden editarse accins continuas, condicionais, limitadas e demoradas no tempo. Nas
condicins e receptividades poden utilizarse tanto temporizacins coma eventos. A anlise
sintctica realizase en das fases e a interpretacin dos modelos de tipo ARS con deteccin de
ciclos estacionarios, considerando os eventos externos como eventos na escala interna e
resolvendo os conflictos entre accins mediante a disxuncin lxica das accins activas.
En conclusin, GrafcetView permite engadir o control secuencial de forma simple nas
aplicacins LabView. tamn unha excelente ferramenta para a aprendizaxe e o prototipado
rpido de aplicacins, xa que LabView facilita enormemente o desenvolvemento de interfaces
de usuario, a adquisicin de datos, a interaccin con equipos de proceso e o intercambio de
informacin con outras aplicacins. Entre os puntos febles pdense citar: o soporte limitado
estructuracin xerrquica dos modelos, a imposibilidade de animar as evolucins dos Grafcets
116
4.2.2.1. Compoentes
O programa para a definicin da interface de operador denomnase Interact, e est formado
por numerosos "drivers" de comunicacin e mdulos que proporcionan as funcionalidades
precisas para implementar un sistema SCADA. Entre os mdulos mais relevantes poden
citarse:
l. O editor de paneis de operador, que permite editar interfaces que contean elementos
grficos como botns, grficas, indicadores, etc.
2. O editor de animacins grficas, que permite inclur animacins grficas nos paneis de
operador.
3. O xestor de alarmas, receitas, histricos e informes, mdulos que proporcionan paneis
predefinidos para as opcins habituais nun SCADA en cada unha destas funcins.
4. A configuracin de mquinas, que permite xestionar a carga e descarga de parmetros de
configuracin nos equipos de control.
5. A transferencia de datos, que permite configurar a transferencia de datos a alta velocidade
entre diferentes equipos de control en aplicacins multicontrolador.
6. As comunicacins, mdulo que permite compartir a informacin das aplicacins Interact
con outras aplicacins a travs de NetBios ou DDE.
Ademais destes mdulos predefinidos, pode engadrselle aplicacin un programa de
usuario que realice actividades adicionais. Este programa actvase mediante interrupcins e
intercambia datos cos outros mdulos a travs dun rea de memoria compartida.
A aplicacin para o desenvolvemento do "software" de control denomnase MachineLogic
(Figura 4.7) e sigue s recomendacins do estndar IEC 61131-3. A versin de MachineLogic
analizada neste apartado a 2.01. Esta versin incle un ambiente de execucin en tempo real
no que poden simularse e depurarse os programas, e conta con "drivers" de E/S para buses de
campo Profibus e DeviceNet. A interface do MachineLogic incle numerosas caractersticas
que facilitan o seu manexo: barras de botns, mens flotantes, xanelas que poden fixarse nos
bordes do area de traballo, organizacin de mltiples xanelas mediante lapelas, asistentes
edicin dos programas, etc. O elemento principal da aplicacin a rbore do proxecto dende a
117
que se ten acceso s opcins principais de edicin. Cada proxecto ten catro compoentes
principais:
1. As POUs, que poden ser de tres tipos: programas, funcins e bloques funcin dacordo ao
definido no estndar IEC 61131-3. Cada POU divdese en tres partes: a descricin, a
declaracin de varibeis e a implementacin, que pode codificarse utilizando calquera das
linguaxes IEC: IL, ST, LD, FBD ou SFC.
2. Os tipos de datos do usuario: estructuras, arranxos e cadeas de caracteres definidos dacordo
ao estndar IEC 61131-3.
3. A configuracin hardware, que describe a estructura do sistema de control segundo 0
modelo "sof^ware" definido no estndar IEC 61131-3. O sistema pode conter varias
con^guracins, cada unha delas pode ter un ou mais recursos, e en cada recurso declranse
as varibeis globais, configranse os dispositivos de E/S e exectanse unha ou mais
tarefas. Cada tarefa executa unha ou mais POUs utilizando para cada unha un dos tres tipos
de planificacins soportados: cclica, de sistema ou de evento.
4. As libraras, que permiten a reutilizacin de POUs entre proxectos.
4.2.2.2. O editor Grafcet
O editor do MachineLogic est orientado edicin de SFCs que contean unha nica rede
cclica na que non pode haber mais dunha etapa inicial. Utilzase a aproximacin mais comn
neste tipo de editores consistente en dividir o rea de traballo en filas e columnas e inclense a
maiora das opcins de edicin habituais nun ambiente grfico: seleccionar, mover, eliminar,
desfacer os cambios, zoom, etc. O editor permite a insercin, eliminacin e desprazamento dos
nodos da rede unicamente se se mantn a sa correccin sintctica e non se incumpre a
restriccin de ter unha nica rede SFC.
4.2.2.2.1. Estructuras de control
Ao tratarse dun editor SFC, o MachineLogic ofrece soporte unicamente aos elementos
sintcticos bsicos do Grafcet, anda que tamn incle a posibilidade de utilizar etapas
sumidoiro para terminar secuencias de control non cclicas. O editor non permite o cruce de
lias e a utilizacin de seleccins de secuencia e paralelismo s pode facerse mediante
estructuras completas que comecen por un inicio de seleccin de secuencia (paralelismo) e
rematen cun final de seleccin de secuencia (paralelismo). Esta restriccin non permite modelar
estructuras flexbeis.
Est pennitida a utilizacin de ciclos e saltos de secuencia, sendo posbel iniciar mltiples
ciclos ou saltos dende un mesmo punto da secuencia de control mediante a utilizacin dunha
seleccin de secuencia. Ademais o editor permite definir unha etapa como etapa de salto a
outra etapa. O identificador da etapa de salto ten que coincidir co da etapa que se salta, anda
que o programa non controla durante a compilacin que esta exista.
4.2.2.2.2. Estructura xerrquica
O editor non permite definir unha estructura xerrquica entre SFCs. A estructuracin do
proxecto realzase a nivel de POU, seguindo as recomendacins do estndar IEC 61131-3.
4.2.2.2.3. Accins e receptividades
118
identificadores das accins sen cdigo son utilizados como varibeis booleanas e o seu valor
modificado durante a activacin da etapa dacordo ao tipo de accin do que se trate.
As receptividades tamn poden implementarse utilizando as mesmas linguaxes que para as
accins. No caso de utilizar LD ou FBD, a implementacin da receptividade pode facerse
directamente no editor SFC. Entre os FBs dispobeis hai contadores, temporizadores,
biestbeis e detectores de flancos, e tamn pode utilizarse o estado de activacin das etapas
(coa sintaxe step,,.J^ no cdigo de receptividades e accins. O programa non impide a edicin
de receptividades que produzan `efectos colaterais' durante a sa avaliacin.
o^^^i,^ ^^
;^^f ^'^_:'^^^
j^^.l^^ l
^ -^,; ^ ,^ ^ ^ ^ f ^^i;
-^ Project
; - ^J Libraries
--d DataTypes
p-^ LogicalPOUs
p Q main
value
.END_VAR
I2^Tr .= 0;
VAR_EX1'ERNAL (*AUTOINSERTt)
BOOL;
.
input0
BOOL;
.
inputl
END_VAR
^^
^ mainV
^ main
+- i'^, Transitions
q
+p--d Actions
p-^ Physical Hardware
p-!^ Configuration
p-^ Resource
^ Geating_A Project
p+-^ Tasks
'--^`p Global Variables
--^ 10_Configuration
^ Cr^rrint ^.;
!Vtiable (LEF )^'< ^ POU^^n/aksheet ^^Access ^ Camrnad ^ TyPe
ACTION
;
main.main
^ A001
ACTION
main.mam
^ A002
BOOL
inputup.inputup
Read
II
^`pinput0
BOOL
main.main
Read
6^pinput0
^ -:,.{^'^
^`
r^ inout0 _ ..
mammain
=-_Read ._ __ . ,^,_.800^, ^
For He1p oeys F1 .,
.;, ^
^^
^_ ^^ ^
^ ^_
^48215'^C ^1^164.3MB^^
4.2.2.2.4. Identificacin
A anlise sintctica faise en das fases, durante a edicin dos SFCs o editor non permite o
cruce de lias nin operacins que incumpran a regra de alternancia etapa-transicin. O resto de
comprobacins realzanse durante a compilacin do proxecto. O nico problema atopado foi a
non comprobacin da existencia da etapa destino nas etapas de salto.
119
120
4.2.3. IsaGraph
O IsaGraph da compaa AlterSys33 unha das aplicacins de desenvolvemento de soflware
de control mais populares no mercado da automatizacin industrial. Pioneira na aplicacin do
concepto de automatizacin aberta (consistente na aplicacin dos principios do software aberto
automatizacin industrial), permite o desenvolvemento de aplicacins independentes do
sistema final no que vaian executarse. O nico requisito a dispoibilidade dunha versin do
ambiente de execucin do IsaGraph para ese sistema concreto. A versin da aplicacin aqu
analizada a 4.10. Esta versin soporta mltiples ambientes de execucin distribudos en
diferentes equipos interconectados mediante unha ou mais redes de comunicacins, as como a
posibilidade de incorporar un servidor "web" no sistema de control.
4.2.3.1. Compoentes
O IsaGraph unha aplicacin complexa que incle numerosas funcionalidades e opcins. A
sa arquitectura de alto nivel divdese en tres compoentes principais:
1. O ambiente de desenvolvemento, con versins para Windows 98, 2000 e NT, proporciona
soporte configuracin do sistema de control e codificacin, simulacin e execucin do
seu "software". A arquitectura dos proxectos sigue as recomendacins do estndar IEC
61131-3: cada configuracin IEC correspndense no IsaGraph cun nodo fisico que executa
unha ou mais mquinas viriuais. Cada mquina virtual executa un recurso (o equivalente a
un PLC virtual) e a sa versin determina as redes de comunicacins, dispositivos de E/S,
funcins C e bloques funcin dispobeis. En cada recurso configranse as POUs e datos
que contea, os parmetros de execucin, as comunicacins e os dispositivos de E/S. A
compoente principal do ambiente de desenvolvemento o Xestor de Proxectos, dende o
que se accede ao resto de opcins da aplicacin. Entre as mais importantes destacan:
a. O editor "hardware ", no que se configura o"hardware" do sistema de control: os
parmetros das configuracins, das redes de comunicacin e das conexins, a
asignacin de recursos a cada configuracin, as propiedades de execucin de cada
recurso, etc.
b. O editor de enlaces entre recursos, no que se editan os recursos e a definicin dos
enlaces34 para o intercambio de informacin entre eles. Para cada recurso mstranse as
POUs, datos e parmetros mediante unha estructura de rbore dende a que pode
accederse aos editores do cdigo das POUs. IsaGraph soporta todas as linguaxes IEC
mis os diagramas de fluxo.
c.
d.
33 O IsaGraph foi desenvolvido inicialmente pola compaa CJ International. Debido ao seu xito comercial foi
absorbida pola A1terSys, distribuidora do Virgo Automation Studio e lder na comercializacin de productos
softPLC e softDCS. A versin actual do IsaGraph o resultado da integracin dambos productos, da adaptacin s
recomendacins do estndar IEC 61131-3 e do abandono comercial da denominacin Virgo.
3a O concepto de enlace semellante ao de acceso ("access path") definido no estndar IEC 61131-3. A principal
diferencia que os enlaces intercambian informacin entre recursos que poden estar ou non na mesma
configuracin. Os accesos son para intercambios entre recursos de diferentes configuracins.
121
2.
d.
Ao tratarse dun editor SFC s ofrece soporte aos elementos sintcticos bsicos do Grafcet. A
utilizacin das seleccins de secuencia e paralelismo flexbel mais non o suficiente como para
modelar estructuras complexas que inclan semforos, debido a que o editor non permite a
conexin directa entre un inicio de seleccin de secuencia e un final de paralelismo ou entre un
inicio de paralelismo e un final de seleccin de secuencia.
Os ciclos e saltos de secuencia poden representarse graficamente mediante arcos orientados
ou mediante referencias de salto. O programa controla que as conexins que se realicen desta
maneira cumpran a regra de alternancia etapa-transicin. Se se queren iniciar mltiples saltos a
diferentes etapas dende un mesmo punto da secuencia de control pode utilizarse unha estructura
de inicio de seleccin.
4.2.3.2.2. Estructura xerrquica
O IsaGraph aporta unha solucin propia que non coincide con ningunha das
recomendacins dos estndares IEC, poden establecerse relacins de subordinacin entre as
POUs codificadas con SFC dividndoas en das categoras:
1. Os SFCs principais, activados polo sistema ao comezo da execucin.
2. Os SFCs dependentes, cuxa execucin controlada polos SFCs dos que dependen.
A Tboa 4-I resume as cinco accins que controlan a execucin dun SFC dependente. Con
este mecanismo poden implementarse funcionalidades semellantes, ainda que mis limitadas e
non equivalentes semanticamente, s das ordes de forzado ou aos "enclosure steps" ^efinidos
na ltima revisin do estndar Grafcet [85]-.
122
O IsaGraph non incle todos os tipos de datos nin de accins definidos polo estndar IEC
61131-3. En concreto permite accins dos tipos: N, R, S, PO e P 1 (non incle accins
temporizadas) e divdeas en das categoras:
1. As que poden programarse mediante unha das linguaxes IL, ST ou LD (tipos N, PO ou P 1.).
2. As booleanas (tipos R, S e N), que poden utilizarse para activar e desactivar o valor de
varibeis booleanas ou nomes de SFCs (equivalen s accins GSTART e GKILL).
En canto s receptividades, poden programarse mediante IL, ST ou LD e poden utilizarse as
funcins booleanas e FBs dispobeis, entre os que hai contadores, temporizadores, biestbeis e
detectores de flancos. O IsaGraph non impide os `efectos colaterais' que poidan producirse
durante a avaliacin das receptividades, e define das varibeis para cada etapa - o estado de
activacin (stepn.J^ e o tempo de actividade (step,,.T}- cuxos valores poden ser utilizados no
cdigo de accins e receptividades.
, ^^
S^
, ^ ,.
_,^,X
S Boo InitOk.
I
'^`f --' P1 ST resetTre
- _ ^ I ' r.i , sT
ST T1
ComplexTest(OK1,M y
nuelReset) AND
R^_tnndio^
Stop^.al ^
GSTART
GKILL
GFREEZE
GRST
GSTATUS
Tboa 4-I. Accins que controlan a execucin dos SFCs dependentes no IsaGraph.
4.2.3.2.4. Identificacin
123
A anlise sintctica faise en das fases, durante a edicin comprobase que as conexins
cumpran coa regra da alternancia entre etapas e transicins e durante a compilacin realzase a
anlise sintctica completa.
4.2.3.2.6. Simulacin e execucin
124
un ambiente grfico que incorpora parte das recomendacins do estndar IEC 61131-3 no
referente estructura da aplicacin e programacin das POUs. Dende este ambiente pdense
editar mltiples parmetros relacionados coa configuracin "hardware", arquitectura
"soflware", comunicacins e interfaces de E/S; programar, compilar e depurar as POUs de cada
recurso; descargar o cdigo compilado nas mquinas virtuais e monitorizar a sa execucin.
Para a programacin das POUs, pdense utilizar todas as linguaxes IEC e mis os diagrama de
fluxo.
En canto s caractersticas do Grafcet includas no IsaGraph, limtanse implementacin
dunha versin do SFC: non se incle ningunha das extensins sintcticas do Grafcet, a
estructura xerrquica non sigue as recomendacins dos estndares IEC, non se inclen todos os
tipos de accins IEC, o algoritmo de interpretacin de tipo SRS e non se manexan
correctamente os conflictos entre accins. En resume, o IsaGraph unha aplicacin moi
completa para o desenvolvemento de proxectos de automatizacin en sistemas distribudos que
incle unha potente mquina virtual que facilita a creacin de "software" portbel. No que
respecta ao Grafcet, o IsaGraph non aporta ningunha caracterstica nova, limitndose a
implementar unha versin do SFC se exceptuamos a posibilidade de definir unha estructura
xerrquica entre SFCs que non se axusta ao definido nos estndares Grafcet.
4.2.4. PL7
O PL7 unha aplicacin da empresa Schneider Automation para a programacin de PLCs
da marca Telemecanique dende PCs co sistema operativo Windows. O ambiente grfico do
programa sigue as directrices do estndar IEC 61131-3 adaptadas s caractersticas dos PLCs
que soporta. A versin analizada a PL7 Pro v3.1, que permite traballar cos PLCs das series
TSX Micro e TSX Premium.
4.2.4.1. Compoentes
A compoente principal da aplicacin o navegador, no que se organiza o proxecto de
automatizacin nunha estructura de tipo rbore. Dende este navegador tense acceso a todas as
demais funcionalidades do programa: definicin da estructura dos programas, definicin das
varibeis e tipos de datos, programacin, compilacin e depuracin das POUs, configuracin
dos PLCs e da comunicacin, documentacin dos programas, etc. A aplicacin tamn incle un
editor cunha librara de obxectos grficos (bombas, depsitos, motores, etc.) para crear
interfaces de operador simples.
A execucin dos programas nos PLCs TSX das series Micro e Premium pode facerse tanto
en modo monotarefa como multitarefa, dependendo das capacidades de cada equipo concreto.
En calquera caso sempre existe unha tarefa principal, denominada MAST, que pode executarse
cclica ou periodicamente. Nas configuracins multitarefa poden engadirse ademais tarefas de
alta prioridade para a xestin rpida de eventos externos ou a realizacin de operacins que
requiran un perodo inferior ao da tarefa MAST. Todas as tarefas divdense en seccins e
subprogramas (que poden ser chamados dende as seccins ou dende outros subprogramas).
Cada seccin pode programarse utilizando as linguaxes IEC: IL, LD, FBD ou ST. Ademais,
nalgns PLCs pode inclurse na tarefa MAST unha seccin adicional programada con Grafcet.
Esta seccin divdese en tres partes: o tratamento previo, o tratamento secuencial e o tratamento
posterior. Os tratamentos previo e posterior poden programarse con IL, ST ou LD e serven para
realizar operacins de iniciacin e finalizacin do proceso secuencial executado polo grafcet.
125
^^
------.-----------------^^
.
('Initial step^ ,
0
('Start o( cycle conditions^
(^Feeding box filling up^
MO
a
^
4
^`Initial step^
('End o( proportioning^
T
^L
^J
I('MAIN GRPPH')
: _ -- :_ . ;. _
^^
-^^
1Q^b
^14^e
O editor Grafcet do PL7 soporta a edicin de mltiples grafcets conexos cclicos que
contean calquera das estructuras de control bsicas. O uso das seleccins de secuencia e
paralelismo flexbel, anda que a divisin do rea de traballo en filas e columnas limita en
certos casos a complexidade das estructuras que poden editarse. Os ciclos e saltos de secuencia
poden representarse mediante arcos orientados ou mediante pares de frechas que indican a
orixe e o destino do salto, estando permitido inclur mltiples saltos a diferentes etapas dende
un mesmo punto da secuencia de control.
4.2.4.2.2. Estructura xerrquica
126
macroetapas de oito niveis, e a estructura icerrquica que forman pode verse no avegador da
aplicacin. O programa controla que cada macroetapa s sexa utilizada unha vez e que non
existan recursividades nin ciclos na estructura xerrquica. As etapas de entrada e sada nas
expansins das macroetapas denomnanse IN e OUT respectivamente, e s a etapa IN pode ter
accins asociadas. As macroexpansins non estn limitadas a unha nica estructura conexa que
comece na etapa de entrada e remate na de sada, senn que poden conter varios grafcets
conexos, sempre e cando as etapas de entrada e sada sexan nicas.
4.2.4.2.3. Accins e receptividades
O PL7 permite a utilizacin nas accins e receptividades dos elementos de memoria dos
PLCs Telemecanique: entradas, sadas, varibeis de sistema, varibeis de estado dos FBDs e
Grafcets, etc. Tamn poden utilizarse os FBDs predefinidos que inclen contadores,
temporizadores e biestbeis. Unha parte da memoria de sistema resrvase para manter os
parmetros de configuracin do Grafcet e a informacin sobre o estado e tempo de activacin
de cada etapa durante a execucin. O programa permite a modificacin destas varibeis na
seccin de tratamento previo do grafcet mediante a utilizacin de instruccins SET e RESET.
As etapas poden ter asociadas tres accins, unha de activacin (tipo PO), unha continua (tipo
N 1) e unha de desactivacin (tipo P 1), que poden ser programadas mediante as linguaxes IL,
LD, FBD ou ST. A documentacin do programa indica que as accins N1, anda que se
denominen continuas, son tratadas como accins memorizadas e ser preciso activalas e
desactivalas explicitamente mediante instruccins SET e RESET nas accins PO e P 1 para
limitar o seu efecto duracin dunha etapa.
As receptividades tamn poden ser programadas coas mesmas linguaxes, anda que o PL7
restrinxe as caractersticas que poden ser utilizadas para evitar os `efectos colaterais' durante a
sa avaliacin.
4.2.4.2.4. Identificacin
127
128
O editor permite a edicin de mltiples grafcets conexos sen estructura xerrquica, que
inclan as estructuras de control bsicas, ademais de permitir a utilizacin de etapas
(transicins) fontes e sumidoiro. Nas probas comprobouse que o editor non considera coma
erro que unha transicin sexa vez fonte e sumidoiro e durante a execucin as transicins fonte
non se comportaron coma se estiveran sempre validadas. A colocacin das etapas iniciais est
restrinxida primeira fila35 do rea de traballo e as seleccins de secuencia e paralelismo poden
utilizarse de forma flexbel, permitndose a edicin de estructuras complexas. Sen embargo
tamn poden editarse estructuras incorrectas (Figura 4.10) que non son detectadas durante a
anlise sintctica. Os ciclos e saltos de secuencia fanse mediante referencias de salto podendo
iniciarse mltiples saltos dende o mesmo punto da secuencia de control.
i^
._^ ._
^- .Y^__ ^ ..
+
---^ ^.^. -
^j ^X
+
^ True
^ True
+
+
^
^
True
^ F True
+
+
^ True
^
True
True
+
+
+
u.
(^
ti
Os grafcets permitidos polo Visual UO non teen estructura xerrquica. O que si permite o
programa modificar o estado de activacin das etapas directamente a travs das varibeis que
almacenan o seu valor. Anda que isto est prohibido polos estndares IEC, unha maneira de
emular as ordes de forzado. O inconveniente que non se incle soporte deteccin de ciclos
na xerarqua de forzado nin medios de evitar o forzado mltiple dunha situacin.
4.2.5.2.3. Accins e receptividades
's Anda que despois posbel movelas ou copialas a outras filas, co que a restriccin deixa de ter senso.
129
O algoritmo de interpretacin utilizado no motor en tempo real do visual PLC de tipo SRS,
executando as accins tanto en situacins estbeis como inestbeis. Os resultados das probas
realizadas para comprobar a resposta do Visual UO cando varias accins modifican
simultaneamente unha mesma varibel (4.1.2.2) foron os seguintes: o caso (l.a) non puido
probarse xa que todas as accins no Visual UO son continuas; e os casos (l.b), (l.c) e(l.d) non
foron considerados coma errneos polo programa, mudando o valor da varibel de forma non
determinista mentres as accins estiveron activas.
130
4.2.5.3. Conclusins
Visual UO e Visual PLC son das aplicacins implementadas partindo dun ambiente de
programacin e desenvolvemento de interfaces grficas Windows utilizando Visual Pascal. A
esta base engadronselle un conxunto de funcins adicionais (programacin en LD, FBD e
Grafcet, xestin de alarmas, histricos e receitas, etc.) para a sa utilizacin no
desenvolvemento de aplicacins de control en PCs. O conxunto compltase cun mdulo
softPLC para a execucin dos programas e"drivers" de E/S para diferentes buses de campo
(ModBus, ProfiBus) e PLCs (Unitelway, Omron).
A versin Grafcet implementada no Visual UO e o soporte proporcionado polo editor son
bastante limitados. S se permiten as estructuras de control bsicas, non se permite unha
estructura xerrquica, non se implementan os diferentes tipos de accins IEC e non se poden
utilizar eventos nin temporizadores (anda que si os tempos de activacin das etapas) nas
condicins. O editor permite a edicin de estructuras Grafcet non estndar ou con
identificadores duplicados, a interpretacin dos modelos de tipo SRS e non se manexan
correctamente os conflictos entre accins. En resume, o Visual PLC aporta unha idea nova
como a de integrar as linguaxes grficas do IEC nun ambiente de desenvolvemento de
aplicacins Windows e proporcionar un mdulo softPLC e"drivers" de E/S para a execucin
dos programas. Sen embargo a versin Grafcet implementada non aporta nada novo e
nalgunhas das caractersticas comentadas nin sequera cumpre aspectos bsicos dos estndares.
4.2.6. AutomGen
AutomGen unha aplicacin da empresa francesa Irai para o desenvolvemento de software
de control que pode executarse en PCs ou PLCs. O programa incle un editor grfico
multilinguaxe (permite utilizar Gemma, Grafcet, loxigramas, organigramas, LD, FBD, IL e
ST), un compilador, un simulador e un editor de pantallas de operador. Para permitir a
portabilidade, AutomGen xera durante a compilacin un cdigo intermedio que traducido
linguaxe propia de cada PLC mediante un post-procesador. A versin analizada a 7.0 de
demostracin.
4.2.6.1. Compoentes
A compoente principal do AutomGen o navegador (Figura 4.11) no que se organizan
mediante unha estructura en forma de rbore todos os elementos que forman parte dun
proxecto: folios (programas), tboas de smbolos, postprocesadores (configuracin
"hardware"), documentacin e outros elementos relacionados coa depuracin e o deseo de
pantallas de operador. Dende o navegador estn tamn dispobeis opcins para seleccionar o
postprocesador a utilizar, acceder librara de estructuras predefinidas para as linguaxes
grficas e editar a lista de smbolos do proxecto. A aplicacin compltase coa posibilidade de
editar e executar a interface grfica mediante un programa externo denominado IRIS, que
permite a animacin de obxectos 2D e 3D.
4.2.6.2. O editor Grafcet
O AutomGen non incle un editor Grafcet especfico, senn que se utiliza o mesmo para
todas as linguaxes grficas, pudendo definirse mltiples `redes' multilinguaxe en cada folio. Os
folios organzanse en filas e columnas e en cada cela pode inserirse un dos mltiples smbolos
das linguaxes grficas soportadas. O programa permite inserir e eliminar filas e columnas, e
131
Poden editarse grafcets que contean calquera das estructuras sintcticas bsicas as como
etapas (transicins) fontes e sumidoiro, macroetapas e ordes de forzado. O uso das estructuras
de seleccin de secuencia e paralelismo flexbel, sendo posbel editar estructuras complexas.
Os ciclos e saltos de secuencia poden representarse mediante arcos orientados, e poden
iniciarse varios dende un mesmo punto da secuencia de control mediante unha estructura de
inicio de seleccin. O editor non considera coma erro que unha transicin sexa
simultaneamente fonte e sumidoiro.
P.
(^E^ ^Edmon AK^+^9e^ Eroqenme 4^e Fe^e
t^ ^ i II f^i ;^} ^ ^ e^^i ^ ^', .^
^^ ,^Ii
. : 1
_^ . ^:
aJ
^_,^^
^^3^14 *^ j ^z^G : ^. :: ,.
r,
-^ R^wces '
^;^j Modul^sadairei ^
il ^ ^_ ^..-: _.^; _.
^^_
^^
w (^^ w.^a
^`^,^tmEMOSEH
132
Directiva de agrupamento
F<id^ra^: {<situacin>}
Orde de forzado
F<id^raf>: {}
G<idJgra^:<store>
G<id^raf>:^store>{^situacin>}
F<id^raJs:<store>
F<id^raf>
Orde de bloqueo
Tboa 4-II. Sintaxe da directiva de agrupamento e ordes de forzado en AutomGen.
133
sintaxe do IEC 61131-3. O contido das accins pode especificarse mediante sentencias nas
linguaxes IL, ST ou mediante unha das sintaxes da Tboa 4-III, que permiten a modificacin
directa do valor das varibeis. AutomGen implementa os tipos de accins IEC seguintes3: N,
R, S, P1 e P0, ademais incle accins condicionais que xunto cos temporizadores permiten
emular as accins temporizadas L, D e DS do estndar.
,
En canto s receptividades, pode utilizarse nelas calquera elemento de memoria (includas as
sadas); os operadores booleanos AND (.), OR (+) e NOT (^; os de comparacin; eventos (T,^)
en varibeis e expresins; e temporizacins, cunha das sintaxes seguintes:
<duracin>l<var id>lT
Tl<var id>l<duracin>
<duracin>l<var id>
A propia sintaxe das receptividades impide a posibilidade de introducir cdigo que produza
`efectos colaterais' durante a sa avaliacin. Os nicos valores que se modifican son os dos
temporizadores iniciados na receptividade.
^
<var name>
^
booleana, tem orizador Mantn o valor a 1 durante a activacin da eta a
N<var name>
R<var name>
S<var name>
I<var_name>
[+^-] <var_name>
numrica, contador
Tboa 4-III. Sintaxe das accins que modifican directamente o valor dunha varibel no AutomGen.
36 Na documentacin indcase que se soportan tamn os tipos L, D, SD, DS e SL, mais a versin do programa
analizada non permitiu utilizar estes cualificadores.
134
135
X
X
X
X
N
X
S
X
X
R
X
X
I
X
X
X
X
X
Esta incompatibilidade non afecta s probas realizadas (4.1.2.2) para analizar a resposta do
programa cando varias accins modifican simultaneamente unha mesma varibel, xa que isto
pode acontecer entre accins que a priori son compatbeis. Os resultados para o AutomGen
foron os seguintes: no caso ( l.a) a sada mantivo o valor 1, o que indica que a accin R non
prioritaria sobre as demais en contra do definido no estndar IEC 61131-3; o caso ( l.b) non foi
considerado coma un erro e a sada tomou o valor resultado da disxuncin lxica das accins
activas; e, por ltimo, os casos ( l.c) e(l.d) tampouco foron considerados coma erros, e a
varibel tomou diferentes valores mentres as accins estiveron activas.
4.2.6.3. Conclusins
O AutomGen unha aplicacin de desenvolvemento de software de control para PC e unha
ampla gama de PLCs. O programa soporta un grande nmero de linguaxes: Gemma, Grafcet,
loxigramas, organigramas, LD, FBD, IL e ST, e incle opcins para a configuracin do
"hardware" e dos dispositivos de E/S, a edicin, compilacin, descarga, control e depuracin en
tempo real da execucin dos programas, a animacin das linguaxes grficas, a monitorizacin e
forzado de varibeis durante a depuracin, etc. Ademais tamn pode editarse unha interface
grfica para a supervisin do proceso que pode executarse mediante un programa externo
denominado IRIS.
En canto ao Grafcet, o AutomGen moi completo soportando case todas as caractersticas
definidas polos estndares IEC. Entre os aspectos negativos atopados durante as probas poden
citarse: s as etapas poden ter identificadores (numricos); permtense macroexpansins sen
etapa inicial ou final e con estructuras cclicas; non se incle o concepto de grafcet parcial,
anda que se permite o agrupamento de grafcets conexos; as ordes de forzado poden conter
etapas inexistentes; a xerarqua de forzado pode conter ciclos; non se soportan directamente as
accins temporizadas do IEC; o algoritmo de interpretacin de tipo ARS mais non detecta
ciclos estacionarios e a deteccin de conflictos entre accins limitada. En resume, o
AutomGen unha excelente aplicacin que destaca polo nmero de linguaxes que incle, a
gama de PLCs e sistemas de E/S que soporta e as capacidades de animacin grfica durante a
simulacin dos programas. Implementa case todas as caractersticas do Grafcet e o nico dos
programas analizados que ofrece soporte ao estndar Gemma.
4.2.7. Actwi n
ActWin unha aplicacin da empresa sueca Actron para a implementacin de proxectos de
automatizacin con PLCs da empresa Hitachi dende un PC con sistema operativo Windows. O
programa incle opcins para configurar os PLCs, configurar as comunicacins e dispositivos
de E/S, editar o diccionario, os programas e a documentacin do proxecto, cargar o proxecto no
136
b.
c.
3.
Os "drivers " PLC, que implementan para os PLCs soportados as funcins que permiten a
sa configuracin, a dos dispositivos de E/S e comunicacins, a carga e descarga de
programas e smbolos, a monitorizacin dos programas, etc. Ademais dos "drivers" das
diferentes versins de PLCs Hitachi, ActWin incle un "driver" softPLC co que poden
executarse os programas no PC e emular o sistema de control sen necesidade de dispor dun
PLC. Este "driver" incle caractersticas como: a posibilidade de traballar como "master"
con distintos buses de campo (Profibus-DP, Interbus-S, CANOpen ou DeviceNet); a
monitorizacin e forzado de varibeis en tempo real; ou a modificacin "on-line" dos
programas.
As ferramentas para a programacin de "drivers ", orientadas a aqueles usuarios
avanzados que queiran desenvolver "drivers" para dar soporte a novos PLCs.
137
O editor soporta as opcins de edicin mis comns nos ambientes grficos: inserir, mover,
copiar e eliminar redes ou elementos das redes, zoom, etc. e incle unha opcin que permite
traducir automaticamente os SFCs a LD.
4.2.7.2.1. Estructuras de control
O editor non permite definir unha estructura xerrquica entre SFCs. A estructuracin do
proxecto realzase a nivel de POU, seguindo as recomendacins do estndar IEC 61131-3.
..._ T ____^. _ _
^._.
_
-
f ,
(^ : -^ ^
----
'
'
^^:
^
F^'
I^
^
i
.^ ^
,
I: ^
ii
^
!, ;
^ .
tII
`
I '
( ^., ,
`
i
i
^_ _
;
i .-
i.
i
S
`' i
^e^
^
^-^"^S
^I
^ P`rt settrt^3s
^ Q SYstem tnary
': p_d [^achi H-series]
p..^ ^sf^^^
O[] [^C-^el
0-d [^^-sPedf^^l
^- llsa Ebrary
-
, ^
^^
r ^ y^j . ( . ^1
:
'
1
e ^;
'^,
-^.
,.
,Y.
. .
..
^^_
4^
-^
. . . , , ,
o
^,
^
.
a.
,^^ ?
-
^;,
_ ^
'
.:
. , ^- ^ >.
..
^ 's^
,^^ . ;^_. .
7 -^ .^_r^
^ ( to
-.^^^
^,
,.
^I:,
^
. ^ ^T'^
.^ ..
:
^^
--
^, r._
!^..^:U:a.
- . . __ ' .
t ^ __ .. ,
[f
e
_i
^Cordroi
^ ^;.,
^
, , . ^'
^ i ,^
^.
^ 6W MOndOt
,,
;-
[
{^ t ^
-'
^' ^-^
^
^-xi
pl ^r^
^r
^^
Pktwork 5
.. .
],
[^
--Ol ^
^ ^,,,v+
^
-^
^
^-
ma^n
Network
'(^ ^9nd
`- ^ llp^rConveyorCordrd
p Hardwere confi9watfon [H ecF^ H-series]
q ^g5M-4
,
PSM-A2
^^O
rj ^ r+25x (cPtm-o2HC) [meiN
ACTANA-S2
_^^ PIM-0W
....
POM.RH
i^
^^
^^ ;
i,
r
t
^ rl 'y^
-^ X ^ ^
;
'
^+. [] SYmbds
^^^
^f ^i
..
^
^^ ^
^
^^^^,^=^^
^^^^_ ^^. ^^_^>
- .^ -_; _-^ -
..
=q x
.,a;x
.
a
. ^_,; .: -.
^.^ . Eae _Et:zxiew jm^rt>;:9Perafioru ^"Sortnr^aGon^ I^ ^ci^ow^.tleb ..., ;.
^`^ i`^ ^ ;^ ^ (^ ^' ^G ^C: '^ X ris ^ S^ ^^ ^I^`^ ^ '^tF ^r ^, ^. ^,aa `^ ^ t4: ^ ^t2 I 1
`,,
^^
,, `
j^
^`
'
^ F^
^.
^,
^:
^, ^ ^
r
' -o
- *^.
^
^_
_.._
{
.__
_ .^..__-- - - --- -
-^ :
-,,_ .._,_ _
_.. ^ ^ ^
z,- : _
..
^.^l^ 3 ^ F^ ._^S
.I_eit
t'
_-
,,
^:^rt.^ ..^^^^^u _
`
^^ X ^
`.
._..
_ _
.
. . .^ ^ . ^'
-- -^- --- -
.
l dr
.
:
.
IEC rddrew
-,
Tl^
.
^ .. .
.. .PLC addr ,CammeiR
I,_ _
.
r.......
..
BOOL
%Mi A2 = ' R2
; ' - L ' St 1 X
I i..L-, stert_BWOn
%112
' f:
BOOL
X00102
' F=L. PE_id_Corneyor BOOL
9N1.4
X00104
BOOL
%11.6
: fL^ Lift Low
X00106
.^ ^ '
L` Litt_Fisp^
9Nt.8
BOOL
XOQ108 _
`'
-_.^^
..
.
=_^--_
_
.
.
; ^
_
.
-.^--
-..
,
.
^
,
.
t=
:
.._____
i .
..
,
r . k.
-_
' .- -=--r^-_ _-_<
- - -- - - - - -- _ :--L---- -- _
^- --_._ .-^, _ - - ----- -- ^ - -^-_ ^
-- ^ M'uedmode ^ OB^Sne ^^ f/
-1^ (^JrLtit ^ ^ . M 1 Q
138
asociado un smbolo booleano, que ser modificado durante a activacin da etapa, ou ser
programadas mediante a linguaxe LD. O mesmo pode dicirse das receptividades, que poden ter
asociado un smbolo booleano ou unha condicin lxica en LD. Nos diagramas LD poden
usarse os FBs predefinidos que inclen temporizadores e contadores. O programa non impide a
edicin de receptividades que produzan `efectos colaterais' durante a sa avaliacin.
4.2.7.2.4. Identificacin
O propio proceso de edicin do ActWin impide que se editen estructuras SFC incorrectas,
que se utilicen identificadores duplicados ou se asignen os smbolos a puntos de E/S
incorrectamente. Ademais o programa incle tamn unha opcin de verificacin sintctica que
realiza a comprobacin da correccin do proxecto antes de descargalo no PLC.
4.2.7.2.6. Simulacin e execucin
139
etc. A aplicacin completase cun "driver" softPLC que permite executar os programas no
propio PC e ferramentas para o desenvolvemento de "drivers" para soportar novos PLCs.
Dende o punto de vista do Grafcet, o ActWin implementa o SFC dacordo ao definido no
estndar IEC 61131-3. Polo tanto s permite utilizar as estructuras de control bsicas, non
incle soporte xerrquico, o algoritmo de interpretacin de tipo SRS e non manexa
correctamente os conflictos entre accins. En resume, no ActWin destaca o fcil que resulta a
edicin dos programas e configuracin dos smbolos gracias aos dilogos que guan ao usuario,
e o alto grao de conformidade co estndar IEC 61131-3. Ademais a aplicabilidade da aplicacin
non se limita unicamente programacin de autmatas Hitachi, xa que o"driver" softPLC
pode configurarse como "master" de diferentes buses de campo, o que permite realizar o
control directamente dende o PC.
4.2.8. WinGrafcet
O WinGrafcet unha aplicacin Windows desenvolvida polo Centro Rexional de
Documentacin Pedagxica do Languedoc-Roussillon en colaboracin co Centro de Formacin
Tecnolxica de Montpellier, para o desenvolvemento de programas de control secuenciais
mediante Grafcet. A versin analizada a versin 1.01 de demostracin.
4.2.8.1. Compoentes
A aplicacin est formada por un editor grfico, un verificador sintctico, un simulador e un
monitor en tempo real compatbel con mltiples interfaces de E/S (AM 1, AM2, IP 16,
Approtech, Technologie Service, Ipocaen, etc.).
4.2.8.2. O editor Grafcet
O editor Grafcet do WinGrafcet (Figura 4.13) est orientado edicin de mltiples grafcets
conexos e permite as operacins bsicas de edicin nun ambiente grfico como: seleccionar,
mover, copiar, eliminar, zoom, etc. A rea de traballo divdese en filas e columnas, podendo
inserirse en cada cela un dos elementos sintcticos bsicos do Grafcet. O editor incle unha
opcin para detectar e eliminar as estructuras non conexas antes de realizar a verificacin
sintctica, e os smbolos utilizados poden verse en dous niveis de descricin diferentes.
4.2.8.2.1. Estructuras de control
O editor facilita a edicin de mltiples grafcets conexos que contean calquera dos
elementos sintcticos bsicos do Grafcet. Non se incle ningunha das extensins sintcticas nin
soporte estructura xerrquica. Non est permitido que as lias se crucen e as estructuras de
seleccin de secuencia e paralelismo non poden utilizarse de forma flexbel, o que impide a
edicin de grafcets complexos. Poden utilizarse ciclos e saltos de secuencia que son
representados mediante referencias de salto. Est permitido iniciar mltiples saltos ou ciclos
dende un mesmo punto da secuencia de control.
4.2.8.2.2. Estructura xerrquica
O WinGrafcet define diferentes elementos de memoria que poden ser utilizados en accins e
receptividades: entradas (e0-ell), sadas (s0-s^, varibeis internas (v0-v99), temporizadores
140
(t0-t19) e contadores (c0-c19). Os nomes destes elementos estn predefinidos e non posbel
modificalos. A cantidade de elementos dispobeis de cada tipo depender da interface de E/S
da que se dispoa, aspecto que controlado polo programa durante a verificacin sintctica.
O editor permite unicamente accins continuas cunha das sintaxes da Tboa 4-V. Nas
receptividades poden utilizarse os valores de entradas, varibeis, contadores, temporizadores, e
o estado das etapas relacionados mediante operadores booleanos, de comparacin e^^ de
deteccin de flancos. O intento de modificacin dunha sada dende unha receptividade
detectado polo programa durante a verificacin sintctica impedndose as os `efectos
colaterais'.
irhier
Edition
E^ment
Affichage
Optiotts ,4ryde
S;
C;(valor)
C;++, C;-
Iniciar un contador
V;(valor)
T;
Iniciar un temporizador
Incrementar/decrementar un contador
4.2.8.2.4. Identificacin
141
4.2.9. Graf7-C
O Graf7-C unha aplicacin realizada con fines educativos polo Centre Collgial de
Dveloppement de Matriel Didactique do Canada, para o desenvolvemento de programas de
control mediante o uso conxunto do Grafcet e a linguaxe C. A versin analizada a 2.1 para o
sistema operativo DOS.
4.2.9.1. Compoentes
A aplicacin est formada por un editor, un analizador sintctico, un compilador, un
traductor, un simulador e un monitor en tempo real.
4.2.9.2. O editor Grafcet
O editor Grafcet do Graf7-C (Figura 4.14) traballa en modo texto e soporta as operacins
bsicas de edicin: seleccionar, mover, copiar, eliminar, zoom, etc. Permite a edicin de
mltiples grafcets conexos distribudos en catro pxinas de 255 filas por 255 columnas,
reservando as filas impares para as etapas e as pares para as transicins. Os grafcets poden
visualizarse en tres niveis diferentes de detalle: documentacin, programacin e cdigo C, e a
correccin sintctica das estructuras editadas comprobada durante a edicin.
142
Para a edicin dos grafcets poden utilizarse todas as estructuras de control bsicas e algunha
das extensins sintcticas: etapas (transicins) fontes e sumidoiro, macroetapas e ordes de
forzado. O uso das estructuras de seleccin de secuencia e paralelismo flexbel, pudendo
editarse estructuras complexas. Os ciclos e saltos de secuencia poden representarse mediante
arcos ou mediante referencias de salto, e poden iniciarse varios ciclos ou saltos dende' un
mesmo punto da secuencia de control. O editor non considera coma erro que unha transicin
sexa simultaneamente fonte e sumidoiro. Ademais o editor permite a utilizacin doutros
elementos sintcticos non estndar:
1. As tarefas, que son unha alternativa s macroetapas en PLCs programados mediante
diagramas de contactos.
2. As ordes de bloqueo, que son un caso particular das ordes de forzado que bloquean o
estado dun grafcet na situacin actual mentres a orde estea activa.
4.2.9.2.2. Estructura xerrquica
^dohe
compta^^12'
X4`:. .
5}.-done;.
.
^
^
:^
143
T/<X>/<t2>s
T/<t>>S/<X>/<t2>s
T/<t>>s/[T ^ ^]<expresin>
polo que as accins demoradas e limitadas representaranse como:
if (T/ls/X;) accin;
// accin retardada
if (T/X;/ls) accin;
// accin limitada
if (T/ls/X;/2s) accin;
Sen embargo durante as probas realizadas, os temporizadores que inclen un tempo t1 non
funcionaron correctamente, polo que foi preciso representar as accins limitadas da forma
seguinte:
if (!(T/ls/X;)) accin;
// accin limitada
Continuas
Memorizadas
Condicionais
Impulsionais
Ordes de forzado
Ordes de blo ueo
<varibeh;
<varibel> = 1 0 ;
if (pulseQ) <accin>
<varibel> = pulseQ;
<contador> + - = ulse ;
F/^sub a cet>: *
144
As receptividades no Graf7-C son condicins lxicas escritas en C7, polo que poden
utilizarse os operadores lxicos e relacionais do C, chamadas a funcins, temporizadores,
eventos e unha macro denominada done, que certa cando as accins asociadas s etapas
previas transicin foron xa executadas. O Graf7-C non impide que durante a avaliacin das
condicins poidan producirse `efectos colaterais'.
4.2.9.2.4. Identificacin
O Graf7-C realiza a anlise sintctica en das fases, durante a edicin s poden inserirse
smbolos e realizar conexins que cumpran a regra de alternancia etapa-transicin, e impdese o
uso de identificadores duplicados. A deteccin de erros sintcticos no contido de accins e
receptividades realzase durante a compilacin do grafcet. Durante as probas comprobouse que
o compilador non detecta o uso incorrecto de macroetapas (macroexpansins sen etapa de
inicio ou fin, macroetapas sen macroexpansin ou viceversa), erros nas ordes de forzado
(forzado de etapas inexistentes, autoforzado dun grafcet), ou a existencia de arcos non
conectados.
4.2.9.2.6. Simulacin e execucin
145
e para permitir a simulacin, tamn asigna as entradas booleanas ao teclado. O usuario pode
modificar esta interface editando o arquivo grafcet.io e implementando un conxunto de
funcins reservadas no Graf7-C para realizar as operacins de E/S.
4.2.9.2.7. O algoritmo de interpretacin
146
4.3. Conclusins
Os datos obtidos da anlise de caractersticas de cada aplicacin resmense nas tboas
situadas ao final deste captulo. En base a eses datos poden extraerse as conclusins seguintes:
No referente ao editor Grafcet:
1. Todas as aplicacins analizadas (excepto GrafcetView) utilizan un editor que divide o
rea de traballo en filas e columnas e restrinxe o tipo de nodo que pode inserirse en
funcin da posicin. O modelado de estructuras Grafcet complexas require que esta
divisin non impida o uso flexbel das estructuras de inicio e fin de seleccin
(paralelismo), que se permitan os cruces de lias ou a utilizacin de referencias de
salto, e que non se limite o nmero de grafcets conexos nin de etapas iniciais. Isto non
soportado por todas as aplicacins analizadas, en especial as baseadas no SFC.
2. A edicin da estructura xerrquica dun modelo mais fcil se se dispn dunha vista
tipo rbore na que se representen os niveis de aniamento da xerarqua. Das
aplicacins analizadas que soportaban a estructuracin dos modelos, a maiora incluan
esta vista para a xerrquica estructural mais non para a xerarqua de forzado.
3. A maior parte das aplicacins fan a anlise sintctica en das fases. Isto, xunto coa
inclusin de asistentes para a edicin de estructuras Grafcet (como o do AutomGen,
p.e.) e do cdigo de accins e receptividades (como o do Visual I/O, p.e.), facilita a
edicin e especialmente til para os usuarios inexpertos durante a aprendizaxe.
4. Ningunha das aplicacins analizadas incle un soporte completo identificacin dos
diferentes elementos dun grafcet: ou ben non permiten identificar todos os elementos,
ou non permiten identificadores alfanumricos, ou non numeran automaticamente os
novos elementos, ou non inclen opcins que mantean a coherencia da numeracin
durante a edicin. Neste aspecto, o IsaGraph a aplicacin mis completa, pois
permite a numeracin alfanumrica de etapas, transicins e subgrafcets, e actualiza
correctamente as copias de elementos xa existentes, as referencias de salto e o cdigo
de accins e receptividades durante a edicin.
5. Outra caracterstica desexbel nun editor Grafcet a posibilidade de xestionar unha
librara de estructuras grafcet predefinidas. Unicamente o AutomGen incle unha
destas libraras, mais non permite modificala.
147
148
Outras consideracins:
1. Exceptuando o GrafcetView, que implementa o Grafcet como librara para LabView,
ningunha das aplicacins analizadas permite utilizar o Grafcet fora do ambiente da
propia aplicacin, de xeito que poida ser integrado con outras aplicacins, libraras ou
linguaxes. Isto ten como consecuencia a perda de aplicabilidade, xa que non permite
utilizar o Grafcet como formalismo xenrico independente da tecnoloxa de
implementacin e aberto integracin de calquera linguaxe para a especificacin de
accins e receptividades.
2. Non existe un formato para o intercambio de grafcets entre aplicacins. Isto
consecuencia tanto do comentado no punto anterior como das diferencias entre as
aplicacins hora de implementar o Grafcet. Este formato nin sequera existe entre as
aplicacins que seguen as recomendacins do IEC.
3. Ningunha aplicacin permite configurar o tipo de interpretacin co que o usuario quere
executar os modelos. Sera desexbel dispor dun ambiente de execucin no que o
149
150
GRAFCETVIEW
_
_ _
Dis oibilidade
Fabricante
Tipo
Sistema o erativo
Sistema E/S
E ui o de control
Ambiente de execucin
__ .
^^^ ^
Comercial
AlterS s
Programacibn
sistemas distribudos
Windows
Windows, Unix
Serie, DAO, GPIB, Modbus, Memobus,
Profibus
VXI
PC, PLC, SCADA
PC
l.inux, VxWorics, pSOS,
LabView
Windows
Comercial
TecAtlant
Librara LabView
PL7
MACHINESHOP
ISAGRAPH
,.. .
^j....
^ ^^^
._
^ :..^ ^
Comercial
Comercial
CTC Partcer Automation Schneider Automation
Programacin PLC
HMI/SCADA
Windows
Profibus, DeviceNet,
Modbus, PC104
PC, PLC, CTC
RTXDOS
Windows
Modbus, Profibus,
InterBus, CanO en
PLCs Telemecani ue
PLCs Telemecanique
Filas e cotumnas
Si
Si (2 fases)
Si
Non
Non
Si
Si
Si
Si
Si
Filas e columnas
Si
Si (2 fases)
Si
Non
Non
Si
Non
-
Filas e columnas
Si
Si (2 fases)
Non
Non
Non
Si
Non
-
Si
Si
SoftPLC portbel
Si
Si
Si
Si
Si
Si
Si
Si
SoftPLC en RTXDOS
Si
Si
Non
Non
Si
Si
Si
Non
Si
Si
Si
Si
Si
Si ( IEC)
Si
Si
Si
Si
Si
Si (mediante Interact)
Si
Si
Si
Si
Si
Si
Si
Si
Si
Si
Si
Editor Grafcet
Editor LabView
Tipo editor
Edicin: copiar, mover, ...
Si
Si (2 fases)
Anlise sintctica
Non
Asistente edicin cdigo
Non
Asistente edicin estructuras
Non (pode crearse)
Librarfa de estructuras
Non
Identificacin automtica
Non
Opcins renumeracin
Renumeracin ao copiar
Renum. referencias de salto
Renumeracin referencias en accins e receptividades
_Opcins de simulacin e dperacin
Animacin de grafcets
Simulacin
Ambiente de simulacin
Simulacin de entradas
Depuracin
Execucin paso a paso
"Breakpoints"
Monitorizacin varibeis
Forzado de varibeis
Funcins adicionais
Estructuracin do proxecto
Diccionario / Tboa simbolos
Editor configuracin hardware
Editorconfiguracin E/S
Referencias cruzadas
Biblioteca de programas
Editor interface de usuario
Documentacin do proxecto
SDK para programacin
151
AUTOMGEN
. .,, _ " . . .
..^
. .
_^, . .
.
,.
.,'
- . y.-
ACTWIN
__
^ '
..
Comercial
ArSoft Intemational
HMI/SCADA
Comercial
Irai
Programacin
software de control
Windows
Windows
Profibus, Modbus,
Profibus, Modulink,
Interbus, CanOpen
Modbus
PC
PC, PLC
Windows/Sistemas RT Postprocesador PC ou
x86
PLC
,- ,,_
`E^3ifor G'raft
. ..^
Filas e columnas
Si
Si (2 fases)
Si
Non
Non
Si
Si
Non
Si
Non
-,-
_,,^.
__ ---^
-_
Filas e columnas
Si
Si (1 fase)
Si
Si
Si
Non
Si
Non
Non
"de"imtilacin/dep"rac^ii^`
^Opcids
'. :^
K, ,^
.....
.
Si
Si
SoftPLC en NVindows
Si
Si
Non
Non
Si
Si
Si
Si
Simulador Windows
Si
Si
Si
Non
Si
Si
^Funcis
adiiona^ '
^ _ ., .
_ ^,
_
.
Si
Si
Si
Si
Si
Si
Si
Si
Si
Non
Si (mediante VPUs)
Si
Si
Si
Si
Si
Si
Non
.,
.. <
^:
.
WINGRAFCET
_ ,
_...^.
_ _ _x .
. -..
. ... .
- ^,
-. .
GRAF7-C
.
. . . ,,
.
,e ^
^
...C'
^
.
.
Comercial
Actron
Programacin PLC
Comercial/Educacin
CDRP Montpellier
Programacin Grafcet
Educacin
CCDMD
Programacin Grafcet
Windows
Profibus, Interbus,
CANOpen, DeviceNet
PC, PLCs Hitachi
Windows
Windows
AM1, AM2, IP16,
Approtech, Ipocaen
PC
Windows
DOS
Tancetas E/S para PC
^-o_. _
Edicin controlada
Si
Si (2 fases)
Si
Non
Non
Si
Si
Si
Si
PC
DOS
^^ o- ^. g.^^ ^^- :
. -_ _.._
__ . _ . . . ._-
- .
Si
Si
SoftPLC en Windows
Si
Si
Non
Non
Si
Si
^
,
Si (IEC)
Si
Si
Si
Si
Si
Non
Si
Si
Filas e columnas
Si
Si 1 fase)
Non
Non
Non
Si
Si
Non
Non
Non
^ . .^
,
_^.^__
Non
Non
Non
N/A
Non
Non
Non
Non
Non
c^.
S^
Si
Simulador Windows
Si
Si
Non
Non
Si
Non
^ ^,:
_--
Filas e columnas
Si
Si (2 fases)
Non
Non
Non
Si
Si
Si
Si (con erros)
Non
`^
-. ,
.
^.
....^.
Si
Si
Simulador DOS
Si
Si
Si
Non
Si
Non
_ .
. .. _ _. -_ . " ,...
Non
Non
Non
Si (mediante prog.)
Non
Si
Si (mediante prog.)
Non
Si
Tboa 4-VIII. Resume dos resultados da anlise: funcionalidades das aplicacins (continuacin).
'
8
-..-_^.. ...
-__
152
GRAFCETVIEW
Grafcet/SFC
ISAGRAPH
PL7
MACHINESHOP I
Grafcet
SFC+xerarqua propia
SFC
Si
Si
Si
Non
Si
Si
Si
Si
Si
Si
Non
Non
Si
Non
Si
Si eta as de salto
Eta as sumidoiro
Non
Si
Si
Si
Si
Non
Non
Estructuras de control
Secuencia
Si
Si
Si
Si
Seleccin de secuencia
Paralelismo
Salto de secuencia
Ciclo
Semforo
Si uso flexbel
Si uso flexibel
Si
Si
Si
Si uso flexbel
Si uso flexbel
Si
Si
Non
Si uso rxido
Si uso rxido
Si
Si
Non
Si uso flexbel
Si uso flexbel
Si
Si
Si
Si ca sulamento Vls
Si ca sulamento Vls
Si
Non
Non
Non
Si
Non
Non
Non
Non
Non
Si
Non
Si
Non
Sintaxe ro ia
N, C
emulacin D e L
Si
Si
Si varibeis de eta a
Non
Si
lL, ST, LD
N, R, S, P0, P1
Si
Si FBs IEC
Si FBs IEC
Si FBs IEC
Si
Si
Si FBs IEC
Si FBs IEC
Si FBs IEC
Si
Si uso limitado
Non
Si FBs IEC
Si FBs IEC
Non
Numrico
Eta as
Alfanumrica
Eta as, trans., rafcets
Alfanumrica
Eta as, trans., accins
Numrico
Eta as
Si
Si
Si
Si
Si evtase na edicin
-
Si
Si
Si
Si
Si
-
Si
Si
Si
Si
Si
Si
-
, .
"Smtax^
Grafcet
,i
Elementos bsicos
Identificacin
Ti o
Elementos
Si
Si
Si
Si
Si
Non
-
^^Inter retaci
^^ ^^^
Al oritmo
Ti o
Deteccin ciclos estacionarios
Trans. fonte sem re validadas
Eventos na esca/a intema
Escala eventos intemos
Varibeis eatema^ntemas
Accins en situacins inestbeis
Accins extema^ntemas
FO en situacins inestbeis
A licacin n:cursiva de FOs
ARS
Si
Non
Eventos
Intema
Non
Non
Non
-
SRS
-
SRS
-
SRS
-
Non
-
Si
Non
Si
Non
Non
Non
N/A
N/A
N/A
N/A
153
Grafcet
^^^
`Sintaxe
.....,
AUTOMGEN
Grafcet
^^n^
^
-^_
.
^. ;^^ _
ACTWIlV
SFC
,_
.^
. __ _
WINGRAFCET
GRAF7-C
Grafcet
^ ,.x.
. ^._..
.
-
Grafcet
. .:. .. -..
'
Elementos bsicos
Si
Si
Si
Si
Si
Si
Si
Non
Si
Si
Si
Si
Si
Si
Si
Si
Si
Si
Non
Si
Si
Si
Non
Non
Si
Non
Non
Si
Si
Si
Si
Si uso rixido
Si uso rxido
Si
Si
Non
Si
Si uso rxido
Si uso rxido
Si
Si
Non
Si
Si uso flexbel
Si uso flexibel
Si
Si
Si
Non
Non
Si
Non
Non
Non
Si
Non
Si tamn tarefas
Non
Si
Si
Sintaxe ro ia
N, C, R, S, P1, PO
emulacin L, D, DS
Si
Si
Si
Si
Non
LD, FBD
N, R, S, P, L, D, DS,
SD, SL
Si
Non
Si
Si
Si
Sintaxe ro ia
N
Si
Si
Si
Si
Non
C7
N, C, R, S, P
emulacin L, D
Si
Si
Si
Si
Si
Numrico
Eta as
Alfanumrico
Eta as, accins, recs.
Numrico
Eta as
Num./Alfanumrico
Eta as, trans., GCs
Si
Si
Si
Non
'
Si
Si
Si evtase na edicin
Non
-
Si
Si
Si
Si evtase na edicin
-
Non
Si
Si
Si
-
Si
Si
Si
Non
Non
Non
Non
Estructuras de control
Si
Si uso flexibel
Si uso flexibel
Si
Si
Si
Si
Si uso flexbel
Si uso flexbel
Si
Si
Si
Si
Non a ru am. GCs
Si
Si
Identificacin
Numrico
Eta as
Int
Si
Si
Si
Non
Si limitado
Non
retacin
"
'
-^
AI oritmo
SRS
Non
-
ARS
Non
Si
Eventos
Intema
Non
Si
Non
Si
Non
SRS
-
SRS
-
ARS
Si
Si
Eventos
Intema
Non
Non nin im ulsionais
Non
Non
Non
Si
Non
Non
Non
N/A
N/A
N/A
N/A
Non
Non
Non
Non
Non
Non
Non
Non
155
156
^^
Grafcet Core
Grafcet Hierarchp
Grafcet Data
Grafcet Actions
157
ModelElement
name : Name
_^
Feature
ownerScope : ScapelGnd
visibility : YsibilityKind
Structural Feature
multiplicity : Multiplicity
changeability : ChangeableKind
targetScope : ScopeKind
ordering : OrderingFGnd
^
Attribute
initiaNalue : Expression
Action
recunence : IterationExpression
target : ObjectSetExpression
isAsynchronous : Boolean
script : ActionExpression
BooleanExpression
^
Behavioral Feature
is^uery : Boolean
Operation
signature : String
isRoot : Boolean
isLeaf : Boolean
isAbstract : Boolean
concurrency : CaIlConcunencylGnd
specification
1
Method
body : ProcedureExpression
Caracterstica ("Feature")
unha propiedade capsulada nun clasificador (elemento con propiedades estticas e
dinmicas). No metamodelo declara unha caracterstica estructural ou de comportamento dun
clasificador ou dunha instancia dun clasificador. Esta metaclase abstracta.
Atributos:
visibility, indica se a caracterstica pode ser utilizada por outros clasificadores. Pode ter un
dos valores seguintes:
158
n
n
n
multiplicity, indica o nmero de valores da caracterstica que pode haber en cada instancia.
O caso mais comn unha multiplicidade 1..1 (un nico valor para a caracterstica).
n
n
Atributo ("Attribute")
Un atributo un espacio identificado dentro dun clasificador que describe o rango de valores
que as sas instancias poden tomar.
Atributos:
initial Value, unha expresin que especifica o valor do atributo despois da iniciacin. Este
atributo est pensado para ser avaliado no momento en que o obxecto iniciado.
159
Atributos:
Operacin ("Operation")
Unha operacin un servicio que pode solicitarse dende un obxecto para levar a cabo un
comportamento. Unha operacin ten unha declaracin que describe os seus parmetros e
valores devoltos. No metamodelo unha operacin unha caracterstica dinmica que pode
aplicarse s instancias do clasificador que contn a operacin.
Atributos:
signature, declaracin da operacin.
sequential, os clientes deben coordinarse para que s unha chamada estea activa en
cada momento. A semntica e integridade do sistema non pode garantirse se hai varias
chamadas simultneas.
guarded, estn permitidas varias chamadas simultneas mais s pode comezar unha
delas. As demais son bloqueadas ate que a primeira se completa. responsabilidade do
deseador do sistema garantir que non se produzan interbloqueos ("deadlocks").
concurrent, pode haber mltiples chamadas simultneas dende "threads" concorrentes
e todas elas son executadas concorrentemente mantendo a correccin semntica.
isRoot, indica se a clase pode herdar ou non unha declaracin para a mesma operacin. O
valor true indica que non e false que si.
Mtodo ("Method")
Un mtodo a implementacin dunha operacin. Especifica o algoritmo ou procedemento
que calcula os resultados da operacin. No metamodelo un mtodo unha declaracin dunha
parte identificada do comportamento dun clasificador e realiza unha (directamente) ou varias
(indirectamente) operacins do clasificador. Como moito debe haber un nico mtodo para
cada par clasificador/operacin (o primeiro como propietario e a segunda como especificacin
do mtodo).
Atributos:
Asociacins:
specification, indica a operacin que o mtodo implementa.
Accin ("Action")
Unha accin a especificacin dunha sentencia executbel, abstraccin dun procedemento
computacional que provoca un cambio no estado do modelo e que pode realizarse mediante o
envo dunha mensaxe a un obxecto ou a modificacin dunha conexin ou valor dun atributo.
Esta metaclase abstracta.
160
Atributos:
isAsynchronous, indica si o envo dun estmulo por parte da accin asncrono ou non.
target, expresin que indica o conxunto de instancias aos que se lles vai a aplicar a ac in.
UML non define se a accin aplicada secuencialmente ou en paralelo.
Expresin ("Expression")
Unha expresin define unha sentencia que devolver un conxunto de instancias cando sexa
avaliada nun contexto. As expresins non modifican o contorno no que son avaliadas.
Atributos:
macro, a etapa representa unha macroetapa, cuxos contidos sern especificados nunha
macroexpansin.
161
both, o nodo pode aparecer en calquera punto dunha secuencia de control (pode ter
conexins con nodos que o precedan ou sucedan na secuencia).
none, o nodo non forma parte dunha secuencia de control (non ten conexins on ningn
outro nodo).
enumeration
StepType
step
initial
macro
enumeration
NodeType
source
target
both
none
ModelElement
(Pattern}
Proxy = {
Proxy,
Subject,
RealSubject
}
^
SystemVar
value : DataType
RealSubject ^
Feature
(trom UYL Metemode^
Cwent
change : l3oolean
events
var
Situation
^
^ Proxy
Structural Feature
(from UML Metamode^
reads
enumeration
ActionType
Attribute
N
R
P1
PO
P
t
GrafcetVar
value : DataType
BooleanExpression
(irom UML Melamodet)
var
reads
enumeration
FOrderType
^
Grafcetl3ooleanCondition
GrafcetTemporizedCondit ion
delay : TimeExpression
limit : TimeExpression
force
empty
initial
freeze
ProcessValue
alias : String
'
qctionState
StepState
mod^able : Boolean
^----------------------- '
T'imerValue
empty, a orde forza a situacin baleira nun grafcet. Todas as etapas do grafcet son
desactivadas.
initial, a orde forza a situacin inicial nun grafcet. Todas as etapas iniciais do grafcet son
activadas e todas as demais desactivadas.
freeze, a orde forza a situacin actual dun grafcet. Mantense o estado de activacin das
etapas impedindo as evolucins estructurais do modelo.
162
Evento ("Event")
Un evento representa un cambio no valor dunha varibel booleana manexada polo modelo.
O xeito de xerar o evento ou o seu manexo son aspectos que non se especifican no metamodelo.
Atributos:
change, indica o tipo de cambio do valor: true indica un flanco de subida e false un de
baixada.
Asociacins:
39 Representouse o acceso externo mediante o patrn de deseo Proxy [67]. A representacin grfica do patrn non
coincide coa estndar proposta por UML debido a limitacins da ferramenta de modelado utilizada.
163
delay, expresin temporal que indica a demora antes da que a expresin non pode ser
avaliada. O valor resultado da avaliacin da condicin non tido en conta antes de
transconrer o perodo de tempo indicado polo valor deste atributo.
limit, expresin temporal que indica o lmite temporal despois do cal a expresin non pode
ser avaliada. O valor resultado da avaliacin da condicin non tido en conta unha vez
transcorrido o perodo de tempo indicado polo valor deste atributo.
^
164
links, indica a posicin que pode ocupar o nodo nunha secuencia de control (se pode ter
predecesores e/ou sucesores).
Asociacins:
predecessor, indica os predecesores do nodo nas secuencias de control nas que este
participa.
successor, indica os sucesores do nodo nas secuencias de control nas que este participa.
ModelElement
(hom UML Metamode^
predecessor
^^
G^afcetNode
links : NodeType
` ^J
successor
GrafcetAction
(hom GufeHAeUor^
Transition
actions
^ type : StepType
1
receptivity ^ t
state I 1
ActionAssociation
(from GrafoelANOn^
StepState
(trom Grafoet DaL)
ForcingOrder
(trom Orafeet Actlons)
faces
situation
Situation
(from Outoet Datal
groups
ConnectedGrafcet
^
1..'
GrafcetNode
nodes links : NodeType
^
MacroExpansion
start
end
1^
SteP
1 type : StepType
Transition
t
expansion
,, Component
MacroStep
(Pattem)
Composite = {
Component,
'--------------------------------------------Container,
Container
Leaf
}
165
Etapa ("Step")
Unha etapa representa un punto da secuencia de control susceptbel de realizar algunha
actuacin que modifique o estado do modelo. En cada instante da execucin unha etapa pode
estar activa ou non. Unicamente as etapas activas poden realizar actuacins. O conxunto de
etapas activas determina a situacin actual do modelo.
^
Unha etapa pode realizar mltiples actuacins que modifiquen o estado do modelo (e
indirectamente o do sistema controlado polo modelo).
O estado dunha etapa almacenado nunha varibel booleana do modelo que pode ser
utilizada nas condicins lxicas. Unha etapa pode participar nunha ou mais secuencias de
control. Poden conectarse a unha etapa mltiples transicins que a precedan ou a sucedan nas
secuencias nas que participe, mais non pode conectarse a outra etapa.
As etapas iniciais e as macroetapas son tipos especiais de etapas. O estado das primeiras
activado ao comezo da interpretacin do modelo. O conxunto de etapas iniciais determina a
situacin inicial dun modelo. En canto s macroetapas, son representacins abreviadas de
partes dun grafcet que cumpren unhas regras sintcticas especficas.
Atributos:
type, indica o tipo de etapa.
Asociacins:
state, indica a varibel do modelo que contn o valor do estado de activacin da etapa.
actions, actuacins realizadas pola etapa cando est activa.
Transicin ("Transition")
Unha transicin representa un punto da secuencia de control no que a execucin se detn ate
que se cumpra unha condicin determinada.
Unha transicin pode participar nunha ou mais secuencias de control. Poden conectarse a
unha transicin mltiples etapas que a precedan ou a sucedan nas secuencias nas que participe,
mais non pode conectarse a outra transicin. Tampouco correcto que unha transicin non
participe nunha secuencia de control (tea un valor none no atributo herdado links).
Asociacins:
receptivity, condicin lxica que debe cumprirse para continuar a execucin da secuencia
de control. As regras de evolucin do Grafcet (3.3.1) indican que o resultado da avaliacin
desta condicin s se ten en conta cando todas as etapas que preceden transicin estean
activas, excepcin feita das transicins fonte (as que teen o valor source no atributo
herdado links) que estn sempre validadas.
Macroetapa ("MacroStep")
Unha macroetapa un tipo especfico de etapa que representa de forma abreviada un
conxunto conectado de etapas e transicins denominado macroexpansin da macroetapa. Unha
macroetapa pode aparecer nun grafcet na mesma posicin que calquera outra etapa e o seu
estado depender do estado das etapas da sa macroexpansin. As macroetapas non teen
actucins asociadas.
No metamodelo representouse como unha metaclase derivada de Step para modelar as as
asociacins e restriccins especficas que non comparte cos demais tipos de etapas. O valor do
atributo herdado type ten que ser igual a macro nesta metaclase. Ntese que para modelar o
166
feito de que unha macroetapa un nodo que contn outros nodos na sa macroexpansin,
aplicouse o patrn de deseo Composite [67].
Asociacins:
Macroexpansin ("MacroExpansion")
Unha macroexpansin un tipo de grafcet conexo que modela os contidos dunha
macroetapa. As macroexpansins teen unha restriccin sintctica, teen que comezar e
rematar por unha nica etapa, de xeito que a substitucin dunha macroetapa pola sa
macroexpansin mantea a correccin sintctica do modelo.
Asociacins:
start, indica a etapa de comezo da macroexpansin.
167
Asociacins:
name, indica a varibel booleana do modelo modificada polo bloque de accin durante a
sa execucin, dacordo semntica indicada polo cualificador do bloque. A varibel non
pode ser un valor de entrada do proceso.
indicator, indica a varibel booleana do modelo modificada polo bloque de accin para
indicar a finalizacin da sa execucin. A varibel non pode ser un valor de entrada do
proceso.
Feature
Action
Behavioral Feature
GrafcetAction
GrafcetVar
modify
name
o.. ^
indicator
Operation
(from UML Metamodep
O
^
specificatiord
Method
(from UML Metamodel)
'
set
ActionAssociation
ppe : ActionType
nternal : Boolean
Forcingorder
ype : ForderTppe
!/lOdlfy
condition
Actionlmplementation action
F
1
actrvate
ActionStateAssoc
^.. ^
GrafcetTemporizedCondition
(from Grafcet Data)
action, indica a accin cuxa execucin controlada polo bloque de accin mediante a
modificacin do valor da varibel do modelo que almacena o seu estado de activacin.
168
Asociacins:
forcerOrder, indica o grafcet parcial que contn a etapa que a orde de forzado est
asociada, dicir, o grafcet `forzador'.
forcingOrder, indica o grafcet parcial cuxa situacin forzada.
169
behavior
ModelElement
(from UML Metamoden
GlobalGrafcet o-
SystemVar
(from Grafcet Data)
^ -use ^
actions
GrafcetVar
Actionlmplementation
(from GrafcetAdions)
ConnectedGrafcet
(from Grafcet Core)
data
.
1
parts
subsystems 1..'
1
1
situation
PartialGrafcet
1
forcer ^1 1^ forced
Situation
(from Grafcet Data)
situation
1..' I nodes
groups
1..*
GrafcetNode
nodes
forcingOrder
forcerOrder
ForcingOrder
forces
(from GrafcetActions)
w
nodes, agrupamento dos nodos que pertencen ao grafcet parcial. Cada nodo est contido
tamn nun dos grafcets conexos que forman parte do grafcet parcial.
situation, indica a situacin actual do grafcet parcial, que o conxunto de valores dos
estados de activacin das etapas que forman parte do grafcet parcial. A situacin dun
grafcet global est determinada polas situacins dos grafcets parciais que o forman.
170
parts, agrupamento dos grafcets conexos que son parte dun grafcet parcial.
forcer e forced, ^ especifican a relacin xerrquica establecida entre dous grafcets parciais a
travs dunha orde de forzado. Esta xerarqua ten que ser acclica e non est permitido 0
forzado mltiple simultneo dun grafcet parcial durante a execucin do modelo.
A relacin utilizada para o clculo do peche transitivo a adxacencia entre instancias de tipo
T. Presuponse no tipo T a existencia dunha operacin que devolva os adxacentes dun conxunto
de instancias (almacenados nun atributo denominado adjacents). A descricin desta operacin
a seguinte:
T^allAdjacents(s : Set(T)) : Set(T);
allAdjacents = s^collect(adjacents)-^asSet
171
((var.ocllsTypeOf(StepState) or
(var.ocllsTypeOf(ProcessValue) and
var.oclAsType(ProcessValue).modifiable = false))--^isEmpty
Asociacin ("ActionAssociation")
1. As varibeis modificadas pola asociacin son booleanas.
-- nome
-- indicador
--indicador
self.indicator^notEmpty implies
self.Step.PartialGrafcet.GlobalGrafcet.data^includesAll(self condition.allVars)
l. a1lVars, calcula todas as varibeis accedidas dende unha condicin booleana, xa sexa
directamente ou a travs dun evento.
172
allVars : Set(GrafcetVar);
a1lVars = self.GrafcetVar-^union(self.Event->collect(var)-^asSet)
1. As varibeis que conteen os valores do estado de activacin das accins son de tipo
booleano.
l. As varibeis que conteen os valores do estado de activacin das etapas son de tipo
booleano.
self. value.ocllsTypeOf(Boolean)
Etapa ("Step")
,
1. Os eventos son cambios de estado de varibeis booleanas.
self. var. value. ocllsTypeOf(Boolean)
(nodel. a1lSuccessors^includes(node2)
or nodel.allPredecessors-^includes(node2)))
(self.context.ocllsKindOf(BehavioralFeature) or
ao Esta regra especifica que o contexto dos modelos Grafcet o mesmo que o definido en UML para os
StateCharts.
173
self.subsystems^forAll(PartialGrafcet pg ^
self.subsystems^includesAll(pg.allForced) and
self.subsystems^includesAll(pg. allForcers))
5. Os identificadores dos grafcets parciais includos nun grafcet global son nicos.
selfsubsystems^forAll(PartilGrafcetpgl, pg2 ^
8. Para cada accin includa nun grafcet global hai unha e s unha varibel co mesmo nome
que almacena o seu valor de activacin.
self.actions-^forAll(action ^
9. Para toda varibel includa nun grafcet global que almacene o valor do estado de activacin
dunha accin, hai unha e s unha accin.
self.data^forAll(GrafcetVar var^
10. Para toda varibel includa nun grafcet global que almacene o estado de activacin dunha
etapa, hai unha e s unha etapa.
self.data-^forAll(GrafcetVar var^
var.ocllsTypeOf(StepState) implies self.subsystems.nodes-^select(name = var.name)^size = 1)
11. As varibeis modificadas polas accins includas nun grafcet global estn definidas tamn
no mesmo grafcet global.
self.actions-^forAll(action ^
1. Os identificadores dos grafcets conexos includos nun grafcet parcial son nicos.
174
3. Cada nodo dun grafcet parcial est includo nun (e s nun) dos grafcets conexos que incle.
self.nodes-^forAll(node ^
self parts^select(nodes^includes(node))-^size = 1)
4. Todos os nodos dun grafcet conexo estn includos tamn no grafcet parcial que o contn.
self.parts^forAll(cg ^
self. nodes^includesAll(cg-^nodes))
5. Para cada etapa dun grafcet parcial hai unha varibel no grafcet global que almacena o seu
estado de activacin.
self.node-^select(isOclType(Step))^forAll(step ^
self. GlobalGrafcet.data-^includes(step.state))
1. a1lForced, calcula o peche transitivo dos grafcets forzados directa ou indirectamente por un
grafcet parcial dado ( o conxunto de grafcets parciais que pertencen a un nivel inferior da
xerarqua de forzado).
a1lForced : Set(PartialGrafcet); -- utiliza a relacin forcingOrder.forced (Figura 5.8)
allForced = transitiveClosure(forcingOrder.forced-^asSet)
2. allForcers, calcula o peche transitivo dos grafcets que forzan directa ou indirectamente a
un grafcet parcial dado ( o conxunto de grafcets parciais que pertencen a un nivel superior
da xerarqua de forzado).
a1lForcers: Set(PartialGrafcet); -- utiliza a relacin forcerOrder.forcer (Figura 5.8)
allForcers = transitiveClosure(forcerOrder.forcer^asSet)
Macroetapa ("MacroStep")
1. O valor do atributo herdado type sempre macro nunha macroetapa.
self.type = #macro
2. As macroetapas non teen accins asociadas.
self. actions-> isEmpty
175
3. Os tipos de etapas inicial e final dunha macroexpansin estn restrinxidos polo tipo da
macroetapa que pertencen.
self.links = #rtone
-- macroetapa fonte e sumidoiro
self.links = #source
-- macroetapa fonte
self.links = #both
-- macroetapa
Macroexpansin ("MacroExpansion")
1. As etapas inicial e final dunha macroexpansin son diferentes.
self.start <> self.end
2. A etapa inicial non pode ser unha etapa sumidoiro.
self.start.links = #both or
self.start.links = #source
self.end.links = #target
implies (node.predecessor-^size = 0
and node.succesor-^size = 0)
-- nodo sumidoiro
node.links = #target
implies (node.predeccesor^size > 0
node.links = #source
-- nodo fonte
node.links = #both
-- nodo normal
176
Operacins auxiliares
l. allPredecessors, calcula o peche transitivo dos predecesores dun nodo: o conxunto de
todos os nodos que o preceden na secuencia de control.
a1lPredecesors : Set(GrafcetNode); -- utilzase a relacin predecessor (Figura S.S)
allPredecesors = transitiveClosure(self-^predecessor^asSet)
2. allSuccessors, calcula o peche transitivo dos sucesores dun nodo: o conxunto de todos os
nodos que o suceden na secuencia de control.
a1lSuccesors : Set(GrafcetNode); -- utilzase a relacin successor (Figura S.S)
a1lSuccesors = transitiveClosure(self^successor-^asSet)
Situacin ("Situation")
Oneracins auxiliares
1. a1lSteps, devolve o conxunto de etapas cuxos estados de activacin son almacenados na
situacin.
allSteps : Set(Step);
a1lSteps = self.StepState^collect(step)->asSet
Transicin ("Transition")
1. As transicins non poden ser fonte e sumidoiro ao mesmo tempo.
self.links <> #none
2. Os antecesores dunha transicin s poden ser etapas.
self. predecessor^forAll (ocllsKindOf(Step))
177
2. ids.addCategory(`Step');
3. ids.addCategory(`Trans');
//
//
//
//
//
//
//
//
//
//
reserva a etapa 10
reserva a etapa 20
devolve true
reserva a tranaicia 10
0 10 xa est reaervado
libera a transicin 10
reserva a transicin 10
O segundo problema aparece cando queren almacenarse nunha mesma coleccin mltiples
nodos Grafcet de diferentes tipos (etapas, transicins, ...). As coleccins utilizadas (B.1)
presupoen que os elementos almacenados teen un identificador alfanumrico nico, mais isto
non se cumpre para os nodos dun grafcet, pois posbel que unha etapa e unha transicin tean
178
o mesmo identificador. En consecuencia foi preciso definir un mecanismo que permitira utilizar
l. Un identificador alfanumrico nico para os obxectos dun tipo dado (este o identificador
proporcionado polo usuario durante a definicin dos modelos).
2. Un identificador cualificado nico independente do seu tipo para todos os obxectos (este
o identificador utilizado internamente nas coleccins de obxectos).
IdRepository
addCategory( )
removeCategory( )
isCategory( )
t
lockld( )
unlockld( )
isldLocked( )
category
IdCategory
name
^ lockld( )
unlockld( )
isldLocked( )
Interoal
interval min
max
A relacin entre ambos identificadores debe ser moi estreita, de xeito que o clculo dun a
partir do outro sexa directo e que a modificacin dun actualice o outro automaticamente. O
diagrama de clases da Figura 5.10 mostra como se resolveu este problema.
A clase abstracta IdContainer define a interface que teen que implementar as clases que
incluan o mecanismo de dobre identificacin. A clase Identifier a que representa o
identificador proporcionado polo usuario4i. Esta clase define as operacins bsicas para realizar
comparacins, modificar e almacenar o identificador. A clase IdentifiedClass utilizada como
exemplo de como inclur a dobre identificacin nunha clase calquera. Nesta clase o atributo key
almacena o identificador utilizado internamente nas coleccins de obxectos e os operadores de
comparacin definidos estn implementados utilizando o valor deste atributo. Na
implementacin da librara cmprese a relacin key = Class_Name. identifier, polo que a partir
do seu valor inmediato obter o identificador e viceversa.
IdContainer
Storable0bject
getld( )
setld( )
getKey( )
getKeyList( )
getClassName( )
read()
write( )
getPersistencetd( )
Identifier
id : string
IdentifiedClass
key : string
operator--()
aperator-=( )
operator^( )
operator<()
operator<=()
operator>()
operator>=()
read( )
write( )
getValue( )
setValue( )
operator-( )
identifier operator-=( )
operator!=()
1
operator<()
operator<=( )
operator>()
operator>=( )
read( )
write( )
41 Esta clase derivada da clase Storable0ject, que a que proporciona o soporte `persistencia' na librara
implementada.
179
16.string id = node.getId();
17.string key = node.getKey();
18.string type = node.getClassName();
/ / id = `10'
// key = `Node.10'
// type = `Node'
-'
5.2.1.2. Notificacins
Os modelos Grafcet son almacenados en memoria como grafos dirixidos cclicos con
estructura xerrquica. A informacin da estructura est repartida entre diferentes elementos e a
modificacin dalgn deles require a actualizacin da informacin que conteen os demais. Por
exemplo, a eliminacin dun nodo implica que o seu identificador sexa liberado (esta
informacin est no grafcet parcial que contn o nodo), as sas conexins eliminadas
(actualizacin dos nodos adxacentes) e os grafcets conexos actualizados (ao eliminar un nodo 0
grafcet conexo no que est includo pode dividirse en dous ou mais grafcets conexos). Para
proporcionar esta funcionalidade definiuse un mecanismo de notificacins42, cando un
elemento modificado e esa modificacin require actualizar a informacin almacenada noutro
lugar da estructura, o elemento afectado enva unha notificacin aos seus adxacentes indicando
o cambio realizado. O elemento da estructura que reciba a notificacin pode reenviala,
procesala ou simplemente ignorala. Un inconveniente deste mecanismo a posibilidade dunha
explosin combinatoria de notificacins que afecte ao rendemento. Na implementacim da
librara Grafcet isto non supuxo un problema, pois as notificacins realzanse ben entre
elementos de diferentes niveis xerrquicos, ben entre adxacentes directos do mesmo nivel, polo
que a propagacin ^dunha notificacin afecta a un nmero moi reducido de elementos. A Figura
5.11 mostra o diagrama das clases definidas para implementar esta funcionalidade.
As clases que manexen notificacins teen que implementar a interface
NotificationManager, que incle operacins para activar e desactivar a recepcin de
notificacins e un manexador xenrico -mtodo onNotification- que pode ser refinado nas
subclases. As notificacins son representadas mediante a clase xenrica Notification da que
poden derivarse diferentes tipos especficos de notificacins, ou ben utilizar o atributo info para
ese fin.
Not^cationManager
enabled
enable( )
disable( )
isEnabled( )
onNotification( )
Notification
O
info
1 I sender
^
NotficationReceiver
receiver ,
sender
NotificationSender
^sendNotification( )
180
a3 A regra xeral utilizada para identificar as clases da libraria consistiu en tomar os nomes utilizados no
metamodelo e precedelos co prefixo SFC. En caso de que o nome do metamodelo contivese a palabra Grafcet esta
eliminada na librara.
44 Esta clase unha instanciacin da clase parametrizada pdcid2ptrSeq, que un dos contedores que forrna parte
da librara comn ( B.1).
181
'
^'
^ bind(ModelDataDeclaration)
ModelDataDeclaration
vars
SFCVarDeclarations
r-----^
^T
GescaVarl)ecl r ^
I
bind(string)
, bind(tloat)
^ bind(boo^ ' .
SFCFIoat
SFCString
bind(nt) .
SFCInt
SFCBooI
f1
SFCStepState ^ ^ SFCActionState
Enunciation
E
clone( )
read( )
wrte( )
pptrSeqElem
4
4
pdcptrSeqElem
Statement
Expression
pdcid2ptrSe
n
^ bind(SFCAction)
SFCActionSeq
SFCAction
SFCActionAssociation
name : string
type : ActionType
indicator : string
condition : string
intemal : bool
delay : double
limit : double
SFCReceptivity
condition : string
SFCFarcingOrder
type : FOrderType
forcedSFC : siring
situation : list<string>
182
NotificationSender
pdcptrSeqElem
IdContainer
SFCChild
SFCParent
parent
^
SFCRoot
id : Identifier
key : string
____
^
'E
' ____^
pdcid2ptrSeq
bind(SFCBase) ^ '^
SFCBase
sfc
sfcs : SFCSeq
SFCSeq
^^
;
1
SFCNode
before : SFCNodeSeq
after : SFCNodeSeq
links : NodeType
SFCNodeContainer
nodes : SFCNodeSeq
nodes I '
SFCConnectedBase
^
^
^
bind(SFCNode) ;
SFCNodeSeq
Figura 5.14. Diagrama das clases abstractas que dan soporte estructura dos modelos Grafcet.
O diagrama de clases da Figura 5.15 mostra a especificacin completa das clases que
implementan, as metaclases dos paquetes Grafcet Core e Grafcet Hierarchy do metamodelo e
cal a sa relacin coas clases abstractas da Figura 5.14. As clases SFCGlobal e SFCPartial
conteen a informacin sobre a utilizacin de identificadores no modelo -nos atributos pgids
e nodeids, respectivamente-. A clase SFCGlobal leva rexistro dos identificadores dos grafcets .
parciais que contn, e a clase SFCParcial os dos nodos45. Ntese que a clase SFCMacro
especializa tanto clase SFCNode como clase SFCNodeContainer, polo que implementa
simultaneamente a semntica dun nodo e a dun nivel da xerarqua estructural que contn outros
nodos ( os da sa macroexpansin).
A librara compltase con tres clases que implementan diferentes algoritmos para a
verificacin de propiedades sintcticas. Estas clases son as seguintes:
as A librara non implementa un mecanismo de identificacin automtico para os grafcets conexos, ainda que si
garante a sa unicidade.
183
SFCTrans
SFCNode
SFCBase
SFCStepBase
SFCNodeContainer
condition : SFCReceptivitp
SFCGlobal
pgids : IdRepositorp
actions : SFCActionSeq
vars : SFCVarDeclarations
l
SFCStep
type : StepTppe
actions : list<Statement>
SFCCannectedBase
^
SFCPartial
nodeids : IdRepository
start
SFCMacro
SFCConnected
a description : string
Figura 5.15. Diagrama das clases que implementan a estructura dos modelos Grafcet.
184
que a eliminacin de referencias e a liberacin de identificadores ten que ter en conta tamn os
contidos da sa macroexpansin. A Figura 5.20 mostra a secuencia de mensaxes que
implementan a eliminacin dun nodo dun grafcet parcial.
5.2.3.4. Eliminacin dun grafcet conexo
A eliminacin dun grafcet conexo mais simple ca dun nodo, e consiste na eliminacin de
referencias ao grafcet conexo, a liberacin do seu identificador e a eliminacin de referencias e
liberacin dos identificadores dos nodos que contn. A Figura 5.21 mostra a secuencia de
mensaxes que implementan a eliminacin dun grafcet conexo contido nun grafcet parcial.
5.2.3.5. Modificacin do identificador dun nodo
A modificacin do identificador dun nodo require actualizar toda a informacin contida no
modelo que faga referencia a ese nodo a travs do seu identificador. Isto implica comprobar a
existencia de duplicados co novo identificador, liberar o identificador vello, eliminar as
referencias que utilicen o identificador vello tanto na estructura xerrquica como nos nodos
conectados ao nodo modificado, reservar o novo identificador e actualizar as referencias ao
nodo utilizando o novo identificador. A Figura 5.22 mostra a secuencia de mensaxes que
implementan .a modificacin do identificador dun nodo contido na macroexpansin dunha
macroetapa. Ntese que a, operacin de actualizacin de referencias ao nodo co novo
identificador faise utilizando a operacin descrita na Figura 5.18.
185
INSERTCONTENTS_SFC
DELETECONTENTS_SFC
DELETE_SFC
ERASE_SFC
SFCPartial
SFCConnected
SFCMacro
SFCMacro
INSERT_SFC
INSERT
SFCPartial
Bloquearid.(grafcetconexo)
SFCConnected
SFCMacro
SFCPaztial
SFCConnected
Elimnar nodo
SFCMacro
Notificar i1NLOCKID
Eliminar nodo
SFCPartial
SFCCoimected
DELETE
Idem DELETE_SFC
Tboa 5-I. Notificacins relacionadas coa modificacin da estructura dun modelo Grafcet.
186
, SETID_SFC
SFCPartial
SFCConnected
SFCMacro
LOCKID_SFC
UNLOCKID_SFC
SFCMacro
Bloqueo
nodo.
IJNLOCKID
do identificador
SFCMacro
LOCKID
SFCConnected
SFCMacro
CHECKID
SFCConnected
SETID
SFCConnected
SFCMacro
Notificar CHECKID
dun SFCPartial
SFCConnected
SFCMacro
Notificar LOCKID
Notificar LJNLOCKID
Tboa 5-II. Notificacins relacionadas coa identificacin de elementos dun modelo Grafcet.
187
m ^
^
c
l0
T
II
m
Y
T
^
V
^
W II
^
(p
a
Y ^
U
N
N
C
C
I
U
^ _ ___
^
Y
U
^ I I
d
II
Q .-.
LL W
^
^
C
d
(p
C
^
I
^
w ^,
^
^
Y N N
W Y ^
m
^ V ^ W N
y
U
W D C II
^ a;
v
N ^p o ^ ^-N.
^ U U N ^p
o
^ ^^
7
W V
II ^ p n ^ y
l0
^
n ^
Y I C^r-U
N
7
V ^ Y
W^
^ ^
^
U
^
O
^ p
r !I ^ ^ V
W
U
^d
] N
" ^
U
CL
^
Oj ^
W^V
d
N
C
0
_
d n P d E
O
^ a y lyJ ^
01 y
N
c
D
^ ^
^
^
V
O^ d
^+ ^
d' ^
O
X
N O
C
m
O
X
W
C
W
D
O
^
C
y
o i-.
C C
W
U
W
^ ^
^U
^ W O
^ ^
t] iT
W ^
fp
^ ^
lD p
`W O
j
O
C ^
O^
W
U
n._
C f0
W
Um
]
C
^
E^
o^
U^
1OV
Eo
QB
O ^
_ ^
m
U m
~_N ^
mm
v^
^
O0 m
Q w
Figura 5.16. Secuencia de mensaxes da insercin dun nodo nun grafcet parcial.
188
w
C
^
E
0 11
^
WY
x E
n
m ^
11
^
O Y
^^
..C.. ^
^
m 11
v 1
S`
,
o y m
C
^
l0
^ - '
g
i
^ ^ ^ ^ : .
^
^ ^
.^
--
p^
O.
C
^
m
w
W
^
P.
N ^
C d
C ^Q
C ^ U "
Y W n
^ II
9
II
^ ^
vW
l g
^ W
^ V
^^,
d
(p
^
y
Fy
y
Y_
^
>
^
^
l0
W _U
^
.
g
C
II .
11
V
N
m
^ '
a
2
L v
I^^/^ ^
`_____________________________________ ^ ^
_^
Y
U
O
^
8
W
^
Z
L'
tn
^
U
V
LL
L T V1
U
m
Y
n
N_
E
^
^ ^ C
; ^
^ ^-. ^ d^
E ^ 9 ^^. d
^-
m
V p
O
C
^
.^.
m
^ ^
2 ^Y ^rn
f0
^
d^
_
10
O^
^ ^ ^
X
m
.
C m
O^
E
^ ^
omm
c^E
o ^
C
O ^
C y
O O
^ ^
^
a^
o W
^i
am
^
^
C r
G^
O ^ m
C
s
^i
E m m
a^^
Figura 5.17. Secuencia de mensaxes da insercin dun nodo nun grafcet conexo.
189
I
^
I
-. ............
..^
4
^
N
i
U
.......................^
..............i^
V^
^^
^
^
^
^^
^^
$ ^
^^
I ^
'
^
^
'
^^ ^'
! ^^
^^
:
^io;^^
.
^s
^^
^$
g
E
^.
^^
Figura 5.18. Secuencia de mensaxes da insercin dun nodo na macroexpansin dunha macroetapa.
190
^W
^--. V
^ m
^
$ ,^
^
J ^
LL
^_
m v m
y
W
^
}__._..._..v_...__^_.__._._^ _._.._...
^
^
^7 ^
I'
9' 11
?T
_.-___Y .__
vd
t.^
n
y
p
^
`m
^
^I
^ ^
W
^
T O 11.
0
W
W
EW
^
m ^
$
v
^
^ ,^
"
.-. c
ao
w
C j,
^
,i
W II
^^^^
c m
q
W u V
i
^ ^ ^..^
W
tJ v ^ ^
N
^.
Y
,_
m
^ m
rn ^_
Ti
m ^
w ^
l w
^ GDI U
^ ^j II
LL
T W D
^ W
NI
'^ ^ ^ ^
.^ ^ ^ ^
m ^
^ ^
`^ ^ E
^ ^ N
r;
^
U
LL
^
^ Y
^ W
'
^i
^_ m
^I'
r
D
U
W
O
^
m
o
T
F
V
W
`v
(9
FT
U
W
E
O
LL
y
U
^
m
^
Y
y
d
^
P.
^
^
u
m
i0 8
^ ^ ^ ^ m
O^
E
^
W
^
c W^
L^
`m^
m O
N
O
W
O
^
W 9
^ ^
Q
C
`^
^
O
^{
v
m_
W
6oW
o
m^i W
m
c_
C L
^c
m^aci
N
a ^ d
c
{p
11 W V
oc
m ^
Ec^
OWW
UE
K^ W
W
aE
D
o
W
8v
E ^
O
^ co
c$E
o._ W
m ^ ^
E^fO
c c
m cl
m o ^
U D ^
``
a
^
a$
rood
o W '^
i^
Wax
E ^ 0
d_ -^
m
i`_v' ^ V
aW^
0
U
>
a ^^
^
W
m_
m ^
01m
m a
a=N
O m
Figura 5.19. Secuencia de mensaxes da insercin dunha macroetapa nun grafcet parcial.
191
erase(node) _ :
parent := node.getParent()
DarentSFCConneded
erase(node) ;
Qrue}
remove(node)
urdockSFCIDa(node)
FJiminar o nodo do grafcet pardal
e do nodo conexo nos que estea
inserido. Uberar o aeu
iden6ficadoc Se unha
macroetapa liberar tamn oa
idenfificadores doa nodas da s0a
maeroexpansi0n
unlocklD(node.getTypeQ, node.getKey())
[Yor all node ( n) in node maeroexpasion]
unlocklD(n.getType(),n.getKeyQ)
[Yw all macro (m) in node macroexpesion]
unlockSFCIDs(m)
r
.
.---.-..-.--...__....
csfw := recalwtateCSFCQ
[cetcs.empty0l
(true}
{talae}
^ remwePJl()
tirst := csf<s.begin0
[n.isMaao()1 {true}
{false}
atoreSFC(n)
csfca.ramove(first)
getPerent().notify(SFCMSG INSERT_SFC, Cg)
insert(cg)
I
Insedr os demais sutqrafceffi no
grafcet pardal que contn ao grafcet
conexo do que se eliminou o nodo.
Bloquear os idemficadorea dos novos
grafcets conexos.
id = getUniquelD(cg)
k := cg.getKeyQ
^ id := IocldD(k)
cg.setlDValue(id)
cg.setParenqthis)
store(cg)
^-----_-..._.........-`-'----_.-..---...--'--------`----.... U
f---......_ _ .................-Se o grafcet conexo non comn mais
nodos, eliminalo.
IMc'c"^c"'Y'll/l
erase(cstc
^I ['for all node (n) in csfc]
remove(n)
D uNockSFCIDs(csfc)
^unlocklD(csfc.getType(), csfc.getKeyQ)
[Yor all node ( n) in csfc]
l.iberar os identificadores do
grafcei conexo e dos seus corttidos
uNoddD(n.getTypeQ, n.getKeyp)
t
[Yor all maao (m) in csfc]
unlodcSFCIDs(m)
^ removeSFC(csfc)
192
t^
_^
K o
0 10
v_
0 0
m`^
C `.
`m9
O V
ry O
_ m
`^
W ^
Q ^
Figura 5.22. Secuencia de mensaxes da modificacin do identificador dun nodo includo nunha macroexpansin.
193
20.template GescaVarDecl<bool>;
21.template GescaVar<bool>;
23.template GescaSystemVarDecl<bool>;
24.template GescaSystemVar<bool>;
26.SystemDataDeclSeq process_vars;
29.
30.
31.
"SIM:TCP_BOOL_SI 80",
READ);
32.process_vars.insert(inputl);
34.SFCGlobal global("GG");
37.global.vars.insert(varl);
40.global.insert(sfcl);
41.// etapas
43.SFCStep stepl("1");
44.SFCStep step2("2");
48.
R, "", "", 0, 0, true);
49.stepl.addAction(associationl);
SO.step2.addAction(association2);
51.// transicins
52.SFCTrans trans0("(0)");
53.SFCTrans transl("(1)");
54.SFCTrans trans2("(2)");
56.trans0.m_condition.setCondition("Ta");
57.transl.m_condition.setCondition("Ta");
58.trans2.m_condition.setCondition("a");
60.node_iterator s0 = sfcl->insert(step0);
61.node_iterator
62.node_iterator
63.node_iterator
64.node_iterator
t0
sl
tl
s2
= sfcl->insertAfter(s0,
= sfcl->insertAfter(t0,
= sfcl->insertAfter(sl,
= sfcl->insertAfter(tl,
trans0);
stepl);
transl);
step2);
65.node_iterator t2 = sfcl->insertAfter(s2,
66.sfc1->link(t2, s0);
trans2);
successor
^step
194
GrafcetBoolea nCondition
body = ?a
read
Event
change = true
ActionAssociation
action tYPe = #S
type = #step
links = #both
predecessor
internal = false
successor
[R]
(2) a
successor
3..^t s
r-
type = #step
links = #both
predecessor
(a)
modify
A:GrafcetVar
modify
successor
var
read a:GrafcetVar
(b)
Figura 5.23. Exemplo de: a) secuencia; e b) representacin co metamodelo proposto.
68.SFCGlobal global("GG");
71.global.insert(sfcl);
72.// etapas
74.SFCStep stepl("1");
75.SFCStep step2("2");
76.SFCStep step3("3");
77.SFCStep step4("4");
78.// tranaicins
79.SFCTrans trans0a("(O.a)");
80.SFCTrans transOb("(O.b)");
81.SFCTrans transla("(l.a)");
82.SFCTrans translb("(i.b)");
83.SFCTrans trans2("(2)");
84.SFCTrans trans3("(3)");
87.node_iterator s 0 = sfcl->insert(step0);
92.node_iterator t lb =
sfcl->insertAfter(sl, t ranslb);
94.node_iterator t 2 =
sfcl->insertAfter(s2, tr ans2);
98.sfc1->link(t2, s4);
99.sfc1->link(t3, s4);
= sfcl->insertAfter(s4,
trans4);
var
195
0
(O.b)
1
(O.a)
(1.a)
(1.b) ^
o: Stea
type = #initial
successor
(O.a):Transition
(O.bl:Transition
links = #both
links = #both
predecessor
su ccessor
successor
1:Ste^
predecessor
type = #step
links = #both
predecessor
successor
successor
(1.a):Transition
(1.b):Transition
links = #both
links = #both
predecessor
predecessor
successor
successor
2: Ste^
3:Steo
type = #step
type = #step
links = #both
links = #both
predecessor
predecessor
successor
successor
(2):Transition
(3):Transition
links = #both
links = #both
predecessor
predec ssor
successor
4: Steo
successor
type = #step
links = #both
predecessor
successor
(4):Transition
links = #target
(b)
5.3.1.3. Paralelismo
101.
102.
103.
104.
105.
106.
// modelo Grafcet
SFCGlobal global("GG");
// grafcets parciais
global.insert(sfcl);
// etapas
110. // traasicina
111.
112.
113.
114.
SFCTrans transl("(1)");
SFCTrans trans2("(2)");
// enlaces directos
115.
node_iterator t0 = sfcl->insert(trans0);
116.
117.
118.
119.
120.
121.
122.
node_iterator sl = sfcl->insertAfter(t0,
node_iterator tl = sfcl->insertAfter(sl,
node_iterator s2 = sfcl->insertAfter(tl,
node_iterator s3 = sfcl->insertAfter(tl,
node_iterator t2 = sfcl->insertAfter(s2,
sfcl >link(s3, t2);
sfcl->link(t2, sl);
stepl);
transl);
step2);
step3);
trans2);
196
successor
1:Sten
predecessor
type = #initial
links = #both
predecessor
(0)
1
(1)
successor
(1):Transition predecessor
links = #both
predecessor successor
successor
(2)
3: Ste
2: Ste
type
= #step
type = #step
links = #both
links = #both
predecessor
predecessor
successor
(2):Transition successor
successor links = #both
{a)
( b)
Figura 5.25. Exemplo de: a) secuencias paralelas; e b) representacin co metamodelo proposto.
5.3.1.4. Semforo
123. // modelo Grafcet
127. global.insert(sfcl);
128. // etapas
129.
130.
131.
132.
SFCStep
SFCStep
SFCStep
SFCStep
stepl("1", SFCStep::initial);
step2("2");
step3("3", SFCStep::initial);
step4("4", SFCStep::initial);
134. // tranaicias
135.
136.
137.
138.
139.
SFCTrans transl("(1)");
SFCTrans trans2("(2)");
SFCTrans trans3("(3)");
SFCTrans trans4("(4)");
// enlaces directos
141.
142.
143.
144.
node_iterator
node_iterator
node_iterator
node_iterator
tl
s2
t2
s3
=
=
=
=
sfcl->insertAfter(sl, transl);
sfci->insertAfter(tl, step2);
sfcl->insertAfter(s2, trans2);
sfcl->insertBefore(t2, step3);
197
(a)
1.Ste^
.
type = #initial
links = #both
predecessor
successor
(11:Transition
links = #both
predecessor
successor
2:Ste
type = #step
links = #both
predecessor
4:Ste
predecessor
type = #initial
links = #both
predecessor
successor
(4):Transition
links = #both
predecessor
successor
S:Stea
type = #step
links = #both
predecessor
predecessor
successor
successor
3:Steo
(21:Transition successor
successor (31:Transition
type = #initial
predecessor links = #both Predecessor
links = #both successor
successor links = #both
predecessor
predecessor
successor
successor
(b)
Figura 5.26. Exemplo de: a) secuencias exclusivas (semforo); e b) representacin co metamodelo proposto.
5.3.1.5. Accins
^_ ^[D#10s,L#ZOs] a &8^ c
0
a
(0)
[P] act0
act0
B=12;
(a)
successor
0: Steo
type = #initial
links = #both
ActionStateAssoc
bPe = #P
action internal = true
predecessor
body = B = 12
ActionAssociation
rype = #N
successor
action actO:Actionlmplementation
GrafcetTem oorizedCondition
condition body = a 88 c
delay = 10s
limit = 20s
modify
B:GrafcetVar
read c:GrafcetVar
modify A:GrafcetVar
read
read
a:GrafcetVar
(b)
Figura 5.27. Exemplo de: a) accins; e b) representacin co metamodelo proposto.
198
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
template GescaVarDecl<bool>;
template GescaVar<bool>;
template GescaSystemVarDecl<bool>;
template GescaSystemVar<bool>;
164.
165.
"DDSIM:TCP_BOOL_8I_80",
166.
READ);
168.
"DDSIM:TCP_BOOL_8I_80",
169.
170.
171.
172.
173.
174.
175.
- READ);
process_vars.insert(inputl);
process_vars.insert(input2);
// modelo Grafcet
SFCGlobal global("GG");
// varibeis do modelo
176.
177.
178.
179.
180.
181.
182.
global.vars.insert(varl);
global.vars.insert(var2);
// bloques de cdigo
global.actions.insert(action0);
- -
185. global.insert(sfci);
186. // etapas
190.
191. SFCActionAssociation* association2 = new SFCActionAssociation("act0",
192.
193. step0.addAction(associationl);
194. step0.addAction(association2);
195. // transicias
196.
197.
198.
199.
200.
201.
202.
SFCTrans trans0("(0)");
// condicins de transicia
trans0.m_condition.setCondition("a");
// enlaces directos
node_iterator s0 = sfcl->insert(step0);
sfcl->link(t0, s0);
5.3.2. Xerarqua
5.3.2.1. Macroetapas
203.
204.
205.
206.
207.
208.
209.
210.
// modelo Grafcet
SFCGlobal global("GG");
// grafcets parciais
global.insert(sfcl);
// etapas
SFCStep step2("2");
P, "","" 0, 0, true);
199
211. // transicina
213. SFCTrans
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
transl("(1)");
SFCTrans trans2("(2)");
// macroetapaa
macrol00.getStart()->setld("S100");
macrol00.getEnd()->setId("E100");
// nodos da macrotapa
SFCStep s tep101("101");
SFCTrans trans100("100");
SFCTrans trans101("101");
M 100
S100
(0)
(100 )
100
101
(1)
(101 )
E100
(2)
successor
(a)
O:Stea
type = #initial
links = #both
predecessor
start
S100:Ste^
type = #step
node
links = #both
predec ssor
successor
(Ol:Transi6on
links = #both
predecessor
successor
successor
100:MacroSteo
type = #macro
expansi
links = #both
predecessor
^
M 100:MacroExoansion
successor
101:Ste^
type
= #step
node
links = #both
predec ssor
successor
(1):Transition
links = #both
predecessor
successor
j101):Transition
successor
2.Steo
.
type = #step
links = #both
predecessor
successor
predece ssor
E100:Steo
node type = #step
links = #both
end
successor
(2):Transition
links = #both
predecessor
I1001:TransiUon
nodd links = #both
predec ssor
(b)
200
CG2
^3=
(0)
1
10
F/PG2: {11 }
(10)
^--{ F/PG2:^
11
(11)
(1)
CG1
PG1
PG2
(a)
GG:GIobalGrafcet
subsystem
subsystem
PG2:PartialGrafcet
pG1:PartialGrafcet
part
forcer
part
forcer
forced
forced
CG 1:ConnectedGrafcet
successor
successor
(2):Transition
links
= #sourcd node
node
predecessor
O:Stea
node
type = #initial
links = #both node
preecessor
successor
successor
(0):Transi6on node
links = #both node
predecessor
:ForcingOrder
type = #force
successor
1:Steo
node
:ForcingOrder
type = #step
action
links = #both node
tYPe = #emPtY
predecessor
successor
(1):Transition
node
2.Stea
successor
(3):Transition
links
= #targef^ node
node
10:Step
type = #initial n^
links = #both
pre ecessor
successor
(10):Transition
11:Steo
type = #step node
links = #both
predecessor
successor
(11):Transition
links = #both node
predecessor
(b)
Figura 5.29. Exemplo de: a) ordes de forzado; e b) representacin co metamodelo propostoab
239.
240.
241.
242.
243.
global.insert(sfcl);
global.insert(sfc2);
// grafcets conexos
a Por razns de simplicidade non se incluiu na figura a representacin das situacins forzadas polas ordes de
forzado.
201
246.
247.
248.
249.
SFCStep stepl("1");
SFCStep step2("2");
252. // tranaicias
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
SFCTrans
SFCTrans
SFCTrans
SFCTrans
trans0("(0)");
transl("(1)");
SFCTrans
SFCTrans
transl0("(10)");
transll("(11)");
// ordes de forzado
stepl.addAction(forclerl) ;
listestring> situation;
situation.push_back("11");
265. step2.addAction(forder2);
node_iterator tl = csfcl->insertAfter(sl,
csfcl->link(tl, s0);
273.
274.
275.
276.
277.
278.
279.
280.
281.
node_iterator s2 = csfcl->insertAfter(t2,
node_iterator t3 = csfcl->insertAfter(s2,
sfcl->insert(csfcl);
sfcl->insert(csfc2);
trans0);
stepl);
transl);
node_iterator t2 = csfcl->insert(trans2);
step2);
trans3);
sfc2->insertAfter(s10,
transl0);
stepll);
transll);
node_iterator t10 =
sfc2->link(tll, s10);
5.4. Conclusins
Neste captulo propxose un metamodelo para o Grafcet que define formalmente os ^
conceptos e regras utilizados na creacin de modelos coa ferramenta proposta nesta tese de
doutoramento. Este metamodelo est integrado no de iJML, polo que proporciona un medio de
integracin con outros formalismos especificados da mesma maneira (como acontece cos
StateCharts), e facilita a utilizacin do Grafcet para a especificacin de dinmicas complexas
como parte de metodoloxas de desenvolvemento "software" baseadas en ITML. Ademais
completouse o metamodelo definindo un conxunto de invariantes na forma de regras OCL que
poden ser utilizadas, mediante as ferramentas apropiadas, para a validacin automtica d
correcin sintctica dos modelos Grafcet representados utilizando o metamodelo proposto.
A utilizacin prctica do metamodelo realzase mediante unha librara C++, que implementa
os conceptos e regras nel definidos, ademais dun conxuto de clases auxiliares para a
comprobacin da correcin de caractersticas como a coherencia da xerarqua de forzado ou a
estructura interna das macroexpansins. Esta librara un medio de integracin do Grafcet en
calqueira aplicacin e, ademais, o soporte que incle `persistencia' dos modelos proporciona
indirectamente un formato de almacenamento que pode ser utilizado para o intercambio destes
entre aplicacins. As explicacins sobre a implementacin da librara non describen esta en
detalle, limitndose a mostrar como son aplicados algn dos mecanismos e tcnicas utilizados
na implementacin das operacins mis relevantes. O captulo compltase con algns exemplos
de modelado de distintos aspectos sintcticos dos modelos Grafcet.
Captulo 6. Compilacin de
modelos Grafcet
203
204
model.sfc options.cfg
^^
model.h
model.cpp
model.lib
model.dll
compiler.exe ^^
preprocess.bat^ ^^ sidoni.bat
No resto desta seccin explcanse certos aspectos relacionados cos arquivos de entrada e
sada do compilador, coas aplicacins externas utilizadas e co proceso realizado durante a
compilacin.
283. {
string project_name;
284.
string project^ath;
285.
string sfcpp^ath;
286.
string compiler_name;
287.
string iomap_file;
288.
deque<string> user_libs;
289.
bool simultaneous;
290.
// proxecto Grafcet
//
//
//
//
//
compilador Grafcet
compilador C++
declaracins 8/S
libraras exteraas
^eventos simultneos?
291. }
205
4. Nome do arquivo que contn as declaracins das varibeis de proceso utilizadas -atributo
iomapfle (lia 288}-.
5. Ubicacin das libraras externas utilizadas polo usuario -atributo user libs (lia 289^.
6. Indicador booleano da posbel ocorrencia de eventos simultneos utilizado na
simplificacin de expresins con eventos (6.5.1.5.3) -atributo simultaneous (lia 290^.
Basicamente estas opcins son utilizadas para indicar a localizacin dos arquivos temporais,
libraras e aplicacins externas utilizados durante a compilacin. O compilador presupn a
existencia dunha estructura de directorios como a da Figura 6.2. O executbel do compilador
Grafcet est almacenado no directorio principal -atributo sfcpp^ath-. Dentro deste
directorio hai catro subdirectorios que conteen o seguinte:
1.
2.
include, os arquivos de cabeceira (.h) das libraras utilizadas polo compilador Grafcet.
lib, as libraras utilizadas polo compilador.
3. systeml0, a localizacin por defecto dos arquivos coas declaracins das varibeis de
proceso.
4.
'- ^d Include
=--1 Lib
^--^ Systeml0
206
294.
295.
2 96 .
297.
public:
explicit SFCCPPCompiler(Phase* phase);
bool operator ( ) ( ) ;
};
Como a clase define o mtodo operator()47, as sas instancias poden utilizarse no cdigo
C++ do mesmo xeito que as funcins. O cdigo para chamar ao compilador externo dende o
compilador Grafcet sera o seguinte:
298. // definicia e invocacia do "wrapper^ do compilador C++
300. compiler();
47 En C++ as instancias de clases que declaran este operador denomnanse obxectos funcin ("function objects").
207
48 Os contidos do arquivo makedll.mak para o compilador Visual C++ poden verse no Anexo C.
208
,
, ^
;,
Phase
ICom ilerDataAccesor
*
getRoot( )
root
operator( )
\
:
^,
^
; Component
{Pattern}
Composite = {
Component,
Container,
Leaf
}
1
Leaf
{friend} ;'
;
. ,
^ Container
'
;
,
,
,
,
MultiStepPhase
SFCCompilerPhase
SFCMuItiStepPhase
'
phases
addPhase()
deletePhases( )
operator()
^
_ _ _ _ _ _ _ SFCCom iler
'
` `.
^
;
^
^
^
operatorQ:
for all phase in phases
phaseQ
^^^^^^^^^_^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^_^^^_^^^^^^^^^^^^J
209
303. {
304.
friend class SFCCompilerPhase;
305. private:
306.
307.
308.
309.
310.
// entradas ao compilador
SystemDataDeclSeq systeml0;
SFCCompilationInfo* comp_info; // opcina de compilacin
311.
312.
313.
314.
RTSituation initial;
deque<RTPGInfo*> pgs;
deque<RTNOdeInfo*> nodes;
deque<RTActionInfo*> actions;
//
//
//
//
315.
deque<RTFOInfo*> forders;
// ordes de forzado
316.
317.
FOHierarchyLevels fo_levels;
deque<RTTimerInfo*> timers;
// temporizadores
318.
319.
320.
321.
322.
323.
SFCActionSeq actions_code;
// accina
/ / ideatificadorea iaternoa
deque<string> ids;
set<unsigned long> used_ids;
324.
325.
SFCCompilerPaths paths;
// arquivos e localizacibas auxiliarea
// erros de compilacin
SFCCompilerErrors* errors;
SFCCompilationTempData temp_data;
326.
327. } ;
aituacia iaicial
grafceta parciaia
nodos
accina
2.
3.
4.
210
Para acceder informacin interna almacenada polo compilador, cada fase mantn unha
referencia -atributo root da clase Phase (Figura 6.3^ raz do grafo de fases do compilador
(que unha instancia da clase SFCCompiler) e implementa a interface ICompilerDataAccesor
declarada comoso:
328. struct ICompilerDataAccesor
329. {
330.
// entrada ao compilador
331.
virtual const SFCGlobal& model() const = 0;
332.
virtual const SFCCompilationInfo& getOptions() const = 0;
333.
334.
// eatructura do modelo Grafcet
337.
338.
339.
340.
341.
342.
343.
344.
345.
// mtodoa auxiliares
346.
347.
348.
349.
virtual
virtual
virtual
virtual
SFCCompilerPaths& getPaths() = 0;
350.
virtual SFCCompilationTempData& getTempData() = 0;
351.
352 . } ;
354. {
356.
return pRoot->temp_data;
357.
358. }
)7
Este mtodo de acceso permite que as fases redefinan estes mtodos para realizar as
operacins requiridas de iniciacin, comprobacin ou formatado da informacin do compilador
antes de ser utilizada pola fase. O seguinte cdigo mostra un exemplo de redefinicin do
mtodo anterior para unha fase hipottica:
359. SFCCompilationTempData& AnySimplePhase::getTempData()
360. {
361.
// iniciar, comprobar ou modificar aqu a informacin antea de utilizala
362.
return data;
363.
364. }
so A interface mostrada unha versin reducida. Na interface completa declranse das versins de cada mtodo,
unha a mostrada, e outra unha versin constante (p.e. virtual const RTSituation& initialSituationQ const = 0; ).
211
SFCInfoHarvester
SFCAssociatianPreproccessor
EventExprContextHanester
SFCMacroPreprocessor
SFCDLLGenerator ^ ^ TimerPreprocessor
EventExprHarvester ^ ^ VarlnfoHarvest er
SFCFOrderCompiler
CPPActionPreprocessor 'I
EventExpressionCompiler
EveniVarTranslator
SFCCPPCompiler I
1
SFCActionCodeCompiler
1
SFCEventCompiler
SFCTimerConditionCompiler
SFCActionConditionCompiler ^ ^FCReceptivityCompiler
: SFCInfoHarvester
: SFCFOrderComoiler
: SFCAssoationPreorocessar
: SFCActionCodeComoiler
: SFCComoiler
CPPAionPreprocessor ^
^ : EventExwHarvester
: SFCDLLGenerator
: SFCCPPComoiler
St A orde de execucin das fases mstrase na figura de esquerda a dereita e de amba a baixo
VarlnfoHarvester
EventVarTranslator
212
Nas catro fases indicadas nas que se compila respectivamente o cdigo C++ das accins,
condicins das asociacins, condicins de transicin e condicins dos temporizadores. As
operacins realizadas en cada caso son moi semellantes, polo que durante o deseo decidiuse
compartir a estructura de fases e configurar as opcins especficas de cada caso mediante a
informacin almacenada no compilador, nunha instancia da clase SFCCompilationTempData.
^'
A interface pblica desta clase a seguinte:
365. struct SFCCompilationTempData
366. {
367.
// "buffera" temporais para almacenar as transformacins no cdigo
368.
stringstream original_code;
369.
stringstream preprocessed_code;
370.
stringstream modified_code;
371.
stringstream final code;
372.
373.
bool in_condition;
374.
bool timers_allowed;
375.
376.
ExpressionSeq event_expressions;
377.
VarInfoSeq var_info;
378.
// mtodoa pblicos
379.
380.
void clear();
381. };
383. {
384.
385.
/* iaclur aqu o cdigo de preprocesamento especfico da fase */
386.
getTempData().initialize(code, <in_condition>, <timers_allowed>);
387.
// executar as aubfases
388.
SFCMultiStepPhase::operator()();
389.
390.
391.
392.
393.
394. }
code = getTempData().final_code;
// reiaiciar i aformacin auxiliar
getTempData().clear();
end for
213
O cdigo fonte a compilar est almacenado na varibel code. Cada fase composta concreta
iniciar a informacin de configuracin (lia 387) con este cdigo e os valores conrespondentes
dos argumentos in_condition e timers allowed indicados na Tboa 6-I. Unha vez executadas as
subfases (lia 389), o cdigo modificado almacenado na varibel code (lia 391) e a
informacin temporal reiniciada (lia 392). Isto reptese para cada bloque de cdigo que haxa
que compilar (p.e. a fase SFCReceptivityCompiler repite a execucin das lias 384-393, unha
vez por cada condicin de transicin).
^
SFCActionCodeCompiler
Non
Non
SFCActionConditionCompiler
Si
Non
SFCReceptivityCompiler
Si
Si
SFCTimerConditionCompiler
Si
Non
Tboa 6-I. Valores dos atributos in_condition e timers_allowed nas fases compostas do compilador Grafcet.
class Phase
private:
Phase* root;
public:
};
A clase contn un nico atributo -root (lia 398^ no que se almacena a referencia raz
da estructura de fases. O valor deste atributo iniciado no constructor e accedido mediante o
mtodo getRoot (lia 400). A execucin da fase implementouse mediante o operador C++
operator(), de xeito que se utilice da mesma maneira que a chamada a unha funcin. Este
operador redefinido nas clases derivadas para implementar as operacins realizadas en cada
fase concreta. As fases compostas son derivadas da clase abstracta MultiStepPhase (Figura
6.3), que declarada do xeito seguinte:
403.
404.
405.
private:
406.
407.
408.
list<Phase*> phases;
public:
409.
410.
411 .
void delete^hases();
};
214
Esta clase, derivada da clase Phase, declara un atributo phases (lia 406}- no que se
almacena a secuencia de subfases, e dous mtodos -add^hase (lia 408) e delete_phases
(lia 409^- para engadir e eliminar subfases. Ademais esta clase incle unha implementacin
por defecto para o operador operator() que executa as subfases secuencialmente:
412. bool MultiStepPhase::operator()()
413 . {
414.
415.
416.
417.
error = subfase.operator()();
end for
// executar a subfase
418.
return error;
419 . }
sub^hase : MultlSteoPhase
ohase : Phase
compiler()
preprocesamento
[^or all subphase]
subphase() ^
acceso informacin interna
^ preprocesamento
['for all subphase (phase)j
phaseO
acceso informacin interna
N-J
procesamento da fase
Figura 6.7. Secuencia das mensaxes intercambiadas entre a fase principal e as subfases do compilador Grafcet.
421 . {
422.
423.
424.
add^hase(phase);
425.
426.
427.
428.
429.
430.
431 . }
add^hase(multiphase);
multiphase->add^hase(subphase);
215
216
tl_expr, expresin numrica constante que indica o tempo de retardo que a condicin do
temporizador ten que ser certa para que este se active. O valor por defecto cero.
52 Como se explica en (6.5.1.5.3), a restriccin de que a expresin vaia entre parnteses simplifica a
implementacin da fase EventExprHarvester.
217
2. cond expr, expresin booleana que activa o temporizador. O valor por defecto true.
3. t2_expr, expresin numrica constante que indica o tempo que o temporizador permanece
activo despois de que a condicin deixe de ser certa. O valor por defecto cero.
Os operadores de temporizacin non poden aniarse, dicir, non poden utilizarse
temporizadores nas condicins doutros temporizadores. Os seguintes exemplos mostran
algunhas expresins con temporizadores:
T#(30; !a; )
T#(150; ; 300)
Expressions
434.
unary-expression:
435.
436.
[gram.expr]
postfix-expression
++ cast-expression
437.
-- cast-expression
438.
439.
440.
441.
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-id )
new-expresson
442.
delete-expression
443.
444.
sfcpp-event-expresaion
sfcpp-tmer-expreasion
[+]
[+]
445.
446.
[+]
sfcpp-event-expresaion:
447.
T identfier
[+]
448.
449.
450.
^ identifier
T
( sfcpp-expression )
^ ( sfcpp-expression )
[+]
[+]
[+]
451.
452.
453.
afcpp-timer-expresaion:
T# ( digt-aequence,p^
; sfcpp-expression,p^ ; digit-sequenceapt )
[+]
[+]
s3
Por conveniencia reprodcense uncamente as regras da gramtica C++ afectadas polas modificacins. Estas
estn indicadas en negria e cun smbolo dereita da pxina indicando o tipo de modificacin: [+] parte engadida,
[-] parte eliminada e[^`] parte modificada. En caso de requerirse algn comentario adicional indcase tamn a
referencia numrica das notas incluidas ao fmal da gramtica.
218
Non se permite o uso da palabra reservada throw, polo que dende as expresins
simplificadas non poden lanzarse excepcins.
Non se permite o uso das palabras reservadas typename e template, polo que nas expresins
simplificadas non pode usarse a cualificacin explcita dos tipos de datos nin dos membros
de "templates".
n
Non se permite o uso da palabra reservada operator, polo que nas expresins simplificadas
non poden referenciarse explicitamente os operadores declarados polo usuario.
sfcpp-expression:
sfcpp-assignment-expression
sfcpp-expression, sfcpp-assignment-expression
[-]
sfcpp-expression-list:
sfcpp-expression
[+]
4 5 7 .
458.
459.
460 .
461 .
462.
463.
464.
465.
sfcpp-conditional-expression
[-]
throw-expressioa
466.
467.
468.
469.
470.
471.
472.
assignment-operator: one of
_ _ &_ ^_ ^_
+_
^_
^_
-_
_
*_
sfcpp-con di t i ona l -express i on:
sfcpp-logical-or-expression
473.
474.
475.
476.
sfcpp-logical-or-expression:
sfcpp-logical-and-expression
sfcpp-logical-or-expression ^^ sfcpp-logical-and-expression
477 .
478.
479.
480.
sfcpp-logical-and-expression:
sfcpp-inclusive-or-expression
481.
482.
483.
484.
sfcpp-inclusive-or-expression:
sfcpp-exclusive-or-expression
sfcpp-inclusive-or-expression ^
sfcpp-exclusive-or-expression
485.
486.
487.
488.
sfcpp-exclusive-or-expression:
sfcpp-and-expression
sfcpp-exclusive-or-expression ^ sfcpp-and-expression
sa As regras sintcticas das expresins simplificadas teen o mesmo nome que as do C++ co prefixo sfcpp-.
219
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502,
503.
504.
505.
506.
507.
508.
509.
510.
511,
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
.,
< sfcpp-shift-expression
> sfcpp-shift-expression
<= sfcpp-shift-expression
>= sfcpp-shift-expression
sfcpp-shift-expression:
sfcpp-additive-expression
sfcpp-shift-expression sfcpp-additive-expression
sfcpp-shift-expression sfcpp-additive-expression
sfcpp-additive-expression:
sfcpp-multiplicative-expression
sfcpp-additive-expression + sfcpp-multiplicative-expression
sfcpp-additive-expression - sfcpp-multiplicative-expression
sfcpp-multiplicative-expression:
sfcpp-pm-expression
sfcpp-multiplicative-expression * sfcpp-pm-expression
sfcpp-multiplicative-expression / sfcpp-pm-expression
sfcpp-multiplicative-expression ^ sfcpp-pm-expression
sfcpp-pm-expression:
cast-expression
sicpp-pm-expression . * cast-expressioa
sfcpp-pm-expression - >* cast-expression
cast-expression:
sfcpp-unary-expression
( type-id ) cast-expression
[*:1]
[*:1]
[*:1]
[-:1]
[-:1]
sfcpp-unary-expression:
sfcpp-postfix-expression
++
cast-expression
532.
533.
-
cast-expresaion
unary-operator cast-expression
534.
sizeof unary-expresaioa
535.
sizeof ( type-id )
536.
new-expression
537.
delete-expression
538.
sfcpp-event-expressioa
539.
sfcpp-timer-expression
540.
541.
542. unary-operator: one of
+
!
&
543.
*
544.
545. sfcpp-event-expression:
[*:1]
[*:1]
[*:1]
[-]
[-]
[-]
[-]
[+]
[+]
[+]
546.
identifier
[+]
547.
identifier
[+]
548.
afcpp-expression )
[+]
( sfcpp-expression )
[+]
T (
549.
^
550.
551. sfcpp-timer-expreasion:
552.
T# ( digit-sequence,^^ ; sfcpp-expressioa,D^ ; digit-sequence,pt )
553.
[+]
[+]
sfcpp-postfix-expression:
sfcpp-primary-expression
postfix-expressioa [ sfcpp-expression ]
postfix-expressioa ( sfcpp-expression-listopc )
aimple-type-specifier ( expression-liatopt )
postfix-expression . template,pt ::oPt sfcpp-id-expression
postfix-expressioa - > templateopr ::,pt sfcpp-id-expression
postfix-expreasioa . paeudo-destructor-name
postfix-expressioa - > pseudo-destructor-name
postfix-expression ++
poatfix-expression --
dynamic_cast < type-id > ( expression )
static_cast < type-id > ( expressioa )
reinterpret_cast < type-id > ( expressioa )
const_cast < type-id > ( expreasioa )
typeid ( expresaion )
typeid ( type-id )
220
[*:2]
[*:2]
[-]
[*:2,31
[*:2,3]
[-]
[-]
[*:2]
[*:2]
[-]
[-]
[-]
[-]
[-]
[-l
571 .
572.
sfcpp-primary-expression:
573.
literal
574.
575.
576.
577.
578.
579.
580.
581 .
582.
583.
584 .
585.
586.
587.
this
.: identifier
.: operator-functioa-id
.: qualified-id
( sfcpp-expression )
sfcpp-id-expression
identifier sfcpp-id-expressionopt
sfcpp-id-expression:
.: identifier sfcpp-id-expreasion,Pt
[-]
[-l
[-l
[+:4]
[+:4]
[+:4]
Notas:
1. A regra
cast_expression
gramtica
eliminadas
na
optativas
destas
regras
son
partes
3. As
simplificada.
non
permitir
sfcpp-id-expression
simplificouse
para
4. A
regra
cualificacin explcita de tipos de datos, membros de "templates" nin
589. {
590.
591.
592.
593.
594.
595.
// varibeis internas
221
596.
597.
598.
599.
600.
601,
602.
603.
604.
605 . }
Ntese que o acceso aos valores das varibeis internas (lias 591-595) e de proceso (lias
597-601) est representado mediante mtodos parametrizados (mtodos template en C++) cuxo
parmetro o tipo de dato da varibel accedida. Todos o mtodos utilizan o identificador
alfanumrico da varibel ou temporizador coa excepcin do mtodo que accede ao estado das
etapas do modelo (lia 603) que utiliza o identificador numrico asignado automaticamente
polo compilador. Ademais os mtodos que consultan a ocorrencia de eventos (lias 591 e 597)
teen un segundo parmetro booleano que indica o tipo de evento consultado (flanco positivo
ou negativo do sinal). Ntese tamn que a ocorrencia de eventos, o estado das etapas e o estado
dos temporizadores unicamente poden ser consultados (os seus valores son modificados
internamente pola mquina virtual durante a evolucin do modelo), polo que s se definen
mtodos de acceso e non de modificacin dos seus valores.
607. expr(Tbool_var)
608.
612.
614. expr(sfcpp_event_id);
Cada aparicin do evento simple no cdigo substitudo por unha varibel booleana
auxiliar: sfcpp_event_id (id un identificador numrico nico asignado internamente polo
compilador). Esta varibel declarada localmente ao comezo da funcin na que estea includo
o cdigo (lia 611). O seu valor iniciado ao resultado devolto polo mtodo
222
getModel VarEventss cada vez que a funcin executada. O mtodo chamado a travs de vm,
que unha instancia da clase que implementa a interface IVMachineAccess (6.3.2) pasada
como parmetro funcin. Ntese que a varibel auxiliar definida como const para evitar que
as expresins que poidan modificar o seu valor compilen correctamente. O seguinte cdigo
mostra dous exemplos:
615. /* Cdigo orixinal */
617.
621.
624.
Unicamente son permitidas expresins booleanas, nas que aparezan os operadores lxicos:
AND, OR e NOT, e os de evento: T e^ (Sidoni utiliza os smbolos: ., +, /, > e<,
respectivamente).
As varibeis utilizadas nas expresins son, polo tanto, tamn booleanas e distnguense dous
tipos: as entradas de proceso e as varibeis de estado das etapas (de sintaxe X).
223
629. if
630.
(a && T(b
^^
^^
^c)))
634.
635. if (a && T(b ^^ (c+5 > 10) && !sfcpp_timer_id && (100 ^^ c)))
636.
637.
638.
639.
640.
641.
643.
648.
651.
652.
653.
654.
655.
656.
657.
// resultado:
662.
664.
665.
666.
667.
668.
669.
670.
671.
672.
674.
675.
676.
224
No exemplo anterior ponse de relevo que hai que ter en conta unha consideracin adicional
ao aplicar o paso 7(lia 667). Como pode comprobarse na expresin resultado da
simplificacin (lia 673) poden aparecer expresins con eventos simples que afecten s
varibeis auxiliares utilizadas para substitur as expresins non booleanas -sfcpp_expr_id, no
exemplo-. Estas varibeis son declaradas e iniciadas localmente (lia 671) na funcin que
contn o cdigo e, ao contrario que as varibeis do modelo (entradas, etapas, temporizadot^es,
etc.), o seu valor non almacenado pola mquina virtual durante a execucin, en consecuencia,
os seus cambios de estado teen que ser detectados localmente en cada execucin do cdigo da
funcin. O seguinte exemplo mostra como se realizara a substitucin dunha subexpresin non
booleana nun caso coma o anterior:
677. /* Cdigo orixinal
678.
679.
680.
681.
682.
Texpr(subexpr num)
/* Cdigo modificado */
684.
// avaliacin da subexpresin
687. {
sfcpp_expr_id_up =
688.
sfcpp_expr_id_down
689.
sfcpp_expr_id_last
690.
691. }
692.
= sfcpp_expr_id;
694. expr_simplificada(sfcpp_expr_id[Q1^_up^_down]);
A tcnica utilizada consiste en declarar para cada subexpresin non booleana catro varibeis
booleanas: sfcpp_expr_id (lia 685), sfcpp_expr id last (lia 682), sfcpp_expr id up e
sfcpp_expr_id down (lia 683). Estas varibeis almacenan, respectivamente, o valor actual da
subexpresin, o valor anterior da subexpresin, a ocorrencia dun cambio no valor da expresin
de false a true, e a ocorrencia dun cambio de true a false. Na expresin simplificada substitese
a subexpresin e as expresins de evento simple que a afecten polas varibeis auxiliares
correspondentes. Ntese que a varibel que almacena o valor anterior declarada como static,
de xeito que o seu valor conservado na memoria entre diferentes execucins da funcin. Cada
vez que esta se executa calclase o valor actual da subexpresin (lia 685), se diferente ao
ltimo valor calculado, actualzanse os valores das varibeis que indican a ocorrencia de
eventos na subexpresin (lias 688-690) e, finalmente, exectase a expresin simplificada cos
valores calculados para as varibeis auxiliares (lia 694).
Esta tcnica ten o inconveniente de introducir varibeis auxiliares innecesarias cando a
subexpresin constante, xa que nese caso o resultado de aplicar un operador de evento
varibel auxiliar sempre falso. Nesta primeira versin non se implementou o tratamento deste
caso especfico, deixndose para unha futura optimizacin do compilador. O seguinte cdigo
mostra o resultado do paso 7 do exemplo anterior (lia 667) aplicando esta tcnica para
substitur a subexpresin non booleana:
695.
696.
697.
698.
699.
700.
225
701.
702.
703.
704.
705.
706.
707 .
7oa.
709.
710.
711.
712.
if (sfcpp_expr_id != sfcpp_expr_id_last)
{
sfcpp_expr_id_up = (sfcpp_expr_id_last) ? false : true;
}
if (a && (!sfcpp_expr_id && sfcpp_event_id) ^^
^^
Ntese que para completar a modificacin da expresin con eventos complexa faltara
procesar a subexpresin non booleana (lia 701), substitundo nela a varibel c coa tcnica
explicada en (6.3.3.3).
A ubicacin do cdigo que calcula os valores das varibeis auxiliares (lias 704-706)
presenta unha complicacin adicional, pois preciso realizar diferentes substitucins
dependendo da posicin no cdigo na que estea situada a expresin con eventos complexa.
Considrense os exemplos seguintes nos que a expresin aparece en diferentes posicins dun
bucle for:
713. /* 8xemplo l: Cdigo orixinal */
<any expr>;
716.
717.
<any expr>)
718.
719.
720.
721.
722.
723.
724.
725.
726.
727.
728.
bool sfcpp_expr_id =
{
sfcpp_expr_id_up =
sfcpp_expr_id_down
sfcpp_expr_id_last
(bool) (c>5)
= sfcpp_expr_id;
729. }
730.
732.
<any expr>;
733.
<any expr>)
734.
c++;
c++;
738.
739.
743.
746. {
747.
748.
749.
750. }
sfcpp_expr_id_last = sfcpp_expr_id;
226
(<any expr>;
expr_simpl(sfcpp_expr_id[QJ^_up^_down]);
753.
754.
c++;
755.
756.
757.
if (sfcpp_expr_id != sfcpp_expr_id_last)
sfcpp_expr_id_last = sfcpp_expr_id;
758.
759.
760.
761.
<any expr>)
762. }
763. /* $xemplo 3: Cdigo orixinal */
766.
Texpr(c>5))
767.
771.
774. {
c++;
775.
776.
(subexpr num);
sfcpp_expr_id = (bool)
777.
if (sfcpp_expr_id != sfcpp_expr_id_last)
778.
{
779.
780.
sfcpp_expr_id_down = (sfcpp_expr_id_last) ? true : false;
781.
sfcpp_expr_id_last = sfcpp_expr_id;
782.
}
783.
784. }
Como pode comprobarse nos tres casos mostrados no exemplo anterior, a localizacin da
expresin con eventos complexa no cdigo modifica substancialmente o resultado da
substitucin. Cando utilizada na expresin de iniciacin da instruccin for (lia 715)
abondo con calcular o valor da subexpresin e das varibeis auxiliares antes de iniciarse o
bucle. Sen embargo, se a expresin aparece na condicin do for (lia 737), hai que facer a
iniciacin antes de iniciarse o bucle e recalcular o valor da expresin e das varibeis auxiliares
ao fnal de cada iteracin do bucle. Finalmente, se a expresin est na parte do for que se
executa despois de cada ciclo (lia 765) non far falta facer a iniciacin antes do bucle, mais si
a actualizacin ao final de cada ciclo. En consecuencia hai que analizar o contexto no que
aparece a expresin no cdigo para realizar unha substitucin que mantea a sa semntica,
especialmente naqueles casos que requiren recalcular o valor das varibeis auxiliares por estar a
expresin dentro dun bucle. Os diferentes casos tratados polo compilador son detallados en
(6.5.1.5.3).
6.3.3.2. Substitucin de temporizadores
O seguinte cdigo mostra como se realiza a modificacin de expresins que conteen
temporizadores:
785. /* Cdigo orixinal ( expresin contendo un temporizador) */
227
787.
788.
789.
790.
791.
792.
/* Cdigo modificado */
expr(sfcpp_timer_id);
A tcnica a mesma que a explicada para os eventos (6.3.3.1). Unicamente cambia o nome
da varibel auxiliar -sfcpp_timer_id- e o mtodo chamado para iniciala getTimerState-.
Ademais o compilador ten que almacenar os parmetros do temporizador substitudo para
compilar con posterioridade a sa condicin e xerar a informacin que permita xestionar o seu
estado durante a execucin do modelo na mquina virtual.
6.3.3.3. Substitucin de varibeis
Na substitucin dunha varibel, o cdigo a utilizar depende de se o valor da varibel pode
consultarse e modificarse, unicamente consultarse ou unicamente modificarse. preciso polo
tanto considerar os seguintes factores:
1. O tipo de varibel, pode tratarse dunha varibel do modelo, do proceso, do estado de
activacin dunha etapa ou do estado de activacin dunha accin.
2. O cdigo no que se utiliza a varibel, pode ser nunha condicin (o que incle as condicins
de transicin, temporizacin e as de asociacin de accin) ou nunha accin.
794. expr(X_id)
795.
799.
801. expr(sfcpp_modelvar_id);
228
803. expr(var)
804.
806.
807.
808.
809.
810.
511.
812.
type sfcpp_modelvar_id_value;
vm.getModelVar("var", sfcpp_modelvar_id_value);
expr(sfcpp_modelvar_id);
Neste caso o acceso ao valor da varibel faise mediante o mtodo getModel Var56. Este un
mtodo parametrizado co tipo de dato da varibel accedida (6.3.2). Este valor obtido
mediante unha varibel auxiliar do tipo do que se trate -sfcpp_modelvar_id_value (lia
807^ e asignado a outra varibel do mesmo tipo -sfcpp_modelvar_id (lia 809}- que a
utilizada para realizar a substitucin. Esta segunda varibel constante, polo que se garante o
cumprimento da regra 4, xa que o seu valor non vai poder ser modificado. A razn de necesitar
das varibeis do mesmo tipo, unha constante e a outra non, que ao mtodo getModelVar non
se lle pode pasar como parmetro unha varibel constante, xa que o seu valor vai ser
modificado no interior do mtodo. Sen embargo, para realizar a substitucin, e evitar que o
valor sexa modificado no cdigo da funcin, precsase unha varibel auxiliar constante. Ntese
tamn que o estado de activacin dunha accin un caso particular das varibeis do modelo, no
que o tipo da varibel booleano e o seu valor non pode ser modificado. A utilizacin desta
tcnica cos estados de activacin das accins garante tamn o cumprimento da regra 1.
Varibeis do modelo nas accins.
813.
814.
815.
816.
817.
818.
/* Cdigo orixinal */
expr(var)
/* Cdigo modificado */
821.
822.
823.
824.
825.
826.
827.
sb
expr(sfcpp_modelvar_id.second);
if (sfcpp_modelvar_id.first != sfcpp_modelvar_id.second)
vm.setModelVar("var", sfcpp_modelvar_id.second);
229
Ao contrario dos casos anteriores, os valores das varibeis do modelo utilizados nas accins
si poden ser modificados. Ao realizar a substitucin ser preciso, polo tanto, inclur non s 0
cdigo que accede ao valor da varibel senn tamn o que o actualiza en caso de que sexa
modificado. Isto implementado declarando un par de varibeis (lia 818) auxiliares do tipo do
que se trate (mediante o"template" pair do C++). Os dous membros do par son iniciados ao
valor da varibel do modelo ( lia 820), que obtido mediante o mtodo getModelVar do
mesmo xeito que no caso comentado anteriormente. O segundo membro do par utilizado para
realizar a substitucin da varibel do modelo no cdigo. Este membro non constante, polo
que pode ser modificado polo cdigo da accin. A actualizacin do valor modificado faise nas
lias 826-827, que son inseridas ao final da funcin que contn o cdigo. Nestas lias
comprase o valor dos dous membros do par, o primeiro conter o valor da varibel antes de
executar o cdigo da accin e o segundo o valor despois de executar o cdigo. Se ambos
valores son diferentes actualzase na mquina virtual o valor modificado mediante o mtodo
setModel Var.
Sadas do proceso nas accins.
Como indica a regra 3, as sadas do proceso poden modificarse mais non consultarse (no
caso de precisar a consulta dunha sada, o seu valor e introducido no modelo mediante unha
entrada auxiliar). Por este motivo a tcnica utilizada para realizar a substitucin ten que
producir como resultado un cdigo que non compile correctamente nun compilador C++ se a
sada utilizada con calquera outro fin que non sexa o de asignarlle un valor. A modificacin
realizada a seguinte:
828.
829.
830.
831.
832.
833.
/* Cdigo orixinal */
expr(output)
/* Cdigo modificado */
SFCRTOutput<type> sfcpp_modelvar_id;
834.
836. expr(sfcpp_modelvar_id);
837.
839. if (sfcpp_modelvar_id.modified())
840.
vm.setSystemVar("var", sfcpp_modelvar_id.value());
Neste caso a varibel auxiliar utilizada unha instancia da clase SFCRTOutput. Esta unha
clase parametrizbel co tipo de valor da sada. A sa declaracin a seguinte:
841.
842.
843.
844.
845.
846.
847.
class SFCRTOutput
T output;
bool flag;
public:
SFCRTOutput(): flag(false){}
848.
T& operator=(const T& val) { output = val; flag
849.
bool modified() const { return flag; }
850.
T value() const { return output; }
851. };
Cada instancia da clase ten dous atributos, o valor da sada -atributo output (lia 844)--- e
un indicador booleano -atributo Jlag (lia 845^ que indica se ese valor foi modificado con
posterioridade creacin da instancia. Inicialmente este indicador ten o valor false e s pasa a
230
valer true cando se lle asigna un valor sada mediante o operador de asignacin simple
(operator=) que redefinido pola clase (lia 848). A tcnica utilizada para a substitucin
garante que o cdigo resultado produce un erro de compilacin se a sada utilizada nunha
expresin que non sexa de asignacin. O seguinte cdigo mostra algns exemplos:
852.
853.
654.
855.
856.
857.
/* Cdigo modificado */
SFCRTOutput<bool> sfcpp_modelvar_id;
858.
859.
860.
861.
662.
863.
864.
865.
866.
867.
868.
869.
/* Cdigo modificado */
/* Cdigo modificado */
En caso de que o valor da sada sexa modificado, o novo valor actualizado na mquina
virtual nas lias 839-840, que son inseridas ao final da funcin que contn o cdigo. Nestas
lias comprobase se a sada foi modificada -mediante o mtodo modified da clase
SFCRTOutput (lia 849}-, e en caso afirmativo actualzase na mquina virtual o valor
modificado mediante o mtodo setSystemVar -o valor modificado devolto polo mtodo
value da clase SFCRTOutput (lia 850^.
A tcnica descrita ten a limitacin de que o valor da sada s pode ser modificado mediante
0 operador de asignacin simple. A asignacin de valores sada utilizando os operadores de
asignacin compostoss' do C++ ( +_, -_, *_, /_, %_, ^_, &_, ^_) ou a utilizacin da sada como
argumento dunha funcin que modifique o seu valor internamente daran como resultado da
substitucin un cdigo que provocara un erro na compilacin. Na prctica estas limitacins
poden evitarse utilizando varibeis auxiliares. O seguinte cdigo mostra algns exemplos:
870. /*
Cdigo orixinal */
871. output = 3;
872.
873.
874.
875.
876.
877.
878.
879.
880.
881.
882.
883.
/* Cdigo modificado */
SFCRTOutput<int> sfcpp_modelvar_id;
sfcpp_modelvar_id = 3;
int aux_var = 3;
aux_var += 5;
output = aux_var;
57 A asignacin en C++ mediante un operador composto require que a varibel modificada tea un valor vlido,
que ser utilizado para calcular o novo valor asignado. Se se utilizaran cunha instancia da clase SFCRTOutput
antes de que tivese un valor inicial vlido, o valor asignado sera erroneo.
231
884.
885.
886.
887,
888.
SFCRTOutput<int> sfcpp_modelvar_id;
int aux_var = 3;
aux_var += 5;
889.
890.
891.
892.
893.
894.
/* Cdigo orixinal */
895.
896.
897.
898.
899.
900.
901.
902.
903.
904.
/* Cdigo modificado */
SFCRTOutput<bool> sfcpp_modelvar_id;
bool aux_var;
any_function(aux_var);
output = aux_var;
SFCRTOutput<bool> sfcpp_modelvar_id;
bool aux_var;
any_function(aux_var);
sfcpp_modelvar_id = aux_var;
RTActionType
Enumeracin que define os tipos de accins que se diferencian durante a execucin dun
modelo Grafcet. Os valores escalares definidos son:
model var action, accin que modifica o valor dunha varibel (booleana) do modelo.
system_var action, accin que modifica o valor dunha varibel (booleana) do proceso.
58 Para evitar complicar o diagrama da Figura 6.8 non se mostran as operacins definidas en cada clase, que
consisten basicamente en funcins que permiten a insercin e o acceso informacin do modelo utilizando os
identificadores numricos dos diferentes elementos.
232
IModule
(from Modules)
RTModel
actions_code : map<string, void*>
conditions_code : map<string, void*>
RTFOInfo
pgid : unsigned long
stepid : unsigned long
type : FOrderTppe
fpg : unsigned long
fsituation : RTSituation
forcing_orders
SFCVarDeclarations
(from Grafcet Library)
1
static model
declarations
1
bind(unsigned long) ^
RTStaticModel
*^
FO_levels
RTSituation
name : string
RTTimerlnfo
timers initial situation : RTSituation
id : unsigned long *
partial_grafcets
_^^3I
condition : string ^^
RTPGInfo
*
t1 : double
receptivit i es
^ode s
id
:
unsigned
long
actions
t2 : double
key : string
vars : set<string>
:
steps : RTSituation
fosteps : RTSituation
RTActionlnfo
*
RTReceptivitylnfo
id : unsigned long
receptivity : string
source : bool
vars : set<string>
id : unsigned long
stepid : unsigned long
action_name : string
type : ActionType
indicator : string
delay : double
limit : double
condition : string
scale : TimeScale
code_type : RTActionType
vars : set<string>
RTNodelnfo
id : unsigned long
key : string
pgid : unsigned long
before : RTSituation
after : RTSituation
enumeration
RTActionType
model_var_action
system var_action
code block action
enumeration
TimeScale
ts internal
ts external
Figura 6.8. Diagrama de clases da informacin utilizada para a execucin dun modelo Grafcet.
RTSituation
Conxunto de identificadores numricos. Esta clase utilzase tanto para representar a
situacin do modelo durante a execucin como calquera outra informacin que requira
almacenar un conxunto de identificadores de elementos pertencentes ao modelo.
RTModel
Clase que proporciona unha interface comn de acceso informacin dun modelo Grafcet
que sexa cargado na mquina virtual para a sa execucin. Os atributos desta clase son os
seguintes:
actions_code, informacin que permite acceder ao cdigo obxecto das accins xerado
como resultado da compilacin do modelo.
233
RTStaticModel
Clase que proporciona unha interface comn de acceso informacin esttica (estructural)
do modelo Grafcet durante a execucin. Os atributos desta clase son os seguintess9:
RTPGInfo
Clase que representa a informacin de cada grafcet parcial do modelo Grafcet durante a
execucin. Os atributos desta clase son os seguintes:
59 Os atributos nodes, partial^rajcets, receptivities, timers, actions e forcing_orders foron implementados como
mapas de chave numrica (map<unsigned long, DataClass>). Isto podera indicarse no diagrama da Figura 6.8
engadindo a chave a cada relacin de agregacin, mais non se indicou para manter a simplicidade.
234
RTReceptivityInfo
Clase que representa a informacin de cada receptividade do modelo Grafcet durante a
execucin. Os atributos desta clase son os seguintes:
source, atributo que indica se a receptividade est asociada a unha transicin fonte.
condition, nome da funcin que contn o cdigo da condicin que activa o temporizador.
tl , cantidade de tempo que a condicin debe ser certa para que se active o temporizador.
t2, cantidade de tempo a transcorrer para desactivar o temporizador dende que a condicin
deixa de ser certa.
RTActionInfo
Clase que representa a informacin de cada asociacin do modelo Grafcet durante a
action_name, este atributo indica o nome dunha varibel do modelo (en accins tipo
model_var_action) ou de proceso (en accins tipo system_var_action) que modificada
durante a activacin da asociacin. Nas accins tipo code_block_action o valor deste
atributo indica o nome da funcin que contn o cdigo da accin executada durante a
activacin da asociacin.
delay, cantidade de tempo que indica a demora antes da cal a condicin da asociacin non
avaliada (a accin non se executa). O valor resultado da avaliacin da condicin non tido
en conta antes de transcorrer o perodo de tempo indicado polo valor deste atributo.
limit, cantidade de tempo que indica o lmite temporal despois do cal a condicin da
asociacin non pode ser avaliada (a accin non se executa). O valor resultado da avaliacin
da condicin non tido en conta unha vez transcorrido o perodo de tempo indicado polo
valor deste atributo.
condition, nome da funcin que contn o cdigo da condicin que controla a execucin da
accin.
scale, atributo que indica si a accin vai ser executada en situacins inestbeis durante as
evolucins internas do modelo, ou s nas situacins estbeis.
235
236
Nodo ("SFCNode"^
1. Se unha etapa inicial, engadir o seu identificador numrico situacin inicial -no
atributo initial da clase SFCCompiler (lia 311}-.
2. Engadir o identificador numrico lista de etapas do grafcet parcial que a contn -no
atributo steps da clase RTPGInfo (Figura 6.8^.
3. Procesar asociacins e ordes de forzado da etapa.
60 Indcase entre parnteses o nome da clase utilizada para representar o elemento na librara que implementa o
metamodelo Grafcet (5.2).
237
Asociacin ("SFCActionAssociation")
1. Obter un identificador numrico (nico para cada asociacin).
2. Crear e almacenar -no atributo actions da clase SFCCompiler (lia 314^ unha instancia
da clase RTActionlnfo (6.4) coa informacin da asociacin.
3. Se unha asociacin retardada:
'
238
cond
D#2s var
L#6s
-+-+--^----+^^
cond
^I^ ^ i
var
^;^;^! i
i2i i4sii
i ii ^
^.
(n)
(a)
cond &&
!sfcpp_timer_L
n
X n
- cond
--F^---+----+-+F
sfcpp timer_D
var
(n)
(b)
Figura 6.9. Tratamento de accins temporizadas: a) accin retardada e limitada no tempo; e b) modificacin
239
Na Figura 6.10 e na Figura 6.11 mstranse exemplos da informacin creada por esta fase
para algns modelos Grafcet concretos.
PG1
)_
0
(0)
a
1
a 88 !b
!c
HP action_1 indicator_t
S I var_t
D#2s
c
P
D#2s action 2
L#10s
(z) ^-!(b II ^)
(a)
:RTPGInfo
id=0
key ='SFCPartial.PGt'
steps = {1, 3, 5}
fosteps = Q
:SFCComoiler
P8s
initial = {1}
timers
actions
nodes
:RTNodelnfo
recs
:RTReceoliviNlnfo
id=2
key ='SFCTrans.(0)'
pgid = 0
before = {1}
after = {3}
:RTReceotiviNlnfo
id=4
receptiviry ='d'
source = false
vars = Q
id=2
receptivity ='a'
source = false
vars = Q
id=3
key ='SFCStep.1'
pgid = 0
before = {2}
after = {4}
:RTNodelnfo
id=4
key ='SFCTrans.(1)'
pgid = 0
before = {3}
after = {5}
:RTNodelnfo
id=5
key ='SFCStep.2'
pgid = 0
before = {4}
after = {8}
:RTNodelnfo
id=8
key ='SFCTrans.(2)'
pgid = 0
before = {5}
after = {1}
'RTReceotiviNlnfo
id=
receptivity ='!(bllc)'
source = false
vars = Q
^RTAdionlnfo
:RTActionlnfo
id=1
stepid = 3
action_name ='var_1'
tYPe = S
indicator ="
delay = 2s
limit = 0
wndrtion ='!c 88 sfcpp timer 0'
sple =1s_external
wde_tYPe =
vars = {'sfcpp_Gmer_Oy
id=2
stepid = 5
actlon_name ='action 2'
tYPe = P
indicator =
delay = 2s
limt = 10s
wndition ='c 88 sicpp timer_1 88 !sfcpp_timer_Y
scale = ts_eMemal
wde_tYPe =
vars = {'sfcpp timer_1', 'sfcpp 6mer_2^
:RTActionlnfo
id=0
stepid = 3
action_name ='action_1'
tYPe = P
indicator ='indicator_1'
delay = 0
limit = 0
wndrtion ='a 88 !b'
scale = ts_external
code_bPe =
vars = q
:RTNOdelnfo
:RTNodelnfa
id=1
key ='SFCStep.O'
p^d = 0
before = {8}
aRer = {2}
:RTTimerlnfo
:RTTimerlnfo
:RTTimednfo
id=0
wnddion ='X_1'
tt = 2s
t2=0
vars = {'SFCStep.1^
id=1
wndrton ='X 2'
t1 = 2s
12=0
vars = {SFCStep.2^
id=2
wndrtion ='X Y
t1 = 10s
t2=0
vars = {'SFCStep.Y)
(b)
Figura 6.10. Exemplo do funcionamento da fase SFCInoHarvester: a) modelo Grafcet; e b) diagrama de obxectos
da informacin recopilatia pola fase.
240
PG3
20
PG2
PG1
(20)
F/PG3:{22}
10
21
(10)
(0)
(21.a)
^--^F/PG2:{10
23
22
(1)+b&&c
Ib
b (21.b)
F/PG3:{20, 23}
12
11
(11)+1b88d
(22)
(23).}^d
(a)
:SFCCamoiler
initial = {1, 6, 12}
recs
pgs
:RTPGInfo
:RTPGInfo
id=0
key ='SFCPartial.PG1
steps ={1, 3}
fosteps ={3}
id=5
key ='SFCParbaI.PG2'
steps ={6, 8, 9}
fosteps = {6, 9}
Glnfo
id=11
key ='SFCPartial.PG3"
steps ={12, 14, 16, 19}
fosteps = Q
nodes
:RTNodelnfo
forders
id=1
key ='SFCStep.O'
pgid = 0
before = {4}
after = {2}
:RTNodelnfo
:RTNodelnfo
id=2
key ='SFCTrans.(0)'
pgid = 0
before = {1}
after = {3}
id=3
key ='SFCStep.1'
pgid = 0
before = {2}
after = {4}
:RTNodelnfo
id=4
key ='SFCTrans.(1)'
pgid = 0
before = {3}
after = {1}
:RTNodelnfo
:RTNodelnfo
:RTNodelnfo
RTNodelnfo
RTNodelnfo
id=6
key =SFCStep.10'
pgid = 5
before = {10}
after = {7}
id=7
key ='SFCTrans.(10)'
pgid = 5
before = {6}
after = {8, 9}
id=8
key ='SFCStep.11'
pgid = 5
before = {7}
after = {10}
id=9
key ='SFCStep.12'
pgd = 5
before = {7}
after = {10}
id=10
key =SFCTrans.(11)'
pgid = 5
before = {8, 9}
after = {6}
:RTNodelnfo
:RTNodelnfo
;RTNodelnfo
:RTNodelnfo
:RTNodelnfo
id=12
key ='SFCStep.20'
pgid = 11
before = Q
after = {13}
id=13
key ='SFCTrans.(20)
pgid = 11
before = {12}
after = {14}
id=14
key ='SFCStep.21'
pgid = 11
before = {13}
after = {15, 18}
id=15
key ='SFCTrans.(21.a)' '
pgid = 11
before = {14}
after = {16}
id=16
key ='SFCStep.22'
pgid = 11
before = {15}
after = {17}
:RTNodelnfo
:RTNodelnfo
:RTNodelnfo
:RTNodelnfo
id=17
key ='SFCTrans.(22)
P9id = 11
before = {16}
after = {14}
id=18
key ='SFCTrans.(21.b)
pgid = 11
before = {14}
after = {19}
id=19
key ='SFCStep.23'
pgid = 11
before = {18}
after = {20}
id=20
key = SFCTrans.(23)'
P9id = 11
before = {19}
after = {14}
:RTFOInfo
:RTFOInfo
:RTFOInfo
pgid = 0
stepid = 3
type = force
fpg = {5}
situation = {6}
pgid = 5
stepid = 6
type = force
fpg = {11}
situation = {16}
pgid = 5
stepid = 9
type = force
fpg = {11}
situation = {12, 19}
:RTReceotivitvlnfo
id=2
receptivity ='a'
source = false
vars=Q
:RTReceotivirilnfo
id=4
receptivity ='b &8 c'
source = false
vars=Q
:RTReceotivitvlnfo
id=7
receptivity ='b'
source = false
vars=Q
:RTReceotivitvlnfo
id=10
source = false
vars=Q
:RTReceotivitvlnfo
:RTReceotivirilnfo
:RTReceotivitvlnfo
:RTReceotivirilnfo
^RTReceptivirilnfo
id=13
receptivity = 'a'
source = false
vars = Q
id=15
receptivity = 'b'
source = false
vars = Q
id=17
receptivty = 'c'
source = false
vars = Q
id=18
receptivity = '!b'
source = false
vars = Q
id=20
receptivity ='d'
source = false
vars = Q
(b)
Figura 6.11. Exemplo do funcionamento da fase SFCInfoHarvester: a) modelo Grafcet; e b) diagrama de obxectos
da informacin recopilada pola fase.
241
'
end if
end for
end while
end if
end for
if (nivel de N = +ao)
nivel de N:= 1
if (nivel de P = +ao)
nivel de N :_ +ao
else
end if
ead for
end if
end for
end while
242
Este algoritmo comeza construndo o grafo dirixido que representa a xerarqua de forzado
inversa, na que hai un arco dirixido dende cada nodo que represente un grafcet parcial forzado
ao nodo que represente o grafcet parcial que o forza. O nivel de cada nodo inciase a un valor
mximo (+oo) utilizado como indicador e posteriormente percrrense iterativamente todos os
nodos asignndolles o mximo nivel dos seus predecesores incrementado nunha unidade,
sempre e cando ningn dos predecesores tea un nivel igual ao do indicador mximo. Dste
xeito na primeira iteracin asgnase o nivel dos nodos sen predecesores (os de nivel 1), na
segunda os de nivel 2, e as consecutivamente ata que non quede ningn nodo sen asignrselle
nivel.
6.5.1.4. Procesamento das asociacins de accin ( "SFCAssociationPreprocessor")
Nesta fase comprbase que as asociacins de accin do modelo (5.1.2.3) cumpren as
seguintes regras:
1. Todas as asociacins teen que ter un nome.
2. O nome dunha asociacin ten que ser unha varibel do modelo, unha sada do proceso ou o
nome dunha accin declarada como parte do modelo Grafcet. Ademais ten que ser de tipo
booleano e o seu valor modificbel. O tipo de asociacin almacenado no atributo
code type da clase RTActionlnfo (6.4).
3. O indicador dunha asociacin ten que ser unha varibel do modelo ou do proceso declarada
como parte do modelo Grafcet.
4. As nicas asociacins que poden definirse como internas son as que, dende un punto de
vista externo (3.3.2.4), teen -teoricamente- unha duracin nula. Polo tanto
unicamente as accins impulsionais e almacenadas (P, P0, P1, R ou S) poden ser internas.
5. Pola mesma razn, as asociacins definidas como internas non poden ser retardadas ou
limitadas, xa que -teoricamente- non teen duracin na escala de tempo externa.
6.5.1.5. Procesamento do cdigo das accins ( "SFCActionCodeCompiler")
Esta fase est composta de varas subfases que procesan o cdigo de cada accin do modelo
dacordo ao explicado en (6.3.3). A execucin das subfases configrase utilizando a tcnica
explicada en (6.2.4), e basicamente realizan as operacins seguintes:
1. Preprocesar o cdigo da accin utilizando un preprocesador C++ externo.
2. Substitur os temporizadores utilizando a tcnica explicada en (6.3.3.2).
3. Substitur as varibeis e expresins con eventos, simplificando as expresins con eventos
complexas utilizando as tcnicas explicadas en (6.3.3.1) e(6.3.3.3).
Cada unha das subfases explicada en detalle a continuacin.
6.5.1.5.1. Preprocesamento do cdigo C++ ("CPPActionPreprocessor")
243
Esta fase recopila e almacena a informacin dos temporizadores utilizados no cdigo -coa
sintaxe explicada en (6.3.1.1^ e os substite por varibeis auxiliares que van almacenar o
seu valor durante a execucin. Na versin actual do compilador non se permite a utilizacin de
temporizadores no cdigo das condicins de asociacin, no cdigo das accins nin o uso de
temporizadores aniados (temporizadores nas condicins doutros temporizadores), polo que na
prctica esta fase s se executa cando se compila o cdigo dunha condicin de transicin. As
operacins realizadas por esta fase son as seguintes:
1. Para cada temporizador crase e almacnase -no atributo timers da clase SFCCompiler
(lia 317^ unha instancia da clase RTTimerlnfo (6.4) utilizando a informacin
recopilada polo compilador: identificador numrico nico asignado automaticamente,
cdigo da condicin do temporizador e valores de retardo e lmite.
2. Substitense os operadores de temporizacin polo cdigo que permite acceder ao seu valor
durante a execucin do modelo aplicando a tcnica explicada en (6.3.3.2). As condicins
dos temporizadores son almacenadas para ser procesadas nunha fase posterior do
compilador (6.5.1.8).
6.5.1.5.3. Procesamento de eventos e varibeis ( "SFCEventCompiler")
Esta unha fase composta que realiza a simplificacin das expresins con eventos
complexas e a substitucin das varibeis e eventos simples polo cdigo que permite acceder aos
seus valores en tempo de execucin. As operacins realizadas por esta fase son as seguintes:
1. Detectar e almacenar a informacin sobre as expresins con eventos complexas que
aparecen no cdigo.
2. Obter a informacin sobre o contexto (posicin no cdigo) no que aparecen estas
expresins. Esta informacin utilizada posteriormente para substitur as expresins
complexas.
3. Reducir e simplificar as expresins con eventos complexas por equivalentes que contean
unicamente eventos simples dacordo ao explicado en (6.3.3.1).
4. Obter a informacin sobre as varibeis do modelo, de proceso, nomes de accin, eventos
simples, etc. utilizados no cdigo.
5. Substitur as varibeis e eventos simples utilizando as tcnicas explicadas en (6.3.3).
Cada unha das subfases detallada a continuacin.
Deteccin das expresins con eventos ("EventExprHarvester")
Esta fase procura as expresins complexas con eventos para reducilas nas fases posteriores.
O obxectivo obter expresins equivalentes que unicamente utilicen eventos simples (cambios
de estado en varibeis booleanas), que son os manexados pola mquina virtual. Isto facilita a
avaliacin de condicins en tempo de execucin.
As expresins con eventos complexas son as que comezan por un operador de evento (T ou
.^) seguido dunha expresin entre parnteses:
T (<expr>) ou ^(<expr>)
A obrigatoriedade de utilizar os parnteses unha restriccin imposta nesta primeira versin
do compilador para facilitar a deteccin dos lmites da expresin. Con esta restriccin a
implementacin desta fase resulta moi simple e non require unha anlise sintctica detallada do
244
cdigo que sigue ao operador de evento para determinar en que punto remata a expresin. Esta
restriccin podera eliminarse en futuras implementacins desta fase. Por cada expresin
identificada, almacnase a sa posicin no cdigo e a expresin contida entre parnteses. Anda
que as expresins con eventos poden aniarse (unha expresin complexa pode aparecer dentro
doutra) isto non tido en conta nesta fase, na que s son detectadas as expresins mis
externas.
A
Recopilacin do contexto das expresins con eventos ("EventExprContextHarvester")
Como foi explicado en (6.3.3.1), a posicin no cdigo na que se utilice unha expresin con
eventos complexa pode modificar substancialmente os cambios a realizar no cdigo para
simplificala e substitula polas varibeis auxiliares coas que se implementa a sa semntica.
Nesta fase analzase e recoplase a informacin sobre o contexto no que son utilizadas as
expresin con eventos complexas. A parte da gramtica C++ que define as instruccins da
linguaxe a seguinte:
935. statement:
labeled-statement
936.
expression-statement
937.
compound-statement
938.
selection-statement
939.
iteration-statement
940.
jump-statement
941.
declaration-statement
942.
try-block
943.
944.
945. labeled-statement:
identifier : statement
946.
947.
948.
default : statement
949.
950. expression-statement:
expressionaPt ;
951.
952.
953. compound-statement:
{ statement-seqoPt }
954.
955.
956. statement-seq:
statement
957.
958.
959.
statement-seq statement
960. selection-statement:
if ( condition ) statement
961.
if ( condition ) statement else statement
962.
switch ( condition ) statement
963.
964.
965. condition:
expression
966.
type-specifier-seq declarator = assignment-expression
967.
968.
969. iteration-statement:
970.
do statement while ( expression );
971.
for ( for-init-statement conditionoPt ; expressionopt ) statement
972.
973.
974. for-init-statement:
expression-statement
975.
simple-declaration
976.
977.
^
978. jump-statement:
979.
980.
break ;
continue ;
245
981.
982.
983.
984.
985.
block-declaration
Dacordo a esta gramtica as expresins con eventos poden ser utilizadas nos^ contextos
seguintes:
1. Na condicin dunha instruccin de seleccin: if(lia 961) ou switch (lia 963).
2. Na condicin dunha instruccin iterativa: while (lia 970), do while (lia 971) ou for (lia
972) -a condicin neste caso opcional-.
3. Na instruccin opcional de iniciacin dun bucle for (lia 974).
4. Na expresin opcional dun bucle for (lia 972), executada ao final de cada ciclo do bucle.
5. Na expresin opcional da instruccin de salto return (lia 981).
6. Como parte dunha expresin que por si mesma constite unha instruccin (lia 950).
7. Como parte dunha instruccin de declaracin (lia 984).
Para realizar a substitucin de cada expresin con eventos complexa preciso determinar en
que posicin do cdigo orixinal inserir as modificacins. Nos casos mais complicados, nos que
a expresin simplificada contn eventos simples aplicados a subexpresins numricas
(6.3.3.1), poden requirirse modificacins en tres posicins diferentes dependendo do contexto
concreto: unha na que inserir a declaracin das varibeis auxiliares, outra para a iniciacin das
subexpresins numricas e varibeis auxiliares e unha ltima, cando a expresin orixinal
utilizada na condicin dun bucle, para a actualizacin de subexpresins numricas e varibeis
auxiliares. En consecuencia nesta fase recoplase, para cada expresin con eventos complexa, a
informacin seguinte:
1. Tipo de instruccin (contexto) no que est contida a expresin (p.e. if, for, etc.).
2. Posicin do comezo e fin da instruccin.
3. No caso das instruccins de seleccin (lia 960) ou iteracin (lia 969), que estn formadas
por unha parte condicional e un conxunto de instruccins executadas cando a condicin se
cumpre:
a. A posicin do comezo e fin do conxunto de instruccins.
b. Un indicador booleano de si o conxunto de instruccins est pechado entre `{}'. En
caso de non estalo tratarase dunha nica instruccin (includa a baleira: `;').
Os valores desta informacin para os diferentes contextos diferenciados nesta fase son os
seguintes1:
Instruccin de seleccin if^tipo = IF)
986. [b]if (<condition_with_complex_event_expression>)
[cb]<statement>;[ce][e]
987.
988. (b]if (<condition_with_complex_event_expression>)
{ [cb]
989.
<statements>
990.
} [ce] (e]
991.
61 Os valores almacenados pola fase para o inicio e fin da sentencia son indicados coas etiquetas: [b] e[e], e os de
inicio e fin do conxunto de instruccins coas etiqutas: [cb] e[ce]. Nas sentencias nas que sexa aplicbel danse
duas versins, unha na que o conxunto de instruccins est pechado entre "{}" e outra na que non.
246
[b]switch (<condition_with_complex_event_expression>)
{ [cb]
case <value_1>: <statements> break;
} [ce] [e]
<condition_with_complex_event_expression>;
999.
1000.
<expression with_complex_event_expression>)
1001.
[cb]<statement>;[ce][e]
1002.[b]for(<expression_with_complex_event_expression>;
<condition_with_complex_event_expression>;
1003.
<expression_with_complex_event_expression>)
1004.
{[cb]
1005.
1006.
<statements>
1007.
} [ce] [e]
1009.
1010.
[cb]<statement>;[ce]
while
(<condition_with_complex_event_expression>);[e]
1011 . [b] do
1012 .
{ [cb]
1013.
1014.
<statements>
}[ce]
1015.
while
(<condition_with_complex_event_expression>);[e]
1017.
( cb]<statement>;[ce][e]
1018.[b]while
( <condition_with_complex_event_expression>)
1019.
{[cb]
1020.
1021.
<statements>
} [ce] [e]
( <condition_with_complex_event_expression>);[ce][e]
1023.[b][cb]<expression_statement_with_complex_event_expression>;[ce][e]
1028.
247
1029./* Sadas */
1034.
1035./* Algoritmo */
1036.// buscar delimitador da iastruccin previa
1042.
1043.
type = for_ou_expresin(code, delim^os, pos)
1045.
// a expresin parte dua wh31e ou dua do while?
1046.
type = while_ou_dowhile(code, delim^os, pos)
1047.ead if
1049.
// est a expreain includa na condicia da instruccin?
1050.
1051.
1052.
1053.
1054.
delim^os = cond_end
type = STATEMENT
end if
1055.end if
type, stbegin,
1058.
delim^os, pos)
1059.
O algoritmo determina que palabra reservada do C++ hai entre o inicio da instruccin que
contn a expresin e a posicin da expresin no cdigo. O inicio da instruccin determnase
buscando o delimitador da instruccin previa (lia 1037), que pode ser un dos seguintes: `{',
`}', `;' ou `:'. Existen das situacins nas que algn destes smbolos pode aparecer no cdigo
sen ser delimitadores dunha instruccin:
1. O smbolo `;' pode aparecer como separador das expresins dunha instruccin for (lia
972). Durante a busca o algoritmo sltase as expresins entre parnteses, polo que os
smbolos `;' que estean na parte da condicin dun for non sern detectados como
delimitadores. A nica excepcin cando a expresin con eventos fai parte da condicin
dunfor. Este caso explcase posteriormente.
2. O smbolo `:' pode formar parte do operador `?:' (lia 472). Neste caso o algoritmo
comproba que o smbolo non fai parte dunha instruccin etiquetada2 (lia 945) e contina
a busca doutro delimitador.
Unha vez localizado o delimitador bscase entre a sa posicin3 e a posicin da expresin
no cdigo, unha das seguintes palabras reservadas do C++: if, switch, for, while ou return (lia
1039). O tipo da instruccin inciase en funcin da palabra reservada atopada, en caso de non
atopar ningunha o tipo inciase ao valor STATEMENT. Existen algns casos nos que esta
anlise inicial non suficiente para determinar o contexto da expresin e precisan dun
procesamento mis especfico (lias 1040-1055). Estes casos son os seguintes:
bZ O algoritmo nicamente comproba as instruccins etiquetadas
case e default. A utilizacin de etiquetas de salto
non habitual e o seu uso non soportado nesta primeira versin do compilador.
63 Ntese que no caso de non atopar nengn delimitador isto indicaria que a expresin est contida na primeira das
instruccins do cdigo.
248
Distincin entre unha expresin que unha instruccin por si propia e unha instruccin for
Cando o delimitador da instruccin previa atopado `;' e non hai ningunha palabra C++
reservada entre a posicin do delimitador^ e a da expresin con eventos, poden darse dous
casos diferentes: que a expresin con eventos estea includa na parte condicional dunha
instruccin for, ou nunha expresin que por si propia constite unha instruccin. Os seguintes
exemplos mostran as diferentes posibilidades:
1060./* caso 1: a expreain fai parte dun for */
1061.// l.a: ondicin do for (tipo = FOR2)
1062.for(<for_initial_expression>;[delim^os]
1063.
[st_begin]<condition_with_complex_event_expression>;
1064.
<expression>)
1065. <statement>;
1066.
1069.
<condition>;[delim^os]
( tipo = FOR3)
[st_begin]<expression_with_complex_event_expression>)
1070.
1071.
<statement>;
1072.
1075.[st_begin]<statement_with_complex_event_expression>;
1077.
<statement>;[delim^os]
1078.[st_begin]while(<condition_with_complex_event_expression>)
1079.
<statement>;
1080.
do
1082.
<statement>;[delim^oos]
1083.
1084.[st_begin]while(<condition_with_complex_event_expression>);
O algoritmo distingue entre ambas e no caso de tratarse dunha instruccin do while corrixe o
valor de inicio da instruccin e o do tipo de contexto, que pasar a ser DOWHILE. A
determinacin do inicio da instruccin do while require buscar a palabra reservada do que se
corresponda co while atopado e que apareza no cdigo nunha posicin anterior sa, tendo en
conta que as instruccins do while poden aniarse entre si e con outras instruccins while, tal e
como mostra o exemplo seguinte:
249
1085.
do // iaicio da instruccin do while
while(<condition>)
1066.
1067.
do
1088.
1089.
if (<condition>)
1090.
do
1091.
do
.
1092.
while(<condition>); // while cuaha inatruccin baleira
1093.
while(<condition>);
1094.
while(<condition>);
1095.
else
1096.
do ; // do while cunha instruccin baleira
1097.
while(<condition>);
1098.
}
1099.
while (<condition>) ; [delim^os]
1100.[st_begin]while(<condition_with_complex_event_expression>);
<statement>; [delim^os]
1102.
1103.[st_begin]if (<condition_with_complex_event_expression>)[cond_end]
<statement>;
1104.
1101./*
1105.
1106./* caso 2: a expreain parte da primeira instruccin */
1107.
<statement>;[delim^os]
1108.[st_begin]if (<condition>)[cond_end]
<statement_with_complex_event_expression>;
1109.
Cando a expresin est includa na condicin dunha instruccin if, hai que determinar se
o ifinicial ou parte dunha pla else if. O seguinte cdigo mostra un exemplo:
1111.[begin]if (<condition_with_complex_event_expression>)
<statement_seq>
1112.
250
1114.[begin]if (<condition>)
<statement_seq>
1115.
1116.
1117.
else if (<condition_with_complex_event_expression>)
<statement_seq>
Polo tanto a localizacin do inicio da instruccin require buscar a palabra reservada if que
non vaia antecedida dun else e que se corresponda co else if no que est a expresin. D
mesmo xeito que aconteca nas instruccins do while explicadas anteriormente o algoritmo
ten en conta que as instruccins if poden aniarse entre si e con outras instruccins, tal e
como mostra o exemplo seguinte:
1118.[begin]if (<condition>) // inicio da iastruccia if
1119.
if (<condition>)
1120.
1121.
if (<condition>)
<statement_seq>
1122.
1123.
1124.
1125.
1126.
1127.
1128.
1129.
else
<statement_seq>
else
<statement_seq>
else if (<condition>)
if (<condition>)
<statement_seq>
else
1130.
1131.
1132.
<statement seq>
else if(<condition_with_complex_event_expression>)
<statement_seq>
'
2. A localizacin do final do cdigo dunha instruccin pode implicar unha busca recursiva
cndo este est formado por mltiples instruccins aniadas unhas dentro doutras. O
seguinte cdigo mostra un exemplo:
1133.while (<condition_with_complex_event_expression>)
if (<condition>)
1134.
<statement_seq>
1135.
1136.
else
for (<initial_for_expr>;<condition>;<expression>)
1137.
<statement>;[cend]
1138.
251
1140. {
1141.
void operator()(const string& input, ASTBase **ast);
1142. };
Os detalles do cdigo que executa as aplicacins auxiliares xeradas polo PCCTS para
realizar a anlise sintctica das expresins son ocultados na implementacin do operador
operatorQ. Este mtodo recibe o cdigo da expresin a analizar -no parmetro input- e
devolve a AST da expresin -no parmetro ast-. Os seguintes exemplos mostran as ASTs
xeradas para algunhas expresins:
^ Coa excepcin dos temporizadores que son substituidos previamente na fase TimerPreprocessor, o que pen^nite
restrinxir o seu uso nicamente s condicins de transicin.
252
1145.
1146.
1147.
1148.
1149.
1150.
^^
3+c > 5
&& lfun(ob->sys.dat[i++]))
( - )
&& - a
&&
1151.
1152 . I
^
^
1153 . !
1154 . ^
( - )
I
1155. ( - fun
1156. ^
1157. [ - ++ - i
^^
^
1158 . ^
1159. . - dat
1160. ^
1161. -> - ob - sys
1162.
1163.
^)
( - )
^^ - b
^
^
> - a
> - 5
I
^
+ - 3 - c + - b - 3
T(SOO+class::attrib
1164 . ^
1165. ^
1166.
( - )
1167. ^
1168. ^^
1169. ^
1170.
>
1171. ^
+ - 500 - class::attrib
1172.
1173.
1174.
1175.
( - )
^
? - 12 - . - ( - )
^
^
* - 26 - b
( - )
^
1176.
1177.
1178.
1179.
1180.
1181.
1182.
1183.
1184.
1185.
1186.
1187.
1188.
^^
I
> - c
( - )
^
* -d-3
( - )
^^
-c
> - b
^
/ -d-3
1190 . {
1191.
astdata_seq& expressions, unsigned& init_number);
1192.
1193 . ^ ;
253
1195.T(a && ^(b ^^ 3+c > 5 ^^ T(a > b+3)) && !fun(ob->sys.dat[i++]))
1196.
1197./* Resultado */
1199.
1200./*
Subexpresins substitudas */
1203.sfcpp_expr_3 = fun(ob->sys.dat[i++))
1206.
1207./* Resultado */
1208.'(sfcpp_expr_1 ^^ ^c)
1209.
1212.
1214.sfcpp_expr_2
1215.sfcpp_expr_3
1216.sfcpp_expr_4
1217.sfcpp_expr_5
=
=
=
=
T(sfcpp_expr_3 ^^ sfcpp_expr_4)
c > d*3
^(c ^^ sfcpp_expr_5)
d/3 > b
No caso da primeira expresin (lia 1195) o analizador detecta tres subexpresins numricas
(non booleanas), que substite por varibeis booleanas auxiliares (coa sintaxe sfcpp_expr_id).
A segunda das expresins (lia 1205) contn unha nica subexpresin numrica que
substituda polo analizador. Esta subexpresin sfcpp_expr_I- contn sa vez unha
expresin con eventos complexa (a condicin do operador `?:'), polo que o proceso de
reduccin aplicado recursivamente, e esta subexpresin substituda pola varibel
sfcpp_expr 2. O proceso continua aplicndose recursivamente s subexpresins numricas e
con eventos contidas en sfcpp_expr_2 ata que non queda ningunha sen substitur.
Simplificacin da expresin
Unha vez reducida a expresin orixinal para que contea unicamente subexpresins
booleanas, a simplificacin da expresin faise utilizando a aplicacin externa Sidoni [ 146],
dacordo ao explicado en (6.3.3.1). Esta aplicacin utiliza as regras do lxebra de Boole
estendidas co soporte utilizacin de eventos para simplificar expresins lxicas. O acceso a
esta aplicacin faise mediante a clase auxiliar SidoniWrapper, que se encarga de converter unha
expresin booleana C++ ao formato utilizado por Sidoni, executar a aplicacin -utilizando a
tcnica explicada en (6.1.3^ e converter o resultado de novo sintaxe do C++. A Tboa 6-II
mostra a correspondencia entre as caractersticas soportadas por Sidoni e o equivalente C++
estendido cos operadores de evento e temporizacin.
254
AND = .
AND = &&
OR=+
OR=II
NOT = /
NOT = !
' e^
Constantes numricas
=0
=1
Varibeis
id = varibel de proceso
sfcpp_timer_id = temporizador
sfcpp_expr_id = varibel auxiliar
id = varibel de proceso, do modelo
ou identificador de accin
O exemplos seguintes mostran o resultado da simplificacin das expresins das lias 1143 e
1162, representadas no formato Sidoni e na sintaxe C++ (ntese que no caso da expresin da
lia 1162, tamn son simplificadas as subexpresins con eventos complexas aniadas):
1218./* Exemplo 1: Expresin orixinal */
1219.T(a && ^(b ^^ 3+c > 5 ^^ T(a > b+3)) && !fun(ob->sys.dat[i++]))
1220.
1226.
(<sfcpp_expr_3 . /b . a . /sfcpp_expr_3)
1230.
1231.// Sintaxe C++
1233.
1236.
1239.T(sfcpp_expr_1 ^^ ^c)
1241.>(sfcpp_expr_1 + <c)
1242.
1248.
// sfcpp_expr_2
1251.T(sfcpp_expr_3 ^^ sfcpp_expr_4)
// sfcpp_expr_4
1252.^(c ^^ sfcpp_expr_5)
255
1254.>(sfcpp_expr_3 + sfcpp_expr_4)
// afcpp_expr_2
1255.<(c + sfcpp_expr_5)
// sfcpp_expr_4
1258.(/sfcpp_expr_4 . >sfcpp_expr_3) +
//
1259.
(>sfcpp_expr_4 . /sfcpp_expr_3)
*/
sfcpp_expr_2
sfcpp_expr_4
sfcpp_expr_2
afcpp_expr_4
Hai un aspecto adicional a considerar na utilizacin de Sidoni. Esta aplicacin ten en conta
automaticamente as seguintes hipteses do modelo Grafcet ( 3.3.2.1):
1.
Non posbel a ocorrencia simultnea de dous eventos externos non relacionados (Ta and
T b = 0).
2.
Non posbel a ocorrencia simultnea dun evento externo e un interno (Ta and TX, = 0).
1266.if (<condition_with_complex_event_expression>)
1267. <statement>;
1269.switch
(<condition_with_complex_event_expression>)
1270. {
1271.
case <value_1>: <statements> break;
1272.
case <value_n>: <statements> break;
1273.
1274. }
256
1276.[declaracin + iniciacin]
1277.for(<expression_with_complex_event_expression>;
1278.
<condition>;
1279.
1280.
1281.
<expression>)
<statement>;
1282.// FOR2
1283.[declaracin + iniciacin]
1284.for(<expression>;
1285.
<condition_with_complex_event_expression>;
1286.
<expression>)
1287. {
1288.
<statements>
1289.
[actualizacn]
1290. }
1291.
1292.// FOR3
1293.[declaracin]
1294.for(<expression>;
<condition>;
1295.
<expression_with_complex_event_expression>)
1296.
1297. {
1298.
<statements>
1299.
[actualizacin]
1300. }
1302. do
1303. {
1304. <statements>
[actualizacin]
1305.
1306. }
1307.while (<condition_with_complex_event_expression>);
1309.while (<condition_with_complex_event_expression>)
1310 . {
<statements>
1311.
1312.
[actualizacin]
1313 . }
1315.return (<condition_with_complex_event_expression>);
1317.<expression_statement_with_complex_event_expression>;
Os seguintes exemplos mostran o cdigo xerado para a substitucin das expresins das lias
1143 e 1162 cando son utilizadas en contextos tipo FOR2 e DOWHILE, respectivamente:
257
1320.
1321.
( FOR2) */
T(a && ^(b II 3+c > 5 II T(a > b+3)) && !fun(ob->sys.dat[i++]));
<expression>)
1322 . {
1323.
<statements>
1324. }
1325.
1326./* Cdigo modificado */
1331.for(<expression>;
1332.
(^b && !sfcpp_expr_1 && a && !sfcpp_expr_3) II
1333.
(^sfcpp_expr_3 && !b && a && !sfcpp_expr_3);
1334.
<expression>)
1335 . {
<statements>
1336.
1337.
// actualizacin varibeis auxiliares
1338.
sfcpp_expr_1 = (bool) (3+c > 5);
1339.
1340.
sfcpp_expr_3 = (bool) (fun(ob->sys.dat[i++]));
1341 . }
Ntese que a pesares de que a subexpresin numrica substituda coa varibel auxiliar
sfcpp_expr_2 non utilizada na expresin orixinal simplificada (lia 1332) ao ser eliminada
durante a simplificacin da expresin, si declarada (lia 1329) e o seu valor actualizado (lia
1339) introducindo no cdigo clculos innecesarios. Este un aspecto a corrixir en futuras
versins do compilador.
1342./* Cdigo orixinal (DOWILE) */
1343 . do
1344 . {
1345.
1346. }
<statements>
1348.
1351.boo1 sfcpp_expr_1;
1352.boo1
1353.boo1
1354.boo1
1355.boo1
1356.do
sfcpp_expr_2;
sfcpp_expr_3;
sfcpp_expr_4;
sfcpp_expr_5;
1357. {
<statements>
1358.
1359.
/ / actualizacia varibeis auxiliaree
1360.
sfcpp_expr_4 = (bool) ((^c && !sfcpp_expr_5) I) (^sfcpp_expr_5 && !c));
1361.
sfcpp_expr_3 = (bool) (c > d*3);
1362.
sfcpp_expr_2 = (bool) ((!sfcpp_expr_4 && Tsfcpp_expr_3) II
1363.
(Tsfcpp_expr_4 && !sfcpp_expr_3));
1364.
sfcpp_expr_1 = (bool) (SOO+class::attrib>((sfcpp_expr_2)?12:(26*b)));
1365.
1366. }
258
caso da varibel sfcpp_expr 3 (lia 1330), no primeiro dos exemplos anteriores, e das varibeis
sfcpp_expr 1 (lia 1351), sfcpp_expr_3 (lia 1353), sfcpp_expr_4 (lia 1354) e sfcpp_expr S
(lia 1355), no segundo.
A deteccin destes eventos realzase na fase VarlnfoHarvester, e a insercin do cdigo
adicional, dacordo tcnica explicada en (6.3.3), na fase EventVarTranslator. O resultado
destas modificacins nos exemplos anteriores sera o seguinte:
1368./* Cdigo final ( FOR2) */
1372.
1376.
1380. {
1381. sfcpp_expr_3_up = (sfcpp_expr_3_last) ? false : true;
1384. }
1385.for(<expression>;
<expression>)
1386.
1387.
1388.
1389. {
1390.
<statements>
1391.
1392.
1393.
1394.
1395.
1396.
1397.
1398.
1399.
1400.
if (sfcpp_expr_3 != sfcpp_expr_3_last)
sfcpp_expr_3_last = sfcpp_expr_3;
1401.
1402. }
( DOWHILB) */
1413.
1415.boo1 sfcpp_expr_1;
1416.boo1
1417.boo1
1418.boo1
1419.boo1
1420. do
1421 . {
1422.
sfcpp_expr_2;
sfcpp_expr_3;
sfcpp_expr_4;
sfcpp_expr_5;
<statements>
259
1423.
1424.
1425.
if (sfcpp_expr_5 != sfcpp_expr_5_last)
1426.
1427.
1428.
1429.
1430.
1431.
1432.
1433.
1434.
1435.
1436.
1437.
1438.
1439.
1440.
1441.
1442.
sfcpp_expr_5_last = sfcpp_expr_5;
if (sfcpp_expr_4 != sfcpp_expr_4_last)
sfcpp_expr_4_last = sfcpp_expr_4;
if (sfcpp_expr_3 != sfcpp_expr_3_last)
1443.
1444.
1445.
1446.
1447.
1448.
1449.
1450.
1451.
1452.
sfcpp_expr_3_last = sfcpp_expr_3;
if (sfcpp_expr_1 != sfcpp_expr_1_last)
1453.
1454.
1455.
1456.
1457.
1458. }
sfcpp_expr_1_last = sfcpp_expr_1;
Varibeis do modelo.
Para cada unha das varibeis identificadas obtense a informacin seguinte, que ser utilizada
para determinar o tipo de substitucin a realizar:
Nome da varibel.
260
Utilizacin dos operadores de evento con varibeis booleanas cuxo valor non poda ser
consultado, p.e. as sadas do proceso.
Utilizacin de varibeis cuxo valor non poda ser consultado cando o cdigo compilado
corresponda a unha condicin de transicin, condicin dunha asociacin de accin ou
condicin dun temporizador.
261
(Figura 6.1), un que contn as declaracins das funcins da DLL (de extensin . h) e outro as
implementacins das funcins (de extensin .cpp). O cdigo C++ xerado para o arquivo que
contn as declaracins da DLL o seguinte:
1460.// defiaicias auxiliarea
1463.extern "C"
1464 . {
1465.
DLL_API bool onLoad(void);
1466.
1467.
DLL_API void onUnload(void);
1468.
1469.
1470.
1471.
1472.
1473.
// para
DLL_API
// para
DLL_API
1474.
1475.
1476.
1477 . }
cada
bool
cada
bool
cond_nnn(RunningPOlicy& env);
timer_nnn(RunningPOlicy& env);
As funcins onLoad (lia 1466), onUnload (lia 1467) e getModules (lia 1468) declaran a
interface comn a todas as DLLs utilizadas coa mquina viriual (7.1.1.5), e son utilizadas para
a carga e descarga dinmica de mdulos executbeis. Ademais inclense as seguintes
declaracins:
1. Unha funcin por cada accin do modelo (lia 1470). O identificador de cada unha destas
funcins igual ao nome da accin no modelo.
2. Unha funcin por cada condicin de asociacin de accin do modelo (lia 1472). O
identificador de cada funcin ten a sintaxe: action_name_nnn, sendo action_name o nome
da asociacin (que pode ser o dunha varibel do modelo, varibel de proceso ou accin) e
nnn o identificador numrico asignado asociacin polo compilador.
3. Unha funcin por cada receptividade do modelo (lia 1474). O identificador de cada
funcin ten a sintaxe: cond_nnn, sendo nnn o identificador numrico asignado
receptividade polo compilador (6.5.1.2.2).
4. Unha funcin por cada temporizador utilizado nas receptividades do modelo e mis por
cada un dos definidos automaticamente polo compilador (6.5.1.2.1) para a temporizacin
das accins retardadas e limitadas (lia 1476). O identificador de cada funcin ten a
sintaxe: timer_nnn, sendo nnn o identificador numrico asignado ao temporizador polo
compilador (6.5.1.2.2).
Estas funcins reciben como nico parmetro unha instancia da clase RunningPolicy (8.6)
que implementa a interface IVMachineAccess (6.3.2) que proporciona acceso aos valores de
varibeis e temporizadores almacenados na mquina virtual durante a execucin dos modelos.
As funcins que representan condicins lxicas devolven ademais un valor booleano, que o
resultado da avaliacin da condicin utilizando os valores que varibeis, eventos e
temporizadores tean no momento da chamada funcin.
En canto ao arquivo que contn a implementacin da DLL, o cdigo xerado o seguinte:
1478.//
arquivos de definicins
1480.#include
1481.#include
"DLLname.h"
"project.h"
// definicias da DLL
// definicias do proxecto
262
1483.deque<module^ointer> modules;
1484.
1486.// onLoad
1488. {
1489.
// crear iaformacin para a execucin do modelo
1490.
1492. GESCA_TRY
1493. {
1494.
RTStaticModel& rtstaticmodel = rtmodel->getStaticModel();
1495.
rtstaticmodel.setKey("model_id"); / / almacenar identificador do modelo
1496.
1497.
1498.
1499.
(ElementAccess) var_access,
(ElementScope) var_scope);
rtstaticmodel.getDecls().insert(var);
1500.
1501.
1502.
1503.
1504.
1505.
1506.
1507.
1508.
1509.
1510.
1511.
RTPGInfo* pg = NULL;
if (!pg) GESCA_THROW_BAD_ALLOC
pg->steps.insert(step_id);
// unha lia para cada etapa
rtstaticmodel.addPG(pg);
1512.
1513.
1514.
1515.
1516.
1517.
1518.
if (!node) GESCA_THROW_BAD_ALLOC
node->before.insert(node id);
// unha lia por cada sucesor
node->after.insert(node_id);
1519.
1520.
1521.
rtstaticmodel.addNode(node);
1522.
1523.
1524.
1525.
1526.
1527.
1528.
1529.
if (!tinfo) GESCA_THROW_BAD_ALLOC
rtstaticmodel.addReceptivity(tinfo);
rtmodel->addCondition("cond_rec_id",
cond_rec_id);
// referencia ao cdigo
1530.
1531.
1532.
1533.
1534.
1535.
(TimeScale) assoc_tscale,
1536.
1537.
1538.
1539.
1540.
(RTActionType) assoc_rttype);
if (!ainfo) GESCA_THROW_SAD_ALLOC
rtstaticmodel.addAction(ainfo);
rtmodel->addCondition("assoc name_nnn",
1541.
1542.
assoc_name_nnn); //
referencia ao cdigo
1543.
1544.
1545.
1546.
263
1547.
1548.
1549.
1550.
rtstaticmodel.getDecls().insert(var);
1551.
1552.
1553.
1554.
1555.
1556.
1557.
1558.
1559.
1560.
1561.
1562.
/ / xerarqua de forzado
RTSituation level;
rtstaticmodel.initFOLevels(num_folevels);
// para cada nivel da xerarqua
1563.
1564.
1565.
1566.
level.clear();
.,
1567.
1568.
1569.
1570.
1571.
1572.
1573.
rtstaticmodel.getDecls().insert(var);
1574.
1575.
1576.
1577.
1578.
1579.
1580.
modules.push_back(rtmodel);
1581.
1582. }
GESCA_CATCH_ALL
1583.
1584. {
1585.
delete rtmodel;
return true;
1586.
1587. }
1589. }
1590.
1591.// onIInload
1593. {
1594.
1595.
module != modules.end();
1596.
1597.
1598.
1599. }
++module)
delete *module;
modules.clear();
1600.
1601.// getModules
1603 . {
1604.
return modules;
1605 . }
264
1609. {
// cdigo da accin
1610.
1611 . }
1612.
1618.
1622.
// cdigo
1623. }
condicin de asociacia
action_name_nnn(RunningPolicy& env)
"
da condicin de asociacia
condicin de tranaicin
cond_nnn(RunningPolicy& env)
da condicin de tranaicia
1624.
1627. {
1628.
1629. }
265
6. Nas lias 1514-1519 insrese, para cada nodo do modelo, o cdigo para crear unha
instancia da clase RTNodelnfo (Figura 6.8) utilizando a informacin recopilada polo
compilador: identificador numrico e alfanumrico da etapa, e identificador numrico do
grafcet parcial que contn a etapa; para engadirlle a informacin dos nodos que o suceden e
que o preceden na secuencia de control ( unha lia de cdigo por cada un); e para inserir a
informacin no modelo ( as etapas iniciais son inseridas no modelo utilizando un mtodo
diferente -addlnitialNode- ao utilizado para os demais nodos -addNode-).
7. Nas lias 1522-1528 insrese, para cada receptividade do modelo, o cdigo para crear unha
instancia da clase RTReceptivitylnfo (Figura 6.8) utilizando a informacin recopilada polo
compilador: identificador numrico da receptividade, nome da funcin que contn o cdigo
da receptividade e indicador booleano de se a receptividade est asociada a unha transicin
fonte; para engadirlle a informacin das varibeis utilizadas no cdigo da receptividade
(unha lia de cdigo por cada unha); e para inserir a informacin no modelo (insrese a
instancia da clase RTReceptivitylnfo e a informacin que permite obter un apuntador
funcin que contn o cdigo da receptividade dado o seu nome).
8. Nas lias 1531-1541 insrese, para cada asociacin de accin do modelo, o cdigo para
crear unha instancia da clase RTActionlnfo (Figura 6.8) utilizando a informacin recopilada
polo compilador: identificador numrico da asociacin, identificador numrico da etapa
que est asociada, nome da varibel booleana modificada pola asociacin, cualificador da
asociacin, nome da varibel utilizada como indicador, valores de retardo e lmite en
asociacins temporizadas, nome da funcin que contn o cdigo da condicin da
asociacin, indicador de se a asociacin pode ser aplicada en situacins inestbeis e valor
do tipo interno de asociacin asignado polo compilador; para engadirlle a informacin das
varibeis utilizadas no cdigo da condicin da asociacin (unha lia de cdigo por cada
unha); e para inserir a informacin no modelo (insrese a instancia da clase RTActionlnfo e
a informacin que permite obter un apuntador funcin que contn o cdigo da condicin
da asociacin dado o seu nome).
9. Nas lias 1544-1549 insrese, para cada accin do modelo, o cdigo para crear unha
varibel booleana co nome da accin que almacenar o seu valor de activacin e para
inserir a informacin no modelo (insrese a declaracin da varibel e a informacin que
permite obter un apuntador funcin que contn o cdigo da accin dado o seu nome).
10. Nas lias 1552-1557 insrese, para cada orde de forzado do modelo, o cdigo para crear
unha instancia da clase RTFOlnfo (Figura 6.8) utilizando a informacin recopilada polo
compilador: identificador numrico do grafcet parcial que contn a etapa que est
asociada a orde de forzado, identificador numrico desta etapa, identificador numrico do
grafcet parcial forzado e identificadores numricos das etapas forzadas (unha lia de
cdigo por cada etapa forzada); e para inserir a informacin no modelo.
11. Nas lias 1560-1565 insrese o cdigo para iniciar o nmero de niveis da xerarqua de
forzado do modelo. Ademais, para cada nivel, insrese o cdigo para engadir o
identificador numrico das etapas pertencentes ao nivel que teen ordes de forzado
asociadas (unha lia de cdigo por cada etapa) e para inserir a informacin no modelo.
12. Nas lias 1568-1578 insrese, para cada temporizador do modelo, o cdigo para crear unha
varibel booleana de nome sfcpp_timer_nnn (nnn = identificador numrico do
temporizador) que almacenar o seu valor, para crear unha instancia da clase RTTimerlnfo
(Figura 6.8) utilizando a informacin recopilada polo compilador: identificador numrico
do temporizador, nome da funcin que contn o cdigo da condicin do temporizador,
valores de retardo e lmite; para engadirlle a informacin das varibeis utilizadas no cdigo
266
da condicin do temporizador (unha lia de cdigo por cada unha) e para inserir a
informacin no modelo (insrese a instancia da clase RTTimerlnfo, a declaracin da
varibel e a informacin que permite obter un apuntador funcin que contn o cdigo da
condicin do temporizador dado o seu nome).
13. Na lia 1581 insrese a informacin do modelo na cola de mdulos.
No caso de que algunha das operacins anteriores provoque un erro durante a execucin,
lanzase unha excepcin que capturada nas lias 1583-1587, onde se libera a memoria
utilizada ate o momento e sese da funcin onLoad devolvendo un valor de erro (true).
6.5.1.10. Compilacin da DLL ("SFCCPPCompiler")
Nesta fase realzase a compilacin e enlazado do cdigo fonte da DLL xerado nas fases
previas. Esta fase unha clase "wrapper" que capsula o acceso a un compilador externo
utilizando a tcnica explicada en (6.1.3). Esta clase presupn a existencia dun arquivo
denominado compile.bat que estar almacenado no subdirectorio do directorio compilers
indicado nas opcins de configuracin (6.1.1).
6.6. Conclusins
Neste captulo tratronse os aspectos relacionados coa compilacin dos modelos Grafcet
para obter unha DLL que permita cargalos dinamicamente e executalos na mquina virtual que
implementa o intrprete de modelos Grafcet. Describiuse o formato utilizado para representar
os modelos de forma optimizada para a sa execucin. Analizronse os aspectos a considerar
cando se utiliza unha linguaxe de alto nivel como o C++, estendida cos operadores Grafcet de
evento e temporizacin, na especificacin das accins e receptividades do modelo. Fxose
fincap nas modificacins realizadas na gramtica da linguaxe para inclur os novos operadores
e nas substitucins que preciso realizar no cdigo de accins e receptividades para poder
compilalas cun compilador C++ externo.
No referente implementacin do compilador Grafcet, describiuse a sa arquitectura lxica,
composta' por unha estructura de fases que acceden durante a compilacin informacin
interna almacenada nun nico punto accesbel a todas as fases. Esta arquitectura permite a
modificacin da estructura de fases ou a reimplementacin dunha fase concreta sen que iso
afecte ao resto nin a estructura do compilador. Nesta primeira versin do compilador a
implementacin das fases presupn que a linguaxe de programacin utilizada o C++, sen
embargo partindo da estructura deseada, fcil en futuras versins engadir novas
implementacins das fases que permitan utilizar linguaxes de alto nivel diferentes. Tamn se
describiu a tcnica que permite utilizar aplicacins externas, como un compilador C++ por
exemplo, sen que sexa necesario modificar o compilador Grafcet se se cambia de aplicacin.
En canto s melloras a realizar, resmense aqu algunhas das xa comentadas nos contidos do
captulo:
1. Eliminar a restriccin de que as expresins con eventos complexas tean que ir entre
parnteses (6.3.1.1).
2. Reducir as restriccins impostas nas expresins que poden utilizarse cos operadores de
evento e temporizacin (6.3.1.2).
3. Permitir a utilizacin de temporizadores no cdigo das accins (6.5.1.5.2).
4. Optimizar a substitucin das subexpresins numricas ao simplificar expresins con
eventos complexas (6.3.3.1). Na implementacin actual non se trata o caso no que como
267
5. Eliminar a restriccin de que o valor das sadas do proceso unicamente poda ser
modificado mediante o operador de asignacin simple (6.3.3.3).
>
Outras optimizacins, que reduciran o tempo necesario para compilar un modelo, son as
seguintes:
1. Substitur a fase que chama aplicacin externa Sidoni por outra que implemente
directamente a simplificacin de expresins booleanas. Isto eliminara o tempo necesario
para executar a aplicacin externa cada vez que hai que simplificar unha expresin.
2. Desear unha tcnica que permita preprocesar todo o cdigo do modelo nunha nica
chamada ao preprocesador. Na implementacin actual o preprocesador executado unha
vez por cada accin, condicin de transicin, condicin de asociacin e condicin de
temporizacin do modelo, co consumo de tempo que isto implica.
269
270
Mquina virtual
Sistema Operativo
O resto deste apartado estructrase do xeito seguinte: os detalles dos dous mecanismos
bsicos (mdulos e procesos) utilizados no deseo e implementacin da mquina virtual
explcanse en (7.1.1) e(7.1.2), respectivamente; a arquitectura da mquina virtual descrbese
en (7.1.3); e a sa implementacin en (7.1.4).
271
mdulo, un que indica o seu tipo e outro que identifica univocamente ao mdulo entre os do
seu mesmo tipo. O cdigo da declaracin o seguinte:
1630.// Interface dun mdulo
1632 . {
1635. };
1636.
Ntese que os mdulos son derivados da clase ptrSeqElem, de xeito que poidan ser
almacenados en memoria utilizando a coleccin id2ptrSeq ( B.1).
7.1.1.2. Mdulos complexos: a interface IStructuredModule
A clase abstracta IStructuredModule declara a interface a implementar polos mdulos
complexos cuxa estructura se forma mediante a agregacin doutros mdulos que poden ser
substitudos dinamicamente durante a execucin da aplicacin. O cdigo da declaracin desta
interface o seguinte:
1642.struct IStructuredMOdule
1643 . {
1644.
// consulta i nformacia da estructura actual
1645.
1646.
1647.
1648.
1649.
1650.
1651.
1652.
1653.
1654.
1655
// almacn de configuracins
// activar/desactivar configuracia
};
= 0;
A interface declara mtodos para consultar a estructura actual do mdulo, asignar e obter
apuntadores tanto ao almacn de mdulos (7.1.1.3) como ao de configuracins (7.1.1.4)
utilizados polo mdulo, e activar e desactivar a configuracin actual do mdulo. A clase
StructuredModule (Figura 7.2) proporciona a implementacin por defecto dos mtodos
getModuleStore (lia 1647), setModuleStore (lia 1648), getConfigurationStore (lia 1650), e
setConfigurationStore (lia 1651). Os outros mtodos sern redefinidos nas clases derivadas
desta interface.
A informacin dos tipos e nomes dos mdulos que forman a estructura dun mdulo
complexo denomnase configuracin. Cada mdulo omplexo pode adoptar diferentes
configuracins, anda que en cada instante s unha estea activa. As configuracins son
representadas mediante a clase ModuleConfiguration (Figura 7.2) e conteen a informacin
necesaria para que os mdulos complexos podan organizar dinamicamente a sa estructura
interna. Cada configuracin contn, por cada tipo de mdulo utilizado, unha instancia da clase
Configurationltem na que se almacena o nome do tipo de mdulo, a cantidade de mdulos dese
272
tipo utilizados9 e, no caso de especificarse unha cantidade fixa, os nomes dos mdulos
utilizados. Os detalles dos cambios de configuracin son implementados nos mtodos
activateCurrentConf (lia 1653) e deactivateCurrentConf (lia 1654) nas clases derivadas.
ptrSeqElem
(from euic El^m^nt^
I
ModuleCategory
name : string
modules
IModule
IStmcturedModule
StructuredModule
config sto
IConfigurationStore
module store
t
IModuleStore
1
Confi urationStore configurations
current_conf : string
ModuleConfiguration
, conf name : string
categories
ModuleRepository I
repasitory
MaduleStore
IStruct uredStoreModule
Configurationltem
id : siring
size : int
Figura 7.2. Diagrama das clases que definen os mdulos e as sas funcionalidades.
A consulta sobre a estructura actual dun mdulo complexo realzase mediante o mtodo
getStructurelnfo (lia 1645). A implementacin deste mtodo recursiva e devolve para cada
mdulo complexo agregado un rexistro contendo o nome e tipo do mdulo, o nome do almacn
de mdulos que utiliza (7.1.1.3) e os nomes dos mdulos agregados que compoen a sa
estructura. O cdigo seguinte mostra a declaracin destes rexistros:
1656.struct VMModuleInfo
1657 . {
1658.
string name;
1659.
string type;
1660.
string store;
//
//
//
//
tipo
1664.struct IModuleStore
1665. {
1666.
// categoras
1667.
1668.
69 Na implementacin actual aceptanse duas posibilidades, ou unha cantidade fixa ou unha cantidade non
especificada (o..N mdulos).
273
1669.
1670.
1671.
1672.
1673.
1674.
1675.
1676.
1677.
1678.
1679.
1680.
1681.
1682.
1683 . } ;
// mduloa
Como pode verse a interface declara mtodos para crear, consultar e eliminar categoras
(lias 1667-1672) e para engadir, eliminar e recuperar os mdulos almacenados nas categoras
existentes (lias 1674-1682). A clase ModuleStore (Figura 7.2) proporciona a implementacin
por defecto desta interface utilizando un almacn de mdulos, representado pola clase
ModuleRepository, que pode conter varias categoras, representadas mediante a clase
ModuleCategory. Cada categora almacena un conxunto de mdulos do mesmo tipo. O nome
da categoria coincidir co do tipo de mdulos que almacene.
7.1.1.4. Almacns de configuracins: a interface IConggurafionSfore
A clase abstracta IConfigurationStore declara a interface para a xestin do almacenamento
de mltiples configuracins en memoria. O cdigo da sa declaracin o seguinte:
1684.struct IConfigurationStore
1685. {
1686.
// iniciacin das configuracina
1687.
virtual void initConfigurations() = 0;
1688.
1689.
// eagadir, eliminar e modificar coafiguracina
1690.
virtual bool removeConfiguration(const string& id) = 0;
1691.
virtual bool updateConfiguration(const string& id,
1692.
const ModuleConfiguration& c) = 0;
1693.
1694.
// coasulta de configuracias
1695.
virtual bool isValidConfiguration(const ModuleConfiguration& c) const = 0;
1696.
getConfiguration(const string& name) const = 0;
1697.
1698.
virtual void getConfigurationNames(deque<string>& names) const = 0;
// configuracin actual
1699.
virtual const string& getCurrentConf() const = 0;
1700.
virtual bool setCurrentConf(const string& id ="NONE") = 0;
1701.
1702 . } ;
Como pode verse esta interface proporciona mtodos para a iniciacin (lias 1687-1688),
consulta (lias 1695-1698), insercin (lia 1690) e eliminacin (lia 1691) de configuracins,
as como para consultar (lia 1700) e seleccionar (lia 1701) a configuracin actual. A clase
ConfigurationStore (Figura 7.2) proporciona a implementacin por defecto da maiora dos
mtodos desta interface -^xcepto initConfigurations (lia 1687), isValidConfiguration (lia
1695) e setDefaultConf (lia 1688^.
Ademais das interfaces e clases xa comentados tamn se definiu a interface
IStructuredStoreModule (Figura 7.2), derivada simultaneamente das catro interfaces explicadas
anteriormente: IModule, IStructuredModule, IModuleStore e IConfigurationStore, para ser
274
utilizada como base dos mdulos complexos que sexan utilizados simultaneamente como
^
almacns de mdulos e configuracins.
7.1.1.5. Carga e descarga dinmica de mdulos
Unha funcionalidade adicional proporcionada polos mdulos a posibilidade de cargalos e
descargalos dinamicamente en memoria mediante a utilizacin de DLLs, o que proporciona un
mecanismo simple para a extensin e modificacin das caractersticas dunha aplicacin en
tempo de execucin. Este mecanismo utilizado con frecuencia na implementacin da mquina
virtual, como por exemplo para o manexo dos "drivers" de E/S, dos modelos Grafcet ou das
polticas de evolucin. O cdigo seguinte mostra a interface pblica dunha DLL que
proporcione soporte carga e descarga dinmica de mdulos:
1703.#define DLL_API _declspec(dllexport)
1704.extern "C"
1705. {
1706.
1707.
1708.
1709. }
^
Esta interface est formada por tres funcins:
1. onLoad (lia 1706), funcin executada no momento de cargar a DLL en memoria na que se
inician os mdulos que sern posteriormente cargados na aplicacin.
2. onUnload (lia 1707), funcin executada no momento de descargar a DLL. Nela
implemntanse as operacins necesarias para liberar a memoria e recursos utilizados polos
mdulos.
3. getModules (lia 1708), funcin que permite acceder aos mdulos contidos na DLL.
O seguinte cdigo mostra unha implementacin tpica destas funcins:
1710.// coleccin de mdulos
1711.deque<module^ointer> modules;
1712.
1714 . {
1715.
Module* module_2 = NULL;
1716.
1717.
try
1718. {
1719.
// crear mdulos
1720.
1721.
1722.
1723.
if (!module_1) throw;
if (!module_2) throw;
1724.
// almacenar os mduloa na coleccia
modules.push_back(module_1);
1725.
modules.push_back(module_2);
1726.
1727. }
1728. catch(...)
1729.
1730.
// eliminar mdulos en caso de erro
1731.
if (module_2) delete module_2;
1732.
return false;
1733.
1734. }
1736. }
275
1738. {
1739.
for (deque<module^ointer>::iterator module = modules.begin();
1740.
module != modules.end();
^
++module)
delete *module;
modules.clear();
1741.
1742.
1743.
1744 . }
1745.
1747. {
1748.
return modules;
1749. }
A varibel global modules (lia 1711) unha cola na que se almacenarn os mdulos
contidos na DLL. Na implementacin da funcin onLoad (lias 1713-1736) cranse os
mdulos e almacnanse na cola modules (lias 1719-1726). En caso de detectarse algn erro
lnzase unha excepcin que procesada nas lias 1730-1733, eliminando a memoria ocupada
polos mdulos. Na funcin onUnload (lias 1737-1744), executada cando a DLL descargada
da memoria, elimnanse todos os mdulos almacenados en modules. Por ltimo, a funcin
getModules (lia 1746) devolve unha referencia coleccin de mdulos da DLL.
O acceso DLL dende unha aplicacin faise mediante unha instancia da clase DLLlnfo. Esta
clase oculta os detalles da carga e descarga de DLLs, ofrecendo unha interface independente do
sistema operativo utilizado. A sa declaracin a seguinte:
1750.class DLLInfo
1751 . {
1752.public:
// carga/descarga da DLL
1753.
1754.
1755.
1756.
1757.
1758,
1759.
-DLLInfo();
1760. };
O constructor (lia 1754) e o destructor (lia 1755) da clase son os que implementan
respectivamente a carga e descarga en memoria da DLL. O resto dos mtodos permiten o
acceso s funcins da interface pblica da DLL explicadas anteriormente.
7.1.1.6. Exemplo da utilizacin de mdulos
Neste apartado descrbese un exemplo de como son utilizadas as funcionalidades
proporcionadas polos mdulos para implementar unha aplicacin coa arquitectura flexbel da
Figura 7.3.a. A arquitectura da aplicacin est formada por dous mdulos, un simple, que sirve
de almacn dos mdulos creados dinamicamente en memoria, e outro complexo cunha
estructura formada pola agregacin de dous mdulos, un complexo de tipo A e outro simple de
tipo B. O mdulo complexo de tipo A ten sa vez unha estructura formada pola agregacin
dun mdulo simple de tipo C. A Figura 7.3.b mostra as configuracins vlidas que son
aceptadas na arquitectura indicada, e o diagrama de obxectos da Figura 7.3.c a sa
implementacin utilizando as clases explicadas anteriormente. Ntese que o mdulo store
utilizado como almacn das configuracins vlidas do mdulo main e este, sa vez, como
almacn das configuracins vlidas dos mdulos tipo A. Os diagramas de obxectos das
configuracins vlidas da arquitectura son mostrados na Figura 7.3.d.
276
MAIN
TYPE A
TYPE_B
STORE
ttPE C
(e)
MAIN
A
MAIN
C1
B,
MAIN
81
MAIN
A
C2
B2
C2
(b)
CoMaurationltem
:COnficurationltem
name ='TYPE_C'
aize = 1
name='TYPE_C'
aiZe = 1
mod_namea = {'MODULE_C1y
mod_names = ('MODULE_C2^
Itema
kema
^ModuleConfiauration
^ModuleConfiauration
Module
name='MODULE_C2'
rype ='TYPE_C'
:MOdule
:Module
ComdexModule
name ='MODULE_A'
lyPe ='TYPE_A'
configurations
:MainModule
configuration_atore
name ='MODULE B
rype ='TYPE_B' modules
modules
ModuleCateaorv
:ModuleCeteaorv
modulea
:ModulaCateaorv
name ='TYPE_B'
name='ttPE C'
name ='TYPEf'
type ='MAIN'
modute atore
module atore
atore:Store
eonfiguratione
categoriea
^
^ModuleConfiauration
ModuleConfiauretion
na e ='CONF B'
name='CONF A'
kema
Itema
^Canfiourationltem
nama ='TYPE_A'
size = 1
mod_names = {MODULE_Ay
;onfiaurauonltem
:Confiaurafionltem
name ='TYPE_A'
size = 1
mod_namea = {MODULE_A}
Confiaurationltem
name ='TYPE_B'
aize = 1
name ='TYPE_B
ai28 = 7
mod_names = {'MODULE_Bt^
mod namea={MODULE_82
(c)
MainModu
^MainModule
module a
name ='MAIN'
bPe 'MAiN'
module_a
module_b
:ComdexModule
:MOdule
name='MODULE A'
rype ='TYPE_A' -
name ='MAIN'
type ='MAIN'
ComdexModule
module_c
Mcdulfl
;Module
neme ='MODULE_C1'
rype ='TYPE_C'
name='MODULE C1
rype ='TYPE_C'
:MainModule
module a
:Module
name='MODULE A
lype ='TYPE_A' -
module e
module_b
name ='MAIN'
type ='MAIN'
:MainModule
module b
:ComdexModule
:Module
modde e
name ='MAIN'
bPe''MAiN'
:ComdexModule
name='MODULE A'
rype ='TYPE_A' -
module_c
module b
:MOdule
name='MODULE 82'
hpe ='TYPE_B
module_c
Module
:Module
name='MODULE C2'
rype ='TYPE_C'
(d)
Figura 7.3. Exemplo de utilizacin dos mdulos: a) arquitectura flexbel da aplicacin; b) configuracins vlidas;
c) diagrama de obxectos da implementacin; e d) diagramas de obxectos das configuracins vlidas.
277
1763 . {
1764.
string name;
1767.
Module(const string& n, const string& t):name(n), type(t){}
1768.
string getKey() const { return name; }
1769.
string getType() const { return type; }
1770. } ;
1771.
1774 . {
1775.
// mdulos agregados
1776.
IModule* module_C;
1777.public:
1782 . } ;
1783.
IConfigurationStore* cstore)
1785.
1786.
1787.
1789. {
1793.
1794.
1796. s.push_back(info);
1797. }
1798.
1799.boo1 ComplexModule::activateCurrentConf()
1800. {
1801. // obter o almacn de mdulos
1802.
1803.
1804.
1805.
1806.
1807.
1808.
1809.
1810.
// obter un mdulo tipo C
conf.getModuleNames("TYPE_C", names);
1811.
module_C = mstore->getMOdule("TYPE_C", names[O]);
1812.
1813 . }
1814.
1815.boo1 ComplexModule::deactivateCurrentConf()
1816. {
1817.
module_C = NULL;
1818. }
1821 . {
1822.public:
1823. Store();
1828. };
1829.
1830.Store::Store()
1831 . (
1832.
initCategories();
1833.
initConfigurations();
1834.
setDefaultConf();
1835. }
1836.
1837.void Store::initCategories()
1838. {
1839.
addCategory("TYPE_A");
1840.
addCategory("TYPE_B");
1841.
addCategory("TYPE_C");
1842 . }
1843.
1844.void Store::initConfigurations()
1845. {
1846.
// configuracin A
1847.
1848.
1849.
1850.
1851.
1852.
ModuleConfiguration conf_A("CONF_A");
conf.addItem("TYPE_A", 1);
conf.addItem("TYPE_B", 1);
COrif["TYPE_A"].addMOdule("MODULE_A");
COnf["TYPE_B"].addMOdule("MODULE_B1");
addConfiguration(conf_A);
1853.
// configuraciba B
ModuleConfiguration conf_B("CONF_B");
1854.
conf.addItem("TYPE_A", 1);
1855.
conf.addItem("TYPE_B", 1);
1856.
conf["TYPE_A"].addModule("MODULE_A");
1857.
COnf("TYPE_B"].addMOdule("MODULE_B2");
1858.
addConfiguration(conf_B);
1859.
1860. }
1861.
1862.boo1 Store::isValidConfiguration(const ModuleConfiguration& conf) const
1863 . {
1864.
1865.
1866.
1867.
1868.
1875. setCurrentConf("CONF_A");
1876. }
278
279
1877.// Mdulo principal
1879. {
1883.public:
MainModule(const string& n, IModuleStore* mstore, IConfigurationStore* cstore);
1884.
1885. void getStructureInfo(deque<VMModulelnfo>& s) const;
1891 . } ;
1892.
IConfigurationStore* cstore)
1894.
1895.
: StructuredModule(mstore, cstore), Module(n, "MAIN")
1896. {
1897. initConfigurations();
1898. setDefaultConf();
1899. }
1900.
1902 . {
1903. VMModuleInfo info;
1910. s.push_back(info);
1912.
if (module_A) module_A->getStructureInfo(s);
1913 . }
1914.
1915.boo1 MainModule::activateCurrentConf()
1916 . {
1917.
IModuleStore* mstore = getModuleStore();
1918.
if (mstore == NULL) return false;
1919.
1920.
1921.
1922.
1923.
1924.
1925.
1926.
1927.
1928.
deque<string> names;
conf.getModuleNames("TYPE_A", names);
1929.
1930.
1931.
1932.
1933.
1934.
module_A->setMOduleStore(mstore);
module_A->setConfigurationStore(this);
module_A->activateCurrentConf();
conf.getModuleNames("TYPE_B", names);
1935.
module_B = mstore->getModule("TYPE_B",
1936.
1937 . }
names[OJ);
280
1938.boo1 MainModule::deactivateCurrentConf()
1939. {
1940.
module_A = NULL;
1941.
module_B = NULL;
1942. }
1943.
1944.void MainModule::initConfigurations()
1945. {
// configuracin A
1946.
1947.
ModuleConfiguration conf_A("CONF_A");
1948.
conf.addItem("TYPE_C", 1);
1949.
1950.
'
conf["TYPE_C"].addModule("MODULE_C1");
addConfiguration(conf_A);
1951.
/ / configuracin B
1952.
1953.
ModuleConfiguration conf_B("CONF_B");
conf.addItem("TYPE_C", 1);
1954.
conf["TYPE_C"].addModule("MODULE_C2");
1955.
addConfiguration(conf_B);
1956 . }
1957.
1959. {
1960.
1961.
deque<string> items;
1962.
1963.
1964.
conf.getItemNames(items);
1965.
1966.
return true;
1967. }
1968.
1969.boo1 MainModule::setDefaultConf()
1970. {
setCurrentConf("CONF_A");
1971.
1972 . }
1973.
1976 . {
1977. // creacin dos mdulos dinmicos
1978.
1979.
1980.
1981.
1982.
1983.
1984.
1985.
1986.
1987.
1988.
1989.
1990.
1991.
1992.
1993.
1994 . }
Store store;
store.addModule(module_A);
store.addModule(module_B1);
store.addModule(module_B2);
store.addModule(module_C1);
store.addModule(module C2);
return 0;
Os mdulos simples son implementados mediante instancias da clase Module (lias 1762
1770), derivada da interface IModule (7.1.1.1), que declara atributos para almacenar o nome e
tipo do mdulo e implementa os mtodos de acceso aos valores deses atributos. Os mdulos
complexos de tipo A son implementados mediante instancias da clase ComplexModule (lias
1773-1782), que declara un atributo (lia 1776) para referenciar ao mdulo simple de tipo C
que forma parte da sa arquitectura. A activacin da configuracin actual do mdulo complexo
281
282
2.
3.
4.
A interface abstracta dun proceso incle as declaracins dos mtodos a redefnir nas clases
derivadas para implementar as tres primeiras funcionalidades, mentres que a transferencia do
fluxo de control cando se produce unha notificacin asncrona unha caracterstica
implementada internamente nas subclases.
1996. {
1997.public:
2000.
virtual void
2001.
virtual void
2002.
virtual void
virtual bool
2003.
2004.
virtual bool
2005.protected:
2006.
/ / exclusin
2007.
virtual bool
Suspend() = 0;
Resume() = 0;
Finish() = 0;
isSuspended() = 0;
isRunning() = 0;
tryDataAccess() = 0;
2010.public:
2017.protected:
2018.
// lectura/escritura de mensaxes
2019.
2020.
2021.
2022.
IVMMsg** msg,
pfn callbck,
2023.
virtual bool write(const string& port, IVMMsg* msg) = 0;
2024.
2025.protected:
2026.
// cdigo do proceso
2027.
2028.
2029.
2030.
2031.
2032.
2033.
2034.
2035 . }
= 0;
283
A interface declara mtodos para controlar e consultar o estado de execucin dun proceso
(lias 1999-2004), garantir a exclusin mutua no acceso aos datos internos (lias 2007-2009),
configurar as conexins para o paso de mensaxes entre procesos (lias 2012-2016) e escribir e
ler mensaxes (lias 2019-2024). Ntese que parte dos mtodos declarados son protected, polo
que unicamente poden ser utilizados na implementacin das clases derivadas. O cdigo
especfico de cada proceso implementado redefinindo os mtodos declarados nas lias 2027
2034 nas clases derivadas. Estes mtodos son executados en diferentes estados do proceso
segundo se explica no apartado seguinte.
7.1.2.2. O ciclo de vida dun proceso
A Figura 7.4 mostra o diagrama de estados do ciclo de vida dun proceso da mquina virtual.
Durante este ciclo cada proceso ten unha prioridade que lle asignada na sa creacin e non
pode ser modificada. As transicins entre estados correspndense con eventos producidos por
chamadas aos mtodos da interface do proceso: Start (lia 1999), Suspend (lia 2000), Resume
(lia 2001) e Finish (lia 2002); ou por condicins internas detectadas durante a execucin:
error, async_call e sync_call. As accins executadas nas transicins do diagrama
correspndense cos mtodos que conteen o cdigo especfico de cada proceso declarados na
interface IVMProcess (lias 2027-2034).
7.1.2.3. A implementacin dos procesos
A clase VMProcess proporciona a implementacin por defecto da interface IVMProcess
(7.1.2.1) supoendo que cada unha das sas instancias vai ser asignada a un "thread" do
sistema operativo. Ademais esta clase implementa a interface IModule (7.1.1.1), polo que
proporciona tamn a funcionalidade precisa para cargar e descargar procesos dinamicamente na
memoria da mquina virtual. A lxica do ciclo de vida da Figura 7.4 dende que o proceso
iniciado invocando o mtodo Start (lia 1999), ata que a sa execucin remata pola invocacin
do mtodo Finish (lia 2002) ou pola deteccin dun erro, implementada no mtodo Run (lia
2028) da clase VMProcess.
EN EXECUCION
asyncall / OnHand/erQ
syncall / OnEventQ
crear
INICIADO
start/lnitialQ
error / OnError()
*
EN ESPERA
suspend / OnSuspendQ
finisi / FinalQ
FI NALIZADO
resume / OnResumeQ
DETIDO
Figura 7.4. Diagrama de estados do ciclo de vida dun proceso da mquina virtual.
284
2037. {
2039. {
2040.
unsigned result = getEvent()->Wait(); // bloqueo do proceao
2041.
switch (result)
2042.
2043.
case IAlertableEvent::AE SIGNALED: // proceso desbloqueado
2044.
2045.
2046.
2047.
2048.
2049.
getEvent()->Reset();
if (!exit)
if (suspend)
exit ^_ !OnSuspend();
if (!exit)
suspend = false;
exit ^_ !OnResume();
2050.
2051.
2052.
2053.
2054.
2055.
2056.
2057.
2058.
2059.
2060.
2061.
2062.
2063.
2064.
2065.
2066.
else if (clbk)
exit ^_ !OnHandler(clbk_arg);
clbk = false;
clbk_arg = NULL;
else
exit ^_ !OnEvent();
2067.
}
2068.
break;
2069.
default:
2070.
exit
2071.
2072.
break;
2073.
}
2074.
2075. }
^_ !OnError(); // erro
Unha vez iniciado un proceso, a sa execucin realzase nun bucle do que non se sae ata que
a varibel booleana exit activada, xa sexa porque se invoque o mtodo Finish (lia 2002) ou
debido deteccin dalgunha condicin interna na execucin dos mtodos asociados s
transicins do diagrama de estados da Figura 7.4 (lias 2030-2034). En cada iteracin do bucle
a execucin do proceso bloquease (lia 2040) ata a ocorrencia dalgn dos eventos seguintes:
1. A invocacin dende outro proceso dalgn dos mtodos de control do estado (lias 2000
2002): Finish, Suspend ou Resume.
2. A notificacin dende outro proceso da finalizacin dunha operacin asncrona iniciada por
este proceso.
3. O inicio dende outro proceso dunha operacin asncrona que este proceso implemente.
No resto deste apartado explcanse os detalles da implementacin do mecanismo de bloqueo
da execucin do proceso e os eventos asociados invocacin dos seus mtodos. As
notificacins asncronas son explicadas en (7.1.2.4.2).
285
2077. {
2078. // reaultado dunha solicitude de bloqueo
2086 . } ;
Esta interface declara das versins do mtodo Wait (lias 2081 e 2082), que permiten
bloquear un proceso indefinidamente ou durante un perodo de tempo determinado. O proceso
estar bloqueado ata que transcorra o perodo de tempo indicado ou outro proceso invoque o
mtodo Signal (lia 2083). O mtodo Reset (lia 2085) sirve para reiniciar o semforo e
permitir novos bloqueos. Cada^roceso crea e almacena durante a sa iniciacin unha instancia
que implemente esta interface , que accedida utilizando o mtodo privado getEvent (lia
2040) da clase VMProcess.
7.1.2.3.2. Invocacin dos mtodos Suspend e Resume dende outro proceso
70 A versin Windows da mquina virtual utiliza o mecanismo de sincronizacin entre "threads" denominado
Event Object para implementar esta interface.
'^ A utilizacin incorrecta dos mtodos Suspend e Resume pode provocar o bloqueo indefinido dun proceso. A
versin de depuracin da implementacin destes mtodos emite mensaxes de aviso para os erros mais comns
sendo responsabilidade do programador garantir a sa utilizacin correcta.
286
2088. {
2089.
if (msuspend.TryEnterMutex()) //
obter "mutex"
2090. {
2091.
if (suspend)
2094.
getEvent()->Signal(); // desbloquear proceso
2095. }
else
2096.
2097.
// indicar que xa foi detido por outro proceso
'
( depuracin)
2098. }
2099.
2100.void VMProcess::Resume()
2101 . {
2102. try
2103.
2104.
2105.
msuspend.LeaveMutex();
++ssuspend;
2106.
2107.
2108.
catch (...)
// liberar "mutex"
// incrementar semforo
2109.
// indicar que non pode ser reiniciado
}
2110.
2111 . }
( depuracin)
Cando un proceso invoca o mtodo Suspend tenta obter o"mutex" msuspend (lia 2089). Se
este est ocupado o proceso xa foi suspendido previamente por outro proceso, polo que a
execucin continua sen modificar o estado do proceso suspendido. En caso contrario, actvase o
indicador suspend (lia 2093) e desbloquease o proceso de xeito que a operacin concla no
mtodo Run, executando o mtodo OnSuspend (lia 2050) no que se suspende o proceso
bloquendoo no semforo ssuspend (lia 2053). Para reiniciar a execucin do proceso invcase
o mtodo Resume, no que se libera o mutex msuspend (lia 2104) e se desbloquea o proceso
suspendido incrementando o semforo ssuspend (lia 2105). A operacin compltase no
mtodo Run, no que se desactiva o indicador suspend (lia 2054), exectase o mtodo
OnResume (lia 2055) e continase coa execucin do proceso. En caso de que o proceso que
invoque o mtodo Resume non sexa o mesmo que detivo o proceso suspendido, o intento de
liberar o mutex msuspend provocar unha excepcin e a execucin continuar sen modificarse
^
o estado do proceso suspendido.
7.1.2.3.3. Invocacin do mtodo Finish dende outro proceso
O cdigo seguinte mostra unha versin simplificada do mtodo Finish (lia 2002):
2112.void VMProcess::Finish(void)
2113 . {
exit = true;
2114.
2115.
if (suspend)
Resume();
2116.
2117.
else
getEvent()->Signal();
2118.
2119 . }
A execucin deste mtodo activa o indicador exit (lia 2114) para que o proceso saia do
bucle do mtodo Run e, dependendo do estado do proceso -valor do indicador suspend (lia
2115}-, reinciase a sa execucin ou desbloquease. Debido s restriccins comentadas
anteriormente, un proceso suspendido unicamente pode ser finalizado polo proceso que o
suspendeu.
287
O seguinte cdigo mostra un mtodo xenrico que implemente o inicio dunha operacin
asncrona implementada polo proceso:
2120.void AnyVMProcess::AnyMethod(void)
2121 . {
2122. lockDataAccess();
2125. unlockDataAccess();
2126 . }
A implementacin deste mtodo comeza obtendo o"mutex" (lia 2122) que regula o acceso
aos datos internos do proceso (a execucin detense ata que o"mutex" estea libre). Unha vez
que se obtn o"mutex" realzanse as operacins que preparan a execucin asncrona (lia
2123), modificando os datos internos do proceso se preciso, desbloquease o proceso (lia
2124) e finalmente librase o"mutex" (lia 2125). A operacin compltase no mtodo Run,
invocando o mtodo OnEvent (lia 2067) que implementa o cdigo da operacin asncrona que
^
especfico de cada proceso.
7.1.2.4. A comunicacin entre procesos
A comunicacin entre procesos da mquina virtual pode realizarse mediante unha das tres
tcnicas seguintes:
1. Como os procesos da mquina virtual son instancias de clases derivadas da interface
IVMProcess (7.1.2.1), o mecanismo de comunicacin mis simple consiste na invocacin
dende un proceso dalgn dos mtodos implementados por outro. O uso desta tcnica
require que o proceso `invocador' poda obter unha referencia vlida ao proceso `invocado',
o que en ocasins implica coecer de antemn o tipo concreto deste proceso. Exemplos do
uso desta tcnica son as invocacins dos mtodos Finish, Suspend ou Resume explicados
en (7.1.2.3.2; 7.1.2.3.3).
2. En ocasins a invocacin dun mtodo nun proceso sirve para iniciar unha operacin
asncrona (7.1.2.3.4). Existen situacins nas que o proceso `invocador' require dunha
notificacin que indique cando esta remata. O segundo mecanismo de comunicacin entre
procesos consiste na notificacin da finalizacin de operacin asncronas, tal e como se
explica en (7.1.2.4.2).
3. A terceira tcnica consiste no envo de mensaxes asncronas entre procesos. As mensaxes
poden ser utilizadas, por exemplo, para intercambiar informacin, iniciar operacins
asncronas ou notificar a ocorrencia de eventos. Para que dous procesos podan intercambiar
mensaxes preciso que exista entre eles unha conexin. As conexins son unidireccionais e
poden restrinxir o tipo de mensaxes transmitidas a travs delas. En cada proceso se indica o
nmero e tipo de conexins que poden realizarse mediante a declaracin de portas de
enlace. Unha conexin entre dous procesos crease unindo das portas de enlace do mesmo
tipo (unha en cada proceso) mediante un canal de comunicacins, que fai as veces de
medio de transmisin entre os procesos. Esta tcnica ten a avantaxe de que o acoplamento
entre os procesos moi dbil ao non existir referencias directas entre eles o que facilita a
reconfiguracin dinmica da arquitectura da mquina virtual mediante a modificacin das
conexins entre procesos.
288
;Msg ;
id : string
IVMMs9
bulTer
Channel
NMProcess
read (port_id, IVMMsg)
isValidPort (port_id)
0. 1
OI getKep Q : string
getChannel Q : Channel<Msg>
isConnected Q : bool
connect (Channel<Msg>)
disconnect Q
^
; bind(IVMMsg)
; bind(IVMMsg)
read (Msg)
write (Msg)
VMChannel
channel
VMPort
f
vMProcess
ports
Figura 7.5. Diagrama das clases que modelan o mecanismo de paso de mensaxes ene procesos.
289
O mtodo read da clase VMChannel, utilizado polo proceso receptor para recuperar as
mensaxes almacenadas nun canal, implementouse con das semnticas diferentes:
l. Con bloqueo, o proceso receptor detn a sa execucin ata que haxa algunha mensaxe
dispobel no canal.
2. Sen bloqueo, utilzase o mecanismo de notificacin asncrona para notificarlle ao proceso
receptor a presencia dunha mensaxe no canal.
O diagrama da Figura 7.6 mostra a interaccin entre os obxectos implicados no envo dunha
mensaxe dende un proceso da mquina virtual a outro. A primeira secuencia mostra o envo da
mensaxe, que almacenada no canal, mentres que a segunda secuencia mostra a lectura con
bloqueo. Na implementacin do canal utilzase un "mutex" para controlar o acceso ao "buffer"
de mensaxes e un semforo para bloquear a execucin do proceso receptor ata que haxa
algunha mensaxe dispobel.
^1:VMProcess
write("port_id, msg)
port = ports.find("port id)
port:VMPort
channel:VMChannel
write(msg)
write(msg)
buffer.lock()
buffer.write(msg)
buffer.unlock()
--------------------------------------
sem.incQ
^2:VMProcess
msg = read(port_id)
port = ports.find("port id)
port:VMPort
channel:VMChannel
msg = read()
msg = readQ
----------------------------------------------,,^ -------------------------------------
sem.decQ
buffer.lock()
msg = bufrer.read()
buffer.unlock0
Existen situacins nas que dende un proceso se inicia unha operacin asncrona noutro e,
unha vez que esta se completa, continase coa execucin doutras operacins. A
implementacin deste funcionamento require dalgn mecanismo que permita dende un proceso
notificar a outro a finalizacin dunha operacin asncrona. Ntese que a tcnica de paso de
mensaxes explicada no apartado anterior pode ser utilizada para iniciar operacins asncronas e
notificar a sa finalizacin naqueles casos nos que os procesos implicados estean conectados
mediante un canal e non haxa requirimentos relacionados co tempo que a notificacin pase
almacenada neste antes de ser procesada. Sen embargo estas condicins non sempre se
cumpren, polo que se implementou na mquina virtual unha tcnica que perrnite realizar
notificacins asncronas inmediatas entre procesos non conectados mediante un canal.
290
async_fun_arg = fun_arg;
2139.
2140. }
2150.struct IAsyncClbkArg
2151. {
2153 . } ;
'Z Pode consultarse [ 142] para unha explicacin detallada de porqu non poden utilizarse os mtodos non estticos
73 Ainda que podera realizarse unha implementacin que eliminara esta restriccin, na versin actal da mquina
291
un mtodo esttico, que ser utilizado como funcin "callback" por todos os procesos, e dous
atributos privados auxiliares. O cdigo seguinte mostra as declaracins e a implementacin do
mtodo esttico na clase VMProcess:
2154.class VMProcess
2155. {
2158.protected:
2160. };
2163 . {
2164. async_clbk_arg* parg = dynamic_cast<async_clbk_arg*>(arg);
2165. if (parg)
2166.
2167.
parg->pthis->clbk = true;
// activar indicador
2168.
// desbloquear proceso
parg->pthis->getEvent()->Signal();
2169.
2170.
2172 . }
O mtodo async_callback (lia 2159) presupn que recibe unha instancia da clase
async_clbk_arg. Esta clase derivada de IAsyncClbkArg (lias 2150-2153) e almacena unha
referencia ao proceso que iniciou a operacin asncrona e un argumento opcional que lle ser
enviado ao proceso cando a operacin remate. A implementacin do mtodo utiliza a
informacin almacenada nesta instancia para acceder ao proceso que iniciou a operacin
asncrona (lia 2164), activar o valor do atributo clbk (lia 2167), almacenar a informacin
opcional da notificacin no atributo clbk arg (lia 2168) e desbloquear o proceso (lia 2169).
O procesamento da notificacin compltase no mtodo Run no que se invoca o mtodo
OnHandler (lia 2061), pasndolle como argumento a informacin almacenada no atributo
clbk_arg. Finalmente reincianse os valores dos atributos clbk e clbk_arg (lias 2062 e 2063)
para permitir unha nova notificacin.
Unha limitacin da implementacin descrita que unicamente se almacena a ltima
notificacin recibida por un proceso, polo que cando un proceso suspendido que tea unha
notificacin pendente reciba unha nova notificacin, a pendente prdese. Esta situacin
repetirase mentres o proceso suspendido contine recibindo notificacins. responsabilidade
do programador ter en conta esta limitacin naquelas situacins nas que sexa preciso procesar
todas as notificacins asncronas. No seguinte exemplo mstrase o cdigo mnimo preciso para
implementar a solicitude dun servicio asncrono con notificacin de finalizacin entre un
proceso cliente e un proceso servidor utilizando a tcnica explicada previamente:
2173.// Proceso servidor
2175. {
bool OnEvent();
2176.
2177.public:
2178.
2179. } ;
2180.
2181.boo1 Server::OnEvent()
2182 . {
2183.
callCallback(); //
2184.
2185. }
292
2187 . {
2188.
lockDataAcess();
// desbloquear proceao
2190. getEvent()->Signal();
2191. unlockDataAcess();
2192. }
2193.
2196 . {
2197.
2198.
2199.
2200.
Server* pServer;
void requestAsyncService()
bool OnEvent();
2201.public:
2202.
Client(Server* srv)
2203.
void Operation();
2204 . } ;
: pServer(srv) {}
2205.
2206.boo1 Client::OnEvent()
2207. {
2208.
requestAsyncService ( ); // iniciar servicio asncrono
2209.
// executar aqu o cdigo posterior ao iaicio do servicio asncrono
2210.
2211. }
2212.
2214. {
2215.
// executar aqu o cdigo de manexo da notificacin asncrona
2216. }
2217.
2219. {
2220.
if (parg)
2221.
pserver->initAsyncService(async_callback, parg); //
2222.
2223.
2224.
2225.
2226.
2227.
2228.
2229.
2230.
2231.
2232.
2233.
2234.
2235.
2236.
2237.
2238.
2239.
iniciar aervicio
void Client::Operation()
lockDataAcess();
unlockDataAcess();
// $xecucin do exemplo
int main()
Server server;
Client client(&server);
client.Operation();
293
2243.
2247.
2251.
2254. {
2255.public:
2256.
VMProcessA();
2257.
-VMProcessA();
2258 . } ;
2259.
2260.VMProcessA::VMProcessA()
2261. {
2262.
2263.
2264.
2265.
2266.
VMPortA("al");
VMPortA("a2");
VMPOrtB("bl");
VMPortB("b2");
2267. ports.insert(port_a2);
2268. ports.insert(port_bl);
2269. ports.insert(port_b2);
2270. }
2271.
2272.VMProcessA::-VMProcessA()
2273. {
2274.
ports.destroy();
2275. }
2276.
2279. {
2280.public:
2281.
VMProcessB();
-VMProcessB();
2282.
2283 . } ;
2284.
2285.VMProcessB::VMProcessB()
2286. {
2287.
2288.
2289.
2290.
2291. }
ports.insert(port_bl);
ports.insert(port_b2);
2293. {
2294. ports.destroy();
2295. }
2296.
2299. {
2300.public:
2301. VMProcessC();
2302. -VMProcessC();
2303 . } ;
2304.
2305.VMProcessC::VMProcessC()
2306. {
2307.
2308.
ports.insert(port_al);
2309. }
2310.
2311.VMProcessC::-VMProcessC()
2312. {
2313. ports.destroy();
2314 . }
2315.
2318. {
2319. // canais
2320.
2321.
2322.
2323.
2324.
VMProcessA process_a;
VMProcessB process_b;
2325.
2326.
2327.
2328.
2329.
2330.
2331.
2332.
2333.
2334.
2335.
2336.
2337.
2338. }
process_a.connect("al", &channel_al);
process_cl.connect("al", &channel_al);
// conexin A-C2
process_a.connect("a2", &channel_a2);
process_c2.connect("al", &channel_al);
// conexina A-B
process_a.connect("bl", &channel_bl);
process_b.connect("bl", &channel_bl);
process_a.connect("b2", &channel_b2);
process_b.connect("b2", &channel_b2);
return 0;
294
295
^
U
O
f0
^
47
U'
c
c
ti'
N
N
L
U
^
G
^
i
O
l0
I
^
41
L
U
^
N
l0
l0
L
U
^
>
m
U
a^
c
c
m
t
c
c
O
^
Co
N
W
I
^
m
^ a
> i
d
^
t
>
d
m
L
U
Figura 7.7. Exemplo de utilizacin dos procesos: a) arquitectura da aplicacin; e b) diagrama de obxectos da
implementacin.
296
1.
O ncleo da mquina virtual, formado pola base de datos de E/S na que se almacenan os
valores das varibeis de proceso, o manexador de temporizacins, e o depurador.
2.
3. O xestor da configuracin, que proporciona unha interface de acceso remoto aos servicios
de configuracin e control da mquina virtual.
4. O subsistema de aplicacin, no que se executan as aplicacins desenvolvidas polo usuario
que son cargadas dinamicamente na memoria da mquina virtual.
Temporizador
"Driver" de Driver" de
entrada
E/S
Driver" d
E/S
Driver" de "Driver" de
sada
saida
1 " ^`^`^ .
Proceso
297
VMProcess
(trom Pro
StructuredModule
(hom Modula^
IStructuredStoreModule
(from Module^
ModuleStore
(from Modvlrrs)
DLUnfo
ConfigurationStore
(trom Modula^
VMachine
services
dlls
^state : VMState ^
IVMServices
systeml0
channels
SystemDataDeclaration
(from Baslo Ehments)
VMChannel
(hom Prooeaes)
Figura 7.9. Diagrama das clases que modelan a arquitectura da mquina virtual.
IMultitimerSeroer
output_mgr
iortdb
timer
1
IModule
(from blodules)
iodrivers
yMachine
_ debugger
VMDebu ger
omm_seroer
input_mgr
player
t
IGrafcetPlayer
(hom Gratcet Player)
1
NMServer
(from Communleatlons)
Figura 7.10. Diagrama das clases que modelan os subsistemas da mquina virtual.
298
O subsistema de E/S (Figura 7.8) est formado polos "drivers" de E/S e os procesos que
xestionan a interaccin entre os "drivers" e o ncleo da mquina virtual. Nesta seccin se
explican os detalles do deseo e implementacin dos "drivers" (7.2.1) e xestores de E/S
(7.2.2), as como as tcnicas utilizadas para a simulacin de valores do proceso (7.2.3).
2340. {
2341.public:
2344.
2345.
2346.
2347.
2348.
virtual
virtual
virtual
virtual
virtual
void
void
void
bool
bool
Suspend() = 0;
Resume() = 0;
Finish() = 0;
isSuspended() = 0;
isRunning() = 0;
299
2350.protected:
2353.public:
2362.
unsigned sz, long period = 0) = 0;
2366.
virtual bool readIOPoint(const string& iopt, void* buf, unsigned sz) = 0;
2367.
virtual bool writelOPoint(const string& iopt, void* buf, unsigned sz) = 0;
2368. virtual bool listenIOPoint(const string& iopt, void* buf, unsigned sz,
2369.
2370.
virtual bool receivedlOPoint(const string& iopt, unsigned& sz, unsigned& err) = 0;
2372 . } ;
A interface declara mtodos comns aos da interface IVMProcess (7.1.2.1) para o control e
consulta do estado de execucin do "driver" (lias 2343-2348). A configuracin do dispositivo
realzase mediante os mtodos declarados nas lias 2351-2352. Ntese que os mtodos
buildDevicelnfo e configureDevicelnfo estn declarados como protected, polo que uniamente
poden ser utilizados na implementacin das clases derivadas. Os mtodos para a xestin da
asignacin de varibeis a magnitudes fisicas declranse nas lias 2359-2364, e os que permiten
ler e escribir valores no dispositivo nas lias 2366-2371.
Nos apartados seguintes explcanse os detalles da implementacin das funcionalidades
proporcionadas polos "drivers" da mquina virtual.
7.2.1.2. Configuracin dun "driver" de E/S
Cada "driver" da mquina virtual almacena internamente a informacin que describe a
estructura, caractersticas e valores que permiten configurar o funcionamento dun dispositivo
de E/S. Esta informacin creada durante a iniciacin do "driver" na implementacin do
mtodo buildDevicelnfo (lia 2351), e pode ser consultada e modificada utilizando os mtodos
getDevicelnfo (lia 2354) e SetDevicelnfo (lia 2355). A configuracin do dispositivo
utilizando os valores da configuracin actual realizada na implementacin do mtodo
configureDevicelnfo (lia 2352).
Cada dispositivo de E/S modelado na mquina virtual como un conxunto de subsistemas
que forman unha estructura xerrquica en forma de rbore. A raz da xerarqua correspndense
co dispositivo e os niveis inferiores (as follas) cos transductores (denominados puntos de E/S na
mquina virtual) que permiten ler e escribir os valores das magnitudes fisicas do proceso. Cada
subsistema ten asociado un conxunto de caractersticas que permiten configuralo. Cada
caracterstica ten un nome, un conxunto de valores vlidos e un valor actual. Os subsistemas,
caractersticas e valores vlidos poden ter asociada unha condicin que permite determinar o
seu estado de activacin ou validez en funcin dos valores actuais da configuracin.
Esta especificacin suficientemente xenrica como para permitir a descricin de mltiples
tipos de dispositivos como, por exemplo, a porta serie dun PC, que pode ser modelada como un
nico punto de E/S cun pequeno conxunto de caractersticas (velocidade, bits de parada, tipo de
300
paridade, etc.); unha tarxeta de adquisicin de datos con varios subsistemas (convertedor D/A,
convertedor A/D, mdulos de E/S dixitais e analxicas, contadores, temporizadores, etc.) e
mltiples puntos de E/S; ou dispositivos de E/S distribuda mis complexos.
Ademais, a posibilidade de asociar unha condicin de activacin ou validez aos subsistemas,
caractersticas e valores vlidos perrnite modelar situacins nas que os valores ou a validez
dunha caracterstica dependen dos valores doutras. Por exemplo, nunha porta serie o valor do
tipo de paridade non aplicbel se non est activado o control de paridade. Do mesmo xeito
poden modelarse diferentes configuracins dos subsistemas que formen o dispositivo de E/S.
Por exemplo, hai tarxetas de adquisicin de datos analxicos que teen dous modos de
funcionamento, por voltaxe simple ou por diferencia de voltaxe. No segundo modo, para cada
valor adquirido utilzanse dous canais de entrada (o valor adquirido a diferencia das
medicins nambos canais) polo que o nmero de puntos de E/S a metade dos dispobeis
cando se utiliza o modo simple.
No diagrama da Figura 7.11 mstranse as clases utilizadas para representar a informacin de
configuracin dun "driver" da mquina virtual. No resto deste apartado descrbese en detalle
cada clase e mostrase un exemplo de como son utilizadas para modelar un dispositivo de E/S,
en concreto a porta serie dun PC.
enumeration
DeaiceLevelType
Device
Subsystem
IOPoint
De+ricelnfo
name : string
num_levels : unsigned
main level
DeviceLevel
name : string
type : DeviceLevelType
level : unsigned
IDeviceCharacteristic
characteristics
characteristic
subsystems
values
DeviceCharacteristicReference
IDeviceValue
r---- ^
^type ,
DeviceVaue ^ I
levels
DeviceSubsystem
^
'type
values
----^
DeviceSingleValue
value : tppe
_^
-L;tYPe ---- ^
DevicelntenralValue ^ ^
min_value : type
max_value : tppe
DeviceValidValue
R
OevicePrecanditon 0^_1
0..1
valid values
precondition
^type----:
_^^
DeviceCharacteristic
n ame : string
value : type
Figura 7.11. Diagrama das clases que modelan a configuracin dun dispositivo de E/S.
301
subsystem, indica un subsistema xenrico que pode conter outros subsistemas ou puntos de
E/S.
-^
iopoint, identifica un transductor de entrada ou sada do dispositivo. Os subsistemas deste
tipo unicamente poden aparecer no nivel mis baixo da estructura xerrquica e cada un
deles permitir a lectura ou escritura do valor dunha magnitude do proceso.
Informacin do dispositivo ("DeviceInfo")
Esta clase a que agrupa a informacin do dispositivo e sirve como punto de acceso
estructura xerrquica que esta forma.
Atributos:
Asociacins:
main_level, referencia raz da estructura xerrquica.
Nivel da xerarqua de subsistemas ("DeviceLevel")
Esta clase representa os niveis da estructura xerrquica que forman os subsistemas.
Atributos:
Asociacins:
characteristics, conxunto de caractersticas que permiten configurar o nivel.
subsystems, conxunto de subsistemas que forman o nivel.
Subsistema ("DeviceSubsystem")
Esta clase representa os subsistemas do dispositivo.
Asociacins:
precondition, condicin de activacin do subsistema.
Caracterstica ("IDeviceCharacteristic")
Interface abstracta da que derivan todas as clases utilizadas para representar as
caractersticas do dispositivos de E/S.
302
Caracterstica ("DeviceCharacteristic")
Clase parametrizada derivada de IDeviceCharacteristic. As clases que representan
caractersticas asociadas a valores de diferentes tipos (booleanos, enteiros, reais, etc.) obtense
instanciando esta clase utilizando o tipo de valor como argumento.
Atributos:
name, identificador alfanumrico da caracterstica.
value, valor actual da caracterstica.
Asociacins:
precondition, condicin de validez da caracterstica.
Esta clase representa un dos valores vlidos dunha caracterstica. Cada valor vlido ten
asociada unha condicin que indica cando aplicbel e un conxunto de valores discretos que
poden ser asignados caracterstica.
Asociacins:
precondition, condicin de aplicabilidade do valor.
Esta clase representa cada caracterstica comprobada para avaliar o resultado da condicin
de validez.
303
Asociacins:
values, conxunto de valores que a caracterstica pode ter para que se cumpra a condicin.
7.2.1.2.1. Exemplo de configuracin dun dispositivo de E/S
2374. {
2375.
2376.
2377.
// informacin do dispositivo
2378.
2379.
// velocidade
2380.
2381.
2382.
DeviceCharacteristic<unsigned>*
com^ort->characs.insert(baud_rate);
2383.
2384.
// paridade
2385.
2386.
2387.
DeviceCharacteristic<bool>*
com^ort->characs.insert(parity_check);
2388.
2389.
2390.
2391.
2392.
2393.
2394.
2395.
DeviceCharacteristic<unsigned>*
DevicelntervalValue<unsigned>*
num_bits_wl->values.push_back(num_bits_vall);
2396.
2397.
2398.
2399.
num_bits->validValues.push_back(num_bits_wl);
com^ort->characs.insert(num_bits);
2400.
DeviceCharacteristic<unsigned>*
2401.
2402.
2403.
DeviceSingleValue<unsigned>*
2404.
2405.
2406.
2407.
stop_bits_wi->values.push_back(stop_bits_vall);
stop_bits->validValues.push_back(stop_bits_wl);
2408.
2409.
DeviceSinglevalue<unsigned>*
2410.
2411.
stop_bits_w2->values.push_back(stop_bits_va12);
2412.
2413.
DeviceCharacteristicReference*
2414.
2415.
2416.
2417.
2418.
2419.
DeviceSingleValue<unsigned>*
stop_bits_refl->values.push_back(num_bits^vall);
stop_bits^rel->characteristics.insert(stop_bits_refl);
stop_bits_w2->setPrecondition(stop_bits^rel);
2420.
2421.
2422.
stop_bits->validValues.push_back(stop_bits_w2);
DeviceSingleValue<unsigned>*
2423.
2424.
2425.
stop_bits_w3->values.push_back(stop_bits_va13);
= 1,
1.5, 2
304
2426.
2427.
DeviceCharacteristicReference*
2428.
2429.
2430.
2431.
2432.
2433.
DeviceIntervalValue<unsigned>*
stop_bits^re2->characteristics.insert(stop_bits_ref2);
stop_bits_w3->setPrecondition(stop_bits^re2);
stop_bits->validValues.push_back(stop_bits_w3);
S);
'
2434.
2435. com^ort->characs.insert(stop_bits);
2437. }
A porta serie modelada como un nico punto de E/S (lia 2376) con catro caractersticas
que permiten configuralo: a velocidade de transmisin (lias 2380-2382), o nmero de bits por
palabra (lias 2385-2387), o control de paridade (lias 2390-2397), e o nmero de bits de
parada utilizados (lias 2400-2433). O nmero de bits por palabra pode ser un valor entre 5 e 8,
o cal definido mediante un intervalo de valores vlidos (lias 2393-2396). Encanto ao nmero
de bits de parada utilizados poden ser 1, 1.5 ou 2. O valor 1.5 s pode seleccionarse se o
nmero de bits da palabra 5 e o valor 2 s se o nmero de bits diferente a 5. Ambas
condicins estn representadas mediante condicins de validez nas lias 2412-2419 e lias
2425-2432, respectivamente. Na Figura 7.12 mstrase o diagrama de obxectos da informacin
de configuracin creada polo cdigo anterior.
7.2.1.3. Lectura e escritura de valores
Os "drivers" da mquina virtual permiten ler e escribir valores directamente nos puntos de
E/S dun dispositivo mediante os mtodos readlOPoint e writelOPoint (lias 2366 e 2367).
Ambos mtodos reciben como argumento o identificador alfanumrico do punto de E/S, o
"buffer" que contn a informacin a escribir ou no que se almacenar a informacin lida, e o
tamao desta informacin. Ntese que estes mtodos non impoen restriccins no tipo de datos
lidos ou escritos, ser a base de datos da mquina virtual a que realice as conversins precisas,
como se explica en (7.3.1).
Os puntos de E/S son identificados mediante a sa rota de acceso ("path") na estructura
xerrquica da informacin de configuracin do dispositivo, que se forma de xeito semellante
rota de acceso dun arquivo na rbore de directorios dun sistema operativo. Por exemplo, a rota
`Ildd_b8i8oliodevicelbinputslbinputl' identifica un punto de E/S denominado binputl contido
no subsistema binputs do dispositivo iodevice descrito mediante a informacin de
configuracin cuxo identificador dd_b8i8o. Esta rota podera utilizarse para indicar unha
entrada dun dispositivo que proporcione oito entradas e oito sadas booleanas, por exemplo.
Ademais dos mtodos anteriores, os "drivers" da mquina virtual proporcionan outros tres
mtodos -ZistenlOPoint (lia 2368), receivedlOPoint (lia 2370) e stopListeninglOPoint (lia
2371^ que permiten realizar lecturas asncronas nun punto de E/S. O mtodo ZistenlOPoint
a versin asncrona do mtodo readlOPoint, este mtodo notifica a lectura dun valor ao
proceso que iniciou a operacin utilizando o mecanismo de notificacin asncrona (7.1.2.4.2).
Os outros dous mtodos serven, respectivamente, para consultar o estado e deter a lectura
asncrona dun valor.
305
^ > ^^
_' ^
^ ^ E
ffi
F
N
F>I
Ui
N
N
t
U
q
L
U
L
U
O
^
J
m
^ II
.^
^^ ^I
c K
F_
m
^J >
>
>
>
a
.^
>
n
q
m
j O
^
0 p
m m
A
m
Y
^1 n
m m
^
n
n 11
aD m
O 11
^ ?
w
U-y
.. ^
m
m^
VO^
>
>
m a p ii
E g -d -
io
m
^ L
C ri m m
C C
^
`m
L
U
306
A clase DeviceDriver mantn informacin sobre as varibeis asignadas aos puntos de E/S do
dispositivo. A implementacin dos mtodos schedule0utput e schedulelnput controla que unha
mesma varibel non asignada a mis dun punto de E/S, que como moito se asigna unha
307
varibel a cada punto de E/S e que o punto de E/S ao que se asigna a varibel existe no
dispositivo.
7.2.1.4.2. Monitorizacin de varibeis de entrada
(7.1)
onde:
time, tempo transcorrido dende a iniciacin do temporizador. Este tempo calculase como:
time = ticks * mcd
(7.2)
sendo:
308
O seguinte exemplo mostra o clculo deste conxunto para a serie de notificacins recibidas
nun "driver" con catro varibeis de entrada asignadas con perodos de monitorizacin de 5, 5,
10 e 1 S mseg. respectivamente.
2438.// Valores iniciaia
2440.ticks = 0
2441.time = 0
2442.mcd = 5
2443.mcm = 30
2444.ticks
= 1 //
2445.time = 5
2446.update_vars =
2447.ticks = 2 //
2448.time = 10
2449.update_vars =
2450.ticks = 3 //
2451.time = 15
primeira notificacin
{vl, v2}
segunda notificacin
terceira notificacin
2454.time = 20
2455.update_vars =
2456.ticks = 5 //
2457.time = 25
2458.update_vars =
2459.ticks = 6 //
2460.time = 30
2461.update_vars =
quinta notificacin
{vl, v2}
sexta notificacin
Ntese que a serie anterior reptese cun perodo igual ao mnimo comn mltiplo dos
perodos de monitorizacin das varibeis (mcm = 30), polo que cando o nmero de
notificacins tal que o tempo transcorrido sexa igual a ese perodo (ticks = 6), pode reiniciarse
o seu valor e considerar que se volve situacin inicial. Na implementacin do algoritmo de
clculo do conxunto update_vars reduciuse o nmero de operacins necesarias ordenando as
varibeis dacordo ao seu perodo de monitorizacin e considerando en cada notificacin
unicamente aquelas que teen un perodo (valor de Tu) inferior ao tempo transcorrido dende a
iniciacin do temporizador (valor de time).
Unha vez determinado o conxunto de varibeis a actualizar o"driver" obtn os seus valores
dos puntos de E/S nos que estn asignadas utilizando o mtodo readlOPoint (lia 2366) e
envalle mquina virtual as mensaxes con estes valores a travs da porta de enlace
correspondente. A implementacin do mtodo readlOPoint faise nas subclases derivadas de
DeviceDriver e depender de cada dispositivo concreto. A tcnica descrita reduce o"overhead"
debido monitorizacin de varibeis, xa que:
1. A interaccin entre o temporizador e o"driver" redcese unicamente iniciacin do
temporizador e recepcin e procesamento no "driver" das notificacins do temporizador.
2. O clculo do conxunto de varibeis a actualizar require unicamente unha divisin e unha
comparacin por cada varibel cuxo perodo de monitorizacin sexa inferior ao tempo
transcorrido dende a iniciacin do temporizador.
309
7.2.1.4.3. Actualizacin de varibeis de sada
A actualizacin dos valores das sadas realzase mediante a lectura sen bloqueo (7.1.2.4.1)
da porta de enlace do "driver" pola que se reciben as mensaxes enviadas pola mquina virlual.
Estas mensaxes conteen o identificador e valor da varibel de sada a actualizar. Cada vez que
se recibe unha mensaxe o"driver" comproba en que porta de E/S est asignada a^^ varibel e
escribe nela o novo valor utilizando o mtodo writelOPoint (lia 2367). A implementacin
deste mtodo faise nas subclases derivadas de DeviceDriver e depender de cada dispositivo
concreto.
Mquil virtual
porta entrada ^
Xestor Entrada
porta de entrada
"driver" "driver" "driver"
entrada entrada entrada
(a)
(b)
2463. {
// control do estado
2464.
virtual void Start() = 0;
2465.
virtual void Suspend() = 0;
2466.
virtual void Resume ( ) = 0 ;
2467.
virtual void Finish() = 0;
2468.
virtual bool isSuspended() = 0;
2469.
virtual bool isRunning() = 0;
2470.
^
// portas de enlace
2471.
2472.
virtual bool isValidPort(const string& port, bool& state) = 0;
2473.
virtual bool connect(const string& port, VMChannel* channel) = 0;
2474.
virtual bool disconnect(const string& port) = 0;
2475.
virtual bool getConnection(const string& port, VMCharmel* charmel) = 0;
2476.
2477 . } ;
310
Como pode comprobarse esta interface coincide coa interface pblica dos procesos da
mquina virtual (7.1.2.1). A Figura 7.14 mostra o diagrama das clases derivadas de IIOMgr
que son utilizadas para a implementacin dos xestores de E/S. A sa implementacin por
defecto proporcionada pola clase IOMgr utilizando os mtodos derivados da clase
VMProcess. A clase IOMgr crea no seu constructor a porta de enlace para a recepcin de
mensaxes que teen en comn tanto os xestores de entrada como os de sada e implementa o
mecanismo de recepcin de mensaxes. Ademais a clase IOMgr declara un mtodo que
invocado cada vez que unha mensaxe recibida. Este mtodo tipo protected e ser redefinido
polas subclases para implementar comportamentos especficos. A sa declaracin a seguinte:
2478.class IOMgr : public ^7MProcess, public IIOMgr
2479. {
2480.protected:
2482 . } ;
A clase abstracta IIMgr utilizada como clase base dos xestores de entrada e no seu
constructor crease a porta de enlace utilizada para a conexin do xestor coa mquina virtual. En
canto s clases IMgr e OMgr, son as que proporcionan as implementacins por defecto do
mtodo onlnputMessage (lia 2481) para os xestores de entrada e sada, respectivamente. Esta
implementacin se encarga de encamiar as mensaxes recibidas porta de enlace de sada que
corresponda, dacordo do tipo de xestor do que se trate.
A clase OMgr implementa ademais o manexo das portas de enlace utilizadas para conectar o
xestor aos "drivers" de sada. Esta clase redefine os mtodos connect (lia 2014) e disconnect
(lia 2015) de xeito que as portas de enlace son creadas e destrudas dinamicamente cada vez
que se realiza ou elimina unha conexin entre o xestor e os "drivers" de sada. Cada porta de
enlace creada dinamicamente identificase co nome do "driver" ao que estea conectada. Este
identificador utilzase para determinar a qu porta de enlace enviar as mensaxes recibidas polo
xestor de sadas (cada mensaxe contn o nome e valor da varibel a actualizar e o identificador
do "driver" de sada no que est asignada).
Os xestores implementados polas clases IMgr e OMgr unicamente proporcionan a
funcionalidade de encamiar as mensaxes intercambiadas entre a mquina virtual e os
dispositivos de E/S. Sen embargo derivando novas clases das explicadas anteriormente
posbel implementar xestores que proporcionen outras funcionalidades adicionais, como por
exemplo:
311
Ntese que os xestores de E/S derivan da clase IModule (7.1.1.1), polo que poden ser
substitudos en tempo de execucin utilizando a tcnica explicada en (7.1.1.5) para cargalos e
descargalos dinamicamente en memoria dende unha DLL.
312
Mquina virtual
Xestor sada
(simulacin)
Xestor entrada
(simulacin)
Valores de
sada
Entradas
simuladas
.........N
^^
Secuencias
pregrabadas
Simulador remoto
"Driver" de
entrada
"Driver" de Driver" d
sada
simulacin
"Driver" de
safda
Valores de
safda
^^.........^ Simulador remoto ........^
^^
Rexistro das
Secuencias
sadas
pregrabadas
(b)
Entradas
simuladas
.^
Rexistro das
sadas
(a)
Driver" de
entrada
Figura 7.15. Tcnicas para a simulacin de E/S na mquina viriual: a) utilizando un xestor de E/S; e b) utilizando
un "driver".
r----------'---------------^
Vsualizacin sadas i
(p.e. Excel)
Simulacin proceso
(p.e. Matlab)
DDE
DDE
i
Visualizador sadas
(p.e. HP VEE)
Mquina virtual
OPC
UDP
TCPfl P
Simulacin entradas e ^
Mquina virtual
animacin do proceso Conexion;
(p.e. LabView)
en sene ^---
Os participantes nun ambiente como o mostrado na Figura 7.16 poden clasificarse en das
categoras non excluntes dependendo do seu papel no intercambio de informacin de
simulacin:
l. Os productores de valores de entrada simulados (p.e. simuladores de paneis de operador,
simuladores de proceso, etc.).
2. Os consumidores de valores de sada (p.e. animacins grficas do estado do proceso,
aplicacins de anlise de datos, etc.).
313
O intercambio de informacin pode, polo tanto, modelarse como unha interaccin entre un
conxunto de productores e consumidores de valores de simulacin. Esta interaccin estar
regulada por un mediador [67] que cumprir das funcins:
DDE
r---------------------------------,
Vsualizador sa(das i
^
(consumidor)
.
UDP
OPC
aimwaaon emraaas e ^
DDE ^ Mediador
Mquina virtual
; (productor/consumidor)
Mediador
;
;
TCPflP
z
Mediador
Visualizacin sadas
(consumidor)
---------------------------^
Simulacin proceso
(productor)
,
UDP
Mquina virtual
( produ ctor/consumidor)
Figura 7.17. Ambiente de simulacin distribudo utilizando o patrn Productor / Mediador / Consumidor.
A Figura 7.18 mostra a estructura dos dous tipos de mensaxes utilizadas no intercambio de
informacin de simulacin. O primeiro tipo de mensaxe enviado por cada participante no
momento de conectarse ao mediador, e est formado polos seguintes campos:
1. Un indicador booleano (1 byte) que indica se o participante quere recibir valores.
2. Un indicador booleano (1 byte) que indica se o participante vai enviar valores.
3. Os nomes das varibeis das que o participante quere recibir valores.
O segundo tipo de mensaxe o utilizado para intercambiar os valores simulados, e est
formado polos seguintes campos:
1. O nome da varibel.
2. O tamao do valor da varibel (4 bytes).
3. O valor da varibel.
314
Parmetros da
simulacin
recv?
send?
Valores de
simulacin
var
name
value
size
var 1
name
var 2
name
var_N
name
value
size
Figura 7.18. Formato das mensaxes utilizadas para o intercambio de informacin de simulacin.
:Simulador
:Mediador
:Virtual Machine
recv? send? var 1.__._ var_N
recv?
send?
2484. {
2486.
const SimulationDataSeq& data) = 0;
2488 . } ;
Esta interface declara os mtodos onReceive (lia 2485), que ser invocado cada vez que se
reciban valores simulados a travs dalgunha das conexins abertas do mediador, e
buildLinkPoints (lia 2487), mtodo utilizado para crear os puntos de acceso do mediador. Os
315
puntos de acceso son creados invocando este mtodo durante a iniciacin do mediador e
suponse que non se modifican durante a vida deste. Poderan definirse mediadores que
permitiran a construccin e destruccin dinmica dos puntos de acceso mediante a utilizacin
de mtodos constructores ("factory methods" [67]) en clases derivadas de ISimulationServer.
ISimulationServer I
^ mediator link^oint
connection end
ISimulat ionLinkPoint
ISimulationSenrice
link^oint
ISimulationLinkPoint
2491.protected:
2493.
2494.public:
0;
0;
Os mtodos addConnection (lia 2492) e removeConnection (lia 2493) son utilizados para
engadir e eliminar conexins entre o mediador e os participantes; onReceive (lia 2495) e
onDisconnect (lia 2496) son mtodos pblicos invocados dende as conexins para procesar a
recepcin de datos e a finalizacin da conexin, respectivamente; e finalmente, o mtodo
broadcastData (lia 2497) invocado dende o mediador para enviar datos a todas as conexins
dun punto de acceso.
Por ltimo, a clase abstracta ISimulationService modela cada conexin establecida entre o
mediador e os participantes. Esta interface declara mtodos que sern invocados dende o punto
de acceso para o envo e recepcin de valores:
2499.struct ISimulationService
2500. {
virtual bool getPendingData(SimulationDataSeq& data) =
0;
0;
2501.
ISimulationSeroer
316
Thread
link^oint
ISimulationLinkPoint
TCPSimulationServer
address : InetHostAddress I server
vmport : tpport_t
procport : tpport_t
TCPSocket
(from Common C++)
connection end
1
TCPSimulationLinkPoint
ISimulationSenrice
vm side
process_side
TCPSession
(from Common C++)
_Mutex_
data
TCPSimulationSerrice
params
send_buf
SimulatonDataQueue
Simulation0ata
name : string
size : unsigned
value : char[]
_ recv_buf
t
SimulationParameters
receive : bool
send : bool
Figura 7.21. Diagrama das clases utilizadas para implementar o mediador TCP/IP.
^4 Os detalles da implementacin deste VI non foron incluidos como parte desta documentacin.
317
^
i^
^Q^ ^ ^
g
b
$^L
i^
^n
^
asy ^e i:
^
i
0 ^^
^^
^^ ^ ^ i
^
^
.^ ^
i
^ ^
5 ^^-^ i
9
^ 6 ^ ^ I
@ S ^ ^ ^
^ ^ ^^^^ i
^ II^ ^ i
L ^ ^ ;
vj
^;
;^
Figura 7.22. Secuencia de mensaxes do intercambio de informacin de simulacin utilizando un mediador TCP/IP.
318
DeviceDriver ^
(from Devioe Driver)
DriverSimulator
inputs : unsigned
outputs : unsigned
buildService( )
IDriverService
simulator
service onReceive( )
data
params
VMProcess
(lrom Proceses)
_Mutex_
(from Common C++)
TCPDriverSimulator
address : InetHostAddress
port : tpport_t
buildService( )
data
^
SimulatonDataDueue
recv_buf
d buf',
SimulationData -sen
TCPStream
name : string
size : unsigned
value : char[]
TCPDriverSenice
SimulationParameters
1
DriverSeroice
receive : bool
send : bool
var_ids : list<string>
Figura 7.23. Diagrama das clases utilizadas para a implementacin dun "driver" TCP/IP de simulacin.
319
^buildService(params, data)
create ( address, port, params, data, this)
---------------------------------------------------------------------+^ :TCPDriverService
Start()
iopoints[opoint].value = value
iopoints[opoint].size = size
data.send_buf. push_back(iopoints[iopoint])
Run()
values = data.send_buf
send_buf.dearQ
['for all value (v) in values]
v.name, v.size, v.value
^--------------------------------------------------------------*
- -
onReceive()
'a', 2, [valor]
--
- - -------------------
notifiqtion
onHandlerQ
values = data.rew buf
data.re^ buf.dear()
/' Procesar valores redbidos '/
^
Figura 7.24. Secuencia de mensaxes do intercambio de informacin de simulacin utilizando un "driver" TCP/IP.
320
Como se mostra na Figura 7.25, a clase DriverSimulator mantn internamente dous mapas,
un con informacin sobre as varibeis asignadas a puntos de E/S -agregacin vars-, e outro
cos ltimos valores recibidos ou enviados en cada punto de E/S que tea unha varibel
asignada -agregacin iopoints-. Os mtodos que modifican a asignacin de varibeis a
puntos de E/S (schedulelnput, schedule0utput, unschedulelnput, unschedule0utput, e
unscheduleAll) son redefinidos de xeito que se mantean correctamente actualizados estes
mapas cada vez que se realice ou elimine unha asignacin.
SimulationData
name : string
size : unsigned
value : char[j
#Aop
'l
iopoint_name : string
DriverSimulator
Akars
^ar_name : string
AssignedVarlnfo
iopoint : string
value : +roid'
size : unsigned
clbk_arg : void'
void* value,
2505.
unsigned size,
2506.
pfn callback,
2507.
IAsyncClbkArg* clbk_arg)
2508.
2509. {
2510. // obter varibel asigaada ao punto de E/S
var_info.value = value
2515.
var_info.size = size
2516.
2517. }
321
2518.DriverSimulator::OnHandler(void* arg)
2519. {
2520.
2521.
2522.
2523.
2524.
2525.
2526.
2527.
2528.
2529.
2530.
2531.
2532.
2533.
2534.
2535. }
data.EnterMutex()
sim_values = data.recv_buf
data.recv_buf.clear()
data.LeaveMutex()
var_info = vars[sim_value.name]
iopoints[var_info.iopoint] = sim_value
if (var info.clbk_arg)
DeviceDriver::OnHandler(var_info.clbk_arg)
end if
end for
void* value,
2537.
unsigned size)
2538.
2539. {
2540.
iopoint_info = iopoints[iopoint_name]
2541.
2542.
value = iopoint_info.value
2543. }
void* value,
2545.
unsigned size)
2546.
2547. {
2548.
2549.
2550.
iopoint_info = iopoints[iopoint_name]
iopoint_info.value = value
2551.
2552.
2553.
2554.
2555.
iopoint_info.size = size
data.EnterMutex()
data.send_buf.push_back(iopoints[iopoint_name])
data.LeaveMutex()
2556. }
322
^n
Base de datos
de E/S
r,t
Xestores E/S
323
2558. {
2559.public:
2566.
2567.
bool synchronizeInputs();
2568.
bool synchronize0utputs();
2569.
2570.
2571.
2572.
2573.
2574.
2575.
2576.
2577.
2578.
2579.
2580.
TimedValue<T>& tval);
2581.
2562. template <class T>
2583.
2584. };
Esta interface est composta polos mtodos que permiten engadir e eliminar entradas na
base de datos (lias 2562-2564), sincronizar a imaxe do proceso cos valores actuais das
varibeis (lias 2566-2568), e acceder e modificar tanto os valores da imaxe do proceso (lias
2570-2573) coma os valores actuais (lias 2574-2577) e histricos (lias 2578-2583) das
varibeis.
A Figura 7.28 mostra a secuencia de mensaxes intercambiadas para a creacin dunha nova
entrada na base de datos (implementacin do mtodo insert). A nova entrada creada
utilizando o mtodo CreatelORTDBEntry, un mtodo constructor ("factory method" [67]) ao
324
^^----
pdcld2ptrSeq 1 ^
(trom BMe El.mentt^
viviPrOCeSS
(erom Proe.ss.s^
bind(DataElement) _
^
input_messages
^
^^T-------
IORTDBSnapshot
input_image
output image
IVMMsg
bindQIORTDBEntry) ^
IORTDB
(erom Prooeae^
IORTDBEntr Se
inputs
output_messages
IIORTDBEntry
outputs
IORTDBEntr
ddriver_id : string
iopoint_id : string
num_values : unsigned
1
process var r
\ history_values
' I:---------r
0.
^ r
T
GescaSystemVar
value : TimedValue<T>
-------;
^^T
TimedValue
^ ^
value : T
timestemp : double
Figura 7.27. Diagrama das clases que modelan a base de datos de E/S.
2586. {
2587.public:
2588.
// consulta da informacin da entrada
2589.
2590.
2591.
25^92.
2593.
2594.
2595.
2596.
2597.
2598.
2599.
2600.
2601.
2602.
2603.
2604 . }
virtual
virtual
virtual
virtual
virtual
TimedValue<T>& tval);
A interface est formada polos mtodos que permiten acceder informacin sobre a varibel
almacenada na entrada da base de datos (lias 2589-2593): tipo, tamao, nmero de valores
histricos, e"driver" e punto de E/S no que est asignada; e acceder e modificar tanto o valor
actual (lias 2595-2598) coma os histricos (lias 2599-2603) da varibel.
325
:IORTDB
insert(decl)
ded : GescaSystemVarDecl<>
entry = CreatelORTDBEntry()
create
IockDataAccess()
entrv : IORTDBEntrv<>
read = canRead()
[readl
{false}
{true}
inputs.insert(entry)
outputs.insert(entry)
f-------------------------------------^
unlockDataAccess()
Figura 7.28. Secuencia das mensaxes intercambiadas na creacin dunha nova entrada na BD.
entry = inputs[V]
2606.
if inputs[V].modified
2607.
input_image[V] = inputs[V][0]
2608.
inputs[V].modified = false
2609.
end if
2610.
2611.end for
326
:IORTDB
^ readMessageO
Iniar a lectura asfncrona
port:VMPort
port = ports.find(IMgrPort)
read(async_dbk, this)
input message
^----------------------
notification
] onHandler(msg)
IockDataAccess()
entrv : IORTDBEntrv<>
setTimedValue(msg.value, msg.time)
tYPe = tYPe^() _I
^
[tYPe =_ bool]
old_value = getTimedVal ue(1)
Se a varibel booleana e o
novo valor diferente ao
valor anterior, crear e almacenar
o evento correspondente
event:VMEvent
msg:IVMMsg
unlockDataAccess()
destroy
.X
] readMessageO
Iniar a lectura as(ncrona
dunha nova mensaxe
port = ports.find(`IMgrPort")
read(async_clbk, this)
Figura 7.29. Secuencia das mensaxes intercambiadas no procesamento das mensaxes recibidas dende o subsistema
de E/S.
7.3.2. Temporizadores
A implementacin da mquina virtual incle dous tipos diferentes de temporizadores que
son utilizados para as funcins de control do tempo que os procesos da sa arquitectura
requiran, as como para as temporizacins especificadas nos modelos executados no subsistema
de aplicacin (7.5). Todos os temporizadores da mquina virtual son implementados como
procesos que proporcionan servicios de temporizacin aos que se lles asigna a prioridade mis
alta. Debe terse en conta que a resolucin e precisin dos temporizadores dependen do soporte
proporcionado pola combinacin "hardware/software" na que se implemente a mquina virtual.
7.3.2.1. Temporizador simple
O primeiro tipo de temporizador definido proporciona un servicio bsico de temporizacin
en das versins:
327
1. Con bloqueo, o proceso que solicita o servicio bloqueado durante o tempo indicado.
2. Con notificacin de finalizacin, o proceso que solicita o servicio recibe unha notificacin
asncrona (7.1.2.4.2) cando transcorre o perodo de tempo indicado. Ademais, nesta
versin, pode solicitarse a repeticin da notificacin cunha periodicidade determinada.
Os temporizadores deste tipo implementan a interface ITimerServer:
2612.struct ITimerServer
2613. {
2616.
2617.
2618.
2619.
2620.
2621.
virtual void
virtual void
virtual void
virtual bool
virtual bool
// servicios
2622.
2623.
2624.
long period = 0,
pfn clbk = Ni7LL,
IAsyncClbkArg* clbkarg = NiJLL) = 0;
2625.
2626.
Suspend() = 0;
Resume() = 0;
Finish() = 0;
isSuspended() = 0;
isRunning() = 0;
de temporizacin
2628 . } ;
A interface declara mtodos comns aos da interface IVMProcess (7.1.2.1) para o control e
consulta do estado do temporizador. O mtodo wait (lia 2626) proporciona o servicio de
temporizacin con bloqueo e o mtodo set (lia 2622) o de temporizacin con notificacin.
Ambos mtodos reciben como argumento a cantidade de tempo a considerar. O mtodo set
recibe ademais os argumentos relacionados coa notificacin asncrona, entre eles un valor
opcional utilizado para as notificacins peridicas. A interface compltase co mtodo stop (lia
2627) que detn o temporizador. A Figura 7.30 mostra a secuencia de mensaxes das diferentes
opcins de temporizacin comentadas.
7.3.2.2. Temporizador mltiple
O tipo de temporizador explicado anteriormente non pode atender mis dunha solicitude
simultaneamente. Debido a que os temporizadores son recursos limitados nun sistema e, en
ocasins, preciso ter activas un grande nmero de temporizacins simultaneamente, definiuse
un segundo tipo de temporizador que permite a planificacin con notificacin de mltiples
temporizacins. A cada unha se lle asigna un identificador numrico que includo na
notificacin e que pode ser utilizado para deter individualmente cada temporizacin. En
contrapartida este temporizador introduce un certo "overhead" debido xestin das
temporizacins que pod non ser aceptbel en sistemas que requiran unha precisin moi alta.
Estes temporizadores implementan a interface IMultitimerServer:
2629. struct IMultitimerServer
2630. {
2631.
2632.
2633.
2634.
2635.
2636.
virtual
virtual
virtual
virtual
2637.
void
void
void
bool
Suspend() = 0;
Resume() = 0;
Fin'ish() = 0;
isSuspended() = 0;
328
// servicios de te:mporizacin
pfn clbk,
IAsyncClbkArg* clbkarg
bool deferred = false)
virtual bool unschedule(unsigned id, bool deferred
virtual void stop(void) = 0;
:VMProcess
^ ^
:VMTimerServer
:VMProcess
wait(time)
-^
time
NUI,L ,
0;
false) = 0;
:VMTimerServer
t ^
notifiation__________ ^J
^---------------^Procesar notificacin
---------------------- ,
(a)
(b)
:VMTimerServer
:VMProcess
period
notification
^--------------------------------------------------
^ Procesar nofificacin
period
notification ______________i
f--------------------------------------
^ Procesar notificacin
'
:
(c)
Figura 7.30. Servicios proporcionados polo temporizador bsico: a) temporizacin con bloqueo; b) temporizador
Do mesmo xeito que na interface ITimerServer, declranse mtodos comns aos da interface
IVMProcess para o control e consulta do estado do temporizador. A planificacin dun novo
temporizador faise co mtodo schedule (lia 2641), que recibe como argumento a cantidade de
tempo a considerar, os argumentos utilizados para a notificacin asncrona e un valor booleano
que indica se a planificacin debe terse en conta inmediatamente ou permanecer en suspenso
ata que sexa invocado o mtodo doSchedules (lia 2639). O mtodo schedule devolve o
identificador numrico asignado ao temporizador. O mtodo unschedule (lia 2645) permite
deter a planificacin dun temporizador concreto indicado mediante o seu identificador. Do
mesmo xeito que aconteca coa planificacin, este mtodo recibe como argumento un valor
booleano que indica se a parada do temporizador debe facerse inmediatamente ou manterse en
suspenso ata que sexa invocado o mtodo doUnschedules (lia 2640). A interface compltase
co mtodo stop (lia 2646) que detn todos os temporizadores planificados.
A Figura 7.31 mostra un exemplo da secuencia de mensaxes intercambiadas entre dous
procesos da mquina virtual e un temporizador que implemente a interface IMultitimerServer.
Un dos procesos inicia tres temporizadores que inicialmente estarn suspendidos ata que se
invoque o mtodo scheduleAll. O outro proceso inicia dous temporizadores, un deles
suspendido e o outro non -timer 4-. Unha vez transcorrido o tempo indicado -time 4- o
329
2649. {
2650.public:
2651. // temporizadorea
pfn callback,
2655.
IAsyncClbkArg* clbk_arg = NULL,
2656.
bool deferred = true) = 0;
2657.
2658. virtual bool unschedule(unsigned long _id, bool deferred = true) = 0;
2659. // eventos/entradas/sadas
2663.
2664.
2665.
2666.
// xeatin de erros
2668 . } ;
Como pode verse, os servicios do ncleo aos que pode accederse utilizando esta interface
son os seguintes:
1. A xestin de temporizacins.
2. O acceso aos eventos almacenados no canal de entrada do subsistema de aplicacin e aos
valores da base de datos de E/S, as como a actualizacin nesta dos valores de sada
modificados no subsistema de aplicacin.
3. A sinalizacin de erros detectados durante a execucin.
330
:VMTimerServer
...
:VMProcess
scheduleAll(),
:
__
notification (timer 4)
- - - - - - - - - - ------------------------------time 2
Procesar notficacin
time 5
unschedule(timer_1, true)
:
time_ 1
notification (timer 5)
Procesar notificacin
time 3
notification (timer 2)
t------------------------------------------------- -
^ Procesar notificacin
unschedule(timer 3, false)
notification (timer 3)
_
- ---------------------- ----- --------------------^] Procesar notificacin
331
2. As mensaxes de resposta, utilizadas pola mquina virtual para enviar datos. O valor do
cdigo destas mensaxes OK, e o seu cdigo auxiliar maior ou igual a un.
3. As ordes, mensaxes utilizadas polo cliente que accede remotamente mquina virtual para
solicitar un servicio. As ordes poden ser simples, formadas por unha soa mensaxe, ou
mltiples, formados por varias mensaxes. Neste caso utilzase a mensaxe que tdelimita o
final dunha orde mltiple (mensaxe CMD_END) para indicar cal a ltima mensaxe da
orde.
Cabeceira
Cdigo
Cdigo
auxiliar
param_1
param_2
Num
params
param_N
TamaRo Valor
param param
Figura 7.32. Formato das mensaxes utilizadas no acceso remoto aos servicios da mquina virtual.
OK
FAI L
error
code
Mensaxes de control
Mensaxe
de datos
OK
params
param_1
param_2
param_N
param_1
param_2
param_N
Mensaxes de resposta
Orde
con datos
code
0/1
params
code
Ordes
Figura 7.33. Tipos de mensaxes utilizadas no acceso remoto aos servicios da mquina virtual.
332
3. Peticin, cunha orde mltiple, dun servicio que non devolva resposta (Figura 7.34.d). O
cliente enva mltiples ordes co mesmo cdigo. Cada unha destas ordes poder conter
parmetros ou non, mais o valor do seu cdigo auxiliar ser maior ou igual a un. O final da
orde mltiple se indica co envo dunha mensaxe CMD_END. A mquina virtual devolver
OK! ou FAIL despois de cada mensaxe recibida, dependendo do resultado da
comunicacin e da execucin do servicio.
'
4. Peticin, cunha orde mltiple, dun servicio que devolva resposta. Este caso unha
combinacin dos dous anteriores.
Ntese que a mquina virtual unicamente enva mensaxes con cdigos OK ou FAIL e que o
cliente sempre agarda a recibir unha destas mensaxes antes de enviar a sa seguinte mensaxe.
^Client
:Virtual Machine
code p params param_1
:yrtual Machine
:Client
param_N
code
params param_1
param_N
FAI L err 0
OK 0 0
f
(b)
(a)
:Virtual Machine
:Client
code 0 params param_1
param_N
OK 1 params param_1
param_N
OK 1 params param_1
param_N
:Vrtual Machine
^C ie t
code 1 params param_1
param_N
OK 0 0
code 1 params param_1
param_N
OK 0 0
OK 0 0
code 0 0
(C)
OK 0 0
(d)
Figura 7.34. Protocolo de intercambio de mensaxes no acceso remoto aos servicios da mquina virtual: a) orde
simple sen resposta (resultado correcto); b) orde simple sen resposta (resultado errneo); c) orde simple con
resposta; e d) orde mltiple sen resposta (resultado correcto).
333
334
Desconectar ao cliente da mquina virtual, deixando a conexin libre para que un novo
cliente poda acceder aos servicios remotos.
,
Apagar a mquina virtual, detendo a sa execucin e eliminando os recursos que ocupe
na memoria.
2670. {
2671.
2672.
2673.
2674.
2675.
2676.
2677.
2678.
2679.
2680.
2681.
2682.
2683.
2684.
2685.
2686.
2687.
2688.
2689.
2690.
2691.
2692.
2693.
2694.
2695.
2696.
2697.
unsigned opts) = 0;
// xestin de configuracins
ModuleConfiguration& conf) = 0;
ModuleConfSeq& conf) = 0;
2698.
virtual bool activate(const string& module,
2699.
const string& conf,
2700.
const string& type,
2701.
const string& name) = 0;
2702.
virtual bool deactivate(const string& module,
2703.
const string& conf,
2704.
2705.
const string& name) = 0;
2706.
2707.
2708.
335
2709.
2710.
2711.
2712.
virtual bool shutdown() = 0;
2713 . } ;
TCPSocket
IVMServer
TCPIPVMCIient
stream
TCPStream
stream
VMProcess
(from ProoeaK
TCPIPVMSeroer
send_comms
^
VMCommand
code : unnsigned
aux code : unsigned
param_size : unsigned
params : deque<string>
recv_comms
1'
Figura 7.35. Diagrama das clases utilizadas para modelar o acceso dun cliente aos servicios remotos da mquina
virtual.
2715. {
2716.
// control de estado
2717.
virtual void Start() = 0;
2718.
2719.
virtual void Resume ( ) = 0;
2720.
virtual bool isSuspended() = 0;
2721.
2722.
virtual bool isRunning() _ 0;
// recepcin de measaxes
2723.
2724.
2725.
2726.
2727.
2728.
2729.
2730. }
= NLTLL ) = 0 ;
// envo de mensaxes
Ademais dos mtodos que permiten controlar o estado do proceso (lias 2717-2722), esta
interface declara mtodos para solicitar unha notificacin asncrona cando se reciba unha
mensaxe -mtodo onCommand (lia 2724}-, para recuperar as mensaxes recibidas -mtodo
getCommand (lia 2725}- e para enviar as mensaxes de resposta -mtodos ok (lias 2727 e
2728) e fail (lia 2729^.
7.4.4.1. Implementacin do acceso remoto en redes TCP/IP
O mecanismo de acceso remoto mquina virtual en redes TCP/IP implementouse nas
clases TCPIPVMCIient e TCPIPVMServer, derivadas das interfaces IVMClient e IVMServer
respectivamente. A comunicacin entre as instancias destas clases realzase mediante instancias
da clase TCPStream, pertencente librara Common C++ ( 1.3.2). Esta clase representa unha
336
conexin entre un cliente e un servidor TCP, e permite o envo e recepcin de datos mediante
os operadores e, do mesmo xeito que se fai nos "streams" C++. As instancias da clase
TCPIPVMServer son procesos da mquina virtual que proporcionan un servidor TCP que
implementa a xestin do envo, recepcin e almacenamento -agregacins recv_comms e
send_comms- das mensaxes intercambiadas pola mquina virtual cos seus clientes. A clase
TCPSocket, tamn pertencente librara Common C++, proporciona un servidor TCP bsido a
partir do cal se implementa o resto da funcionalidade da clase TCPIPVMServer.
O diagrama da Figura 7.37 mostra a secuencia de mensaxes entre as instancias que
implementan o mecanismo de acceso remoto aos servicios da mquina virtual para realizar a
carga dunha DLL. A mquina virtual configura o servidor TCP para recibir unha notificacin
cada vez que se reciba unha orde e despois inicia a sa execucin invocando o seu mtodo Start
(lia 2717). A solicitude do servicio remoto iniciada coa chamada ao mtodo loadDll (lia
2672) na instancia da clase TCPIPVMCIient. A implementacin deste mtodo crea a orde a
enviar mquina virtual, envaa a travs do "stream" TCP e agarda a mensaxe de resposta.
Cando a orde recibida no servidor TCP, almacnase na cola de ordes recibidas -agregacin
recv_comms- e unha notificacin enviada mquina virtual. Esta recupera a orde recibida
chamando ao mtodo getCommand (lia 2725), a interpreta e executa o servicio solicitado. En
funcin do resultado da execucin a mquina virtual chama aos mtodos ok (lias 2727 e 2728)
ou fail (lia 2729) no servidor para enviar unha mensaxe de resposta. Estes mtodos crean a
mensaxe correspondente, almacnana na cola de mensaxes de sada -agregacin
send_comm- e sinlanlle ao servidor a presencia dunha nova mensaxe. Este recupera a
mensaxe e envaa ao cliente a travs do "stream" TCP.
7.4.4.2. Implementacin do acceso simultneo a mltiples mquinas virtuais
Para facilitar o desenvolvemento de aplicacins distribudas, definiuse un conxunto de
clases que permiten xestionar o acceso simultneo a mltiples mquinas virtuais dende un
cliente. O diagrama da Figura 7.36 mostra as clases utilizadas para modelar esta funcionalidade
e implementala utilizando mltiples "threads" e o protocolo de comunicacins TCP/IP.
A xestin das mltiples conexins que un cliente pode establecer simultaneamente cunha
mquina virtual son manexadas nunha secuencia de execucin independente que implemente a
interface IVMConnectionMgr, que proporciona mtodos para iniciar e finalizar conexins coas
mquinas virtuais e para acceder aos servicios que estas proporcionan:
2731.struct IVMConnectionMgr
2732. {
2733.
// conexins
2734.
2735.
virtual bool disconnect(IVMachineInfo* vm) _ 0;
2736.
// carga e descarga de DLLs
2737.
virtual bool loadDll(IVMachineInfo* vm,
2738.
const string& name,
2739.
const string& path) = 0;
2740.
virtual bool unloadDll(IVMachinelnfo* vm, const string& name) = 0;
2741.
virtual bool unloadAllDlls(IVMachinelnfo* vn ) = 0 ;
2743.
2744.
2745.
2746.
2747.
2748.
ModuleConfiguration* conf) _ 0;
337
2749.
2750.
2751.
2752.
2753.
2754.
2755.
2756.
2757.
2758.
2759.
2760.
2761.
// xeatia de mduloa
2762.
2763.
2764.
2765.
2766.
2767
};
Como pode comprobarse, os mtodos desta interface coinciden cos da interface IVMClient75
coa diferencia de que teen un parmetro mis para identificar a mquina virtual que van
dirixidas as solicitudes de servicio. Cando un cliente solicita un servicio, pasa como parmetro
unha instancia que implemente a interface IVMachinelnfo e que contea, como mnimo, o
identificador alfanumrico da mquina virtual, o enderezo numrico utilizado para establecer
unha conexin con ela, e un apuntador ao cliente que realiza a solicitude7. As clases derivadas
poden inclur outras informacins especfcas do sistema de comunicacins utilizado.
IVMReqest
NMConnectianMgr
^ getld( )
getVMachine( )
Thread
getParam( )
(from Common C^^)
^
TCPSession
(fiom Common C++)
4^
NMConnection
connectiov yylConnectionM r
vniRequeSt
id : unsigned
params : deque<string>
o-uests
req
vminfo
TCPIPVMConnection
^connection
1 name : string
TCPIPVMCIientSession
^1 session address : in addr
manager
^-
TCPIPVMConnectionMgr
1
IVMachinelnfo
vmachine
Decorator '
Component
^_^,.
vminfo
{Pattem}
Decorator = {
Component,
Decorator
}
client
IClientApplication
getName( )
getAddress( )
onMessage( )
^
frCPIPVMachinelnfo
TCPIPVMCIient
1
getPort()
TCPIPVMachinelydo
name : string
address : long
port : unsigned
Figura 7.36. Clases utilizadas para modelar o acceso dun cliente a mltiples mquinas virtuais en redes TCP/IP.
75 A principal diferencia que nesta interface os mtodos de IVMClient utilizados para consultar a informacin
sobre os mdulos, configuracins e"drivers" de E/S da mquina virtual son substituidos polo mtodo getVMlnfo.
'b Representado na Figura 7.36 mediante a interface IClientApplication, que se deixou sen especificar
intencionadamente.
338
^
^
fi
^
T
-I
^^
E ^y
E
^
$^ i
^^
^ ^-^^ ..,..
^9
^
0
^
^
a
Figura 7.37. Secuencia de mensaxes intercambiadas no acceso aos servicios remotos da mquina virtual nunha
rede TCP/IP.
339
2769. {
2770. // conexibna
2771.
2772.
virtual bool disconnect() = 0;
2773.
// carga e descarga de DLLs
2774.
virtual bool unloadDll(const string& name) = 0;
2775.
virtual bool unloadAllDlls() = 0;
2776.
2777.
// xeatin de configuracins
2779.
2780.
virtual bool selectConf(const string& part, const string& conf) = 0;
// xestin de mbdulos
2781.
virtual bool addModule(const string& part,
2782.
const string& conf,
2783.
const string& type,
2784.
const string& module) = 0;
2785.
virtual bool removeModule(const string& part
2786.
const string& conf,
2787.
const string& type,
2788.
const string& module) = 0;
2789.
// consulta da estructura da mquina virtual
2790.
virtual bool getVMInfo(VMArchitectureInfo* p2nfo) = 0;
2791.
// finalizacin da execucin da mquina virtual
2792.
virtual bool shutdown() = 0;
2793.
0;
2794. };
340
do servicio solicitado se lle indica ao cliente invocando o mtodo onMessage (Figura 7.36) da
instancia da clase derivada de IVMachinelnfo recibida omo parmetro da solicitude. Esta
instancia mantn un apuntador ao cliente que solicitou o servicio, que ser notificado da
finalizacin do mesmo. A implementacin actual da clase VMConnectionMgr ten a limitacin
de bloquearse durante o procesamento dunha solicitude ata que esta remate. En futuras versins
poderan implementarse xestores que procesen mltiples solicitudes simultneas, incorporardo
a cada conexin a capacidade de almacenar as solicitudes e notificarlle ao xestor a sa
finalizacin.
341
2. A mquina virtual introduce unha latencia entre o instante no que un "driver" obtn un
valor de entrada e o instante no que o subsistema de aplicacin recibe-^ o evento
correspondente. O valor deste retardo varibel e dbese ao "overhead" introducido polo
subsistema de E/S e o ncleo da mquina virtual no procesamento dos valores de entrada.
7.6. Conclusins
Neste captulo describiuse a arquitectura e o funcionamento da mquina virtual que da
soporte execucin dun interprete Grafcet para a interpretacin dos modelos de usuario. A
flexibilidade e portabilidade da arquitectura permite a sa utilizacin en diferentes sistemas e
con mltiples dispositivos de E/S. Explicronse as tcnicas implementadas para utilizar a
mquina virtual en ambientes de simulacin distribudos e os servicios remotos que
proporciona para a xestin da sa configuracin e o control do seu funcionamento. Tamn se
describiron os servicios bsicos proporcionados pola mquina virtual, como a xestin de
eventos e temporizacins ou a consulta, almacenamento e actualizacin dos valores do proceso.
Anda que a mquina virtual foi deseada inicialmente coa intencin de executar un
intrprete Grafcet, a arquitectura resultante proporciona un ambiente cos servicios precisos para
implementar e executar outras aplicacins dirixidas por eventos. Un dos aspectos que se
describiron en detalle no captulo foi como realizada a interaccin entre o subsistema de
aplicacin e o proceso, poendo de relevo os diferentes tipos de aplicacins soportados e
indicando as latencias introducidas pola mquina virtual e as consecuencias na sa aplicacin
en sistemas con restriccins temporais estrictas. Para reducir en parte este problema describiuse
unha tcnica implementada nos "drivers" de E/S baseada na monitorizacin de entradas.
Entre as melloras que poderan implementarse en futuras versins poden citarse as
seguintes:
1. A implementacin dun mecanismo que permita configurar a resposta do sistema en caso de
producirse un desbordamento das colas de mensaxes almacenadas nos canais de
comunicacin.
2. O soporte utilizacin dalgunha linguaxe de definicin de "drivers" de E/S ou mtodo
semellante, que permita reaproveitar as especificacins utilizadas noutros sistemas.
3. A substitucin das comunicacins baseadas no intercambio de mensaxes pola utilizacin
dalgunha infraestructura para o soporte a distribucin de obxectos como a proporcionada
por CORBA [126].
Por ltimo indicar que a versin actual da mquina viriual non incle un mecanismo
especfico para a comunicacin directa entre mquinas virtuais que permita a execucin
distribuda de Grafcets. Ntese sen embargo que posbel implementar este mecanismo
utilizando a mesma tcnica empregada para a simulacin de E/S, intercambiando informacin
entre as mquinas virtuais a travs de "drivers" de E/S implementados a tal efecto.
342
C
y
^
n
^I
.;i
ni
n:
i m
F;
^^
`m
OG
'I
Vj
i ^
ac m
mm
m ^
m "
^
^^
u`^
m
' m
m^
^s
mE
^a
^ m
U u
ag
^ ^
Figura 7.38. Secuencia das mensaxes intercambiadas para a creacin dunha conexin coa mquina virtual.
343
1_-""_-"'
8_
f^l , , L
E
^
m
E
^
^
t
v
0
^
E
^
^'
m
^
^
^
E
m
0
d
0
m
^ E =
^
p^
^
m
^
^
^^ p
r ^ ^ o
W
cW
>
n
^ ^ m ^
^ ^ $
^ n ^ n
^ r^$> ^
qO
....................................................................
^ j O
"
^a
^ ^
^
^9
v^
:
u
J
q
^
o
_'
sp
^
^i
ye
^$
^E
a
Z
o_
$$
gS
^^
Figura 7.39. Secuencia das mensaxes intercambiadas para a solicitude de carga dunha DLL na mquina virtual.
344
A'
AI
C
O^
F ^
^
^
^- I
^
pi
i
V'
:. :
VI
II
a>i
ml
ar
^
d
7
aci
^ 7 (p
4/ C f0 >
E ^ > '
^ _VI>
0
^ ^ ^
`m a^
vi^ >>
`m ^n.^
m
>
^^mm;t
Ev>d^
l0 '.^-'
E 1 >I `m
p O ^ >
m o
^a c
E lo >^ ^ ^ ^
lp
A O ^ v
>
;^^ 3 >
m u ^ '
m`
^u >Ij
>
`m $.n,^
d^^^
aci
mm^ >
^>dy a^
m
>
aci
a>>
m $n.^
aci^^^
^^mm^
E v > a/ 9
aci
m
U C
@
UC
QI
N :_
N C N >
>
aci^`>>
^ ^ lO
d C f0 >
U
N :^
(p
C
d
c1
Ot,^
; ^
U (p
p I d
^ (^p
i ^
I 11
V I O1
V I N
N
II
O1
C I II
V ^ O1
^.
rn
E
^
.;
N
E
^
^v31
E
d
rn
^ '
A i
F i
c^
o;
cI
o;
c^
ol
U^ _
I _
p i ^
G' U
I ^
C' N
Vj
V I 11
^ m
C i d
y^
V ' II
^ ^
^ i N
V^
V I II
^I
JI
N
4%
^
a
,_,
^
>
^
>
`m
>
^
>
`m
>
1
rn
^
>
u
rn
^
w
}
i1f
C
0^
0^
a^
o_ N
a^
Figura 7.40. Secuencia das mensaxes intercambiadas para o procesamento dun evento detectado no proceso nunha
aplicacin dirixida por eventos.
345
Q V
E^
^
^^
c
m
E^
~^
~^
^
^
d
^
d
a>i
n
^
m
a'^
^
> ^
^
y ^
^m d
d m> a>i
E ^o> - v
A O^I > ^=
aio
^^ ^^
^u >w
^
d ^
^ ^
^To
^
d m> a>i
^
ip
>
-
l0 :t
^=
l0
>
-
i" >w
'
^ GI
m^
m` ^'I ^
^^.>>
^
` :
mm
^^>d ^
V 41
l0 :t
>
?
'^
?'^ >w
^
a^
>
a^
^y.>>
m m;^
`
^^>d ^
E ^o> -^
A O^^
'
`m q ^
a^
^i>m`
^ >
^
>
ti^
3
' ^
`m ' u ^
^,'>>
d^
E A>
A O^^
^
d ^
^ ^
^N
^
m m> a>i
l0 ^
^
l0
>
'
^
a^
>
a^
^ Q1
-^
^
A^
AI
A^
c;
AI
c;
o;
AI
A^
c;
p ^ ^
F ^ v
wi
N
^
V^^
^ ^ N
p ^ ^
;u
v^ rn
v
^ I ^
j II
v : rn
v ^
^ ^i
I
^
oi
rn
^
v^
rn
^
rn
E
d
.^
3
a^
.^
E
m
.^
3
^i
^
o;
a^
A i
^
i ^
o;
; ^
C ^ N
V,
V : II
^ i l0
y I d
II
V ; II
rn
[
^
N
IN
a^
d
.C
m
7
N
>
;E
^
^
N
N
'C
3
N
>
^
'
3
m
7
N
>
m
^
W
>
N
>
W
>
IT
e
m^
v^
m^
v^
O N
Figura 7.41. Secuencia das mensaxes intercambiadas para o procesamento dun evento detectado no proceso nunha
aplicacin cclica.
Captulo 8 . O intrprete de
modelos Grafcet
2.
3.
4.
5.
Dende o punto de vista do manexo dos eventos o intrprete ten unha semntica RTC, na que
non se teen en conta os novos eventos que se produzan durante unha evolucin do modelo ata
que esta remate. Esta semntica xunto coa comunicacin mediante o paso de mensaxes garante
que non se produzan conflictos ("race conditions") durante a execucin do intrprete.
O ritmo ao que se procesan os eventos do proceso depende do tempo de ciclo do intrprete,
que varibel e dependente do modelo Grafcet interpretado. Isto implica que teoricamente s
poda garantirse a reactividade do intrprete en procesos cun ritmo de cambio inferior ao do
tempo de ciclo mximo. En (3.3.2.4) descrbese un algoritmo de interpretacin Grafcet que
garante a reactividade supoendo o caso ideal no que este tempo instantneo comparado co
tempo de resposta requirido polo proceso (hiptese de causalidade nula). Sen embargo na
prctica esta hiptese ideal relxase, e considrase que o interprete garante a reactividade se o
seu tempo de ciclo inferior ao tempo de resposta mximo pennitido polo proceso (esta
aproximacin semellante utilizada nos PLCs). En (7.2.1.4.2) explcase unha tcnica que
utiliza os tempos de monitorizacin das varibeis de entrada para reducir en parte este
problema.
O intrprete Grafcet foi deseado aproveitando o mecanismo de substitucin dinmica de
mdulos (7.1.1.5) para configurar diferentes aspectos da sa arquitectura, como a obtencin
dos eventos do proceso ou o tipo de semntica (3.3.2.2) a utilizar na interpretacin dos
modelos. O resultado un intrprete cunha arquitectura flexbel que pode ser utilizado en
diferentes aplicacins, como por exemplo: a simulacin e control de sistemas dirixidos por
347
348
349
2796. {
2797.
// control do estado do intrprete
2798.
2799.
virtual void Suspend() = 0;
2800.
virtual void Resume() = 0;
2801.
virtual void Finish() = 0;
2802.
virtual bool isSuspended() = 0;
2803.
virtual bool isRunning() = 0;
2804.
// control da execucin do modelo Grafcet
2805.
virtual bool unloadMOdel(const string& id) = 0;
2806.
virtual bool playModel(const string& model, // modo continuo
2807.
TimeScale ev,
2808.
TimeScale st,
2809.
bool act,
2810.
bool retrig,
2811.
IVMServices* vm) = 0;
2812.
2813. . virtual bool playModel(const string& model, // modo paso a paso
TimeScale ev,
2814.
2815.
2816.
2817.
2816.
2819.
2820.
TimeScale st,
bool act,
bool retrig,
IVMServices* vm,
pfn callback,
2821,
virtual bool stopModel(const string& model) = 0;
2822.
virtual bool abortModel(const string& model, unsigned err_code = 0) = 0;
2823.
2824 . } ;
Os mtodos declarados nas lias 2798-2803 son comns aos declarados na interface
IVMProcess (7.1.2.1) para o control e consulta do estado de execucin dun proceso. A carga e
descarga de modelos Grafcet na memoria do intrprete realzase mediante os mtodos
IoadModel (lia 2805) e unloadModel (lia 2806). Os modelos Grafcet estarn representados
utilizando o formato xerado polo compilador Grafcet (6.4). Os demais mtodos son os que
controlan a execucin do modelo. O mtodo playModel, que ten das versins, utilizado para
iniciar a execucin do modelo, unha versin o executa de forma continua (lia 2807) e a outra
(lia 2813) o executa no modo paso a paso (ciclo a ciclo). Esta segunda versin enva unha
notificacin asncrona (7.1.2.4.2) mquina virtual cada vez que remata unha evolucin do
modelo e agarda a que se invoque o mtodo nextModelEvolution (lia 2821) para iniciar a
seguinte. Os atributos do mtodo playModel permiten configurar a interpretacin do modelo
segundo se explica en (8.3.2). Os mtodos stopModel (lia 2822) e abortModel (lia 2823)
serven para deter a execucin do modelo, o primeiro remata a evolucin actual antes de detelo
e o segundo deteno inmediatamente sen rematar a evolucin actual.
No que se refire as relacins de agregacin definidas para representar a estructura do
intrprete Grafcet (Figura 8.2), as agregacins input e output referencian aos xestores de
eventos e sadas respectivamente, que son modelados mediante as clases GrafcetPlayerlnput e
GrafcetPlayerOutput. A agregacin algorithm referencia ao algoritmo de interpretacin, que
unha instancia dunha clase que implemente a interface IGrafcetPlayerAlgorithm. Finalmente, a
interpretacin do modelo Grafcet representada coa clase GrafcetGame, que referenciada
mediante a agregacin game. O intrprete accede aos servicios proporcionados polo ncleo da
350
mquina virtual mantendo unha referencia -agregacin vmachine- a unha instancia da clase
IVMServices (7.3.3) que recibe como argumento do mtodo playModel (lia 2807).
IGrafcetPlayer
IStructuredStoreModule
(from Module^
VMProcess
(from Prooeaes)
ConfigurationStore
(from Modula^
StructuredModule
(from Module^
ModuleStore
(from Modulefj
GrafcetPlayerlnput
gather^olicy
react^olicy
SingleGrafcetPlaye
algorithm
output
GrafcetPlayer0utput
game
vmachine
GrafcetGam^
(from Oratcel pama)
ReactivenessPolicy
GatheringPolicy
IGrafcetPlayerAlgorithm
GrafcetPlayerAlgorithm
run^olicy
NMServices
(}rom Virtual Machina
I RunningPolicy
^evolve^olicy
1
EvolutionPolicy
Figura 8.2. Diagrama das clases utilizadas para implementar a estructura do intrprete Grafcet.
351
IModule
(irom MoCUIe^
^
I G rafc et P l a y e rAl g o rit h m
initializeGame( )
evolveGame( )
finishGame( )
^
GrafcetPlayerAlgorithm
Component _
StructuredModule
(from MoOUIe^
RunningPolicy
run()
evaluate( )
calculateTimers( )
EvolutionPolic
^ ^ ^ Decorator
SimpleEvolutionPo lic
Com oundEvolutionPolic
WoSR
ReactivenessPolicy
^
D ef a u I t R e a ct ive n e s s P o I i c y
evolve( )
DefaultRunningPolicy
OnUnmanagedEvents( )
OnUnexpectedEvents()
{Pattem)
Decorator = (
Component,
Decorator
}
WSR
GatheringPolicy
onlnputEvents( )
getlnputEvents( )
^
GatherAllPolicy
^
GatherFirstPolicy
Figura 8.3. Diagrama de clases dos mdulos utilizados para configurar o intrprete Grafcet.
352
b. c
2 I I 3 I
a
4
a.b
2. A ocorrencia dun evento de entrada durante unha evolucin do modelo. Como se explica en
(3.3.2.4), a interpretacin reactiva dun modelo Grafcet basease na hiptese ideal da
causalidade nula, na que o tempo de evolucin do modelo instantneo comparado co
tempo de resposta esixido polo proceso. Isto implica que non existe a posibilidade de que
se reciba un novo evento mentres se realiza unha evolucin iniciada pola ocorrencia dun
evento anterior. Sen embargo nunha aplicacin real non posbel garantir esta hiptese e
moitos sistemas funcionan proporcionando un tempo de resposta o suficientemente rpido,
comparado co do proceso, para permitir o procesamento de todos os eventos de entrada cun
retraso aceptbel.
A clase ReactivenessPolicy declara os mtodos virtuais onUnexpectedEvents e
onUnmanagedEvents que poden ser redefinidos nas clases derivadas para configurar a resposta
nas circunstancias anteriores dependendo da utilizacin que se estea a facer do intrprete. Na
" Ntese que este un exemplo simple, nun caso real habera que ter en conta tamn as condicins das
temporizacins e das accins condicionais asociadas a etapas activas.
353
// SIBPlayerAlgorithm
2826.
events = fZ)
2827.
2828.
2829.
2830.
2831.
2832.
while (!end)
process_events = getlnputEvents()
model_events = evolveGame(events)
events = model_events
end while
2833.
// NSZBPlayerAlgorithm
2834.
events = fC3
2835.
while (!end)
2836.
2837.
process_events = getZnputEvents()
events = process_events
2838.
while
2839.
2840.
2841.
2842.
(!events.empty())
model_events = evolveGame(events)
events = model_events
end while
end while
354
2. Se os cambios nas varibeis e estados das etapas do modelo despois dunha evolucin
interna son tomados en consideracin na seguinte evolucin interna ou na seguinte
evolucin externa.
3. Se utilizar ou non accins internas -includas as ordes de forzado (3.3.2.5^ durante as
evolucins internas do modelo.
A Tboa 8-I resume as diferentes configuracins que pode adoptar o intrprete utilizando os
tipos de mdulos e parmetros explicados.
355
WORST_ALL
WSR_SIE
WSR_NSIE
Mdulos
Acceso = GatherFirstPolicy
Reaccin = DefaultReactivenessPolicy
Algoritmo = SIEPlayerAlgorithm
Evolucin = WoSR
Acceso = GatherAllPolicy
Reaccin = DefaultReactivenessPolicy
Algoritmo = SIEPlayerAlgorithm
Evolucin = WoSR
Execucin = De aultRunnin Polic
Acceso = GatherFirstPolicy
Reaccin = DefaultReactivenessPolicy
Algoritmo = SIEPlayerAlgorithm
Evolucin = WSR
Execucin = De aultRunnin Polic
Acceso = GatherFirstPolicy
Reaccin = DefaultReactivenessPolicy
Algoritmo = NSIEPIayerAlgorithm
Evolucin = WSR
Execucin = De aultRunnin Poli
Parmetros
N/A
N/A
356
si I
a P
r
^----^-^----
B
@
c3
^
&
^
.6_
i
m^
^i
^ ^ ^
^^^ ^ P
"
.^
^ ^ g
8
-
^
8
,^ v ,^ II
Rg
^
"
^^
;^
^!
$^
^':
^I
4i
^;
gi
^
^
ti
357
a3ther odicv:GatherinaPalia
ym:IVMServices
react oolicv:DefaultReactivenessPolia
[nput_events. em p1yQ]
;
onUnexpeded(unexpeGed) ;
358
---------------------------------------------------------- -------------
.^
^
^
mc
>
mE
m
^
m
c
L
W
F
2
N
H
d
>
m
m
W
t
>
L
c
L
U
{O
E
>
m
E
z
^
d
E
^
E
F=
w
^
>
z
^
^
A
^
6
lq
^
^
^
^
G I
.____^ _____._*_____*__..
u
^ ^
L
C
C C
N m ^
^ W
.^
^
_ ^
.C
Om
^
m
CD
p>^.
^ m l0
d^
f./ O
^mo
wmda
9sO^^
c5 E ^i
^ococ
'oovo
W
C
{00
ma
ro
vm
m
^,coc
^ l0 ^
mx ^ ^
V V
A
mx
W W ^ ^!A
W ^y
359
aame:GrafcetGame
[un oolicv:DefaultRunninaPolicv
evolve oolia:EvolutionPolicv
evolveGame(game, vm) ;
updateEvents()
qlculateTimers(game, vm)
evolve(game, vm, run^olicy) :
storeNewEventsQ
run(game, vm)
^
360
N
N
7
i
^
a
^
--------------------^
------^ -------------- --
^. ^
^
>
^
^I
N
N
^^II
l0 .-.
> m
C
_ ^
N >
> ^
L ^p
U y
l0
y U
^ V
O V
d
C
l0
>
E
m
rn
l0
361
- -------------------------------^ -----------------------^-------------------------^^------Z
^^
>
m
E
^
W
H
Z
^
F
^
>
m
E
Z
^
W
H
Z
F
ai
c
b
a
---- -t-------------
--'------------'----'--...
Z
K
^
c
O
^
^I
m
c
^
w^
^
c
m
D)
tn
.tl
u
d
.-. Q
p
p
m
W
^
^ m
^
Z
m
^S 10
^ ^
W
d
m
q-
m
~
Z
t:
0;
C:
0^
r:
E
a
^^
^^
^m
^m
^
af ^
C
O_ ^
_j U
^^ m
vD
o f0
0
m$
^
- m
C m C
oao
V O
Em
a^m
m^
^m
m j V
m^
^
m^,^.,
^^m
mQm
^m
9
m
^
v o
oom
`;
i
vma,
gc
E
^^_O
m^
g-
^ c ^
pO
a Ip
^^
a^
om^
v^
m yW
V K>
Eoo^
o_m ^m
amo
E m
0 C
0 ^
p C
2^
'm ^
0
m
cc
o ^
^D
fA
O g
Qv
362
i1
[PO] c=k
c>=5
i+1
[P] c=c+1
i+2
true
Figura 8.11. Grafcet utilizado como exemplo.
Anda non existe un mtodo que permita solucionar este problema, requirndose unha
anlise a priori de cada modelo concreto para evitar situacins como a anterior. En [76]
proponse como regra xeral considerar que non existe un ciclo estacionario se o modelo chega
por segunda vez a unha mesma situacin cando esta sexa estbel. Esta proposta non soluciona o
problema mais coherente co algoritmo clsico. A versin actual do intrprete utiliza esta
aproximacin.
^8 Para evitar introducir aspectos innecesarios sobre a implementacin destas clases non se detalla a informacin
que conteen, sen embargo si se explica en (8.6) a forma en que esta informacin utilizada polo intrprete.
363
ForcingOrderlnfo
applyForcingOrder( )
applpForcingOrders( )
Actionlnfo
model
actions
GrafcetGame
Receptivitylnfo
1
receptivities
name : string
eventScale : TimeScale
stepScale : TimeScale
internalActions : bool
^ ^ timers
VMEvent
input_events
(from Prooesses)
time scales
Timerlnfo
GescaDataElement
(from Basio Elements)
2
GameTimeScale
^ situation : RTSituation
validated trans : RTSituation
^
events
associations
Associationlnfo
Figura 8.12. Diagrama das clases utilizadas para modelar un xogo Grafcet.
2844. {
2845.public:
2846.
// consulta e actualizacin da situacin do modelo
2847.
2848.
2849.
2850.
2851.
2852.
void getSituation(RTSituation& s,
364
2855.
2856.
void synchronizeTimeScales();
2860.
void updateTimerEvents();
2869.
bool getData(const string& id,
2870.
T& value,
2871.
2872.
2873.
2874.
2875.
TimeScale ts = TSEXTERNAL);
TimeScale ts = TSEXTERNAL);
2876.
2877.
2878.
2879.
2880.
deque<AssociationScheduleInfo>& deact_assocs,
2881.
2882.
2883.
2884.
2885.
2886.
2887. }
2889 {
2893.
initial_situation = forders.applyForcingOrders(s, 0, f^, model->static_model)
2894.
end if
2897.
// e asociacins activas.
2898. time_scales[scaleJ.setSituation(initial_situation)
2899. time_scales(scale].calculateValidatedTransitions(model->static_model)
2900. time_scales[scale].updateAssociationlnfo()
2901 . }
365
O mtodo comeza determinando cal a escala de tempo a modificar, en caso de ser a escala
interna e estar activadas as accins internas aplcanse as ordes de forzado activas na situacin
indicada, que poden modificar a situacin de partida. Coa nova situacin calculada actualzase
a informacin almacenada na escala de tempo afectada, utilizando os mtodos da clase
_
GameTimeScale que se explican en (8.5.2).
O mtodo calculateSituation (lia 2851) invocado dende a poltica de evolucin (8.4.5)
para calcular a nova situacin do modelo, recibindo como parmetros o conxunto de transicins
a franquear na situacin actual e a escala de tempo na que se realiza a evolucin. O
pseudocdigo seguinte mostra as operacins realizadas na sa implementacin:
2902.void
TimeScale scale)
2904.
2905. {
2906.
2907.
2908.
2909.
2910.
2911.
2912.
2913.
current_situation = time_scales[scale].situation
2914.
enabled,
disabled,
model->static_model)
2915.
2916.
2g17,
2glg.
2glg.
2920.
2921.
2922.
2923.
2924.
2925.
2926.
2927.
2928.
2929.
2930.
2931.
2932. }
enabled = Q)
disabled = fZ
for each transition (t) in fired_transitions
end for
end if
// calcular nova situacin
// as etapas que son activadas e desactivadas simultaneamente
// e asociacins activas.
time_scales[scale].setSituation(new_situation)
time_scales[scale].calculateValidatedTransitions(model->static_model,
fired_transitions)
time_scales[scale].updateAssociationInfo()
366
2933.void
2934.
ForcingOrderlnfo::applyForcingOrders(const RTSituation& current,
2935.
RTSituation& disabled,
2936.
RTSituation& enabled,
2937.
2938. {
2939.
2940.
2941.
2942.
2943.
2944.
2945.
2946.
2947.
2948.
2949.
2950.
2951.
2952.
2953.
2954.
2955.
2956.
2957.
2958.
2959.
2960.
2961.
2962.
2963. }
forced^artial_grafcets = QJ
// aplicar ordea reapectando aiveis da xerarqua de forzado
active_forders = model.forcing_orders[s]
if (fo.fpg in forced^artial_grafcets)
end if
forced^artial_grafcets.insert(fo.fpg)
end for
end for
end for
end for
Como pode verse as ordes de forzado son aplicadas respectando a orde dos niveis da
xerarqua de forzado. En cada nivel obtense e aplcanse as ordes de forzado asociadas s
etapas activas dos grafcets parciais do nivel. O algoritmo comproba que non se producen
situacins de forzado mltiple (3.3.2.5) almacenando no conxunto forced^artial grafcets os
identificadores dos grafcets parciais forzados polas ordes que van sendo aplicadas e
comprobando que non existan duplicados antes de aplicar unha nova orde. A aplicacin de cada
orde realzase mediante o mtodo privado applyForcingOrder da clase ForcingOrderlnfo, que
modifica os conxuntos de etapas a activar e desactivar como resultado da evolucin do modelo.
O pseudocdigo da versin simplificada deste mtodo o seguinte:
2964.void
ForcingOrderInfo::applyForcingOrder(const RTFOInfo& fo
2965.
const RTSituation& current,
RTSituation& disabled,
RTSituation& enabled,
2966.
2967.
2968.
2969.
2970. {
2971.
2972.
forced_grafcet = model.partial_grafcets[fo.fpg]
2973.
2974.
if (fo.type == FORCE_EMPTY)
2975.
2976.
2977.
2978.
forced_steps = QS
else if
(fo.type == FORCE_INITIAL)
2979.
2980.
2981.
2982.
2983.
2984.
forced_steps = fo.fsituation
end if
367
2985.
2986.
2987.
2988.
2989.
2990. }
368
cdigo C++ das condicins e accins do modelo. Ntese que a escala de tempo utilizada polos
mtodos getStepState, getModelVarEvent e getSystemVarEvent non se pasa como argumento
senn que calculada internamente en funcin dos parmetros de interpretacin do modelo
(8.3.2).
8.5.1.5. Acceso s receptividades, accins e temporizadores activos
'
Os mtodos desta categora son invocados pola poltica de execucin para obter a
informacin sobre as transicins validadas -mtodo getValidatedReceptivities (lia 2877^, e
as asociacins -mtodo getActionAssociations (lia 2879^--, accins -mtodo getActions
(lia 2882}- e temporizadores activos -mtodo getActiveTimers (lia 2883^ para a
avaliacin de receptividades (8.6.1), temporizadores (8.6.2), e a execucin de accins
(8.6.3). A informacin devolta est optimizada para reducir o nmero de operacins a realizar
dacordo tcnica explicada en (8.6.1).
8.5.1.6. Acceso s funcins co cdigo C++ de condicins e accins
Os mtodos desta categora tamn son invocados pola poltica de execucin (8.6) para
acceder s funcins que conteen o cdigo C++ das condicins -mtodo getCondition (lia
2885)- e accins -mtodo getAction (lia 2886}- do modelo.
2992. {
2993.public:
2994.
bool getStepState(unsigned long id);
2995.
bool getEvent(const string& id, bool updown);
2996.
2997.
template <class T>
2998.
template <class T>
2999.
bool setData(const string& id, const T& value);
3000.
3001.
// actualizacia da informacin da escala de tempo
3002.
void calculateValidatedTransitions(const RTStaticModel& model,
3003.
3004.
const RTSituation& fired_transitions = RTSituation());
void updateAssociationInfo();
3005.
3006 . } ;
369
3008
3009.
3010.
3011.
3012.
3013.
3014.
3015.
3016.
3017.
3018.
events.insert(VMEvent(s, true))
end for
3019.
3020.
3021. }
3024.
3025. {
3026.
3027.
3028.
3029.
3030.
3031.
3032.
3033.
3034.
3035.
3036.
3037.
3036.
3039.
3040.
3041.
3042.
3043.
3044.
3045.
3046.
3047.
3048.
3049.
3050.
candidate = 0
end for
invalidated = Q)
end for
new_validated = QJ
steps_before = t.before
new_validated.insert(t)
end if
end for
3053.
3054.
3055.
3051.
3052.
3056. }
370
Por ltimo o mtodo updateAssociationlnfo (lia 3005) actualiza o estado de activacin das
asociacins do modelo tendo en conta a nova situacin establecida na escala de tempo.
3058. {
3059.
3060.
3061.
IVMServices* vmachine,
3062.
3063.
3064.
3065.
IVMServices* vmachine,
RTSituation& fired_transitions,
3066.
3067.
3068.
3069.
3070.
3071.
3072.
3073.
3074.
3075.
3076.
IVMServices* vmachine) = 0;
3077.
3078.
3079.
3080.
3081.
3082.
3083.
3084.
3085.
3086.
3087.
3088 . } ;
371
3083 e 3084) e o acceso ao cdigo das condicins e accins do modelo Grafcet que se estea
executando (lias 3086 e 3087).
3090. {
3091.private:
RTReceptivityInfo* rec;
3092.
3093.public:
3094.
3095. } ;
Cada instancia desta clase mantn un apuntador informacin da transicin xerada polo
compilador ( 6.4) e proporciona un mtodo para avaliala. A implementacin deste mtodo a
seguinte:
3096.boo1 ReceptivityScheduleInfo::evaluate(RunningPolicy* env) const
3097. {
if (rec->receptivity.empty())
3098.
return true;
3099.
ead if
3100.
3101.
3102. }
return (env->getCondition(rec->receptivity))(*env);
O mtodo devolve true se a transicin non ten receptividade asociada. En caso contrario
devolve o resultado de executar a funcin do modelo que contn o cdigo da receptividade
accedida mediante o mtodo getCondition (lia 3086) da poltica de execucin-, pasndolle
como parmetro a poltica de execucin, que a que proporciona o acceso aos valores de
eventos, temporizadores e varibeis.
O seguinte pseudocdigo mostra unha versin simplificada da implementacin do mtodo
que calcula, para unha situacin dada, as receptividades franquebeis e as devolve no
argumento fired_transitions. Ntese que utilizado o mesmo mtodo tanto nas evolucins
internas como nas externas do modelo, os aspectos especficos de cada escala son mantidos no
xogo Grafcet.
3103.void DefaultRunningPolicy::evaluate(GrafcetGame* game,
IVMServices* vmachine,
3104.
RTSituation& fired_transitions,
TimeScale time_scale)
3105.
3106.
3107. {
3108.
3109.
3110.
validated_receptivities = game->getValidatedReceptivities(time_scale)
if r.evaluate(this)
3111.
3112.
3113.
3114 . }
fired_transitions.insert(r)
end if
end for
372
(esta informacin obtida polo compilador Grafcet). Utilizando esta informacin, para unha
situacin do modelo dada, unicamente se avalan as receptividades das transicins que pasaron
a estar validadas como resultado da ltima evolucin do modelo e, das que xa estaban
validadas, unicamente as que contean varibeis booleanas para as que haxa algn evento de
entrada significativo ( 8.3.1.2). Como exemplo considrese o grafcet da Figura 8.13, no que as
varibeis a e b son booleanas e c real.
'
1
5
(1)^c<5.0
a.b (6)
(5)
2
(2)
3
b
(3)
4
yb (4)
6
!a.(c<3.5)
($)
!a
a.!b (7)
7
b (9)
8
ya (10)
c>7.0
// transicins do modelo
T = { (1) , (2) , (3) , (4) , (5) , (6) , (7) , (8) , (9) , (10) }
// transicins con receptividades que s conteen varibeis booleaaas
3120.
3121.
3122.
//
Supase que os valores das varibeis son: a=1, b=0 e c=12.5, e que o modelo est no medio
dunha evolucin na que ven de activarse a etapa 5. A informacin almacenada no xogo sobre o
estado da evolucin ser a seguinte:
3123.
3124.
3125.
3126.
3127.
3128.
// situacin actual
S = {1, 5}
// transicibns validadas
Se se utiliza unha poltica de evolucin ARS, na que os eventos producidos pola evolucin
do modelo son considerados na seguinte evolucin interna e teen prioridade sobre os eventos
externos, a avaliacin e franqueamento das transicins do modelo producir os seguintes
resultados:
3129.
// CICLO 1
3130.
3131.
// eventos
3132.
3133.
E _ {TXS}
// tranaicins a avaliar
3134.
// transicins franquebeis
Tp = {.0^}
3135.
3136.
3137.
// nova situacin
3138.
S = {1, 5}
3139.
3140.
3141.
314 2 .
// transicias validadas
T,,,, _ { .0' }
373
3143.
3144.
3145.
// eventoa
3146.
E _ {.^}
3147.
/ / transicias a avaliar
3148.
3149.
// tranaicina franquebeis
3150.
3151.
Tf = {(1)}
// nova situacin
3152.
3153.
S={2, 3, 4, 5}
// tranaicins validadas
3154.
3155.
3156.
Neste ciclo non hai eventos, pois c non unha varibel booleana, e das transicins validadas
unicamente preciso avaliar a que contn varibeis non booleanas na sa receptividade, pois o
resultado da avaliacin das outras vai seguir sendo igual ao da ltima vez que se avaliaron,
dicir false. Como resultado da avaliacin franquease a transicin 1 e actvanse as etapas 2, 3 e
4. A evolucin continuara do xeito seguinte:
3157.
3158.
3159.
// CICLO 3
// eventos
3160.
3161.
3162.
// tranaicina a avaliar
3163.
3164.
3165.
3166.
TE _ {,^}
/ / nova situacin
S={2, 3, 4, 5}
tranaicina validadas
3167.
//
3168.
3169.
317 0 .
T,,,, _ { .^ }
Neste terceiro ciclo avalanse unicamente as transicins que veen de ser validadas pola
evolucin anterior, xa que as demais conteen nas sas receptividades unicamente varibeis
booleanas non afectadas polos eventos de entrada. Por ltimo, supase que antes do seguinte
ciclo cambia o valor da varibel a. Como esta varibel booleana o intrprete recibir un
evento a travs do canal de entrada do subsistema de aplicacin e a evolucin do modelo sera a
seguinte:
// CICLO 4
3172.
3173.
// eventos
3174.
E _ {.^a}
374
3175.
// transicins a avaliar
3176.
3177.
3178.
3179.
3180.
Tf = {(7)}
// nova situacin
S={2, 3, 4, 8}
3181.
//
3182.
3183.
318 4 .
Ti, _ { (10 ) }
transicins validadas
Neste caso, das transicins validadas sern avaliadas as de receptividades que contean
unicamente varibeis booleanas afectadas polo cambio de a, mis as que conteen varibeis
non booleanas.
Existen das consideracins adicionais que preciso ter en conta na tcnica descrita
anteriormente para a reduccin do nmero de transicins a avaliar en cada ciclo, de xeito que
poda ser aplicada en todas as situacins:
1. As transicins fonte (3.2.2.1) do modelo. Este tipo de transicins estn sempre validadas,
polo que na iniciacin do xogo Grafcet teen que inserirse no conxunto de transicins
validadas (T,,) no que permanecern ata que finalice a interpretacin do modelo. Polo
demais manexaranse do mesmo xeito que calquera outra transicin, inserndose no
conxunto Tb (lia 3119) se a sa receptividade contn unicamente varibeis booleanas ou
no conxunto T^ (lia 3122) se contn algunha varibel non booleana.
2. As transicins validadas como consecuencia das ordes de forzado que deixan de estar
activas. Considrese o modelo mostrado na Figura 8.14, no que a transicin 10 est
validada mais non poder ser franqueada, independentemente do valor da varibel b,
mentres a etapa 10 siga estando forzada pola orde de forzado da etapa 1. Cando se recibe o
evento Ta, a situacin evoluciona a{2, 10} e valdase a transicin 2. Ademais, como a
etapa 10 deixa de estar forzada, debe considerarse a transicin 10 como se tamn acabara
de validarse para que sexa avaliada e franqueada se o caso. Ntese que unicamente
preciso considerar este caso cando se utilice unha poltica de evolucin ARS coas ordes
internas habilitadas. Para manexalo, o xogo Grafcet mantn informacin sobre as etapas
que estn forzadas en cada situacin e calcula, para cada evolucin na que hai cambios nas
etapas forzadas, o conxunto de transicins que suceden s etapas que deixan de estar
forzadas. As transicins dese conxunto que estean validadas sern engadidas ao conxunto
de transicins a avaliar en cada ciclo (Ta).
--------------------------------------------
-^ .....................^--........
1
10
F/G2:{10}
(1 )^ a
(10
(2)^ya
b
11
G1 i ` (11)
:
yb G2.:
375
cond
cond
^ t^ ;
i I
If
^^^
i
i t^ ^
4f--^^H i^-f
i
;t2
t2
-^
----------------^-----
'
(a)
--
---------------^------^---^----------^
^
!
(b)
IVMServices* vmachine)
3188.
3189.
3190.
3191.
active_timers = game->getACtiveTimers();
t.evaluate(this);
3192.
end foz
3193.
3194.
game->updateTimerEvents();
376
vmachine->doSchedules();
vmachine->doUnschedules();
3200. {
3201.private:
3206.private:
3207.
// mtodos auxiliarea
3208.
bool evaluateCondition(RunningPolicy* env);
3209.
void setTimerVar(bool value, RunningPolicy* env);
3210.
void startTl(RunningPolicy* env);
3211.
void stopTl(RunningPolicy* env);
3212.
void startT2(RunningPolicy* env);
3213.
void stopT2(RunningPOlicy* env);
3214.public:
3215.
// manexo da temporizacin
3217 . } ;
Como pode verse, esta clase declara os atributos e mtodos auxiliares necesarios para
implementar no mtodo evaluate (lia 3216) o control da temporizacin, que se corresponde
co diagrama de estados da Figura 8.16. Ntese que os estados WAIT e T1T2_COLTNT son
utilizados unicamente nos temporizadores con semntica redisparbel. O significado dos
eventos e accins utilizados nas transicins do diagrama son os seguintes:
up(cond) e down(cond), indican que a condicin do temporizador pasa a ser certa ou falsa,
respectivamente. Estes eventos son detectados internamente no mtodo evaluate da clase
TimerSchedulelnfo. Esta clase almacena no atributo last_eval (lia 3205) o valor do
resultado da ltima avaliacin da condicin e o compara co resultado actual, devolto polo
mtodo privado evaluateCondition (lia 3208). Este mtodo executa a funcin do modelo
que contn o cdigo C++ da condicin; a sa implementacin semellante do mtodo
evaluate (lias 3096-3102) explicado anteriormente para as receptividades.
377
^
0
U
^
.N
G1
1--^
G
f0
f..l
O
n
11
j
^
Qf
.C
O
41
QI
.
r
0
^
d
^
L
6f
^
f0
a^i
^
^
L
a^
rn
rn
^
^
cv
a^
6.1
f0
^
v
r
U
^
61
T
Figura 8.16. Diagrama de estados dun temporizador Grafcet.
378
cond
cond
^_t1 '
'^
^
^
^
^
T1 COUNT ! ENABLED
(a)
' t1 ^ ^L^
^
;^^N i2
^^^^
^
,
^^
^
^^^
^^
^'^ s
^
^^
T1 COUNT i T2 COUNT
(b)
Figura 8.17. Efecto da latencia de resposta no control dun temporizador: a) comportamento ideal; e b)
comportamento con latencia.
79 Para reducir a informacin das transicins do diagrama, omitiuse o nome do evento naquelas que son avaliadas
ao executarse o mtodo evaluate do temporizador, e unicamente se indica nelas a condicin de transicin.
379
tun oolicv:DefaultRunninaPoliw
vm:IVMServicea
calculate_timers(game, vm) i
active_timera = getActiveTimerep ;
START
evaluate(titis)
aetTimer(tt, this)
schedule(tt, timer
latencia de panificacin
T1_COUN
updateTimerEvenffiQ i
doSchedulesQ^-^;
doUnschedutes()^5
calculate_timers(game, vm) i
tt
^ Emers.activate(this)
i^
;
q --------------
notification
-
active_tlmers = getActiveTimers(L;
latencia de resposta
evaluate(this)
setTimerVar(true, run^otiq)
aetData(timer_name, truel ;
ENABLED
updateTimerEvents() j
doSchedulesp i
-^
doUnschedules( ;
plalate_timers(game, vm) ;
calalate_timers(game, vm) ;
,
evaluate(this)
i
down(cond)&8t2>g)
startT2p
aetTimer(t2, this)
schedule(t2, timer) ;
^
T2_COU
updateTimerEventa() ;
latenda de qanificacin
doSchedulesp j
doUnschedules() ;
^
calaAate timers(game, vm) ;
calwlate_Umers(game, vm)
^ timers.auivate(this)
i
active fimers = getActiveTimers() ;
.'
notification ;
^----- --------- -- ------- . _. ---^t
II
^
z
latena de resposta
evalvate(ttris). :
setTunerVar(false,runydicy)
setTimerState(Cmer_name, fafse)
START
updateTunerEvenTS() i
{cond^alse)
doSchedrCes() i
-^
doUnschedNesp ;
380
r
^
^
^
m
a
v
N
N
(:
^
O
U
^
O
U
W
^_
a
X
W
~
m I
m
c
m
C
O
U
d
z
Figura 8.19. Diagrama de estados dun temporizador Grafcet con latencias de resposta.
381
3220.
3221.class ActionScheduleInfo
3222. {
3223.private:
//
//
//
//
//
//
estado da accin
3230.private:
3231.
void setActionValue(bool value, RunningPolicy* env);
3232.
3233.public:
3234.
void reset(ActionType type);
3235.
void run(RunningPolicy* env);
3236.
3237 . } ;
Ademais da informacin sobre o nome da accin no modelo, o tipo de accin e o seu estado
de activacin, cada instancia da clase ActionSchedulelnfo almacena nos atributos count (lia
3228) e flags (lia 3227) o nmero e tipo das asociacins activas que afecten ao valor do seu
estado nunha situacin do modelo. Os mtodos set (lia 3234) e reset (lia 3235) permiten
modificar esta informacin. O valor da varibel do modelo que almacena o estado de activacin
da accin modificado mediante o mtodo privado setActionValue (lia 3232), e o mtodo
runAction (lia 3231), cunha implementacin semellante do mtodo evaluate (lias 3096
3102) explicado anteriormente para as receptividades, executa a funcin do modelo que contn
o cdigo C++ da accin. O control da execucin da accin realizado no mtodo run (lia
3236), que ten a seguinte implementacin:
3238.void ActionSchedulelnfo::run(RunningPolicy* env)
3239. {
3240.
3241.
3242.
3243.
3244.
3245.
3246.
3247.
if (flags[R])
else if (flags [N] ^ ^ flags [PJ ^ ^ flags [P1] ^ ^ flags [PO] ^ ^ flags [S]
state = true;
if (flags [S] )
stored = true;
ead if
382
"
O clculo do estado de activacin da accin faise nas lias 3241-3250 considerando os tipos
das asociacins activas. As asociacins tipo R teen prioridade sobre as demais, polo que
sempre que haxa unha asociacin tipo R activa o valor da accin ser desactivado (lia 3242)
independentemente da existencia doutras asociacins activas. En caso de non haber ningunha
asociacin tipo R activa e haber algunha doutro tipo, o valor da accin activado (lia 3244).
Se ademais a asociacin de tipo S actvase o valor do atributo stored (lia 3246), para indicar
que o valor que ten a accin almacenado. No caso de non haber ningunha asociacin activa, o
valor da accin desactvase se non un valor almacenado (lia 3249). Ntese que se o valor de
activacin da accin almacenado, unicamente pode ser desactivado por unha asociacin tipo
R. En caso de non ser almacenado desactvase simplemente coa ausencia dunha asociacin
activa. Unha vez calculado o estado de activacin da accin actualzase o seu valor no modelo
(lia 3252) e exectase o cdigo da accin en caso de estar esta activa (lia 3255). Por ltimo
desactvanse os indicadores correspondentes s asociacins impulsionais activas, de xeito que
afecten execucin da accin unicamente unha vez.
O mtodo da poltica de execucin que executa as accins do modelo realiza, para unha
situacin dada, das operacins diferentes: primeiro avala as asociacins activas e despois
calcula o estado de activacin das accins e executa as activas. A versin simplificada do seu
pseudocdigo a seguinte:
3262.void DefaultRunningPolicy::run(GrafcetGame* game,
IVMServices* vmachine,
3263.
TimeScale time_scale)
3264.
3265. {
3266.
3267.
3268.
3269.
active_associations,
disabled_associations = game->getActionAssociations(time_scale)
3270.
3271.
3272.
a.evaluate(this)
end for
3273.
3274.
3275.
a.onDeactivate(this)
end for
3276.
3277.
actions = game->getActions()
act.run(this)
3278.
3279.
3280.
3281.
3282. }
end for
// aincronizacin da "cach"
flushCache()
Ntese que o mesmo mtodo utilizado tanto nas evolucins internas como nas externas do
modelo, os aspectos especficos de cada escala son mantidos no xogo Grafcet. O nmero de
383
asociacins a avaliar en cada ciclo redcese utilizando coas asociacins condicionais a mesma
tcnica que coas receptividades e temporizadores, de xeito que as que contean unicamente
varibeis booleanas non afectadas por algn dos eventos considerados non son avaliadas. Unha
vez executadas as accins actualzanse os datos do modelo e, se preciso, os valores das sadas
do proceso mediante o mtodo privado flushCache (lia 3281), que explicado en (8.6.4).
Para a avaliacin e manexo das asociacins, o xogo Grafcet almacena unha instancia da
clase AssociationSchedulelnfo para cada asociacin do modelo a interpretar -estas instancias
son manexadas na implementacin da clase Associationlnfo (Figura 8.12^-. O cdigo da
declaracin simplificada desta clase o seguinte:
3283.class AssociationScheduleInfo
3284. {
3285.private:
3288.
RTActionInfo* info;
/ / informaci^n proporcionada polo campilador
3289.private:
3291.public:
3292.
void onDeactivate(RunningPolicy* env);
3293.
3294 . } ;
tipo accin
Xi
Xi
. T^
^
Asoc
Asoc
.
Asoc
(a)
Fgura 8.20. Relacin temporal entre o tempo de activacin dunha etapa e o dunha asociacin asociada a ela: a)
Tp < TI, < T(Xi); b) TD _< T(Xi) 5 TL; e c) T(Xi) < Tp < TL.
384
O mtodo evaluate (lia 3292) executado en cada ciclo do intrprete mentres a asociacin
estea activa, e o mtodo onDeactivate (lia 3293) no ciclo no que deixa de estalo. A
implementacin destes mtodos activa e desactiva -en funcin do valor da condicin
calculado co mtodo privado evaluateCondition (lia 3290}- o"flag" correspondente ao tipo
da asociacin na instancia da clase ActionSchedulelnfo referenciada polo atributo action (lia
3287). A semntica temporal do "flag" de cada ti^o de asociacin mostrada na Figura 8.2 Y en
funcin dos cambios na condicin da asociacin8 . A activacin e desactivacin do "flag" faise,
respectivamente, mediante os mtodos set (lia 3234) e reset (lia 3235) da clase
ActionSchedulelnfo, aos que se lles pasa como parmetro o tipo da asociacin.
Ntese que a semntica de activacin dos "flags" dos tipos N, R e S coincidente. A
diferencia entre elas estar polo tanto na forma en que son manexadas as activacins dos seus
"flags" no mtodo run da clase ActionSchedulelnfo (lias 3241-3250). No que respecta s
asociacins impulsionais, o"flag" das tipo P 1 activado a primeira vez que a condicin certa,
xa sexa no instante de activarse a asociacin (Figura 8.21) ou unha vez activada (Figura 8.22).
O das tipo P activado cada vez que a condicin se volve certa (Figura 8.22), includo o caso
no que xa sexa certa no instante de activarse a asociacin (Figura 8.21). O das tipo PO
activado no instante en que a asociacin deixe de estar activa se a condicin certa (Figura
8.21). En caso de non selo non seria activada (Figura 8.22). Os "flags" de todos os tipos de
accins impulsionais son desactivados no mtodo run da clase ActionSchedulelnfo (lias 3258
3260) para garantir que a accin s executada unha vez en cada activacin.
flag[P]
flag[P1]
i
flag[PO]
i
i
Figura 8.21. Semntica temporal dos "flags" dos diferentes tipos de asociacins.
80 Coa semntica aqu descrita posbel representar todos os tipos de asociacions definidos no estndar IEC
61131-3, coa excepcin dos tipos SD e SL que non teen equivalente no intrprete Grafcet.
385
Asoc
^
--
-,--^------:---^-----_-;--- ^ ---^
iii
i
cond
i
i^
flag[Pl
i
flag[P1]
i
i^i
flag(PO]
i
...
3296.
3297. {
3298.private:
// identificador da varibel
3300. T initial_value;
// valor modificado
3303.public:
3304.
bool isUpdated(void) const;
3305.
bool isModified(void) const;
3306.
3307.
// acceso e modificacia do valor
3308.
template <class T> void setValue(const T& value);
3309.
3310.
// actualizacin e aiacronizacin do valor
3313 . } ;
386
Cada entrada da "cach" almacena dous valores, o que a varibel tia ao comezo do ciclo
actual -atributo initial_value (lia 3300^-- e o valor modificado durante o ciclo -atributo
modified_value (lia 3301^. O mtodo getValue (lia 3308) devolve o valor de comezo de
ciclo, mentres que o mtodo setValue (lia 3309) almacena o valor modificado. Este mtodo
tamn detecta o intento de modificar a varibel con valores diferentes mis dunha vez na
mesma evolucin do modelo (3.3.3.8), nese caso indcase o erro utilizando os servicio^ do
ncleo da mquina virtual. Para realizar a actualizacin dos valores na "cach" e a
sincronizacin da "cach" cos valores do modelo, utilzanse dous indicadores booleanos e os
mtodos update (lia 3311) e flush (lia 3312). A"cach" representada mediante a clase
DataCache, que proporciona os mtodos que permiten xestionar un conxunto de instancias da
clase CacheEntry. A declaracin simplificada da sa interface pblica a seguinte:
3314.class DataCache
3315. {
3316.public:
3321. template <class T> bool insertValue(string varID, const T& value);
3323. template <class T> bool setValue(string varID, const T& value);
3324.
3328 . } ;
^.
Os mtodos desta interface permiten consultar se hai valores na "cach" -mtodo empty
(lia 3317^, se algn dos valores foi modificado -mtodo modified (lia 3318}-, baleirar
os seus contidos -mtodo removeAll (lia 3319^, actualizalos -mtodo update (lia
3326}- e sincronizalos cos valores do modelo -mtodo flush (lia 3327^. A insercin,
consulta e modificacin das entradas almacenadas na "cach" realzase cos mtodos
insertValue (lia 3321), getValue (lia 3322) e setValue (lia 3323), respectivamente.
O funcionamento da "cach" o seguinte: ao comezo de cada ciclo de execucin do
intrprete, a"cach" est baleira. Cada invocacin dos mtodos getModel Var e getSystem Var
da clase RunningPolicy dende unha accin ou condicin realiza primeiro unha busca do valor
na "cach". Se o valor non est na "cach" crease unha nova entrada co valor obtido do xogo
Grafcet ou da base de datos de E/S da mquina virtual (7.3.1), dependendo do caso. Do
mesmo xeito, os mtodos setModelYar e setSystemVar da clase RunningPolicy tentan modificar
o valor existente na "cach". En caso de que o valor a modificar non estea na "cach", crease
unha nova entrada co novo valor. A Figura 8.23 mostra como exemplo as secuencias de
mensaxes das colaboracins que implementan os mtodos getSystem Var e setSystem Var.
A actualizacin dos valores da "cach" e a sincronizacin cos valores do modelo faise
mediante o mtodo privado flushCache da clase DefaultRunningPolicy, que invocado ao final
do mtodo run (lia 3281) unha vez executadas as accins activas do modelo. A actualizacin
consiste en asignar o valor modificado ao valor inicial na entrada da "cach" para poder
reutilizala, mentres que a sincronizacin consiste en actualizar no xogo Grafcet os valores
modificados na "cach". O instante no que se realiza cada unha destas operacins depende do
tipo de varibel almacenada na "cach":
1. Os valores das varibeis do proceso son actualizadas na "cach" despois de cada evolucin
interna do modelo e sincronizadas co xogo Grafcet despois de cada evolucin externa.
387
8.7. Conclusins .
Neste captulo describiuse a arquitectura e o funcionamento do intrprete utilizado para a
interpretacin dos modelos Grafcet definidos polo usuario. O intrprete foi deseado para que
os mdulos da sa arquitectura podan ser substitudos dinamicamente e facilitar as a
implementacin de novas caractersticas e algoritmos sen que sexa preciso recompilar o
intrprete. Tamn se implementou a xestin da informacin de das escalas de tempo diferentes
durante a evolucin dos modelos, de xeito que podan utilizarse algoritmos de evolucin con ou
sen busca da estabilidade. Ademais poden configurarse mediante parmetros diferentes opcins
relacionadas coa utilizacin das das escalas de tempo.
A arquitectura do intrprete foi implementada para permitir a escalabilidade. Toda a
informacin precisa para a evolucin de cada modelo xestionada mediante un `xogo Grafcet',
que tamn contn a informacin utilizada polas tcnicas que optimizan a execucin do cdigo
de condicins e accins do modelo. Isto permite desacoplar a informacin de interpretacin do
modelo da lxica utilizada para a sa evolucin e a execucin do seu cdigo. Deste xeito
resulta simple modificar o intrprete para implementar caractersticas mis complexas, como
por exemplo a interpretacin simultnea de mltiples modelos con diferentes opcins de
configuracin. Entre as melloras que poden inclurse no intrprete poden citarse as seguintes:
1. A utilizacin da informacin sobre os eventos de cada condicin do modelo para descartar
os non significativos na poltica de acceso (8.3.1.1). A recopilacin desta informacin
requirira tamn a modificacin do compilador Grafcet.
2. A reduccin do tempo de ciclo do intrprete implementando polticas de execucin que
reduzan os tempos de acceso s varibeis ou os tempos de execucin das condicins e
accins, por exemplo distribundoas nun sistema multiprocesador.
3. A incorporacin dun mecanismo tipo "watchdog" (semellante ao utilizado nos PLCs) que
permita especificar o tempo de resposta mximo aceptado polo proceso e configurar a
accin a realizar se algn dos ciclos de execucin do intrprete supera este lmite.
-------------------------------------- ----------------m
W^
^
388
r-------------------------------------------------------------------------------------^
m
W
>
11
> > m
^
Wt^
^I II II
O V D
^ ^ 0
EE^
m
0
^1
^p II
m
8
m
'
^
^^
^
^
V
__._._._
_______________________^
(JI
^
>
^
a
`^
,?
`^.
m
c
m
^
>
II
Z`
^ d
------^T
----.,^
im
-m
d
E
>
>
m
E
_^
^^
1;
b;
c^
^:
c^
m^
c
^
d
E
>
E
T
^
i
E
d
^
m
x
c
v ,!
^o^
> .
O^
L
y u
^^
s^
0
m
m
m
V Ip
mD
.^
c. 10
m ^
^
^7
mv
7 Ip
X^t,C
_ ^
O
t
N C
^
V
_
C V
m^
`p N
W V% A
C q
(p ^ p
C n W
m
(q9 i>>
C
W
d
bD
O ^
;
(/1 OC
d ^
^ E
c;?
m
^
m ^
C ^y
O
y
^
^ ^
^
^
^._m. m
^ O ry U_
^
._ ^'c
rL^..^..C
W '>
Figura 8.23. Secuencias de mensaxes da implementacin dos mtodos que acceden aos valores das varibeis do
proceso: a) mtodo getSystemVar; e b) mtodo setSystemVar.
9.1. Conclusins
A ferramenta implementada nesta tese de doutoramento proporciona as compoentes
precisas para integrar as descricins de sistemas cunha lxica secuencial complexa,
especificados combinando unha aproximacin orientada a obxecto co Grafcet, en ambientes de
desenvolvemento de "soflware" para sistemas industriais nos que se utilice unha aproximacin
multiformalismo que proporcione asistencia aos enxeeiros de control durante o ciclo de vida
do sistema.
Os modelos Grafcet poden ser integrados en calquera outra ferramenta utilizando 0
metamodelo Grafcet definido, xa sexa mediante a librara C++ que o implementa ou inclundoo
na propia ferramenta por outros medios. O cdigo para a execucin dos modelos xrase
automaticamente utilizando o compilador implementado. A execucin e simulacin dos
modelos realzase na mquina virtual que proporciona o soporte bsico para o manexo de
eventos, temporizacins e acceso s magnitudes do proceso, e na que se dispn dun intrprete
que pode ser configurado para utilizar diferentes algoritmos de interpretacin. A mquina
virtual pode ser utilizada en arquitecturas heteroxneas e, mediante a definicin dos "drivers"
apropiados, pode interactuarse co proceso mediante mltiples sistemas de E/S diferentes.
Ademais esta interaccin pode ser configurada para que as magnitudes sexan lidas cada vez que
varen, ou ben a intervalos regulares. A estructuracin da aplicacin realzase combinando a
estructura xerrquica do Grafcet coas prbpiedades da orientacin a obxectos que proporciona a
linguaxe C++, que tamn a linguaxe utilizada (estendida coa agregacin de operadores para o
manexo de eventos e temporizacins) para programar os contidos das accins e receptividades
dos modelos Grafcet, o que permite inclur nos modelos as funcionalidades implementadas en
libraras externas, como por exemplo libraras matemticas, de simulacin, de tcnicas de "soft
computing", etc. A ferramenta compltase cun editor grfico que proporciona un punto de
acceso comn a todas as compoentes implementadas.
En conxunto as compoentes da ferramenta permiten que un enxeeiro de control aplique un
proceso de desenvolvemento iterativo baseado na construccin de modelos grficos executbeis
que son validados e refinados progresivamente mediante simulacin, e no que posbel utilizar
389
390
o Grafcet, combinado con outros formalismos, de maneira uniforme ao longo das diferentes
fases do ciclo de vida do sistema de control. A combinacin dunha aproximacin orientada a
obxecto cun formalismo grfico de semntica ben definida para a especificacin de secuencias
complexas, facilita a estructurain dos modelos nas fases de anlise e deseo e a obtencin
automtica do cdigo da aplicacin para ser executado en arquitecturas industriais distribudas.
Durante o deseo e implementacin da ferramenta priorizouse a aplicabilidade, flexibilidde
e portabilidade das sas compoentes, deixando nesta primeira versin os aspectos
relacionados coa eficiencia na execucin e no manexo de memoria nun segundo plano. Isto
pode comprobarse na utilizacin de libraras como STL (baseada no uso de "templates") ou
Common C++, que facilitan a portabilidade ao custe dunha menor eficiencia. Tamn na
arquitectura da mquina virtual, que est implementada en base definicin de interfaces
abstractas e utilizacin de conceptos tomados das arquitecturas baseadas en actores [3].
Nestas arquitecturas a comunicacin entre os procesos (nomenclatura utilizada na mquina
virtual) realzase mediante o intercambio de mensaxes, que son procesados utilizando unha
semntica RTC, de xeito que un proceso non ten en conta unha nova mensaxe ata que non
remate co procesamento da actual. Esta arquitectura ten tres consecuencias principais:
1. Os procesos teen un acoplamento dbil entre eles, o que facilita a substitucin e a
reconfiguracin dinmica da arquitectura.
2. Elimnanse os problemas derivados da concorrencia no interior dos procesos. Debido a que
o procesamento dunha mensaxe non pode ser interrompida, non precisa a inclusin de
mecanismos de exclusin mutua na implementacin dos procesos: Ntese que o
procesamento dun proceso si pode ser interrompido por outro de maior prioridade, mais
isto non afectar ao seu estado interno.
3. Os tempos de resposta ao envo de mensaxes son, en xeral, superiores neste tipo de
arquitecturas que nas baseadas no manexo de interrupcins.
Un inconveniente desta arquitectura o referido ao manexo das temporizacins, que son
implementadas como procesos que notifican a finalizacin dun perodo de tempo utilizando 0
mecanismo de paso de mensaxes. Anda que estas notificacins teen prioridade sobre as outras
mensaxes, non son consideradas ata que o proceso receptor remate o procesamento da mensaxe
actual en caso de habela. Isto ten como consecuencia unha perda de precisin que pode non ser
aceptbel en certas aplicacins. En consecuencia a aplicabilidade da mquina virtual depender
basicamente de tres parmetros:
1. A cantidade de memoria dispobel no equipamento de control utilizado.
2. Os tempos de resposta que o proceso a controlar precise.
3. A precisin requirida nas temporizacins.
Ningn dos parmetros anteriores constante e varan en funcin do equipamento de
control, da configuracin da mquina virtual e dos modelos Grafcet concretos que se utilicen. A
validacin por simulacin dos modelos e o axuste das frecuencias de monitorizacin das
magnitudes do proceso son os medios dos que dispn o enxeeiro de control para comprobar e
axustar o funcionamento da aplicacin.
En contrapartida a estas limitacins, as arquitecturas implementadas son portbeis e
flexbeis. As no compilador poden inclurse novas funcionalidades de forma simple ^engadindo
novas fases ou reimplementando as existentes. De igual maneira a implementacin da mquina
virtual pode ser portada facilmente a diferentes equipamentos de control, poden inclurse
mltiples "drivers" para utilizar diferentes dispositivos de E/S, a sa configuracin pode ser
391
392
Neste anexo inclense as tboas que resumen as caractersticas do SFC tal e como son
definidas no estndar IEC 61131-3 [86].
^
I
I*** I
+-----+
+_______+
I I *** I I
+_______+
STEP *** :
(* Step Body *)
2
*s P nome da etapa
END STEP
INITIAL_STEP *** :
(* Step Body *)
END STEP
3a
*** x
+-- I--+
I*** I ---
+-----+
3b
*** .T
* * * = nome da etapa
***.T = varibel ti o TIME
Notas
1.
Se se incle soporte para algunha das caractersticas 3a, 3b ou 4, entn debe considerarse un
erro o intento de modificacin da varibel asociada. Por exemplo, se temos unha etapa
chamada S4, as seguintes instruccins ST deberan producir un erro:
S4.X := 1;
( * ERRO *)
S4.T := t#100ms;
( * ERRO *)
2. A conexin superior nunha etapa inicial non precisa cando non tea antecesores.
Tboa A-I. Caractersticas das etapas.
393
I
+-----+
^STEP7^
+-----+
^^IX2 . 4 &%Ix2. 3
^
+-----+
^STEPS^
+-----+
^
%IX2.4
^IX2.3
(
+-----+
^STEP7^
+-----+
^
+- - - ^ ^ - - - - - ^ ^ - - - - - - - -+
^
^
+-----+
^STEPB^
+-----+
^
^
+-----+
+-------+
^
^
&
3
%ZX2.4- ^
^STEP7^
+-----+
^
^-----+
^
%IX2.3-^
+-------+
^
+-----+
^STEPB^
+-----+
^
^
+-----+
^STEP7^
+-----+
>TxANx> - - - - - - - - - - I
^
+-----+
^STEPB^
+-----+
^
^
4a
4b
^IX2.4
^IX2.3
+-------+
I
I ^&
%IX2.4- ^
^-->TxANx>
%IX2.3-^
mediante LD
mediante FBD
+-------+
STEP STEP7 : END_STEP
TRANSITION FROM STEP7 TO STEPB:
._%IX2 . 4 &%IX2 . 3;
END_TRANSITION
STEP STEPS : END STEP
STEP STEP7 : END_STEP
TRANSITION FROM STEP7 TO STEPB:
6
LD %IX2 . 4
AND %IX2.3
END_TRANSITION
STEP STEP8 : END STEP
394
395
I
+-----+
^STEP7^
+-----+
I Tx^7e
^
+-----+
^STEPB^
+-----+
TRANSITZON TRAN78:
^%IX2 .4
.1a
%Ix2 . 3 TRAN78 ^
+---^^-----^^------()---+
I
I
mediante LD
END TFtANSITION
TRANSITION TRAN78:
+-------+
^
&
^
^--TRAN78
%IX2 . 4- ^
^
%IX2.3-^
+-------+
END TRANSITION
7b
mediante FBD
TRANSITION TRANS78 :
LD %IX2 . 4
,^C
AND %IX2.3
END TRANSITION
mediante IL
TRANSITION TRANS78 :
mediante ST
END TRANSITION
Notas
1.
2.
Se se incle soporte para a caracterstica I da Tboa A-I, entn debe inclurse soporte para cando
menos unha das caractersticas I, 2, 3, 4 ou 7 desta tboa.
Se se incle soporte para a caracterstica 2 da Tboa A-I, entn debe inclurse soporte para cando
menos unha das caractersticas 5 ou 6 desta tboa.
Tboa A-II. Caractersticas das transicins e das condicins de transicin.
Calquera varibel booleana nun bloque VAR ou VAR OUTPUT pode ser unha accin
+----------------------------------------+
ACTION_4
+----------------------------------------+
^
^^IX1
^MX3
SB.X
^Q17 ^
21
I
I
^
^
LT
C--^
^
I
^Mxl o ^
^---------(S)---+
+- ---( EN ENO ^
accins mediante LD
I
I
I D--i
I
+-------+
I
I
I
I
+----------------------------------------+
+----------------------------------------+
OPEN_VALVE_1
+----------------------------------------+
^
...
^
^
^
+________________+
^I VALVE_1_READY ^^
^+________________+
2S
^
^
STEPB. X
I
I
^ +-----------------+ +---+- ----------+ I
+-----------------+
^
...
+---+-----------+ ^
^
+----------------------------------------+
+----------------------------------------+
(
ACTION_4
+----------------------------------------+
^
+---+
^
^
%IX1--^ & ^
^
^
^--%QX17
%MX3--^
^
2f
s s. x- -------- I
+---+
FF28
+_ ___+
^
^
^ SR ^
+------+ ^ Q1^-^MX10
^
^
^
C--I LT I--IS1 I
I
^
n--I
I
I +----+
+------+
I
^
+----------------------------------------+
ACTION ACTION 4:
3s
^MX10 := FF28.Q;
END ACTION
ACTION ACTION_4:
LD 58.X
AND ^IX1
AND ^MX3
sT ^Qxi7
31
LD c
LT D
S1 FF28
LD FF28.Q
ST %MX10
END ACTION
Notas
1. O flag de estado da etapa S8.X utilzase para obter o valor desexado, que estando S8 desactivado, ser
%QX17:=0.
2. Se se incle soporte para a caracteristica 1 da Tboa A-I, entn tamn debe inclurse para unha ou mais
das caractersticas desta tboa ou para a caracterstica 4 da Tboa A-IV.
3. Se se incle soporte para a caracterstica 2 da Tboa A-I, entn tamn debe inclurse para unha ou mais
das caractersticas 1, 3s ou 3i desta tboa.
Tboa A-III. Declaracin de accins.
396
397
+----+
+-----+----------+---+
^ SB ^--^
L ^ ACTION_ 1 ^DN1^
+----+ ^t#lOS^
^
^
+-----+----------+---+
+ DN1
+----+
+-----+----------+---+
^ S8 ^--^
L ^ ACTION_ 1 ^DN1^
+----+ ^t#lOS^
^
^
+-----+----------+---+
^
^
^
N ^ ACTION_3 ^
^
+-----+----------+---+
STEP S8:
ACTION_ 1(1, T#lOS, DN1)
ACTION_2 ( P)
ACTION_3(N)
END STEP
+-----+---------------------+---+
^
N ^
ACTION_4
^
^--
+-----+---------------------+---+
t}
FF28
$MX10 := FF28.Q;
( S1 :_ (C<D));
+-------------------------------+
Nota
I. Cando se utilice a caracterstica 4, o nome de accin conrespondente non pode utilizarse en
ningn outro bloque de definicin de accins.
Tboa A-IV. Asociacin de etapas e accins.
"a": tipo
"b": nome da accin
"c": indicador booleano
"d": definicin da accin mediante:
Linguaxe IL
Linguaxe ST
Linguaxe LD
Linguaxe FBD
2
3
4
5
6
7
+-----+------------+---+
---^
$ZX7.5
+---+------+---+
OK1 ^
^
SB.X
+---^^-----^^-----^ N ^ ACT1 ^DN1^--()---+
+---+------+---+
$IX7.5--^
I
I
+----------------------+
c ^--
+-----+------------+---+
+---+------+---+
Notas
1.
2.
1
2
3
4
5
6
7
8
9
10
Reset
Ningn
S
L
D
P
SD
DS
SL
Set
Limitado
Demorado
Pulso
Almacenado e demorado
Demorado e almacenado
Almacenado e limitado
Tboa A-VI. Tipos de accins.
+-----+
^ S3
^
+-----+
^
+c
^
+- ----+
^ S4
+-----+
2a
+- I--+
^ ss ^
+----+
^
+- - - - - - * - - - - - -+- - . . .
I
I
+ f
+ e
^
+----+
^ sa ^
+----+
^ s5 ^
+----+
I
+----+
I
I
+----+
^ ss ^
+----+
+------*------+-- ...
2b
'
Iz
+f
I
+----+
+----+
I
+----+
I sa ^
I
+- ---+
^ ss ^
+----+
^
^
+------*------+-- ...
2c
aqueteaomenornmero.
I1
+e
^
+----+
^ s6 ^
+e
+ NOT e& f
^
+- ---+
I
+- ---+
^ S6 ^
+----+
I
^ Sa ^
+----+
I
falsa.
398
399
f
+----+
^ s7 ^
^ s9 ^
+----+
^
+----+
^
+h
+j
+------+------+-- ...
^
+-----+
^ sio ^
rematen na converxencia.
:.
Exemplo: a evolucin dende S7 a S10 ter lugar s si S7 est
activo e a condicin de transicin h certa, ou dende S9 a S10 se
S9 est activo e a condicin j certa.
+-----+
I
I
+-----+
^ s11 ^
+-----+
^
__+____= I =____+_=
I
^
+ b
+-----+
+-----+
^ S12 ^
independentemente.
+-----+
+-----+
I
I
+-----+
I
I
+-----+
s14 ^
^ S13 ^
^ s15 ^
+- ----+
+- ----+
I
I
__+_____+_____+__ ...
indica a converxencia.
^d
^
+-----+
^ si5 ^
certa.
+-----+
I
I
+-----+
^ S30 ^
+-----+
^
+---*---+
^
^
+ a
+ d
+-- I--+
( s3i I
^
I
$a
-+
^b
$C
+_ _ ^__+
^ s32 ^
^
^
$b
+- ----+
I
i
+^
I
I
+---+---+
I
+-----+
^ S33 ^
+-----+
^
+ a
^
+---------+
^
^
+-----+
^
6a
^ s31 I
-+
Ib
+__ ^__+
^ s32 ^
^
^
+-----+
I
6b
6C
*-----+
I^ Id
I
I
I
+-----+ +---+
^ S33 ^
+-----+
^
^
+-----+
^ S30 ^
+-----+
^
+ a
^
+----<----+
^
i
+-----+
^
S31 ^
+-----+
,^
^b
^
+-----+
i
_I
^
^ S32 ^
+-----+
^
^
^
*-----+
I ^ i d ^
^
^
^
+->-+
+-----+
^ S33 ^
+-----+
^
400
6.1. Contedores
A librara incle contedores con diferentes semnticas no referente `persistencia', copia e
asignacin de elementos, para o manexo de coleccins de obxectos de distintos tipos con
identificadores alfanumricos nicos. A implementacin destes contedores est baseada nas
coleccins definidas como parte da librara STL [11][123]. Na Figura B.1 pode verse o
diagrama das clases utilizadas para representar os distintos tipos de contedores implementados,
e na Tboa B-I resmense as propiedades de cada un.
^^-------
^------^
id2ptrSeq
j-^
elements : map<string, E>
Storable0bject
read( )
e()
getPersistenceld( )
^^---^
dcid2ptrSeq J ^
^^E^
pdcid2 trSeq
read( )
write( )
ptrSeqElem
getKey( )
^
^^--
pptrSeqElem
dcptrSeqElem I
pid2 trSe
read( )
vrrite^l
read( )
write( )
clone( )
pdcptrSeqElem
401
402
id2ptrSeq
ptrSeqElem
Non
Por referencia
dcid2ptrSeq
dcptrSeqElem
Non
Por valor
pid2ptrSeq
pptrSeqElem
Si
Por referencia
pdcid2ptrSeq
pdcptrSeqElem
Si
Por valor
A clase id2ptrSeq unha clase parametrizada que deiine e implementa a interface bsica
para o manexo dunha coleccin de obxectos de tipo E(e derivados) identificados mediante
unha chave alfanumrica nica. Esta clase non implementa a persistencia dos elementos que
almacena, e as operacins de copia e asignacin de elementos son unicamente por referencia
("shallow copy"). A interface pblica desta clase a seguinte:
3329.template <class E>
3330.
class id2ptrSeq
3331. {
3332.public:
3338. // constructores/deatructor
// constructor
3339. id2ptrSeq();
3340.
3341.
// destructor
virtual -id2ptrSeq();
3342. // consulta
3343.
3344.
// L colaccin baleira?
// nmero de elamentos
iterator begin();
3353.
iterator end();
3354.
3355. reverse_iterator rbegin();
3359.
3360.
3361.
3362.
3363.
3364.
3365.
3366.
3367.
3368.
3369.
3370.
3371.
3372.
3373 . }
// busca de elemeatos
// outras operacins
void clear();
/ / baleirar coleccin ( sen destruir elementos)
void destroy();
void swap(id2ptrSeq& seq);
// intercambiar elementos entre coleccins
// operadores
// asignacia
// referencia
403
Internamente esta clase capsula un mapa STL con chaves tipo string e elementos de tipo E*
-atributo elements (Figura B.1 }-, e os mtodos da sa interface non son mais que
adaptadores dos mtodos equivalentes no mapa. A clase tamn define iteradores bidireccionais
(non includos aqu) que capsulan aos do mapa e penmiten utilizar a coleccin como se se
tratase dun contedor de elementos tipo E, ocultando os detalles do manexo de apuntadores aos
elementos. Na implementacin dos mtodos da clase id2ptrSeq presuponse que os elementos
almacenados na coleccin implementan a interface seguinte:
3374.struct ptrSeqElem
3375. {
const = 0;
3381.public:
3384. }
3385.
3389.
3391 . main ( )
3392. {
3393. // declaracin da coleccin
3394. ElementSeq elements;
3395. // declaracin doa elementoa
3396. Element el("first");
3397. Element e2("second");
3398. // inaerimento dos elementos na coleccin
3399. elements.insert(&el);
3400.
elements.insert(&e2);
3401.
3402.
3403.
3404.
3405.
3406. }
cout
++iter)
iter->getKey();
3408.
3409. {
GESCA_DECLARETEMPLATE_PERSISTENT
3410.
3411.public:
3412.
3413.
3414 . } ;
3415.
3416.GESCA IAiPLEtdENITEMPLATEI_PERSISTENT(pid2ptrSeq, E)
404
Toda clase que utilice o mecanismo de `persistencia' implementado pola librara ten que ser
derivada da interface StorableObject (Figura B.1), e implementar os mtodos read e write que
son os que xestionan a`serializacin' das instancias da clase. Estes mtodos reciben como
parmetro unha instancia da clase Storage, que a que manexa os detalles da implementacin
e
GESCA_DECLARETEMPLATE_PERSISTENT
macros
da
`persistencia'.
As
GESCA IMPLEMENTTEMPLATEI_PERSISTENT serven para inclur nas coleccins
`serializbeis' a declaracin e implementacin de mtodos auxiliares utilizados polo
mecanismo de `persistencia'. A implementacin da clase pid2ptrSeq presupn que os
elementos que almacena implementan a interface seguinte, que engade as operacins de
`serializacin' do elemento s definidas pola interface ptrSeqElem:
3417.struct pptrSeqElem : public virtual ptrSeqElem, public virtual StorableObject
3418 . {
3421 . } ;
3423. {
3424.
3425 . } ;
O mtodo clone devolve unha copia do elemento. O cdigo seguinte mostra exemplos da
declaracin de elementos e coleccins utilizando os distintos contedores implementados na
librara:
3426.// Coleccin sea `persistencia' e con copia por referencia
3428. {
3429. string key;
3430.public:
3433. }
3434.
3437.
3440. {
string key;
3441.
3442.public:
3444.
3445.
3446.
3447. }
3448.
405
3455.public:
3460. }
3461.
3464.
3467. {
3469.public:
3476. }
3477.
ElementScope
Enumeracin que define o alcance dunha varibel en relacin ao modelo no que utilizada.
Os valores escalares definidos son:
local, a varibel definida no contexto do modelo e s pode ser utilizada nese contexto.
shared, a varibel definida no contexto do modelo e pode ser utilizada fora dese contexto.
406
StorableObject
enumeration
ElementAccess
read
vrtite
readwrite
^
IDataElement
^T ---TimedValue
value : T
timestamp : double
enumeration
ElemeniScope
local
shared
eztemal
setKey( )
canRead()
canWrite( )
canShare()
ype0f( )
size0^
IDataDeclaretion
createVar( )
GescaDataElement
name : string
access : ElementAccess
scope : ElementScope
operator-( )
T ---^
GescaVar
value : T
getValue( )
setValue( )
'
ISystemDataDeclaration
getDDredDO
setDDriverlD( )
getlOPointlD( )
setlOPointlD( )
getNumValues( )
setNumValues( )
getPeriod()
setPeriod()
createlORTDBEntry( )
IModelDataDeclaration
dumpConstructor( )
^T -------^
T ---- ^
--------^
'------- -' GescaS stemVarDecl
GescaS stemVar
ddrired id : string
value : T'imedValue<T>
iopomt id : stnng
numyalues : unsigned
getValue( )
period : double
setValue( )
^---- ^
GescaVarDecl
T --------^
IDataElement
Clase abstracta que defne a interface comn a todas as clases da librara utilizadas para
representar as varibeis e as declaracins de varibeis. A sa declaracin a seguinte:
3480.struct IDataElement : public pdcptrSeqElem
3481 . {
3482.
3483.
3484.
3485.
// modificacin do identificador
3486.
virtual bool canShareValue() const = 0;
3487.
3488.
// conaulta do tipo de datos da varibel
3489.
virtual size_t sizeOf() const = 0;
3490.
3491. };
3492.
407
IDataDeclaration
Clase abstracta que define a interface comn a todas as clases utilizadas para representar
declaracins de varibeis. A sa declaracin a seguinte:
3499.struct IDataDeclaration : virtual public IDataElement
3500. {
3503 . } ;
Esta interface declara o mtodo CreateVar, que un mtodo constructor ("factory method",
[67]) utilizado para crear unha instancia do tipo de varibel que corresponde declaracin.
IModelDataDeclaration
Clase abstracta que define a interface das clases utilizadas para representar as declaracins
de varibeis internas aos modelos. A sa declaracin a seguinte:
3504.struct IModelDataDeclaration : virtual public IDataDeclaration
3505. {
3507 . } ;
Esta interface declara o mtodo dumpConstructor, que devolve unha representacin textual
do cdigo C++ que crea unha instancia do tipo de varibel que corresponde declaracin. Este
mtodo utilizado polo compilador Grafcet (6.5.1.9) para xerar o cdigo das declaracins de
varibeis do modelo (lias 1498-1503).
ISystemDataDeclaration
Clase abstracta que define a interface das clases utilizadas para representar as declaracins
3509. {
3510.
virtual void setDDriverID(const string& dd) = 0;
3511.
virtual const string& getDDriverID(void) const = 0;
3512.
3513. // punto de $/ S no que a varibel est asignada
3514.
virtual const string& getIOPointID(void) const = 0;
3515.
3516. // nmero de valores histricos almaceaados aa base de datos de 8/S
3517.
3523.
3524 . } ;
3522.
Esta interface declara mtodos para acceder aos valores que identifican o"driver" e o punto
de E1S no que a varibel vai estar asignada (7.2.1.4.1), a frecuencia de monitorizacin do
valor da varibel (7.2.1.4.2), e o nmero de valores histricos a almacenar na base de datos de
E/S da mquina virtual (7.3.1.1). Ademais declrase un mtodo constructor CreatelORTDBEntry- utilizado para crear unha entrada na base de datos de E/S que se
corresponda cos datos almacenados na declaracin.
408
GescaDataElement
Clase abstracta que implementa parte da funcionalidade comn a todas as clases utilizadas
para representar varibeis e declaracins de varibeis. En concreto esta clase declara atributos
(Figura B.2) para almacenar o identificador -atributo name-, o tipo de acceso -atributo
access- e o alcance -atributo scope- da varibel ou declaracin, e proporciona un operador
de asignacin e implementacins por defecto para os mtodos getKey, read e write herdado da
interface pdcptrSeqElem; e para os mtodos setKey, canRead, canWrite e canShare herdados
da interface IDataElement.
GescaVarDecl
Clase parametrizada utilizada para representar as declaracins das varibeis internas dos
modelos. As declaracins dos diferentes tipos de varibeis obtense por instanciacin (Figura
5.12), indicando como argumento o tipo de dato a almacenar na varibel declarada.
GescaVar
Clase parametrizada utilizada para representar as varibeis internas dos modelos. Esta clase
declara un atributo (Figura B.2) no que se almacena o valor da varibel -atributo value- e
mtodos para consultar -mtodo getValue- e modificar -mtodo setYalue- o seu valor. Os
diferentes tipos de varibeis obtense por instanciacin, indicando como argumento o tipo de
dato a almacenar.
GescaSystemVarDecl
Clase parametrizada utilizada para representar as declaracins das varibeis do proceso
utilizadas nos modelos. Esta clase declara atributos (Figura B.2) para almacenar as propiedades
da varibel: o"driver" -atributo ddriver_id- e o punto de E/S -atributo iopoint_id- no que
a varibel vai estar asignada (7.2.1.4.1), a frecuencia de monitorizacin -atributo period
do valor da varibel (7.2.1.4.2), e o nmero de valores histricos -atributo num_values- a
almacenar na base de datos de E/S da mquina viriual (7.3.1.1). As declaracins dos diferentes
tipos de varibeis obtense por instanciacin, indicando como argumento o tipo de dato a
almacenar na varibel declarada.
GescaSystemVar
Clase parametrizada utilizada para representar as varibeis do proceso utilizadas nos
modelos. Esta clase declara un atributo (Figura B.2) no que se almacena o valor da varibel
atributo value- e mtodos para consultar -mtodo getValue- e modificar -mtodo
setValue- o seu valor. Ntese que, a diferencia da clase GescaVar, o valor almacenado unha
instancia da clase parametrizada TimedValue que almacena o valor xunto coa data e hora na
que foi obtido. Os diferentes tipos de varibeis obtense por instanciacin, indicando como
argumento o tipo de dato a almacenar.
TimedValue
Clase parametrizada utilizada para representar os valores das varibeis do proceso utilizadas
nos modelos. Esta clase declara atributos (Figura B.2) para almacenar tanto o valor da varibel
-atributo value- como a data e a hora na que foi obtido -atributo time_stamp-. Os
diferentes tipos de valores obtense por instanciacin, indicando como argumento o tipo de
dato a almacenar.
Exemplo de arquivo .mak utilizado para compilar e enlazar co Visual C++ 6.0 o cdigo
dunha DLL (6.5.1.9) xerado polo compilador Grafcet.
^
3525. #
3526.# arquivo make para compilar unha DLL que contn ua modelo Grafcet
3527. #
3528.
3530.CFG=Debug
3532.!ENDIF
3533.
3535.!MESSAGE
3537.!MESSAGE
3540.!MESSAGE
3542.!ENDIF
3543.
3546.!ENDIF
3547.
3550.!ENDIF
3551.
3554.!ENDIF
3555.
3556.TMPDIR=.\Compiled
3557.CPP=cl.exe
3558.MTL=midl.exe
3559.RSC=rc.exe
3560.BSC32=bscmake.exe
3561.LINK32=1ink.exe
409
410
3562.BSC32_FLAGS=/nologo /o"$(TMPDIR)\\$(DLLNAME).bsc"
3563.BSC32_SBRS= \
3564.
3566.CPP_PROJ=/nologo /MD /W3 /Gi /GR /GX /02 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D
3567.
"_MBCS" /D "_USRDLL" /I"$(SOURCEPATH)" /I"$(SFCPPPATH)\\include"
3568.
/I"$(SFCPPPATH)\\include\\stlport" /I"$(SFCPPPATH)\\include\\commoncpp"
3569.
/Fp"$(TMPDIR)\\$(DLLNAME).pch" /YX /Fo"$(TMPDIR)\\$(DLLNAME).obj"
'
3570.
/Fd"$(TMPDIR)\\" /FD /c
3573.
gescalib.lib gescadata.lib gescapersistence.lib gescaruntimelib.lib
3574.
gescaruntimeinfo.lib gescavmlib.lib gescaiortdb.lib gescasfcplayer.lib
3575.
/nologo /dll /incremental:no /pdb:"$(TMPDIR)\\$(DLLNAME).pdb"
3576.
/machine:I386 /nodefaultlib:"nafxcw.lib"
3577.
/out:"$(TMPDIR)\\$(DLLNAME).dll" /implib:"$(TMPDIR)\\$(DLLNAME).lib"
3578.
/pdbtype:sept
3580.CPP_PROJ=/nologo /MDd /W3 /Gm /Gi /GR /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D
3581.
"_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_MT" /D "_DLL" /D "_WINDLL" /D
3582.
"_AFXDLL" /I"$(SOURCEPATH)" /2"$(SFCPPPATH)\\include"
/I"$(SFCPPPATH)\\include\\stlport" /I"$(SFCPPPATH)\\include\\commoncpp"
3583.
3584.
/Fo"$(TMPDIR)\\$(DLLNAME).obj" /Fd"$(TMPDIR)\\" /FD /GZ /Zm150 /c
3587.
3588.
3589.
3590.
/machine:I386 /nodefaultlib:"nafxcwd.lib"
/out:"$(TMPDIR)\\$(DLLNAME).dll" /implib:"$(TMPDIR)\\$(DLLNAME).lib"
3591.
3592.
/pdbtype:sept
3593.!ENDIF
3594.
3595..c{$(TMPDIR)}.obj::
3596.
$(CPP) @
$(CPP_PROJ) $<
3597.
3598.
3599.
3600..cpp{$(TMPDIR)}.obj::
3601 .
$ (CPP) @
$(CPP_PROJ) $<
3602.
3603.
3604.
3605..cxx{$(TMPDIR)}.obj::
3606.
$(CPP) @
$(CPP_PROJ) $<
3607.
3608.
3609.
3610..c{$(TMPDIR)}.sbr::
3611.
$(CPP) @
3612.
$(CPP_PROJ) $<
3613 .
3614.
3615..cpp{$(TMPDIR)}.sbr::
3616.
$(CPP) @
3617.
$(CPP_PROJ) $<
3618.
3619.
3620..cxx{$(TMPDIR)}.sbr::
3621.
$(CPP) @
3622.
$(CPP_PROJ) $<
3623.
3624.
3625.LINK32 OBJS="$(TMPDIR)\\$(DLLNAME).obj"
3626.SOURCE="$(TMPDIR)\\$(DLLNAME)DLL.cpp"
411
3628.
3629."$(TMPDIR)" .
Cd "$(SOURCEPATH)"
3630.
3631.
3632."$(TMPDIR)\\$(DLLNAME).dll"
$(LINK32_OBJS)
$(LINK32) @$(USER_LIBS) @
3633.
$(LINK32_FLAGS) $(LINK32_OBJS)
3634.
3635.
3636.
3637."$(TMPDIR)\\$(DLLNAME).obj" :
3639.
3640.CLEAN :
- @erase "$(TMPDIR)\\$(DLLNAME).obj"
3641.
3642.
- @erase "$(TMPDIR)\\vc60.idb"
3643.
3644.
- @erase "$(TMPDIR)\\$(DLLNAME).dll"
3645.
- @erase "$(TMPDIR)\\$(DLLNAME).exp"
-@erase "$(TMPDIR)\\$(DLLNAME).lib"
3646.
- @if exits "$(TMPDIR)\\$(DLLNAME).pdb" erase "$(TMPDIR)\\$(DLLNAME).pdb"
3647.
Neste anexo mstrase a gramtica ANTLR [135] utilizada para xerar automaticamente un
analizador sintctico para as expresins C++ estendidas cos operadores de evento e
temporizacin, tal e como explica en (6.5.1.5.3). As regras da gramtica conteen ademais as
anotacins e accins utilizadas para construr a AST da expresin ao tempo que se realiza a sa
anlise sintctica.
3648. /*
3649. *
3650.
3651.
3652.
3653.
3654.
3655.
3656.
3657.
3658.
. especializacins de "templatesn
"casts"
Bngadronse:
3659. *
3660. *
3661. */
3662.#header
3663.
3672.
#include "ASTBase.h"
3673.
#include "ATokPtr.h"
3674.
#include "AST.h"
3675.
typedef AST SORAST;
3676.
3677.
3678.
3680.
3682.#token TOK_AMPERSAND
3683.#token TOK_AND
3684.#token TOK_ASSIGNEQUAL
3685.#token TOK_BITWISEANDEQUAL
413
3688.#token
3689.#token
3690.#token
3691.#token
3692.#token
3693.#token
3694.#token
3695.#token
3696.#token
3697.#token
3698.#token
3699.#token
3700.#token
3701.#token
3702.#token
3703.#token
3704.#token
3705.#token
3706.#token
3707.#token
3708.#token
3709.#token
3710.#token
3711.#token
3712.#token
3713.#token
3714.#token
3715.#token
3716.#token
3717.#token
3718.#token
3719.#token
3720.#token
3721.#token
3722.#token
3723.#token
3724.#token
3725.#token
3726.#token
3727.#token
3728.#token
3729.#token
3730.#token
3731.
3732.// C++
TOK_BITWISEOREQUAL
TOK_BITWISEXOR
TOK_BITWISEXOREQUAL
TOK_COMMA
TOK COLON
TOK DIVIDE
TOK_DIVIDEEQUAL
TOK_DOT
TOK_DOTMBR
TOK_ELLIPSIS
TOK_EQUAL
TOK_GREATERTHAN
TOK_GREATERTHANOREQUALTO
TOK_LCURLY
TOK_LESSTHAN
TOK_LESSTHANOREQUALTO
TOK_LPAREN
TOK_LSQUARE
TOK_MINUS
TOK_MINUSEQUAL
TOK_MINUSMINUS
TOK_MOD
TOK_MODEQUAL
TOK_NOT
TOK_NOTEQUAL
TOK_OR
TOK_PLUS
TOK_PLUSEQUAL
TOK_PLUSPLUS
TOK_POINTERTO
TOK_POINTERTOMBR
TOK_QUESTIONMARK
TOK RCURLY
TOK_RPAREN
TOK_RSQUARE
TOK_SCOPE
TOK_SEMICOLON
TOK_SHIFTLEFT
TOK_SHIFTLEFTEQUAL
TOK_SHIFTRIGHT
TOK_SHIFTRIGHTEQUAL
TOK_STAR
TOK_TILDE
TOK TIMESEQUAL
414
11 \ ^ =11
11^11
11^_II
11 11
11 . 11
11 / 11
11/_11
11 11
n
\*n
11...11
11__11
11 ^ 11
11 ^ _ 11
11 \ { 11
11 ^ 11
11^=11
11 \ (11
11 \ [ 11
11\_11
11\__11
11\-\-11
n^n
11 ^ _ 11
11 i 11
11 i _ 11
11\I\I11
n\+n
11 \+_ 11
"\+\+"
11\->11
11\_^\*11
11 ^ 11
11 \ } 11
n\)n
11 \ ) 11
n^_n
u.n
11^^\^11
11\^\^_11
n\)\)u
11\^\^_11
11 \ * 11
11\_11
u\,t=n
exteasiona
3733.#token
TOK_UPEDGE
3734.#token
TOK_DWEDGE
3735.
"\Ox18"
"\Ox19"
3737.#token TOK_BOOLFALSE
3738.#token TOK_BOOLTRUE
3739.#token TOK_THIS
3740.
"false"
"true"
"this"
3742.
3743.#token
3744.#token
3745.#token
3746.#token
3747.#token
3748.
TOK_ID
TOK_OCTALINT
TOK_DECIMALINT
TOK_HEXADECIMALINT
TOK_FLOATONE
3749.#token
TOK_FLOATTWO
"[a-zA-Z_][a-zA-ZO-9_)*"
415
3750.#token "\""
3751.#token "'"
3752.#token "\\\n"
3753. #token " [\t\ ] +"
3754.#token "\12"
3755.#token TOK_NEWLINE "\n"
mode(CHARACTERS); more O;
newline(); skip();
skip ( ) ;
skip ( ) ;
newline(); skip();
mode (START);
[0-9]+ ^ (x^X)[0-9a-fA-F]+ ) "
more();
3774.#lexclass START
3775.
3776.// "Tokena" de asignacin
3777.#tokclass ASSIGN_TOKCLASS
3778. {
TOK_ASSIGNEQUAL TOK_TIMESEQUAL TOK_DIVIDEEQUAL
3779.
TOK_MODEQUAL TOK_PLUSEQUAL TOK_BITWISEXOREQUAL
3780.
TOK_MINUSEQUAL TOK_SHIFTLEFTEQUAL
3781.
TOK SHIFTRIGHTEQUAL TOK BITWISEANDEQUAL TOK BITWISEOREQUAL
3782.
3783. }
3784.
3786.#tokclass BOOLEANUNARYOP_TOKCLASS
3787. {
3788.
TOK_NOT
3789. }
3790.
3791.#tokclass BOOLEANEVENTOP_TOKCLASS
3792. {
TOK_UPEDGE TOK_DWEDGE
3793.
3794. }
3795.
3796.#tokclass NUMERICUNARYOP_TOKCLASS
3797. {
3798.
TOK_TILDE TOK_PLUSPLUS TOK_MINUSMINUS
3799.
3800. }
3801.
3802.#tokclass UNARYOP_TOKCLASS
3803. {
3804.
TOK_PLUSPLUS TOK_MINUSMZNUS TOK_UPEDGE TOK_DWEDGE
3805.
3806. }
3807.
3808.#tokclass ADDITZVE_TOKCLASS
3809. {
3810.
3811. }
TOK_PLUS TOK_MINUS
more U ;
more ( ) ;
3813 . {
3814.
TOK_NOTEQUAL TOK_EQUAL
3815. }
3816.
3817.#tokclass MULTIPLICATIVE_TOKCLASS
3818. {
3819.
3820. }
3821.
3822.#tokclass PM_TOKCLASS
3823. {
3824.
TOK_DOTMBR TOK_POINTERTOMBR
3825. }
3826.
3827.#tokclass RELATIONAL_TOKCLASS
3828. {
3829.
3830.
3831. }
TOK_LESSTHAN TOK_GREATERTHAN
TOK_LESSTHANOREQUALTO TOK_GREATERTHANOREQUALTO
3832.
3833.#tokclass SHIFT_TOKCLASS
3834. {
3835.
3836. }
TOK_SHIFTLEFT TOK_SHIFTRIGHT
3837.
3839.#tokclass CONSTANTNUMBER_TOKCLASS
3840. {
3841.
TOK_FLOATONE TOK_FLOATTWO
3842.
3843. }
3844.
3845.#tokclass CONSTANTBOOL_TOKCLASS
3846. {
TOK_BOOLTRUE TOK_BOOLFALSE
3847.
3848. }
3849.
3851.#token TOK_BOOLEANUNARYOP
3852.#token TOK_BOOLEANEVENTOP
3853.#token TOK_NUMERICUNARYOP
3854.#token TOK_POSTOP
3855.#token TOK_NUMERICEXPR
3856.#token TOK_EVENTEXPR
3857.
3859.
3860.class CPPParser {
3861.
3862.// Gramtica
3863.
3864.sfcpp_expression :
3866. ,
3867.
3868.expression_list :
3869. expression
3870. ,
3871.
3872.expression :
3874. ,
416
417
3875.expr_assignment :
3877. ;
3876.
3879.expr_conditional :
3880.
3881. ;
..
3882.
3883.expr_logical_or :
3885. ;
3886.
3887.expr_logical_and :
3889. ;
3890.
3891.expr_inclusive_or :
3893. ;
3894.
3895.expr_exclusive_or :
3897. ,
3898.
3899.expr_and :
3900.
3901. ;
3902.
3903.expr_equality :
3904.
3905. ,
3906.
3907.expr_relational :
3908.
3909. ,
3910.
3911.expr_shift :
3912.
3913. ,
3914.
3915.expr_additive : .
3916.
3917. ;
3918.
3919.expr_multiplicative :
3921. ,
3922.
3923. expr^m :
expr_unary ( PM_TOKCLASS" expr_unary )*
3924.
3925. ;
3926.
3927.expr_unary :
3928.
(
3929.
( expr^ostfix )?.
3930. ^
tokO:BOOLEANUNARYOP_TOKCLASS" exp0:expr_unary
3931.
#0=#(#[TOK BOOLEANUNARYOP, tok0->getText()], #exp0);
3932.
3933. ^
_
tok1:BOOLEANEVENTOP_TOKCLASS" expl:expr_unary
3934.
tok2:NUMERICUNARYOP_TOKCLASS" exp2:expr_unary
3937.
#0=#(#[TOK_NUMERICUNARYOP, tok2->getText()], #exp2);
3938.
3939. )
3940. ,
418
3941. expr^ostfix! :
3942.
exp0:expr^rimary
3943.
#0=#exp0;
3944. (
3945.
3946.
3947.
3948.
3949.
3950.
3951.
3952.
3953.
3954.
3955.
tok2:TOK_DOT exp3:expr_id
tok3:TOK_POINTERTO exp4:expr_id
3956.
3957.
3958.
3959.
3960.
tok4:TOK_PLUSPLUS
3961.
3962.
3963.
3964.
3965.
3966.
3967.
3968.
3969.
3970.
3971.
3972.
3973.
tok5:TOK_MINUSMINUS
)*
expr^rimary :
TOK_THIS
expr_id
expr_literal
3974.
TOK_LPAREN^ { expression } TOK_RPAREN
3975. ;
3976.
3977.expr_id! :
3978.
bool scope = false;
3979. {
3980.
tokO:TOK_SCOPE
3981.
3982.
#0=#[TOK_ID, tok0->getText()];
scope = true;
3983.
3984.
3985. }
3986. tok1:TOK_ID
3987.
3988.
if (!scope)
3989.
#0=#[TOK_ID, tokl->getText()];
3990.
else
3991.
strncat(((AST*)#0)->getText(), tokl->getText(), strlen(tokl->getText()));
3992.
3993.
(
3994.
tok2:TOK_SCOPE
3995.
tok3:TOK_ID
3996.
3997.
strncat(((AST*)#0)->getText(), tok2->getText(), strlen(tok2->getText()));
3998.
strncat(((AST*)#0)->getText(), tok3->getText(), strlen(tok3->getText()));
3999.
4000. )*
4001. ,
419
4002.expr_literal :
4003.
constant
4004. ^
4005.
expr_string
4006. ;
4007.
4008.constant :
'
4009.
CONSTANTNUMBER_TOKCLASS
4010. ^
4011.
TOK_CHARACTER
4012. ^
4013.
CONSTANTBOOL_TOKCLASS
4014. ;
4015.
4016.expr_string! :
4017.
tokO:TOK_STRING
4023. ,
4024. }
strlen(tokl->getText()));
Neste anexo mstranse as gramticas utilizadas para a xeracin automtica, coa aplicacin
Sorcerer [135], de analizadores/traductores das ASTs das expresins C++ estendidas cos
operadores de evento e temporizacin. A primeira gramtica serve para xerar un
analizador/traductor que substita as expresins numricas por varibeis booleanas nas
expresins con eventos complexas, para a sa posterior reduccin coa aplicacin Sidoni, tal e
como se explica en (6.5.1.5.3). A segunda gramtica xera un analizador/traductor que imprime
as ASTs modificadas na sintaxe C++.
Substitucin de expresins numricas
4025. /*
4026. *
4027. *
4028.
4029.
4030.
4031.
*
*
*
*
. especializacins de "templates"
. "Casts
4032.
4033.
4034.
4035.
4036.
*
*
*
*
4037.
Sngadronse:
4038. */
4039.#header
4040.
4041. #include <deque>
4042.
#include <set>
4043.
#include <string>
4044.
#include <sstream>
4045.
4046.
4047.
#include
#include
4048.
#include "ATokenBuffer.h"
"tokens.h"
"AToken.h"
4049.
4050.
#include "ASTBase.h"
4051.
#include
4052.
4053.
#include "AST.h"
4054.
#include
4055.
"ATokPtr.h"
"CPPTreePrinter.h"
421
422
4057.
4058.class CPPTreeParser {
4059.
4060.
4061. private:
4062.
astdata_seq* trees;
4063.
unsigned expr_number;
4064.
std::string add_expression(PCCTS AST* tree, bool boolean = false);
4065.
void erase_ast(std::string name);
4066.
void reduce_expressions();
4067.
public:
4068.
void parse(SORASTBase **_root,
4069.
SORASTBase **_result,
4070.
astdata_seq& expressions,
4071.
unsigned& init_number);
4072 .
4073.
4074.// GRAMTICA
4075.
4077.
4078.sfcpp_expression :
4079.
expr_boolean
4080.
4081.
4082.
4083.
4084.
4085.
4086.
4087.
4088.
4089.
4090.
4091.
4092.
4093.
4094.
4095.
4096.
4097.
4098.
4099.
4100.
4101.
exp0:expr_numerical
#sfcpp_expression=#(#[TOK NUMERICEXPR,
const cast<char*>(expr_name.c_str())],
exp0);
TOK_STRING
TOK_ID
TOK_THIS
4105.
4106.
4107.
4108.
4109.
4110.
4111.
4112.
4113.
4114.
4115.
4116.
4117.
4118.
4119.
#( tokO:TOK_BOOLEANEVENTOP exp0:sfcpp_expression )
expr_boolean_binary
TOK BOOLTRUE
TOK_BOOLFALSE
423
4120.expr_boolean_binary :
4121.
4122. ^
4123.
4124. ;
4125.
4128.expr_numerical :
#( TOK_NUMERICUNARYOP sfcpp_expression )
4129.
4130. ^
expr_numerical_binary
4131.
4132. ^
4133.
4134. ^
4135.
4136. ^
TOK_OCTALINT
4137.
4138. ^
TOK_DECIMALINT
4139.
4140. ^
TOK_HEXADECIMALINT
4141.
4142. ^
TOK_FLOATONE
4143.
4144. ^
TOK_FLOATTWO
4145.
4146. ;
4147.
4148.expr_numerical_binary :
4149.
4150.
4151.
4152.
4153.
4154.
4155.
4156.
4157.
4158.
4159.
4160.
4161.
4162.
4163.
4164.
4165.
4166.
4167.
4168.
4169.
4170.
4171.
4172.
4173.
4174.
4175.
4176.
4177.
4178.
4179.
4180.
4181.
4182.
4183.
4184.
4187.
4188.
4189.
4190.
4191.
4192.
4193.
4194.
4195.
4196.
4197. }
4198.
4199. //
424
#( TOK_GREATERTHAN sfcpp_expression
sfcpp_expression )
MTODOS DO ANALIZADOR
4200.
4201.
4202.
4203.
4204.
4205.
4206.
char num[5];
ast_data data;
4207.
4208.
4209.
4210.
4211.
4212.
data.name = "sfcpp_expr";
data.name.append(num);
data.type = boolean;
data.ast = tree;
trees->push_back(data);
return data.name;
4213.
}
4214.
4215.
void CPPTreeParser::erase_ast(std::string name)
4216. {
4217.
for(astdata_iterator it = trees->begin(); it != trees->end(); ++it)
4218.
if (it->name == name)
4219.
{
4220.
trees->erase(it);
4221.
return;
4222.
}
4223.
4224.
4225.
4226.
void CPPTreeParser::reduce_expressions()
4227.
4228.
std::set<std::string> names;
4229.
4230.
4231.
4232.
if (!it->type)
4233.
4234.
4235.
((AST*) it->ast)->find_numexpr(names);
iter != names.end();
4236.
4237.
4238.
4239.
4240.
4241.
4242.
4243.
4244.
4245.
4246.
4247.
4248.
4249. }
++iter)
erase_ast(*iter);
names.clear();
names.insert(it->name);
iter != names.end();
++iter)
if (it->name !_ *iter)
((AST*) it->ast)->remove_expr(*iter);
425
4250.
4251.
4252.
4253.
4254.
4255.
4256.
4257.
SORASTBase **_result,
astdata_seq& expressions,
unsigned& init_number)
trees = &expressions;
expr_number = init_number;
// obter expresins
sfcpp_expression(_root, _result);
init_number = expr_number;
// reducir expresins
std::set<std::string> names;
((AST*)(*_result))->find_eventexpr(names);
iter != names.end();
++iter)
erase_ast(*iter);
reduce_expressions();
((AST*)(*_result))->remove_expr(it->name);
// producir resultado
CPPTreePrinter tree^rinter;
stringstream output;
tree^rinter.dump(&it->ast, output);
it->code = output.str();
4258.
4259.
4260.
4261.
4262.
4263.
4264.
4265.
4266.
4267.
4268.
4269.
4270.
4271.
4272.
4273.
4274.
4275.
4276.
}
4277.
4278. }
4279.
4283.
4284.
*
*
. especializacins de "templates"
. "casts"
4285.
4286.
4287.
*
*
*
.
.
.
4288.
4289.
4290.
4291.
*
*
*
Sngadronse:
4292. *
. operadores de evento: IIP_8DG$ e DOWN_$DGB
4293. */
4294.#header
4295.
#include <deque>
4296.
4297.
#include <iostream>
#include <string>
4298.
4299.
#include <set>
4300.
4301.
#include "tokens.h"
4302.
#include "AToken.h"
#include "ATokenBuffer.h"
4303.
typedef ANTLRCommonToken ANTLRToken;
4304.
#include "ASTBase.h"
4305.
#include "ATokPtr.h"
4306.
#include "AST.h"
4307.
typedef AST SORAST;
4308.
4309.
426
4313.
4314 .
4315. private: .
4317.public:
4320.
4321.// GRAMTICA
4322.
4324.
4325.sfcpp_expression :
4326.
expr_boolean
4327.
4328.
4329.
4330.
4331.
4332.
4333.
4334.
4335.
4336.
4337.
4338.
4339.
4340.
4341.
4342.
4343.
4344.
4345.
4346.
4347.
4348.
4349.
4350.
4351.
4352.
4353.
4354.
4355.
4356.
4357.
expr_numerical
#(
tokO:TOK_COMMA
sfcpp_expression
(*out) tok0->getText();
sfcpp_expression
#(
tok1:TOK_LPAREN
(*out) tokl->getText();
sfcpp_expression
tok2:TOK_RPAREN
(*out) tok2->getText();
tok3:TOK_CHARACTER
(*out) tok3->getText();
tok4:TOK_STRING
(*out) tok4->getText();
tokS:TOK_ID
(*out) tok5->getText();
tok6:TOK_THIS
(*out) tok6->getText();
4360.expr_boolean :
4361.
bool expr = false;
4364.
4365.
4366.
4367.
4368.
4369.
4370.
4371.
4372.
4373.
4359.
4362.
4363.
#(
tokO:TOK_EVENTEXPR
expr_boolean
expr = true;
if (!expr)
(*out) tok0->getText();
cout)
427
4374.
4375.
4376.
4377.
tok1:TOK_BOOLEANUNARYOP
(*out) tokl->getText();
sfcpp_expression
4378.
4379. ^
4380.
#(
4381.
4382.
4383.
tok2:TOK_BOOLEANEVENTOP
(*out) tok2->getText();
sfcpp_expression
4384.
)
4385. ^
expr_boolean_binary
4386.
4387. ^
TOK_BOOLTRUE
4388.
(*out) "(1)";
4389.
4390. ^
4391.
TOK_BOOLFALSE
(*out) "(0)";
4392.
4393. ,
4394.
4395.expr_boolean_binary :
4396.
#(
4397.
tokO:TOK_OR
sfcpp_expression
4398.
4399.
4400.
(*out) tok0->getText();
sfcpp_expression
4401.
)
4402. ^
4403.
#(
tok1:TOK_AND
4404.
sfcpp_expression
4405.
4406.
4407.
(*out) toki->getText();
sfcpp_expression
4408.
4409. ,
4410.
4412.
4413.expr_numerical :
tokO:TOK_NUMERICEXPR
4416.
4417.
{
4418.
expr_numerical
expr = true;
4419.
}
4420.
4421.
)
4422.
if (!expr)
4423.
4424.
(*out) tok0->getText();
4425.
4426. ^
4427.
#(
tok1:TOK_NUMERZCUNARYOP
4428.
(*out) tokl->getText();
4429.
sfcpp_expression
4430.
4431.
)
4432. ^
expr_numerical_binary
4433.
4434. ^
4435.
#(
tok2:TOK_QUESTIONMARK
4436.
sfcpp_expression
4437.
(*out) tok2->getText();
4438.
sfcpp_expression
4439.
tok3:TOK_COLON
4441.
( *out) tok3->getText();
4442.
sfcpp_expression
4443.
)
4444. ^
4445.
#(
4446.
tok4:TOK_POSTOP
4447.
sfcpp_expression
4448.
4449.
char* text = tok4->getText();
4450.
( *out) text;
4451.
4452.
{sfcpp_expression}
4453.
4454.
if ( text[0] __ '[')
4455.
(*out) "]";
4456.
4457.
(*out) ")";
4458.
4459.
)
4460. I
4461.
tok5:TOK_OCTALINT
4462.
(*out) tok5->getText();
4463. ^
4464.
tok6:TOK_DECIMALINT
4465.
(*out) tok6->getText();
4466. I
4467.
tok7:TOK_HEXADECIMALINT
4468.
(*out) tok7->getText();
4469. ^
4470.
tok8:TOK_FLOATONE
4471.
(*out) tok8->getText();
4472. ^
4473.
tok9:TOK_FLOATTWO
4474.
(*out) tok9->getText();
4475. ;
4476.
4477.expr_numerical_binary :
4478.
#(
4479.
tokO:TOK_MODEQUAL
4480.
sfcpp_expression
4481.
(*out) tok0->getText();
4482.
4483.
4484 .
4485.
4486.
4487.
sfcpp_expression
#(
tok1:TOK_ASSIGNEQUAL
sfcpp_expression
(*out) tokl->getText();
4488.
4489.
4490.
4491.
sfcpp_expression
4492 .
#(
4493.
tok2:TOK_TIMESEQUAL
4494.
4495.
4496.
sfcpp_expression
(*out) tok2->getText();
sfcpp_expression
4497.
4498 .
4499.
4500.
4501.
4502.
4503.
#(
tok3:TOK_DIVIDEEQUAL
sfcpp_expression
(*out) tok3->getText();
sfcpp_expression
4504.
428
429
4505. ^
4506.
#(
tok4:TOK_PLUSEQUAL
sfcpp_expression
4507.
4508.
( *out) tok4->getText();
4509.
4510.
sfcpp_expression
4511.
)
4512. ^
4513.
#(
4514.
tok5:TOK_BITWISEXOREQUAL
sfcpp_expression
4515.
( *out) tok5->getText();
4516.
4517.
sfcpp_expression
4518.
)
4519. I
4520.
#(
tok6:TOK_MINUSEQUAL
4521.
sfcpp_expression
4522.
( *out) tok6->getText();
sfcpp_expression
4523.
4524.
4525.
)
4526. ^
4527.
#(
tok7:TOK_SHIFTLEFTEQUAL
4528.
sfcpp_expression
4529.
(*out) tok7->getText();
sfcpp_expression
4530.
4531.
4532.
4533. ^
4534.
#(
tok8:TOK_SHIFTRIGHTEQUAL
4535.
sfcpp_expression
4536.
(*out) tok8->getText();
sfcpp_expression
4537.
4538.
4539.
4540.
4541.
4542.
4543.
4544.
4545.
4546.
4547.
4548.
4549.
4550.
4551.
4552.
4553.
4554.
4555.
4556.
4557.
4558.
4559.
4560.
4561.
4562.
4563.
4564.
#(
tok9:TOK_BITWISEANDEQUAL
sfcpp_expression
(*out) tok9->getText();
sfcpp_expression
#(
tok10:TOK_BITWISEOREQUAL
sfcpp_expression
(*out) tok10->getText();
sfcpp_expression
#(
tok11:TOK_PLUS
sfcpp_expression
(*out) tokll->getText();
sfcpp_expression
#(
tok12:TOK_MINUS
sfcpp_expression
(*out) tok12->getText();
4565.
sfcpp_expression
4566.
4567.
)
4568. ^
4569.
4570.
4571.
4572.
4573.
4574.
4575.
4576.
4577.
4578.
4579.
4580.
4581.
4582.
#(
tok13:TOK_NOTEQUAL
sfcpp_expression
(*out) tok13->getText();
sfcpp_expression
)
#(
tok14:TOK_EQUAL
sfcpp_expression
(*out) tok14->getText();
sfcpp_expression
4583.
4584.
4585.
4586.
4587.
4588.
4589.
4590.
4591.
4592.
4593.
4594.
4595.
4596.
4597.
4598.
4599.
4600.
4601.
4602.
4603.
4604.
4605.
4606.
4607.
4608.
4609.
4610.
4611.
4612.
4613.
4614.
4615.
4616.
4617.
4618.
4619.
4620.
4621.
4622.
4623.
4624.
4625.
4626.
4627.
4628.
4629.
4630.
4631.
430
#(
tok15:TOK_STAR
sfcpp_expression
(*out) tok15->getText();
sfcpp_expression
)
^
#(
tok16:TOK_DIVIDE
sfcpp_expression
(*out) tok16->getText();
sfcpp_expression
)
#(
tok17:TOK_MOD
sfcpp_expression
(*out) tok17->getText();
sfcpp_expression
)
#(
tok18:TOK_LESSTHAN
sfcpp_expression
(*out) tok18->getText();
sfcpp_expression
)
#(
tok19:TOK_GREATERTHAN
sfcpp_expression
(*out) tok19->getText();
sfcpp_expression
)
^
#(
tok20:TOK_LESSTHANOREQUALTO
sfcpp_expression
(*out) tok20->getText();
sfcpp_expression
)
#(
tok21:TOK_GREATERTHANOREQUALTO
sfcpp_expression
(*out) tok21->getText();
sfcpp_expression
)
431
4632.
4633.
4634.
4635.
4636.
tok22:TOK_SHIFTLEFT
sfcpp_expression
(*out) tok22->getText();
sfcpp_expression
4637.
)
4638. ^
4639.
#(
4640.
tok23:TOK_SHIFTRIGHT
4641.
sfcpp_expression
4642.
(*out) tok23->getText();
4643.
sfcpp_expression
4644.
)
4645. ;
4646. }
4647.
4649.
4650.
4651.
4652.
4653.
4654.
4655.
4656.
out = &out_stream;
sfcpp_expression(_root);
433
Xestin de configuracins
LOAD_DLL
UNLOAD_DLL
LOAD_SYSTEMIO
UNLOAD SYSTEMIO
LOAD_MODEL
UNLOAD_MODEL
PLAY_MODEL
NEXT_MODEL_E V OLUTION
STOP MODEL
ADD_CONF
REMOVE_CONF
S ET_CURRENT_CONFIGURATION
GET_CURRENT_CONFIGURATION
GET_CONFIGURATION_INFO
ACTIVATE
DEACTIVATE
Consulta da estuctura de mdulos da mquina virtual
GET_VM_INFO
GET_MODULE INFO
DISCONNECT
SHUTDOWN
Tboa F-I. Cdigos das mensaxes dos servicios de acceso remoto da mquina virtual.
434
a OK!
a OK!
a OK!
a OK!
a OK!
435
resposta fonmada por mltiples mensaxes (patrn 2) que conteen a informacin utilizada para
a depuracin da execucin do modelo. O intercambio de mensaxes en cada caso concreto o
seguinte:
a OK! .
a OK!
a OK!
a OK!
a OK!
436
a OK!
a OK!
a OK!
b ADD_CONF, 0, 0
a OK!
a OK!
a OK!
a OK!
437
a OK!
a OK, 1, parts_size+2, module name, module store name, part_1, ... , part_N
a OK!
438
lista de mdulos desa categora presentes no almacn e o nome da DLL dende a que se cargou
cada un deles na memoria da mquina virtual.
b GET MODULE_INFO, 0, 1, module name
// Repetir para cada tipo de mdulo
a OK, 1, l, type_name
"
a OK^
a OK!
a OK!
a OK!
B ibliografa
[ 1]
439
Bibliografia
440
[13] Aygalinc, P. & Denat, J.P. Validation of functional Grafcet models and performance
evaluation of the associated system using Petri Nets. In: Automatic Control Production
Systems, 27, pp: 81-93. 1993.
[ 14] Babb, M. IEC 1131-3 seeks the attention of U.S. engineers. In: Control Engineering
Magazine, February, 1997.
[15] Baracos, Paul. Automation Engineering in North America. In: Proc. of 2"d Int. Conf. on
Industrial Automation, pp: 3-8, Nancy, France, 1995.
[ 16] Baracos, Paul. Grafcet: a North American perspective. In: Proc. of 9th IFAC Symposium
on Information Control in Manufacturing, pp: 41-46, Nancy-Metz, France, 1998. Elsevier
Science Ltd. ISBN: 0-08-042928-9.
[17] Barker, H.A., Chen, M., Grant, P.W., Jobling, C.P. & Townsend, P. Open Architecture
for Computer-Aided Control Engineering. In: IEEE Control Systems Magazine, 13(2),
pp: 17-27, 1993.
[ 18] Bass, J.M., Schooling, S. & Turnbull, G. Process Control Systems Integration. In:
Preprints of 8th IFAC symposium on Computer Aided Control Systems Design, Saldford,
UK, 2000.
[ 19] Bauer, N. and Engell, S. A comparison of Sequential Function Charts and Statecharts
and an approach towards integration. In: Proc. 2nd Int. Workshop on Integration of
Specification Techniques for Applications in Engineering, pp: 58-69, Grenoble, France,
2002.
[20] Benner, P., Mehrmann, V., Sima, V., Van Huffel, S. and A. Varga. SLICOT - A
Subroutine Library in Systems and Control Theory, NICONET Report 97-3, June 1997.
[21 ] Benveniste, A. & Berry, G. The synchronous approach to reactive and real-time systems.
In: Proc. of the IEEE, 79(9), pp: 1270-1282, 1991.
[22] Benveniste, A., LeGuernic, P. and Jacquemot, Ch. Synchronous programming with events
and relations: the SIGNAL language and its semantics. Science of Computer
Programming, 16:103-149, 1991.
[23] Bernardi, S., Donatelli, S. & Merseguer, J. From UML Sequence Diagrams and
Statecharts to analysable Petri Net models. In: Prc. of 3rd Int. Workshop on Soflware
and Performance, pp: 35-45, Rome, Italy, 2002. ISBN:1-58113-563-7.
[24] Berry G. and Gonthier, G. The ESTEREL synchronous language: design, semantics, and
implementation. In: Science of Computer Programming, 19(2), pp: 87-152, 1992.
[25) Bierel, E., Douchin, O. & Lhoste, P. Grafcet: from theory to implementation. In:
Automatique, Productique et Informatique Industrielle, 31(3), pp: 543-559, 1997.
[26] Bilqees, A. Computing Environments for Control Engineering. PhD. University of
Cambridge, 1996.
[27] Boissier, R., Dima, B., Razafindramary, D. and Soriano, T. Hybrid systems modelling
and validating using Statecharts and Grafcet. In: Proc. of the IFAC Int. Workshop on
Real Time Programming, pp: 73-9, 1994.
[28] Booch, G. Anlisis y diseo orientado a objetos con aplicaciones. 28 ed. AddisonWesley. 1994. ISBN: 0-201-60122-2.
[29] Booch, G., Rumbaugh, J. & Jacobson, I. EI lenguaje unificado de modelado. Ed.
Addison-Wesley Iberoamericana, 1999. ISBN: 84-7829-028-1.
441
Bibliografia
[30] Bouteille N, Brard P, Colombari G, Cotaina N& Richet D. Le Grafcet. 28 ed. Cpadus
ditions, 1995. ISBN: 2-85428-380-5.
[31 ] Brendel, W. & Tiegelkamp, M. Uniform PLC programming in accordance with IEC
61131-3. Infoteam Soflware GmbH, Bubenreuth, Germany.
[32] Buck, J. T. Ha, S. Lee, E. A. and Messerschmitt, D. G. Ptolemy: A Framework for
Simulating and Prototyping Heterogeneous Systems. In: Int. Journal of Computer
Simulation, special issue on Simulation Software Development, 4, pp: 155-182, April,
1994.
[33] Cassez, Franck. Formal semantics for reactive Grafcet. In: Automatique, Productique et
Informatique Industrielle, 31(3), pp: 581-603, 1997.
[34] CEN. ENV 40 003: Computer-Integrated Manufacturing - Systems Architecture Framework for Enterprise Modelling, CEN/CENELEC, Brussels, 1990.
[35] Chacn E, Moreno W and Hennet J C, Towards an Implementation of Hierarchical
Hybrid Control Systems for the Integrated Operation of Industrial Complexes. In: Proc.
of IMACS/IEEE CESA'96 Multiconference, Symposium on Discrete Events and
Manufacturing Systems, pp: 396-401, Lille, France, 1996.
[36] Chalmeta, R. Reference Architecture for Enterprise Integration. PhD. Universidad
Politcnica de Valencia.
[37] Chapulart, V., Giaconne, T., Monneret, G., Pereyrol, F., Prunet, F. & Simottel, D. A
structured model for specification of Discrete Event Systems: the ACSY model. In:
Automatic Control Production Systems, 27, pp: 65-80. 1993.
[38] Chapulart, V., Larnac, M. 8i Dray, G. Analysis and formal verification of Grafcet using
interpreted sequential machine. In: Proc. of IMACS-IEEE CESA'96 Multiconference,
Symposium on Discrete Events and Manufacturing Systems, pp: 758-764, Lille, France,
1996.
[39] Char, B.W., Geddes, K.O., Gentleman, W.M. and Gonnet, G.H. The design of Maple: A
compact, portable, and powerful computer algebra system. In: Lecture Notes in
Computer Science, 162, pp. 101-115, Springer-Verlag, Berlin, 1983.
[40] Charbonnier, F., Alla, H. & David, R. The supervised control of discrete event dynamic
systems: a new approach. In: Proc. of 34th Conf. on Decision and Control, New Orleans,
USA, 1995.
[41 ] Chen, P. The Entity-Relationship model: toward a unified view of data. In: ACM
Transactions on Database Systems, 1(1), pp: 9-36, 1976.
[42] Crater, K.C. When technology standards become counterproductive. In: Control
[43]
[44]
[45]
[46]
Bibliografia
442
[47] Delatour, J. & Lamotte, F. ArgoPN. a CASE tool merging UML and Petri Nets. In: Proc.
of 1 st Int. Workshop on Validation and Verification of soflware for Enterprise
Information Systems, pp: 94-102. ISBN: 972-98816-2-6.
[48] De Loor, P. Du TTM/RTTL pour la validation des systmes commands par Grafcet. PhD
Thesis, University of Reims, France, 1996.
[49] Dima, Bruno & Manka, Marc. Graf7-C version 2.1 DOS. Manuel de l'utilisateur, tutoriel
et exemples Grafcet. Ministre de 1'ducation du Quebec, 1995. ISBN: 2-89740-009-1.
[50] Dongarra, J.J., Moler, C.B., Bunch J.R. & Stewart, G.W. LINPACK Users' Guide. 1979.
[51 ] Douglass, B. Real-time design patterns: robust scalable architecture for real-time
443
Bibliografia
[64] Frachet, J.P. & Colombari, G. Elements for a semantics of the time in Grafcet and
dynamic systems using non-standard analysis. In: Automatique, Productique et
Informatique Industrielle, 27(1), pp: 107-125, 1993.
[65] Frachet, J.P. & Lamperiere, S. & Faure, J.M. The hyperfinite signal: application to the
modelling of discrete event systems behaviour. In: Proc. of IMACS-IEEE^ CESA'96
Multiconference, Syrnposium on Discrete Events and Manufacturin Systems, pp. 584
589, Lille, 1996.
[66] Frensel, G. & Bruijin, P.M. From Grafcet to Hybrid Automata. In: Proc. of 9th IFAC
Symposium on Information Control in Manufacturing, pp: 47-52, Nancy-Metz, France,
1998. Ed. Elsevier Science Ltd. ISBN: 0-08-042928-9.
[67] Gamma, E., Helm, R., Johnson, R. & Vlissides, J. Design patterns: elements of reusable
object-oriented software, Addison-Wesley, 1995. ISBN: 0-20-163361-2.
[68] Gensym, G2 Reference Manual, version 4.0. Gensym Coorporation, 125 Cambridge Park
Drive, Cambridge, MA 02140, USA.
[69] Grabow, B.S., Boyle, J.M., Dongarra J.J. & Moler, C. B. editors. Matrix Eigensystem
Routines - EISPACK Guide Extension. In: Lecture Notes in Computer Science, 51,
Springer Verlag, New York, 1977.
[70] Gressier-Soudan, E., Epivent, M., Laurent, A., Boissier, R., Razafindramary, D. &
Raddadi, M. Component oriented control architecture: the COCA project. In:
Microprocessors and Microsystems, 23(2), pp: 95-102, 1999. ISSN: 0141-9331.
[71 ] Grbel, G., Joos, H., Otter, M. & Finsterwalder, R. The ANDECS design environment for
control engineering. In: Prepr. of 12`h IFAC World Congress, Sydney, Australia, 1993.
[72] Griibel, G., Varga, A., Boom, A. & Geurts, A.J. Towards a coordinated development of
numerical CACSD software: the RASP/SLICOT compatibility concept. In: Proc. of IEEE
Int. Symposium on Computer Aided Control System Design, pp. 499-504, Tucson, 1994.
[73] Guguen, H. & Bouteille, N. Extensions of Grafcet to structure behavioural
specifications. In: Control Engineering Practice, 9, pp: 743-756, 2001.
[74] Guillaume, M., Grave, J.M. & Chlique, P. Formalization of edges for the Grafcet state
machine. In: Proc. of IMACS-IEEE CESA'96 Multiconference, Symposium on Discrete
Events and Manufacturing Systems, pp. 579-583, Lille, France, 1996.
[75] Guillemaud, L., Grave, J.M. & Guguen, H. Requirements for extending Grafcet to
hybrid specifications, In: Proc. 3rd Int. Conf. Automation of Mixed Processes, pp. 209
215, Reims, France, 1998.
[76] Guillemaud, L. & Guguen, H. Extending Grafcet for the specification of control of
hybrid sytems, In: Proc. Int. Conf. Systems, Man and Cybernetics, 1, pp. 171-175, Tokyo,
Japan, 1999.
[77] Halepota, A.S., Grant, P.W., & Jobling, C.P. Design is a document. In: Proc. of IEE
Conference Control, pp: 1-5, Swansea, UK, 1998.
[78] Harel, D. StateCharts: a visual formalism for complex systems. In: Science of Computer
Programming, 8, 1987.
[79] Hassapis, G., Kotini, I. & Doulgeri, Z. Validation of a SFC software specification by
using hybrid automata. In: Proc. of 9th IFAC Symposium on Information Control in
Manufacturing, pp:65-70, Nancy-Metz, France, 1998. Elsevier Science Ltd. ISBN: 0-08
042928-9.
Bibliografia
444
445
Bibliografia
[98] Klein, S., Frey, G., & Litz, L. A Petri net based approach to the development of correct
logic controllers. In: Proceedings of the 2nd International Workshop on Integration of
Specification Techniques for Applications in Engineering, Grenoble, France, 2002.
[99] Kohn, W., James, J., Nerode, A., Harbison, K. & Agrawala, A. A hybrid systems
approach to computer-aided control engineering. In: IEEE Control Systems, :15(2), pp:
14-25, 1995.
[100] Kouthon, T., Decotignie, J.D. & Koppenhoefer, S. On distribution of Grafcet software.
In: Proc. of IMACS-IEEE CESA'96 Multiconference, Symposium on Discrete Events
and Manufacturing Systems, pp. 498-506, Lille, France, 1996.
[ 101 ] Kristensen, C.H., Andersen, J.H. & Skou, A. Specification and automated verification of
real-time behaviour -a case study. In: Proc. of 3rd IFAC/IFIP Workshop on
Arrchitectures and Algorithms for Real-Time Control, pp: 613-628, Ostend, Belgium,
1995.
[ 102] Kuikka, S., Tommila, T. & Venta, O. Distributed Batch Process Management
Framework based on Design Patterns and Software Components. In: Proc. of 14th
triennial IFAC World Congress, vol. Q, pp: 263-268, Beijing, China, 1999.
[103] Lessage, J.J. & Roussel, J.M. Hierarchical approach to Grafcet using forcing order. In:
Automatique, Productique et Informatique Industrielle, 27(1), pp: 25-38, 1993.
[ 104] Lewin, D. Design of Logic Systems. Van Nostrand Reinhold, 1985.
[ 105] Lewis, R. S. Programming industrial control systems using IEC 61131-3. IEE Control
Engineering series, The Institution of Electrical Engineers, Exeter, England, 1995. ISBN:
0-85296-827-2.
[106] Lhoste, P., Faure, J.M., Lessage, J.J. & Zaytoon, J. Comportement temporel du Grafcet.
In: Automatique, Productique et Informatique Industrielle, 31(4), pp: 695-711, 1997.
[ 107] Little, J.N. Emami-Naeini, A. & Bangert, S.N. CTRL-C and Matrix Environments for the
Computer-Aided Design of Control Systems. Jamshidi M. and Herget C. J., editors,
Computer-Aided Control Systems Engineering, Elsevier Science Publishers, Amsterdam,
1985.
[108] Lobato, V. & Fernndez, D. Fabricacin automtica de bridas. E.T.S. de Ingenieros
Industriales e Ingenieros Informticos de Gijn, Universidad de Oviedo, 1999.
[ 109] Machado, R.J. & Fernandes, J.M., A Petri Net Meta-Model to develop Software
Components for Embedded Systems. In: Proc. of 2nd Int. Conf. on Application of
Concurrency to System Design, pp: 113, Newcastle upon Tyne, UK, 2001.
[110] Maciejowski, J.M. & MacFarlane, A.G. CLADP: The Cambridge Linear Analysis and
Design Programs. Control Systems Magazine, 1982.
[ 111 ] Maffezoni, C., Ferrarini, L. and Carpanzano, E. Object oriented models for advanced
automation engineering. In: Preprints of 9th Symp. on Information Control in
Manufacturing, vol. I, pp: 21-31, Nancy-Metz, France, 1998.
[112] Maffezzoni, C. and Girelli, R. Moses: Modular Modeling of Physical Systems in an
Object-Oriented Database. In: Mathematics and Computer Modelling of Dynamical
Systems, 4, pp. 121-147, 1998.
[113] Mandel, L. and Cengarle, M.V. On the expressive power of OCL. In: Proc. of World
Congress on Formal Methods in the Development of Computing Systems, volume 1708
of LNCS, pp: 854-874, Toulouse, France, 1999.
Bibliografia
446
447
Bibliografia
[ 132] Pardo, X.C. & Ferreiro, R. An object-oriented static metamodel for sequential function
charts. In: Proc. 8th IFAC Symposium on Computer Aided Control Systems Design, pp:
113-118, Salford, UK, 2000.
[133] Pardo, X.C. & Ferreiro, R. Control of Hybrid Systems with SFC++. En: Actas do
Semanario Anual de Automtica, Electrnica Industrial e Instrumentacin, Vigo, Espaa,
2003. ISBN: 84-688-3055-6 (en CD).
[134] Pardo, X.C. & Ferreiro, R. Modeling of Hybrid Sequential Control Systems with SFC++.
In: Proc. of 12`h IASTED Int. Conf. on Applied Simulation and Modelling, pp: 663-668,
Marbella, Spain, 2003. ISBN: 0-88986-384-9.
[135] Parr, T.J. Language translation using PCCTS and C++: a reference guide. Automata
Publishing Company, San Jose, CA 95129, USA. 1993. ISBN: 0-9627488-5-4.
[ 136] Parsaei, H.R. & Sullivan. W.G. (eds) Concurrent Engineering: contemporary issues and
modern design tools, Chapman&Hall, London. 1993.
[137] Petri, C. Kommunication mit Automaten. PhD Thesis. Institut fiir Instrumentelle
Mathematik, Univ. Bonn, 1962.
[138] Pollard, J. IEC 61131-3: the toolbet is on, but it's not very full. In: Control Engineering
Magazine, February, 1997.
[ 139] Qurenet, B. CIMOSA - A European development for enterprise integration. Part III:
Enterprise Integrating Infraestructure. In: Enterprise Integration Modeling (C. Petrie, ed.),
pp: 205-15, The MIT Press, Cambridge, MA, 1992.
[ 140] Rimvall, M. & Cellier, F.E. A Structural Approach to CACSD. In: Computer-Aided
Control Systems Engineering. Elsevier Science Publishers, Amsterdam, 1985.
[141] Rodd, M. G. & Suski, G. J. Computer Control Systems: an introduction. Lecture Notes of
ERASMUS intensive course on Application of Artificial Intelligence in Process Control,
pp: 205-222. Ed: Boullart, L. Krijgsman, A. and Vingerhoeds, R. A. Pergamon Press,
Exeter, England, 1992. ISBN: 0-08-042017-6.
[ 142] Rogerson, D. Calling All Members: Member Functions as Callbacks. MSDN Library,
Visual Studio 6.0, Technical Article, 37. 1992.
[143] Rosenbrock, H.H. Computer-Aided Control System Design, Academic Press, London,
1974.
[144] Ross, D.T. Structured Analysis (SA): a language for communicating ideas. In: IEEE
Trans. on Soflware Engineering, SE-3, pp: 6-15, 1977.
[145] Ross, D.T. Applications and extensions of SADT. In: IEEE computer, 18(4), pp: 25-34,
1985.
[ 146] Rousell, J.M. Sidoni: de la thorie la pratique.
[ 147] Rousell, J.M. & Lesage, J.J. Une algbre de Boole pour 1'approche vnementielle des
systmes logiques. In: Automatique, Productique et Informatique Industrielle, 27(5), pp:
541-560, 1993.
[148] Rousell, J.M. & Lesage, J.J. Validation and verification of Grafcets using State Machine.
In: Proc. of IMACS/IEEE Multiconference CESA'96, Symposium on Discrete Events and
Manufacturing Systems, pp: 765-770, Lille, France, 1996.
[149] Roux, O. & Rusu, V. Du Grafcet au langage ractif Electre. In: Automatique,
Productique et Informatique Industrielle, 28(2), pp: 131-157, 1994.
Bibliografia
448
[ 150] Rumbaugh, J., Jacobson, I. & Booch, G. The unified modeling language reference
manual. Ed. Addison-Wesley, 1999. ISBN: 0-201-30998-X.
[151] Sall, K. XML Family of Specifications: A Practical Guide. Ed. Addison-Wesley, 2002.
ISBN: 0-201-70359-9.
[ 152] Schwetman, H. D. CSIM. A C-based, process oriented simulation language, Tech. Rep.
PP-080-85, Microelectronics and Computer Technology Corporation, 1985.
[153] Selic, B., Gullekson, G. & Ward, P. Real-time object-oriented modeling. John Wiley &
Sons, Inc, 1994. ISBN: 0-471-59917-4.
[ 154] Sessions, R. COM and DCOM: Microsoft's Vision for Distributed Objects. New York,
NY: John Wiley & Sons, 1997. ISBN 0-471-19381-X.
[155] Silva, M. & Teruel, E. A systems theory perspective of discrete event dynamic systems:
the Petri Net paradigm. In: Proc. of IMACS/IEEE CESA'96 Multiconference,
Symposium on Discrete Events and Manufacturing Systems, pp: 1-12, Lille, Franc,
1996.
[ 156] SLICE, A Subroutine Library for Control Engineering, The Numerical Algorithms
Group, Oxford, 1987.
[157] Soriano T, Boissier R, Razafindramary D and Raddadi M, Object-Oriented Analysis of
Hybrid Aspects of a Machine Tool. In: Proc. of IMACS/IEEE CESA'96 Multiconference,
Symposium on Discrete Events and Manufacturing Systems, pp: 390-395, Lille, France,
1996.
[158] Spang, H.A.. The Federated Computer-Aided Control Design System. In: ComputerAided Control Systems Engineering, Elsevier Science Publishers, Amsterdam, 1985.
[ 159] Spechart, F. H., Green, W. L. A Guide to Using CSMP - the Continuous System
Modelling Program., pp. 35-39, Prentice Hall, 1976.
[ 160] Strauss, J.C. The SCi Continuous System Simulation Language (CSSL), Simulation, 9(6),
281-303, 1967.
[161] Stroustrup, B. The C++ programming language, special edition. Ed: Addison-Wesley,
2000. ISBN: 0-201-70073-5.
[ 162] Taylor, J. H., Frederick, D. K. Rimvall, C. M. and Sutherland, H. A. .The GE MEAD
Computer-Aided Control Engineering Environment. In: Proc. IEEE Symposium on
CACSD, Tampa, FL, 1989.
[163] Taylor, J.H. & Chan, C. An Expert-Aided implementation interface for Industrial Process
Control Systems. In: Proc. of the IEEE 1999 Mediterranean Control Conference, Haifa,
Israel, 1999.
[164] Union Technique de 1'lectricit. Diagramme fonctionnel GRAFCET pour la description
des systmes logiques de commande. NFC 02, Paris, France, 1982.
[ 165] Union Technique de 1'lectricit. Function Charts GRAFCET. Extension of basic
principles. NFC 03-191, Paris, France, 1993.
[ 166] United States Department of Defense. Reference Manual for the Ada programming
language. DoD, Washington, D.C., January 1983. ANSUMIL-STD-1815A.
[167] Van der Wal, E. Acceptance grows for IEC 61131-3 and PLCOpen. In: Control
Engineering Magazine, February, 1997.
449
Bibliogra^a
[168] Varsamidis, T., Hope, S. & Jobling, C.P. An object-oriented information model for
Computer-Aided Control Engineering. In: Control Engineering Practice, 4(7), pp: 929-37,
1996.
[169] Vernadat, F. Enterprise Modelling and Integration. Principles and Applications. Ed.
Chapman&Hall, London, LTK. 1996. ISBN: 0-412-60550-3.
,
[ 170] Waldner, J. CIM. principles of computer-integrated manufacturing. John Wiley & Sons,
New York, NY. 1992.
[ 171 ] Walker, R., Gregory Jr., C. & Shah. S. Matrix-X, A Data Analysis, System Identification,
Control Design and Simulation Package. IEEE Control Systems Magazine, 2(4), pp: 30
37, 1982.
[172] Walln, A. Using Grafcet To Structure Control Algorithms. In: Proc. of 3rd European
Control Conference, 1995.
[173] Wilczynski, B.K. & Wallace, B.K. OOPS in real-time control applications. In: Object
oriented software for manufacturing systems, pp: 194-229, Chapman&Hall, London,
England, 1992.
[ 174] Willians, T.J. The Purdue Enterprise Reference Arquitecture. In: Computers in industry,
24(2-3), pp:141-158, 1994.
[175] Wirth, N. The Programming Language Pascal. In: Acta Informatica, 1, pp: 35-63, 1971.
[ 176] Wolfram, S. Mathematica, A System for poing Mathematics by Computer, AddissonWesley, 1991.
[ 177] Wonham, W.M. & Ramadge, P.J. On the supremal controllable sublanguage of a given
language. In: SIAM Journal of Control Optimization, 25, pp: 637-659, 1987.
[ 178] Wormer, J. & Kleppe A. The object constraint language, precise modeling with UML,
Addison-Wesley, 1999. ISBN: 0-201-37940-6.
[ 179] Zaytoon, J. Specification and design of logic controllers for automated manufacturing
systems. In: Robot & CIM, 12, pp: 353-366, 1996.
[ 180] Zaytoon J, Richard E, Moughamir S and Angelloz L, A formalism for Complex Control
Systems: Application to a Machine for Training and Re-education of Lower Limbs. In:
Proc. of IMACS/IEEE CESA'96 Multiconference, Symposium on Discrete Events and
Manufacturing Systems, pp: 385-389, Lille, France, 1996.
[ 181 ] Zaytoon, J. & Villermain-Lecolier, G. Two methods for the engineering of manufacturing
systems. In: Control Engineering Practice, 5(2), pp: 185-198, 1997.
[ 182] Zaytoon, J., Carr-Mntrier, V., Niclet, M. & De Loor, P. On the recent advances in
Grafcet. In: Preprints of the IFAC Workshop on Manufacturing Systems: Modelling,
Management and Control, pp: 419-424, Vienna, Austria, 1997.
[183] Zaytoon, J., Ndjab, C. & Carr-Mntrier. On the synthesis of Grafcet using the
supervisory control theory. In: Proc. of IFAC conference, pp: 391-396, Belfort, France,
1997.
[184] Zaytoon, J., Ndjab, C. & Roussel, J.M. On the supremal controllable Grafcet of a given
Grafcet. In: Proc. of 2nd IMACS MATHMOD conf., pp: 371-376, Vienna, Austria. 1997.