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

📄 main.c

📁 C51实现西门子PPI协议
💻 C
📖 第 1 页 / 共 2 页
字号:
						if((list.next_stationaddress==127)&&(list.previous_stationaddress!=0))
						{send_sd4_frame(list.previous_stationaddress);
						status=CHECK_PASS_TOKEN;
						YZ_status_bef=PASS_TOKEN;
							}
						else if((list.next_stationaddress!=127)&&(list.previous_stationaddress==0))
						{
						 send_sd4_frame(list.next_stationaddress);
						status=CHECK_PASS_TOKEN;
						YZ_status_bef=PASS_TOKEN;
							}
						else if((list.next_stationaddress!=127)&&(list.previous_stationaddress!=0))
							{
							 send_sd4_frame(list.next_stationaddress);
						status=CHECK_PASS_TOKEN;
						YZ_status_bef=PASS_TOKEN;
							}
						else
						{
						 send_sd4_frame(ADDRESS) ;//只有自己一个主站
						status=USE_TOKEN;
						YZ_status_bef=PASS_TOKEN;
							}
						
								}
					      if(YZ_response_flag==1)
							{
							YZ_response_flag=0;
							 if(YZ_SD1->Frame_Contorl==0x20)//有主站进入
						           {
								list.next_stationaddress=YZ_SD1->Source_Address;
							    }
									 
							          TH0=TH0_VALUE;
									  TL0=TL0_VALUE;
									  TR0=1;
									  YZ_sync_timer=SYNC_TIME;
								   }
						
						
					 if(YZ_sync_timer_flag==1)
						   {
						     TR0=0;
						    YZ_sync_timer_flag=0;
						  YZ_SD4=(  SD4_Message_Formate * )YZ_s_buffer;
								
						       if((list.next_stationaddress==127)&&(list.previous_stationaddress!=0))
						         { send_sd4_frame(list.previous_stationaddress);
						          status=CHECK_PASS_TOKEN;
								  YZ_status_bef=PASS_TOKEN;
							   }
						       else if((list.next_stationaddress!=127)&&(list.previous_stationaddress==0))
						         {
						          send_sd4_frame(list.next_stationaddress);
						          status=CHECK_PASS_TOKEN;
								  YZ_status_bef=PASS_TOKEN;
							   }
							   else if((list.next_stationaddress!=127)&&(list.previous_stationaddress!=0))
							{
							 send_sd4_frame(list.next_stationaddress);
						          status=CHECK_PASS_TOKEN;
						         YZ_status_bef=PASS_TOKEN;
							}
						        else
						        {
						         send_sd4_frame(ADDRESS);
						          status=USE_TOKEN;
								  YZ_status_bef=PASS_TOKEN;
							}
						
						
						}
							}
						if(YZ_status_bef==CHECK_PASS_TOKEN)	
							{ 
						
							   if(YZ_no_response_flag==1)
							   	{  YZ_pass_token_timer++;
							   	YZ_no_response_flag=0;
								if(YZ_pass_token_timer<=1)      //passtoken not success retry
									{
									     YZ_SD4=(  SD4_Message_Formate * )YZ_s_buffer;
								
						                            if((list.next_stationaddress==127)&&(list.previous_stationaddress!=0))
						                          { send_sd4_frame(list.previous_stationaddress);
						                                   status=CHECK_PASS_TOKEN;
								                     YZ_status_bef=PASS_TOKEN;
							                       }
						                          else if((list.next_stationaddress!=127)&&(list.previous_stationaddress==0))
						                           {
						                             send_sd4_frame(list.next_stationaddress);
						                           status=CHECK_PASS_TOKEN;
								              YZ_status_bef=PASS_TOKEN;
							                       }
							                  else if((list.next_stationaddress!=127)&&(list.previous_stationaddress!=0))
							                      {
							                      send_sd4_frame(list.next_stationaddress);
						                               status=CHECK_PASS_TOKEN;
						                              YZ_status_bef=PASS_TOKEN;
							                        }
									}
								else         //发送两次没成功认为下一主站不在
									{ YZ_pass_token_timer=0;
								          
								          if((list.next_stationaddress==127)&&(list.previous_stationaddress!=0))   //UPDATA LIST
									     list.previous_stationaddress=0;
										else
											list.next_stationaddress=127;
										 send_sd4_frame(ADDRESS);
						                       status=USE_TOKEN;
											  YZ_status_bef=CHECK_PASS_TOKEN;
									
									}
							   	}
							   	
							
							}
					break;
					case AWAIT_STATUS_RESPONSE:
						//YZ_slot_timer=3;
						TR0=1;
						//TH0=TH0_VALUE;
						//TL0=TL0_VALUE;
						if(YZ_slot_timer_flag==1)//TIME OUT
							{YZ_slot_timer=SLOT_TIME;
							YZ_slot_timer_flag=0;
							 YZ_no_response_flag=1;
							 TR0=0;
							 status=PASS_TOKEN;
							 YZ_status_bef=AWAIT_STATUS_RESPONSE;
							}
						  if((YZ_uart_complete==UART_COMPLETE)&&(YZ_slot_timer_flag==0))
						  	{
						  	
							 if(YZ_r_buffer[0]==SD1)// FDL  状态请求
					               { 
					                comm_error=receive_parity_check(YZ_uart_num);
							 if(comm_error==0)
							 	{
							 	  YZ_SD1=(  SD1_Message_Formate * )YZ_r_buffer;
							 	    if(YZ_SD1->Source_Address==YZ_current_gap_address)
									{YZ_response_flag=1;
									TR0=0;
									  status=PASS_TOKEN;
							               YZ_status_bef=AWAIT_STATUS_RESPONSE;
							 	    	}
									
							 	}
							 
							  }
							
							   YZ_uart_num=0;
					                YZ_uart_complete=0;
						  	  
							
							 
						  	}
							
						break;
						case  CHECK_PASS_TOKEN:
							TR0=1;
							
							if(YZ_slot_timer_flag==1)
								{YZ_slot_timer=SLOT_TIME;
								  YZ_slot_timer_flag=0;
							         TR0=0;
								   status=PASS_TOKEN;
								   YZ_status_bef=CHECK_PASS_TOKEN;
								   	YZ_no_response_flag=1;
								
								}
							if(YZ_token_passed==1)
							     {
							        TR0=0;
							       YZ_token_passed=0;
								 status=ACTIVE_IDLE;
							        YZ_status_bef=CHECK_PASS_TOKEN;
							      }
							  
							
							break;
						
				default:
					break;
}
  	}
}
		
			 
		
  	

