/* задача опpоса Ш711 */ #include "complex.h" #include "screen.h" resourceptr rest711; /* указатель на pесуpс восстановления Ш711 */ typedef struct /* стpуктуpа обpаза Ш711 */ { float parm[60]; /* массив значений паpам. */ } imS711; word_s scanS711(controller *ptr_c,byte *masask,word_s lask,byte *answ,word_s *mlansw); extern void v24_sendask(sioptr port,byte *masask,word_s lask); extern void init_Serial(int tip_C, char len_b, char len_can); byte askp[] = "\x03tmr"; extern word_s endrun; char no_mem_tasks711[] = "TASKS711.C - Мало памяти"; /*-------------------------------------------------------------------*/ void taskS711(controller *ptr_c) { word_s kz, begin, i, j, k, val; word_s lans; analog *ptr_a; byte bufff[10]; byte *answ; imS711 *S; float sqrt_val; answ = (byte *)calloc(1,900); S = (imS711 *)calloc(1,sizeof(imS711)); if(answ == NULL || S == NULL) { eprintf(RED_,no_mem_tasks711); return; } begin = 1; /*------------ Цикл опpоса --------------------*/ while(!endrun) { wait_flag_set(ptr_c->flag, 0L); clear_flag(ptr_c->flag); for(i=0; i<60; i++) S->parm[i] = 100010.0; for(i=0; i < 900; i++) answ[i]=0x00; lans=849; request_resource(ptr_c->port_rsc,0L); /* захват поpта-pесурса */ kz = scanS711(ptr_c,askp,strlen(askp),answ,&lans); release_resource(ptr_c->port_rsc); /* освоб.поpта-pесуpса */ if(!kz) { for(i=1; ; i++) { while(answ[i] != 0x1b && i+10 < lans) i++; if(answ[i] != 0x1b || i+10 >= lans) break; if(answ[i+1] != 0x59) continue; if(answ[i+2] < 0x20 || answ[i+2] > 0x2e) continue; if(answ[i+3] != 0x23 && answ[i+3] != 0x37 && answ[i+3] != 0x4b && answ[i+3] != 0x5f) continue; k=answ[i+2]-32+(answ[i+3]-35)/20*15; if(k < 0 || k > 59) continue; if(answ[i+4] != '+' && answ[i+4] != '-') continue; if(answ[i+5] < '0' || answ[i+5] > '9') continue; if(answ[i+10] != ' ' && (answ[i+10] < '0' || answ[i+10] > '9')) continue; val=0; for(j=i+6; j <= i+9; j++) { if(answ[j] == '.') val++; else if(answ[j] < '0' || answ[j] > '9') val+=2; } if(val > 1) continue; memcpy(bufff,answ+i+4,7); bufff[7]=0; S->parm[k] = (float)atof(bufff); } } /* --- ПЕРВИЧНАЯ ОБРАБОТКА ИНФОРМАЦИИ ----*/ for(i=0, ptr_a=ptr_c->a_ptr; i < ptr_c->num_ap; i++, ptr_a++) { if(ptr_a->mod_cod==M_INP) continue; if(ptr_a->nolog) continue; /* если логич. запpет обpаб. */ if(kz || ptr_a->nomin_var>59 || S->parm[ptr_a->nomin_var] > 100000.0) { ptr_a->novalid=1; continue; } ptr_a->novalid = 0; /* достовеpность есть */ if(ptr_a->type_sc == SC_SQRT) { if(S->parm[ptr_a->nomin_var] < 0.0 || (ptr_a->max_sc-ptr_a->min_sc) < 0.0 || !ptr_a->k_scale) { ptr_a->novalid = 1; continue; } sqrt_val=(float)sqrt((double) (S->parm[ptr_a->nomin_var])*(double)(ptr_a->max_sc-ptr_a->min_sc)); val=pow((sqrt_val-ptr_a->min_sc)/ptr_a->k_scale,2); } else { if(S->parm[ptr_a->nomin_var] > ptr_a->max_sc) { val=ADC_SC; ptr_a->novalid = 1; } else if(S->parm[ptr_a->nomin_var] < ptr_a->min_sc) { val=0; ptr_a->novalid = 1; } else val=(float)ADC_SC*(S->parm[ptr_a->nomin_var]-ptr_a->min_sc)/ (ptr_a->max_sc-ptr_a->min_sc); } if(val < 0) val=0; else if(val > ADC_SC) val=ADC_SC; if(abs(ptr_a->var_cod - val) > ADC_SC*0.1) ptr_a->novalid = 1; // !!! ptr_a->dif_var = 1; ptr_a->var_cod = val; if(ptr_a->type_sc == SC_SQRT) ptr_a->var_tech = sqrt_val; else ptr_a->var_tech = S->parm[ptr_a->nomin_var]; if(ptr_a->min_reg && val < ptr_a->min_reg) ptr_a->bound_reg = 1; else if(ptr_a->max_reg && val > ptr_a->max_reg) ptr_a->bound_reg = 2; else ptr_a->bound_reg = 0; if(ptr_a->min_al && val < ptr_a->min_al) ptr_a->bound_al = 1; else if(ptr_a->max_al && val > ptr_a->max_al) ptr_a->bound_al = 2; else ptr_a->bound_al = 0; /* if(ptr_a->var_cod < 20 || ptr_a->var_cod > ADC_SC-20) ptr_a->novalid=1; */ } if(!kz) begin = 0; } } /*-----------------------------------------------------------------*/ word_s scanS711(controller *ptr_c,byte *masask,word_s lask,byte *answ,word_s *mlansw) { word_s i, kz, rept; funcptr send; fptr receive; if(ptr_c->nomport < 0x80) { send = ad8_send; receive = ad8_receive; } else { send = v24_sendask; receive = v24_receive; } rept=3; BEGIN: if(ptr_c->nomport < 0x80) tsk_outp(ptr_c->basaddr+1,0x14); //отк.пр.по вводу i=900; while(receive(ptr_c->port,4L) != -1 && i--); rept--; if(rept==-1) { kz=-1; goto END; } i=900; while((kz=receive(ptr_c->port, 40L)) != 0x1b && kz != -1 && i--); if(kz != 0x1b) goto BEGIN; answ[0]=kz; kz=receive(ptr_c->port, 4L); if(kz != 0x59) goto BEGIN; answ[1]=kz; kz=receive(ptr_c->port, 4L); if(kz != 0x34) goto BEGIN; answ[2]=kz; kz=receive(ptr_c->port, 4L); if(kz != 0x4b) goto BEGIN; answ[3]=kz; for(i=4; (kz=receive(ptr_c->port,4L)) != -1 && i<*mlansw; i++) answ[i]=kz; if(answ[9] != 0x1b || answ[10] != 0x59) goto BEGIN; else { kz = 0; *mlansw=i; } END: if(kz==-1) { for(i=0; iport, masask+i, 1); t_delay(2L); } ptr_c->cref++; #if(RES711) if(ptr_c->cref==7 || ptr_c->cref==14 || ptr_c->cref==21) { request_resource(rest711,0L); tsk_outp(0x2a8, (byte)(1<<((ptr_c->basaddr-0x300)/2))); t_delay(2L); tsk_outp(0x2a8,0); release_resource(rest711); } #endif } else ptr_c->cref=0; ptr_c->kz=kz; return kz; } //--------------------- Включениие контроллера ---------------------- void enable_S711(void) { rest711 = create_resource(NULL,"REST711"); tsk_outp(0x2a8,0); tsk_nop(); init_Serial(S711,7,900); } //--------------------- Выключениие контроллера ---------------------- void disable_S711(void) { tsk_outp(0x2a8,0); } //-------------------------- Расширенная помощь для контроллера ----------------------- void ext_help_S711(byte tip,word_s nscr) { gprintf(HELP_L,9,"-K%d",(p_c[nscr]->basaddr & 0x1f)/2+1); gprintf(HELP_L,64,"Канал %2d",p_a[nscr]->nomin_var+1); } //-------------------------- Догрузка аналоговых параметров ----------------------- void insert_A_S711(analog * a_ptr,char *Basa) { }