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

📄 101.cpp

📁 一个完整的RTU程序源码,用DOS平台,支持16串口,在天津港用的很多,8个规约103,modbus,cdt,1801,u4f
💻 CPP
📖 第 1 页 / 共 3 页
字号:
 pdo(0x10,2);
    if(((flag&0x20)==0)&&((flag&0xc0)==0xc0))	  pdo(0xab,0);
    else pdo(0x8b,0);
 pdo(dlmyadd,1);
 pdo(sum,2);
 pdo(0x16,2);
}//void C101::send_ls()

void C101::send_pack()
{
   int i;
   if( (port_free(nportno))&&(oque.count>0) )
    {
      int temp;
      if(oque.count>12)temp=12;
      else temp=oque.count;
      for(i=0;i<temp;i++)
       {
	if(i==(temp-1))quick_send=TRUE;
	comput(oque.buf[oque.start],nportno);
	disptbuf(oque.buf[oque.start],nportno);
	//if((oque.buf[oque.start]==0x04)||(oque.buf[oque.start]==0x25))
	oque.start++;
	if(oque.start>=oque.size)oque.start=0;
	oque.count--;
       }
     }
}//void

void C101::dropdata() //for application layer
{
  if(ique.count>0)
  {
     ique.start++;
     if(ique.start>=ique.size)ique.start=0;
     ique.count--;
  }//if(ique.count>0)
}//void C101()

void C101::pdo(unsigned int data,int con)
{
  if(con==0)
    sum=data&0xff;
  else if(con==1)
    sum+=(data&0xff);
  oque.buf[oque.next++]=data&0xff;
  if(oque.next>=oque.size)
    oque.next=0;
  oque.count++;
  if(oque.count>oque.size)
  {
     oque.count=oque.size;
     oque.start++;
     if(oque.start>=oque.size)
       oque.start=0;
  }//if(oque.count>oque.size)
}//void C1dir

void C101::report_count()
{

}

void C101::clear_oque()
{
  oqp=0;//clear group send;
  oque.start=0;
  oque.next=0;
  oque.count=0;
  oque.size=512;
}//void C101::f()

void C101::clear_ique()
{
  ique.start=0;
  ique.next=0;
  ique.count=0;
  ique.size=128;
}//void C101::

void C101::getcmd()
{
  int i;
  unsigned int result;
  while(get_in(nportno))
  {
    putdi(getchin[nportno]&0xff);
    disprbuf(getchin[nportno]&0xff,nportno);
  }
  while(ique.count<5)
    return;
  while( (ique.count>=5)
  &&(
     (ique.buf[qmod(ique.start,ique.size)]!=0x68)
     ||(ique.buf[qmod(ique.start+1,ique.size)]!=ique.buf[qmod(ique.start+2,ique.size)])
     ||(ique.buf[qmod(ique.start+3,ique.size)]!=0x68)
     ||((ique.buf[qmod(ique.start+5,ique.size)]!=dlmyadd)&&(ique.buf[qmod(ique.start+5,ique.size)]!=0xff))
    )
    &&
    (
     (ique.buf[qmod(ique.start,ique.size)]!=0x10)
     ||((ique.buf[qmod(ique.start+1,ique.size)]&0x40)!=0x40)
     ||(ique.buf[qmod(ique.start+4,ique.size)]!=0x16)
     ||((ique.buf[qmod(ique.start+2,ique.size)]!=dlmyadd)
	     &&(ique.buf[qmod(ique.start+5,ique.size)]!=0xff))
    )//&&
    )    dropdata();

    if(ique.count<5)return;
    if(ique.buf[qmod(ique.start,ique.size)]==0x10)
    {
       result=ique.buf[qmod(ique.start+1,ique.size)]+ique.buf[qmod(ique.start+2,ique.size)];
       result&=0xff;
       if(ique.buf[qmod(ique.start+3,ique.size)]==result)
       {
	 clear_oque();
	 deal_inf(0x10);
       }
       clear_ique();
    }//above is definited long frame.
    else//below is variable long frame.
    {
       unsigned int len=ique.buf[qmod(ique.start+1,ique.size)]&0xff;
       if(ique.count<(len+6))
	 return;
       for(i=0,result=0;i<len;i++)
	  result+=ique.buf[qmod(ique.start+4+i,ique.size)];
	  result&=0xff;
       if((ique.buf[qmod(ique.start+len+5,ique.size)]==0x16)
	  &&(ique.buf[qmod(ique.start+len+4,ique.size)]==result))
       {
	 clear_oque();
	 deal_inf(0x68);
       }
       clear_ique();
    }//above is variable long frame.
}//int C101::dl_getcmd()

void C101::put_oth()
{
  int i;
  if(oqp==0)return;
  if(oque.count<255)send_group(oqp++,20);
  if(oqp==17)
  {
   oqp=0;
   send_over_call();
  }
  else if (oqp>17)initial(nportno);
}//void C101::

void C101::send_over_call()
{
 putheado(9);
 pdo(0x80,0);
 pdo(dlmyadd,1);//address
 pdo(100,1);//biaozhi
 pdo(1,1);//num
 pdo(10,1);
 pdo(dlmyadd,1);
 pdo(0,1);//addl
 pdo(0,1);//add h
 pdo(20,1);
 pdo(sum,2);
 pdo(0x16,2);
}//void C101::

