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

📄 fms_simulationview.cpp

📁 一个自己编写的柔性制造的仿真软件,完全是自己编写的软件源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		int numm;
		if(abs(rect_agv.left-rect_agv_aim.left)>=AGV_SPEED)		//小车没到指定位置
		{
			step_agv=abs(rect_agv.left-rect_agv_aim.left)/(rect_agv_aim.left-rect_agv.left);
			rect_agv.left=rect_agv.left+step_agv*AGV_SPEED;
			rect_agv.right=rect_agv.left+30;
			if(rect_workpiece.top==(rect_agv.top+25))
			{
				rect_workpiece.left=rect_agv.left+5;
				rect_workpiece.right=rect_workpiece.left+20;
			}
			Invalidate();
		}
		else
		{
			if(abs(rect_workpiece.top-rect_workpiece_aim.top)>=AGV_SPEED)		//到指定位置,还没装完工件
			{
				step_workpiece=abs(rect_workpiece.top-rect_workpiece_aim.top)/(rect_workpiece_aim.top-rect_workpiece.top);
				rect_workpiece.top=rect_workpiece.top+step_workpiece*AGV_SPEED;
				rect_workpiece.bottom=rect_workpiece.top+120;
				Invalidate();
			}
			else	//已经装完工件
			{
				if((load_remove%2)==1)	
				{
					numm=atoi(plan[task_num].working_procedure[task_procedure_temp+1]);
					if(numm==0)		//已经加工完,送回装卸站
					{
						task_procedure_temp++;
						rect_agv_aim.left=rect_load.left;
						rect_workpiece_aim.top=rect_load.top+25;
					}
					else
					{
						if(assem_every[numm].workpiece_manu!=1)		//下一加工工序不忙
						{
							task_procedure_temp++;
							rect_agv_aim.left=rect_assem[numm-1].left;
							rect_workpiece_aim.top=rect_load.top+25;
						}
						else	//下一加工工序忙
						{
							rect_agv_aim.left=rect_storage.left-30;
							rect_workpiece_aim.left=rect_assem_workpiece[11].left;
							load_remove=1;
							storage[storage_num].priority=plan[task_num].priority;
							storage[storage_num].task_num=task_num;
							storage[storage_num].procedure=task_procedure_temp+1;							SetTimer(2,50,NULL);
							KillTimer(1);						
						}
					}
					load_remove++;
				}
				else	//工件已经送入工位
				{
					numm=atoi(plan[task_num].working_procedure[task_procedure_temp]);
					if(numm!=0)
					{
						assem_every[numm].workpiece_manu=1;
						assem_every[numm].task_num=task_num;
						assem_every[numm].procedure=task_procedure_temp;
						assem_manu_time[numm-1]=TIME_MANU+rand();
						SetTimer(20+numm,assem_manu_time[numm-1],NULL);
					}
					SetTimer(11,50,NULL);
					load_remove=1;
					KillTimer(1);
				}				
			}

		}	
	}
	if(nIDEvent==2)
	{
		if(abs(rect_agv.left-rect_agv_aim.left)>=AGV_SPEED)
		{
			step_agv=abs(rect_agv.left-rect_agv_aim.left)/(rect_agv_aim.left-rect_agv.left);
			rect_agv.left=rect_agv.left+step_agv*AGV_SPEED;
			rect_agv.right=rect_agv.left+30;
			if(rect_workpiece.top==(rect_agv.top+25))
			{
				rect_workpiece.left=rect_agv.left+5;
				rect_workpiece.right=rect_workpiece.left+20;
			}
			Invalidate();
		}
		else
		{
			if(abs(rect_workpiece.left-rect_workpiece_aim.left)>=AGV_SPEED)
			{
				step_workpiece=abs(rect_workpiece.left-rect_workpiece_aim.left)/(rect_workpiece_aim.left-rect_workpiece.left);
				rect_workpiece.left=rect_workpiece.left+step_workpiece*AGV_SPEED;
				rect_workpiece.right=rect_workpiece.left+20;
				Invalidate();
			}
			else
			{
				storage[storage_num].priority=plan[task_num].priority;
				storage[storage_num].task_num=task_num;
				storage_num++;
				assem_every[11].workpiece_manu=1;
				SetTimer(11,50,NULL);
				load_remove=1;
				KillTimer(2);
			}
		}

	}
	if(nIDEvent==3)
	{
		int numm;
		if(abs(rect_agv.left-rect_agv_aim.left)>=AGV_SPEED)
		{
			step_agv=abs(rect_agv.left-rect_agv_aim.left)/(rect_agv_aim.left-rect_agv.left);
			if((rect_workpiece.top==(rect_agv.top+25))&&(abs(rect_workpiece.left-rect_agv.left)<5+AGV_SPEED))
			{
				rect_workpiece.left=rect_agv.left+step_agv*AGV_SPEED+5;
				rect_workpiece.right=rect_workpiece.left+20;
			}
			rect_agv.left=rect_agv.left+step_agv*AGV_SPEED;
			rect_agv.right=rect_agv.left+30;	
			Invalidate();
		}
		else
		{
			if(abs(rect_workpiece.left-rect_workpiece_aim.left)>=AGV_SPEED)
			{
				step_workpiece=abs(rect_workpiece.left-rect_workpiece_aim.left)/(rect_workpiece_aim.left-rect_workpiece.left);
				rect_workpiece.left=rect_workpiece.left+step_workpiece*AGV_SPEED;
				rect_workpiece.right=rect_workpiece.left+20;
				Invalidate();
			}
			else
			{
				numm=atoi(plan[task_num].working_procedure[task_procedure_temp+1]);
				rect_agv_aim.left=rect_assem[numm-1].left;
				rect_workpiece_aim.top=rect_load.top+25;
				SetTimer(4,50,NULL);
				KillTimer(3);
			}
		}
		
	}
	if(nIDEvent==4)		//小车从装卸站取工件,送往下一工位
	{
		int numm;
		if(abs(rect_agv.left-rect_agv_aim.left)>=AGV_SPEED)		//小车没到指定位置
		{
			step_agv=abs(rect_agv.left-rect_agv_aim.left)/(rect_agv_aim.left-rect_agv.left);
			if((rect_workpiece.top==(rect_agv.top+25))&&(abs(rect_workpiece.left-rect_agv.left)<=(5+AGV_SPEED)))
			{
				rect_workpiece.left=rect_agv.left+step_agv*AGV_SPEED+5;
				rect_workpiece.right=rect_workpiece.left+20;
			}
			rect_agv.left=rect_agv.left+step_agv*AGV_SPEED;
			rect_agv.right=rect_agv.left+30;	
			Invalidate();
		}
		else
		{
			if(abs(rect_workpiece.top-rect_workpiece_aim.top)>=AGV_SPEED)		//到指定位置,还没卸完工件
			{
				step_workpiece=abs(rect_workpiece.top-rect_workpiece_aim.top)/(rect_workpiece_aim.top-rect_workpiece.top);
				rect_workpiece.top=rect_workpiece.top+step_workpiece*AGV_SPEED;
				rect_workpiece.bottom=rect_workpiece.top+120;
				Invalidate();
			}
			else
			{				
				numm=atoi(plan[task_num].working_procedure[task_procedure_temp+1]);
				assem_every[numm].workpiece_manu=1;
				assem_every[numm].task_num=task_num;
				assem_every[numm].procedure=task_procedure_temp+1;
				assem_manu_time[numm-1]=TIME_MANU+rand();
				SetTimer(20+numm,assem_manu_time[numm-1],NULL);
				SetTimer(11,50,NULL);
				KillTimer(4);			
			}
			
		}	
	}
	if(nIDEvent==5)
	{
		if(string_time<=40)
		{
			Invalidate();
			string_time++;
		}
		else
		{
			string_time=1;
			BUTTON_DOWN=0;
			KillTimer(5);
		}


	}
	if(nIDEvent==21)
	{
		assem_every[1].status_manu=1;
		time_manu[0]+=assem_manu_time[0];
		KillTimer(21);
	}
	if(nIDEvent==22)
	{
		assem_every[2].status_manu=1;
		time_manu[1]+=assem_manu_time[1];
		KillTimer(22);
	}
	if(nIDEvent==23)
	{
		assem_every[3].status_manu=1;
		time_manu[2]+=assem_manu_time[2];
		KillTimer(23);
	}
	if(nIDEvent==24)
	{
		assem_every[4].status_manu=1;
		time_manu[3]+=assem_manu_time[3];
		KillTimer(24);
	}
	if(nIDEvent==25)
	{
		assem_every[5].status_manu=1;
		time_manu[4]+=assem_manu_time[4];
		KillTimer(25);
	}
	if(nIDEvent==26)
	{
		assem_every[6].status_manu=1;
		time_manu[5]+=assem_manu_time[5];
		KillTimer(26);
	}
	if(nIDEvent==27)
	{
		assem_every[7].status_manu=1;
		time_manu[6]+=assem_manu_time[6];
		KillTimer(27);
	}
	if(nIDEvent==28)
	{
		assem_every[8].status_manu=1;
		time_manu[7]+=assem_manu_time[7];
		KillTimer(28);
	}
	if(nIDEvent==29)
	{
		assem_every[9].status_manu=1;
		time_manu[8]+=assem_manu_time[8];
		KillTimer(29);
	}
	if(nIDEvent==30)
	{
		assem_every[10].status_manu=1;
		time_manu[9]+=assem_manu_time[9];
		KillTimer(30);
	}
	CView::OnTimer(nIDEvent);
}

