Conveyor.c 6.81 KB
#include "hardware.h"
#include "all_value.h"



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

u8 F_ConveyDir;//13-车体前后方向;24-车体前后方向;1-车体x+;2-车体y+;3-车体x-;4-车体y-;5-车体4方向,
u8 F_OverrideConvey_A;//Auto输送最大速度


u8 TIM4_WaitConUpNums;
u8 TIM4_WaitConDownNums;

#define WaitConeyorTime 100   //1s
void Conveyor_Pro(void)//
{
	#if ConveyorEn==1  //
		float Ang_ConveyorMap;
		float Ang_Agv;		
		switch(AGV.Conveyor_Step)
		{	
			
			case 1://	
							AGV.AxisEn_Step=1;
							if(AGV.Type3_Ac<12) AGV.Axis_No=0x20;//仅上层输送;	
							else if(AGV.Type3_Ac<14)AGV.Axis_No=0x01;//仅下层输送;
							else AGV.Axis_No=0x21;//上、下层输送;
							AGV.Conveyor_Step++;	
						break;
			case 2://舵轮组都已使能
						if (AGV.AxisEn_Step==100) AGV.Conveyor_Step++;					
						break;
			case 3://	外总条件判断
						if( (AGV.Conveyor_Dir>0&&AGV.Conveyor_Dir<5)&&
								(AGV.Type3_Ac>9&&AGV.Type3_Ac<18)&&
								((F_ConveyDir==13)|(F_ConveyDir==24)|(F_ConveyDir==5))
							 )
							AGV.Conveyor_Step++;
						break;		
			case 4://	判断方向是否可以对接
						Ang_Agv=500;
						if ( VaIndexB_R(&SlamMess_Fresh,4) && (Status_SlamLaser==2) )Ang_Agv=Ang_SlamAgv;
						else if(CCD_M[0].CodeOn)Ang_Agv=CCD_M[0].Ang;
			
						if(Ang_Agv<500)	
						{
							if(F_ConveyDir==13)Ang_ConveyorMap=Ang_Agv+90;//输送负速度方向在地图角度
							else if(F_ConveyDir==24)Ang_ConveyorMap=Ang_Agv;

							
							AngDeal(&Ang_ConveyorMap);
							F_Un.DeltaAng_Conveyor=AngDelta_Calculate(Ang_ConveyorMap,(AGV.Conveyor_Dir-1)*90.0f);
							if(fabs(F_Un.DeltaAng_Conveyor)<25 | fabs(F_Un.DeltaAng_Conveyor)>160 )AGV.Conveyor_Step++;
							else {Set_ErrID(53,1);}//53输送任务对接方位与车姿态不符,报警						
						}
						break;	
			case 5://	确定输送执行动作类型
						Unionu8_1.ConyUpTy=0;
						Unionu8_2.ConyDownTy=0;		
						if(fabs(F_Un.DeltaAng_Conveyor)<25)//输送负速度方向与对接工位同向
						{ //ConyUpTy:1-负速度卸料;2-负速度接料;3-正速度卸料;4-正速度接料;
							if(AGV.Type3_Ac==10)Unionu8_1.ConyUpTy=4;//10->单层动作:AGV上层接料;
							else if(AGV.Type3_Ac==11)Unionu8_1.ConyUpTy=1;//11->单层动作:AGV上层卸料;
							else if(AGV.Type3_Ac==12)Unionu8_2.ConyDownTy=4;//12->单层动作:AGV下层接料;
							else if(AGV.Type3_Ac==13)Unionu8_2.ConyDownTy=1;//13->单层动作:AGV下层卸料;
							else if(AGV.Type3_Ac==14){ Unionu8_1.ConyUpTy=4;Unionu8_2.ConyDownTy=4;}//14->双层联动:AGV上层接料+AGV下层接料;
							else if(AGV.Type3_Ac==15){ Unionu8_1.ConyUpTy=4;Unionu8_2.ConyDownTy=1;}//15->双层联动:AGV上层接料+AGV下层卸料;
							else if(AGV.Type3_Ac==16){ Unionu8_1.ConyUpTy=1;Unionu8_2.ConyDownTy=4;}//16->双层联动:AGV上层卸料+AGV下层接料;
							else if(AGV.Type3_Ac==17){ Unionu8_1.ConyUpTy=1;Unionu8_2.ConyDownTy=1;}//17->双层联动:AGV上层卸料+AGV下层卸料;						
						}
						else//输送负速度方向与对接工位反方向,即输送正速度方向与对接同向
						{ //ConyUpTy:1-负速度卸料;2-负速度接料;3-正速度卸料;4-正速度接料;
							if(AGV.Type3_Ac==10)Unionu8_1.ConyUpTy=2;//10->单层动作:AGV上层接料;
							else if(AGV.Type3_Ac==11)Unionu8_1.ConyUpTy=3;//11->单层动作:AGV上层卸料;
							else if(AGV.Type3_Ac==12)Unionu8_2.ConyDownTy=2;//12->单层动作:AGV下层接料;
							else if(AGV.Type3_Ac==13)Unionu8_2.ConyDownTy=3;//13->单层动作:AGV下层卸料;
							else if(AGV.Type3_Ac==14){ Unionu8_1.ConyUpTy=2;Unionu8_2.ConyDownTy=2;}//14->双层联动:AGV上层接料+AGV下层接料;
							else if(AGV.Type3_Ac==15){ Unionu8_1.ConyUpTy=2;Unionu8_2.ConyDownTy=3;}//15->双层联动:AGV上层接料+AGV下层卸料;
							else if(AGV.Type3_Ac==16){ Unionu8_1.ConyUpTy=3;Unionu8_2.ConyDownTy=2;}//16->双层联动:AGV上层卸料+AGV下层接料;
							else if(AGV.Type3_Ac==17){ Unionu8_1.ConyUpTy=3;Unionu8_2.ConyDownTy=3;}//17->双层联动:AGV上层卸料+AGV下层卸料;							
						}				
						AGV.Conveyor_Step++;
						break;	
			case 6://
						AGV.Conveyor_Step=8;
						break;	
			case 8://	判断谁要执行
						if(Unionu8_1.ConyUpTy)VaIndexW_W(&Motor[5].MToPc.Ax_Status,6,0);else VaIndexW_W(&Motor[5].MToPc.Ax_Status,6,1);
						if(Unionu8_2.ConyDownTy)VaIndexW_W(&Motor[0].MToPc.Ax_Status,6,0);else VaIndexW_W(&Motor[0].MToPc.Ax_Status,6,1);				
						AGV.Conveyor_Step=9;
						break;
			case 9://	输送动作执行
				
						if(VaIndexW_R(&Motor[5].MToPc.Ax_Status,6)==0)//上层输送执行
						{
							if( Conveyor_Fc(5,Unionu8_1.ConyUpTy,IN_LimitL,IN_Cargo1,IN_LimitR))
							{ if(TIM4_WaitConUpNums>WaitConeyorTime)
								VaIndexW_W(&Motor[5].MToPc.Ax_Status,6,1); 
							}
							else TIM4_WaitConUpNums=0;
						}

						
						if(VaIndexW_R(&Motor[0].MToPc.Ax_Status,6)==0)//下层输送执行
						{
							if( Conveyor_Fc(0,Unionu8_2.ConyDownTy,IN_LimitL2,IN_Cargo2,IN_LimitR2))
							{ if(TIM4_WaitConDownNums>WaitConeyorTime)
								VaIndexW_W(&Motor[0].MToPc.Ax_Status,6,1); 
							}
							else TIM4_WaitConUpNums=0;
						}
						
						if( VaIndexW_R(&Motor[5].MToPc.Ax_Status,6)&&VaIndexW_R(&Motor[0].MToPc.Ax_Status,6))AGV.Conveyor_Step=10;
						break;	
			case 10://
						AGV.Conveyor_Step=90;
						break;	
			case 90://
						AGV.Conveyor_Step=100;
						break;		
			case 100://
						;
						break;		
		
		}
	#endif
	
}

