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

📄 cmdproc.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	     else 
	     {
    	    PutOutTemBuff[8]= string[0];	 
	        PutOutTemBuff[9]= string[1];	 
	     } 	 //D2 	    

	     itoa(IvtimeWakeUp[flag],string,10);
	     len = strlen(string);
	  
	     for(i=0;i<4-len;i++)
	       PutOutTemBuff[10+i]='0'; 
	    
	     for(i=4-len;i<4;i++)
	       PutOutTemBuff[10+i]= string[i-(4-len)]; //D3

	     itoa(Num_of_thr[flag],string,10);
       if(strlen(string)<2)
       {
    	    PutOutTemBuff[14]='0';   
	        PutOutTemBuff[15]= string[0];
	     }
	     else 
	     {
    	    PutOutTemBuff[14]= string[0];	 
	        PutOutTemBuff[15]= string[1];	 
	     } //D4
	  
       for(j=0; j<Num_of_thr[flag]; j++) //D5
       {   
    	    itoa(ThrWakeUp[flag][j].thr_unit,string,10);
    	    len = strlen(string);
    	  
	        for(i=0;i<4-len;i++)
	          PutOutTemBuff[16+i+10*j]='0'; 
	        
	        for(i=4-len;i<4;i++)
	          PutOutTemBuff[16+i+10*j]= string[i-(4-len)]; //D5-1
	        

    	    itoa(ThrWakeUp[flag][j].thr_value,string,10);
    	    len = strlen(string);
    	    
	        for(i=0;i<6-len;i++)
	          PutOutTemBuff[20+i+10*j]='0'; 
	        
	        for(i=6-len;i<6;i++)
	          PutOutTemBuff[20+i+10*j]= string[i-(6-len)]; //D5-2
	            	        	       
        }  //D5    
    
   
    sum_datalen = 9 + 10*Num_of_thr[flag];

/////////////////////////////////////////////////////////////////////////////////////////////////////////
    //数据域的长度为PutOutTemBuff[6]*8个字节(包括0x00填充字节)
    if((sum_datalen%8)==0) PutOutTemBuff[6] = sum_datalen/8;    	
    else PutOutTemBuff[6] = sum_datalen/8 + 1;    	
    
    num_of_fill_byte = PutOutTemBuff[6]*8 - sum_datalen;
    
    for(i=0; i<num_of_fill_byte;i++)
      PutOutTemBuff[7 + sum_datalen + i] = 0x00; //填充0x00字节   
      
	  /////////////////////////////计算校验和  
		cs_bytecount = PutOutTemBuff[6]*8 + 7;
		for( i=0; i < cs_bytecount; i++ )
	 	checksum += PutOutTemBuff[i];   

	 	
	 	PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
	 	
	 	PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR;  //帧结束标志
	 	
	 	PutOutTemBuff[cs_bytecount+2]= '\0';	 		 	
    
    //Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据	
    
	 	r = Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据	
	 	 		  
	  return r;  //add by wuhuan 2006.5.24
	  	  
}   

void Ack_Wrong_ReadSendCondition( unsigned char typeofdata, unsigned char center )
{
	 Ack_single_center_command(typeofdata,	0xc6, center);
} 


int DisconnectTCP( )	
{
    //接受到应用端的关闭指令后,执行连接关闭动作
    if((Rm==ms)&&(RecFrom==APPSERVER1))  //主从模式下,只有主站才能关闭TCP连接  
	  { 
           
           CloseAllTCPConn( );          
                            	         	
	         TaskFlg = NeedInitUART;	   //串口需再次初始化的标志
	         if(GetKPState==LOCK) printf("MS_Mode: Svr1 shutdown TCP Conn!\n");

	  } 	    
	  
	  if(Rm==eb) 
	  {
	  	  if((RecFrom == APPSERVER1)&&(TCPManager[1]->GetConnState( )!=OPEN))
	  	  {
           CloseAllTCPConn( );
           TaskFlg = NeedInitUART;	   //串口需再次初始化的标志
           
	  	  	 if(GetKPState==LOCK) printf("EB_Mode: Svr1 shutdown TCP Conn!\n");
	  	  } 
	  	  else if((RecFrom == APPSERVER2)&&(TCPManager[0]->GetConnState( )!=OPEN))  
	  	  {   
           CloseAllTCPConn( );
           TaskFlg = NeedInitUART;	   //串口需再次初始化的标志
           
	  	  	 if(GetKPState==LOCK) printf("EB_Mode: Svr2 shutdown TCP Conn!\n");
	  	  }	  	  	  	  
 	  	
	  }
	  
	  return 1;	  
}   

int Master_slave_mode( )  
{
    Rm = ms; 
    
    if(RecFrom == APPSERVER1) TCPManager[0]->SetTimeoutCnt( 1 ); 
    else TCPManager[1]->SetTimeoutCnt( 1 ); 
    	
    return 1;
}	  

int Equal_backup_mode( )
{
	  Rm = eb; 

    if(RecFrom == APPSERVER1) TCPManager[0]->SetTimeoutCnt( 1 ); 
    else TCPManager[1]->SetTimeoutCnt( 1 );
    		  
	  return 1;
}