BOOL CFMS_SIMULATIONView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	return true;
//	return CView::OnEraseBkgnd(pDC);
}

void CFMS_SIMULATIONView::OnStartTask() 
{
	// TODO: Add your command handler code here
	if(task_inall)
	{
		time_begin=GetTickCount();
		int i;
		task_num=0;
		task_procedure_temp=0;
		plan_task_num=0;
		Storage_num=0;
		load_remove=1;
		BUTTON_DOWN=0;
		time_manu_inall=0;
		srand(TIME_MANU_MAX);
		for(i=0;i<12;i++)
		{
			assem_every[i].workpiece_manu=0;
			assem_every[i].status_manu=0;
		}
		for(i=0;i<10;i++)
			time_manu[i]=0;
		for(i=0;i<task_inall;i++)
			plan[i].amount=plan2[i].amount;
		rect_agv_aim.left=rect_agv.left;
		rect_workpiece_aim.top=rect_workpiece.top;
		if(plan[plan_task_num].amount>0)
			assem_every[0].workpiece_manu=1;
		SetTimer(11,50,NULL);
	}
}
int CFMS_SIMULATIONView::task_over()
{
	int i;
	if((rect_agv.left==rect_load.left)&&(plan[task_num-1].amount==0))
	{
		for(i=0;i<=11;i++)
			if(assem_every[i].workpiece_manu)
				return false;
		return true;
	}
	else return false;

}
int CFMS_SIMULATIONView::workpiece_manu_over()	//是否有已经加工完成的,返回当前的工位(具有最高优先级)
{
	int i;
	int priority=11;
	for(i=1;i<11;i++)
	{
		if(assem_every[i].workpiece_manu)
			if(assem_every[i].status_manu)
				if(priority>plan[assem_every[i].task_num].priority)
					priority=plan[assem_every[i].task_num].priority;	
	}
	for(i=1;i<11;i++)
	{
		if(assem_every[i].workpiece_manu)
			if(assem_every[i].status_manu)
				if(priority==plan[assem_every[i].task_num].priority)
					return i;	
	}
	return false;

}
void CFMS_SIMULATIONView::storage_have_workpiece()
{
	int i;
	rect_agv_aim.left=rect_storage.left-30;
	rect_workpiece.left=rect_assem_workpiece[11].left;
	rect_workpiece.top=rect_assem_workpiece[11].top;
	rect_workpiece.right=rect_assem_workpiece[11].right;
	rect_workpiece.bottom=rect_assem_workpiece[11].bottom;
	rect_workpiece_aim.left=rect_agv_aim.left+5;
	task_num=storage[priority_storage()].task_num;
	task_procedure_temp=storage[priority_storage()].procedure-1;
	if(storage_num>1)
		for(i=(priority_storage()+1);i<storage_num;i++)
		{
			storage[i-1].priority=storage[i].priority;
			storage[i-1].task_num=storage[i].task_num;
			storage[i-1].procedure=storage[i].procedure;
		}
	storage_num--;
	if(storage_num==0)
		assem_every[11].workpiece_manu=0;
	SetTimer(3,50,NULL);
}

