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 




02ñ.- Programación II - Ejercicio tipo Parcial Nro. 2 (3er Ejemplo) - Solución del Profesor

 Parcial Nro.2

El ejercito Ucraniano recurre a usted, su misión es programar un dron para bombardear un tren ruso. La inteligencia Ucraniana informó que el general mas sanguinario del ejercito ruso viajará en el tercer vagón del tren. Los espías ubicados en la ciudad de "Jersón" informarán el momento exacto en que el tren comience a moverse. Se desconoce la velocidad del tren, sin embargo sabemos que es constante a lo largo del recorrido. El conductor del tren fija la velocidad en un rango entre  80 y 150 km/hr. En el momento que inicie movimiento el tren usted arrancará un dron con explosivo C4. El dron vuela a velocidad constante de 15 mts/seg. Usted puede programar el dron para que vuele a una altura entre 20 y 80 mts. de forma de que no sea detectado por las defensas rusas. El dron dispone de un radar que detectará la punta del tren cuando se encuentre a 500 mts. de distancia horizontal del dron.


Usted deberá elaborar un programa que determine a partir del momento en que el dron detecta el tren:

1.- Distancia en metros para soltar el explosivo.
2.- Tiempo en segundos para soltar el explosivo.

Es importante que el programa considere que el general ruso viaja en el centro del tercer vagón y el vagón tiene una altura de 2.5 metros, cada vagón mide 10 metros. Se desea minimizar daños colaterales.



Los únicos datos de entrada del programa corresponderán a:

Altura del Dron en Metros.
Velocidad del Tren en Km/hr.

Nota: Utilice gravedad de 9.8 mts/seg2

Solución

Determinamos el tiempo de vuelo y el recorrido del C4 una vez es liberado, el movimiento del C4 en horizontal es un Movimiento Rectilíneo Uniforme (M.R.U), como es liberado el ángulo de elevación es 0 grados en horizontal y -90 grados en vertical. En consecuencia:

Xc4 = Vo cos 0 tc4  => como el cos 0 = 1, entonces el Xc4 = Vo tc4  (ecuación Nro. 1)

El movimiento en vertical es un Movimiento Uniformemente Acelerado (M.U.A) en consecuencia el desplazamiento vertical correspondería a:

2.5 mts = Yo + Vo sen 90 tc4 – g (tc4)/2, como seno 90 = 1, entonces la ecuación quedaría:

2.5 mts = yo – 9.8 mts/seg (tc4)/2 => 4.9 mts/seg (tc4)= (yo – 2.5) mts =>

Tc4 = √ [(yo – 2.5) mts / 4.9 mts/seg2] => Tc4 = √ [(yo – 2.5) / 4.9] seg

Como Yo es un dato conocido que opera entre 20 y 80 mts, podemos determinar tvc4 posteriormente conociendo ese dato podemos determinar Xc4, con la ecuación Nro 1.

Sabemos que el radar detecta la punta del tren a una distancia de 500 mts, la ubicación del general Chavenko es 25 mts más atrás ósea a 525 mts del Dron. El proyectil viaja a la velocidad del Dron y una vez soltado conserva esa velocidad en horizontal, el tren viaja a una velocidad conocida en km/hr que llamaremos Vtren, en consecuencia, llamemos Xdron al desplazamiento del Dron antes de soltar el C4. Podemos determinar el punto de impacto del tren y el c4 determinando el tiempo en el cual se encuentran ambos. Los movimientos horizontales del Dron, el C4 una vez soltado y el tren son Movimientos Rectilíneos Uniformes (M.R.U). Por lo tanto, podemos afirmar que el C4 y el Tren se encuentran en el mismo punto:

Xdron + Xc4 = (525mts – Xtren) =>

15 mts/seg x tdron + Xc4 = (525mts – Vtren ttren)

Pero el ttren = tdron + tc4, por lo tanto

15 mts/seg x tdron + Xc4= (525mts – Vtren (tdron + tc4))

El tc4 y Xc4 son datos que calculamos previamente y Vtren es un dato conocido detectado por el radar del Dron (mínimo 80 km/hr máximo 150 km/hr). En consecuencia, podemos determinar el tiempo del Dron (tdron), el cual sería el tiempo desde que se detecta el tren hasta que se libera la carga. Al conocer ese tiempo también podemos determinar la distancia precisa en donde el Dron libera la carga. Por lo tanto,

