unit u_4_carac2; // CONRED46
interface
					{PROGRAMA QUE SIMULA LA GRAFICA DE LA
				  CARACTERISTICA ESTATICA DEL RECTIFICADOR
							 TRABAJANDOEN MODO INVERSOR}

procedure Run_4_carac2;

implementation

USES
wingraph,wincrt,
xmatdefs, DIBUS, RATON,FilUSR, UCntrl, Simul4, traxp, variable,
lib_basi, libep02, libep, libdig01;

VAR
	L_conmu,Alpha:NReal; {.Para controlar variables.}
	Id,Ud:NReal;
	Id_max, Rc:NREal;
	primera:boolean;

	U, gama_min, gama,beta,
	Alfa_v, R_v, L_v, Id_v, Gama_min_v:NReal;

	min, alpha_max, inc:NReal;

{...................................................................}

PROCEDURE GRAFICAR_CARACTERISTICA(var alfa, R, L, Id, Id_max:NReal);
 VAR   x1,y1, x2,y2, xpunto,ypunto:Integer;
		 v_salida:NReal;
 CONST puntos_horizontales=200;
		 origenX=150;
		 origenY=280;
BEGIN
 IF (alfa_v<>alfa) or (R_v<>R) or (L_v<>L) or (Id_v<>Id) or
	 (gama_min_v<>gama_min) then
 begin
 SetFillStyle(1,15); {Borro la £ltima grafica}
 Bar(origenX-59, origenY-110, origenx+puntos_horizontales+10,origeny+150);

 SetLineStyle(0,0,3);
 SetColor(1);      {Pinto el eje de coordenadas}
 Line(origenX,origenY, origenX+puntos_horizontales+20,origenY);
 Line(origenX,origenY-100, origenX,origenY+100);

 v_salida:=311*1.35*cos(alfa*PI/180);  {calculos de la coord. de la linea}
 x1:=origenX;
 y1:=Round(origenY -  v_salida*0.22 );
 x2:=origenX+puntos_horizontales;
 y2:=Round(origenY- v_salida*0.22+   0.22*(Id_max*(Rc+ 300*L )));

 SetLineStyle(0,0,3);                {pinto la linea}
 SetColor(12);
 Line(x1,y1,x2,y2);
 SetLineStyle(0,0,0);

												 {calculo las coord. del punto}
 xpunto:=Round(origenX+id*puntos_horizontales/Id_max);
 ypunto:=Round(origenY - v_salida*0.22+ 0.22*(id*(Rc+ 300*L )));

 SetColor(12);
 FillEllipse(xpunto,ypunto,4,4);       {pinto el punto}
 PutPixel(xpunto,ypunto,14);

 SetLineStyle(0,0,3);             {pinto la maxima caida de tension}
 SetColor(3);
 Line(x1-15,y1, x1-15,y2);
 OutTextXY(x1-52,y1,'Caida');
 OutTextXY(x1-52,y1+10,'m x.');
 OutTextXY(x1-52,y1+20,'de Ud');

 SetColor(12);                     {pinto la caida real de tension}
 Line(x1-7,y1, x1-7,ypunto);
 OutTextXY(x1-52,y1+40,'Caida');
 OutTextXY(x1-52,y1+50,'Real');

 SetLineStyle(1,0,0);             {linea a trazos desde el punto}
 SetColor(8);
 if alfa<90 then Line(xpunto,ypunto+5, xpunto, origenY)
 else            Line(xpunto,ypunto-5, xpunto, origenY);
 Line(xpunto-5,ypunto, origenx, ypunto);

													{escribo titulo y enmarco}
  SetColor(0);
  SetTextStyle(0,0,1);
  OutTextXY(95,106, 'CaracterĦstica est tica del rectificador');
  MARCO_DESNIVEL(origenX-60, origenY-150, origenx+puntos_horizontales+60,
					 origeny+150, 0,7);
  MARCO_DESNIVEL(origenX-80, origenY-190, origenx+puntos_horizontales+80,
					 origeny+170, 15,0);


 SetTextStyle(2,0,5);                 {pinto etiquetas}
 SetColor(0);
{ OutTextXY(origenX-25, origenY-7,' 0');}
 OutTextXY(origenX-15, origenY-135,' Ud');
 OutTextXY(origenX+puntos_horizontales+30,origenY-7,' Id');
 SetTextStyle(2,0,0);
 OutTextXY(origenX+puntos_horizontales+16,origenY+83,' CaĦda ');
 OutTextXY(origenX+puntos_horizontales+13,origenY+90,'Hold-off ');

								  {marca Hold/off}
 SetTextStyle(2,0,5);
 v_salida:=311*1.35*cos((180-gama_min)*PI/180);  {calculos de la coord. de la linea}
 ypunto:=Round(origenY - v_salida*0.22);
 Line(origenX+puntos_horizontales,ypunto,
		origenX+puntos_horizontales+6,ypunto);
 Line(origenX+puntos_horizontales,origenY+93,
		origenX+puntos_horizontales+6,origenY+93);


 SetLineStyle(1,0,0);                  {linea Idmax}
 SetColor(13);
  OutTextXY(origenX+puntos_horizontales-20,origenY-120,' Id m x');
 Line(origenX+puntos_horizontales,origenY-100,origenX+puntos_horizontales,
		origenY+100);
 Ud:=311*1.35*Cos(alpha*PI/180) -((300*L_conmu+R)*Id);
						{actualizo los valores}
 alfa_v:=alfa;  R_v:=R; L_v:=L; Id_v:=Id; Gama_min_v:=Gama_min;
 end;
