/******************************************* * Look the parameters in the CAEN Mail box * * and make histograms * * * *******************************************/ #include #include #include #include #include #include #include #include "../lib/mylib1.h" #include "../dbase/hv_dbase.h" #include "a200.h" #define SVEGLIA 1010 #define N_MIN 900 float array[1000]; SY227_MBOX *sy227_mod; int sem_227mod_id; SY127_MBOX *sy127_mod; hv_mod_struct *mid; int sem_127mod_id; char *caller; sighand(signal) register int signal; { if ( signal == SVEGLIA ) ; else{ munlink(sy127_mod); munlink(sy227_mod); munlink(mid); sem_unl(sem_127mod_id, caller); sem_unl(sem_227mod_id, caller); exit(0); } } main(argc, argv) int argc; char *argv[]; { char line[80], cline[80], tmpfile[64], tmpfile_h[64]; int n_order; int cpu_nr, tcp_ip_nr; FILE *fp, *fp1, *fp2, *fopen(); char *chamber_code; char *mod_name0 = "hv_config0"; char *mod_name1 = "hv_config1"; char *mod_name2 = "hv_config2"; char *mod_name, *hv_config[3]; int dis, sl; int ch1, ch2, first_print; int nwrite, nerror, par_val; short ndata, data[45], prot_word; short i, ir, j, k, chan, value, code; int n_good, n_bad; int n_active, v1_active, system_on; float imean, vmean; short ch_imax, imax, d_vmon[32], d_imon[32], d_status[32]; short hv_ch_A, hv_ch_Ref, on_off, hv_in; int sy127_mod_vim_tim[6]; int sy127_mod_sta_tim[6]; int sy227_mod_vim_tim[6]; int sy227_mod_sta_tim[6]; int sy127_mod_nvim; int sy127_mod_nvim_err; int sy127_mod_nsta; int sy127_mod_nsta_err; int sy227_mod_nvim; int sy227_mod_nvim_err; int sy227_mod_nsta; int sy227_mod_nsta_err; short status_hv_ch_A; short status_hv_ch_Ref; short v0_hv_ch_A, v1_hv_ch_A; short v0_hv_ch_Ref, v1_hv_ch_Ref; float v_set_max_barrel, v_set_max_rear; float v_mon_max_barrel, v_mon_max_rear; short vmon_hv_ch_A; short vmon_hv_ch_Ref; short i0_hv_ch_A; short i0_hv_ch_Ref; short imon_hv_ch_A; short imon_hv_ch_Ref; int yy, mm, dd, hh, min, sec; int jtime1, jdate1; int jtime2, jdate2; int tick; short day; int ncycle, n_anomalous[40]; static char h_module[] = "DISTR_HIST"; char h_name[80]; int nread, nvolte; intercept(sighand); /* stdout->_flag |=_UNBUF; /* serve a non bufferizzare l'output ) */ if((sy127_mod = (SY127_MBOX *)modlink("sy127mod", 0)) == (SY127_MBOX *) -1) exit(_errmsg(errno,"tubi_sitter: err. link data module\n")); sem_127mod_id = sem_link_cr("SY127mod", argv[0]); if((sy227_mod = (SY227_MBOX *)modlink("sy227mod", 0)) == (SY227_MBOX *) -1) exit(_errmsg(errno,"tubi_sitter: err. link data module\n")); sem_227mod_id = sem_link_cr("SY227mod", argv[0]); get_config(&tcp_ip_nr, &cpu_nr, hv_config); mod_name = hv_config[cpu_nr]; if ((mid = (hv_mod_struct *)modlink(mod_name, 0)) == (hv_mod_struct *)-1) if ((mid = (hv_mod_struct *)modload(mod_name, 0)) == (hv_mod_struct *)-1) exit(_errmsg(errno, "%s: error linking module %s\n", argv[0], mod_name)); chamber_code = "0"; hlimap(100000, h_module); n_order = 0; for(dis = 0; dis < mid->n_crates; dis++) for(sl = 0; sl < 4; sl++){ n_order++; if(strcmp(chamber_code, mid->distr[dis].slot[sl].chamber) == 0 || strcmp(chamber_code, mid->distr[dis].slot[sl].cable_name) == 0 || ( strcmp("0", chamber_code) == 0 && mid->distr[dis].slot[sl].hv_ch_Ref >= 0 )) { strcpy(h_name, mid->distr[dis].slot[sl].cable_name); strcat(h_name, " inst. currents"); hbook1(n_order, h_name, 32, 0., 32.); hreset(n_order); strcpy(h_name, mid->distr[dis].slot[sl].cable_name); strcat(h_name, " average currents"); hbook1(40 + n_order, h_name, 32, 0., 32.); hreset(40 + n_order); strcpy(h_name, mid->distr[dis].slot[sl].cable_name); strcat(h_name, " /1min last 15 hours "); hbook1(80 + n_order, h_name, N_MIN, - (float) N_MIN, 0.); hreset(80 + n_order); } } hbook1(80 + ++n_order, "Interlock history (every min, last 15 hours)", N_MIN, -(float)N_MIN, 0.); hreset(80 + n_order); hbook1(80 + ++n_order, "ON/OFF history (every min, last 15 hours)", N_MIN, -(float)N_MIN, 0.); hreset(80 + n_order); hbook1(80 + ++n_order, "Barrel V0/V1_Set history (every min, last 15h)", N_MIN, -(float)N_MIN, 0.); hreset(80 + n_order); hbook1(80 + ++n_order, "Rear V0/V1_Set history (every min, last 15h)", N_MIN, -(float)N_MIN, 0.); hreset(80 + n_order); hbook1(80 + ++n_order, "Barrel Vmon_max history (every min, last 15h)", N_MIN, -(float)N_MIN, 0.); hreset(80 + n_order); hbook1(80 + ++n_order, "Rear Vmon_max history (every min, last 15h)", N_MIN, -(float)N_MIN, 0.); hreset(80 + n_order); ncycle = 0; nread = 0; alm_cycle((int) SVEGLIA, (int) BIT32 | 256*60 ); while(1){ nvolte = 0; do { nvolte++; sleep(10); } while (sy227_mod->nvim == nread && nvolte <= 3); /* wait for a new update */ nread = sy227_mod->nvim; ncycle++; data_ora(&yy, &mm, &dd, &hh, &min, &sec); n_order = 0; system_on = 0; v_set_max_barrel = 0.; v_set_max_rear = 0.; v_mon_max_barrel = 0.; v_mon_max_rear = 0.; for(dis = 0; dis < mid->n_crates; dis++) for(sl = 0; sl < 4; sl++){ k = 0; n_order++; if((strcmp(chamber_code, mid->distr[dis].slot[sl].chamber) == 0 || strcmp(chamber_code, mid->distr[dis].slot[sl].cable_name) == 0 || ( strcmp("0", chamber_code) == 0 && mid->distr[dis].slot[sl].hv_ch_Ref >= 0 ) ) && !(mid->distr[dis].slot[sl].cond IS_CONDITIONING) ){ /* not cond */ if (mid->distr[dis].slot[sl].d_used_ch){ hv_ch_A = mid->distr[dis].slot[sl].hv_ch_A; hv_ch_Ref = mid->distr[dis].slot[sl].hv_ch_Ref; sem_wait(sem_127mod_id, argv[0]); prot_word = sy127_mod->hv_par[1].prot_word; status_hv_ch_A = sy127_mod->hv_par[1].status[hv_ch_A]; status_hv_ch_Ref = sy127_mod->hv_par[1].status[hv_ch_Ref]; v0_hv_ch_A = sy127_mod->hv_par[1].v0[hv_ch_A]; v0_hv_ch_Ref = sy127_mod->hv_par[1].v0[hv_ch_Ref]; v1_hv_ch_A = sy127_mod->hv_par[1].v1[hv_ch_A]; v1_hv_ch_Ref = sy127_mod->hv_par[1].v1[hv_ch_Ref]; vmon_hv_ch_A = sy127_mod->hv_par[1].vmon[hv_ch_A]; vmon_hv_ch_Ref = sy127_mod->hv_par[1].vmon[hv_ch_Ref]; i0_hv_ch_A = sy127_mod->hv_par[1].i0[hv_ch_A]; i0_hv_ch_Ref = sy127_mod->hv_par[1].i0[hv_ch_Ref]; imon_hv_ch_A = sy127_mod->hv_par[1].imon[hv_ch_A]; imon_hv_ch_Ref = sy127_mod->hv_par[1].imon[hv_ch_Ref]; sem_free(sem_127mod_id, argv[0]); if ( strcmp(mid->distr[dis].slot[sl].chamber,"01") && strcmp(mid->distr[dis].slot[sl].chamber,"00") ){ /* ( !(status_hv_ch IS_RAMPU) && !(status_hv_ch IS_RAMPD)) ){*/ if (strncmp(mid->distr[dis].slot[sl].chamber, "9", 1)){ if( (float)v1_hv_ch_Ref > v_set_max_barrel ) v_set_max_barrel = (float)v1_hv_ch_Ref; if( (float)v0_hv_ch_Ref > v_set_max_barrel ) v_set_max_barrel = (float)v0_hv_ch_Ref; if( vmon_hv_ch_Ref > v_mon_max_barrel) v_mon_max_barrel = vmon_hv_ch_Ref; } else { if( (float)v1_hv_ch_Ref > v_set_max_rear ) v_set_max_rear = (float)v1_hv_ch_Ref; if( (float)v0_hv_ch_Ref > v_set_max_rear ) v_set_max_rear = (float)v0_hv_ch_Ref; if( vmon_hv_ch_Ref > v_mon_max_rear) v_mon_max_rear = vmon_hv_ch_Ref; } } v1_active = prot_word V1_ACTIVE; if (status_hv_ch_Ref IS_ON && (strcmp(mid->distr[dis].slot[sl].chamber,"01") && strcmp(mid->distr[dis].slot[sl].chamber,"00") )) system_on |= 1; /* the hv system is considered ON if at least one of the chambers is ON */ if (strcmp(mid->distr[dis].slot[sl].chamber,"01")){ /* distributors */ sem_wait(sem_227mod_id, argv[0]); on_off = sy227_mod->sl_par[dis][sl].onoff; hv_in = sy227_mod->sl_par[dis][sl].hvin; for ( i = 0; i < 32; i++){ d_vmon[i] = sy227_mod->sl_par[dis][sl].vmon[i]; if ( !(status_hv_ch_Ref IS_RAMPU) && !(status_hv_ch_Ref IS_RAMPD)) d_imon[i] = sy227_mod->sl_par[dis][sl].imon[i]; else d_imon[i] = -1.; d_status[i] = sy227_mod->sl_par[dis][sl].status[i]; } sem_free(sem_227mod_id, argv[0]); imean = 0; n_active = 0; hreset(n_order); hunpak(40 + n_order, array, 32); for (i = 0; i < 32; i++){ hf1(n_order, (float)i, (float)d_imon[i]); array[i] = ((ncycle-1)*array[i]+(float)d_imon[i]) / (float) ncycle; if (mid->distr[dis].slot[sl].d_used_ch & (1 << i)){ imean += (float) d_imon[i]; n_active += 1.; } } hpak(40 + n_order, array); if (n_active) imean /= (float) n_active; hunpak(80 + n_order, array, N_MIN); for ( i = 0 ; i < N_MIN - 1; i++ ) array[i] = array[i+1]; array[N_MIN -1] = imean; hpak(80 + n_order, array); } } } } hunpak(80 + ++n_order, array, N_MIN); for ( i = 0 ; i < N_MIN - 1; i++ ) array[i] = array[i+1]; if (v1_active) array[N_MIN -1] = 1.; else array[N_MIN -1] = 0.; hpak(80 + n_order, array); hunpak(80 + ++n_order, array, N_MIN); for ( i = 0 ; i < N_MIN - 1; i++ ) array[i] = array[i+1]; if (system_on) array[N_MIN -1] = 1.; else array[N_MIN -1] = 0.; hpak(80 + n_order, array); hunpak(80 + ++n_order, array, N_MIN); for ( i = 0 ; i < N_MIN - 1; i++ ) array[i] = array[i+1]; array[N_MIN -1] = v_set_max_barrel; hpak(80 + n_order, array); hunpak(80 + ++n_order, array, N_MIN); for ( i = 0 ; i < N_MIN - 1; i++ ) array[i] = array[i+1]; array[N_MIN -1] = v_set_max_rear; hpak(80 + n_order, array); hunpak(80 + ++n_order, array, N_MIN); for ( i = 0 ; i < N_MIN - 1; i++ ) array[i] = array[i+1]; array[N_MIN -1] = v_mon_max_barrel; hpak(80 + n_order, array); hunpak(80 + ++n_order, array, N_MIN); for ( i = 0 ; i < N_MIN - 1; i++ ) array[i] = array[i+1]; array[N_MIN -1] = v_mon_max_rear; hpak(80 + n_order, array); data_ora(&yy, &mm, &dd, &hh, &min, &sec); sleep(0); /* aspetta l'allarme */ } /* end of while(1) loop */ }