miércoles, 27 de mayo de 2026

03d.- Programación II - Esquema de Bombeo (MODIFICADO) - Interruptor de Alto Nivel y Válvula de Desvió incluido

En la clase pasada se planteo Modificar el esquema de control del tanque de forma de evitar el desborde del tanque. Para esto se incorporo una válvula de desvió y un Switch de Alto Nivel. La idea es desviar el agua a otra instalación en caso de alto nivel, se nos dice que si se detecta el alto nivel debemos abrir la válvula de desvío y encender la bomba y mantenerlas en esa posición.

El programa cerrara la válvula de desvió únicamente cuando el tanque detecte bajo nivel.

El esquema quedaría de la siguiente forma:

La actividad consiste en modificar el programa existente para cumplir con el esquema.


Programa Modificado C++



 /* PROGRAMA ELABORADO POR: CARLOS FERRER

  Rev may 2026  

 (Modificado para incluir interruptor de alto nivel y Válvula de desvió/Emergencia) 

*/

 


#include<iostream> // Mostrar datos en pantalla

#include<fstream> // leer y escribir en un archivo de texto

#include<windows.h> // Control de ejecución (tiempo de refrescamiento de pantalla)

#include<locale.h>

using namespace std;


int main()


{

 setlocale(LC_ALL,"spanish");

 string bomba="APAGADA";

 double presion=0;

 string pantalla="ON";

 string valvula_d="CERRADA";

 int aux=1;


 // Leemos los datos del archivo de texto prueba a través de la función

 // Sheila (Puede ser cualquier nombre coloque el de mi hija)


  inicio:

 ifstream sheila("d:\\prueba.txt"); 

 string nivel_b;

 string nivel_a;

 string valvula_s;


  sheila >>nivel_b>>nivel_a>>valvula_s; 


 // Validamos la comunicación con el archivo de texto

 if (nivel_b=="OFF" or nivel_b=="off" or nivel_b=="Off")

  {

  nivel_b="OFF";

  }

 else if (nivel_b=="ON" or nivel_b=="On" or nivel_b=="on")

  {

  nivel_b="ON";

  }

 else

{

  nivel_b="No hay comunicacion";

  }

 

  

  if (nivel_a=="OFF" or nivel_a=="off" or nivel_a=="Off")

  {

  nivel_a="OFF";

  }

 else if (nivel_a=="ON" or nivel_a=="On" or nivel_a=="on")

  {

  nivel_a="ON";

  }

 else

{

  nivel_a="No hay comunicacion";

  }

 

if (valvula_s=="ABIERTA" or valvula_s=="Abierta" or valvula_s=="abierta") 

  {

  valvula_s="ABIERTA";

  }

else if (valvula_s=="CERRADA" or valvula_s=="Cerrada" or valvula_s=="cerrada" )

    {

  valvula_s="CERRADA";

  }

 else

  {

  valvula_s="No hay comunicacion";

  }

 

if (nivel_b=="No hay comunicacion" or nivel_a=="No hay comunicacion" or valvula_s=="No hay comunicacion")

{

  aux=1;

pantalla="ON";

  }


 else


{

  aux=0;

  pantalla="ON";

}


 if (aux==0)


 {

 // imprimimos los valores en pantalla 

 if(pantalla=="ON")


{

  system("cls");

  cout <<"La Presion= "<<presion;

  cout <<" - Tu bomba esta= "<<bomba<<endl; 

  cout <<" - El Switch de nivel bajo= "<<nivel_b;

  cout <<" - El Switch de nivel alto= "<<nivel_a<<endl;

  cout <<" - La valvula de servicio esta= "<<valvula_s;  

  cout <<" - La valvula de desvio esta= "<<valvula_d<<endl; 

  pantalla ="OFF"; 

}


//  Establecemos un tiempo de 1/4 de segundo para ver los cambios en la presión


     Sleep (1000);


 

 //Simulamos la válvula de desvió


 

 if (nivel_a=="OFF" and nivel_b=="OFF")

  {

  valvula_d="ABIERTA";

    pantalla ="ON";

}


 if (nivel_a=="OFF" and nivel_b=="ON")

{

     valvula_d="ABIERTA";

pantalla ="ON";

}   


 if (nivel_a=="ON" and nivel_b=="OFF")


  {

     valvula_d="CERRADA";

pantalla ="ON";

  }


// Simulamos la Presión    


if (valvula_d=="CERRADA" and valvula_s=="CERRADA" and bomba=="ENCENDIDA")

    {

     presion=presion+3;

     pantalla ="ON";

}


 if (valvula_d=="CERRADA" and valvula_s=="ABIERTA" and bomba=="APAGADA")

    {

     presion=presion-3;

     pantalla ="ON";

}

 if (valvula_d=="CERRADA" and valvula_s=="ABIERTA" and bomba=="ENCENDIDA" and presion<32)

    {

     presion=presion+1;

     pantalla ="ON";

}

 if (valvula_d=="CERRADA" and valvula_s=="ABIERTA" and bomba=="ENCENDIDA" and presion>32)

    {

     presion=presion-1;

     pantalla ="ON";

}

 if (valvula_d=="ABIERTA" and bomba=="APAGADA" and valvula_s=="ABIERTA")

    {

     presion=presion-4;

     pantalla ="ON";

}

 if (valvula_d=="ABIERTA" and bomba=="ENCENDIDA" and valvula_s=="ABIERTA" and presion>28)

    {

     presion=presion-2;

     pantalla ="ON";

}

 if (valvula_d=="ABIERTA" and bomba=="ENCENDIDA" and valvula_s=="ABIERTA" and presion<28)

    {

     presion=presion+0.5;

     pantalla ="ON";

}


 if (valvula_d=="ABIERTA" and bomba=="APAGADA" and valvula_s=="CERRADA")

{

     presion=presion-1;

     pantalla ="ON";

}


 if (valvula_d=="ABIERTA" and bomba=="ENCENDIDA" and valvula_s=="CERRADA" and presion<32)

    {

     presion=presion+1;

     pantalla ="ON";

}


 if (valvula_d=="ABIERTA" and bomba=="ENCENDIDA" and valvula_s=="CERRADA" and presion>32)

    {

     presion=presion-1;

     pantalla ="ON";

}


 //impedimos que la presión de negativo


 if (presion<0)

    {

    presion=0;

    pantalla ="ON";

}


    // Controlamos el encendido y apagado de la bomba


 if (nivel_a=="ON" and nivel_b=="OFF" and bomba=="ENCENDIDA")

{

     bomba="APAGADA";

     pantalla ="ON";


 if (nivel_a=="ON" and nivel_b=="ON" and presion<20 and bomba=="APAGADA")

    {

     bomba="ENCENDIDA";

     pantalla ="ON";

}  


 if (nivel_a=="ON" and nivel_b=="ON" and presion>40 and bomba=="ENCENDIDA")

    {

     bomba="APAGADA";

     pantalla ="ON";


 if (nivel_a=="OFF" and presion<40 and nivel_b=="ON" and bomba=="APAGADA")

    {

     bomba="ENCENDIDA";

     pantalla ="ON";


 if (nivel_a=="OFF" and nivel_b=="OFF" and bomba=="ENCENDIDA")

{

     bomba="APAGADA";

     pantalla ="ON";

 }


 


  // INFORMAMOS SI NO HAY COMUNICACIÓN CON EL ARCHIVO


  


 if (aux==1)

{

  if(pantalla=="ON")

{

system("cls");

cout <<" **** NO HAY COMUNICACIÓN CON EL ARCHIVO DE TEXTO *****";

pantalla ="OFF"; 

}


goto inicio;


}



Archivo Modificado



        ON                                            ON                               CERRADA          


   Switch de Nivel BAJO          Switch de Nivel ALTO     Válvula a la descarga       

(ON= Agua, Off=Alarma)       (ON= Agua, Off=Alarma)    (ABIERTA / CERRADA)          /REMOTO)
 
                                              




jueves, 21 de mayo de 2026

03c.- Programación II - Esquema de Bombeo - Simulación Clase Nro. 3 - Actividad propuesta miércoles 20 de Mayo

Para mejorar el funcionamiento del sistema de bombeo industrial, en la clase del Miércoles 21 de May se estableció una modificación del esquema trabajado por el profesor, la modificación consiste en incorporar un "Switch de Alto Nivel"y "Una válvula de desvió de seguridad", el esquema quedaría de la siguiente forma:




El espíritu de este cambio es impedir que el tanque se desborde, el Switch de Alto Nivel informará al PLC cuando el nivel es demasiado alto (Alarma), entonces el PLC  a arrancará la bomba y procederá a abrir La válvula de desvió, el agua será desviada a las comunidades cercanas al tanque y a un sistema de riego de áreas verdes. La válvula de desvió se cerrará cuando el tanque presente bajo nivel o sea cuando se active el Switch de Bajo Nivel (Alarma).

El Switch de Alto Nivel se deberá simular en el archivo de texto Prueba.txt y La válvula de desvió será una variable interna del programa.

En consecuencia se requiere modificar las tablas de la verdad de la bomba y de la presión incorporando las variables nuevas, en la tabla de la verdad de la bomba se debe incorporar el nuevo Switch de Alto nivel y en  la tabla de la verdad de la presión se deberá agregar La nueva válvula de desvió. Tal como se detalla a continuación:





Basado en esto el el archivo de texto Prueba. TXT  quedaría de esta forma:




ARCHIVO PRUEBA.TXT 

          ON                                       ON                                   ABIERTA                               

  Switch de Alto Nivel        Switch de Bajo Nivel            Válvula a la descarga                 

(ON= Agua, Off=Alarma) (ON= Agua, Off=Alarma)   (ABIERTA / CERRADA)  
Alarma= Por desbordarse        (Alarma=Por vaciarse)
                                              


Ustedes deberán modificar el programa anterior y el archivo de texto del profesor (re-ingeniería) o crear un programa nuevo (ingeniería) que simule y controle el esquema propuesto.

Éxito!!!!

03b.- Programación II - Esquema de Bombeo - Simulación Clase Nro. 2

 Basado en el siguientes esquema de Control




En la clase de hoy se elaboró un programa que simula el apagado y encendido de la bomba y el comportamiento de la presión a la descarga de la bomba.

Adicionalmente se elaboró un archivo de texto que simula: el Switch de Nivel (Interruptor de Bajo nivel),  la Válvula de servicios y Modo de Operación de la bomba (Local / Remoto).




Se indicó que tanto la Válvula como el Switch  lo manipularía el estudiante desde el archivo de texto y que el programa respondería basado en las tablas de la verdad para la Presión y la Bomba:






PROGRAMA 


/* PROGRAMA ELABORADO POR: CARLOS FERRER 
Control de nivel simple
Elaborado: Carlos Ferrer
Rev May 2026*/

#include<iostream> // Mostrar datos en pantalla
#include<fstream> // Leer y escribir en un archivo de texto
#include<windows.h> // Control de ejecución (tiempo de refrescamiento de pantalla)
#include<locale.h>
using namespace std;

int main()
{
 string bomba="APAGADA";
 double presion=0;
 string pantalla="ON",texto_aux;
 int aux=1;
 setlocale(LC_ALL,"spanish");
 
 
 /*Leemos los datos del archivo de texto prueba a través de la función
 conticinio (Puede ser cualquier nombre coloque conticinio porque me gusto la palabra)*/
 
 inicio:
 
 ifstream conticinio("C:\\Prueba\\prueba.txt"); 
  
 string sw_bajo_nivel;
 string valvula;
 string comunicacion="Normal"; 
  
 conticinio >>sw_bajo_nivel>>valvula; 
 

 
 //Verifico el estado del Switch de bajo nivel
 
 if(sw_bajo_nivel=="ON" or sw_bajo_nivel=="on" or sw_bajo_nivel=="On")
  {
sw_bajo_nivel="ON";
}

 else if(sw_bajo_nivel=="OFF" or sw_bajo_nivel=="off" or sw_bajo_nivel=="Off")
  {
sw_bajo_nivel="OFF";
}
 else 
  {
  comunicacion="Falla";
  }

 //Verifico el estado de la válvula de servicio
 
 if(valvula=="ABIERTA" or valvula=="abierta" or valvula=="Abierta")
  {
valvula="ABIERTA";
}

 else if(valvula=="CERRADA" or valvula=="cerrada" or valvula=="Cerrada")
  {
valvula="CERRADA";
}
 else 
  {
  comunicacion="Falla";
  }

 
 //Chequeamos la comunicación con el archivo de Texto
 
 if (comunicacion=="Normal" )
  {
  aux=0;
  }
 if (comunicacion=="Falla" )
  {
  aux=1;
  }
 
 
 
 // Hacemos los cálculos del sistema
  
 if (aux==0)
  {
  
 // imprimimos los valores en pantalla cuando la comunicación esta ok
 
 
  if(pantalla=="ON")
  {
  system("cls");
    cout <<endl<<"        COMPORTAMIENTO DEL SISTEMA "<<endl;
  cout <<endl<<"             La Presión= "<<presion<<endl;
  cout <<"             Tu bomba esta= "<<bomba<<endl; 
  if(sw_bajo_nivel=="OFF")
  {
  texto_aux="ALARMA";
  }
else
  {
  texto_aux="NORMAL";
  }
  cout <<"             El Switch de bajo nivel= "<<texto_aux<<endl;
  cout <<"             La válvula esta= "<<valvula<<endl<<endl;  
    cout <<"     **** COMUNICACIÓN CON EL ARCHIVO NORMAL *****";
  pantalla ="OFF"; 
    }

//  Establecemos un tiempo de 1 de segundo para ver los cambios en la presión

    Sleep (1000);
    
    
// Simulamos la Presión    
    
    if (valvula=="CERRADA" and bomba=="ENCENDIDA")
    {
      presion=presion+3;
        pantalla ="ON";
    }
 
  if (valvula=="ABIERTA" and bomba=="APAGADA")
    {
      presion=presion-3;
        pantalla ="ON";
    }
 
     if (valvula=="ABIERTA" and bomba=="ENCENDIDA" and presion<32)
    {
      presion=presion+1;
        pantalla ="ON";
      }
 
      if (valvula=="ABIERTA" and bomba=="ENCENDIDA" and presion>32)
    {
      presion=presion-1;
        pantalla ="ON";
        }
 
 //impedimos que la presión de negativo
  
      if (presion<0)
    {
      presion=0;
        pantalla ="ON";
      }

    // Controlamos el encendido y apagado de la bomba
    
      if (sw_bajo_nivel=="OFF" and bomba=="ENCENDIDA")
    {
      bomba="APAGADA";
        pantalla ="ON";
     
  
      if (sw_bajo_nivel=="ON" and presion<20 and bomba=="APAGADA")
    {
      bomba="ENCENDIDA";
        pantalla ="ON";
      }  
      if (sw_bajo_nivel=="ON" and presion>40 and bomba=="ENCENDIDA")
    {
      bomba="APAGADA";
        pantalla ="ON";
     
  
   
  }
 
  // Imprimimos la información con la comunicación fallada
  
 if (aux==1)
  {
  
  if(pantalla=="ON")
  {
  system("cls");
    cout <<endl<<"    EL PROGRAMA NO OPERA DEBIDO A QUE: "<<endl<<endl;
cout <<"    (1) EL CONTENIDO DEL ARCHIVO FUE ESCRITO "<<endl;
cout <<"        DE FORMA INCORRECTA (ON/OFF ABIERTA/CERRADA) "<<endl; 
cout <<"    (2) NO HAY COMUNICACIÓN CON EL ARCHIVO .TXT (REVISE LA RUTA) "<<endl;
cout <<"    (3) LAS DOS RAZONES ANTERIORES ";
  pantalla ="OFF"; 
    }  
 
   }
 
 goto inicio;
 
}




ARCHIVO PRUEBA.TXT

  OFF                                       ABIERTA                              

 Switch de Nivel            Válvula a la descarga                 

(ON= Agua, Off=Vacio)   (ABIERTA / CERRADA)  

                                              



El Archivo de texto debe presentar la data en la primera línea de lo contrario no será leído por el programa.

Verifique que la ruta donde colocó el archivo de texto sea la indicada en el programa de lo contrario la data no será leída.

Para C++ Recuerde cambiar "\" por "\\" cuando declare la ruta dentro del programa.

Éxito 

martes, 19 de mayo de 2026

03a.- Programación II - Esquema de Bombeo - Simulación Clase Nro. 1

Basado en el siguientes esquema de Control




En la clase de hoy se elaboró tablas de la verdad que simulan el apagado y encendido de la bomba y el comportamiento de la presión a la descarga de la bomba.

Adicionalmente se elaboró un archivo de texto que simula: el Switch de Nivel (Interruptor de Bajo nivel),  la Válvula de servicios y Modo de Operación de la bomba (Local / Remoto).




Se indicó que tanto la Válvula como el Switch  lo manipularía el estudiante desde el archivo de texto y que el programa respondería basado en las tablas de la verdad para la Presion y la Bomba:





miércoles, 13 de mayo de 2026

02o.- Programación II - Parcial Nro. 2 (Semestre 2026 - II) - Solución del Profesor

 


Solución



Programa Nro. 1 Por Iteración

/* Programa de resolución del Parcial Nro. 2 "Game of Thrones"

   aplicando la ecuación obtenida con el método de la iteración
   rev. Mayo 2026
   Elaborado por: Carlos Ferrer
   */

#include<iostream>
#include<math.h>
#include<locale.h>
using namespace std;

main ()
{
double vo, h, g=9.8;
double Q, x;
double x2; // x de iteración
setlocale(LC_ALL,"spanish");
//Ingresamos datos
    do
{
cout <<"Ingrese altura de ubicación de la catapulta (100-900 mts) = "<<endl;
cin >>h;
if (h<100 or h>900)
   {
    cout <<endl<<"Valor ingresado de "<<h<<" mts"<<" fuera de rango" <<endl;
cout <<"El valor debe estar el rango de 100 a 900 mts! "<<endl<<endl;
   }
}
while (h<100 or h>900);
    do
{
cout <<"Ingrese la velocidad inicial de la catapulta (40-90 mts/seg) = "<<endl;
cin >>vo;
if (vo<40 or vo>90)
   {
    cout <<endl<<"Valor ingresado de "<<vo<<" mts/seg"<<" fuera de rango" <<endl;
cout <<"El valor debe estar el rango de 40 a 90 mts/seg! "<<endl<<endl;
   }
}
while (vo<40 or vo>90);
// Iteramos Q hasta conseguir X(max)
    
Q=0;
    x=vo*cos(Q)*(vo*sin(Q)+sqrt(pow(vo,2)*pow(sin(Q),2)+2*g*h))/g;
    while(Q<90)
    {
    Q=Q+0.001;
x2=vo*cos(Q*M_PI/180)*(vo*sin(Q*M_PI/180)+sqrt(pow(vo,2)*pow(sin(Q*M_PI/180),2)+2*g*h))/g;
if (x2>x)
{
x=x2;
}
else
{
break;
}
}
    
// Presentamos resultados
cout <<endl<<"Q= "<<Q<<" grados"<<endl;
    cout <<endl<<"X(max)= "<<x<<" mts"<<endl;
if (x<1100 or x>1200 )
{
cout <<endl<<"Favor no proceda a liberar la catapulta dado que"<<endl;
cout <<"la carga caerá fuera del rango establecido de 1100 a 1200 mts"<<endl;
}
    else
    {
cout <<endl<<"Favor proceda a liberar la catapulta dado que"<<endl;
cout <<"la carga caerá dentro del rango establecido de 1100 a 1200 mts"<<endl;
cout <<"exactamente a "<<x<<" mts."<<endl;
}
}

Programa Nro. 2 Por Derivación (Optimización)


/* Programa de resolución del Parcial Nro. 2 "Game of Thrones"
   aplicando la ecuación obtenida con el método de la optimización
   (La derivada)
   rev. Mayo 2026
   Elaborado por: Carlos Ferrer
   */

#include<iostream>
#include<math.h>
#include<locale.h>
using namespace std;

main ()
{
double vo, h, g=9.8;
double Q, x;
setlocale(LC_ALL,"spanish");
//Ingresamos datos
    do
{
cout <<"Ingrese altura de ubicación de la catapulta (100-900 mts) = "<<endl;
cin >>h;
if (h<100 or h>900)
   {
    cout <<endl<<"Valor ingresado de "<<h<<" mts"<<" fuera de rango" <<endl;
cout <<"El valor debe estar el rango de 100 a 900 mts! "<<endl<<endl;
   }
}
while (h<100 or h>900);
    do
{
cout <<"Ingrese la velocidad inicial de la catapulta (40-90 mts/seg) = "<<endl;
cin >>vo;
if (vo<40 or vo>90)
   {
    cout <<endl<<"Valor ingresado de "<<vo<<" mts/seg"<<" fuera de rango" <<endl;
cout <<"El valor debe estar el rango de 40 a 90 mts/seg! "<<endl<<endl;
   }
}
while (vo<40 or vo>90);
    //Calculamos Q en radianes
    
Q=asin(vo*sqrt(2*(g*h+pow(vo,2)))/(2*(g*h+pow(vo,2))));
        
    // Calculamos x máxima
    
    x=vo*cos(Q)*(vo*sin(Q)+sqrt(pow(vo,2)*pow(sin(Q),2)+2*g*h))/g;
    
// Presentamos resultados
cout <<endl<<"Q= "<<Q*180/M_PI<<" grados"<<endl;
    cout <<endl<<"X(max)= "<<x<<" mts"<<endl;
if (x<1100 or x>1200 )
{
cout <<endl<<"Favor NO proceda a liberar la catapulta dado que"<<endl;
cout <<"la carga caerá fuera del rango establecido de 1100 a 1200 mts"<<endl;
}
    else
    {
cout <<endl<<"Favor proceda a liberar la catapulta dado que"<<endl;
cout <<"la carga caerá dentro del rango establecido de 1100 a 1200 mts"<<endl;
cout <<"exactamente a "<<x<<" mts."<<endl;
      }
}

Éxitos