END;

{---------------------------------------------------------------------}

PROCEDURE PESCA;
var   i:integer;
		coseno:NReal;
const w=100*PI;

BEGIN

			  {Calculo el tiempo de conmutacion U y de gama}
if alpha<=alpha_max then
begin
coseno:=cos(alpha*PI/180)-w*L_conmu*id/311;
if (coseno>-0.00001) AND (coseno<0.000001) then coseno:=0.000001;
coseno:=ABS(coseno);
U:=ArcTan(SQRT(ABS(1-SQR(coseno)))/coseno);
if alpha>90 then U:=PI-U;
U:=U*180/pi;
U:=trunc(ABS(U-alpha));
beta:=TRUNC(180-alpha);
gama:=180-alpha-U;
end;

alpha_max:=180-U-gama_min;               {controlo el valor de alpha}
if alpha>alpha_max then alpha:=alpha_max;      {y su maximo}

if primera=true then
begin
SetFillStyle(1,1); Bar(16,14, 468,464);
SetFillStyle(1,7);
Bar(150-80+1, 280-190+1, 150+200+80-1,
					 280+170-1);
 RANGO_FILA(10,470);
 RANGO_COLUMNA(10,630);
 MARCO_DESNIVEL(10,8, 474,470, 15,0);
 MARCO_DESNIVEL(15,13, 469,465, 0,15);

SetColor(15);
OutTextXY(93,40,'    Modifique los par metros que desee y compruebe');
OutTextXY(65,60,'la nueva posici˘n del punto de trabajo del rectificador-inversor');

 SetFillStyle(1,15); {pinto de blanco el fondo de la grafica}
 Bar(150-60, 280-150, 150+200+60,280+150);
(*
for i:=0 to 30 do
begin
alpha:=i*5; L_conmu:=0; Rc:=0; id:=0;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
if i=0 then Delay(500);
Delay(30);
end;
for i:=30 downto 0 do
begin
alpha:=i*5;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
Delay(30);
end;

Delay(500);
for i:=0 to 20 do
begin
alpha:=0;
id:=i*0.1;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
Delay(30);
end;
for i:=20 downto 0 do
begin
alpha:=0;
id:=i*0.1;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
Delay(30);
end;

Delay(500);
for i:=1 to 5 do
begin
alpha:=0;
id:=1.5;
L_conmu:=i*0.02;
Rc:=i*2;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
Delay(30);
end;

Delay(500);
for i:=0 to 30 do
begin
alpha:=i*5;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
Delay(30);
end;
for i:=30 downto 6 do
begin
alpha:=i*5;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
Delay(30);
end;


Delay(500);
for i:=1 to 20 do
begin
alpha:=30;
id:=i*0.1;
L_conmu:=0.1;
Rc:=7;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
Delay(30);
end;

Delay(500);
for i:=20 downto 0 do
begin
alpha:=30;
id:=i*0.1;
L_conmu:=0.05;
Rc:=3;
GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
Delay(30);
end;
*)