void uart_timer_set(void)
{
  
        TCON=0x00;
        PCON=PCON_VALUE;			//波特率选择
        IP=IP_VALUE;	    		//设置各中断优先级		
    	TMOD=TMOD_VALUE;   			//设置各定时器的工作方式
    	T2CON=T2CON_VALUE;
    	SCON=SCON_VALUE;    		//设置串行工作方式
    	TH1=TL1=BAUD_VALUE; 		//设定波特率的值
    	TR1=TRUE;
    	TI=RI=FALSE;
        TH0=TH0_VALUE;
	TL0=TL0_VALUE;
      YZ_uart_num=0;
       YZ_uart_complete=0;
}

//发送一个字节
void uart_send(unsigned char s)
 	{
		SBUF=s;
		while(TI!=TRUE)
			;
		 TI=FALSE;
	}
//字节校验
void byte_parity(unsigned char num)
	{
		unsigned char data YZ_cy;
		unsigned char data YZ_z=0x80;
		unsigned char data YZ_i;

		if(num==7) YZ_z=0x40;
		YZ_cy=0;
		for(YZ_i=num;YZ_i;YZ_i--)
			{
				if((YZ_parity&YZ_z)!=0)
					YZ_cy=!YZ_cy;
				YZ_z>>=1;
			}
		YZ_parity=YZ_cy;
	}
