⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 101.cpp

📁 一个完整的RTU程序源码,用DOS平台,支持16串口,在天津港用的很多,8个规约103,modbus,cdt,1801,u4f
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#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 + -