end;
primera:=false;

GRAFICAR_CARACTERISTICA(alpha,Rc,L_conmu,Id,Id_max);
END;


{---------------------------------------------------------------------}

PROCEDURE FIN;
BEGIN
	halt;
END;


{---------------------------------------------------------------------}

PROCEDURE INICIALIZACION_PARAMETROS;
BEGIN
{valores iniciales de los controles}
primera:=true;
alpha:=120;
alpha_max:=180;
Rc:=4;
id_max:=2;

min:=0;
inc:=2;
END;

{---------------------------------------------------------------------}
procedure xxxx;
begin
end;

{----------------------------------------------------------------------}
{******************************PRINCIPAL*******************************}
{----------------------------------------------------------------------}
procedure Run_4_carac2;
BEGIN
INICIALIZACION_PARAMETROS;

{Indicamos a Simeep donde est n las funciones que preparamos}
Filusr.inicio:=xxxx;
FilUSR.Pesca:=Pesca;
FilUSR.Fin:=Fin;

{Pantalla de controles}
UCntrl.init;


{------------------PARA VISUALIZAR TEXTO EN LA SIMULACION--------------}

UCntrl.insert(new(PCtrlVerTexto,init
(    4,   '    CONTROL DE ',   '   LAS VARIABLES',   ' ')));

UCntrl.insert(new(PCtrlVerTexto,init
(    0,   '   CARACTERISTICA',
			 '      ESTATICA',
			 'RECTIFICADOR-INVERSOR ')));


{---------------PARA CONTROLAR VARIABLES EN LA SIMULACION--------------}

UCntrl.insert(new(PCtrlBotonVar,Init
{renglon, nombre,  unidad, decimales, min, max,   def, inc,    var}
(    6, ' L_conmu',  'mH'    ,0,       0,  100,    40, 5, L_CONMU)));

UCntrl.insert(new(PCtrlBotonVar,Init
{renglon, nombre,  unidad, decimales, min, max,   def, inc,    var}
(    7, 'R interna', 'oh'    ,1,       0,  5,    2,    0.5,    Rc)));

UCntrl.insert(new(PCtrlBotonVar2,Init
{renglon, nombre,  unidad, decimales, min, max,   def, inc,    var}
(    9, '   Alfa',  '§'    ,0,        min,  alpha_max,  alpha, inc,   alpha)));



UCntrl.insert(new(PCtrlBotonVar,Init
{renglon, nombre,  unidad, decimales, min, max,   def, inc,    var}
(    5, 'Gama_min',  '§'    ,0,        0,   50,    30,  1,   gama_min)));

UCntrl.insert(new(PCtrlBotonVar,Init
{renglon, nombre,  unidad, decimales, min, max,   def, inc,    var}
(    8, '   Id',  'A'    ,1,         0,   2,      1.7,  0.1,  id)));


{---------------PARA VER VARIABLES EN LA SIMULACION--------------}
UCntrl.insertdisplay(new(PCtrlVer2Var,init
{ renglon, nombre1, uni1, deci1,  var1 , nombre2, uni2, deci2, var2}
(    2,  CHR(225),  '§',      1  ,  Beta,  CHR(224),  '§',   1 , Alpha)));


UCntrl.insertdisplay(new(PCtrlVer2Var,init
{ renglon, nombre1, uni1, deci1,  var1 , nombre2, uni2, deci2, var2}
(    3, 'Gama',  '§',     1  , gama , 'Gama mĦn.',  '§',   1 , gama_min)));

UCntrl.insertdisplay(new(PCtrlVer2Var,init
{ renglon, nombre1, uni1, deci1,  var1 , nombre2, uni2, deci2, var2}
(    1, 'Ud',  '§',      1  ,  Ud , 'u',  '§',   1 , U)));



Filusr.inicio;
while TRUE do
begin
	FilUsr.pesca;
end;

end;

END.