unsigned char  receive_parity_check(unsigned char YZ_r_number)
{unsigned  char parity_result;
  for(YZ_i=0;YZ_i<YZ_r_number;YZ_i++)
	{YZ_parity=YZ_r_buffer[YZ_i];
		byte_parity(8);
	   if(r_buffer_rb8[YZ_i]==YZ_parity)
		  parity_result=0;
	    else
		{ parity_result=1;
		  break;
		 }
	  }
    return   parity_result ;
}
void send_sd1_frame(unsigned char destination_adderss,unsigned char frame_control)
{
   SD1_Message_Formate * YZ_SD1;
   YZ_SD1=(  SD1_Message_Formate * )YZ_s_buffer;
   YZ_SD1->Start_Detimiter1=SD1;
   YZ_SD1->Destination_Adderss=destination_adderss;
   YZ_SD1->Source_Address=ADDRESS;
   YZ_SD1->Frame_Contorl=frame_control;
   YZ_SD1->Frame_check_squence=((YZ_SD1->Destination_Adderss+YZ_SD1->Source_Address+YZ_SD1->Frame_Contorl)%256);
   YZ_SD1->End_Delimiter=ED;
    for(YZ_i=0;YZ_i<6;YZ_i++)
	 {YZ_parity=YZ_s_buffer[YZ_i];
	   byte_parity(8);
	 s_buffer_tb8[YZ_i]=YZ_parity;
	}
   frame_send(6);
}
void send_sd4_frame(unsigned char destination_address)
{
    SD4_Message_Formate * YZ_SD4;
     YZ_SD4=(  SD4_Message_Formate * )YZ_s_buffer;
     YZ_SD4->Start_Detimiter4=SD4;
    YZ_SD4->Destination_Adderss=destination_address;
     YZ_SD4->Source_Address=ADDRESS;
  for(YZ_i=0;YZ_i<3;YZ_i++)
		 {YZ_parity=YZ_s_buffer[YZ_i];
						   byte_parity(8);
						 s_buffer_tb8[YZ_i]=YZ_parity;
					  	}
						frame_send(3);
}
	
/**************************************************************************************************
Name: 		 void time_delay(unsigned int)
Description: 	 time delay, 11.0592M  1 ≌ 2mS
Calls: 		 none
**************************************************************************************************/
void time_delay(unsigned int s)
	{
		unsigned int p;

		for(p=s;p;p--)
			{
				for(YZ_i=166;YZ_i;YZ_i--);
			}
	}


//发送一帧数据
void frame_send(unsigned char t)//发送数据桢
	{
		EA=FALSE;
		
		RTS0=!RTS0;		
		for(YZ_i=0;YZ_i<t;YZ_i++)
			{TB8=s_buffer_tb8[YZ_i];
			  uart_send(YZ_s_buffer[YZ_i]);
					}
			
		RTS0=!RTS0;
		EA=TRUE;
	}
	
   


void uart_int(void)  interrupt 4  using 2
 	{
		unsigned char data u;
		
		u=SBUF;
		YZ_r_buffer[YZ_uart_num]=u;
		if(status==CHECK_PASS_TOKEN) //检查令牌
			{
			  YZ_token_passed=1;
			}
		//if(status==LISTEN_TOKEN)
		//	YZ_idle_timer=6*SLOT_TIME+(2*ADDRESS*SLOT_TIME);
		switch   (YZ_r_buffer[0])
			{
			case    SD1:
				r_buffer_rb8[YZ_uart_num]=RB8;
				YZ_uart_num++;
				if((YZ_uart_num==2)&&(YZ_r_buffer[YZ_uart_num-1]!=ADDRESS))
					YZ_uart_num=0;
				if((YZ_uart_num==6)&&(YZ_r_buffer[YZ_uart_num-1]==ED))
				 YZ_uart_complete=UART_COMPLETE;
				if(YZ_uart_num>6)
					YZ_uart_num=0;
				break;
			 case    SD2:
			 	r_buffer_rb8[YZ_uart_num]=RB8;
				YZ_uart_num++;
				if((YZ_uart_num==5)&&(YZ_r_buffer[YZ_uart_num-1]!=ADDRESS))
				YZ_uart_num=0;
		               if(YZ_r_buffer[YZ_uart_num-1]==ED)
				 YZ_uart_complete=UART_COMPLETE;
					   break;
		          case    SD4:
				  r_buffer_rb8[YZ_uart_num]=RB8;
				YZ_uart_num++;	
				
				if(YZ_uart_num==3)
				 YZ_uart_complete=UART_COMPLETE;
				break;
				case   SC:
					r_buffer_rb8[YZ_uart_num]=RB8;
					YZ_uart_num++;
					 YZ_uart_complete=UART_COMPLETE;
				  break;
				 default:
				 	YZ_uart_num=0;
					break;
			   }
				 	
				RI=FALSE;
			
		
         }
