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

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

archediab 25

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