Je n'y comprend plus rien

ame -  
 ame -
Bonjour,
voici mon programme au complet

//-------------------------------------------------------------------
#include <vcl\condefs.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <conio.h>
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <math.h>

#define pi 3.1415926536
#define E 100
//------------------------------------------------------------------
// PARAMÈTRES DE LA MACHINE
//------------------------------------------------------------------

const int P = 2, // nombre de paires de pôles

maxit = 10000; // Nombre maximum de génération

double Rr = 0.137, // Resistance rotorique
Rs = 0.164, // Resistance statorique
Rm = 110, // Resistance fer
Lr = 0.023, // Inductance cyclique rotorique
Ls = 0.023, // Inductance cyclique statorique
M = 0.022,
Lm = 0.022, // Inductance mutuelle
rap = 0, // Rm/w (Rated Rm/rated frequency)
nomflux= 1.5, // flux nominal
maxflux= 1.5*nomflux,// flux maximum
delta_t= 1e-3,
dt = 1e-3, // période de calcul

Tr =1.1, // couple mécanique

K = 0.01224, // facteur de friction
Kpvit = 0.05,
Kivit = 0.001,
Kpisq = 2.5,
Kiisq = 1.001,
Kpisd = 2.1,
Kiisd = 2.05,
J = 0.01; // Moment d'inertie

//------------------------------------------------------------------
// Initialisation de variables
//------------------------------------------------------------------

char file_name[20];
FILE *fp,*fopen();
int tc, k, compteur, Nombre_Ts,compteur1,compcase=0,
casmonte,compteur2,compteur3,compteur4;

char t_final,t, tin,n,
isqref,isdref,
slip,
Uqref,Udref,
Udsref,Uqsref,
Va,Vb,Vc,
Uqs,Uds,Uq,Ud,
K1isd = 0,K2isd = 0,K3isd = 0,K4isd = 0,
K1isq = 0,K2isq = 0,K3isq = 0,K4isq = 0,
K1vitm = 0,K2vitm = 0,K3vitm = 0,K4vitm = 0,
K1ird = 0,K2ird = 0,K3ird = 0,K4ird = 0,
K1irq = 0,K2irq = 0,K3irq = 0,K4irq = 0,
K1imd = 0,K2imd = 0,K3imd = 0,K4imd = 0,
K1imq = 0,K2imq = 0,K3imq = 0,K4imq = 0,
Delta_P,sigma,flux1,
vitm1,isd1,isq1,ird1,irq1,imd1,imq1,angle1,
flux_rd2[maxit], n1[maxit],
Va2[maxit],vitm2[maxit],
Tem[maxit],temps[maxit],
Pout, Pin,Ploss,tmpflux,pinb,
Psortie[maxit],Pentree[maxit],Perte[maxit],
isd2[maxit],isq2[maxit],vitref1[maxit],
uq2[maxit],ud2[maxit],Vss[maxit],Tr1[maxit],
K1,K2,K3,
isqtest,Uqreftest,Tetha,errvit,errisq,errisd;

char flux_rd = 1.5, // flux initial du rotor
flux_rq = 1.5,

vitref = 180,
angle = 0, // position initaiale du rotor
angle_slip = 0, // angle initial de glissement du rotor
isd = 0.001, // courant inducteur initial suivant d
isq = 0.001, // courant inducteur initial suivant q
imd = 0.001,
imq = 0.001,
ird = 0.001,
irq = 0.001,
Te = 0.001, // couple électromagnétique initiale
pina = 100000,
vitm = 0.001, // vitesse mécanique initiale du rotor

//Initialisation des variables des intégrateurs dans le régulateurs PI (Id, Iq et vit)

serrvit = 0,
serrisq = 0,
serrisd = 0;
int x = 0;
int pass = 0;
int pass1 = 0;
double flux_final ;

FILE *fd2;