void	timer0_int(void) interrupt 1 using 3  //10MS
	{	TF0=FALSE;	
             
		TH0=TH0_VALUE;
		TL0=TL0_VALUE;
		if((status==LISTEN_TOKEN)||(status==ACTIVE_IDLE))
			{
		          //status=LISTEN_TOKEN;
		        YZ_idle_timer--;
		         if(YZ_idle_timer==0)
			 { 
			  YZ_idle_timer_flag=1;
			  }
			}
		if(status==PASS_TOKEN)
			{
			YZ_sync_timer--;
			if(YZ_sync_timer==0)
				YZ_sync_timer_flag=1;
			}
		if(status==AWAIT_STATUS_RESPONSE)
			{
			YZ_slot_timer--;
			if(YZ_slot_timer==0)
			  YZ_slot_timer_flag=1;
			}
		//if(status==PASS_TOKEN)
			//{
			//YZ_slot_timer--;
			//
			//if(YZ_slot_timer==0)
			//  YZ_slot_timer_flag=1;
			//}
		
		
			
		if(status==USE_TOKEN)
			{
			  status=CHECK_ACCESS_TIME;
			}
		if(status==AWAIT_RESPONSE)
			{
			YZ_sync_timer--;
			if(YZ_sync_timer==0)
				YZ_sync_timer_flag=1;
			}
		if(status==CHECK_PASS_TOKEN)
			{
			  YZ_slot_timer--;
			if(YZ_slot_timer==0)
			  YZ_slot_timer_flag=1;
			}
		
	}

unsigned char *sd2data_write_formate()
 	
{  SD2_Message_HEADER xdata *sd2_header;
  SD2_PDU_REQUEST_HEADER xdata*sd2_pdu_header;
SD2_PARAMETER_REQUEST_BLOCK xdata*sd2_paramer;
SD2_VARIABLE_AREA_BLOCK xdata*sd2_variable;
SD2_WRITEDATA_REQUEST_BLOCK xdata*sd2_data;
SD2_END xdata*sd2_over;
unsigned char sum=0,i;
     unsigned char xdata * outbuf;
    outbuf = (unsigned char xdata *)malloc(40);
      if (outbuf == NULL)
   {
     return  NULL;
   }
   sd2_header=(SD2_Message_HEADER xdata * )(outbuf);
   sd2_header->Start_Detimiter2=0x68;
   sd2_header->Length_Byte=0x21                   ;
   sd2_header->Length_Byte_repeated= 0x21       ;
   sd2_header->Start_Detimiter2_repeated=0x68;
   sd2_header->Destination_Adderss=0x02        ;
   sd2_header->Source_Address=ADDRESS;
    sd2_header->Frame_Contorl=0x6c                 ;
   sd2_pdu_header=(SD2_PDU_REQUEST_HEADER xdata* )(outbuf+7);
   sd2_pdu_header->PROTE_ID=0x32;
   sd2_pdu_header->ROSCTR=0x01;
   sd2_pdu_header->RED_ID=0x0000;
   sd2_pdu_header->PDU_REF=    0x0101 ;
   sd2_pdu_header->PAR_LG=  0x000e      ;//参数长度
   sd2_pdu_header->DAT_LG=  0x0006       ;   //数据长度
    sd2_paramer=(SD2_PARAMETER_REQUEST_BLOCK xdata*)(outbuf+17);
    sd2_paramer->SERVICE_ID=0x05;
	sd2_paramer->NUMBER_OF_VARIABLE= 0x01  ;
	sd2_paramer->VARIABLE_SPEC=0x12;
	sd2_paramer->V_ADDR_LG=0x0a;
   sd2_variable=(SD2_VARIABLE_AREA_BLOCK xdata* )(outbuf+21);
   sd2_variable->SYNTAX_ID=0x10;
   sd2_variable->TYPE= 0x04  ;
   sd2_variable->NUMBER_OF_ELEMENT=0x0001;
   sd2_variable->SUBAREA=0x0001;
   sd2_variable->AREA=0x84;
   sd2_variable->OFFSET[0]=0x00;
   sd2_variable->OFFSET[1]=0x00;
   sd2_variable->OFFSET[2]=0x00;
   sd2_data=(SD2_WRITEDATA_REQUEST_BLOCK xdata* )(outbuf+31);
   sd2_data->RESERVED=0x00;
   sd2_data->D_TYPE=0x04;
   sd2_data->VAR_LG=0x0010;
   sd2_data->VARIABLE_VALUE=0x00;
   sd2_data->FILL_BIT=0x01;
   sd2_over=(SD2_END*)(outbuf+37);
   for(i=4;i<37;i++)
   	{sum=(sum+(*(outbuf+i))%256);
   	}
   sd2_over->FCS=sum;
   sd2_over->END=ED;
  return outbuf; 
}


void init_dymicram()
{
  
   init_mempool((void xdata *)0x300, 100);
   // Start the memory pool for incoming and outgoing Ethernet
	// frames at0x3000, with length = 1500 bytes. Memory below 500
	// is used for program variables
  
}

⌨️ 快捷键说明

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