int Simplex_mode( )
{
	  if(Rm==eb)
	  {
	      if (RecFrom == APPSERVER1) TCPManager[1]->Close( );
	      else  TCPManager[0]->Close( );	
	  }
	  
    Cm = simplex; 

    if(RecFrom == APPSERVER1) TCPManager[0]->SetTimeoutCnt( 1 ); 
    else TCPManager[1]->SetTimeoutCnt( 1 );
    	    
	  return 1; 	  
}	 
 
int Duplex_mode( )
{   
	  Cm = duplex;

    if(RecFrom == APPSERVER1) TCPManager[0]->SetTimeoutCnt( 1 ); 
    else TCPManager[1]->SetTimeoutCnt( 1 );
    		  
	  return 1;
}

//////////////////////// 	 
int Modify_Svr_Addr( unsigned char *CmdDataBuf )
{   
	  unsigned char  i, datalen;
	  unsigned char  GetInBuf[30]; 
	  unsigned char  *ptr;
	  
	  datalen = CmdDataBuf[6]*8;
	  
	  for(i=0; i<datalen; i++) 
	    GetInBuf[i] = CmdDataBuf[7+i];
	  GetInBuf[datalen] = '\0'; 
	  
	  ptr=strtok( GetInBuf,"/" );  //取"/"号前面的字符到Content地址中
	  
	  if( !stricmp( "s", ptr ) )  //找到符合要求的服务端
	  {
	      ptr=strtok( NULL,":" );   //遇到":" 字符取字符串动作结束
	      if(ptr!=NULL)             //"/"号后面有字符
	      strcpy( Svr_ID.IPStr, ptr );
	             
	      ptr=strtok( NULL,";" ); //遇到";" 字符或回车字符取字符串动作结束
	      Svr_ID.Port = atoi(ptr );
	      
	      if(RecFrom == APPSERVER1)    // 来自集中器第一条TCP的连接的请求        
	      {
	         TCPManager[0]->Close( );           
	         TCPManager[0]->Init( &Svr_ID );
	      }
	      else
	      {
	         TCPManager[1]->Close( );	              
	         TCPManager[1]->Init( &Svr_ID );
	      }	      
     }
	  	
	  return 1;
	   
} 
	
int Save_Svr_Addr( )
{
	  SERVER_ID   *CurrentServer_ID; 
	  
	  if(RecFrom == APPSERVER1)    // 来自集中器第一条TCP的连接
	  { 
	       CurrentServer_ID=TCPManager[0]->GetServer_ID();	       
	       ReadIni.WriteField( "Config.ini", "[CONFIG1]", "RemoteIP",  CurrentServer_ID->IPStr );
	       ReadIni.WriteField( "Config.ini", "[CONFIG1]", "RemotePort",  CurrentServer_ID->Port );
	  }
	  else  // 来自集中器第二条TCP的连接
	  { 
	       CurrentServer_ID=TCPManager[1]->GetServer_ID();
	       ReadIni.WriteField( "Config.ini", "[CONFIG2]", "RemoteIP",  CurrentServer_ID->IPStr );
	       ReadIni.WriteField( "Config.ini", "[CONFIG2]", "RemotePort",  CurrentServer_ID->Port );
	  }
	           	 
	  return 1;
} 	  
	 
int Ack_Read_DTU_time( unsigned char typeofdata )
{  
	  unsigned char checksum = 0;
	  unsigned char cs_bytecount;
	  unsigned char i = 0;	
	  unsigned char *PutOutTemBuff;	
	  
	  PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
	  
	  PutOutTemBuff[0]=	0x68;
	  PutOutTemBuff[1]=	DTUAddress[0];
	  PutOutTemBuff[2]=	DTUAddress[1];
	  PutOutTemBuff[3]=	typeofdata;    
	  PutOutTemBuff[4]=	0x68;        
	  
	  PutOutTemBuff[5]= 0x8F;  //应答校时的功能码 
	  
	  PutOutTemBuff[6]= 0x02; 
	  
	  AddTimeInfo( PutOutTemBuff ); //给上报的数据包中添加时间

//不足8的整数倍字节的补0x00	  
	  PutOutTemBuff[19]= 0x00;
	  PutOutTemBuff[20]= 0x00;
	  PutOutTemBuff[21]= 0x00;
	  PutOutTemBuff[22]= 0x00;
	  	  	
/////////////////////////////计算校验和  
		cs_bytecount = PutOutTemBuff[6]*8 + 7;
		for( i=0; i < cs_bytecount; i++ )
	 	checksum += PutOutTemBuff[i];   

	 	
	 	PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
	 	
	 	PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR;  //帧结束标志	
	 	
	 	PutOutTemBuff[cs_bytecount+2]= '\0';	 	 	

	 	Send_to_Single_Svr(PutOutTemBuff, RecFrom, cs_bytecount+2); //向应用端发送数据
	 	 
	  return 1;
	 
}

