
- •Создание имитационной модели гибкой производственной системы
- •Основные положения теории систем
- •Принципы системного подхода к моделированию
- •Сущность моделирования
- •Модели отказов оборудования
- •Основы создания имитационной модели производственного процесса в гпс
- •Формализация функционирования технических средств гпс
- •Унифицированный алгоритм j-ro агрегата
- •Последовательность выполнения работы.
- •Оформления отчета по работе.
Последовательность выполнения работы.
Включить компьютер и вызывать программу MatLab.
Создать m-file через меню File-> New-> М-file. И сохранить его на носителе File-> Save. При задании имени файла исключить русские буквы, пробелы, а также знаки * ( ) + =» « ! ? №, имя файла должно начинаться с буквы. В дальнейшем всю программу писать в m-файле.
Программа будет состоять из двух файлов main.m отвечающего за общую работу системы и agregat1.m отвечающего за работу одного агрегата.
Для приведения системы в начальное состояние при каждом запуске необходимо в программе main.m удалить из рабочей области все переменные, с помощью функции:
clear all;
Создать переменную EmkostMax = s (где s = количество букв в фамилии исполнителя), определяющую максимальную емкость буферного накопителя агрегата, переменную Emkost = 0, определяющую количество деталей находящихся в буфере агрегата в данный момент (в начальный момент она равна нулю) и переменную TimeObr=0, определяющую количество времени оставшееся на обработку детали (в начальный момент времени, так как деталь не поступила на обработку, время до конца обработки равно нулю).
EmkostMax=10;
Emkost=0;
TimeObr=0;
Для использования переменных полученных выше, в алгоритме 1-го агрегата, необходимо сохранить их в файле data1.mat, с помощью команды:
save data1.mat
Создать дополнительный m-file (аналогично п.2) в котором записать алгоритм работы агрегата, и сохранить его с именем agregat1.m
В этом же m-файле (agregat1.m) создать собственную функцию agregat1 которая имеет один вход – тип загружаемой в агрегат детали (Type). При этом учесть, что если тип детали равен нулю, то деталь в агрегат не поступает.
function out=agregat1 (Type)
Инициализировать переменную out отвечающую за выход агрегата.
out=0;
Загрузить данные для работы агрегата из файла data1.mat с помощью команды:
load data1.mat
В работу агрегата необходимо включить проверку на переполнение буфера при поступлении детали, с помощью оператора условия. Если количество деталей в буфере в данный момент (Emkost) меньше количества деталей которые он может поместить EmkostMax то в буфер можно добавить деталь:
if Emkost < EmkostMax
Перед тем как добавить деталь необходимо проверить, с помощью оператор условия, наличие на входе детали. Если переменная Type не равна нулю значит, деталь пришла в агрегат и ее требуется поместить в буферный накопитель.
if Type ~= 0
Emkost=Emkost+1;
end
Если же накопитель не может принять деталь, то не обходимо выдать сообщение о его переполнении
else
disp('Буферная емкость переполнена')
end;
В результате программа agregat1.m должна содержать программу, которая проверяет на переполнение буфера и поступление детали:
if Emkost < EmkostMax
if Type ~= 0
Emkost=Emkost+1;
end
else
disp('Буферная емкость переполнена')
end;
Вывести на экран количество деталей находящиеся в буфере в данный момент.
disp('В данный момент в буфере 1го агрегата:')
Emkost
Для использования полученных результатов при следующем вызове функции агрегат необходимо сохранить переменны в тот же файл который загружался в начале функции, командой:
save data1.mat Emkost EmkostMax;
Необходимо обратить внимание на то, что команда сохранения переменных save должна всегда находиться в конце функции agregat1. Это следует учитывать при внесении изменений в программу.
В основную программу (main.m) добавить несколько процедур вызова алгоритма агрегат и проанализировать полученные результаты, запустив программу на выполнение с помощью кнопки Run на панели инструментов.
agregat1(1)
agregat1(0)
agregat1(1)
agregat1(0)
agregat1(1)
Результатом выполнения вышеприведенных операторов в окне команд системы MatLab (Comand Window) будет:
В данный момент в буфере 1го агрегата:
Emkost =
3
Внимание! Для моделирования системы необходимо запускать main.m.
Важно! Перед каждым моделированием не забывайте сохранять изменения во всех файлах.
Самостоятельно в окне команд системы MatLab вызвать функцию агрегат с разными параметрами(1 и 0):
agregat1(1) или agregat1(0)
Проанализировать работу алгоритма агрегат при добавлении детали и при переполнении буфера.
Дополнить функцию agregat1 расчетом времени на обработку поступившей детали. Необходимо учесть, что все последующие дополнения необходимо вносить до функции сохранения переменных (save). Время обработки каждой детали TimeObr длится T минут (где Т = количество букв в имени студента*10), тогда алгоритм расчета времени будет следующий:
if TimeObr == 0 & Emkost~=0
TimeObr = 60;% Время обработки детали равно T минутам
Emkost=Emkost-1;
out=LastType;
elseif TimeObr ~=0
TimeObr=TimeObr-10;
else
disp('Простой')
out=-10;
end;
Алгоритм работает следующим образом: Если время обработки равно нулю (значит в данный момент ни одной детали не обрабатывается), и количество деталей в буферной емкости не равны нулю (т.е. в буферной емкости есть не обработанные детали), то время обработки детали равно T минут (т.е. деталь отправляется на обработку), а количество деталей в буферной емкости уменьшается на одно. В другом случае: если время обработки не равно нулю (т.е. в данный момент агрегат обрабатывает деталь) то отнимается от времени обработки 10 минут. Дискретность времени можно выбирать различную, в нашем случае выбирается 10 минут. Если не выполнилось ни одного условия значит, буферная емкость пуста и не обрабатывается ни одной детали следовательно агрегат простаивает. При простое агрегата на выход модели выдается ошибка «простой»: out=-10;
Дополнить оператор (внести изменения в уже созданный) сохранения еще одной переменной TimeObr
save data1.mat Emkost EmkostMax TimeObr;
Самостоятельно сделать процедуру вывода оставшегося времени обработки детали с помощью функции disp().
Обязательно: функции вывода данных (disp) о работе агрегата необходимо располагать после всех вычислений, но перед функцией сохранения переменных (save).
Запустить основную программу на выполнение с помощью кнопки Run на панели инструментов.
Внимание! Для моделирования системы необходимо запускать main.m.
Важно! Перед каждым моделированием не забывайте сохранять изменения во всех файлах.
Самостоятельно в окне команд системы MatLab вызвать функцию агрегат с разными параметрами(1 и 0):
agregat1(1) или agregat1(0).
Проанализировать работу алгоритма агрегат при добавлении детали и изменении времени обработки.
Для обеспечения имитационной модели возможности переналадки агрегата при поступлении детали другого типа необходимо дополнить программу следующими операторами:
Ввести оператор условия для проверки поступления на вход агрегата нового типа детали, после блока команд отвечающего за проверку поступления новых деталей, но до блока команд рассчитывающего время обработки детали:
if LastType~=Type & Type ~=0;
где LastType - тип детали на которую был настроен агрегат, Type - тип детали которая пришла в настоящий момент времени.
При этом учесть, что если тип детали равен 0, то это означает, что на вход не поступало деталей, поэтому переналадку делать не требуется.
Установить время переналадке равное Tp минутам (где Tp = количество букв в фамилии студента *10):
TimePerenalad=50;
Для того чтобы учесть перенастройку агрегата на новый тип детали, необходимо присвоить переменной LastType значение типа пришедшей детали Type:
LastType=Type;
Для отсчета времени переналадки, когда время TimePerenalad не равно нулю, необходимо ввести оператор другого условия (elseif).
elseif TimePerenalad~=0
В созданном операторе условия уменьшить время переналадки на 10 минут.
TimePerenalad=TimePerenalad-10;
Ввести оператор остальных условий (else) в который ввести оставшуюся часть программы до вывода сообщения о количестве деталей в емкости, для того чтобы при переналадке не вычислялось время обработки детали.
Ввести оператор завершающий блок else:
end;
Полученная программа должна иметь следующую структуру:
if Emkost<EmkostMax
if Type ~=0
Emkost=Emkost+1;
end
else
disp('Буферная емкость переполнена')
end;
if LastType ~= Type & Type ~=0;
TimePerenalad=50;
LastType = Type;
elseif TimePerenalad ~=0
TimePerenalad=TimePerenalad-10;
else
if TimeObr == 0 & Emkost ~=0
TimeObr = 30;
Emkost=Emkost-1;
elseif TimeObr ~=0
TimeObr=TimeObr-10;
else
disp('простой')
end;
end
В основной программе (main.m) ввести дополнительные переменные (до функции сохранения данных save):
LastType=0;
TimePerenalad=0;
В файле agregat1 дополнить функцию сохранения (save) переменными LastType и TimePerenalad
save data1.mat Emkost EmkostMax TimeObr LastType TimePerenalad
Запустить основную программу на выполнение с помощью кнопки Run на панели инструментов.
Внимание! Для моделирования системы необходимо запускать main.m.
Важно! Перед каждым моделированием не забывайте сохранять изменения во всех файлах.
Самостоятельно в окне команд системы MatLab вызвать функцию агрегат с разными параметрами(1,2 и 0):
agregat1(1), agregat1(2) или agregat1(0).
Проанализировать работу алгоритма агрегат при изменении типа деталей.
Для обеспечения имитационной модели возможности имитирования поломки агрегата, необходимо дополнить программу до блока проверки поступления детали следующими операторами:
Ввести оператор условия, в котором генерируется случайное число от 0 до 1 и сравнивается с постоянной P=1-0.005*s. (где s = количество букв в фамилии исполнителя).
if rand>0.95
Логика работы условия заключается в следующем: функцией rand генерируется случайное число от 0 до 1 и сравнивается с постоянной, при этом если сгенерированное число больше постоянной то генерируется поломка агрегата, если меньше то программа продолжает работу агрегата в нормальном режиме. Тем самым генерируется случайная поломка (т.к. функция rand выдает случайное число) с статистической закономерностью равной в нашем случае 5%. т.к. по законам статистики из 100 сгенерированных чисел от 0 до 1, пять из них будут больше 0.95.
Установить время переналадки ремонта равное Tr минутам (где Tr = количество букв в фамилии студента *10):
TimeRemont=50
А также присвоить выходу агрегата значение -1 (ошибка).
out=-1;
Для отсчета времени ремонта, когда выполняется условие, что время ремонта (TimePerenalad) не равно нулю, необходимо ввести оператор другого условия (elseif):
elseif TimeRemont ~=0
В созданном операторе условия уменьшить время ремонта на 10 минут.
TimeRemont=TimeRemont-10;
Ввести оператор остальных условий (else) в который ввести оставшуюся часть программы до сохранения переменой для того чтобы при ремонте не происходило вычисление обработки детали:
else
disp('Буферная емкость переполнена')
end;
Ввести оператор завершающий блок else:
end;
Полученная программа должна иметь следующую структуру:
if rand > 0.95
TimeRemont=50
out=-1
elseif TimeRemont ~=0
TimeRemont=TimeRemont-10;
else
if Emkost<EmkostMax
if Type ~=0
Emkost=Emkost+1;
end
else
disp('Буферная емкость переполнена')
end;
end;
Дополнить оператор сохранения переменной TimeRemont.
save data1.mat Emkost EmkostNom TimeObr LastType TimePerenalad TimeRemont;
В основной программе (main.m) ввести дополнительную переменную:
TimeRemont=0;
Самостоятельно сделать процедуру вывода оставшегося времени ремонта и переналадки на дисплей.
Запустить основную программу на выполнение с помощью кнопки Run на панели инструментов.
Внимание! Для моделирования системы необходимо запускать main.m.
Важно! Перед каждым моделированием не забывайте сохранять изменения во всех файлах.
Самостоятельно в окне команд системы MatLab вызвать функцию агрегат с разными параметрами(1,2 и 0):
agregat1(1), agregat1(2) или agregat1(0).
Проанализировать работу алгоритма агрегат добившись ситуации поломки.
Создать имитационную модель трех последовательно расположенных агрегатов, в которых последовательно обрабатываются детали. Для этого создать копии файла agregat1.m с названиями agregat2.m; agregat3.m.
Во втором агрегате в файле agregat2.m изменить название функции с agregat1(Type) на agregat2(Type)
function out = agregat2(Type)
Установить время обработки детали равное T – 20 = 40 минутам (где Т = количество букв в имени студента * 10).
TimeObr=40;
Изменить имя файла данных загружаемых данных и сохраняемых данных на data2.mat:
load data2.mat
save data2.mat Emkost EmkostMax TimeObr LastType TimePerenalad TimeRemont;
Сохранить изменения в файле.
Соответствующие изменения произвести в файле agregat3m.m, при этом время обработки детали в третьем агрегате равно T минутам (где Т = количество букв в имени студента * 10).
В основную программу (main.m) после сохранения данных для первого агрегата save data1.mat добавить сохранение данных для второго и третьего агрегатов
save data1.mat
save data2.mat
save data3.mat
В основной программе (main.m) после функций сохранения данных (save) создать дополнительные переменные:
d1=0;
d2=0;
d3=0;
i=0;
m=0;
где d1, d2, d3 переменные характеризующие выход первого второго и третьего агрегатов, которые могут принимать следующие значения: -1 – поломка или переналадка, -10 – простой агрегата, 0 – на выходе агрегата нет деталей, но в агрегате детали еще остались, d1 = n>0 – на выходе агрегата деталь типа n; i – тип детали на входе; m – кол-во циклов моделирования.
В программе main.m создать основной моделирующий цикл, условием которого будет являться работа до тех пор, пока в агрегатах не останется ни одной детали:
while ((d1 ~=-10) | (d2~=-10) | (d3~=-10))
В основной программе создать генератор поступления деталей. Алгоритм реализует заполнение агрегата максимально возможным количеством деталей в начальные моменты времени:
if m<EmkostMax
i=1
else
i=0;
end
В тело цикла с неизвестным количеством повторений ввести моделирование агрегатов, со следующим условием: если на выходе предыдущего агрегата была деталь, то ввести ее в следующий агрегат, иначе запустить агрегат с нулевым значением.
d1=agregat1(i)
if d1 >0
d2=agregat2(d1)
else
d2=agregat2(0)
if d2>0
d3=agregat3(d2)
else
d3=agregat3(0)
end
end
Ввести в конце цикла прибавление количества пройденных циклов и завершение цикла:
m=m+1
Ввести конец завершения цикла while:
end;
Самостоятельно в трех агрегатах изменить сообщения о состоянии агрегата, при этом чтобы в сообщение указывалось в каком агрегате произошло событие.
Запустить основную программу, проанализировать работу алгоритма и определить количество пройденных циклов.
Внимание! Для моделирования системы необходимо запускать main.m.
Важно! Перед каждым моделированием не забывайте сохранять изменения во всех файлах.
Для визуализации получаемых данных в агрегатах, в основной программе требуется создать массивы в которых будут хранится данные о времени обработки детали TimeObrPlot, простое агрегата ProstoyPlot, и загрузке буферной емкости EmkostPlot, а также инициализировать переменные присвоив им значение ноль.
TimeObrPlot=0;
ProstoyPlot=0;
EmkostPlot=0;
Данные переменные требуется создать до функции сохранения данных (save) в mat файлы.
Для накопления данных об обработке детали во время функционирования агрегата требуется, в функции agregat1.m, добавлять данные из переменной TimeObr в конец массива TimeObrPlot при каждом запуске функции. Для добавления данных в массив TimeObrPlot используется функция CAT:
TimeObrPlot=cat(2,TimeObrPlot,TimeObr);
где 2 – означает тип присоединения (2 - новый элемент в этой же строке, 1 – новый элемент на новой строке);
Функцию необходимо разместить в конце программы agregat1.m но до функции сохранения переменных (save).
TimeObrPlot и TimeObr – переменные из которых берутся данные для присоединения.
Результат присоединения переменной TimeObrPlot и TimeObr записывается в переменную TimeObrPlot.
Для вывода графика изменения времени обработки детали при моделировании имитационной модели, требуется создать фигуру и построить на ней график:
figure(11)
plot(TimeObrPlot)
Функции вывода графика необходимо размещать после функции cat, но до функции сохранения переменных (save).
Функцию добавления данных и вывода графика необходимо добавить в конец функции agregat1, но до функции сохранения переменных (save).
Для того чтобы данные об обработке детали за весь период работы агрегата сохранялись при выходе из функции agregat1, требуется внести переменную TimeObrPlot в функцию сохранения данных SAVE.
Аналогично создать массивы данных о простое агрегата и о количестве деталей в буферной емкости.
ProstoyPlot=cat(2,ProstoyPlot,Prostoy);
figure(12)
plot(ProstoyPlot)
EmkostPlot=cat(2,EmkostPlot,Emkost);
figure(13)
plot(EmkostPlot)
Обратить внимание на наименование фигур, первое число характеризует номер агрегата, второе число тип данных (1 – время обработки, 2 – время простоя, 3 – количество деталей в буферной емкости).
Для правильной работы агрегата в начале программы после функции загрузки данных (load) необходимо инициализировать переменную простой:
Prostoy=0;
В программе agregat1 в блоке где выдается сообщение о простое агрегата disp('простой'), необходимо установить значения перменной простой равной еденице:
Prostoy=1;
Самостоятельно добавить в файлы agregat2 и agregat3 визуализацию данных о времени обработке, простое и количестве деталей в буферной емкости, причем фигуры для второго агрегата будут называться: 21, 22, 23, а для третьего: 31, 32, 33.
Запустить основную программу, проанализировать работу алгоритма и определить количество пройденных циклов.
Внимание! Для моделирования системы необходимо запускать main.m.
Важно! Перед каждым моделированием не забывайте сохранять изменения во всех файлах.
В результате моделирования должно появиться 9ть графиков, характеризующих работу модели.
Уменьшить графики и разнести их по монитору для одновременного просмотра всех графиков, как показано на рисунке.
Повторно запустить моделирование имитационной модели. Проанализировать ее работу.