📄 fms_simulationview.cpp
字号:
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 + -