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

📄 commint1.h

📁 西门子PPI协议源码
💻 H
字号:
//和MODBUS相关的中断程序
// 1/2个串口对应的中断程序,和MODBUS相关的定时器中断
// ABOUTCOMM程序,和硬件相关,和有无LED相关
/**********************************************************************************************/
//因为资源非常有限,不可能同时存在多个协议
void about_comm_pro(void)
{
	uchar i;
	uchar uc_last_comm_cmd;
	
	if((uc_send_status[0]& BIT(is_sending)) || (uc_send_status[1]& BIT(is_sending)))
	{PORT_LED&=~BIT(LED_COMM);}//LED_COMM 亮
	else
	{PORT_LED|=BIT(LED_COMM);} //LED_COMM 灭
	
	if(!(uc_send_status[0] & BIT(is_sending))){uart_send_disable0;}
	if(!(uc_send_status[1] & BIT(is_sending))){uart_send_disable1;}
	
#ifdef PROGRAME_FOR_MODBUS
	if(is_modbus_asc)
	{
		if(now_buf0 == MB_END_ASCII)
		{   
			now_buf0                 = 0;
			uc_is_have_new_modbus[0] = 1;
			point_uchar[0]          -= 2;
		}
		
		if(now_buf1 == MB_END_ASCII)
		{   
			now_buf1                 = 0;
			uc_is_have_new_modbus[1] = 1;
			point_uchar[1]          -= 2;
		}
	}	
#else
#ifdef PROGRAME_FOR_ADAM
	if(is_modbus_asc)
	{
		if(now_buf0 == MB_END_ASCII)
		{   
			now_buf0                 = 0;
			uc_is_have_new_modbus[0] = 1;
			point_uchar[0]          --;
		}
		
		if(now_buf1 == MB_END_ASCII)
		{   
			now_buf1                 = 0;
			uc_is_have_new_modbus[1] = 1;//标志的名称沿用MODBUS的
			point_uchar[1]          --;//指向的是13
		}
	}	
#endif
#endif
	
	
	for(i=0;i<2;i++)
	{   
		if(uc_is_have_new_modbus[i]) //receive new string.
		{
			uc_is_have_new_modbus[i]=0;
#ifdef PROGRAME_FOR_MODBUS			
			if(is_modbus_master) //modbus为主
			{
				
				//作为主的时候接收的分析程序,可能不与理睬
				uc_last_comm_cmd = stMod_Master_OP[uc_Mod_Master_OP_Point].uc_cmd;
				if(( uc_last_comm_cmd== 3) || (uc_last_comm_cmd  == 1)||(uc_last_comm_cmd == 0x17))
				{
					//需要分析,来的数,是上次呼叫的命令
					//可用uc_Mod_Master_OP_Point指向的结构数组的信息
					uc_last_comm_cmd = is_modbus_asc > 0?MAKE_HEX_TO_DEC(uc_rec_buf[i][0],uc_rec_buf[i][1]):uc_rec_buf[i][0];
					if(uc_last_comm_cmd == uc_mod_plc_add)
					{   
						rtu_reqframe_anlys_master(uc_rec_buf[i],point_uchar[i],uc_Mod_Master_OP_Point);
					}
				}			
			}
			else                //modbus为从
#endif			
#ifdef PROGRAME_FOR_PPI			
			if(is_modbus_master) //PPI为主
			{			
				//作为主的时候接收的分析程序,可能是准备好应答,需要发确认命令
				uc_sendarray_num[i] = ppi_reqframe_anlys_master(i,uc_rec_buf[i],uc_send[i],point_uchar[i],uc_PPI_Master_OP_Point+i,
									  			uc_client[i],uc_mod_plc_add,g_uc_ppi_main_send_count+i);
				
				if(uc_sendarray_num[i] != 0xfe)
				{
				 uc_send_status[i] |= BIT(is_need_send);
				}
			}
			else                //PPI为从
#endif			
			{   
#ifdef PROGRAME_FOR_MODBUS
				uc_last_comm_cmd = is_modbus_asc > 0?MAKE_HEX_TO_DEC(uc_rec_buf[i][0],uc_rec_buf[i][1]):uc_rec_buf[i][0];
				if(uc_last_comm_cmd==uc_client[i])//地址是否相同
				{
					uc_sendarray_num[i]=rtu_reqframe_anlys_slaver(uc_rec_buf[i],point_uchar[i],uc_send[i]);
					//                                                             接收的长度,而非下标
					if((uc_sendarray_num[i])!=0)
					{
						uc_send_status[i] |= BIT(is_need_send);
					}
				}
#else
#ifdef PROGRAME_FOR_PPI
				uc_sendarray_num[i]=ppi_reqframe_anlys_slaver(i,uc_rec_buf[i],point_uchar[i],uc_send[i],uc_client[i]);
				//此函数  
				if((uc_sendarray_num[i])< 0xfe)//返回的是下标,有时却只发一个字节,可能为零,所以修改和MODBUS不同
				{
					uc_send_status[i] |= BIT(is_need_send);
				}
#else
#ifdef PROGRAME_FOR_ADAM
				if(uc_get_data(uc_rec_buf[i][0],uc_rec_buf[i][1]) == uc_client[i])
                {
				 uc_sendarray_num[i]=adam_reqframe_anlys_slaver(uc_rec_buf[i],point_uchar[i],uc_send[i],uc_head[i]);
				 //此函数  
				 if((uc_sendarray_num[i])!= 0)//返回的是下标
				 {
					uc_send_status[i] |= BIT(is_need_send);
				 }
				}
#endif
#endif 			
#endif
			}//is_modbus_master
			point_uchar[i]=0;//为下次接收做准备
		}//(uc_is_have_new_modbus)
		
	}//end for
	
#ifdef PROGRAME_FOR_MODBUS
	if(is_mod_master_need_send)//is_mod_master_need_send=1,则必是MASTER,这是当计时器到时的发送.
	{
		is_mod_master_need_send = 0;
		if(++uc_Mod_Master_OP_Point >= OP_TABLE_LENTH){uc_Mod_Master_OP_Point = 0;}
		
		for(i=0;i<2;i++)
		{
			if(!(uc_send_status[i] & BIT(is_sending)))
			{
				uc_sendarray_num[i]  = rtu_modbus_master_send(uc_Mod_Master_OP_Point,uc_mod_plc_add,uc_send[i]);
				uc_send_status[i] |= BIT(is_need_send);
			}
		}
	}
#endif

#ifdef PROGRAME_FOR_PPI
  if(is_modbus_master)
  {
	for(i=0; i < MCU_UART_NUM; i++)
	{
	 if(is_ppi_master_need_send[i])
	 {
			is_ppi_master_need_send[i] = 0;
			if(!(uc_send_status[i] & BIT(is_sending)))
			{
				uc_sendarray_num[i] = ppi_master_send(i,uc_PPI_Master_OP_Point+i,uc_mod_plc_add,uc_send[i],uc_client[i],g_uc_ppi_main_send_count+i);
				
				//发送的顺序:发请求,收到E5后,发命令,然后收到结果后分析结果
				
				if(uc_sendarray_num[i] < 0xfe)//有可能不发了,休息一下
				{uc_send_status[i] |= BIT(is_need_send);}
			}
	 }
	}
  }	   
#endif
	
	if(uc_send_status[0] & BIT(is_need_send))
	{
		uart_send_enable0;
		uc_send_status[0] &=~ BIT(is_need_send);
		if(!(uc_send_status[0] & BIT(is_need_send)))
		{uc_send_status[0] &=~ BIT(is_need_send);}//纯粹耽误些时间
		
		uc_send_status[0]|=BIT(is_sending);
		UDR0=uc_send[0][0];
		uc_send_point[0]=1;
	}
	
	if(uc_send_status[1] & BIT(is_need_send))
	{
		uart_send_enable1;
		uc_send_status[1] &=~ BIT(is_need_send);
		if(!(uc_send_status[1] & BIT(is_need_send)))
		{uc_send_status[1] &=~ BIT(is_need_send);}//纯粹耽误些时间
		
		uc_send_status[1]|=BIT(is_sending);
		UDR1=uc_send[1][0];
		uc_send_point[1]=1;
	}
}
/**********************/ 
/**********************/ 

