source: Sophya/trunk/Poubelle/archediab.old/archediab.sources/c/dilution.c@ 657

Last change on this file since 657 was 657, checked in by ansari, 26 years ago

4 bit pour bolo on-of/bolo transmis

File size: 15.4 KB
RevLine 
[637]1#include "diabolo.h"
2#include "dilution.h"
3#include "controle.h"
[651]4#include "arcunit.h"
[637]5
6
7//-------------------- fonction exec de la fenetre : dilution -------------------------------
8
9#define bit0 0x01
10#define bit1 0x02
11#define bit2 0x04
12#define bit3 0x08
13#define bit4 0x10
14#define bit5 0x20
15#define bit6 0x40
16#define bit7 0x80
17
18
[643]19#define cnt_temperature(i) (20+(int)val_temperature(blk->ADC_dil[i]))
[637]20
21#define ecrit_switch(val,ii,bit) {if(val) ii=ii | bit ;else ii=ii& (0xffffffff^bit) ;}
22#define calib(j) litD(fenetre_dilution_calibration,j,0L)
[639]23
24
[643]25void ecrit_moteur_dilution(int valeur); // valeur sur 10 bit: poid fort=on/off
[639]26
[643]27void ecrit_moteur_dilution(int valeur)
28{
29int i;
30char mot_tc[10];
31
32 i=litD(fenetre_dilution,dil_switch_1,0);
33i=i<<8; i+=litD(fenetre_dilution,dil_switch_2,0);
34i=i<<8; i+=litD(fenetre_dilution,dil_switch_3,0);
35i=i<<8; // les 3 octets en poid fort, rien dans le dernier octet
36i=i& 0x003fffff;
37i = i| ( (valeur & 0x3ff)<<22);
38ecritD(fenetre_dilution,dil_switch_1,(i>>24)&0xff);
39ecritD(fenetre_dilution,dil_switch_2,(i>>16)&0xff);
40ecritD(fenetre_dilution,dil_switch_3,(i>>8 )&0xff);
41
42mot_tc[0]=tc_switch_dil;
43mot_tc[1]=0;
44mot_tc[2]=0;
45mot_tc[3]=0;
46mot_tc[4]=(i>>8 )&0xff;
47mot_tc[5]=(i>>16)&0xff;
48mot_tc[6]=(i>>24)&0xff;
49mot_tc[7]=0;
50emission_telecommande(tc_dir_transputer,mot_tc);
51}
52
53
[639]54// fonction ecrit un bit des switch dilution
55// c'est une telecommande normale 64 bit a supprimer
56// la telecommande passe a travers le transputer sans etre traitee par lui
57// elle arrive directement sur l'EPLD
[649]58/*
[637]59void ecrit_bit_dilution(int valeur,int bit);
60
61void ecrit_bit_dilution(int valeur,int bit)
62{
63int i;
64char mot_tc[10];
65
66 i=litD(fenetre_dilution,dil_switch_1,0);
67i=i<<8; i+=litD(fenetre_dilution,dil_switch_2,0);
68i=i<<8; i+=litD(fenetre_dilution,dil_switch_3,0);
69i=i<<8; // les 3 octets en poid fort, rien dans le dernier octet
70ecrit_switch(valeur,i,bit);
71ecritD(fenetre_dilution,dil_switch_1,(i>>24)&0xff);
72ecritD(fenetre_dilution,dil_switch_2,(i>>16)&0xff);
73ecritD(fenetre_dilution,dil_switch_3,(i>>8 )&0xff);
74
75mot_tc[0]=tc_switch_dil;
76mot_tc[1]=0;
77mot_tc[2]=0;
78mot_tc[3]=0;
79mot_tc[4]=(i>>8 )&0xff;
80mot_tc[5]=(i>>16)&0xff;
81mot_tc[6]=(i>>24)&0xff;
82mot_tc[7]=0;
83emission_telecommande(tc_dir_transputer,mot_tc);
84}
[649]85*/
[639]86// fonction ecrit un des dac dilution
87// c'est une telecommande normale 64 bit a supprimer
88// la telecommande passe a travers le transputer sans etre traitee par lui
89// elle arrive directement sur l'EPLD
[637]90
[639]91void ecrit_dac_dilution(void);
[637]92
[639]93void ecrit_dac_dilution(void)
94{
95char mot_tc[10];
96int k;
97unsigned long i,j;
98i=litD(fenetre_dilution,dil_dac_1,0); // les 2 bits adresse du dac
99i=i<<14; i+=litD(fenetre_dilution,dil_dac_2,0); // les 12 bits valeur du dac
100// ranger les bits a l'envers;
101j=0; for(k=0;k<16;k++) {j=(j<<1) | (i&1);i=i>>1;}
102mot_tc[0]=tc_dac_dil;
103mot_tc[1]=(j)&0xff;
104mot_tc[2]=(j>>8)&0xff;
105mot_tc[3]=0;
106mot_tc[4]=0;
107mot_tc[5]=0;
108mot_tc[6]=0;
109mot_tc[7]=0;
110emission_telecommande(tc_dir_transputer,mot_tc);
111}
[637]112
[639]113
114
115
[637]116void exec_dilution(int fen,int item,double valeur,...)
117{
118int i;
119
120if(item>1000) item-=1000; // pour appeler le case pour tous les cara d'un edit texte
121
122switch(item)
[649]123 {
124 case dil_switch_helium : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_switch_helium); break;
125 case dil_EVB : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_vanne_EVB); break;
126 case dil_EVO : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_vanne_EVO); break;
127 case dil_EVF : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_vanne_EVF); break;
128 case dil_EVV : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_vanne_EVV); break;
129 case dil_sw_pp5 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_switch_pile_par_5); break;
130 case dil_sw_pp15 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_switch_pile_par_15); break;
131
132 /*
133
[637]134 case dil_switch_helium : ecrit_bit_dilution((int)valeur,switch_helium); break;
135 case dil_EVB : ecrit_bit_dilution((int)valeur,vanne_EVB); break;
136 case dil_EVO : ecrit_bit_dilution((int)valeur,vanne_EVO); break;
137 case dil_EVF : ecrit_bit_dilution((int)valeur,vanne_EVF); break;
138 case dil_EVV : ecrit_bit_dilution((int)valeur,vanne_EVV); break;
139 case dil_sw_pp5 : ecrit_bit_dilution((int)valeur,switch_pile_par_5); break;
140 case dil_sw_pp15 : ecrit_bit_dilution((int)valeur,switch_pile_par_15); break;
[649]141*/
[637]142// ---- commande directe d'un mot avec les 3 case de codage hexadecimales
143
144 // case dil_switch_1 :
145 // case dil_switch_2 :
146 // case dil_switch_3 : ecrit_bit_dilution(0,0); break;
147
148// ---- telecommande du raz periodique des fets
149 case dil_raz_modul :
[649]150 case dil_fet_raz :
151 i =0;
152 if(litD(fen,dil_fet_raz,0)==2) i+=1;
153 if(litD(fen,dil_fet_raz,0)==3) i+=7;
154 emission_tc_reduite(tc2_raz_fet,0,i);
155/*
[637]156 {
157 char mot_tc[10];
158 mot_tc[0]=7; // commande la premiere bebo directe -> il faut ecrire tc reduite
159 i=litD(fen,dil_raz_modul,0);
160 i=i<<3;
161 if(litD(fen,dil_fet_raz,0)==2) i+=1;
162 if(litD(fen,dil_fet_raz,0)==3) i+=7;
163 i=i<<4;
164 mot_tc[1]=i;
165 for(i=2;i<8;i++) mot_tc[i]=0;
166 emission_telecommande(tc_dir_transputer,mot_tc);
167 }
[649]168*/
[637]169 break;
170
[649]171 case dil_ch1 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_chauffage1); break;
172 case dil_ch2 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_chauffage2); break;
173 case dil_ch3 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_chauffage3); break;
174 case dil_ch4 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_chauffage4); break;
175 case dil_ch5 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_chauffage5); break;
176 case dil_ch6 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_chauffage6); break;
177 case dil_ch7 : emission_tc_reduite(tc2_dilution,(valeur==1),nbit_chauffage7); break;
[639]178
179// case dil_dac_1 :
180// case dil_dac_2 :
[643]181// case dil_envoi_dac : ecrit_dac_dilution(); break;
182 case dil_envoi_dac : ecrit_moteur_dilution((int)litD(fenetre_dilution,dil_dac_2,0)); // les 12 bits
183 break;
[637]184
185 default : break;
186 }
187}
188
189
190
191
192void traite_block_dilution(block_type_dilution* blk)
193{
194int i;
195
196// ouvre la fenetre de calibration
197if(!fenetre(fenetre_dilution_calibration))
198 nouveauD(fenetre_dilution_calibration,dilution_calibrations_id,"dilution_calibration",exec_cache);
199
200if( (blk->switch_dil&0x3f ) != 6 ) {
201// printf("**************** affiche erreur \n");
202 changecontrole(fenetre_dilution,dil_erreur,idem,idem,idem,idem,idem,"erreur");
203 }
204else {
205 static int q;
206 char ss[10]="____";
207 q=(q+1)&3;
208 ss[q]='/';
209 changecontrole(fenetre_dilution,dil_erreur,idem,idem,idem,idem,idem,ss);
210// printf("**************** pas d' erreur \n");
211 }
212
213
214// lit les switchs
215// -- les voyants de fin de course vanne principale (logique negative)
216ecritD(fenetre_dilution,dil_voyant_EVO,((blk->switch_dil&switch_EVO)?0:1));
217ecritD(fenetre_dilution,dil_voyant_EVF,((blk->switch_dil&switch_EVF)?0:1));
218
219// les retour de commande des electrovannes
220ecritD(fenetre_dilution,dil_EVB_retour,((blk->switch_dil&vanne_EVB)?1:0));
221ecritD(fenetre_dilution,dil_EVO_retour,((blk->switch_dil&vanne_EVO)?1:0));
222ecritD(fenetre_dilution,dil_EVF_retour,((blk->switch_dil&vanne_EVF)?1:0));
223ecritD(fenetre_dilution,dil_EVV_retour,((blk->switch_dil&vanne_EVV)?1:0));
224
[639]225
[645]226#define c(j,i) (1e-4*(double)parametr.nom_coef[parametr.bolo[j].numero_nom_coef].coef[i])
[639]227
228// les temperatures sur les cartes modifiées
229{
[645]230double I,V,R[8],llR;
[639]231int j,k;
232def_gains;
233k=0;
[645]234
[639]235for(j=0;(j<nb_max_bolo) && (k<4);j++)
236 {
[657]237 if(parametr.bolo[j].bolo_code_util&bolo_thermo_simplifie)
[639]238 {
239 I = 1e-3 * (double)dac_V(gg->reglage.bolo[j]) * 2441. / parametr.bolo[j].bolo_capa; // I en µA
240 V=0.001*bol_micro_volt(blk->temperature[k],(double)parametr.bolo[j].bolo_gain*gain_ampli(gg->reglage.bolo[j]));
241 if(I>0.0000001) R[k]=V/I; else R[k]=0; // R en ‡
[645]242 //------ calcul de l'etalonnage en temperature des cartes temperature simplifiées
243 // j=numero de bebo T[k] = R[k+4] en Kelvin
244 if ((R[k]-c(j,6))>1.)
[649]245 {if((log(R[k]-c(j,6))-c(j,0))>0.001) llR= log(log(R[k]-c(j,6))-c(j,0)) ; else llR=0;
246// printf("\nk=%d j=%d R=%g c2=%g c3=%g llR=%g",k,j,R[k],c(j,2),c(j,3),llR);
247 }
[645]248 else llR=0;
249 R[k+4] = exp( c(j,1) + c(j,2)* llR + c(j,3)* llR* llR + c(j,4)* llR* llR* llR + c(j,5)* llR* llR* llR* llR) ;
250 if(R[k+4]>9999) R[k+4]=9999;
251 k++;
[639]252 }
253 }
254
[649]255gg->temperature_cryo=R[4]; // Charge la temperature_cryo (0.1K) pour les calculs futurs avec les bolos
256/* La germanium doit toujours etre en premier par rapport aux autres thermos absolus */
[645]257
258if(R[0]<90.) ecritD(fenetre_dilution,dil_temp
259 , "ge=%6.2f‡ 4K=%6.2f‡ 1.6K=%6.2f‡ 10K=%6.2f‡\rge= %6.3fK 4K=%6.2fK 1.6K=%6.2fK 10K=%6.2fK "
260 ,R[0],R[1],R[2],R[3],R[4],R[5],R[6],R[7]);
261else ecritD(fenetre_dilution,dil_temp
262 ,"ge=%6.3fk‡ 4K=%6.2f‡ 1.6K=%6.2f‡ 10K=%6.2f‡\rge= %6.3fmK 4K=%6.2fK 1.6K=%6.2fK 10K=%6.2fK "
263 ,R[0]*0.001,R[1],R[2],R[3],R[4]*1000.,R[5],R[6],R[7]);
264
265
[639]266if(litD(fenetre_dilution,dil_trace_tempe,0))// trace les sondes de niveau helium
267 {
268 int temps_cntl=numero_block(blk)*nb_per_block*2;
269 double secondes,minutes;
270 secondes=gg->periode_echantillonage*(double)temps_cntl;
271 minutes=secondes/60.;
272 if(!fenetre(fenetre_temperature_dil))
273 {
274 nouveauD(fenetre_temperature_dil,0,"temperature_dil",0);
275 selectgra(fenetre_temperature_dil);
276 strcpy(graph->xtitre,"minutes");
277 }
[645]278 tracen(fenetre_temperature_dil,8,minutes,R);
[639]279 }
280}
281
[637]282// les pressions et debits metres des injections de la dilution
283ecritD(fenetre_dilution,dil_p_d_3He,"3He: %4.1fb -> %5.2fµm/s -> %4.1fb"
[643]284 ,40. * val_multiplex(blk->ADC_dil[ p_R3]) -1.6 // 200 bars pour 5V et 1.6 bar d'offset
285 ,2. * val_multiplex(blk->ADC_dil[ d_3He]) // 10 MICRO MOLES pour 5V
286 ,20. * val_multiplex(blk->ADC_dil[ p_C3]) // 100 bars pour 5V
[637]287 );
288ecritD(fenetre_dilution,dil_p_d_4He,"4He: %4.1fb -> %5.2fµm/s -> %4.1fb"
[643]289 ,40. * val_multiplex(blk->ADC_dil[ p_R4]) // 200 bars pour 5V
290 ,8. * val_multiplex(blk->ADC_dil[ d_4He]) // 40 MICRO MOLES pour 5V
291// ,4. * val_multiplex(blk->ADC_dil[ d_4He]) // 20 MICRO MOLES pour 5V
292 ,20. * val_multiplex(blk->ADC_dil[ p_C4]) // 100 bars pour 5V
[637]293 );
294
295ecritD(fenetre_dilution,dil_p_air,"Van=%4.1fb charb=%4.1fb mmb=%4.3fb haut=%4.3fb"
[643]296 ,20.*val_multiplex(blk->ADC_dil[ p_air]),20.*val_multiplex(blk->ADC_dil[ p_charb])
297 ,0.2*val_multiplex(blk->ADC_dil[ p_memb]),0.2*val_multiplex(blk->ADC_dil[ p_haut]) );
[637]298
299ecritD(fenetre_dilution,dil_piles," Trp=%4.1fV Dil=%4.1fV / %4.1fV \rBebo=%4.1fV / %4.1fV / %4.1fV Ch=%4.1fV"
[643]300 ,2.03*val_multiplex(blk->ADC_dil[ p_10T]),3.90*val_multiplex(blk->ADC_dil[ p_p18D]),3.90*val_multiplex(blk->ADC_dil[ p_m18D])
301 ,2.03*val_multiplex(blk->ADC_dil[ p_10B]),3.90*val_multiplex(blk->ADC_dil[ p_p18B]),3.90*val_multiplex(blk->ADC_dil[ p_m18B])
302 ,3.8*val_multiplex(blk->ADC_dil[ p_Ch]));
[637]303
304/* valeur seuil au mini (5.3 ou 15.3V) , *17 = +5.9 V au maxi */
305
306
[643]307ecritD(fenetre_dilution,dil_p_10T,(int)(17*(2.03*val_multiplex(blk->ADC_dil[ p_10T])-5.3)));
308ecritD(fenetre_dilution,dil_p_p18D,(int)(17*(3.90*val_multiplex(blk->ADC_dil[ p_p18D])-15.3)));
309ecritD(fenetre_dilution,dil_p_m18D,(int)(17*(-3.90*val_multiplex(blk->ADC_dil[ p_m18D])-15.3)));
310ecritD(fenetre_dilution,dil_p_10B,(int)(17*(2.03*val_multiplex(blk->ADC_dil[ p_10B])-5.3)));
311ecritD(fenetre_dilution,dil_p_p18B,(int)(17*(3.93*val_multiplex(blk->ADC_dil[ p_p18B])-15.3)));
312ecritD(fenetre_dilution,dil_p_m18B,(int)(17*(-3.93*val_multiplex(blk->ADC_dil[ p_m18B])-15.3)));
313ecritD(fenetre_dilution,dil_p_Ch,(int)(10*(3.8*val_multiplex(blk->ADC_dil[ p_Ch])-25))); /* 25 a 35 V */
[637]314
315// -- les voyants de switch de piles
316ecritD(fenetre_dilution,dil_voyant_pp5,((blk->switch_dil&switch_pile_par_5)?1:0));
317ecritD(fenetre_dilution,dil_voyant_pp15,((blk->switch_dil&switch_pile_par_15)?1:0));
318
319
[649]320ecritD(fenetre_dilution,dil_temperatures,"temp-Haut = %4.1f° %4.1f° Base = %4.1f° %4.1f° \r tube He: %4.1f° piles %4.1f° driver %4.1f°"
321 ,val_temperature(blk->ADC_dil[ t_h2]),val_temperature(blk->ADC_dil[ t_h4])
322 ,val_temperature(blk->ADC_dil[ t_b1]),val_temperature(blk->ADC_dil[ t_b2]),val_temperature(blk->ADC_dil[ t_b3])
323 ,val_temperature(blk->ADC_dil[ t_pile]),val_temperature(blk->ADC_dil[ t_a1])
[637]324 );
325
[649]326ecritD(fenetre_dilution,dil_t_h1,cnt_temperature(t_h2));
327ecritD(fenetre_dilution,dil_t_h2,cnt_temperature(t_h4));
328ecritD(fenetre_dilution,dil_t_h3,cnt_temperature(t_b1));
329ecritD(fenetre_dilution,dil_t_h4,cnt_temperature(t_b2));
330ecritD(fenetre_dilution,dil_t_a1,cnt_temperature(t_b3));
331ecritD(fenetre_dilution,dil_t_a2,cnt_temperature(t_pile));
332ecritD(fenetre_dilution,dil_t_a3,cnt_temperature(t_a1));
[637]333
334
335// les afficheurs analogiques de pression helium et pirani
336
[643]337ecritD(fenetre_dilution,dil_RP_He,(int)(2500*val_multiplex(blk->ADC_dil[ RP_He])-7500));
[637]338// je veux 10000 pour 0.8 bars soit alors que l'on a 5V pour 1 bar ou 1V = 0.2 bar
339// soit multiplier par 2500
340// puis j'enleve 0.6 bars soit 7500
[643]341ecritD(fenetre_dilution,dil_pirani,(int)(1000*val_multiplex(blk->ADC_dil[ pirani])));
[637]342
343
344
345
346
347
348// ecriture des valeurs brutes de la dilution
349if(litD(fenetre_dilution,dil_sortie_brute,0))
350 {
351 if(!fenetre(fenetre_dilution_lecture_brute)) nouveauT(fenetre_dilution_lecture_brute,0,"lecture dilution");
352
353 ecritT(fenetre_dilution_lecture_brute,fin_f,"dil_switch= %x \n",blk->switch_dil);
354
[643]355 for(i=0;i<16;i++) ecritT(fenetre_dilution_lecture_brute,fin_f,"%2d=%6.3f ",i<8?i+11:i+13,val_multiplex(blk->ADC_dil[ i]));
[637]356 ecritT(fenetre_dilution_lecture_brute,fin_f,"\n");
[643]357 for(i=16;i<32;i++) ecritT(fenetre_dilution_lecture_brute,fin_f,"%2d=%6.3f ",i<24?i+15:i+17,val_multiplex(blk->ADC_dil[ i]));
[637]358 ecritT(fenetre_dilution_lecture_brute,fin_f,"\n");
[643]359 for(i=32;i<48;i++) ecritT(fenetre_dilution_lecture_brute,fin_f,"%2d=%6.3f ",i<40?i+19:i+21,val_multiplex(blk->ADC_dil[ i]));
[637]360 ecritT(fenetre_dilution_lecture_brute,fin_f,"\n");
361 }
362// lecture des sondes de niveau helium
363
[639]364
[637]365 {
366 double y[8];
[639]367 static int niveau_pre;
[637]368 int niveau,fin;
[639]369// printf("dilution : numero de block = %d \n",numero_block(blk));
[637]370 changecontrole(fenetre_dilution,dil_niveau_helium,idem,idem,idem,idem,calrefcon(0,0,rouge,blanc,blanc),"");
[643]371 y[0]=val_multiplex(blk->ADC_dil[ j_he1])-calib(dil_j_he1);
372 y[1]=val_multiplex(blk->ADC_dil[ j_he2])-calib(dil_j_he2);
373 y[2]=val_multiplex(blk->ADC_dil[ j_he3])-calib(dil_j_he3);
374 y[3]=val_multiplex(blk->ADC_dil[ j_he4])-calib(dil_j_he4);
375 y[4]=val_multiplex(blk->ADC_dil[ j_he5])-calib(dil_j_he5);
376 y[5]=val_multiplex(blk->ADC_dil[ j_he6])-calib(dil_j_he6);
377 y[6]=val_multiplex(blk->ADC_dil[ j_he7])-calib(dil_j_he7);
378 y[7]=val_multiplex(blk->ADC_dil[ j_he8])-calib(dil_j_he8);
[639]379 if(blk->switch_dil & switch_helium)
[637]380 {
[639]381 changecontrole(fenetre_dilution,dil_niveau_helium,idem,idem,idem,idem,calrefcon(0,0,rouge,blanc,blanc),"");
382 niveau=0;fin=0;
383 for(i=0;i<8;i++)
384 {
385 if(y[i]>0.1) {
386 niveau++;
387 if(fin) niveau=9;
388 }
389 else fin=1;
390 }
391// if(niveau==9) changecontrole(fenetre_dilution,dil_niveau_helium,idem,idem,idem,idem
392// ,calrefcon(0,0,jaune,blanc,blanc),"");
393 if(niveau<niveau_pre) niveau_pre=0;
394 else {niveau_pre=niveau; ecritD(fenetre_dilution,dil_niveau_helium,niveau);}
395// printf("niveau=%d \n",niveau);
[637]396 }
[639]397 else changecontrole(fenetre_dilution,dil_niveau_helium,idem,idem,idem,idem,calrefcon(0,0,vert,blanc,blanc),"");
[637]398
399 if(litD(fenetre_dilution,dil_trace_helium,0))// trace les sondes de niveau helium
400 {
401 int temps_cntl=numero_block(blk)*nb_per_block*2;
402 double secondes,minutes;
403 secondes=gg->periode_echantillonage*(double)temps_cntl;
404 minutes=secondes/60.;
405 if(!fenetre(fenetre_niveau_helium))
406 {
407 nouveauD(fenetre_niveau_helium,0,"niveau_helium",0);
408 selectgra(fenetre_niveau_helium);
409 strcpy(graph->xtitre,"minutes");
410 }
411 tracen(fenetre_niveau_helium,8,minutes,y);
412 }
413 }
414
415}
416
417
Note: See TracBrowser for help on using the repository browser.