u8 Conveyor_Fc(u8 No,u8 Con_Type,u8 NSp_Sen,u8 M_Sen,u8 PSp_Sen)
{
	u8 OK=0;
	float OverrideConveyor;	
	Motor[No].PcToM.Acc=1200;
	Motor[No].PcToM.Dcc=1000;
	switch(Con_Type)//1-负速度卸料;2-负速度接料;3-正速度卸料;4-正速度接料;
	{	
		case 1://	负速度卸料
						if(NSp_Sen|M_Sen|PSp_Sen)
						{ OverrideConveyor=-(float)F_OverrideConvey_A;
							OK=0;
						}
						else 
						{ OverrideConveyor=0;
							OK=1;
						}
					break;
		case 2://	负速度接料(物料从PSp_Sen向NSp_Sen运动)
						if((NSp_Sen==0)&&M_Sen&&(PSp_Sen==0))
						{ OverrideConveyor=0;
							OK=1;
//							VaIndexB_W(&ConveyorDone,No,1);
						}
						else
						{ OK=0;
							if(NSp_Sen&&M_Sen&&PSp_Sen)OverrideConveyor=0;
							else if(NSp_Sen)OverrideConveyor=(float)F_OverrideConvey_A*0.2f;	
							else OverrideConveyor=-(float)F_OverrideConvey_A;
						}
					break;
		case 3://	正速度卸料
						if(NSp_Sen|M_Sen|PSp_Sen)
						{ OverrideConveyor=(float)F_OverrideConvey_A;
							OK=0;
						}
						else 
						{ OverrideConveyor=0;
							OK=1;
						}			
					break;
		case 4://	正速度接料
						if((NSp_Sen==0)&&M_Sen&&(PSp_Sen==0))
						{ OverrideConveyor=0;
							OK=1;
//							VaIndexB_W(&ConveyorDone,No,1);
						}
						else
						{ OK=0;
							if(NSp_Sen&&M_Sen&&PSp_Sen)OverrideConveyor=0;
							else if(PSp_Sen)OverrideConveyor=-(float)F_OverrideConvey_A*0.2f;	
							else OverrideConveyor=(float)F_OverrideConvey_A;
						}
					break;		
	}
	
	if(No==0)//下层
	Fc_Matrix_Agv(0,0,0,0,OverrideConveyor*0.01f*Motor[0].Max_Speed,0);
	else 	if(No==5)//上层
	Fc_Matrix_Agv(0,0,0,0,0,OverrideConveyor*0.01f*Motor[5].Max_Speed);
	return OK;
}