/******************************************************************/ 
/******************************************************************/
/******************************************************************/ 

#pragma interrupt_handler uart1_rx_isr:iv_USART1_RX
void uart1_rx_isr(void)
{
	//uart has received a character in UDR
	uc_rec_buf[1][point_uchar[1]] = now_buf1 = UDR1;
	if(point_uchar[1]<comm_array_max_xb){point_uchar[1]++;}
	#ifdef PROGRAME_FOR_MODBUS
	if(is_modbus_asc)
	{
		if(now_buf1 == MB_HEAD_ASCII) //modbus asc 头
		{
			point_uchar[1] = 0;//指向的是下一个,队列中没包含头,头对MODBUS来说是":"
		}   
	}
	else
	{
		uc_modbus_timeout1=uc_modbus_timeout_4bytes1;
	}
	#else
	  #ifdef PROGRAME_FOR_PPI
	    uc_modbus_timeout1=uc_modbus_timeout_4bytes1;//PPImoshi
		g_uc_ppi_main_send_count[1] = -1;//这样,就不可能进入主发程序,而只能进入接收程序了 
	  #else
	    #ifdef PROGRAME_FOR_ADAM
		if((now_buf1=='#') || (now_buf1=='$') || (now_buf1=='@'))//ADAM asc 头
		{
			point_uchar[1] = 0;//指向的是下一个,队列中没包含头
			uc_head[1] = now_buf1;
		}  
		#endif
	  #endif
	#endif
	
}

