El problema del ascensor
Se trata de diseñar un controlador para un 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. El dispositivo físico que el controlador debe manejar es el motor que mueve el ascensor.
Hace algún tiempo ya modele un problema acerca de un ascensor, hoy buscando entre mis viejos apuntes decidí revivirlo y colocarlo a evaluación. No es algo fuera de este mundo, pero puede ser de ayuda para alguien que este investigando sobre el asunto.
Se trata de diseñar entonces 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. El dispositivo físico que el controlador debe manejar es 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.
Cuando se realice una llamada desde un piso cuando el ascensor está detenido con las puertas abiertas, no debe cerrarlas, pero debe quedar registrada la llamada.
Finalmente el ascensor no debe estar en movimiento a menos que haya alguna petición pendiente.
Análisis del problema por partes
Para facilitar el análisis se partió el problema en componentes. A continuación se verán los componentes, su descripción y su respectivo diagrama de estado.
Vale la pena aclarar que la notación usada para describir los diagramas de estado será la siguiente:
El controlador
Este componente posee solo dos estados, motor en marcha y motor detenido. Cuando el motor esta en el estado detenido el controlador puede recibir paso(Destino) del elevador donde Destino es el numero del piso destino. El controlador pasa entonces al estado en marcha.
Dependiendo entonces de la dirección deseada el controlador sube o baja un piso.
Adicionalmente usando un contador, el controlador pasa automáticamente al estado detenido cuando pasa el tiempo que se considera tarda el ascensor en desplazarse de un piso a otro. Esta transición tiene explicito un mensaje adicional. Cuando ocurre envía un mensaje al elevador indicando en que piso se esta en el momento y se hace la comparación si destino es igual al piso en el que se encuentra en el momento.
El piso
El piso posee tres estados: No ascensor llamado, ascensor llamado pero aun no ha llegado y puertas abiertas.
Los pisos reciben el mensaje de llamada por parte del usuario, el mensaje de arribo del ascensor y el mensaje de un temporizador interno para saber cuando cerrar las puertas.
Adicionalmente los pisos mandan un mensaje al ascensor solicitándolo.
El tiempo como mensaje para el contador no ha sido determinado, se deja como parámetro. Es el tiempo que se necesitaría dejar las puertas abiertas para que ingresen los usuarios al ascensor.
El ascensor
El ascensor posee cuatro estados:
Calendario_vacio : Es un estado donde no tiene ningun destino aun planeado.
Esperar_puertas1 : Es un estado donde lo unico que hace es esperar las puertas pues se encontraba inactivo y recibio un llamado en el piso en que se encontraba.
Calendario : El ascensor tiene destino planeado
Esperar_puertas2 : El ascensor tiene un plan y ha llegado a uno de sus destinos y esta esperando a que los usuarios salgan o entren.
El ascensor puede recibir dos mensajes: de llamada(p)(por parte del piso) y Estoyen(x) (por parte del controlador).
A su vez el ascensor puede enviar dos mensajes. Llegada(para el piso) y paso(destino)(a su controlador).
Cuando el ascensor manda el mensaje de llegada debe esperar a la activación de las puertas para permitir el ingreso o salida de los usuarios.
Finalmente vale la pena notar algunas consideraciones:
P es una variable global, el controlador y el ascensor hacen uso de ella para saber en la posición que se encuentran y actualizarla en caso de ser necesario.
Plan es una lista que contiene los destinos a los que debe ir el ascensor. Esta lista hace uso del algoritmo del ascensor (Usualmente utilizado para el acceso a discos). El uso de esta lista esta detallado mas adelante. Cuando se refiere a Plan.1 se habla de la primera posición de la lista o Plan.2 a la segunda.
Algunas notaciones usadas: /= (Para distinto) ==(Para comparación) =(Para asignación).
1. Llamado(N) / Nuevo_plan : [Viejoplan + N]
2. Estoyen(PosN) & PosN/= Plan.1 / Paso(Plan.1) al controlador & P=PosN
3. Estoyen(PosN) & PosN== Plan.1 / Llegada a Plan.1 (El mensaje solo llega al piso indicado en la primera posición del plan)
4. Continuar & Plan.2/=Vacio / Paso(Plan.2) al controlador P=PosN
Nuevo_plan : [Viejoplan – Plan.1]
5. Continuar & Plan.2==Vacio / P=PosN
Plan y el algoritmo del ascensor
El plan es una lista, y como tal es posible acceder a las posiciones de ella usando las notaciones comunes. Así pues un plan se vería de la siguiente manera:
Lo importante es que al momento de ingresar un nuevo destino al plan este se organiza según una condición que es producida en el controlador. Cuando el destino es menor que la posición actual del controlador, este suma uno a su posición y envía un mensaje de que esta subiendo. De ocurrir el caso contrario enviaría un mensaje de que esta bajando. Esto puede observarse en el diagrama de estado del controlador.
Ahora bien, los mensajes de bajando o subiendo son los que organizan la lista para utilizar el algoritmo del ascensor. Este consiste en que el ascensor sube y baja alternativamente. Mientras va en una dirección se efectúan las paradas necesarias en esa dirección. Cuando no quedan más peticiones en la dirección actual, se invierte el sentido de la marcha. Si no hay ninguna petición pendiente, el ascensor se detiene.
Si el ascensor esta subiendo la lista se organiza en forma ascendente a partir de su posición actual si hay destinos menores a su posición actual estos se organizan al final de forma descendente, si esta bajando, esta se organiza de forma descendente a partir de la posición actual y si hay destinos mayores a su posición actual estos se organizan de forma ascendente al final de la lista. Esto se puede ver claramente en la siguiente tabla:
Related posts:
Este ejercicio ha adquirido su valor al haberlo compartido. !
Gracias.