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

📄 di_do_func.c

📁 基于c的电动机保护程序
💻 C
字号:
#include "hardware_reg.h"
#include "mototype.h"
#include "def.h"

extern int Alarm_flag;
extern int Break_flag;

int Start_Enable_Signal = 0;   //允许启动信号
int Start_Signal = 0;     //启动信号
int Break_Signal = 0;      //跳闸信号
int Reset_Signal = 0;      //复位信号
void DI_DO_Func(void)
{
	int i = 0;
	int j = 0;
	int DI_Temp = 0;
	int ii;
	unsigned long datatemp;
	/***************************判断开入量状态*******************************************/

	static int DI_Enable_Sample[4] ;   //有高电平置一	

	static int DI_Disable_Sample[4] ;  //有低电平置一
	
	
	
	datatemp = *(volatile unsigned long *)PORTF_DATA;
	
	for( i= 0; i <4; i++ )
	{
		if( (datatemp >>i)& 0x1)
		{
			 DI_Disable_Sample[i]++;
		
		}
		else
		{	
			DI_Enable_Sample[i] ++;
			DI_Disable_Sample[i] = 0; 
			
		}  
	
	
		if( DI_Disable_Sample[i] > 10)
		{
			JDInputs->DI[i] = 0;
			DI_Enable_Sample[i] = 0;
			DI_Disable_Sample[i] = 0;
		}
		
		ii = DI_Enable_Sample[i];
		if( DI_Enable_Sample[i] > 10)
		{
			JDInputs->DI[i] = 1;
			DI_Enable_Sample[i] = 1;
		}

	} //end  for( i= 0; i <4; i++ )
	
	

/*------------------end 判断开入量状态--------------------------------------*/
//JDInputs->DI[0] = 1;
	
/***************************判断开入量设定值*******************************************/
	
	for( i= 0; i<4; i++)
	{	
		
		switch (*((int *)&SystemSetting.D1 + i))
		{
			case 0:  //锁闭
				break;
				
			case 1:  //允许启动
				if( JDInputs->DI[i] == 1 ) 
					
					Start_Enable_Signal = 1;
				
				else 
					Start_Enable_Signal = -1;
				
				break;
				
				
			case 2:  //启动
				
					if( JDInputs->DI[i] == 1 ) 
					{
						Start_Signal = 1;
						Break_Signal = 0;
					}
						
					
				
				
				break;
				
				
			case 3:  // 跳闸
				
				if( JDInputs->DI[i] == 1 ) 
				{
					Break_Signal = 1;
					Start_Signal = 0;
				}
				break;
				
				
			case 4:  //复位
				if( JDInputs->DI[i] == 1 ) 
				{	
					Reset_Signal = 1;
				}
				
				break;
				
				
			case 5:  //控制转换
				break;
				
				
			case 6:  //直接控制开出量DO1
				if( SystemSetting.D5 == 6) //开入量直接控制功能 
				{
					if( JDInputs->DI[i] == 1 ) 
					{
						*(volatile unsigned long *)PORTG_DATA &= ~0x10; 
					}
					else
					{
						*(volatile unsigned long *)PORTG_DATA |= 0x10; 
					}
				}
				
				break;
				
				
			case 7: //:直接控制开出量DO2
				if( SystemSetting.D6 == 6) //开入量直接控制功能 
				{
					if( JDInputs->DI[i] == 1 ) 
					{
						*(volatile unsigned long *)PORTG_DATA |= 0x4; 
					}
					else
					{
						*(volatile unsigned long *)PORTG_DATA &= ~0x4; 
					}
				}
				break;
				
				
			case 8: //:直接控制开出量DO3
				if( SystemSetting.D7 == 6) //开入量直接控制功能 
				{
					if( JDInputs->DI[i] == 1 ) 
					{
						*(volatile unsigned long *)PORTG_DATA &= ~0x2; 
					}
					else
					{
						*(volatile unsigned long *)PORTG_DATA |= 0x2; 
					}
				}
				break;
				
				
			case 9: //:直接控制开出量DO4
				if( SystemSetting.D8 == 6) //开入量直接控制功能 
				{
					if( JDInputs->DI[i] == 1 ) 
					{
						*(volatile unsigned long *)PORTG_DATA &= ~0x1 ; 
					}
					else
					{
						*(volatile unsigned long *)PORTG_DATA |= 0x1; 
					}
				}
				break;
				
				
			
		
			default:
				break;			
		
		
		
		}  //end switch ( (*(int *)&SystemSetting.D1) + i )
		
	
	
	
	} //end  for( i= 0; i <4; i++ )



/*-------------------------判断开入量设定值--------------------------------------*/



/***************************判断开出量设定值*******************************************/
	for( i= 0; i<4; i++)
	{  
		ii = *((int *)&SystemSetting.D5 + i);
		switch (*((int *)&SystemSetting.D5 + i))
		{
			case 0: //闭锁 
				break;
				
			case 1://故障报警输出
				if( Alarm_flag )
				{	
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA &= ~0x10;
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA |= 0x4;
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA &= ~0x2;
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA &= ~0x1;
							break;
							
						default:
							break;
							
					} // end switch
				
				
				}
				
				else
				{
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA |= 0x10;
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA &= ~0x4;
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA |= 0x2;
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA |= 0x1;
							break;
							
						default:
							break;
							
					} // end switch
				}	
				break;
			
			case 2://故障跳闸输出
				if( Break_flag || Break_Signal )
				{
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA &= ~0x10;
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA |= 0x4;
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA &= ~0x2;
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA &= ~0x1;
							break;
							
						
						default:
							break;
							
					} // end switch
			
				}
				
				else
				{
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA |= 0x10;
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA &= ~0x4;
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA |= 0x2;
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA |= 0x1;
							break;
							
						default:
							break;
							
					} // end switch
				
				}	
				
				break;
				
			case 3://启动/停止控制 
				if( Start_Signal ) 
				{
					Start_Signal = 0;
					SystemSetting.StartSingal = 0;
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA &= ~0x10;
							*(RP)(PWM2_C) = 0 ;
							for(j=i;j<3; j++)
							{
								if( *((int *)&SystemSetting.D5 + j+1) == 3)
								{
									Start_Signal = 1;
									SystemSetting.StartSingal = 1;
								}
							
							}
							
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA |= 0x4;
							*(RP)(PWM2_C) = 0 ;
							SystemSetting.StartSingal = 0;
							for(j=i;j<3; j++)
							{
								if( *((int *)&SystemSetting.D5 + j+1) == 3)
								{
									Start_Signal = 1;
									SystemSetting.StartSingal = 1;
								}
							
							}
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA &= ~0x2;
							*(RP)(PWM2_C) = 0 ;
							SystemSetting.StartSingal = 0;
							for(j=i;j<3; j++)
							{
								if( *((int *)&SystemSetting.D5 + j+1) == 3)
								{
									Start_Signal = 1;
									SystemSetting.StartSingal = 1;
								}
							
							}
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA &= ~0x1;
							*(RP)(PWM2_C) = 0 ;
							SystemSetting.StartSingal = 0;
							break;
							
						default:
							break;
							
					} // end switch
				} //end if( Start_Signal ) 
				
				if( Break_Signal  ||  Break_flag  )
				{
					Break_Signal = 0;
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA |=0x10;
							for(j=i;j<3; j++)
							{
								if( *((int *)&SystemSetting.D5 + j+1) == 3)
								{
									Break_Signal = 1;
								}
							
							}
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA &= ~0x4;
							for(j=i;j<3; j++)
							{
								if( *((int *)&SystemSetting.D5 + j+1) == 3)
								{
									Break_Signal = 1;
								}
							
							}
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA |= 0x2;
							for(j=i;j<3; j++)
							{
								if( *((int *)&SystemSetting.D5 + j+1) == 3)
								{
									Break_Signal = 1;
								}
							
							}
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA |= 0x1;
							
							break;
							
						default:
							break;
							
					} // end switch
				} //end if( Break_Signal )
				
				break;
				
			case 4://正在运行信号输出 
				if( Running )
				{
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA &= ~0x10;
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA |= 0x4;
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA &= ~0x2;
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA &= ~0x1;
							break;
							
						
						default:
							break;
					}
				}
				else
				{
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA |=0x10;
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA &= ~0x4;
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA |= 0x2;
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA |= 0x1;
							break;
							
						default:
							break;
							
					} // end switch
				}
				
				break;
				
			case 5://允许启动信号输出  此信号只对应热容量
				if( Restart_Permit )
				{
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA &= ~0x10;
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA |= 0x4;
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA &= ~0x2;
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA &= ~0x1;
							break;
							
						
						default:
							break;
					}
				}
				else
				{
					switch( i )
					{
						case 0:
							*(volatile unsigned long *)PORTG_DATA |=0x10;
							break;
						
						case 1:
							*(volatile unsigned long *)PORTG_DATA &= ~0x4;
							break;
							
						case 2:
							*(volatile unsigned long *)PORTG_DATA |= 0x2;
							break;
							
						case 3:
							*(volatile unsigned long *)PORTG_DATA |= 0x1;
							break;
							
						default:
							break;
							
					} // end switch
				}
				break;
				
			case 6://开入量控制
				
				//上面开入量判断里已经完成控制
				break;
				
			case 7://直接输出
				break;
				
			default:
				break;
	
		}
	
	
	} //end  for( i= 0; i <4; i++ )




/*-------------------------判断开出量设定值--------------------------------------*/



}// end DI_DO_Func(void)

⌨️ 快捷键说明

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