Post on 15-Jan-2016
description
Universidade Federal de Uberlândia
Faculdade de Engenharia Mecânica e Mecatrônica – FEMEC
Simulação de Sistemas Automatizados – FEMEC 42083
Prof. Dr. Jean-Paul Z. De Souza Tavares
RELATÓRIO DE SIMULAÇÃO DE SISTEMAS
AUTOMATIZADOS
Módulo 2: Simulação Computacional
Brian de Lima Curtt 98770
Caio Eduardo Okimoto Ladislau 11011EMT023
Uberlândia, 24 de junho de 2014
Sumário1. Objetivos....................................................................................................................3
2. Introdução..................................................................................................................4
3. Fundamentos Teóricos...............................................................................................5
4. Materiais Utilizados...................................................................................................6
5. Procedimento Experimental.......................................................................................6
6. Conclusões.................................................................................................................7
2
1. Objetivos
Para o segundo módulo prático da disciplina de Simulação de Sistemas
Automatizados, foi trabalhado o conceito de modelos computacionais. Dois métodos
distintos de criação de modelos foram aplicados para um mesmo problema de simulação
de fila e atendimento: utilização de simulador e programação em linguagem de alto
nível. Uma comparação é feita entre os métodos, sendo, porém, o simulador mais
explorado.
3
2. Introdução
Figura 1: Processo de produção de parafusos e pinos.
O problema proposto para esse módulo é composto por três entidades de
“atendimento”, uma entrada e duas saídas. A primeira entidade que realiza algum
processo é o posto de Corte, que produz pinos para as duas outras entidades, Etapa 2 e
Etapa 3, ou como será aqui chamado, postos de Parafusos e Pinos, respectivamente. Isso
acarreta a possível formação de três filas nesse sistema, como é mostrado na figura 1.
A primeira fila é formada pela entrada de matéria-prima, cujo tempo entre
chegadas pode ser modelado por uma distribuição exponencial de média igual à 2,5
minutos, e o tempo de atendimento do posto de Corte, cuja atividade demora um tempo
normalmente distribuído com média de 2 minutos e desvio-padrão de 0,7 minutos.
Terminado a atividade de corte, são criados 100 cilindros para cada unidade de matéria-
prima.
Dos cilindros produzidos, 67% são encaminhados para o posto de Parafusos e
33% para o de Pinos. Essas são as entradas para as filas 2 e 3, respectivamente, onde os
pinos devem esperar para serem atendidos. Os dois postos possuem tempos de
atendimento normalmente distribuído, sendo que o de parafusos possui média de 4
minutos e desvio-padrão de 1 minuto, enquanto que o de pinos possui média de 2,6
minutos e desvio-padrão de 0,8 minutos.
Os parafusos e os pinos produzidos pelos dois postos são as saídas do sistema
estudado. A simulação deseja, assim, entender o comportamento do processo inteiro,
buscando estimativas de tamanhos de filas, estoques de produtos acabados e semi
4
acabados e taxas de utilização dos operários, por exemplo. Com essas informações, é
possível tomar decisões sobre como aumentar a eficiência do processo.
5
3. Fundamentos Teóricos
6
4. Materiais Utilizados
Os materiais utilizados para esse módulo prático foram:
O ambiente de desenvolvimento Matlab;
O simulador de processos Simul8.
5. Procedimento Experimental
5.1. Matlab
O algoritmo elaborado para a resolução do problema proposto é similar ao
apresentado na apostila deste módulo, alterando-se, apenas, o número de eventos que
podem ocorrer durante o processo. A chegada da matéria-prima, a atividade de corte em
cilindros, a atividade de produção de parafusos e a de pinos são os eventos que causam
mudanças nos estados nos insumos, em seus vários estágios, devendo ser tratados pelo
código.
Desse modo, as seguintes variáveis são necessárias para a simulação:
t_max: delimita o tempo da simulação, sendo para esse problema de 12960
minutos, equivalente a 27 dias de 8 horas;
relógio: como no exemplo da apostila, indica o tempo corrente de simulação;
tempo_p_chegada_mp: indica o tempo em que ocorrerá a próxima chegada de
matéria-prima;
tempo_p_corte: indica o tempo em que se iniciará a próxima atividade de corte;
tempo_p_parafuso: indica o tempo em que se iniciará a próxima atividade de
fabricação de parafusos;
tempo_p_pino: indica o tempo em que se iniciará a próxima atividade de
fabricação de pinos.
Os postos das atividades de corte, parafusos e pinos podem estar em dois
estados: ocupados ou desocupados. Para representar isso, usam-se:
status_corte;
status_parafuso;
status_pino.
Durante o processo produtivo, a chegada de insumos a um dos postos de
atividades leva duas ações possíveis, dependendo do estado do posto. Caso ele esteja
desocupado, o insumo entra no posto, a atividade é iniciada e o posto fica bloqueado
durante esse meio tempo. Já caso esteja ocupado, o insumo deve entrar em uma fila para
esperar até que o posto se desocupe para o atende. Essas filas são:
7
n_fila_1: formada pela matéria-prima a espera de ser transformada em cilindros;
n_fila_2: formada pelos cilindros destinados para a fabricação de parafusos;
n_fila_3: formada pelos cilindros destinados para a fabricação de pinos.
Para simplificar o algoritmo codificado, foram considerados que os lotes de 100
cilindros produzidos pelo posto de corte possuíam 67% de serem encaminhados para o
posto de Parafusos e 33% de irem para o de Pinos. Isso foi conseguido gerando um
número randômico (distribuição uniforme) entre 0 e 1. Caso o valor fosse menor que
0,67, os 100 cilindros iriam para o posto de parafuso e, caso contrário, iriam para o
posto de pinos.
Para registrar a quantidades de produtos acabados e os tempos de atendimento
totais durante o tempo de simulação, foram usadas as variáveis:
soma_cil: quantidade total de cilindros produzidos;
soma_par: quantidade total de parafusos produzidos;
soma_pin: quantidade total de pinos produzidos;
soma_1: somatória dos tempos de todos os atendimentos efetuados pelo posto de
corte;
soma_2: somatória dos tempos de todos os atendimentos efetuados pelo posto de
parafusos;
soma_3: somatória dos tempos de todos os atendimentos efetuados pelo posto de
pinos.
Essas são as variáveis principais do código elaborado. O algoritmo de simulação
em si ocorre em um laço que dura até o tempo de simulação se esgote. Para cada
execução do laço, é avaliado qual evento deve ocorrer naquela volta do código, sendo
isso conseguido de forma da seguinte forma:
if tempo_p_chegada_mp <= tempo_p_corte && tempo_p_chegada_mp <=
tempo_p_parafuso && tempo_p_chegada_mp <= tempo_p_pino %Trata Eventos
de Chegada
relogio=tempo_p_chegada_mp;
...
Assim, avalia-se qual evento deve ocorrer primeiro e avança-se a simulação para
aquele instante. Comandos análogos são utilizados para os outros eventos. Dentro do
código do evento, a atividade esperada pela entidade é realizada, ocorrendo, em geral, a
retirada de elementos de uma fila para outra ou para outro posto diretamente. Após isso,
8
determina-se quando esse evento ocorrerá novamente e as variáveis com os tempos de
próximos eventos são atualizadas.
Esses tempos são determinados utilizando as distribuições correspondentes. Por
exemplo, para o tempo de atendimento do posto de corte, tem-se:
t_corte=normrnd(2,0.7);
Para a automatização da repetição da simulação, um novo laço de repetição foi
acrescentado ao programa. Os valores relevantes, já explicitados, são armazenados em
cada laço e, ao final, são calculados valores de média, desvio-padrão, máximo e mínimo
para essas variáveis. Essa é a explicação da lógica geral do programa, sendo que o
código em si pode ser encontrado em anexo a esse relatório juntamente com o seu
fluxograma para um estudo mais aprofundado.
Resultados
Os resultados das simulações realizadas pelo código Matlab são resumidas na
tabela 1. Como citado anteriormente, o tempo simulado corresponde a um mês de
trabalho com 27 dias úteis de 8 horas, sendo a simulação repetida 10 vezes.
Tabela 1: Síntese dos resultados da simulação via algoritmo codificado em Matlab.
MédiaDesvio-
padrãoMáximo Mínimo
Número de
atendimento
Cilindros 5155 75 5290 5064
Parafuso
s3224 9 3248 3212
Pinos 1709 54 1826 1642
Taxa de
utilização
Cilindros 79,66 1,04 81,53 78,60
Parafuso
s99,66 0,31 100,00 99,19
Pinos 34,34 0,31 36,06 33,24
Número de
elementos
nas filas
Cilindros 3 4 11 0
Parafuso
s22120 4334 28700 15500
Pinos 10 32 100 0
Número de Cilindros 515510 7525 529000 506400
9
elementos
produzidos
Parafuso
s322440 930 324800 321200
Pinos 170940 5446 182600 164200
10
6. Conclusões
11
Anexo AAlgoritmo utilizado para resolução do problema estudado.
12
Código elaborado no Matlab para simulação do problema estudado.
clc
13
close allclear all atendimento = zeros(10,3);tx_ut= zeros(10,3);n_fila = zeros(10,3);soma_elementos = zeros(10,3); for cont = 1:100 t_max=27*8*60; %tempo máximo de simulação status_corte=0; status_parafuso=0; status_pino=0; relogio=0; tempo_p_chegada_mp=0; tempo_p_corte=t_max+1; tempo_p_parafuso=t_max+1; tempo_p_pino=t_max+1; n_fila_1=0; n_fila_2=0; n_fila_3=0; soma_cil=0; soma_par=0; soma_pin=0; soma_1=0; soma_2=0; soma_3=0; atendimento_1=0; atendimento_2=0; atendimento_3=0; while relogio <= t_max if tempo_p_chegada_mp <= tempo_p_corte && tempo_p_chegada_mp <= tempo_p_parafuso && tempo_p_chegada_mp <= tempo_p_pino %Trata Eventos de Chegada relogio=tempo_p_chegada_mp; %fprintf('Nova Chegada de matéria-prima= %4.2f\n', relogio); if status_corte == 0 % se atendente disponivel %fprintf('Novo corte = %4.2f\n', relogio); status_corte=1; soma_cil = soma_cil + 100; t_corte=normrnd(2,0.7); % Número aleatorio da distribuição normal com média 2 soma_1=soma_1+t_corte; atendimento_1=atendimento_1+1; tempo_p_corte=relogio+t_corte; teste = rand();
14
if(teste <= 2/3) if status_parafuso == 0 % se atendente disponivel %fprintf('Novo parafuso = %4.2f\n', relogio); status_parafuso=1; soma_par=soma_par+100; t_parafuso=normrnd(4,1); % Número aleatorio da distribuição normal com média 2 soma_2=soma_2+t_parafuso; atendimento_2=atendimento_2+1; tempo_p_parafuso=tempo_p_corte+t_parafuso; else n_fila_2=n_fila_2+100; %fprintf('Fila de parafusos = %d\n', n_fila_2); end else if status_pino == 0 % se atendente disponivel %fprintf('Novo pino = %4.2f\n', relogio); status_pino=1; soma_pin=soma_pin+100; t_pino=normrnd(2.6,0.8); % Número aleatorio da distribuição normal com média 2 soma_3=soma_3+t_pino; atendimento_3=atendimento_3+1; tempo_p_pino=tempo_p_corte+t_pino; else n_fila_3=n_fila_3+100; %fprintf('Fila de pinos = %d\n', n_fila_3); end end else n_fila_1=n_fila_1+1; %fprintf('Estoque de cilindros = %d\n', n_fila_1); end tec_mp=exprnd(2.5,1);% tempo entre chegadas sucessivas tempo_p_chegada_mp=relogio+tec_mp; elseif tempo_p_corte < tempo_p_chegada_mp && tempo_p_corte <= tempo_p_parafuso && tempo_p_corte <= tempo_p_pino %Trata Eventos de Chegada relogio=tempo_p_corte; if n_fila_1 > 0; %fprintf('Novo corte = %4.2f\n',relogio) n_fila_1=n_fila_1-1; t_corte=normrnd(2,0.7); % Número aleatorio da distribuição normal com média 2 soma_1=soma_1+t_corte; atendimento_1=atendimento_1+1; tempo_p_corte=relogio+t_corte; soma_cil=soma_cil+100;
15
teste = rand(); if(teste <= 2/3) if status_parafuso == 0 % se atendente disponivel %fprintf('Novo parafuso = %4.2f\n', relogio); status_parafuso=1; soma_par=soma_par+100; t_parafuso=normrnd(4,1); % Número aleatorio da distribuição normal com média 2 soma_2=soma_2+t_parafuso; atendimento_2=atendimento_2+1; tempo_p_parafuso=relogio+t_parafuso; else n_fila_2=n_fila_2+100; %fprintf('Fila de parafusos = %d\n', n_fila_2); end else if status_pino == 0 % se atendente disponivel %fprintf('Novo pino = %4.2f\n', relogio); status_pino=1; soma_pin=soma_pin+100; t_pino=normrnd(2.6,0.8); % Número aleatorio da distribuição normal com média 2 soma_3=soma_3+t_pino; atendimento_3=atendimento_3+1; tempo_p_pino=relogio+t_pino; else n_fila_3=n_fila_3+100; %fprintf('Fila de pinos = %d\n', n_fila_3); end end else status_corte=0; tempo_p_corte=t_max+1; end elseif tempo_p_parafuso < tempo_p_chegada_mp && tempo_p_parafuso < tempo_p_corte && tempo_p_parafuso <= tempo_p_pino %Trata Eventos de Chegada relogio=tempo_p_parafuso; if n_fila_2 > 0; %fprintf('Novo parafuso = %4.2f\n',relogio) n_fila_2=n_fila_2-100; %fprintf('Fila de parafusos = %d\n', n_fila_2); soma_par=soma_par+100; t_parafuso=normrnd(4,1); % Número aleatorio da distribuição normal com média 2 soma_2=soma_2+t_parafuso;
16
atendimento_2=atendimento_2+1; tempo_p_parafuso=relogio+t_parafuso; else status_parafuso=0; tempo_p_parafuso=t_max+1; end elseif tempo_p_pino < tempo_p_chegada_mp && tempo_p_pino < tempo_p_corte && tempo_p_pino < tempo_p_parafuso %Trata Eventos de Chegada relogio=tempo_p_pino; if n_fila_3 > 0; %fprintf('Novo pino = %4.2f\n',relogio) soma_pin=soma_pin+100; n_fila_3=n_fila_3-100; %fprintf('Fila de pinos = %d\n', n_fila_3); t_pino=normrnd(2.6,0.8); % Número aleatorio da distribuição normal com média 2 soma_3=soma_3+t_pino; atendimento_3=atendimento_3+1; tempo_p_pino=relogio+t_pino; else status_pino=0; tempo_p_pino=t_max+1; end end end tx_utilizacao_1=100*(soma_1/t_max); % Tx. Utilização Atendente tx_utilizacao_2=100*(soma_2/t_max); % Tx. Utilização Atendente tx_utilizacao_3=100*(soma_3/t_max); % Tx. Utilização Atendente fprintf('\n\n#######################################################################\n'); fprintf('\n\nNúmero de Atendimentos cilindros = %1.0f\n', atendimento_1); fprintf('Número de Atendimentos parafusos = %1.0f\n', atendimento_2); fprintf('Número de Atendimentos pinos = %1.0f\n', atendimento_3); fprintf('\nTaxa de Utilização do Atendente de cilindros = %4.2f\n', tx_utilizacao_1) fprintf('Taxa de Utilização do Atendente de parafusos = %4.2f\n', tx_utilizacao_2) fprintf('Taxa de Utilização do Atendente de pinos = %4.2f\n', tx_utilizacao_3) fprintf('\nNúmero de matéria prima na Fila = %1.0f\n', n_fila_1) fprintf('Número de cilindros na Fila para parafusos = %1.0f\n', n_fila_2)
17
fprintf('Número de cilindros na Fila para pinos = %1.0f\n', n_fila_3) fprintf('\nNúmero de cilindros produzidos = %4.2f\n', soma_cil) fprintf('Número de parafusos produzidos = %4.2f\n', soma_par) fprintf('Número de pinos produzidos = %4.2f\n', soma_pin) fprintf('Verificação = %4.2f\n', soma_cil-(soma_par+soma_pin+n_fila_2+n_fila_3)) atendimento(cont, 1:end) = [atendimento_1 atendimento_2 atendimento_3]; tx_ut(cont, 1:end) = [tx_utilizacao_1 tx_utilizacao_2 tx_utilizacao_3]; n_fila(cont, 1:end) = [n_fila_1 n_fila_2 n_fila_3]; soma_elementos(cont, 1:end) = [soma_cil soma_par soma_pin];end fprintf('\n\n#######################################################################\n');fprintf('\n\n#######################################################################\n'); fprintf('\nMédia de Número de Atendimentos: cilindros = %1.0f; parafusos = %1.0f; pinos = %1.0f\n', mean(atendimento));fprintf('Média de Taxa de Utilização do Atendente: cilindros = %4.2f; parafusos = %4.2f; pinos = %4.2f\n', mean(tx_ut))fprintf('Média de Número de elementos na Fila: cilindros = %1.0f; parafusos = %1.0f; pinos = %1.0f\n', mean(n_fila))fprintf('Média de Número de elementos produzidos: cilindros = %4.2f; parafusos = %4.2f; pinos = %4.2f\n', mean(soma_elementos)) fprintf('\n\nDesvio de Número de Atendimentos: cilindros = %1.0f; parafusos = %1.0f; pinos = %1.0f\n', std(atendimento));fprintf('Desvio de Taxa de Utilização do Atendente: cilindros = %4.2f; parafusos = %4.2f; pinos = %4.2f\n', std(tx_ut))fprintf('Desvio de Número de elementos na Fila: cilindros = %1.0f; parafusos = %1.0f; pinos = %1.0f\n', std(n_fila))fprintf('Desvio de Número de elementos produzidos: cilindros = %4.2f; parafusos = %4.2f; pinos = %4.2f\n', std(soma_elementos)) fprintf('\n\nMáximo de Número de Atendimentos: cilindros = %1.0f; parafusos = %1.0f; pinos = %1.0f\n', max(atendimento));fprintf('Máximo de Taxa de Utilização do Atendente: cilindros = %4.2f; parafusos = %4.2f; pinos = %4.2f\n', max(tx_ut))fprintf('Máximo de Número de elementos na Fila: cilindros = %1.0f; parafusos = %1.0f; pinos = %1.0f\n', max(n_fila))fprintf('Máximo de Número de elementos produzidos: cilindros = %4.2f; parafusos = %4.2f; pinos = %4.2f\n', max(soma_elementos)) fprintf('\n\nMínimo de Número de Atendimentos: cilindros = %1.0f; parafusos = %1.0f; pinos = %1.0f\n', min(atendimento));fprintf('Mínimo de Taxa de Utilização do Atendente: cilindros = %4.2f; parafusos = %4.2f; pinos = %4.2f\n', min(tx_ut))fprintf('Mínimo de Número de elementos na Fila: cilindros = %1.0f; parafusos = %1.0f; pinos = %1.0f\n', min(n_fila))fprintf('Mínimo de Número de elementos produzidos: cilindros = %4.2f; parafusos = %4.2f; pinos = %4.2f\n', min(soma_elementos))
18
19