int CFMS_SIMULATIONView::priority_storage()		//尽量返回最高级别的工件,但该工件下一工位必须是不忙状态
{
	int i;
	int priority=11;
	int numm;
	for(i=0;i<storage_num;i++)
	{
		numm=atoi(plan[storage[i].task_num].working_procedure[storage[i].procedure]);
		if((storage[i].priority<priority)&&(assem_every[numm].workpiece_manu==0))
			priority=storage[i].priority;
	}
	if(priority!=11)
	{
		for(i=0;i<storage_num;i++)
			if(priority==storage[i].priority)
				return i;
	}
	return -1;
}
void CFMS_SIMULATIONView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	left_button_num=left_button_area(&point);
	if((left_button_num>=0)&&(left_button_num<=11))
		BUTTON_DOWN=1;
	else BUTTON_DOWN=0;
	if(left_button_num==0)
	{
		rect_string.left=rect_load.left-40;
		rect_string.right=rect_load.right+40;
		rect_string.top=rect_load.bottom+10;
		rect_string.bottom=rect_load.bottom+70;
	}
	else
	{
		if((left_button_num>0)&&(left_button_num<11))
		{
			rect_string.left=rect_assem[left_button_num-1].left-40;
			rect_string.right=rect_assem[left_button_num-1].right+40;
			rect_string.top=rect_assem[left_button_num-1].bottom+10;
			rect_string.bottom=rect_assem[left_button_num-1].bottom+70;
		}
		else
		{
			if(left_button_num==11)
			{
				rect_string.left=rect_storage.left-30;
				rect_string.right=rect_storage.right+30;
				rect_string.top=rect_storage.bottom+10;
				rect_string.bottom=rect_storage.bottom+40;			
			}
		}
	}
	SetTimer(5,51,NULL);
	CView::OnLButtonDown(nFlags, point);
}

