特别鸣谢:我的队友
论文的辛苦撰写和模型建立大部分归功于我的队友,本blog是我们通力合作的结果,不敢独自一人占有成果。
问题重述
图1是一个智能加工系统的示意图,由8台计算机数控机床(Computer Number Controller,CNC)、1辆轨道式自动引导车(Rail Guide Vehicle,RGV)、1条RGV直线轨道、1条上料传送带、1条下料传送带等附属设备组成。RGV是一种无人驾驶、能在固定轨道上自由运行的智能车。它根据指令能自动控制移动方向和距离,并自带一个机械手臂、两只机械手爪和物料清洗槽,能够完成上下料及清洗物料等作业任务。
针对下面的具体情况:
一道工序的物料加工作业情况,每台CNC安装同样的刀具,物料可以在任一台CNC上加工完成;
任务1:对一般问题进行研究,给出RGV动态调度模型和相应的求解算法;
任务2:利用表1中系统作业参数的3组数据分别检验模型的实用性和算法的有效性,给出RGV的调度策略和系统的作业效率。
问题建模与分析
一道工序的作业情况,每台CNC安装的刀片相同,且每台CNC工作对其任务分为上下料作业、清洗作业,该时间内RGV不移动,所以动态调度简化为GRV对CNC的选择工作顺序问题,从而以RGV进行下次作业间隔时间最短为目标进行模型的建立,并进行相应的模拟得到其解。
Matlab代码:
% 本函数为问题的主函数
% 输入参数初始化
clear
clc
distance = [28 31 48 51 61 64 74 77
48 51 28 31 48 51 61 64
61 64 48 51 28 31 48 51
74 77 61 64 48 51 28 31];
position = zeros(1,4);
position(1) = 1;
Tend = 28800;
record = 1;
t = 0;
rangement = zeros(1,8);
for i = 1:8
stu(i).state = 0;
stu(i).time = 0;
stu(i).up = zeros(1,2);
end
% 开始迭代
while t <= Tend
% 找到RGV的位置
num = findrgv(position);
% 生成距离向量,选择最小的并使RGV前往
for i = 1:8
rangement(i) = distance(num,i) + stu(i).time;
end
[~,tip] = min(rangement);
if t + min(rangement) < Tend
t = t + min(rangement);
else
break;
end
% 到达之后,进行操作之前,对计时器和位置进行更新
position = zeros(1,4);
position(ceil(tip/2)) = 1;
stu = updatetime(stu,min(rangement));
% 判断状态,执行操作并更新状态
if stu(tip).state == 0
if mod(tip,2) == 1
temp = 28;
else
temp = 31;
end
stu(tip).up(1) = t - temp;
temp = 560;
if t + temp < Tend
t = t + temp;
stu(tip).time = temp;
stu(tip).state = 1;
else
break;
end
elseif stu(tip).state == 2
stu(tip).up(2) = t;
track(record,:) = [tip stu(tip).up];
stu(tip).up = zeros(1,2);
stu(tip).up(1) = t;
temp = 560;
if t + temp < Tend
t = t + temp;
stu(tip).time = temp;
stu(tip).state = 1;
record = record + 1;
else
break;
end
end
end
disp(' CNC 上料时间 下料时间');
track
function num = findrgv(position)
% state 当前工作台的状态矩阵
[~,colum] = size(position);
for i = 1:colum
if position(i) ~= 0
num = i;
break;
end
end
function stu = updatetime(stu,temp)
% 更新结构体,即计时器
for i = 1:8
if stu(i).time > 0
store = stu(i).time - temp;
if store < 0
stu(i).time = 0;
stu(i).state = 2;
else
stu(i).time = store;
end
end
end
结果
在约定的8小时内,一共完成下料38次。以下是具体的完成下料CNC和开始上下料的时间。