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

  1. Aplicar Conceptes de Concurrència: Utilitzar tasques i objectes protegits per gestionar processos concurrents.
  2. Sincronització i Comunicació: Implementar mecanismes de sincronització i comunicació entre tasques.
  3. Gestió del Temps: Utilitzar temporitzadors i gestionar esdeveniments en temps real.
  4. 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ó

  1. 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;

  1. 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;

  1. 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;

  1. 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;

  1. 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;

  1. 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

  1. Ampliar el Sistema: Afegir més sensors i ajustar el codi per gestionar-los.
  2. Millorar la Gestió d'Errors: Implementar gestió d'excepcions per manejar errors de lectura de sensors.
  3. 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.

© Copyright 2024. Tots els drets reservats