| [637] | 1 | #include "diabolo.h" | 
|---|
|  | 2 | #include "bolo.h" | 
|---|
|  | 3 | #include "auto.h" | 
|---|
|  | 4 | #include "courbeVI.h" | 
|---|
|  | 5 | #include "fenetres_diabolo.h" | 
|---|
| [651] | 6 | #include "arcunit.h" | 
|---|
| [637] | 7 |  | 
|---|
|  | 8 | int voie_bit;           // octet contenant dans chaque bit le flag qui dit si on equiloibre cette voie | 
|---|
|  | 9 | int bolo; | 
|---|
|  | 10 | int posi=0;             // valeur du courant (triangle ) | 
|---|
|  | 11 | int act=0; | 
|---|
|  | 12 | int ref_nep=0; | 
|---|
|  | 13 | double Ip=0,Vp=0; | 
|---|
|  | 14 | //--------------------  fonction  exec  de  la  fenetre : courbeVI  ------------------------------- | 
|---|
|  | 15 |  | 
|---|
|  | 16 | void    equilibre_tout(void); | 
|---|
|  | 17 |  | 
|---|
|  | 18 | void exec_courbeVI(int fen,int item,double valeur,...) | 
|---|
|  | 19 | { | 
|---|
|  | 20 | int i,j;double I,V,A,nep;int c;double x[50]; | 
|---|
|  | 21 | double y[nb_max_bolo+1]; | 
|---|
| [639] | 22 | def_gains | 
|---|
| [637] | 23 | switch(item) | 
|---|
|  | 24 | { | 
|---|
|  | 25 | case ouverture  : | 
|---|
|  | 26 | graph->type_symbole=rondplein;efface(fen); | 
|---|
|  | 27 | break; | 
|---|
|  | 28 |  | 
|---|
|  | 29 | case cvi_bolo : | 
|---|
|  | 30 | voie_bit=valeur;        posi=0;tachedefond(fen,-1); | 
|---|
|  | 31 | break; | 
|---|
|  | 32 |  | 
|---|
|  | 33 | /*              bolo=litD(fen,cvi_bolo,0L);posi=0;tachedefond(fen,-1); | 
|---|
|  | 34 | if(bolo) exec_bolo(bolo,b_tri,posi); | 
|---|
|  | 35 | if(bolo) exec_bolo(bolo,b_carre,0); | 
|---|
|  | 36 | break; | 
|---|
|  | 37 | */ | 
|---|
|  | 38 | /*      case cvi_tous : | 
|---|
|  | 39 | bolo=0;posi=0;tachedefond(fen,-1); | 
|---|
|  | 40 | for(j=0;j<nb_max_bolo;j++) | 
|---|
|  | 41 | { | 
|---|
|  | 42 | if(fenetre(j+1) &&(!litD(j+1,b_bloq,0L)) ) | 
|---|
|  | 43 | { | 
|---|
|  | 44 | exec_bolo(j+1,b_tri,0); | 
|---|
|  | 45 | exec_bolo(j+1,b_carre,0); | 
|---|
|  | 46 | } | 
|---|
|  | 47 | } | 
|---|
|  | 48 | break; | 
|---|
|  | 49 | */ | 
|---|
|  | 50 |  | 
|---|
|  | 51 | case cvi_calc_nep : | 
|---|
|  | 52 | ref_nep=ouvreD(0,0,"1e-16/Nep",0); | 
|---|
|  | 53 | graph->type_symbole=rondplein;efface(ref_nep); | 
|---|
|  | 54 |  | 
|---|
|  | 55 | position(fen,0);Ip=0;Vp=0; | 
|---|
|  | 56 | while( (c=litvaleur(fen,x)) >=0) | 
|---|
|  | 57 | { | 
|---|
|  | 58 | //                                      printf(" c=%d \n",c); | 
|---|
|  | 59 | if (c>1) | 
|---|
|  | 60 | { | 
|---|
|  | 61 | I=x[0];V=x[1]; | 
|---|
|  | 62 | ecritD(fen,cvi_valI,"I=%g",I); | 
|---|
|  | 63 | ecritD(fen,cvi_valV,"V=%g",V); | 
|---|
|  | 64 | if(Ip>0) | 
|---|
|  | 65 | { | 
|---|
|  | 66 | A=( (V-Vp)/(I-Ip)-(V+Vp)/(I+Ip) ) / (V+Vp); | 
|---|
|  | 67 | nep= 30. * A / sqrt((V+Vp)/(I+Ip)); | 
|---|
|  | 68 | printf(" I=%g  V=%g  A=%g (10^9V/W^)  1/nep=%g (10^16)  \n",I,V,A,nep); | 
|---|
|  | 69 | trace(ref_nep,I,nep); | 
|---|
|  | 70 | } | 
|---|
|  | 71 | Ip=I;Vp=V; | 
|---|
|  | 72 | } | 
|---|
|  | 73 | } | 
|---|
|  | 74 | break; | 
|---|
|  | 75 |  | 
|---|
|  | 76 |  | 
|---|
|  | 77 | case tache_de_fond      : | 
|---|
|  | 78 | switch(act) | 
|---|
|  | 79 | { | 
|---|
|  | 80 | case 0: /*pas=4; | 
|---|
|  | 81 | if(posi>=20) pas=10; | 
|---|
|  | 82 | if(posi>=60) pas=20; | 
|---|
|  | 83 | if(posi>=100) pas=50; | 
|---|
|  | 84 | if(posi>=200) pas=100; | 
|---|
|  | 85 | if(posi>=600) pas=200; | 
|---|
|  | 86 | if(posi>=1000) pas=500; | 
|---|
|  | 87 | if(litD(fen,cvi_precis,0L)) pas=pas/2; | 
|---|
|  | 88 | posi+=pas; | 
|---|
|  | 89 | if(posi>4000) {posi=0;tachedefond(fen,-1);} | 
|---|
|  | 90 | if(litD(fen,cvi_tous,0L)) | 
|---|
|  | 91 | for(j=0;j<nb_max_bolo;j++) | 
|---|
|  | 92 | { | 
|---|
|  | 93 | if(fenetre(j+1) &&(!litD(j+1,b_bloq,0L)) ) | 
|---|
|  | 94 | exec_bolo(j+1,b_tri,posi); | 
|---|
|  | 95 | } | 
|---|
|  | 96 | else                    exec_bolo(bolo,b_tri,posi); | 
|---|
|  | 97 | */ | 
|---|
|  | 98 |  | 
|---|
|  | 99 | if(litD(fen,cvi_precis,0L)) posi++;     else posi+=2; | 
|---|
| [639] | 100 | printf(" posi=%d \n",posi); | 
|---|
|  | 101 | if(posi>=25) {son(133);posi=0;tachedefond(fen,-1);} | 
|---|
|  | 102 |  | 
|---|
| [637] | 103 | if(!fenetre(fenetre_automatismes)) | 
|---|
|  | 104 | ouvreD(fenetre_automatismes,automatismes_id,"automatismes",exec_automatismes); | 
|---|
|  | 105 | for(i=0;i<6;i++)        if((voie_bit>>i)&1) | 
|---|
|  | 106 | { | 
|---|
|  | 107 | long ll; | 
|---|
|  | 108 | ll=(long)(&(gg->reglage.autom[i].courant))-(long)(&(gg->reglage.autom[0])); | 
|---|
|  | 109 | ecritD(fenetre_automatismes,atm_courant+i,posi+1); | 
|---|
|  | 110 | emission_tc_reduite(tc2_auto_bolo,ll,posi); | 
|---|
|  | 111 | } | 
|---|
|  | 112 | act++; | 
|---|
|  | 113 | break; | 
|---|
|  | 114 |  | 
|---|
|  | 115 | case 1: /* | 
|---|
|  | 116 | if(litD(fen,cvi_tous,0L))       equilibre_tout(); | 
|---|
|  | 117 | else                            auto_control(bolo,auto_carre); | 
|---|
|  | 118 | */ | 
|---|
|  | 119 | act++;  break; | 
|---|
|  | 120 |  | 
|---|
|  | 121 | case 2: /* | 
|---|
|  | 122 | if(litD(fen,cvi_tous,0L))       equilibre_tout(); | 
|---|
|  | 123 | else                            auto_control(bolo,auto_carre); | 
|---|
|  | 124 | */ | 
|---|
|  | 125 | act++;  break; | 
|---|
|  | 126 |  | 
|---|
|  | 127 | case 3: | 
|---|
|  | 128 | j=bolo_rouge(); | 
|---|
|  | 129 | I=calcI(j)*1e3;ecritD(fen,cvi_valI,"I=%g",I);   //  nA | 
|---|
|  | 130 | for(j=0;j<nb_max_bolo;j++) | 
|---|
|  | 131 | { | 
|---|
| [639] | 132 | y[j]=(calcV(j+1)-xbolbrut(j))*1e-3; | 
|---|
|  | 133 | //  corrigée du déséquilibre  en  µV puis transformé en mV | 
|---|
| [637] | 134 | } | 
|---|
|  | 135 | montracen(fen,nb_max_bolo,I,y); | 
|---|
|  | 136 | act=0; | 
|---|
|  | 137 | break; | 
|---|
|  | 138 |  | 
|---|
|  | 139 |  | 
|---|
|  | 140 |  | 
|---|
|  | 141 | /* | 
|---|
|  | 142 | if(litD(fen,cvi_tous,0L)) | 
|---|
|  | 143 | { | 
|---|
|  | 144 | equilibre_tout(); | 
|---|
|  | 145 | for(j=nb_max_bolo-1;j>=0;j--) | 
|---|
|  | 146 | if(!litD(j+1,b_bloq,0L) ) | 
|---|
|  | 147 | {y[j]=calcV(j+1)*1e-3;  I=calcI(j+1)*1e3;} | 
|---|
|  | 148 | else    y[j]=0; | 
|---|
|  | 149 | ecritD(fen,cvi_valI,"I=%g",I); | 
|---|
|  | 150 | montracen(fen,nb_max_bolo,I,y); | 
|---|
|  | 151 | } | 
|---|
|  | 152 | else    { | 
|---|
|  | 153 | auto_control(bolo,auto_carre); | 
|---|
|  | 154 | I=calcI(bolo)*1e3;              // en nA | 
|---|
|  | 155 | V=calcV(bolo)*1e-3;             // en mV | 
|---|
|  | 156 | ecritD(fen,cvi_valI,"I=%g",I); | 
|---|
|  | 157 | ecritD(fen,cvi_valV,"V=%g",V); | 
|---|
|  | 158 | trace(fen,I,V); | 
|---|
|  | 159 | } | 
|---|
|  | 160 | act=0; | 
|---|
|  | 161 | break; | 
|---|
|  | 162 | */ | 
|---|
|  | 163 |  | 
|---|
|  | 164 | default : act=0; | 
|---|
|  | 165 | } | 
|---|
|  | 166 | break; | 
|---|
|  | 167 |  | 
|---|
|  | 168 | case cvi_mesure : | 
|---|
|  | 169 |  | 
|---|
|  | 170 | if(!posi) style(fen); | 
|---|
|  | 171 | tachedefond(fen,litD(fen,cvi_vitesse,0L)*60);act=0; | 
|---|
|  | 172 | break; | 
|---|
|  | 173 |  | 
|---|
|  | 174 | case cvi_stop : | 
|---|
|  | 175 | posi=0;act=0; | 
|---|
|  | 176 | tachedefond(fen,-1);    break; | 
|---|
|  | 177 |  | 
|---|
|  | 178 | default  : | 
|---|
|  | 179 | break; | 
|---|
|  | 180 | } | 
|---|
|  | 181 | } | 
|---|
|  | 182 |  | 
|---|
|  | 183 |  | 
|---|
|  | 184 | void    equilibre_tout(void)    // fait la correction sans passer par auto_control | 
|---|
|  | 185 | { | 
|---|
|  | 186 | int j; | 
|---|
|  | 187 | double coef[nb_max_bolo]; | 
|---|
|  | 188 | def_gains; | 
|---|
|  | 189 | for(j=0;j<nb_max_bolo;j++) | 
|---|
|  | 190 | { | 
|---|
|  | 191 | coef[j]= pt_micV(j+1) * xbolbrut(j) * litD(fenetre_auto,auto_correct,0L);       // correction augmentée artificiellement | 
|---|
|  | 192 | coef[j]=(double)dac_V(gg->reglage.bolo[j])-coef[j]; | 
|---|
|  | 193 | } | 
|---|
|  | 194 |  | 
|---|
|  | 195 | for(j=0;j<nb_max_bolo;j++)      if( (parametr.bolo[j].bolo_code_util) && !litD(j+1,b_bloq,0L) )   exec_bolo(j+1,b_carre,coef[j]); | 
|---|
|  | 196 | } | 
|---|