15 mts/seg x tdron + Xc4 = 525mts – Vtren tdron – Vtren tc4 =>

15 mts/seg x tdron + Vtren tdron = 525mts – Vtren tc4 - Xc4 =>

tdron (15 mts/seg + Vtren) = 525mts– Vtren tc4 - Xc4 =>

tdron = (525mts– Vtren tc4 - Xc4) / (15 mts/seg + Vtren)

 

Con el tdron calculamos Xdron = 15 mts/seg tdron, ambos datos corresponden a lo solicitado.

Por ejemplo, determinemos tdron y Xdron, si la altura del Dron es 50 mts y la velocidad del tren es 100 km/hr.

Respuesta:

Determinemos tc4 y Xc4

Tc4 = √ [(50 – 2.5) mts / 4.9 mts/seg2] => Tc4 = √ [(50 – 2.5) / 4.9] seg

Tc4 = 3.11349925 seg

Xc4 = 3.11349925 seg x 15 mts/seg => Xc4 = 46.7024887 mts

Ahora determinamos lo solicitado Tdron y Xdron

Vtren = 100 km/hr => Vtren = 27.7777778 mts/seg

tdron = (525mts – 540 mts/seg 3.11349925 seg - 46.7024887 mts) / (15 mts/seg + 27.7777778 mts/seg)

tdron = 9.15923 seg

Xdron = 9.15923 seg x 15 mts/seg => Xdron = 137.388 mts


Programa

/*Programa Parcial Nro. 2: Determine el tiempo que transcurre y la distancia recorrida del Dron de forma de eliminar al General Chavenko, ubicado en la mitad del 3er vagón con destino a Jersón. (Ver texto del parcial)
  
  Elaborado por: Carlos Ferrer
  Revisión: May 2025
  */

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

main()
{
float yo=0; //Altura del Dron en mts
float vtren=0; // Velocidad del tren en Km/hr
/* tiempo de vuelo del C4 una vez es liberado / Distancia recorrida en horizontal por
   el C4 una vez es liberado*/
float tc4,xc4; 
/* tiempo de vuelo del Dron desde que detecta el tren hasta que libera el C4 / Distancia recorrida 
   en horizontal por el Dron desde que detecta el tren hasta que libera el C4*/
float tdron,xdron;
// ingresamos la altura de vuelo del Dron
while (yo<20 or yo>80)
{
cout <<"Ingrese la altura de vuelo del Dron (minimo 20 - maximo 80 mts) = ";
cin >>yo;
if (yo<20 or yo>80)
{
cout <<"Altura de vuelo del Dron ("<<yo<<" mts) Invalida!! ";
Beep(250,125);
Sleep (1000);
system ("cls");
}
    }
    //ingresamos la velocidad del tren detectada por el radar del Dron
    
     while (vtren<80 or vtren>150)
{
cout <<"Ingrese la velocidad del tren detectada por el radar (minimo 80 - maximo 150 km/hr) = ";
cin >>vtren;
if (vtren<80 or vtren>150)
{
cout <<"Velocidad del tren ("<<vtren<<" km/hr) Invalida!! ";
Beep(250,125);
Sleep (1000);
system ("cls");
}
    }
system ("cls");
cout <<"Altura del tren = "<<yo<<" mts"<<endl;
cout <<"Velocidad del tren ("<<vtren<<" km/hr)"<<endl;
//Calculamos los resultados
vtren=vtren*1000/3600;
tc4 = sqrt ((yo - 2.5) / 4.9);
xc4 = tc4*15;
tdron = (525 - vtren* tc4 - xc4) / (15  + vtren);
xdron = tdron*15;
//Presentamos los resultados


        cout <<endl<<"El dron debe liberar el C4 a los "<<tdron<<" seg despues de haber detectado el tren."<<endl; cout <<"Desde que detecta el tren hasta que libera la carga el dron recorrera "<<xdron<<"mts"<<endl<<endl; if (tdron<0) { cout <<endl<<"El Dron no debe liberar la carga,"<<endl; cout <<"NO EXISTE POSIBILIDAD DE DESTRUIR EL PUNTO EXACTO DONDE VIAJA EL GENERAL CHAVENKO"<<endl<<endl; }
system ("pause");
}