关于RGV下料的智能动态调度

关于RGV下料的动态调度


特别鸣谢:我的队友
论文的辛苦撰写和模型建立大部分归功于我的队友,本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和开始上下料的时间。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wlfyok/article/details/107919150