#pragma interrupt_handler uart1_tx_isr:iv_USART1_TX
void uart1_tx_isr(void)
{
	//uc_send_status[1]|=BIT(is_sending);在发送启动的时候做
	
	if (uc_send_point[1]<=uc_sendarray_num[1])
	{
		UDR1=uc_send[1][uc_send_point[1]];
		uc_send_point[1]++;
	}
	else
	{
		uc_send_over_timer[1]=timer_count_char;
		uc_send_status[1]&=~BIT(is_sending);
		//uart_send_disable1; //在ABOUTCOM函数中做
	}
	
	//character has been transmitted,最后=uc_sendarray_num+1
}
/**********************/ 
/**********************/ 
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RX
void uart0_rx_isr(void)
{
	//uart has received a character in UDR
	uc_rec_buf[0][point_uchar[0]] = now_buf0 = UDR0;
	if(point_uchar[0]<comm_array_max_xb){point_uchar[0]++;}
	#ifdef PROGRAME_FOR_MODBUS
	if(is_modbus_asc)
	{
		if(now_buf0 == MB_HEAD_ASCII) //modbus asc 头
		{
			point_uchar[0] = 0;
		} 
	}
	else
	{
		uc_modbus_timeout0=uc_modbus_timeout_4bytes0;//uc_modbus_timeout_4bytes[bt[0]];
	}
	#else
	  #ifdef PROGRAME_FOR_PPI
	    uc_modbus_timeout0=uc_modbus_timeout_4bytes0;//PPI是固定的8,E,1
		g_uc_ppi_main_send_count[0] = -1;//这样,就不可能进入主发程序,而只能进入接收程序了
	  #else
	    #ifdef PROGRAME_FOR_ADAM   
		if((now_buf0=='#') || (now_buf0=='$') || (now_buf0=='@'))//ADAM asc 头,ADAM是固定的8,N,1
		{
			point_uchar[0] = 0;//指向的是下一个,队列中没包含头
			uc_head[0] = now_buf0;
		}  
		#endif
	  #endif
	#endif
}

#pragma interrupt_handler uart0_tx_isr:iv_USART0_TX
void uart0_tx_isr(void)
{
	//character has been transmitted
	/*when first coming this fun,uc_send_point=0*/
	//uc_send_status[0]|=BIT(is_sending);在发送启动的时候做
	
	if (uc_send_point[0]<=uc_sendarray_num[0])
	{
		UDR0=uc_send[0][uc_send_point[0]];
		uc_send_point[0]++;
	}
	else
	{
		uc_send_over_timer[0]=timer_count_char;
		uc_send_status[0]&=~BIT(is_sending);
		//uart_send_disable0;在about_comm函数中做
	}
	//大于uc_sendarray_num后,所以不会无限制地加
	
	//character has been transmitted,最后=uc_sendarray_num+1
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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