/*********************************************** * * ************************************************/ #include #include #include #include #include #include "gas.h" #define J1_ODD 48 #define J1_EVEN 0 #define J2_ODD 72 #define J2_EVEN 24 GAS_MBOX *mod; int evid; char *caller; sighand(signal) register int signal; { sem_unl_del(evid, "gas_mbox", caller); munlink(mod); exit(0); } main(argc, argv) int argc; char **argv; { int gains_set[96], gains_read[96], data[96]; float datv[96], adcv[3][48]; unsigned base; int ndata, gain_mode, diff_mode, i, j, adc; float vmin, vmax; float gas_vmin = -10.; /* give range of the A/D : settable only hardware! */ float gas_vmax = 10.; float nch = 4096; int cpu_nr, tcp_ip_nr; char *hv_config[3]; int sonda, cycle; int hra[6]; float percent[3], flow[3], flow_percent[3]; float flow_percent1[3]; float iso_monitor, total_flow; float t_mon, t_mon1; float percent_old[3], iso_monitor_old, t_mon_old, wold; float t_mon1_old; float p_mon, p_mon_old; int loop; caller = argv[0]; if (argc < 2) cycle = 60; else if(strcmp(argv[1],"cycle") == 0 && argc > 2) cycle = atoi(argv[2]); /* time to cycle in seconds */ if (cycle < 0) cycle = - cycle; if (get_config( &tcp_ip_nr, &cpu_nr, hv_config) != 0){ printf (" error in get_config \n"); exit (0); } if (cpu_nr < 1 || cpu_nr > 2) { printf(" No hardware information readable from this CPU \n"); printf(" Move to OS9B1 ( 131.169.32.121 ) or OS9B2 "); printf("( 131.169.32.122)\n"); exit(0); } intercept(sighand); evid = sem_link_cr("gas_mbox", caller); if((mod = (GAS_MBOX *)modlink("gas_mod", 0)) == (GAS_MBOX *)-1){ data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); sem_wait(evid, caller); if((mod = (GAS_MBOX *)_mkdata_module("gas_mod", sizeof(GAS_MBOX), 0x8001, 0x0033)) == (GAS_MBOX *)-1){ /* see module.h for attr,perm */ sem_free(evid, caller); sem_unl_del(evid, "gas_mbox", caller); exit(_errmsg(errno,"lv_mon: err. link/create data module\n")); } for(i=0; i<6; i++) mod->creat_tim[i] = hra[i]; mod->flow_alarm_id[0] = 0; mod->flow_alarm_id[1] = 0; mod->mix_alarm_id[0] = 0; mod->mix_alarm_id[1] = 0; mod->ugo_alarm_id = 0; sem_free(evid, caller); } sem_wait(evid, caller); mod->nread_mix = 0; mod->nerr_mix = 0; sem_free(evid, caller); diff_mode = 1; /* 1: 48 diff chan's; 0: 96 single ended chan's */ gain_mode = 1; /* 1: common amplification for all chan's 0: individual amplification */ gains_set[0] = gain_word(1); /* -> amplification = 1 */ base = (unsigned) GAS_ADC; vmin = gas_vmin; vmax = gas_vmax; loop = 0; while(1){ loop++; if(cpu_nr == 1) { anl_adc_init(base, &gain_mode, gains_set, &diff_mode); anl_adc_read(base, data, &ndata, &gain_mode, gains_read, &diff_mode); for ( i = 0; i < 7; i++){ datv[i] = (vmax - vmin)/(nch-1) * (float) data[i] + vmin; if (i > 0 && i < 4){ percent[3 - i] = datv[i] / (IMAX * R0); } else if( i == 0) iso_monitor = datv[i]; else if( i == 4) t_mon = datv[i] / 0.01026 - 273. - T_OFFSET; else if( i == 5) t_mon1 = datv[i] / 0.01026 - 273. - T_OFFSET; else if( i == 6) p_mon = (datv[i] - VREF) / PSENS + PREF; } total_flow = 0; /* 0.8 e' il peso del valore vecchio rispetto a quello nuovo */ wold = 0.8*(1. - 1./loop); /* printf(" wold = %f\n", wold); */ for ( i = 0; i < 3; i++) { percent_old[i] = mod->perc[i]/100.; percent[i] = wold * percent_old[i] + (1.-wold) * percent[i]; } iso_monitor_old = mod->ugo; iso_monitor = wold * iso_monitor_old + (1.-wold) * iso_monitor; t_mon_old = mod->temp; t_mon1_old = mod->temp_out; p_mon_old = mod->press; /* Per le temperature il peso del vecchio e' 0.8 */ wold = 0.8*(1. - 1./loop); t_mon = wold * t_mon_old + (1.-wold) * t_mon; t_mon1 = wold * t_mon1_old + (1.-wold) * t_mon1; p_mon = wold * p_mon_old + (1.-wold) * p_mon; for ( i = 0; i < 3; i++){ flow[i] = percent[i] * full_scale[i]; percent[i] *= 100.; total_flow += flow[i]; } for ( i = 0; i < 3; i++) if (total_flow > 0.) flow_percent[i] = flow[i] / total_flow * 100.; else flow_percent[i] = 0.; if ( flow[1] + flow[2] > 0.){ flow_percent1[1] = flow[1] / ( flow[1] + flow[2] ) * 100.; flow_percent1[2] = flow[2] / ( flow[1] + flow[2] ) * 100.; } else{ flow_percent1[1] = 0.; flow_percent1[2] = 0.; } data_ora(&hra[0], &hra[1], &hra[2], &hra[3], &hra[4], &hra[5]); sem_wait(evid, caller); for(i = 0; i < 6; i++) mod->mix_tim[i] = hra[i]; for ( i = 0; i < 3; i++) { mod->perc[i] = percent[i]; mod->flow[i] = flow[i]; mod->flow_perc[i] = flow_percent[i]; if (i > 0) mod->flow_perc1[i] = flow_percent1[i]; /* sottraggo 0.02 da iso_monitor !! 13/8/94 ->> tolto il 27/3/97 */ mod->ugo = iso_monitor; mod->temp = t_mon; mod->temp_out = t_mon1; mod->press = p_mon; } mod->nread_mix++; sem_free(evid, caller); } /* ENDIF "balc1" */ sleep(cycle); } }