#pragma hdrstop
//---------------------------------------------------------------------------
USERES("model2.res");
//---------------------------------------------------------------------------
void main()
{

cout << "Temps de simulation (sec.) = " <<endl ;
cin >> t_final;

/*********************/
/* VALEURS INITIALES */
/*********************/

t = 0;
tin = 0;
k = 1;
compteur=0;

tc = ((t_final/delta_t))/1000 ;
t_final = 998*delta_t*tc;

cout << "le temps de simulation est de : " << tc <<endl;
cout << "le temps final du reglage est de : " << t_final <<endl;

while ( t <= t_final)
{

// réglage de la vitesse

/*errvit = vitref - vitm;
serrvit = serrvit + errvit;

isqref = (Kpvit * errvit) + (Kivit * serrvit);
slip = (M*Rr*isqref)/(Lr*flux_rd); // glissement
angle_slip = angle_slip + (delta_t * slip);
Tetha = angle + angle_slip; */ // angle de glissement du stator

// Boucle de controle du courant

for (Nombre_Ts = 0; Nombre_Ts < 20; Nombre_Ts++)
{
//--------------------------------------------------------------------
// First apply variables to Regulator model
//--------------------------------------------------------------------

sigma=1-(M*M)/(Ls*Lr); // coefficient de dispersions de Blondel

/* //Régulation du courant Isq :
errisq = isqref - isq;
serrisq = serrisq + errisq;
Uqref = (Kpisq*errisq) + (Kiisq * serrisq) ;

//Régulation du courant Isd:
isdref = flux_rd/M; //Référence de Isd

errisd = isdref - isd;
serrisd = serrisd + errisd;
Udref = (Kpisd * errisd) + (Kiisd * serrisd) ;

//-------------------------------------------------------------------
// Transformation de Park (Uqref,Udref)-> (Va,Vb,Vc)
//-------------------------------------------------------------------

Uqsref = Uqref * cos(Tetha) + Udref * sin(Tetha);
Udsref = -Uqref * sin(Tetha) + Udref * cos(Tetha);

Va = Uqsref;
Vb = -0.5 * Uqsref - (0.866) * Udsref;
Vc = -0.5 * Uqsref + (0.866) * Udsref;

Uq = Uqref;
Ud = Udref; */
Uq = 60;
Ud = 120;

//------------------------------------------------------------------------------
// Équations de la machine résolues par la méthode de Runge-Kutta du 4eme ordre
//------------------------------------------------------------------------------
// K1w= dt*(((Lm/Lr)*flux_rd*isq)-K*w1-Tr)/J;
K1vitm=delta_t*((M/Lr)*flux_rd*isq-K*vitm-Tr)/J;
// suivant q
K1isq = dt*(Uq-((Rs+Rm)*isq)+(Rm*imq)-(Rm*irq))/Ls;
K1imq = dt*Rm*(imq-isq-irq)/Lm;
K1irq = (dt/Lr)*((Rm*(imq-isq))-(irq*(Rm+Rr))+ vitm*((Lm*imd)+(Lr*ird)));
// suivant d
K1isd = dt*(Ud-((Rs+Rm)*isd)+(Rm*imd)-(Rm*ird))/Ls;
K1imd = dt*Rm*(imd-isd-ird)/Lm;
K1ird = dt*((Rm*(imd-isd))-(ird*(Rm+Rr))+
(vitm*((Lm*imq)+(Lr*irq))))/Lr;
/*
//K2w=dt*(((Lm/Lr)*flux_rd*(isq+0.5*K1isq))-K*(w1+0.5*K1w)-Tr)/J;
K2vitm=delta_t*((M/Lr)*flux_rd*(isq+0.5*K1isq)-K*(vitm+0.5*K1vitm)
-Tr)/J;
// suivant q
K2isq = dt*(Uq-((Rs+Rm)*(isq+0.5*K1isq))+
(Rm*(imq+0.5*K1imq))-(Rm*(irq+0.5*K1irq)))/Ls;
K2imq = dt*Rm*((imq+0.5*K1imq)-(isq+0.5*K1isq)-(irq+0.5*K1irq))/Lm;
K2irq = dt*((Rm*((imq+(0.5*K1imq))-(isq+(0.5*K1isq))))-((irq+(0.5*K1irq))*(Rm+Rr))
+((vitm+(0.5*K1vitm))*((Lm*(imd+(0.5*K1imd)))+(Lr*(ird+(0.5*K1ird))))))/Lr;
// suivant d
K2isd = dt*(Ud-((Rs+Rm)*(isd+0.5*K1isd))+
(Rm*(imd+0.5*K1imd))-(Rm*(ird+0.5*K1ird)))/Ls;
K2imd = dt*Rm*((imd+0.5*K1imd)-(isd+0.5*K1isd)-(ird+0.5*K1ird))/Lm;
K2ird = dt*((Rm*((imd+0.5*K1imd)-(isd+0.5*K1isd)))-((ird+0.5*K1ird)
*(Rm+Rr))+((vitm+0.5*K1vitm)*((Lm*(imq+0.5*K1imq))+(Lr*(irq+0.5*K1irq)))))/Lr;

//K3w=dt*(((Lm/Lr)*flux_rd*(isq+0.5*K2isq))-K*(w1+0.5*K2w)-Tr)/J;
K3vitm=delta_t*((M/Lr)*flux_rd*(isq+0.5*K2isq)-K*(vitm+0.5*K2vitm)
-Tr)/J;

// suivant q
K3isq = dt*(Uq-((Rs+Rm)*(isq+0.5*K2isq))+
(Rm*(imq+0.5*K2imq))-(Rm*(irq+0.5*K2irq)))/Ls;
K3imq = dt*Rm*((imq+0.5*K2imq)-(isq+0.5*K2isq)-(irq+0.5*K2irq))/Lm;
K3irq = dt*((Rm*((imq+0.5*K2imq)-(isq+0.5*K2isq)))-((irq+0.5*K2irq)
*(Rm+Rr))+((vitm+0.5*K2vitm)*((Lm*(imd+0.5*K2imd))+(Lr*(ird+0.5*K2ird)))))/Lr;
// suivant d
K3isd = dt*(Ud-((Rs+Rm)*(isd+0.5*K2isd))+
(Rm*(imd+0.5*K2imd))-(Rm*(ird+0.5*K2ird)))/Ls;
K3imd = dt*Rm*((imd+0.5*K2imd)-(isd+0.5*K2isd)-(ird+0.5*K2ird))/Lm;
K3ird = dt*((Rm*((imd+0.5*K2imd)-(isd+0.5*K2isd)))-((ird+0.5*K2ird)
*(Rm+Rr))+((vitm+0.5*K2vitm)*((Lm*(imq+0.5*K2imq))+(Lr*(irq+0.5*K2irq)))))/Lr;

//K4w=dt*(((Lm/Lr)*flux_rd*(isq+K3isq))-K*(w1+K3w)-Tr)/J;
K4vitm=delta_t*((M/Lr)*(flux_rd)*(isq+K3isq)-K*(vitm+K3vitm)-Tr)/J;
// suivant q
K4isq = dt*(Uq-((Rs+Rm)*(isq+K3isq))+
(Rm*(imq+K3imq))-(Rm*(irq+K3irq)))/Ls;
K4imq = dt*Rm*((imq+K3imq)-(isq+K3isq)-(irq+K3irq))/Lm;
K4irq = dt*((Rm*((imq+K3imq)-(isq+K3isq)))-((irq+K3irq)
*(Rm+Rr))+((vitm+K3vitm)*((Lm*(imd+K3imd))+(Lr*(ird+K3ird)))))/Lr;
// suivant d
K4isd = dt*(Ud-((Rs+Rm)*(isd+K3isd))+
(Rm*(imd+K3imd))-(Rm*(ird+K3ird)))/Ls;
K4imd = dt*Rm*((imd+K3imd)-(isd+K3isd)-(ird+K3ird))/Lm;
K4ird = dt*((Rm*((imd+K3imd)-(isd+K3isd)))-((ird+K3ird)
*(Rm+Rr))+((vitm+K3vitm)*((Lm*(imq+K3imq))+(Lr*(irq+K3irq)))))/Lr; */

isd1 = isd + (K1isd + 2*K2isd + 2*K3isd + K4isd)/6;
isq1 = isq + (K1isq + 2*K2isq + 2*K3isq + K4isq)/6;
imd1 = imd + (K1imd + 2*K2imd + 2*K3imd + K4imd)/6;
imq1 = imq + (K1imq + 2*K2imq + 2*K3imq + K4imq)/6;
ird1 = ird + (K1ird + 2*K2ird + 2*K3ird + K4ird)/6;
irq1 = irq + (K1irq + 2*K2irq + 2*K3irq + K4irq)/6;
vitm1= vitm + (K1vitm + 2*K2vitm + 2*K3vitm + K4vitm)/6;
//w2 = w1+(K1w + 2*K2w + 2*K3w + K4w)/6;
angle1 = angle + P*delta_t*vitm1 ;

if (angle1 >= 2*pi) {angle1 = angle1 - 2*pi;}
Te=(M/(Lr))*((flux_rd*isq1)-(flux_rq*isd1));

isd = isd1;
isq = isq1;
ird = ird1;
irq = irq1;
imd = imd1;
imq = imq1;
vitm = vitm1;
//w1 = w2;

/*K1isd=delta_t*(Ud-Rs*isd+(vitm+isq*M*Rr/(Lr*flux_rd))*sigma*Ls*isq)/
(sigma*Ls);
K1isq=delta_t*(Uq-Rs*isq-(vitm+isq*M*Rr/(Lr*flux_rd))*(M/Lr)*flux_rd
-(vitm+isq*M*Rr/(Lr*flux_rd))*sigma*Ls*isd)/(sigma*Ls);
K1vitm=delta_t*((M/Lr)*flux_rd*isq-K*vitm-Tr)/J;

K2isd=delta_t*(Ud-Rs*(isd+(0.5)*K1isd)+((vitm+(0.5)*K1vitm)+(isq
+(0.5)*K1isq)*M*Rr/(Lr*flux_rd))*sigma*Ls*(isq+(0.5)*K1isq))
/(sigma*Ls);
K2isq=delta_t*(Uq-Rs*(isq+0.5*K1isq)-((vitm+0.5*K1vitm)+(isq
+0.5*K1isq)*M*Rr/(Lr*flux_rd))*(M/Lr)*flux_rd-((vitm
+0.5*K1vitm)+(isq+0.5*K1isq)*M*Rr/(Lr*flux_rd))*sigma*Ls*(isd+
0.5*K1isd))/(sigma*Ls);
K2vitm=delta_t*((M/Lr)*flux_rd*(isq+0.5*K1isq)-K*(vitm+0.5*K1vitm)
-Tr)/J;

K3isd=delta_t*(Ud-Rs*(isd+0.5*K2isd)+((vitm+0.5*K2vitm)+(isq
+0.5*K2isq)*M*Rr/(Lr*flux_rd))*sigma*Ls*(isq+0.5*K2isq))
/(sigma*Ls);
K3isq=delta_t*(Uq-Rs*(isq+0.5*K2isq)-((vitm+0.5*K2vitm)+(isq
+0.5*K2isq)*M*Rr/(Lr*flux_rd))*(M/Lr)*flux_rd-((vitm
+0.5*K2vitm)+(isq+0.5*K2isq)*M*Rr/(Lr*flux_rd))*sigma*Ls*(isd
+0.5*K2isd))/(sigma*Ls);
K3vitm=delta_t*((M/Lr)*flux_rd*(isq+0.5*K2isq)-K*(vitm+0.5*K2vitm)
-Tr)/J;

K4isd=delta_t*(Ud-Rs*(isd+K3isd)+((vitm+K3vitm)+(isq+K3isq)*M*Rr
/(Lr*flux_rd))*sigma*Ls*(isq+K3isq))/(sigma*Ls);
K4isq=delta_t*(Uq-Rs*(isq+K3isq)-((vitm+K3vitm)+(isq+K3isq)*M*Rr
/(Lr*flux_rd))*(M/Lr)*flux_rd-((vitm+K3vitm)+(isq+K3isq)*M*Rr
/(Lr*flux_rd))*sigma*Ls*(isd+K3isd))/(sigma*Ls);
K4vitm=delta_t*((M/Lr)*(flux_rd)*(isq+K3isq)-K*(vitm+K3vitm)-Tr)/J;

isd1 = isd + (0.1667) * (K1isd + 2*K2isd + 2*K3isd + K4isd);
isq1 = isq + (0.1667) * (K1isq + 2*K2isq + 2*K3isq + K4isq);
vitm1= vitm + (0.1667) * (K1vitm + 2*K2vitm + 2*K3vitm + K4vitm);

angle1 = angle + P*delta_t*vitm1 ;

if (angle1 >= 2*pi) {angle1 = angle1 - 2*pi;}

Te=(M/(Lr))*flux_rd*isq1; // Couple électromagnétique

isd = isd1;
isq = isq1;
vitm = vitm1;
angle = angle1; */

//--------------------------------------------
// Calcul des puissances
//--------------------------------------------

Pout = Te*vitm; // puissance d'entrée
Pin = (isd*Ud + isq*Uq); // puissance de sortie
Ploss = Pin - Pout; // pertes
if (Pin=!0){n = Pout/Pin;} // rendement de la machine
compteur2++;

/*if( compteur2 == 10000)
{

if(t>10)
{
if(pass==0)
{
flux_rd=flux_rd+0.01;
pinb=Pin;

}
if(pass==1)
{
if(pinb>Pin)
cotecourbe=0;
else{cotecourbe=1;}}
if(pass>=2){
if(cotecourbe==0){ pass=2;

if(pina>Pin)
{
pina=Pin;
flux_rd=flux_rd+0.1;
}
else{pina=0;}
}
else{
if(pina>Pin)
{
pina=Pin;
flux_rd=flux_rd-0.1;
}
else{pina=0; }
}
}
pass++;
}
compteur2=0;

} */

//------------------------------------------------
// enrégistrement des variables dans des vecteurs
//------------------------------------------------
compteur++;

t = t + delta_t; // temps

if (compteur == tc)
{

temps[x] = t;

isq2[x] = isq;
isd2[x] = isd;
uq2[x] = Uq;
ud2[x] = Ud;
n1[x] = n;
Psortie[x] = Pout;
Pentree[x] = Pin;
Perte[x] = Ploss;

flux_rd2[x] = flux_rd;
vitm2[x] = vitm;
Tem[x] = Te;
Va2[x] = Va;
Vss[x] = sqrt(Uq*Uq + Ud*Ud);
Tr1[x] = Tr;

vitref1[x] = vitref;

compteur = 0; // Reinitialisation du compteur
x++;
}

} // fin de la boucle "for" : boucle du courant;

} // fin de la boucle "while"

//----------------------------------------------------------------------
// Enregistrement des données dans un fichier pour un usage sous Matlab
//----------------------------------------------------------------------

printf(" Donnez le nom de fichier avec extension(*.m) :\n");
scanf("%s",file_name);
if ((fp = fopen(file_name,"w"))==NULL) printf("erreur");

fprintf(fp,"t=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",temps[compteur] );
fprintf(fp,"];");

fprintf(fp,"Pin=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",Pentree[compteur]);
fprintf(fp,"];");

fprintf(fp,"Te=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",Tem[compteur]);
fprintf(fp,"];");

fprintf(fp,"Tr=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",Tr1[compteur]);
fprintf(fp,"];");

fprintf(fp,"vit=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",vitm2[compteur]);
fprintf(fp,"];");

fprintf(fp,"f_rd=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",flux_rd2[compteur]);
fprintf(fp,"];");

fprintf(fp,"Ploss=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",Perte[compteur]);
fprintf(fp,"];");

fprintf(fp,"Pout=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",Psortie[compteur]);
fprintf(fp,"];");

fprintf(fp,"ISQ=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",isq2[compteur]);
fprintf(fp,"];");

fprintf(fp,"ISD=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",isd2[compteur]);
fprintf(fp,"];");

fprintf(fp,"n=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",n1[compteur]);
fprintf(fp,"];");

fprintf(fp,"Uq=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",uq2[compteur]);
fprintf(fp,"];");

fprintf(fp,"Ud=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",ud2[compteur]);
fprintf(fp,"];");

fprintf(fp,"Ua=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",Va2[compteur]);
fprintf(fp,"];");

fprintf(fp,"Us=[");
for (compteur =0; compteur<x-2;compteur++) fprintf(fp, " %f,\n",Vss[compteur]);
fprintf(fp,"];");

fprintf(fp,"plot(t,vit);grid;");
fprintf(fp,"ylabel('vitesse (rad/sec)');");
fprintf(fp,"pause;");

//fprintf(fp,"subplot(222);");

fprintf(fp,"plot(t,Ploss);grid;");
fprintf(fp,"ylabel('Pertes (W)');");
fprintf(fp,"pause;");

//fprintf(fp,"subplot(223);");
fprintf(fp,"plot(t,f_rd);grid;");
fprintf(fp,"ylabel('Flux (Wb)');");
fprintf(fp,"pause;");

//fprintf(fp,"subplot(224);");
fprintf(fp,"plot(t,Pin);grid;");
fprintf(fp,"ylabel('Pin (W)');");
fprintf(fp,"pause;");

fprintf(fp,"plot(t,n);grid;");
fprintf(fp,"ylabel('rendement()');");
fprintf(fp,"pause;");

fprintf(fp,"plot(t,Pout);grid;");
fprintf(fp,"ylabel('Psortie (W)');");
fprintf(fp,"pause;");

fprintf(fp,"plot(Tr,n);grid;");
fprintf(fp,"ylabel('rendement()');");
fprintf(fp,"pause;");

fprintf(fp,"plot(f_rd,Ploss);grid;");
fprintf(fp,"ylabel('pertes(W)');");
fprintf(fp,"pause;");

fclose(fp);

} /* Fin du Main */

//-----------------------------------------------------------------------
// End of program
//-----------------------------------------------------------------------

a l'execution il m'affiche le message d'erreur suivant:
acces violation at 0x78787878:read of address 0x78787878 63 9A 41 00 5C 2D 62 03 81 2A 49 00

Si quelqu'un peut m'aidr a decanter cette situation ca me ferait vraiment du bien.
je compte sur vous.merci

2 réponses

Scalpweb
 
Alors je vais me taper le petit millier de ligne, mais vu le message d'erreur, tu dois avoir une fuite de mémoire surement dut à une mauvaise allocution ou un mauvais déchargement.

Si tu utilises des pointeurs, vérifie qu'ils soient bien tous initialisés et tous détruis à la fin de leurs utilisations.
0
ame
 
merci pour tes indications apparamment le probleme se trouve au niveau de la resolution des equationspar la methode de runge kutta. parceke lorsque je met cette partie en commentaire le programme s'execute sans probleme.
je vais ester de revoir une autre methode de resolution des eqations differentielles. vos propositions sont les bien venues
0