En aquest estudi de cas, desenvoluparem una aplicació en temps real utilitzant Ada. L'objectiu és aplicar els conceptes apresos en els mòduls anteriors per crear un sistema que respongui a esdeveniments en temps real. Aquest projecte ens permetrà explorar la concurrència, la sincronització i la gestió del temps en Ada.
Objectius de l'Estudi de Cas
- Aplicar Conceptes de Concurrència: Utilitzar tasques i objectes protegits per gestionar processos concurrents.
- Sincronització i Comunicació: Implementar mecanismes de sincronització i comunicació entre tasques.
- Gestió del Temps: Utilitzar temporitzadors i gestionar esdeveniments en temps real.
- Gestió d'Excepcions: Assegurar que el sistema pugui gestionar errors i excepcions de manera robusta.
Descripció del Projecte
Crearem un sistema de monitoratge de temperatura en temps real per a una planta industrial. El sistema tindrà les següents funcionalitats:
- Lectura de Sensors: Tasques que llegeixen la temperatura de diversos sensors.
- Processament de Dades: Una tasca que processa les dades de temperatura i detecta anomalies.
- Alerta i Notificació: Una tasca que envia alertes si es detecten temperatures fora del rang acceptable.
- Registre de Dades: Una tasca que registra les dades de temperatura en un arxiu per a anàlisi posterior.
Estructura del Sistema
El sistema es compon de diverses tasques que s'executen de manera concurrent. Utilitzarem objectes protegits per sincronitzar l'accés a les dades compartides.
Diagrama de Tasques
+------------------+ +------------------+ +------------------+ | Tasca de Lectura | ----> | Tasca de Process | ----> | Tasca d'Alerta | | de Sensors | | de Dades | | i Notificació | +------------------+ +------------------+ +------------------+ | | | v v v +------------------+ +------------------+ +------------------+ | Tasca de Lectura | ----> | Tasca de Process | ----> | Tasca de Registre| | de Sensors | | de Dades | | de Dades | +------------------+ +------------------+ +------------------+
Implementació
- Definició de Tipus i Constants
package Real_Time_Monitoring is type Temperature is new Float; type Sensor_ID is new Integer; subtype Valid_Temperature is Temperature range -50.0 .. 150.0; Max_Sensors : constant Integer := 10; Alert_Threshold : constant Temperature := 100.0; end Real_Time_Monitoring;
- Tasca de Lectura de Sensors
task type Sensor_Reader is entry Start (ID : Sensor_ID); end Sensor_Reader; task body Sensor_Reader is Current_Temperature : Temperature; begin accept Start (ID : Sensor_ID) do -- Inicialització del sensor end Start; loop -- Simulació de lectura de temperatura Current_Temperature := Float'Random * 200.0 - 50.0; -- Enviar la temperatura a la tasca de processament Real_Time_Monitoring.Process_Temperature (ID, Current_Temperature); delay 1.0; -- Esperar 1 segon abans de la següent lectura end loop; end Sensor_Reader;
- Objecte Protegit per Processar Dades
protected Temperature_Data is procedure Process_Temperature (ID : Sensor_ID; Temp : Temperature); entry Get_Temperature (ID : Sensor_ID; Temp : out Temperature); private Sensor_Temperatures : array (Sensor_ID range 1 .. Max_Sensors) of Temperature; end Temperature_Data; protected body Temperature_Data is procedure Process_Temperature (ID : Sensor_ID; Temp : Temperature) is begin Sensor_Temperatures (ID) := Temp; end Process_Temperature; entry Get_Temperature (ID : Sensor_ID; Temp : out Temperature) when Sensor_Temperatures (ID) /= 0.0 is begin Temp := Sensor_Temperatures (ID); end Get_Temperature; end Temperature_Data;
- Tasca de Processament de Dades
task body Data_Processor is Temp : Temperature; begin loop for ID in 1 .. Max_Sensors loop Temperature_Data.Get_Temperature (ID, Temp); if Temp > Alert_Threshold then -- Enviar alerta Alert_Task.Send_Alert (ID, Temp); end if; end loop; delay 0.5; -- Processar dades cada 0.5 segons end loop; end Data_Processor;
- Tasca d'Alerta i Notificació
task body Alert_Task is ID : Sensor_ID; Temp : Temperature; begin loop accept Send_Alert (ID : Sensor_ID; Temp : Temperature) do -- Enviar notificació d'alerta Put_Line ("ALERTA: Sensor " & Integer'Image (ID) & " ha detectat " & Float'Image (Temp) & " graus!"); end Send_Alert; end loop; end Alert_Task;
- Tasca de Registre de Dades
task body Data_Logger is ID : Sensor_ID; Temp : Temperature; Log_File : File_Type; begin Create (Log_File, Out_File, "temperature_log.txt"); loop for ID in 1 .. Max_Sensors loop Temperature_Data.Get_Temperature (ID, Temp); Write (Log_File, "Sensor " & Integer'Image (ID) & ": " & Float'Image (Temp) & " graus" & New_Line); end loop; delay 10.0; -- Registrar dades cada 10 segons end loop; end Data_Logger;
Exercicis Pràctics
- Ampliar el Sistema: Afegir més sensors i ajustar el codi per gestionar-los.
- Millorar la Gestió d'Errors: Implementar gestió d'excepcions per manejar errors de lectura de sensors.
- Optimització del Rendiment: Ajustar els intervals de temps per optimitzar el rendiment del sistema.
Resum
En aquest estudi de cas, hem creat una aplicació en temps real per monitorar la temperatura en una planta industrial. Hem utilitzat tasques per gestionar processos concurrents, objectes protegits per sincronitzar l'accés a dades compartides i mecanismes de gestió del temps per assegurar que el sistema respongui a esdeveniments en temps real. Aquest projecte ens ha permès aplicar conceptes avançats d'Ada en un context pràctic, preparant-nos per a desenvolupar aplicacions robustes i eficients en temps real.
Curs de Programació en Ada
Mòdul 1: Introducció a Ada
Mòdul 2: Conceptes Bàsics
- Variables i Tipus de Dades
- Operadors i Expressions
- Estructures de Control
- Bucles en Ada
- Subprogrames: Procediments i Funcions
Mòdul 3: Tipus de Dades Avançats
Mòdul 4: Programació Modular
Mòdul 5: Concurrència i Programació en Temps Real
Mòdul 6: Temes Avançats
Mòdul 7: Millors Pràctiques i Optimització
- Estil de Codi i Millors Pràctiques
- Depuració i Proves
- Optimització del Rendiment
- Consideracions de Seguretat