void C101::send_group(unsigned int num,unsigned int course)
{
  int yxg,ycg,modx,modc,i;
  unsigned int test,temp;
  int temp1;
  yxg=datasource.total_yx/127;
  modx=datasource.total_yx-yxg*127;
  ycg=(datasource.total_yc+2)/120;
  modc=(datasource.total_yc+2)-ycg*120;
   if(soe_ctl[nportno].count!=0)acd=0x20;
   else acd=0;
  switch(num)
   {
     case 1:
	if(yxg>=1)
	 {
	   putheado(135);
	   if(course!=20)pdo(0x80|acd,0);
	   else    	 pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(127|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0+1,1);
	   pdo(0,1);
	   for(i=0;i<127;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<240;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }//if(yxg>=1)
	else if(modx>0)
	 {
	   putheado(modx+8);
	   if(course!=20)pdo(0x80|acd,0);
	   else pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(modx|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0+1,1);
	   pdo(0,1);
	   for(i=0;i<modx;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<modxf;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }
     else if(course!=20)
	 send_no_data(acd);
     break;
     case 2:
	if(yxg>=2)
	 {
	   putheado(135);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(127|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(127+1,1);
	   pdo(0,1);
	   for(i=127;i<254;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=240;i<480;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }//if(yxg>=2)
	else if((yxg==1)&&(modx>0))//ycg==1
	 {
	   putheado(modx+8);
	   if(course!=20)pdo(0x80|acd,0);
	   else    pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(modx|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(127+1,1);
	   pdo(0,1);
	   for(i=127;i<127+modx;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<modxf;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }
	else if(course!=20)
	 send_no_data(acd);
     break;
     case 3:
	if(yxg>=3)
	 {
	   putheado(135);
	   if(course!=20)pdo(0x80|acd,0);
	   else    pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(127|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0xfe+1,1);
	   pdo(0,1);//0x0fe=254
	   for(i=254;i<381;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=
	     pdo(sum,2);
	     pdo(0x16,2);
	 }//if(yxg>=1)
	else if((yxg==2)&&(modx>0))//yxg==2
	 {
	   putheado(modx+8);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(modx|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0xfe+1,1);//0xfe=254
	   pdo(0,1);
	   for(i=254;i<254+modx;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<modxf;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }
	else if(course!=20)
	 send_no_data(acd);
     break;
     case 4:
	if(yxg>=4)
	 {
	   putheado(135);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(127|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0x7d+1,1);//0x17d=381
	   pdo(1,1);
	   for(i=381;i<508;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=240;i<480;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }//if(yxg>=1)
	else if((yxg==3)&&(modx>0))
	 {
	   putheado(modx+8);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(modx|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0x7d+1,1);//0x17d=381
	   pdo(1,1);
	   for(i=381;i<381+modx;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<modxf;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }
	else if(course!=20)
	 send_no_data(acd);
     break;
     case 5:
	if(yxg>=5)
	 {
	   putheado(135);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(127|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0xfc+1,1);//0x1fc=508
	   pdo(1,1);
	   for(i=508;i<635;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=240;i<480;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }//if(yxg>=1)
	else if((yxg==4)&&(modx>0))
	 {
	   putheado(modx+8);
	   if(course!=20)pdo(0x80|acd,0);
	   else 	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(modx|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0x1fc+1,1);//0x1fc=508
	   pdo(1,1);
	   for(i=508;i<508+modx;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<modxf;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }
	else if(course!=20)
	 send_no_data(acd);
     break;
     case 6:
	if(yxg>=6)
	 {
	   putheado(135);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(127|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0x7b+1,1);//0x27b=635
	   pdo(2,1);
	   for(i=635;i<762;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=240;i<480;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }//if(yxg>=1)
	else if((yxg==5)&&(modx>0))
	 {
	   putheado(modx+8);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(modx|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0x7b+1,1);//0x27b=635
	   pdo(2,1);
	   for(i=635;i<635+modx;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<modxf;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }
	else if(course!=20)
	 send_no_data(acd);
     break;
     case 7:
	if(yxg>=7)
	 {
	   putheado(135);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(127|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0xfa+1,1);//0x2fa=762
	   pdo(2,1);
	   for(i=762;i<889;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=240;i<480;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }//if(yxg>=1)
	else if((yxg==6)&&(modx>0))
	 {
	   putheado(modx+8);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(modx|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0xfa+1,1);//0x2fa=635
	   pdo(2,1);
	   for(i=762;i<762+modx;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<modxf;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }
	else if(course!=20)
	 send_no_data(acd);
     break;
     case 8:
	if(yxg==8)
	 {
	   putheado(135);
	   if(course!=20)pdo(0x80|acd,0);
	   else	   pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(127|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0x79+1,1);//0x379=889
	   pdo(3,1);
	   for(i=889;i<1016;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=240;i<480;i++)
	     pdo(sum,2);
	     pdo(0x16,2);
	 }//if(yxg>=1)
	else if((yxg==7)&&(modx>0))
	 {
	   putheado(modx+8);
	   if(course!=20)pdo(0x80|acd,0);
	   else	pdo(0x80,0);
	   pdo(dlmyadd,1);//address
	   pdo(1,1);
	   pdo(modx|0x80,1);
	   pdo(course,1);
	   pdo(dlmyadd,1);//address
	   pdo(0x79+1,1);//0x379=889
	   pdo(3,1);
	   for(i=889;i<889+modx;i++)
	    {
	     test=i-(i/16)*16;
	     test=(((unsigned int)1)<<test);
	     if((yx_info.yx_value[i/16])&test) pdo(1,1);
	     else pdo(0,1);
	    }//for(i=0;i<modxf;i++)
	     pdo(sum,2);
	     pdo(0x16,2);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -