Tenemos un ascensor que atiende P pisos, numerados del 1 al
P; se supone la existencia de un tipo
. En cada piso hay un único botón de llamada al
ascensor, y en la cabina del ascensor hay un botón para cada piso. En
cada piso, a media altura respecto de la puerta del ascensor, hay un
sensor que detecta la llegada de la cabina; el sensor no conoce en qué
dirección va el ascensor, y tampoco da ninguna señal que nos indique
que el ascensor abandona el piso: se limita a recoger cambios de
estado de no haber ascensor a haber ascensor (ver la
figura
).
Se trata de diseñar un controlador del ascensor que atienda a las llamadas desde los pisos o la cabina, haciendo que el ascensor suba o baje en función de las mismas, y ocupándose también de que el ascensor se detenga en los pisos en que se haya solicitado parada y se abran y cierren las puertas. Los dispositivos físicos que el controlador debe manejar son las puertas y el motor que mueve el ascensor.
El controlador recibirá la información de los sensores para determinar
la posición del ascensor y deberá ocuparse de la parada del mismo
cuando corresponda, siempre en función de las llamadas pendientes. Si
el ascensor debe detenerse en un piso se debe ordenar la parada en
el momento en que se detecte el paso por el sensor correspondiente a
ese piso.
Las puertas deben abrirse automáticamente al llegar a un piso en que realice una parada. Las puertas se cierran automáticamente cuando se pulsa un botón de petición de piso desde el panel del ascensor, o, si no se pulsa ningún botón dentro del ascensor, cuando hayan transcurrido T segundos desde la apertura de las puertas. De haber alguna petición pendiente, el ascensor debe ponerse en marcha inmediatamente después del cierre de las puertas. Una llamada desde un piso cuando el ascensor está detenido con las puertas abiertas no debe cerrarlas, pero debe quedar registrada. El ascensor no debe estar en movimiento a menos que haya alguna petición pendiente.
Se dispone de los siguientes procedimientos ya implementados para actuar sobre los distintos dispositivos involucrados:
El controlador debe asegurarse de que en ningún momento se llama a dos o más de estas operaciones simultáneamente, pues su implementación no garantiza la exclusión mutua. Cada una de ellas retorna cuando el ascensor se ha puesto en marcha o se ha detenido.
De nuevo se requiere garantizar que no habrá dos operaciones simultáneamente activas; la exclusión mutua no está dada por las operaciones en sí. El tiempo necesario para abrir o cerrar las puertas está acotado, y es relativamente corto, pero no podemos hacer suposiciones acerca de su duración con respecto a la de otros sucesos de este problema.
No se puede suponer ningún límite de tiempo para el retorno de ninguna de estas llamadas. En particular no se puede suponer que en algún momento alguien hará una petición para un piso dado.
De cara a la especificación, las llamadas a operaciones que actúan sobre un dispositivo externo pueden ponerse como POST(Subir), si ello es necesario. Las operaciones que devuelven un resultado se supondrán especificadas como acciones.
En lugar de un solo ascensor, se controlarán conjuntamente N ascensores. Para ello se modifica el interfaz con los módulos MOTOR, PUERTA, BOTON y SENSOR de manera que tengan un parámetro que indique el ascensor al que se refieren, de tipo TipoNumAscensor (TYPE TipoNumAscensor = [1..N]):
El controlador debe asegurar que no se dan dos órdenes simultáneas para el mismo ascensor, pero sí se admiten órdenes simultáneas si van dirigidas a ascensores diferentes.
Se mantiene un solo botón de llamada en cada piso, pero se simplifica la operación de lectura de esos botones para hacerla similar a la lectura de los botones de una cabina:
Con estos supuestos, se pide:
Para determinar qué procesos se necesitan, se puede analizar qué operaciones no instantáneas puede que tengan que realizarse al mismo tiempo. Esto ocurre con las siguientes:
La comunicación y sincronización entre los procesos puede hacerse mediante un recurso compartido que gestione las peticiones pendientes y el estado del ascensor en un momento dado. Este recurso contendrá información sobre:
Esta última información podría plantearse también como correspondiente a un recurso separado que gestione solamente la temporización de la apertura y cierre de las puertas.
También es posible realizar la temporización directamente en el proceso que ordena el movimiento del ascensor, si el tiempo se va contando por periodos pequeños, y no con una espera única hasta el tiempo límite.
A continuación se describe la solución que usa un proceso separado
para temporizar, y un recurso único que gestiona las peticiones y el
permiso para cerrar las puertas. El diagrama de procesos y recursos
se muestra en la figura
![]()
|
![]() |
C-TADSOL TipoGestor
C-Operaciones
ACCION PulsadoCabina: TipoGestorTipoNumPlanta[ent]
ACCION PulsadoPlanta: TipoGestorTipoNumPlanta[ent]
ACCION HayPeticion: TipoGestorTipoNumPlanta[ent]
![]()
[sal]
ACCION ParadoEnPlanta: TipoGestorTipoNumPlanta[ent]
ACCION IniciarEspera: TipoGestor![]()
[sal]
ACCION TerminarEspera: TipoGestor
ACCION ElegirMovimiento: TipoGestorTipoMovimiento[sal]
TRANSACCIONES
PulsadoCabina
PulsadoPlanta
HayPeticion
ParadoEnPlanta
IniciarEspera
TerminarEspera
ElegirMovimientoCONCURRENCIA
ningunaDominio
Tipo: TipoGestor = (peticion: Secuencia()
sentido: TipoMovimiento
posicion: TipoNumPlanta
![]()
pulsadaCabina:![]()
tiempoActual:
tiempoLimite:
)
TipoNumPlanta = 1..P
TipoMovimiento = (SUBIRBAJAR)
Invariante:
![]()
CPRE: cierto
PulsadoCabina(g, p)
POST: Anota la petici'on y marca pulsaci'on desde cabina
POST:![]()
CPRE: cierto
PulsadoPlanta(g, p)
POST: Anota la petici'on
POST:![]()
CPRE: cierto
HayPeticion(g, p, hay)
POST: Indica si hay petici'on para esa planta
POST:![]()
CPRE: cierto
ParadoEnPlanta(g, p)
POST: Anota que se ha atendido la petici'on de esa planta, y comienza el plazo de apertura de puertas
POST:![]()
![]()
CPRE: g
.tiempoActual
g
.tiempoLimite
IniciarEspera(g, t)
POST: Indica el tiempo l'imite hasta el que hay que esperar
POST:g
.tiempoLimite
CPRE: cierto
TerminarEspera(g)
POST: Anota el nuevo tiempo actual
POST:TIEMPO.Ahora
CPRE: Hay peticiones para otra planta y se han mantenido laspuertas abiertas el tiempo suficiente
CPRE:![]()
![]()
ElegirMovimiento(g, mov)
POST: Indica que hay que subir si hay peticiones superiores y, o bien est'a subiendo o no hay peticiones inferiores.
Indica que hay que bajar en caso contrario. Adem'as anota el nuevo sentido de movimiento y que
las puertas est'an cerradas. y anula peticiones para el piso en que estaba.
POST:![]()
![]()
Se puede mantener en esencia el diseño anterior, con los siguientes cambios.
El diagrama de procesos y recursos se muestra en la
figura .
![]() |
![]() |
C-TADSOL TipoGestor
C-Operaciones
ACCION PulsadoCabina: TipoGestorTipoNumAscensor[ent]
TipoNumPlanta[ent]
ACCION PulsadoPlanta: TipoGestorTipoNumPlanta[ent]
ACCION HayPeticion: TipoGestorTipoNumAscensor[ent]
TipoNumPlanta[ent]
![]()
[sal]
ACCION ParadoEnPlanta: TipoGestorTipoNumAscensor[ent]
TipoNumPlanta[ent]
ACCION IniciarEspera: TipoGestor![]()
[sal]
ACCION TerminarEspera: TipoGestor
ACCION ElegirMovimiento: TipoGestorTipoNumAscensor[ent]
TipoMovimiento[sal]
TRANSACCIONES
PulsadoCabina
PulsadoPlanta
HayPeticion
ParadoEnPlanta
IniciarEspera
TerminarEspera
ElegirMovimientoCONCURRENCIA
ningunaDOMINIO
TIPO: TipoGestor = (petPlanta: Secuencia(TipoPeticion)peticion: Secuencia(Secuencia(
))
![]()
asignada: Secuencia()
sentido: Secuencia(TipoMovimiento)
![]()
posicion: Secuencia(TipoNumPlanta)pulsadaCabina: Secuencia(
)
![]()
tiempoActual:tiempoLimite: Secuencia(
))
TipoNumPlanta = (1..P)
TipoMovimiento = (SUBIRBAJAR)
TipoPeticion = (INACTIVA, PEDIDA, ASIGNADA)INVARIANTE:
![]()
![]()
![]()
![]()
![]()
![]()
CPRE: cierto
PulsadoCabina(g, a, p)
POST: Anota la petici'on y marca pulsaci'on desde cabina
CPRE: cierto
PulsadoPlanta(g, p)
POST: Anota la petici'on, si no lo estaba todav'ia
CPRE: cierto
HayPeticion(g, a, p, hay)
POST: Indica si hay petici'on desde cabina o planta paraese ascensor y planta. Si hay petici'on PEDIDA
para esa planta, sele asigna a ese ascensor,deshaciendo la asignaci'on anterior, si la hubiera.
CPRE: cierto
ParadoEnPlanta(g, a, p)
POST: Anota que se ha atendido la petici'on de cabina y/o planta ASIGNADA de esa planta,
y comienza el plazo de apertura de puertas
CPRE: Hay alguna temporizaci'on pendiente
CPRE:![]()
IniciarEspera(g, t)
POST: Indica el m'inimo tiempo l'imite hasta el que hayque esperar
CPRE: cierto
TerminarEspera(g)
POST: Anota el nuevo tiempo actual
CPRE: Hay alguna petici'on para atender por ese ascensor(desde cabina, o bien desde planta, no asignada)
y se ha cumplido el plazo para mantener las puertas abiertas.
ElegirMovimiento(g, a, mov)
POST: Indica que hay que subir si hay peticiones superiores y, o bien est'a subiendo o no hay peticiones inferiores.
Indica que hay que bajar en caso contrario. Adem'as anota el nuevo sentido de movimiento.
La asignaci'on de petici'on desde una planta a ese ascensor se hace si no hay peticiones de cabina
pero s'i peticiones de planta en el sentido de su movimiento.