int CFMS_SIMULATIONView::left_button_area(CPoint *p)
{
	int i;
	if((p->x>=rect_load.left)&&(p->x<=rect_load.right)&&(p->y>=rect_load.top)&&(p->y<=rect_load.bottom))
		return 0;
	for(i=0;i<10;i++)
		if((p->x>=rect_assem[i].left)&&(p->x<=rect_assem[i].right)&&
		   (p->y>=rect_assem[i].top)&&(p->y<=rect_assem[i].bottom))
			return i+1;
	if((p->x>=rect_storage.left)&&(p->x<=rect_storage.right)&&
	   (p->y>=rect_storage.top)&&(p->y<=rect_storage.bottom))
		return 11;
	return -1;
}

void CFMS_SIMULATIONView::OnFileStop() 
{
	// TODO: Add your command handler code here
	KillTimer(11);
	KillTimer(1);
	KillTimer(2);
	KillTimer(3);
	KillTimer(4);
	KillTimer(5);
	
}

void CFMS_SIMULATIONView::OnLookTask() 
{
	// TODO: Add your command handler code here
	int i,j;
	CTaskDisplay* dlg;
	dlg=new CTaskDisplay(this);
	for(i=0;i<task_inall;i++)
	{
		dlg->plan_display[i].amount=plan2[i].amount;
		dlg->plan_display[i].priority=plan[i].priority;
		dlg->plan_display[i].time=plan[i].time;
		for(j=1;atoi(plan[i].working_procedure[j])>0;j++)
			strcpy(dlg->plan_display[i].working_procedure[j-1],plan[i].working_procedure[j]);
	}
	dlg->Create(CTaskDisplay::IDD);
	dlg->ShowWindow(SW_SHOW);
}

void CFMS_SIMULATIONView::OnLookTongji() 
{
	// TODO: Add your command handler code here
	CTaskInall dlg;
	dlg.DoModal();
}





















⌨️ 快捷键说明

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