UpDown.c 4.58 KB
#include "hardware.h"
#include "all_value.h"



/*********************************************************************************
函数名:
功能:
参数:
返回:无返回。
实现方法:
编程:pcy
日期:2021-12-16
*********************************************************************************/




# define Dis1_Hight 40.0f
# define Dis2_Hight 500.0f
# define Override1_UD 12.0f //Dis1速度
# define Override2_UD 80.0f //上升速度

u8 F_OverrideUP;//上升速度 百分比
u8 F_OverrideDown;//下降速度 百分比

u8 ToSetHeight_Fc(float *Height)//升降到达目标高度的控制函数
{
	float AutoOverride_UD;
	float HighDelta;
	HighDelta=fabs(High_Dis-(*Height));

	 	if ( VaIndexW_R(&NodeOnLine,12) | ( ((*Height)<Highmin)|((*Height)>HighMax) )  )
		{ Fc_Matrix_Agv(0,0,0,0,0,0);}
		
		if (HighDelta<1.0f) //到达设定高度
		{ Fc_Matrix_Agv(0,0,0,0,0,0);
			Out_DownValve=0;
			if (Motor[0].MToPc.Tim4_AxisDelayNum>15)return 1;//0.2s
			else return 0;
		}
		else//根据升降距离差确定速度
		{ Motor[0].MToPc.Tim4_AxisDelayNum=0;	
			if(VaIndexDW_R(&F_AgvContr,1))//液压	
			{
				 if (HighDelta<Dis1_Hight)AutoOverride_UD=F_OverrideUP/3;
				else AutoOverride_UD=F_OverrideUP;
			}				
			else
			{ if (HighDelta<4)AutoOverride_UD=4;
				else if (HighDelta<Dis1_Hight)AutoOverride_UD=Override1_UD;
				else if (HighDelta<Dis2_Hight)AutoOverride_UD=(HighDelta-Dis1_Hight)*((float)F_OverrideUP-Override1_UD)/(Dis2_Hight-Dis1_Hight)+Override1_UD;
				else AutoOverride_UD=(float)F_OverrideUP;
			}
			if (High_Dis<(*Height)) //低于目标高度-上升			
			{	Out_DownValve=0;
				if (IN_UpLimit){AutoOverride_UD=0;}
			}
			else //高于目标高度-下降
			{	
				if(VaIndexDW_R(&F_AgvContr,1))//液压
				{	if (IN_DownLimit){Out_DownValve=0;}
					else Out_DownValve=1;
					AutoOverride_UD=0;
				}
				else	
				{ if (IN_DownLimit){AutoOverride_UD=0;}
				  else AutoOverride_UD=AutoOverride_UD*(-1);
			  }
			}				
		
			Fc_Matrix_Agv(0,0,0,0,AutoOverride_UD*0.01f*Motor[0].Max_Speed,0);
			return 0;
		}

		
}

void UpDown_Pro(void)//获取工作模式
{
//	Up_Pro();
//	Down_Pro();

	switch(AGV.UpDown_Step)
	{	
		case 1:	//先判断轴无故障
						AGV.AxisEn_Step=1;
						AGV.Axis_No=0x01;
						AGV.UpDown_Step++;
						break;					
		case 2://给出使能指令
						if (AGV.AxisEn_Step==100)AGV.UpDown_Step=5;
						Motor[0].PcToM.Acc=1500;
						Motor[0].PcToM.Dcc=1500;	//避免停止时过大晃动
						break;		
		case 5:	//判断升降类型
						if(AGV.Type3_Ac==2)AGV.UpDown_Step=40;//到最高机械位
						else if(AGV.Type3_Ac==3)AGV.UpDown_Step=50;//到最低机械位
						else if(AGV.Type3_Ac==4)AGV.UpDown_Step=10;	//到指定的设定位置	
						else if(AGV.Type3_Ac==5)AGV.UpDown_Step=20;	//信号交互确定升降高低位置
						break;		
	
		case 10:	//到指定的设定位置
						if (F_Un.Dis_Height_T>=Highmin && F_Un.Dis_Height_T<=HighMax)AGV.UpDown_Step=30;	
						break;
		case 20:	//信号交互确定升降高低位置
						AGV.UpDown_Step++;
						VaIndexB_W(&AGV.OtheSta2,1,0);		
						break;
		case 21:	//获取到最新的料台高度信息
						if(VaIndexB_R(&AGV.OtheSta2,1))
						AGV.UpDown_Step++;	
						break;	
		case 22:	//计算高度	
						break;	

		case 30://升降到指定高度动作
						if (ToSetHeight_Fc(&F_Un.Dis_Height_T))AGV.UpDown_Step=80;
						break;

		case 40://到最高机械位
						AGV.UpDown_Step++;	
						break;	
		case 41:
					if (IN_UpLimit)
					{ 
						Fc_Matrix_Agv(0,0,0,0,0,0);
						if (Motor[0].MToPc.Tim4_AxisDelayNum>2)AGV.UpDown_Step=80;;
					}
					else
					{	Motor[0].MToPc.Tim4_AxisDelayNum=0;
						Fc_Matrix_Agv(0,0,0,0,(float)F_OverrideUP*0.01f*Motor[0].Max_Speed,0);
						Motor[0].PcToM.Acc=2000;
						Motor[0].PcToM.Dcc=1500;	//避免停止时过大晃动
					}
					break;

		case 50://到最低机械位
						AGV.UpDown_Step++;	
						break;		
		case 51:
 						if(VaIndexDW_R(&F_AgvContr,1))//液压
						{ if (IN_DownLimit){Out_DownValve=0;AGV.UpDown_Step=80;}
							else Out_DownValve=1;		
							Fc_Matrix_Agv(0,0,0,0,0,0);}
						else	
						{ if (IN_DownLimit)
							{ 
								Fc_Matrix_Agv(0,0,0,0,0,0);
								if (Motor[0].MToPc.Tim4_AxisDelayNum>2)AGV.UpDown_Step=80;;
							}
							else
							{	Motor[0].MToPc.Tim4_AxisDelayNum=0;
								Fc_Matrix_Agv(0,0,0,0,-(float)F_OverrideDown*0.01f*Motor[0].Max_Speed,0);
								Motor[0].PcToM.Acc=2000;
								Motor[0].PcToM.Dcc=1500;
							}
						}
						break;	
		case 80://
						Motor[0].MToPc.Tim4_AxisDelayNum=0;
					  AGV.UpDown_Step++;
					  break;		
		case 81://
						if(Motor[0].MToPc.Tim4_AxisDelayNum>10)
						{ if(VaIndexDW_R(&F_AgvContr,16)|VaIndexDW_R(&F_AgvContr,1))Motor[0].PcToM.PowerOn=0;
							AGV.UpDown_Step=90;
						}
					  break;							
		case 90://					 
					  AGV.UpDown_Step=100;
					  break;
		case 100://完成动作
					  break;

	}
	

	
	
	
	
}