//配置数据采集的间隔时间
int Write_interval_time_of_gatherdata( unsigned char *CmdDataBuf )
{
	  int  configvar = 5;
	  
    configvar = (CmdDataBuf[7]-48)*100 + (CmdDataBuf[8]-48)*10 + CmdDataBuf[9]-48;

	  if(configvar) 
	  {  
	  	  if(CmdDataBuf[3]==0x01) Ivtime[0] = configvar; //配置雨量采集的间隔时间
	  	  if(CmdDataBuf[3]==0x02) Ivtime[1] = configvar; //配置水位采集的间隔时间
	  	 	
	  	 	return configvar;
	  }	 
	  else 	return 5;
	  	
}

//正确应答配置数据采集的间隔时间
void Ack_Right_Write_interval_time_of_gatherdata( unsigned char typeofdata, unsigned char center )
{
	  Ack_single_center_command(typeofdata , 0x92, center);
} 

//异常应答配置数据采集的间隔时间
void Ack_Wrong_Write_interval_time_of_gatherdata( unsigned char typeofdata, unsigned char center )
{
	  Ack_single_center_command(typeofdata , 0xd2, center);
}

//正确应答读数据采集的间隔时间
int Ack_Right_Read_interval_time_of_gatherdata( unsigned char typeofdata, unsigned char center )
{   
	  int           r;   //add by wuhuan 2006.5.26
	  unsigned char i, j, k,len,checksum = 0;
	  unsigned char cs_bytecount;	
	  unsigned char *PutOutTemBuff;
	  char string[10];
    
    PutOutTemBuff = TmpBuf; //让指针变量的地址指向TmpBuf
    
	  PutOutTemBuff[0]=	0x68;
	  PutOutTemBuff[1]=	DTUAddress[0];
	  PutOutTemBuff[2]=	DTUAddress[1];
	  PutOutTemBuff[3]=	typeofdata;    
	  PutOutTemBuff[4]=	0x68;        
	  
	  PutOutTemBuff[5]= 0x93;  //上报招测数据的功能码  
	  
	  PutOutTemBuff[6]= 0x01;  //数据区的长度8个字节
	  
    if(typeofdata==0x01) itoa(Ivtime[0],string,10); //取雨量采集的间隔时间
    else if(typeofdata==0x02) itoa(Ivtime[1],string,10); //取水位采集的间隔时间
    else { if(GetKPState==LOCK) printf("\nUpFrame format erro!\n");} 
	     
	  len = strlen(string);
	  
	  for(k=0;k<3-len;k++)
	    PutOutTemBuff[7+k]='0'; 
	    
	  for(k=3-len;k<3;k++)
	    PutOutTemBuff[7+k]= string[k-(3-len)]; //D3	    	  
	  
	  for(j=0; j<5; j++)
	     PutOutTemBuff[10+j] = 0x00;

/////////////////////////////计算校验和  
		cs_bytecount = PutOutTemBuff[6]*8 + 7;
		for( i=0; i < cs_bytecount; i++ )
	 	checksum += PutOutTemBuff[i];   

	 	
	 	PutOutTemBuff[cs_bytecount]= checksum; //存放校验和的数值
	 	
	 	PutOutTemBuff[cs_bytecount+1]= FRAME_END_CHAR;  //帧结束标志	
	 	
	 	PutOutTemBuff[cs_bytecount+2]= '\0';
	 	
	 //	Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据	  
	  r = Send_to_Single_Svr(PutOutTemBuff, center, cs_bytecount+2); //向应用端发送数据
	  
	  return r;
	  
}

//错误应答读数据采集的间隔时间	
void Ack_Wrong_Read_interval_time_of_gatherdata( unsigned char typeofdata, unsigned char center )
{
	  Ack_single_center_command(typeofdata,	0xd3, center);
}

//在发送包中添加时间信息	  
int AddTimeInfo( unsigned char *PutOutTemBuff )
{   
	  char string[10]; 
	  
	  struct time t;
    struct date d;
    	
///////////////////////////////////////给上报的数据包中添加时间
	  getdate( &d ); //取系统的时间
	  gettime( &t ); 	         

//添加年		
    itoa(d.da_year,string,10);  //把整型转换成十进制字符型,存放在string字符串中
	  PutOutTemBuff[7]=	string[2];  
	  PutOutTemBuff[8]=	string[3];  

//添加月份
    itoa(d.da_mon,string,10); //把整型转换成十进制字符型,存放在string字符串中
    if(strlen(string)<2)
    {
    	 PutOutTemBuff[9]='0';   //月份少于两个字节前面补零
	     PutOutTemBuff[10]= string[0];
	  }
	  else 
	  {
    	 PutOutTemBuff[9]= string[0];	 
	     PutOutTemBuff[10]= string[1];	 
	  }  

//添加日期
    itoa(d.da_day,string,10); //把整型转换成十进制字符型,存放在string字符串中
    if(strlen(string)<2)
    {
    	 PutOutTemBuff[11]='0';  //日期少于两个字节前面补零
	     PutOutTemBuff[12]= string[0];
	  }
	  else
	  {
    	 PutOutTemBuff[11]= string[0];	 
	     PutOutTemBuff[12]= string[1];	 
	  } 	  

⌨️ 快捷键说明

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