📄 101.cpp
字号:
#include "\sm2000\1\101.h"
void C101::deal()
{
inportb(0x443); //set watch dog: enable
// yk_retc();
getcmd();
send_pack();
put_oth();
}//void C101::deal()
void C101::initial(unsigned int portno)
{
oqp=0;//that is no group;
nportno=portno;
ique.start=0;
ique.next=0;
ique.count=0;
ique.size=64;
oque.start=0;
oque.next=0;
oque.count=0;
oque.size=512;
flag=fcb=fcv=flag=acd=0x00;
lsfcb=lsfcv=0;
dlmyadd=port_set[portno].len_a;
waitf=FALSE;
}//void C101::initial(unsigned int portn)
void C101::deal_inf(unsigned int type)
{
unsigned int conf,iden,len,varnum,course;
if(type==0x10)
{//df=1101,mask fcb bit.
conf=ique.buf[qmod(ique.start+1,ique.size)];
fcv=conf&0x10;
fcb=conf&0x20;
lsfcv=fcv;
lsfcb=fcb;
if((conf&0xdf)==0x40) //that is reset remote link loop
{
flag&=0xc0;
flag|=0x40;
oqp=0;//that is no group;
fcb=fcv=flag=acd=0x00;
send_confirm();
}
else if((conf&0xdf)==0x41)
send_confirm();
else if((conf&0x4f)==0x42)
send_confirm();
else if((conf&0x4f)==0x43)
send_confirm();
/// else if((conf&0xdf)==0x48) ;
else if((conf&0xdf)==0x49)
send_ls();
else if((conf&0x4f)==0x4a)
send_class1();
else if((conf&0x4f)==0x4b)
send_class2();
else
send_no_data(0);
}//type==0x10
else if(type==0x68)
{
len=ique.buf[qmod(ique.start+2,ique.size)];
conf=ique.buf[qmod(ique.start+4,ique.size)];
iden=ique.buf[qmod(ique.start+6,ique.size)];
varnum=ique.buf[qmod(ique.start+7,ique.size)];
course=ique.buf[qmod(ique.start+8,ique.size)];
fcv=conf&0x10;
fcb=conf&0x20;
if((fcv==lsfcv)&&(lsfcv==0x10)&&(fcb==lsfcb))
{
re_send();
gotoxy(3,3);printf("re-send");
return;
}
else
{
lsfcv=fcv;
lsfcb=fcb;
}
if((conf&0xc0)!=0x40)
{
initial(nportno);
return;
}
switch(iden)
{
case 103:
if((varnum==1)&&(course==6)&&(len==15))
res_time();
else
send_no_data(acd);
break;
case 100:
if((len==9)&&(ique.buf[qmod(ique.start+12,ique.size)]==20))
res_calla();
else if((len==9)&&(ique.buf[qmod(ique.start+12,ique.size)]>=21)
&&(ique.buf[qmod(ique.start+12,ique.size)]<=36))
send_group(ique.buf[qmod(ique.start+12,ique.size)]-20,
ique.buf[qmod(ique.start+12,ique.size)]);
else
send_no_data(acd);
break;
case 101:
if(len==9)
res_ym(ique.buf[qmod(ique.start+12,ique.size)]&0xff);
else
send_no_data(acd);
break;
case 46:
case 47:
if(((conf&0xdf)==0x53)&&(len==9)&&(varnum==1)&&(course==6))
{
unsigned int tem_obj,tem_typ;
tem_obj=ique.buf[qmod(ique.start+11,ique.size)]&0xff;
tem_obj<<=8;
tem_obj+=ique.buf[qmod(ique.start+10,ique.size)]&0xff;
tem_typ=ique.buf[qmod(ique.start+12,ique.size)]&0xff;
if( ((tem_typ&0x03)==0)||((tem_typ&0x03)==0) )
break;
else if(tem_typ&0x80)
yk_select(tem_obj,tem_typ&0x03,iden);
else
yk_exe(tem_obj,tem_typ&0x03,iden);
}
else if(((conf&0xdf)==0x53)&&(course==8))
yk_esc(iden);
else
send_no_data(acd);
break;
defult:
send_no_data(acd);
break;
}//switch(iden)
}//else
else initial(nportno);
}//void
void C101::yk_esc(unsigned int iden)
{
/* if((ykoper.ykstate!=YKSNONE)
&&(ykoper.ykcmdint==YKINONE)&&(ykoper.ykcheckresult==YKROK)
&&(ykoper.ykexeman!=YKMNONE))
{
*/
ykoper.ykcmdint=YKIESC;
ykoper.ykcheckresult=YKRNONE;
ykoper.ykfrom=YKFNONE;
putheado(9);
pdo(0x80,0);
pdo(dlmyadd,1);//address
pdo(iden,1);
pdo(1,1);//num
pdo(9,1);
pdo(dlmyadd,1);
pdo(0,1);//addl
pdo(0,1);//add h
pdo(ique.buf[qmod(ique.start+12,ique.size)]&0xff,1);
pdo(sum,2);
pdo(0x16,2);
/*
}
else
send_no_data(acd);
*/
}
void C101::yk_select(unsigned int tem_obj,unsigned int tem_typ,unsigned int ident)
{
if(tem_typ==1)
tem_typ=0x33;//typ=1 trip=0x33
else if(tem_typ==2)
tem_typ=0xcc;//typ=2 trip=0xcc
if((ykoper.ykstate==YKSNONE)&&(ykoper.ykcmdint==YKINONE)
&&(ykoper.ykcheckresult==YKRNONE)&&(ykoper.ykexeman==YKMNONE)
&&((tem_typ==0xcc)||(tem_typ==0x33))&&((tem_obj-0xb01)<(datasource.total_yk+17))
)// &&(ykret.ykretflag[nportno]==TRUE) )
{
ykoper.ykobj=(tem_obj-0xb01);
ykoper.ykcmd=tem_typ;
ykoper.ykcmdint=tem_typ;
ykoper.ykfrom=nportno;
ykoper.preseterr=YKPNONE;
ykret.ykretflag[nportno]=FALSE;
putheado(9);
pdo(0x80,0);
pdo(dlmyadd,1);//address
pdo(ident,1);
pdo(1,1);//num
pdo(7,1);//course
pdo(dlmyadd,1);
pdo(tem_obj&0xff,1);//addl
pdo(tem_obj>>8,1);//add h
pdo(ique.buf[qmod(ique.start+12,ique.size)]&0xff,1);
pdo(sum,2);
pdo(0x16,2);
}//if((
else send_no_data(acd);
}//void C101::yk_select(unsigned int tem_obj,unsigned int tem_typ)
/*
void C101::yk_select(unsigned int tem_obj,unsigned int tem_typ,unsigned int ident)
{
if(tem_typ==1)tem_typ=0x33;//typ=1 trip=0x33
else if(tem_typ==2)tem_typ=0xcc;//typ=2 trip=0xcc
if((ykoper.ykstate==YKSNONE)&&(ykoper.ykcmdint==YKINONE)
&&(ykoper.ykcheckresult==YKRNONE)&&(ykoper.ykexeman==YKMNONE)
&&((tem_typ==0xcc)||(tem_typ==0x33))&&((tem_obj-0xb01)<datasource.total_yk)
)
{
ykoper.ykobj=(tem_obj-0xb01);
ykoper.ykcmd=tem_typ;
ykoper.ykcmdint=tem_typ;
ykoper.ykfrom=nportno;
ykoper.preseterr=YKPNONE;
waitf=TRUE;
widen=ident;
wobj=tem_obj;
wt=(ique.buf[qmod(ique.start+12,ique.size)]&0xff);
}//if((
else send_no_data(acd);
}//void C101::yk_select(unsigned int tem_obj,unsigned int tem_typ)
void C101::yk_retc()
{
if(waitf==TRUE)
{
// inportb(0x43);
waitf=FALSE;
if((ykret.ykretflag[nportno]==TRUE)&&(ique.count==0))
{
ykret.ykretflag[nportno]=FALSE;
putheado(9);
pdo(0x80,0);
pdo(dlmyadd,1);//address
pdo(widen,1);
pdo(1,1);//num
pdo(7,1);//course
pdo(dlmyadd,1);
pdo(wobj&0xff,1);//addl
pdo(wobj>>8,1);//add h
pdo(wt,1);
pdo(sum,2);
pdo(0x16,2);
}
else
{
putheado(9);
pdo(0x80,0);
pdo(dlmyadd,1);//address
pdo(widen,1);
pdo(1,1);//num
pdo(0x47,1);
pdo(dlmyadd,1);
pdo(wobj&0xff,1);//addl
pdo(wobj>>8,1);//add h
pdo(wt,1);
pdo(sum,2);
pdo(0x16,2);
ykret.ykretflag[nportno]=FALSE;
ykoper.ykcmdint=YKIESC;
ykoper.ykcheckresult=YKRNONE;
ykoper.ykfrom=YKFNONE;
}
}
}//void C101::yk_retc()
*/
void C101::yk_exe(unsigned int tem_obj,unsigned int tem_typ,unsigned int ident)
{
if(tem_typ==0x01)
tem_typ=0x33;
else if(tem_typ==0x02)
tem_typ=0xcc;
if( (ykoper.ykstate!=YKSNONE)&&(ykoper.ykcmdint==YKINONE)
&&(ykoper.ykcheckresult==YKROK)&&(ykoper.ykexeman!=YKMNONE)
&&((tem_obj-0xb01)<(datasource.total_yk+17)))
{
ykoper.ykcmdint=YKIEXEC;
ykoper.ykcheckresult=YKRNONE;
ykoper.ykfrom=YKFNONE;
putheado(9);
pdo(0x80,0);
pdo(dlmyadd,1);//address
pdo(ident,1);
pdo(1,1);//num
pdo(7,1);//course
pdo(dlmyadd,1);
pdo(tem_obj&0xff,1);//addl
pdo(tem_obj>>8,1);//add h
pdo(ique.buf[qmod(ique.start+12,ique.size)]&0xff,1);
pdo(sum,2);
pdo(0x16,2);
putheado(9);
pdo(0x80,0);
pdo(dlmyadd,1);//address
pdo(ident,1);
pdo(1,1);//num
pdo(10,1);//course
pdo(dlmyadd,1);
pdo(0,1);//addl
pdo(0,1);//add h
pdo(ique.buf[qmod(ique.start+12,ique.size)]&0xff,1);
pdo(sum,2);
pdo(0x16,2);
}//if(
else
send_no_data(acd);
}//void CNbb::ykctlprocess(unsigned int* pointer)
void C101::res_calla()
{
putheado(9);
pdo(0x80,0);
pdo(dlmyadd,1);//address
pdo(100,1);//biaozhi
pdo(1,1);
pdo(7,1);//course?
pdo(dlmyadd,1);
pdo(0,1);//addl
pdo(0,1);//add h
pdo(0x14,1);
pdo(sum,2);
pdo(0x16,2);
oqp=1;
}
void C101::set_timesyn()
{
unsigned int temp;
long unix_time;
struct date s_date; struct time s_time;
char days[27]; struct tm *gmt;
time_t ltime;
// char *tzstr = "TZ=PST8";
// putenv(tzstr);
tzset();
s_time.ti_min=(ique.buf[qmod(ique.start+14,ique.size)])&0x3f;
s_time.ti_hour=(ique.buf[qmod(ique.start+15,ique.size)])&0x1f;
s_time.ti_hund=0;
temp=(ique.buf[qmod(ique.start+13,ique.size)])&0xff;
temp<<=8;
temp+=(ique.buf[qmod(ique.start+12,ique.size)])&0xff;
s_time.ti_sec=temp/1000;
s_date.da_year=(ique.buf[qmod(ique.start+18,ique.size)])&0xff;
s_date.da_year+=2000;
s_date.da_day=(ique.buf[qmod(ique.start+16,ique.size)])&0x1f;
s_date.da_mon=(ique.buf[qmod(ique.start+17,ique.size)])&0x1f;
unix_time=dostounix(&s_date,&s_time);
stime(&unix_time);
}//void CDNP::set_timesyn()
void C101::send_class1()
{
int i;
unsigned int temp;
struct SOE1 temp_soe; //SOE saver SOE1 defined in common.h
if((flag&0xe0)==0xc0)//initial end
{
putheado(9);
flag|=0x20;
pdo(0x88,0);
pdo(dlmyadd,1);//address
pdo(70,1);//biaozhi
pdo(1,1);//num
pdo(4,1);//course
pdo(dlmyadd,1);
pdo(0,1);//addl
pdo(0,1);//add h
pdo(0,1);//COI
pdo(sum,2);
pdo(0x16,2);
}
else if(soe_ctl[nportno].count!=0)
{
temp=soe_ctl[nportno].count;
/// if(temp>=80){temp=80;acd=0x20;}
if(temp>80){temp=80;acd=0x20;}
else acd=0;
putheado(temp*3+6);
pdo(0x88|acd,0);
pdo(dlmyadd,1);
pdo(1,1);
pdo(temp,1);
pdo(5,1);
pdo(dlmyadd,1);
for(i=0;i<temp;i++)
{
temp_soe=soe_ctl[nportno].soe_log[soe_ctl[nportno].start];
pdo((temp_soe.orderno+1)&0xff,1);
pdo((temp_soe.orderno+1)>>8,1);
if(temp_soe.status==0xaa)pdo(1,1);
else pdo(0,1);
soe_ctl[nportno].count--;
soe_ctl[nportno].start++;
if(soe_ctl[nportno].start>=soe_ctl[nportno].size)
soe_ctl[nportno].start=0;
if(soe_ctl[nportno].count==0)
{
soe_ctl[nportno].start=0;
soe_ctl[nportno].next=0;
soe_ctl[nportno].count=0;
}//if(soe_ctl[nportno].count==0)
}//for(
pdo(sum,2);
pdo(0x16,2);
}
else if(soe_ctl[nportno].count==0)
send_no_data(0);
}//void C101::()
void C101::send_class2()
{
int error,modn,i;
unsigned int temp;
int temp1;
struct SOE1 temp_soe; //SOE saver SOE1 defined in common.h
if(soe_ctl[nportno].count!=0)acd=0x20;
else acd=0;
i=soe_c[nportno].count;
if(i<40)temp=i;
else temp=40;
if(temp!=0)
{
putheado(temp*10+6);
pdo(0x88|acd,0);
pdo(dlmyadd,1);//address
pdo(2,1);//biaozhi
pdo(temp,1);//num
pdo(5,1);//course
pdo(dlmyadd,1);
for(i=0;i<temp;i++)
{
temp_soe=soe_c[nportno].soe_log[soe_c[nportno].start];
pdo((temp_soe.orderno+1)&0xff,1);
pdo((temp_soe.orderno+1)>>8,1);
if(temp_soe.status==0xaa)pdo(1,1);
else pdo(0,1);
unsigned int tsec;
tsec=temp_soe.time.second; tsec*=1000;
tsec+=temp_soe.time.mil_second;
pdo(tsec&0xff,1);//ms l
pdo(tsec>>8,1);//ms h
pdo(temp_soe.time.minute,1);//minute
pdo(temp_soe.time.hour,1);
pdo(temp_soe.time.day,1);
pdo(temp_soe.time.month,1);
pdo(temp_soe.time.year-2000,1);
soe_c[nportno].count--;
soe_c[nportno].start++;
if(soe_c[nportno].start>=soe_c[nportno].size)
soe_c[nportno].start=0;
if(soe_c[nportno].count==0)
{
soe_c[nportno].start=0;
soe_c[nportno].next=0;
soe_c[nportno].count=0;
}//if(soe_c[nportno].count==0)
}
pdo(sum,2);
pdo(0x16,2);
}//if
else //soe=0
{
for(i=0;i<port_set[nportno].len_b;i++)
ycif[i]=yc_info.yc_value[i];
for(i=0,ycnum=0;i<(datasource.total_yc+2);i++)
{
error=abs((float)(ycf[i]-ycif[i]));
if(port_set[nportno].len_c==0)
modn=(abs(ycf[i]))*0.001;
else
modn=(abs(ycf[i]))*0.001*port_set[nportno].len_c;
if( (error>modn)||
( (error>=2)&&( (yc_info.yc_value[i]==0)||(ycf[i]==0) )))
{
temyc[ycnum]=i;
ycf[i]=ycif[i];
ycnum++;
if(ycnum>=60){ycnum=60;break;}
}//if( (error>modn)||
}//for(i=0,ycnum=0;i<datasource.total_yc;i++)
if(ycnum==0)
{
send_no_data(acd);
return;
}
else //ycnum!=0
{
/// gotoxy(3,7);printf("%d",ycnum);
if(ycnum>=60)ycnum=60;
putheado(ycnum*4+6);
pdo(0x88|acd,0);
pdo(dlmyadd,1);
pdo(21,1);
pdo(ycnum,1);
pdo(5,1);
pdo(dlmyadd,1);
for(i=0;i<ycnum;i++)
{
pdo((temyc[i]+0x701)&0xff,1);
pdo((temyc[i]+0x701)>>8,1);
temp1=ycf[temyc[i]]&0xfff;
if(temp1&0x0800)
{
temp1=0x0fff-temp1;
temp1=~temp1;
temp1+=1;
}
pdo(temp1&0xff,1);
pdo(temp1>>8,1);
}//for(i=0;i<ycnum;i++)
pdo(sum,2);
pdo(0x16,2);
}//else
}//else
}//void C101::send_class2()
void C101::send_confirm()
{
save_start=oque.start;
save_count=5;
if(soe_ctl[nportno].count!=0) acd=0x20;
else acd=0;
pdo(0x10,2);
pdo(0x80|acd,0);
pdo(dlmyadd,1);
pdo(sum,2);
pdo(0x16,2);
}//void C101::()
void C101::send_no_data(unsigned int a1)
{
save_start=oque.start;
save_count=5;
pdo(0x10,2);
pdo(0x89|a1,0);
pdo(dlmyadd,1);
pdo(sum,2);
pdo(0x16,2);
}//void C101::()
void C101::send_ls()
{
save_start=oque.start;
save_count=5;
flag|=0x80;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -