Análise e Simulação do Ciclo de Reabastecimento
das Células de Produção em Sistemas Just-In-Time.
Luiz Meira Freire
Dissertação do MIEIG 2007/2008
Orientadores na FEUP: Prof. José Barros Basto e Prof. António Brito
Faculdade de Engenharia da Universidade do Porto
Mestrado Integrado em Engenharia Industrial e Gestão
2008-09-01
Resumo
Palavras-Chaves: Produção Enxuta; Logística Interna; Mizusumashi
Simulation and Analyses of Just-In-Time Production Cells Supply Cycle
Key words: Lean Manufacturing; Logistics; Mizusumashi
Ao Engenheiro Lauro Lins pelo suporte fornecido na programação em JAVA.tm
À Almec Iluminação LTDA pela bolsa de estudos concedida.
Ao Engenheiro Nuno Martins por permitir a publicação das fotos do Pull Flow na Oliveira & Irmão S.A.
Simulation and Analyses of Just-In-Time Production Cells Supply Cycle iii
2 O Sistema Toyota de Produção 7
2.1 Eliminação dos Desperdícios e o Princípio do Não-Custo 8
2.3 Padronização das Operações 10
2.4 Eliminação da Causa do Problema 10
2.5 Círculo de Controle da Qualidade 10
2.7 Manutenção Produtiva Total 11
2.8 Troca Rápida de Ferramentas 11
2.11 Takt-Time e Tempo de Ciclo 14
2.17 Funcionamento do Kanban 20
2.18 Cálculo do Número de Kanbans 22
2.19 Principais Desvantagens dos Kanbans 22
2.20 Diferentes Formas de Transmitir a Informação 23
2.22 Polivalência do Trabalhador 26
2.24 Abastecedor das Células de Produção 28
3 Sobre o simulador desenvolvido: 31
3.1 Arquitetura do Simulador 31
3.2 Vantagens e Limitações da Simulação Visual Interativa 32
3.3 Características Funcionais do Simulador 33
3.4 Simplificações e Considerações na Construção do Simulador 34
3.5 Configuração e Principais Variáveis do Simulador 35
3.6 Simulação no Modo da Próxima Atividade 40
3.7 Simulação no Modo do Circuito Fixo 43
3.8 Comentário acerca das variáveis dos dois métodos 46
4 Resultados Obtidos Através do Simulador 48
4.1 Comparação do Empilhador com o Mizusumashi 49
4.1.1 Relatório da Simulação Utilizando o Empilhador 50
4.1.2 Relatório da Simulação Utilizando o Mizusumashi 50
5 Conclusões e perspectivas de trabalho futuro 54
6 Referências e Bibliografia 56
Anexo A - Ficha de Trabalho Padrão 58
Anexo B - Gráficos com os Resultados da Simulação 59
Anexo D - Exemplos Reais dos Elementos Citados no Texto 67
Anexo E - SimCantina: Projeto Base Antes de Iniciar o Pull Simulator 70
Índice de Figuras
Figura 1 - Eliminação da espera através do jidoka. 9
Figura 2 - Produção empurrada versus produção puxada. 12
Figura 3 - Representação do fluxo intermitente. 13
Figura 4 - Representação do fluxo contínuo. 13
Figura 5 – Comparação da produção em grandes lotes com a produção nivelada. 15
Figura 6 - Programação do heijunka box. 17
Figura 7 - Programação do quadro de nivelamento com mais de um kanban por ranhura. 17
Figura 8 - Exemplo de um kanban de produção e de transporte. 19
Figura 12 - Funcionamento do kanban, passo quatro. Término do ciclo. 21
Figura 13 - Diferentes formas do kanban. 24
Figura 14 - Redução do desperdício de transporte utilizando células de produção em "U". 25
Figura 15 - Diferentes movimentações dentro de uma célula em "U". 25
Figura 16 - Acesso às prateleiras de um supermercado por dois tipos de corredores. 27
Figura 17 - As etiquetas utilizadas no supermercado têm sempre um kanban associado. 28
Figura 18 - Circuito fixo realizado pelo mizusumashi. 30
Figura 19 - Divisão do percurso do mizusumashi para sincronizar com o pitch-time. 30
Figura 22 - Menu de configuração dos produtos. 36
Figura 23 - Menu de configuração do chão de fábrica. 38
Figura 24 - Configuração da tabela com as distâncias da simulação. 39
Figura 28 - Quadro resumo da simulação. 48
Figura 29 - Distribuição do tempo do empilhador pelas atividades realizadas. 50
Figura 30 - Distribuição do tempo do mizusumashi pelas atividades realizadas. 51
Figura 31 - Resumo da utilização das células de produção. 51
Figura 34 - Exemplo do relatório de uma célula de manufatura emitida pelo simulador. 59
Figura 36 - Gráfico do custo total com estoque de produto acabado no período. 61
Figura 38 - Caixa de nivelamento para 6 células operando a 3 turnos. 67
Figura 41 - Posto de trabalho de uma célula de produção. 68
Figura 42 - Kanban de movimentação fixado na com o produto referenciado. 69
Figura 43 - Secção do supermercado vista do corredor do mizusumashi e do corredor do abastecedor 69
Figura 44 - Tela de configuração do SimCantina. 70
Figura 45 - Simulação com uma máquina de vendas e um garçom 71
Figura 46 - A adição de uma nova máquina de vendas eliminou a fila para a compra de tickets. 71
Introdução
Criado há mais de sessenta anos, o sistema de produção just-in-time foi bastante admirado no mundo inteiro por volta de 1980 pelos seus significativos ganhos na melhoria da qualidade e no aumento da eficiência (Liker 2004).
Entretanto, nessas seis décadas, o mercado mudou: os clientes finais passaram a desejar produtos personalizados, com amplas opções de cores e modelos. Empresas, especialmente as montadoras de computadores e de automóveis, passaram a fornecer configuradores de produto em suas páginas de internet. Neles, os clientes escolhem item a item como desejam os seus produtos, transformando
as suas ordens de compra em pedidos praticamente únicos tendo em vista as inúmeras combinações possíveis. É nesse contexto que o método Toyota de produção ganha a atenção do mundo industrial mais uma vez, já que, nele, cada produto é montado para um cliente final já existente e conhecido.
Mesmo tendo sido criado na década de 40, a literatura existente sobre sistema de produção puxado está cheia de lacunas, principalmente na parte da aplicação prática. Além disso, o entendimento de alguns tópicos, como o funcionamento do kanban, por exemplo, torna-se difícil sem a visualização de um diagrama ou uma animação.
O presente projeto teve início com a necessidade de um aprofundamento teórico por parte de um professor de gestão da produção juntamente com um aluno de gestão industrial interessado em compreender a aplicação prática dessa teoria. Além disso, uma grande empresa de consultoria demonstrou interesse no uso da simulação para melhorar o desempenho dos ciclos de reabastecimento das células de produção em sistemas de produção just-in-time. Então, é de se esperar que as componentes teórica, didática e prática sejam equilibradas e satisfatoriamente preenchidas ao longo deste texto,
fazendo do mesmo um trabalho interessante para alunos, professores, pesquisadores, profissionais e curiosos.
O presente relatório encontra-se dividido em quatro partes, as quais estão descritas abaixo.
Primeiramente é feita uma revisão dos aspectos teóricos relativos ao sistema de produção just-in-time de uma forma sucinta, pois a intenção deste texto não é a de debater nem analisar tal forma de produzir. Entretanto, deseja-se prover o leitor com um conjunto de definições e comentários imprescindíveis para a compreensão dos eventos ocorridos durante a execução do simulador, habilitando-o a analisar de forma crítica os relatórios exibidos ao final do mesmo.
A seguir é apresentado um capítulo inteiro sobre o simulador, incluindo os pré-requisitos elencados para o seu desenvolvimento, as suas funcionalidades e possibilidades de expansão. Além disso, é explicado o ciclo de reabastecimento adotado e o que acontece em cada etapa do mesmo.
Na terceira parte encontram-se os resultados obtidos de diferentes cenários considerados relevantes. Ou seja, são analisadas aquelas condições iniciais associadas a um comportamento da demanda e a uma capacidade produtiva. Ainda é apresentada uma comparação entre os diferentes cenários baseada nos indicadores selecionados.
Por fim, é feito um comentário sobre o simulador e os ganhos obtidos com a utilização do mesmo, incluindo ainda as sugestões de trabalho futuro nesta área.
Luiz Freire,
Setembro de 2008
Porto, Portugal
O Sistema Toyota de Produção
O ano era 1950 e o Japão estava com suas fábricas totalmente destruídas por causa da sua derrota na segunda guerra mundial. O então presidente da Toyota, Eiji Toyoda, e o engenheiro Taiichi Ohno passaram três meses no complexo da Ford nos Estados Unidos estudando os métodos de produção fordista para entender porque a produtividade dos operários americanos era dez vezes superior à dos orientais (Ohno 1997). Tal diferença de produtividade só poderia ser explicada pela existência de perdas no sistema de produção. A partir daí, o que se viu foi a estruturação de um processo sistemático de identificação e eliminação das perdas (Ghinato 2000). O objetivo principal era reorganizar a fábrica japonesa e torná-la numa grande montadora de veículos.
Ohno e Toyoda concluíram que nem o sistema de produção em massa, nem o sistema artesanal iriam ser aplicáveis à sua realidade. Era preciso adaptá-los e criar um sistema novo com características diferentes (Womack, J.P. apud Zagonel 2006). Inversamente ao que acontecia com a fábrica Ford, a Toyota possuía um reduzido capital de giro e operava num país pequeno e com poucos recursos. O novo sistema de produção deveria então fazer com que o dinheiro investido na fabricação de cada automóvel fosse recebido de volta o mais rápido possível (Liker 2004).
Atualmente, o Sistema Toyota de Produção (STP) é visto não apenas como um conjunto de métodos e regras, mas como uma nova filosofia de produção que procura otimizar a organização de forma a atender as necessidades do cliente no menor prazo possível, na mais alta qualidade e ao mais baixo custo, ao mesmo tempo em que aumenta a segurança e o moral de seus colaboradores, envolvendo e integrando não só a manufatura, mas todas as partes da organização (Ghinato 2000).
Pode-se afirmar que uma das grandes mudanças proposta pelo STP é o fato de puxar a produção em vez de empurrá-la. Isso significa que os produtos não são empurrados para os clientes finais pelos vendedores e, posteriormente, retirados do armazém. Na produção puxada, montam-se os produtos de uma forma muito rápida, começando a produzi-los pouco antes da data em que devem ser entregues e concluindo-os apenas no dia exato, ou seja, just-in-time (JIT).
A comparação dos dois parágrafos anteriores permite dizer que o just-in-time é apenas uma parte do STP, geralmente utilizada em conjunto com a autonomação e outras ferramentas. Essa última, também é conhecida como automação com toques humanos. De acordo com o seu idealizador, pode-se dizer que ambos representam os dois pilares principais daquele sistema (Ohno 1997). De maneira a ratificar tal informação, estão descritos, a seguir, de forma concisa, todos os princípios do sistema de produção oriental. Contudo, mesmo estando intrinsecamente relacionados, este trabalho aborda apenas o método de produção puxado, uma vez que o os outros componentes do sistema Toyota não estão diretamente implementados no simulador desenvolvido.
Eliminação dos Desperdícios e o Princípio do Não-Custo
A essência do Sistema Toyota de Produção está na constante busca pela erradicação total das perdas. Antes, o preço de um produto era imposto ao Mercado, sendo o seu valor determinado pela soma dos custos de fabricação com a margem de lucro pretendida. Com uma economia mais competitiva, o cliente é quem passou a ditar os preços dos produtos, cabendo às empresas a escolha entre venderem suas mercadorias por tal preço ou fecharem as suas portas.
Para a Toyota, a única forma de aumentar ou manter o lucro após essa mudança de abordagem é através da redução das perdas existente no sistema. Ou seja, eliminar toda e qualquer atividade que não agrega valor ao produto.
- Desperdício de Superprodução: de todas as sete perdas listadas por (Ohno 1997), a perda por superprodução é considerada a mais danosa, uma vez que esconde os outros tipos de perdas e é a mais difícil de ser eliminada.
A perda por superprodução por quantidade é a perda por produzir além daquilo que é necessário. Já a perda por superprodução por antecipação é a perda decorrente de uma produção realizada antes do momento necessário, fazendo com que as peças fiquem espalhadas pela fábrica aguardando a hora de serem processadas por etapas posteriores.
- Desperdício de Tempo Disponível (Espera): é aquela perda gerada quando um lote está à espera da liberação de um recurso para ser processado. Ou então, quando as peças já trabalhadas de um lote esperam pelo processamento das restantes para que possam avançar para a etapa seguinte. Ou ainda, quando um operário que acabou o seu ciclo de produção, fica à espera do término da operação a montante ou a jusante.
- Desperdício em Transporte: sendo o transporte dentro das instalações industriais uma atividade que não agrega valor, passa a ser interpretado como uma perda e deve ser reduzido ao mínimo possível ou até mesmo eliminado. As melhorias mais significativas, em termos de redução das perdas, são aquelas aplicadas ao processo de transporte, obtidas através de alterações de layout que dispensem ou eliminem as movimentações de material (Ghinato 2000).
- Desperdício do Processamento em Si: são perdas ao longo do processo produtivo devido exclusivamente à baixa no desempenho dos equipamentos causada por quebras de máquinas. O desperdício do processamento em si ainda inclui as perdas causadas pela rejeição de algum material que ainda poderia ser utilizado para a produção.
- Desperdício de Estoque Disponível: é causado pelos produtos acabados ou produtos em fabricação em excesso. A eliminação desta perda favorece a identificação de outras perdas não aparentes no sistema devido à função de proteção do inventário. Embora a sua diminuição deixe o sistema mais exposto aos riscos de falta de insumos e de quebra de máquinas, a redução dos estoques é considerada benéfica, pois além de reduzir os custos a ele relacionados, permite que os problemas escondidos se tornem mais evidentes antes de serem igualmente extintos.
- Desperdício de Movimento: causado pelos movimentos dos operários que não agregam valor. Este tipo de perda pode ser eliminado através de melhorias baseadas no estudo de tempos e movimentos.
- Desperdício de Produzir Produtos Defeituosos: é causado pela fabricação de produtos não conformes. A sua redução é obrigação direta, não só do setor de qualidade, mas como de toda a fábrica. A sua erradicação é conseguida após a eliminação da causa raiz da mesma.
Autonomação
Este princípio, também conhecido como jidoka, propõe a extinção da relação biunívoca homem-máquina. Ou seja, deixou de ser necessário um operário apenas para verificar se a máquina está trabalhando corretamente, sendo o mesmo requerido apenas no momento de abastecimento e na recolha da produção. Com a automação da detecção de erros, o operário fica livre para abastecer também outras máquinas enquanto a primeira está trabalhando, tal como se representa na figura 1.
A jidoka se tornou possível através do aprimoramento de dispositivos capazes de detectar anormalidades. Foi usada inicialmente nos teares automáticos da Toyoda. Neles, a produção era interrompida automaticamente assim que o fio lã fosse rompido.
Comparado ao tradicional sistema de um homem/um posto/uma tarefa, o sistema de operação de múltiplas máquinas pode proporcionar um aumento de 30% a 50% de produtividade, enquanto que o sistema de múltiplos processos é capaz de aumentar a produtividade de 50% a 100% (Shingo apud Ghinato 1999).
No Sistema Toyota de Produção, a automatização está sempre relacionada com a implementação da capacidade da máquina de detectar qualquer anormalidade e parar imediatamente.
Padronização das Operações
A padronização das operações pode ser definida como um método efetivo e organizado de produzir sem perdas (Ghinato 1999). Tal método almeja a produtividade máxima de cada funcionário eliminando das suas operações todos os tipos de perda. Todos os passos são registrados para que sejam repetidos de maneira uniforme por todos os operários em um ritmo de produção estabelecido que satisfaça a demanda.
A padronização é importante, pois permite ao operador repetir o ciclo de forma consistente ao longo do tempo. A determinação de uma rotina-padrão de operações evita que cada operador execute aleatoriamente os passos de um determinado processo, reduzindo as flutuações de seus respectivos tempos de ciclo (Ghinato 2000).
A seqüência de movimentos e tarefas necessárias para produzir uma peça é anotada numa ficha de trabalho padrão. Nela, pode-se identificar o tempo de ciclo, ou seja, o tempo decorrido entre o início da mesma operação em duas peças subseqüentes. Sendo assim, o operário deve executar os movimentos da maneira exata como descrita no documento e no tempo determinado. De acordo com (Bodek 2007) essa ferramenta é usada largamente no Japão, onde os supervisores estão sempre fazendo revisões e comparando com os vídeos obtidos dos postos de trabalho. O objetivo é verificar se há diferenças entre os movimentos realizados pelo trabalhador e aqueles descritos. Também, quando possível, se eliminam alguns movimentos desnecessários para deixar o operador mais eficiente. (Miltenburg 2000), ressalta que se deve buscar uma alta utilização do operário e nunca da máquina.
Nos anexos, encontra-se um exemplo de uma folha padrão de operações. Nela, existem nove atividades executadas por um único operador em sete máquinas diferentes acrescidas das atividades de carga e descarga da linha.
Eliminação da Causa do Problema
A Toyota considera inaceitável a correção de um erro através do retrabalho, já que essa atitude é insuficiente para a manutenção e melhoria do sistema. O STP orienta que em vez de corrigir o defeito, deve-se eliminar a causa do mesmo, pois só assim não haverá reincidência.
Círculo de Controle da Qualidade
Os Círculos de Controles de Qualidade (CCQ) tiveram origem no Japão por volta de 1962, criados pelo Professor Kaoru Ishikawa, como resultado de um impulso dado à qualidade na indústria japonesa e os conseqüentes contatos entre as universidades e os operadores de fábricas (Sato Consultoria de Pessoal 2008).
O CCQ é um pequeno grupo de funcionários voluntários que tentam melhorar a qualidade dos seus produtos ou do seu trabalho. Pode ser considerado como uma evolução da qualidade total na qual todas as pessoas são responsáveis pela qualidade, mesmo aquelas que trabalham em funções não diretamente relacionadas à produção.
Na sua filosofia, a qualidade não é apenas uma fabricação de acordo com as especificações. O CCQ busca a qualidade desde o projeto e se preocupa com a adequação do produto ao uso a que se destina. Espera-se que os programas da qualidade apontem para a perfeição; qualquer coisa inferior é considerada uma meta provisória a ser sucedida.
Melhoria Contínua
Também conhecida pelo termo japonês kaizen, é a melhoria incremental e cíclica de uma atividade com o objetivo de chegar à perfeição, ou seja, eliminação de todos os tipos de perdas. Essa ferramenta é uma importante base do sistema Toyota o que faz com que o mesmo esteja sempre progredindo e alcançando melhores resultados. Entre algumas de suas vantagens, podemos destacar o fato de os progressos serem implementados de maneira suave e muito mais freqüente que na maneira tradicional. Isso permite uma maior aderência da necessidade de eliminação das perdas na cultura do trabalhador o qual está sempre pensando em como aperfeiçoar suas atividades. Pelo fato de ser bastante freqüente, o custo associado à sua implementação é pequeno na maioria dos casos.
Manutenção Produtiva Total
A Manutenção Produtiva Total compreende um abrangente conjunto de atividades de manutenção que visam melhorar o desempenho, a confiabilidade e a disponibilidade dos equipamentos de uma fábrica. Nela, todos os funcionários estão envolvidos na cultura e nas atividades do TPM.
Segundo o Japan Institute of Plant Maintenance (JIPM) o TPM visa:
- Criar uma cultura corporativa que persiga constantemente a melhoria da eficiência do sistema produtivo;
- Construir um sistema para prevenir qualquer tipo de perda a fim de atingir o zero-acidente, zero-defeito e zero-falha em todo ciclo de vida de um sistema de produção;
- Abranger todos os departamentos, incluindo produção, desenvolvimento, marketing e administração;
- Exigir envolvimento completo, desde a direção até o chão de fábrica;
- Atingir perda-zero através das atividades de pequenos grupos.
TPM representa uma forma de revolução, pois conclama a integração total do homem x máquina x empresa, onde o trabalho de manutenção dos meios de produção passa a constituir a preocupação e a ação de todos (Nakajima apud Fernandes 2005).
Troca Rápida de Ferramentas
Para evitar a perda de superprodução, um dos tipos de perda mais danosos previsto pelo Sistema Toyota de Produção, é necessário produzir com lotes cada vez menores. Uma conseqüência direta disso é o aumento do número de setups. Sendo assim, o próprio Shingo desenvolveu um conjunto de técnicas para redução do tempo de setup, mais conhecidas como Troca Rápida de Ferramentas ou, em inglês, SMED (Single Minute Exchange of Die). Com elas foi possível a diminuição dos tempos de setup, que duravam horas, para quase inacreditáveis menos de dez minutos.
Just-in-Time
O método de produção mais comum é conhecido como produção empurrada (push production). Ele consiste em fazer uma previsão de demanda, fabricar os produtos, estocá-los e, por fim, vendê-los. Nesses casos, os estoques geralmente são altos para amenizar os erros de previsão e conseguir satisfazer a demanda.
O Just-In-Time (JIT) é uma técnica de produção puxada (pull production) na qual todos os outputs são feitos no momento certo, na quantidade exata e no local correto. Nela, montam-se os produtos de uma forma muito rápida, começando a produzi-los momentos antes da data em que os mesmos devem ser entregues e concluindo-os apenas no dia exato. Ou seja, vende, produz e não armazena.
Figura 2 - Produção empurrada versus produção puxada.
A comparação de tais métodos pode ser vista na figura 2. O fluxo de informações ocorre da esquerda para a direita. Na parte puxada, a origem da produção está nas previsões de vendas feitas pelo fornecedor que produz para estoque e depois entrega a mercadoria. No modelo puxado, a origem da produção está na ordem de compra do cliente que desencadeia uma série de "requisições e entregas" até chegar ao fornecedor, no início da rede logística.
Segundo (Dahlén apud Ghinato 1999), o sucesso do JIT, no entanto, depende, entre outros fatores, de uma mão-de-obra altamente motivada e principalmente multifuncional. De fato, essa multifuncionalidade é apenas um dos pré-requisitos para se obter a elevada flexibilidade de volume, de mix de produtos e de prazos de entrega diferentes requeridos pelo sistema.
Fluxo Contínuo
Figura 3 - Representação do fluxo intermitente.
Figura 4 - Representação do fluxo contínuo.
Takt-Time e Tempo de Ciclo
Heijunka
Figura 5 – Comparação da produção em grandes lotes com a produção nivelada.
De acordo com (Coimbra 2003), a Toyota dividiu o nivelamento em cinco partes diferentes:
Pitch-Time
Heijunka Box
Figura 6 - Programação do heijunka box.
Figura 7 - Programação do quadro de nivelamento com mais de um kanban por ranhura.
Kanban
De acordo com seu idealizador, (Ohno 1997), a funções do kanban são:
Tipos de Kanban
Os kanbans são divididos basicamente em dois grupos:
Figura 8 - Exemplo de um kanban de produção e de transporte.
Funcionamento do Kanban
Figura 12 - Funcionamento do kanban, passo quatro. Término do ciclo.
Cálculo do Número de Kanbans
K: quantidade de kanbans, D: demanda por minuto do produto relacionado, L: lead-time em minutos, α: fator de segurança, C: capacidade do container. |
Principais Desvantagens dos Kanbans
Diferentes Formas de Transmitir a Informação
A figura 13, apresentada a seguir, ilustrada cada um dos modelos citados acima.
Figura 13 - Diferentes formas do kanban.
Célula de Produção
Figura 14 - Redução do desperdício de transporte utilizando células de produção em "U".
Figura 15 - Diferentes movimentações dentro de uma célula em "U".
Polivalência do Trabalhador
Supermercados
Figura 16 - Acesso às prateleiras de um supermercado por dois tipos de corredores.
Figura 17 - As etiquetas utilizadas no supermercado têm sempre um kanban associado.
Abastecedor das Células de Produção
Uma lista de prioridades poderia ser:
Figura 18 - Circuito fixo realizado pelo mizusumashi.
Figura 19 - Divisão do percurso do mizusumashi para sincronizar com o pitch-time.
Sobre o simulador desenvolvido:
Arquitetura do Simulador
Logo no começo do desenvolvimento do projeto estabeleceram-se alguns requisitos acerca de sua concepção. Em primeiro lugar, o programa deveria ser escrito em uma linguagem de grande portabilidade, ou seja, acessado de qualquer lugar e com qualquer sistema operacional. Em vista disso, utilizou-se a linguagem JAVA™ juntamente com a função JAVA WEB START™ o que possibilita o acesso ao simulador através de qualquer navegador de internet seja utilizando o Windows XP™, Windows Vista™ Mac OS X™, ou até mesmo o Linux. Basta acessar um dos dois endereço da internet: http://www.luizfreire.com/simulator/ . Alguns segundos após um clicar no botão launch application, obterá a tela inicial do programa apresentada via figura 20. A única limitação do sistema é uma resolução gráfica mínima de 1024x768 pixels a qual só não é obtida em placas gráficas e monitores muito antigos.
Apesar do paradigma de que os programas desenvolvidos em JAVA™ fossem mais lentos que os feitos em C++™, a mesma foi suficiente para alcançar muito mais que os trinta quadros por segundos requeridos para a simulação visual.
Sem entrar nos pormenores técnicos, o Pull Simulator baseou-se na metodologia da simulação por eventos discretos. Isso quer dizer que se gera um evento inicial que desencadeia vários outros eventos que são ordenados numa lista pelo critério de tempo mais cedo de acontecimento.
Outra rotina, responsável pela execução e avanço do tempo do simulador, remove os eventos dessa lista um a um. Caso o tempo definido no evento seja maior que o tempo atual da simulação, o tempo da simulação avança para o tempo do evento de forma discreta, sem interessar os tempos entre os eventos, onde nenhuma alteração no sistema é realizada.
Simultaneamente a essas duas rotinas, ocorre o desenho na tela de todas as entidades do sistema usando uma interpolação linear de dois pares de coordenadas escolhidos por uma função.
Outra característica chave do simulador é o fato de se poder fazer alterações nos parâmetros utilizados, assim como adicionar e remover produtos através de janelas, sem precisar alterar uma única linha do código fonte.
Por fim, as variáveis da simulação podem ser exportadas para um arquivo e importadas posteriormente de modo que o experimento possa ser repetido várias vezes e por diferentes pessoas, bastando apenas enviar-lhes o arquivo com a extensão *.sim exportado.
Vantagens e Limitações da Simulação Visual Interativa
A escolha por uma simulação visual interativa (SVI), cuja vista principal está apresentada na figura 21, adiciona algumas vantagens ao software desenvolvido. São elas:
- Facilidade de detectar erros nas rotinas e eventos do programa;
- Reforça a componente didática do simulador;
- Melhor compreensão do sistema real;
- O conhecimento obtido no desenvolvimento do modelo freqüentemente sugere mudanças no próprio sistema que está a ser simulado;
- Permite identificar os gargalos e a entender por que eles acontecem;
- Grande flexibilidade para analisar mudanças no sistema, mesmo as de caráter estrutural.
- O utilizador pode assistir à evolução do modelo ao longo do tempo
- Novas políticas, procedimentos operacionais, regras de decisão, estruturas organizacionais, fluxos de informação, etc., podem ser explorados sem provocar distúrbios nos processos em uso;
- O fator tempo pode ser controlado, isto é, pode ser expandido ou comprimido, permitindo aumentar ou diminuir a velocidade a fim de se estudar um fenômeno;
Os aspectos negativos são a maior demora e maior complexidade para escrever o código fonte e desenhar as imagens.
Figura 21 - Tela principal da simulação. Clareza na identificação das
entidades e animação detalhada.
Características Funcionais do Simulador
O Pull Simulator pode ser usado por diferentes pessoas sob várias perspectivas. A primeira delas é o entendimento teórico do funcionamento do Mizusumashi em relação ao método tradicional de abastecimento das células de produção. A possibilidade de visualizar todos os movimentos na tela, congelá-los e escolher a velocidade de simulação ajuda bastante na construção do conhecimento teórico por parte do aluno. O professor, ao utilizar o simulador em sala de aula, além de motivar os alunos ao fornecer uma ferramenta didática, torna os conceitos apresentados na revisão bibliográfica muito mais claros.
Para aqueles que já detêm o conhecimento teórico da produção enxuta, o simulador é uma oportunidade de estudar a alteração no comportamento do sistema ao mudar uma variável. Por exemplo, pode-se alterar o tempo de ciclo do Mizusumashi e observar os seus efeitos. Ou ainda, pode-se reduzir o tempo de operação de cada atividade para saber em qual delas existe um ganho real.
Na abordagem da investigação científica o pesquisador tem uma ferramenta de confronto de métodos distintos de abastecimento do bordo de linha para uma situação. Nesse aspecto o Pull Simulator permite medir o percentual de viagens do abastecedor com cargas e em vazio, mostra o total da distância percorrida em cada um dos casos e exibe o número de caixas e kanbans movimentados.
No ambiente produtivo real, o Pull Simulator pode ser usado para saber se um determinado plano de produção pode ser atingido ou quantas mudanças de séries uma linha de produção pode fazer. Ainda mais, baseando-se no método de tentativa e erro, o usuário pode calcular o número mínimo de kanbans para que não haja ruptura no estoque, assim como estimar o tamanho do lote ideal.
Ao final da simulação ainda são mostrados vários tipos de relatório que incluem:
- Atrasos nas entregas dos pedidos;
- Número de setups realizados por produto;
- Distância percorrida com carga e em vazio e total de material movimentado;
- Estoque inicial, produção no período e estoque final;
- Quantidade encomendada versus quantidade produzida;
- Gráfico de distribuição do tempo do mizusumashi na execução das diversas atividades;
- Gráfico de utilização da capacidade produtiva;
- Gráfico da evolução do estoque de produtos acabados ao longo do tempo;
- Gráfico da carga de produção ao longo do tempo para cada uma das células.
- Gráfico com o custo de manutenção do estoque.
Simplificações e Considerações na Construção do Simulador
Tendo em vista que é impossível simular um ambiente real com toda a sua complexidade, o objetivo deste tópico é de listar as simplificações feitas em relação a um sistema produtivo real para que fosse viável a sua simulação.
Em relação ao supermercado de matérias-primas considerou-se que os mesmos eram automaticamente reabastecidos com um nível de serviço de 100%. Ou seja, foram desconsideradas as seguintes situações:
- A quebra dos contentores;
- As perdas de peças dos contentores que podem cair no chão durante a movimentação dos mesmos;
- O encravamento das caixas nas estantes dinâmicas do supermercado;
- A perda de contentores e de kanbans;
- O absenteísmo dos encarregados pelo reabastecimento do supermercado (repacking);
- A falta de material no repacking;
- Possibilidade de enchimento do retorno de caixas vazias.
Acerca do mizusumashi, foram ignoradas as seguintes situações:
- Variação da velocidade nas partidas e paradas;
- Influência da carga de cada um dos vagões na velocidade final;
- Aparecimento de algum obstáculo no meio do percurso que causasse algum atraso como um contentor em local inadequado, trânsito de empilhadeiras e outros mizusumashi, atravessamento de pedestres, entre outros;
- Realização de alguma atividade não prevista;
- Cansaço ao longo da jornada de trabalho;
- Troca de veículo por falta de combustível ou bateria ou outra avaria;
- Colisão com qualquer outro objeto;
- Restrição da capacidade de carga;
- Descarrilamento de algum dos vagões.
Como as células de manufatura eram apenas uma parte necessária para completar o fluxo de materiais, tais entidades foram programadas para funcionar apenas com as mínimas informações necessárias que são:
- Tempo de preparação da linha para produzir um produto diferente;
- Tempo de ciclo para cada referência produzida;
- Associação do produto acabado com uma única célula que o produz;
- Disponibilidade de matéria-prima para começar a produção.
Complementando a simulação, temos as seguintes simplificações: as áreas de estoque são ilimitadas, o setor de expedição está sempre disponível, os pedidos de venda são feitos com antecedência e nunca são retirados depois de aceites.
Apesar de parecerem bastante numerosas, as imposições feitas na programação do simulador não prejudicam de forma significativa o seu desempenho. Tais ocorrências relacionadas nas listagens acima são pouco freqüentes ou só ocorrem em processos não estabilizados. Em relação a esse último ponto deverão ser feitas melhorias e normalizações antes de se afinar o sistema utilizando a simulação. Já para o caso dos evento de menor freqüência foi acrescentado um campo de desvio padrão para cada atividade de forma a mitigar tais efeitos no resultado final.
De forma que fique transparente o efeito de tais considerações feitas no simulador, abaixo segue uma tabela com impacto causado numas das principais variáveis de análise no Sistema Toyota de Produção, as perdas.
Tabela 1 - Impacto das simplificações do simulador na análise das sete perdas do STP.
Impacto das Simplificações do Simulador na Análise das Sete Perdas do STP | ||
Perdas Consideradas: | Perdas que Poderão ser Implementadas: | Perdas Não Consideradas: |
Perda por superprodução (por quantidade e por antecipação); | Perda por fabricação de produtos defeituosos. | Perda por movimentação; |
Perda por transporte; | Perda no próprio processamento; | |
Perda por estoque; | Perda por espera; |
Configuração e Principais Variáveis do Simulador
Logo que se inicia o Pull Simulator, aparecem duas abas de configuração dos parâmetros. A localizada mais à esquerda, que pode ser observada na figura 22, é referente à inclusão de até 10 produtos a serem fabricados. A outra aba contém as variáveis referentes ao método da simulação, definição das distâncias e tempos de realização de cada atividade.
A compreensão de cada variável do sistema é bastante importante antes de se fazer qualquer simulação, pois de nada adianta analisar os resultados de uma situação mal parametrizada.
Começando pelo menu dos produtos temos os seguintes campos:
- Product Name: meramente informativo para diferenciar o produto dos demais. Com isso, o produto poderá ser referenciado pelo seu nome, uma letra de A a J ou pela cor (vermelho, verde claro, verde escuro, azul, amarelo, laranja, marrom, cinza, violeta ou roxo). As cores são bastante importantes para a identificação visual de cada produto
durante a animação;
- Pack out Quantity: é quantidade de produtos que podem ser produzidos com cada contentor que o mizusumashi leva para a célula de produção. Ou seja, se um relógio é digital é montado com um visor, duas pulseira e quatro botões iguais e o valor do pack out quantity for igual a vinte, cada contentor levado ao bordo de linha pelo abastecedor contém vinte visores, quarenta pulseiras e oitenta botões. Além disso, embora não seja representado na tela devido ao detalhamento gráfico exigido, o mizusumashi já deixa cada material no local apropriado para o consumo de modo que o operário da linha não perca tempo procurando peças ou organizado a disposição dos materiais no posto de trabalho;
- Batch Size: corresponde ao número de kanbans de produção que devem ser juntados para disparar uma ordem de fabricação do produto. O valor do tamanho do lote nunca deve ser maior que o total de kanbans em circulação, pois assim a ordem de produção nunca será disparada. Um lote grande significa menos mudanças na linha de produção, contudo, aumenta a probabilidade de ocorrerem rupturas enquanto o lote está sendo formado. A diferença entre o total de kanbans e o tamanho do lote é igual ao estoque de segurança.
- Box/Pallet: significa a quantidade de caixas de produtos acabados que completam uma palete. Para se ter a quantidade final de itens por palete, deve-se multiplicar tal valor pelo pack out quantity.
- Initial Stock: quantidade de caixas de um produto disponível no estoque de produtos acabados (product store) prontos para expedição. Este valor deve ser menor que o número de kanbans de produção, uma vez que cada caixa neste armazém está associada a um kanban que só será posto no quadro de formação de lote após a sua retirada para o setor de expedição.
- Production Kanbans: este campo define a quantidade kanbans de produção de cada produto. Esses kanbans são utilizados para repor o estoque de produtos acabados e tem relação direta com o tempo de produção em cada uma das células e o tamanho do lote.
- Repacking Time: tempo necessário para encher cada contentor vazio no supermercado. Caso o mizusumashi chegue ao supermercado e o material não tenha sido reposto, ocorrerá um atraso na sua saída. Na prática, geralmente o mizusumashi não espera pelo produto e inicia o ciclo no tempo correto, mesmo que não reabasteça aquela célula em particular. Entretanto, como o reabastecimento do supermercado sempre conta com a disponibilidade de todos os itens para o repacking, o trem logístico nunca irá ser prejudicado. A única exceção é quando a soma do tempo necessário para encher das caixas do supermercado é superior ao tempo de ciclo do mizusumashi.
- Setup Time: tempo gasto por um posto de trabalho sempre que começa a produzir um produto diferente. Durante esse período não há produção.
- Cycle Time: tempo que cada operário gasta para realizar as suas operações num determinado tipo produto. Por exemplo, se temos seis operários por célula e cada um tem um tempo de ciclo de quarenta segundos, isso quer dizer que são gastos quatro minutos de mão-de-obra para montar cada unidade. No simulador, os postos de trabalhos são considerados sempre balanceados.
- Workcell: pode-se escolher um dos seguintes valores: 1, 2 ou 3 que são referentes à numeração das três células de fabrico. Uma vez associado, o produto só será feito naquela célula.
- Sale Price: valor de venda do produto para estimar as receitas no período.
- Holding Costs: custos de manutenção mensais dos estoques por caixa de produto.
- Add Order: é um menu para adicionar pedidos de venda. As quantidades das entregas só podem ser múltiplas das quantidades por palete. O usuário deve escolher uma hora de entrega dentro do turno de produção para que a ordem seja adicionada ao heijunka box.
No segundo menu, representado na figura 23, relativo às configurações do chão de fábrica, há um botão de grupo para escolher o modo da simulação: a primeira delas usa a abordagem tradicional de abastecimento da linha de produção com empilhadeiras ou carrinhos manuais de transporte. Já a segunda opção gera uma simulação cujas células de produção são abastecidas por um mizusumashi, conforme descrito na revisão literária.
Figura 23 - Menu de configuração do chão de fábrica.
Em seguida existe um conjunto de campos para se colocar a hora de início e fim do turno a ser simulado. Optou-se por limitar o tempo da simulação a um único turno devido ao fato de que nas mudanças de turnos o mizusumashi passar a percorrer um circuito diferente. Essa mudança da rota de turno para turno é bastante comum e acontece por causa das diferenças nas cargas de trabalho deles.
No separador number of Workstation pode-se definir quantos postos de trabalho cada célula possui. O valor pode variar de um a treze, contudo, vale ressaltar que, na maioria dos casos, tais valores raramente são maiores que quatro.
Figura 24 - Configuração da tabela com as distâncias da simulação.
No lado direito do menu há um separador com o nome simulation config que contém uma caixa de seleção na qual o usuário poderá definir se deseja visualizar a animação ou ir direto para os resultados. Neste separador ainda existe um campo para definir a data de início da simulação assim como a quantidade de dias a simular.
Por fim, pode-se definir o pitch-time do heijunka box e a velocidade da animação.
Complementando os dados em comum aos dois ambientes de simulação, existe a aba travel localizada mais abaixo. Além dos campos que definem a velocidade do abastecedor para cada um dos modos de simulação, esta aba contém uma matriz simétrica com as distâncias em metros entre os principais pontos da área de produção, tal como se mostra na figura 24. Esse conjunto de dados é usado no cálculo para o deslocamento do mizusumashi ou empilhador.
Simulação no Modo da Próxima Atividade
Como já se sabe, o Pull Simulator permite escolher qual método de abastecimento das linhas de produção deverá ser utilizado. O primeiro deles, o método da próxima atividade, baseia-se em um movimentador de materiais dirigindo um pequeno carro de cargas que pode ou não ser motorizado. Isso se deve ao fato da ênfase da simulação ser na redução do desperdício e não no aumento da velocidade média de transporte.
Nesta modalidade o empilhador sempre deve verificar qual é a próxima atividade a fazer, julgá-la de acordo com uma lista de prioridades e executar a que tiver mais urgência. À primeira vista parece um pouco complicado fazer esse procedimento complexo, no entanto o operário termina por se acostumar. Às vezes, pode acontecer de uma atividade com menos prioridade ser executada antes de uma mais urgente, mas esse caso não foi considerado na simulação.
Uma vez conhecido o modo de seleção da próxima atividade a ser executada, explica-se agora em que consiste cada uma delas na ordem decrescente de prioridade.
- Retirar kanbans do heijunka box: é a atividade desencadeadora do restante dos eventos e também a de maior prioridade. Ela consiste em ir à caixa de nivelamento nos horários pré-determinados e remover os kanbans referentes àquela coluna. Em caso de existir algum kanban em colunas representadas por um horário inferior ao atual, os mesmos devem também ser removidos.
- Retirar produtos acabados do armazém: após ter retirado os kanbans de transporte, o abastecedor deve ir ao Product Store e retirar uma caixa de produto acabado para cada kanban que tiver na mão. Na hipótese de não haver material, o mesmo deverá colocar o cartão de movimentação na caixa de rupturas. Outra atividade a ser feita paralelamente a esta é pegar o cartão de produção da mercadoria utilizada e fixá-los na caixa de construção de lote.
- Entregar mercadoria no setor de expedição: seguidamente à atividade anterior, o transportador deixa as caixas de produto acabado nos paletes localizados na área de expedição.
- Comandar a produção: como foi dito anteriormente, o abastecedor de materiais também é responsável pela transmissão da informação no chão de fábrica. Dessa forma, toda vez que se forma um lote de produção no quadro de construção de lote, o conjunto de kanbans é levado ao supermercado onde ocorrerá a separação de materiais. Depois, tanto os kanbans como os materiais são entregues no seqüenciador da célula de produção onde estarão à espera de sua vez para serem produzidos na mesma ordem em que foram entregues.
Transportar a produção das células para o armazém: uma vez manufaturados, os produtos são postos na saída da linha e ficam à espera do empilhador para serem transportados para o armazém de produtos acabados (product store). Contudo, se o produto montado estiver em ruptura, o mesmo é levado diretamente para o setor de expedição, somente no caso de haver alguma sobra é que se leva o material para o armazém.
- Transportar caixas vazias de volta para o supermercado: as caixas com os kanbans entregues no bordo de linha são levadas de volta para o supermercado assim que se esvaziam. Lá, são postas nos retornos e reabastecidas nas estantes pelos funcionários do repacking.
No desenvolvimento do configurador dos tempos das atividades, optou-se por subdividir alguns tempos dessas atividades. Essa modelagem foi considerada a ideal, pois além da distância que o operário precisa percorrer entre os pontos da fábrica, em várias tarefas é necessário repetir apenas uma fração da mesma para se obter o mesmo resultado. Por exemplo, para se entregar duas caixas na área de expedição o tempo é significativamente menor que dobro do tempo de entregar uma só caixa.
As subdivisões das atividades são as seguintes:
Heijunka Box:
- Pickup Kanbans: tempo gasto para retirar todos os kanbans de uma coluna da caixa de nivelamento.
- Tolerance Time: não se aplica.
BatchBoard:
- Add/Remove Kanban: intervalo de tempo necessário para colocar o kanban no quadro de formação de lotes ou no quadro de rupturas. O tempo de remoção foi considerado igual.
Forklift:
- Move Among Pallets: no setor de expedição, o tempo de se mover de uma palete de um produto para a próxima é representada por essa variável.
- Move Inside Supermarket: tempo para os deslocamentos realizados dentro dos supermercados das várias famílias.
Material Handling:
- Add/Remove Box to Product Store: duração das atividades de retirar ou deixar uma caixa de produto acabado no armazém e trocar o kanban de produção com o kanban de movimentação.
- Add/Remove Product Box to Pallet: uma vez na área de expedição, estacionado no local correto, esse campo contém os segundos gastos para tirar uma caixa do carro e colocá-la na palete.
- Add/Remove Container Batch: tempo gasto para carregar/descarregar um conjunto de contentores vazios no carro.
- Add/Remove Production Kanban Lot to Batchboard: tempo gasto para depositar o lote de kanbans no supermercado para que o setor de repacking separe o material.
- Move Kanban Lot From BatchBoard to Supermarket: quando um lote é formado, o tempo para colocar os kanbans no seqüenciador para o repacking é definido por este campo.
- Move ContainerBatch From Supermarket to Chute:
tempo gasto para levar um lote de contentores cheios de materiais para o seqüenciador das células.
- Move
ContainerBatch From Chute to WorkCell: tempo de retirar o lote de contentores do seqüenciador e colocá-los em posição adequada para o uso na linha de montagem. Atividade realizada pelo operários da célula.
Todos os tempos devem ser inseridos em segundos, estando representados na figura 25.
Simulação no Modo do Circuito Fixo
Esta segunda abordagem do tipo de movimentação do material no chão de fábrica e transmissão da informação é mais simples que a anterior uma vez que as tarefas são feitas conforme um ciclo pré-estabelecido, sempre na mesma ordem. Ao chegar a um ponto de parada, o mizusumashi verifica se precisa fazer alguma atividade e a realiza se for o caso. Se não for preciso, vai para a próxima parada do ciclo.
O maior benefício desse método, além da redução das perdas por deslocamento, é a normalização das operações do abastecedor. Isso permite calcular quantas caixas deve haver em cada posição do bordo de linha para que não falte material durante o período de duas passagens consecutivas do mesmo. Ou seja, um ciclo para retirar a caixa vazia e outro para devolvê-la cheia. Dessa forma não há material em excesso nem parada da linha por falta de abastecimento.
Nesta abordagem pode-se facilmente saber se um mizusumashi é suficiente para entregar os materiais num determinado grupo de células ou não. Para tal, basta saber se o mesmo está completando uma volta no tempo pré-estabelecido ou não.
A norma do ciclo do abastecedor foi definida na programação e não pode ser alterada, exceto o tempo disponível para cada volta, que pode ser ajustado no campo pitch-time na tela inicial. O circuito tem início na saída do supermercado nas horas indicadas na caixa de nivelamento. Em seguida o trem logístico pára em cada célula de produção, recolhe as caixas de produto acabado, coloca os kanbans de produção no seqüenciador, abastece a célula e retira os contentores vazios.
Depois segue para o heijunka box e recolhe os kanbans de movimentação. A seguir vai para o armazém de produtos acabados deixa as caixas produzidas nas células e retira aquelas que vão ser expedidas. Caso algum produto que estava em falta tenha sido fabricado, um kanban do quadro de rupturas é retirado para ser entregue também no setor de expedição. Ele é responsável também por completar a caixa de construção de lote com os kanbans de produção em mão e retirar os lotes completados.
Na parada seguinte, deixa as caixas que vão ser expedidas nos seus respectivos paletes e segue de volta para o supermercado onde vai deixar os vagões vazios e atracar os vagões abastecidos. Por fim, espera que termine o tempo do ciclo para iniciar o seguinte.
Figura 26 - Menu de ajuste de tempo das atividades com campos de
média e desvio padrão na modalidade do circuito fixo.
Nesta abordagem, os parâmetros com os tempos das atividades, representados na figura 26, são os seguintes:
Heijunka Box:
- Pickup Kanbans: tempo para remover os kanbans de movimentação da caixa de nivelamento.
- Tolerance Time: caso o mizusumashi acumule atraso ao longo dos ciclos, ele poderá retirar os kanbans de movimentação de duas ranhuras do heijunka box. Isso pode acontecer desde que a hora da segunda coluna seja inferior à hora atual somada ao tempo de tolerância.
Batchboard:
- Add/Remove Kanban: tempo para colocar um kanban de produção no quadro de construção de lotes.
Mizusumashi:
- Delay Time to Check Tasks: atraso sofrido durante um ciclo ao chegar a uma parada que não necessita de atividades a serem feitas.
- Change Tow Tractor Wagon: tempo decorrido entre o desatrelar dos vagões vazios e atrelamento dos vagões abastecidos.
Material Handling:
- Add/Remove Container: tempo para entregar ou recolher um contentor cheio ou vazio na célula de produção.
- Add/Remove Production Kanban Lot: tempo necessário para retirar um lote formado no quadro de construção de lotes ou colocar um lote de kanbans no seqüenciador da célula.
- Add/Remove Remove Box to Workcell: tempo gasto na recolha dos produtos acabados na célula de produção.
- Add/Remove Box to Product Store: tempo para descarregar ou carregar uma caixa de produto acabado no armazém e fazer a troca de kanbans.
- Add Product Box to Pallet: tempo gasto para retirar uma caixa de produto acabado do carro e colocá-la na palete.
- Get Container from Workcell Buffer: tempo para colocar um contentor de materiais que estava no bordo de linha na posição de utilização. Atividade realizada pelo operários da célula.
Todos os tempos cujos campos de preenchimento são mostrados na figura 26 devem ser inseridos em segundos.
Comentário acerca das variáveis dos dois métodos
Embora haja muitas variáveis semelhantes, as telas de parametrização de cada um dos métodos não são idênticas. As mudanças são decorrências das diferentes formas de realizar as atividades em cada um dos modelos.
Além disso, os parâmetros que se referem a uma mesma atividade podem ter valores diferentes para cada um dos modos de simulação. As causas podem estar na diferença do método de execução da tarefa ou nas conseqüências físicas do deslocamento de um comboio grande, no caso do mizusumashi, contra uma pequena empilhadora, no caso do forklift.
Por exemplo, podem existir diferenças nos valores das variáveis de carregamento e descarregamento de um produto na palete ou no Product Store. No modelo do empilhador, a descarga do material é aleatória e os movimentos acumulam muito desperdício. Já no modelo do mizusumashi, a descarga é feita de forma otimizada. Esse ganho de tempo, exemplificado na figura 27, deve-se ao fato de o mizusumashi realizar um circuito fixo que permite aos vagões do comboio pararem sempre na melhor posição para o operador. Observe que as setas do caminho feito pelo water-spider não se cruzam e são bem menores.
Figura 27 - Exemplo da diferença entre os deslocamentos do mizusumashi e do empilhador
para realizar uma mesma atividade de expedição de três caixas.
Uma das maiores desigualdades entre os métodos está na quantidade de peças movimentadas por vez. Enquanto o mizusumashi realiza a tarefa item por item, o empilhador realiza a movimentação em lotes. Por isso a diferença nas descrições de Container para Container Batch.
Outra variante está no campo tolerance time que só faz sentido ser utilizado no método do circuito fixo.
Por fim, encontram-se as tarefas que são exclusivas de cada um dos modelos. Embora já tenham sido explicados anteriormente, vale a pena citá-los:
- Mizusumashi:
"delay time to check tasks", "change tow tractor wagon";
- Forklift:
"move among pallets", "move inside supermarket".
Figura 28 - Quadro resumo da simulação.
Resultados Obtidos Através do Simulador
Depois de ter introduzido os conceitos teóricos e explicado o funcionamento do simulador, o presente capítulo tem o intuito de demonstrar alguns resultados relevantes obtidos com o uso do Pull Simulator.
No final de cada simulação é apresentada uma tela semelhante à figura 28, que contém os resultados e seis gráficos diferentes. Existe também uma caixa de texto na lateral esquerda com um resumo das entregas, vendas e produção referentes a cada tipo de produto. Embaixo de cada gráfico há um botão que quando clicado mostra mais detalhes sobre o tópico representado por eles:
- Mizusumashi ou empilhador: apresenta um gráfico em forma de pizza na qual cada fatia representa um tipo de atividade realizada pelo mizusumashi. Numa tabela ao lado são mostrados os totais de caixas, contentores e kanbans movimentados. A distância total percorrida assim como a sua divisão em deslocamento carregado e em vazio também são apresentados.
- Célula de manufatura: mostra um gráfico em forma de pizza para cada linha de produção mostrando o tempo gasto na montagem de cada tipo de produto e em setups. Também quantifica o período que ficou à espera de material para começar a produzir (starving) e quanto ficou à espera que o posto seguinte finalizasse o trabalho para repassar a próxima peça (blocked). Por fim, informa o número de setups efetuados.
- Estoque de produto acabado: apresenta um gráfico em duas dimensões da quantidade em estoque no armazém de produtos acabados ao longo do tempo.
- Estoque de produto acabado Valorizado: semelhante ao anterior, residindo a única diferença na multiplicação das unidades em estoque pelo seu preço de venda.
- Carga nos seqüenciadores: mostra quantos itens havia nos seqüenciadores do repacking aguardando serem abastecidos e em cada célula aguardando por produção.
- Custos de manutenção de estoques: apresenta o custo final de armazenamento de cada produto.
Um exemplo de cada gráfico se encontra no anexo B.
Comparação do Empilhador com o Mizusumashi
Ao simular um turno de oito horas de produção com três células funcionando de acordo com os seguintes dados:
Tabela 2 - Procura do turno simulado no cenário 1.
Cenário 1: Procura do Turno Simulado | ||
Célula | Produto | Procura (unidades) |
Célula 1 | Produto A | 100 |
Célula 1 | Produto B | 80 |
Célula 2 | Produto H | 144 |
Célula 3 | Produto F | 768 |
Tabela 3 - Dados complementares do cenário 1.
Cenário 1: Dados Complementares | ||||||||
Produto | Quantidade / Caixa | Tamanho do Lote | Caixa / Palete | Estoque Inicial (em Caixas) | Número Kanbans | Tempo de Repacking | Tempo de Setup | Tempo de Ciclo |
A | 10 | 3 Caixas | 5 | 4 | 6 | 00:00:12 | 00:10:00 | 00:01:30 |
B | 8 | 2 Caixas | 10 | 8 | 10 | 00:00:20 | 00:08:00 | 00:01:40 |
F | 24 | 7 Caixas | 8 | 12 | 14 | 00:00:05 | 00:05:00 | 00:00:45 |
H | 12 | 4 Caixas | 6 | 0 | 8 | 00:00:14 | 00:10:00 | 00:02:15 |
Relatório da Simulação Utilizando o Empilhador
Os resultados mostraram que o empilhador fez 97 movimentações de caixas, 62 movimentações de contentores e 188 movimentações de kanbans.
Além disso, constatou-se que o empilhador viajou uma distância total de 13920 metros dos quais 6.840 metros (49%) foram deslocamentos sem carga. Ou seja, ouve um desperdício de quase metade do tempo de deslocamento do funcionário. Além disso, teve uma folga de 67 minutos.
No relatório da distribuição da atividades, mostrado na figura 29, pode-se verificar que o empilhador gastou 34,22% do tempo expedindo produtos acabados, 23,56% reabastecendo as células de produção, 18,10% reabastecendo o supermercado, 10,20% recolhendo caixas vazias e ficou 13,92% parado.
Figura 29 - Distribuição do tempo do empilhador pelas atividades realizadas.
Relatório da Simulação Utilizando o Mizusumashi
Já os números em relação ao trabalho do mizusumashi mostraram que o mesmo movimentou 64 caixas 45 contentores e 190 kanbans. Percorreu 7420 metros dos quais 30% em vazio. Além disso, teve uma folga de 97 minutos.
O operador completou 32 voltas distribuídas ao longo do turno. É comum existir uma volta mais demorada por coincidir um maior número de materiais a serem movimentados num único ciclo. Esta volta, chamada de "Ciclo Crítico", foi concluída com 25 minutos e 4 segundos, uma variação aceitável para um pitch-time de 20 minutos.
Figura 30 - Distribuição do tempo do mizusumashi pelas atividades realizadas.
Ao analisar o tempo gasto em cada atividade do mizusumashi pelo gráfico gerado pelo simulador mostrado na figura 30, constata-se que o mesmo ficou 19,89% do tempo parado. Além disso, gastou 35,88% do tempo expedindo produto acabado, 21,28% reabastecendo as células de produção, 5,69% reabastecendo o supermercado e 17,36% trocando os vagões a serem transportados. Desses resultados, destaca-se a redução do tempo gasto em reabastecer o armazém (product store) de 18% para 5% devido à otimização dos movimentos realizados.
Empilhador x Mizusumashi
Figura 31 - Resumo da utilização das células de produção.
Em ambos os casos as linhas conseguiram produzir tudo o que estava programado. O atraso na entrega do material às células de produção não comprometeram a entrega das encomendas.
Entretanto, observando o relatório da simulação mostrado na figura 31, pode-se constatar que a utilização da capacidade das células 1 e 3 foram de 78,14% e 84,19% respectivamente. Em caso de carga total no sistema, a folga do empilhador poderá não ser suficiente para abastecer às células e para a entrega do produto acabado na expedição com mais freqüência.
Do ponto de vista de movimentação de material pelos abastecedores, os números apontam para uma grande vantagem do mizusumashi em relação ao empilhador. A forma sistemática de trabalho do mizusumashi fez com que o mesmo tivesse menos desperdício, movimentando os materiais de forma correta e perdendo apenas 31 minutos em deslocamento contra 77 do empilhador (ver quadro abaixo).
Embora o mizusumashi tenha ganhado 77 – 31 = 46 minutos no fator de deslocamento, o empilhador gastou menos tempo com carga e descarga de material. Essa ligeira desvantagem pode ser notada na redução da diferença do tempo de descanso entre ambos. Ou seja, o empilhador deveria ter ficado parado 46 minutos a menos que o mizusumashi para compensar o excesso de deslocamento realizado, mas como ganhou algum tempo ao fazer a carga e a descarga do material em lotes, a diferença caiu para 30 minutos.
As perdas do empilhador não se limitam aos 30 minutos no final da jornada, às mesmas são somados o gasto extra de energia e desgaste da empilhadeira para percorrer os 6500 metros em excesso todos os dias.
Na simulação ainda não foram considerados pontos subjetivos que trazem algumas vantagens ao mizusumashi que são difíceis de mensurar. Entre elas podemos destacar:
- O aumento da segurança por estabelecer uma rota padrão para o deslocamento de máquinas no chão de fábrica;
- Os erros causados pela realização de uma tarefa com menos prioridade antes que uma mais crítica. Por exemplo, uma célula pode ficar preciosos minutos parada por falta de abastecimento porque o empilhador foi levar mais material para a expedição;
- A entrega do material em um local errado;
Tabela 4 - Quadro resumo da comparação mizusumashi e empilhador.
Resumo da Comparação Mizusumashi x Empilhador | ||||
Variável Observada | Unidade | Mizusumashi | Empilhador | Perda Adicional do Empilhador |
Distância Percorrida | Metros | 7420 | 13920 | 88% |
Movimento em Vazio | Metros | 2226 | 6840 | 207% |
Movimentações de Caixas | Unidades | 64 | 97 | 51% |
Movimentações de Contentores | Unidades | 45 | 62 | 38% |
Movimentações de Kanbans | Unidades | 190 | 188 | 0% |
Tempo em Deslocamento | Minutos | 31 | 77 | 149% |
Tempo de Carga e Descarga | Minutos | 352 | 336 | -5% |
Parado (Descanso) | Minutos | 97 | 67 | -31% |
Por fim, é interessante ressaltar que o cenário em análise foi baseado numa fábrica em que a distância entre o supermercado e a linha de produção é muito pequena. É bastante comum encontrar rotas de mizusumashi que são até três vezes maiores que essa. Nesses casos os resultados seriam ainda menos favoráveis aos empilhadores.
Na situação em análise, o empilhador que tem uma velocidade média de 3 metros por segundo, gastou 77 minutos para percorrer os 13920 metros no turno. Já o mizusumashi, que possui uma velocidade média mais alta, de 4 metros por segundo, gastou 31 minutos em deslocamento.
Por exemplo, considerando que as distâncias fossem duas vezes maiores, o mizusumashi teria de percorrer outros 7420 metros, gastando para isso mais 31 minutos. Mesmo assim, ainda teria uma folga de 66 minutos para descansar ao longo do dia. Já o empilhador teria uma situação muito mais desconfortável, iria passar de uma folga de 67 minutos para um atraso de 10 minutos por turno. O atraso no abastecimento do material seria inevitável e o output da produção seria menor.
Conclusões e perspectivas de trabalho futuro
Chegando ao fim da dissertação, o leitor percebeu que tanto a revisão literária quanto o desenvolvimento do texto foram escritos numa linguagem simples acompanhada de diversas ilustrações para que qualquer pessoa pudesse facilmente compreender todos os tópicos. Essa componente didática foi propositadamente reforçada uma vez que o simulador é uma ferramenta interativa dos alunos e profissionais aprenderem, de forma autodidata, como acontece o abastecimento às células de produção e a interferência que cada uma das variáveis causa ao sistema.
O desenvolvimento do motor da simulação visual e interativa foi a parte que mais consumiu tempo no projeto. O software foi concebido baseado no modelo schedule-execute, criado pelos orientadores António Brito e José Barros Bastos, ao qual foi adicionado uma componente de animação bastante intuitiva. Depois, o algoritmo passou por uma fase de testes, simulando o comportamento das filas nos refeitórios da Universidade do Porto (vide anexo D).
A sua simplicidade, robustez e fácil compreensão permitem que seja utilizado como base de várias simulações em JAVA®. Esse fato reduzirá de forma considerável o tempo de desenvolvimento de novas simulações interativas pelos iniciantes na programação por computador.
Todo o material está publicado na internet de forma gratuita para que os professores utilizem esta ferramenta em sala de aula e despertem interesse nos jovens de criar novos cenários e até mesmo em construir os seus próprios simuladores.
Na perspectiva do desenvolvimento teórico, foi analisada a importância do abastecedor das células de produção na eliminação do desperdício dos operários. Estudaram-se os dois métodos mais comuns de abastecimento de forma qualitativa e quantitativa para uma determinada situação de logística interna.
Concluiu-se que o modelo com o mizusumashi é mais fácil de ser gerido porque não é necessário tomar decisões sobre qual a próxima tarefa a ser executada, nem estabelecer uma lista de prioridades das requisições de abastecimento. Ainda mais, pode-se medir o seu atraso ou folga observando as horas em que ele passa pelo heijunka box. Com o estabelecimento das normas de operação, é possível definir um circuito fixo e otimizado para ser repetido ao longo de todo o turno de trabalho.
Nos resultados do cenário simulado, o mizusumashi apresentou uma redução de 67% da distância percorrida sem cargas e eliminação de 42% do tempo gasto no deslocamento face ao modelo tradicional. Também conhecido como water-spider, ele abasteceu a mesma quantidade de material e ainda descansou 30 minutos por turno a mais que o empilhador.
Visando sofisticar o Pull Simulator, pretende-se adicionar à simulação diferentes métodos de trabalho do mizusumashi uma vez que o mesmo varia de indústria para indústria. Além disso, deseja-se adicionar mais variáveis às células de produção para saber o comportamento do sistema diante de quebras de máquinas, defeitos de qualidade e cansaço do operador. Com essas funcionalidades, a aplicação prática do simulador se dará de forma ainda mais realista.
Referências e Bibliografia
Alvarez, R. d. R. (2001). Takt-Time: Conceitos e Contextualização Dentro do Sistema Toyota de Produção. Gestão e Produção. Rio de Janeiro – RJ, Universidade Federal do Rio de Janeiro (UFRJ). 8: 18.
Bodek, N. (2007). LeanBlog Podcast #32 - Norman Bodek in Japan.
Chase, R. B., F. R. Jacobs, et al. (2006). Administração da Produção e Operações. São Paulo, McGraw Hill.
Coimbra, E. (2003). "Introdução à Logística Alternativa." Kaizen Forum
7.
Colin, E. C. (ano desconhecido). "Estudo da Implementação de Kanbans Numa Empresa de Autopeças: Dificuldades e Caminhos." Departamento de Engenharia de Produção - Escola Politécnica da Universidade de São Paulo.
Danni, T. d. S. (ano desconhecido). Ajuste Dinâmico de Kanbans de um Sistema Produtivo JIT através da Simulação Pós-Graduação em Engenharia de Produção. Florianópolis, Universidade Federal de Santa Catarina.
Fernandes, A. R. (2005). Manutenção Produtiva Total:Uma Ferramenta Eficaz na Busca da Perda-Zero. Itajubá, Universidade Federal de Itajubá.
Ghinato, P. (1998). "Heuristic Aprocache to Solve The Multifunction Worker Assignment Problem in U-Shaped Work-Cell." International Conference on Automation Technology
5.
Ghinato, P. (1999). Autonomia e Multifuncionalidade no Trabalho: Elementos Fundamentais na Busca da Competitividade. Série Monográfica Ergonomia: Ergonomia de Processo. L. B. d. M. Guimarães. Porto Alegre, PPGEP/UFRGS. 2.
Ghinato, P. (2000). Elementos Fundamentais do Sistema Toyota de Produção. Produção & Competitividade: Aplicações e Inovações. A. T. d. A. F. M. C. Souza. Recife, UFPE.
Gross, J. M. and K. R. McInnis (2003). Kanban Made Simple: Demystifying and Applying Toyota's Legendary Manufacturing Process. New York, NY American Management Association.
Hobbs, D. P. (2004). LEAN Manufacturing Implementation: A Complete Execution Manual for Any Size Manufacturer. Boca Raton, Florida J. Ross Publishing.
Huq, F., D. A. Hensler, et al. (2001). "A simulation analysis of factors influencing the flow time and through-put performance of functional and cellular layouts." Integrated Manufacturing Systems
2.
Kumar, C. S. and R. Panneerselvam (2005). "Literature review of JIT-KANBAN system." Advanced Manufacturing Technologies.
Lean Enterprise Institute (2005). Lean Lexicon.
Liker, J. K. (2004). The Toyota Way: 14 Management Principles from the World's Greatest Manufacturer. Madison, WI, McGraw-Hill.
Miltenburg, J. (2000). "One-piece flow manufacturing on U-shaped production lines: a tutorial." IIE Transactions.
Miyake, D. I. (2006). "The Shift from Belt Conveyor Line to Work-cell Based Assembly Systems to Cope with Increasing Demand Variation and Fluctuation in The Japanese Electronics Industries." CIRJE Discussion Papers.
Namoura, J. and S. Takakuwa (2006). "Optimization of a Number of Container for Assembly Lines: The Fixed Course Pickup System." International Journal of Simulation Modeling
5: 11.
Ohno, T. (1997). O Sistema Toyota de Produção: Além da Produção em Larga Escala. Porto Alegre, Bookman.
Sato Consultoria de Pessoal. (2008). "Círculo de Controle da Qualidade." Retrieved 23 de Janeiro, 2008, from http://www.sato.adm.br/rh/circulos_de_controle_de_qualidad.htm.
Smalley, A. (2006). "Conectando a Montagem aos Processos em Lotes através de Sistemas Puxados Básicos." Lean Institute Brasil.
Zagonel, E. (2006). Implantação do Fluxo Unitário de Peças Numa Célula de Usinagem: Estudo de Caso por Meio de Simulação. Departamento de Engenharia Mecânica. Curituba, Universidade Federal do Paraná. Mestrado.
Anexo A - Ficha de Trabalho Padrão
Anexo B - Gráficos com os Resultados da Simulação
Figura 33 - Exemplo de um gráfico do mizusumashi ou empilhador exibido nos
resultados da simulação.
Figura 34 - Exemplo do relatório de uma célula de manufatura emitida pelo simulador.
Figura 35 - Gráficos de estoque por quantidade e por valor apresentados
no final da simulação. Valores negativos indicam a ruptura de estoque.
Anexo C - Fluxogramas
Anexo D - Exemplos Reais dos Elementos Citados no Texto
Anexo E - SimCantina: Projeto Base Antes de Iniciar o Pull Simulator
O projeto SimCantina foi um simulador bastante simples, criado para avaliar o tempo médio que os alunos da Universidade do Porto gastavam na fila todos os dias e ponderar a aquisição de mais uma máquina de vender os tickets de refeição.
O objetivo era aprender os conceitos da simulação por eventos que incluísse a recolha de dados, uma animação das entidades simuladas e um relatório final com os resultados obtidos. Também era necessário que o modelo fosse flexível e que todas as variáveis pudessem ser configuradas dentro do próprio programa sem recorrer ao código fonte, como mostrado na figura 44.
O ponto de partida foi o modelo Schedule-Execute desenvolvido pelos pesquisadores Manuel Feliz Teixeira e António Brito do departamento de Gestão e Engenharia Industrial da Universidade do Porto. Tal modelo é descrito no livro da autoria de ambos, intitulado Simulação por Computador da editora Publindústria.
O resultado foi um motor de simulação visual e interativa simples, robusto e fácil de compreender pelos iniciantes na simulação por computador. Além do mais, o código é bastante flexível e de grande portabilidade, o que permite aos alunos o desenvolvimento de uma simulação em um curto intervalo de tempo.
Considerando os parâmetros acima, ao clicar em Start Simulation pode-se verificar através da figura 45 que se forma uma fila de clientes muito grande se for utilizada uma única máquina de vender tickets.
etanto, ao adicionarmos uma segunda máquina, o fluxo de clientes se torna muito maior, já passam a existir mais clientes sentados nas mesas do que esperando pela comida e que a fila da máquina de tickets desaparece.
O código-fonte é livre (open-source) e seu download pode ser feito no seguinte endereço: http://www.luizfreire.com/simulator/SimCantina-Src.rar
A seguir o leitor poderá ver o código-fonte de algumas classes mais importantes da simulação. Contudo, para um perfeito entendimento é necessária a leitura do livro acima.
/**
* @(#)SimEntity.java
*
* Superclass for all entities used in the simulation
*/
import java.awt.Image;
import java.util.LinkedList;
import javax.imageio.ImageIO;
public abstract class SimEntity {
protected final Simulator simulator; //reference to the simulator
protected final double createdTime; //entity created time
protected double lastUsedTime; //time when the entity was last used
protected int workTimeCount = 0; //sum of entity activities time in milliseconds
protected boolean isWorking = false; //Entity free or working?
protected String status = null; //Entity actual status
protected String name; //Entity name
protected String desc; //Entity description
protected static final double scale = 33; //The number of pixels that represents 1 meter on the screen
protected double speed = 1; //speed in meters per second
protected int x = 0; //x coordenate
protected int y = 0; //y coordenate
/////////////////////////////////////////////////////////////////////////////////////////////////////
//PROPRIETIES
/////////////////////////////////////////////////////////////////////////////////////////////////////
public double getCreatedTime() { return createdTime; }
public double getLastUsedTime() { return lastUsedTime; }
public int getWorkTimeCount() { return workTimeCount; }
public String getStatus() { return status; }
public String getName() { return name; }
public boolean isWorking() { return isWorking; }
public double getSpeed() { return speed; }
public int getX() { return x; }
public int getY() { return y; }
/////////////////////////////////////////////////////////////////////////////////////////////////////
//CONSTRUCTOR
/////////////////////////////////////////////////////////////////////////////////////////////////////
//This function is called before the derived class constructor. It doesn't override.
protected SimEntity(Simulator simulator) {
this.simulator = simulator;
simulator.addToEntityList(this);
createdTime = simulator.getTime();
lastUsedTime = simulator.getTime();
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//EXECUTE
/////////////////////////////////////////////////////////////////////////////////////////////////////
public abstract void Execute(SimEvent event); //interface with simulator
/////////////////////////////////////////////////////////////////////////////////////////////////////
//SIMULATION EVENTS
/////////////////////////////////////////////////////////////////////////////////////////////////////
/*
* All events in the simulation shold be listed here
* Please follow the event name template: ENTITY_EVENT
*/
public enum Events {
CLIENT_ARRIVE, //always the first event for a new client
CLIENT_LEAVE, //always the last event for a client
TICKETMACHINE_START_BUY_TICKET,
TICKETMACHINE_END_BUY_TICKET,
WAITER_START_DELIVERY,
WAITER_END_DELIVERY,
TABLE_CHAIR_START_TO_EAT,
TABLE_CHAIR_END_TO_EAT,
SIMULATION_END //Stops the simulation prematurely
};
/////////////////////////////////////////////////////////////////////////////////////////////////////
//ANIMATION
/////////////////////////////////////////////////////////////////////////////////////////////////////
protected static AnimationIcons icons = new AnimationIcons(); //collection of entity images
protected Image icon = null; //actual entity image
protected void setVisible() { simulator.getDrawList().addLast(this); } //show the entity on the screen
protected void setInvisible() { simulator.getDrawList().remove(this); } //hide the entity
/////////////////////////////////////////////////////////////////////////////////////////////////////
//ANIMATION MOVES
/////////////////////////////////////////////////////////////////////////////////////////////////////
protected LinkedList<Move> listOfMoves = new LinkedList<Move>(); //store the animation steps
public Move getLastMove() { return listOfMoves.getLast(); } //return the last movement of the object
//change the entity icon on the time especified
public void updateImage(Image icon, double time) {
Move m = new Move(icon, x, y, x, y, time, time);
m.setTheta(listOfMoves.getLast().getTheta());
listOfMoves.addLast(m);
}
public void updateImage(Image icon, double time, double dt) {
listOfMoves.addLast(new Move(icon, x, y, x, y, time, time + dt));
}
//define where and when the object begin to be displayed on the screen
public void setStartPosition(int x, int y) {
if (listOfMoves.size() == 0) {
Move m = new Move(icon, x, y, x, y, this.createdTime, this.createdTime + 1);
listOfMoves.addFirst(m);
//System.out.println("setStartPosition: " + this.desc + "Move: " + listOfMoves.size());
}
}
//get the entity move associated with the time t
public Move getAnimationMove(double t) {
Move m = listOfMoves.getLast();
for(int i = listOfMoves.size(); i > 0; i--) {
if(t < m.getBeginTime()) {
m = listOfMoves.get(i-1);
} else break;
}
return m;
}
}
/**
* @(#)SimEvent.java
* this object is a simulation event that will be stored in the linkedlist eventlist waiting your turn to run
*/
import java.util.*;
import java.text.*;
public class SimEvent {
private final SimEntity entity; //reference to entity
private final SimEntity.Events routine; //event routine
private final double time; //when the event will be executed
private final int id; //event identification
static int count = 0; //event count
/////////////////////////////////////////////////////////////////////////////////////////////////////
//PROPRIETIES
////////////////////////////////////////////////////////////////////////////////////////////////////
public SimEntity getEntity() { return entity; }
public SimEntity.Events getRoutine() { return routine; }
public double getTime() { return time; }
public int getId() { return id; }
/////////////////////////////////////////////////////////////////////////////////////////////////////
//CONSTRUCTOR
/////////////////////////////////////////////////////////////////////////////////////////////////////
public SimEvent(SimEntity entity, SimEntity.Events routine, double time)
{
this.entity = entity; //get the entity
this.routine = routine; //get the routine
this.time = time; //get the time
id = ++count; //increment the counter
}
}
/**
* @(#)Simulator.java
*
* Simulation base class: this object controls the time, and executes the simulation events
* It also tells the animation panel what part of the simulation should be played
* Time foward technique: time slicing
*
*/
import java.util.*;
import java.text.*;
import javax.swing.JApplet;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Simulator implements Runnable {
public final int NUMBER_OF_PRODUCTS = 10; //Max number of diferent products
public final double SIMULATION_LENGHT = 10; //Simulation Leght in milliseconds
private double tSim = 0; //Simulation actual time
private double tNext = 0; //next event time
public double getTime() { return tSim; } //Returns the time of the simulator
double beginToPlay = 0; //there will be no animation until tSim > beginToPlay
double endToPlay = 0; //and there will be no animation after tSim > endToPlay
public void setBeginToPlay(double t) {
beginToPlay = t;
}
public void setEndToPlay(double t) {
endToPlay = t;
}
//simulation speed factor -> Real Time = 1000
private int speed = 1000;
public int getSpeed() {
return speed;
}
//list of all used SimEntities durint the simulation
private LinkedList<SimEntity> entityList = new LinkedList<SimEntity>();
public LinkedList<SimEntity> getEntityList() {
return entityList;
}
public void addToEntityList(SimEntity entity){
this.entityList.addLast(entity);
}
//list of SimEntities to be drawn on the screen
private LinkedList<SimEntity> drawList = new LinkedList<SimEntity>();
public LinkedList<SimEntity> getDrawList() {
return drawList;
}
public void addToDrawList(SimEntity entity){
this.drawList.addLast(entity);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//CONSTRUCTOR
/////////////////////////////////////////////////////////////////////////////////////////////////////
SetupDlg setupDlg; //dialog where the user can adjust some parameters like animation speed, number of entities...
private Thread animation;
private Thread simulation;
public Simulator() {
System.out.println("Simulator->Simulator()");
simulation = new Thread(this, "Simulator Thread");
animation = new Thread(animationPanel, "AnimationPanel Thread");
setupDlg = new SetupDlg(this); //Creates dialog for user input the simulation parameters
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//START
/////////////////////////////////////////////////////////////////////////////////////////////////////
private AnimationPanel animationPanel; //reference to the theater where the animation will be played
public void start() {
System.out.println("Simulator->Start()");
speed = setupDlg.getSpeed(); //get the simulation speed
animationPanel = new AnimationPanel(this); //show the animation window
simulation.start(); //starts the simulation thread
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//RUN
/////////////////////////////////////////////////////////////////////////////////////////////////////
public void run() {
//if there is any unexecuted event...
if(eventList.size() > 0) {
SimEvent event = eventList.removeFirst(); //Select the event
tSim = event.getTime(); //updates the simulation time
//Execute the event if it isn't the flag SIMULATION_END
if(event.getRoutine() != SimEntity.Events.SIMULATION_END) {
//System.out.printf("%s %s \n", "Time: " + (int)(event.getTime()/1000), event.getRoutine());
event.getEntity().Execute(event);
SimulatorReport.newSample(this);
}
//Get the next event time and compare to tSim to decide if is time to run another event, play the animation or do nothing
if(eventList.size() > 0) //prevents null pointer exception
{
tNext = eventList.getFirst().getTime();
//if there is another event at the same time, run it. Otherwise, show the animation
if((tSim < beginToPlay) || (tSim > endToPlay) || (tNext == tSim)){
run(); //run another event
} else {
animationPanel.play(tSim, tNext); //play the animation
}
}
else {
//final procedures
animationPanel.close(); //hide the animation window
System.out.println("Simulator->End");
//show the results
ShowReportDlg showReportDlg = new ShowReportDlg(this);
SimulatorReport.showReport_queues(showReportDlg, this);
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//SCHEDULE
/////////////////////////////////////////////////////////////////////////////////////////////////////
/*
* Adds a SimEvent at the right place in the eventlist linkedlist ordered by the event time
* If two events should happen at the same time, the event tha was first scheduled will be executed first.
*
*/
private LinkedList<SimEvent> eventList = new LinkedList<SimEvent>(); //Simulation event list that will be executed in the future
public void Schedule(SimEntity entity, SimEntity.Events routine, double time) {
SimEvent event = new SimEvent(entity, routine, time);
//System.out.printf("Event %s Scheduled: Time = %s Entity = %s\n", event.getRoutine(), event.getTime(), newEvent.entity);
if(eventList.size() == 0) //Verifies if the list is not empty to avoid nullpointer exception
{
eventList.addLast(event);
} else {
if(event.getTime() < eventList.getFirst().getTime()) {
eventList.addFirst(event);
} else {
SimEvent node = eventList.getLast();
for(int i = eventList.size(); i > 0; i--) {
if(event.getTime() >= node.getTime()) {
eventList.add(i, event);
break;
} else node = eventList.get(i-2); //i-1 had already been tested
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//UTILITIES
/////////////////////////////////////////////////////////////////////////////////////////////////////
//Show all events in the eventlist. Used for debug
public void ShowSchedule() {
if(eventList.size() > 0) {
System.out.println("Showing Scheduled Events:");
for (SimEvent event : eventList)
System.out.printf("Time: %s \tEntity:%s \tRoutine: %s\n", event.getTime(), event.getEntity(), event.getRoutine());
} else System.out.println("The Eventlist is Empty!");
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//MAIN METHOD
/////////////////////////////////////////////////////////////////////////////////////////////////////
public static void main(String[] args) {
//Especifies application look and feel do programa. Do not add code before this statement
try {
// Set System L&F
UIManager.setLookAndFeel(
UIManager.getSystemLookAndFeelClassName()); //Sets look and feel iqual to operation system style
} catch (UnsupportedLookAndFeelException e) {
// handle exception
} catch (ClassNotFoundException e) {
// handle exception
} catch (InstantiationException e) {
// handle exception
} catch (IllegalAccessException e) {
// handle exception
}
new Simulator();
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//START BUY TICKET
/////////////////////////////////////////////////////////////////////////////////////////////////////
static Random randomTime = new Random();
public void e_startBuyTicket(SimEvent event) {
//activity time in milliseconds
double dt = 1000*(timeToBuyTicket_mean + randomTime.nextGaussian()*timeToBuyTicket_stdDev);
//set ticketmachine in working status
ticketMachine.isWorking = true;
ticketMachine.workTimeCount += dt;
ticketMachine.lastUsedTime = simulator.getTime() + dt;
ticketMachine.status = "In use by the client " + client.getName();
//System.out.println(this + " " + ticketMachine.status);
//change client from waiting for a avaiable ticketmachine to client buying the ticket
client.isWorking = true;
client.workTimeCount += dt;
client.lastUsedTime = simulator.getTime() + dt;
client.status = "Buying Ticket";
//change the picture of the ticketmachine
ticketMachine.updateImage(icons.TICKETMACHINE_BUSY, simulator.getTime(), dt);
//make the clients in the queue to walk a little
for (Client waitingClient : waitingQueue) {
waitingClient.moveTo(queuePositions[waitingQueue.indexOf(waitingClient)], simulator.getTime());
}
//shedule the next event
simulator.Schedule(this, Events.TICKETMACHINE_END_BUY_TICKET, simulator.getTime() + dt);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
//END BUY TICKET
/////////////////////////////////////////////////////////////////////////////////////////////////////
public void e_endBuyTicket(SimEvent event) {
//change client from buying ticket to client waiting for the meal
client.isWorking = false;
client.status = "Avaiable with a ticket already bought";
//change the ticketMachine status from busy to free
ticketMachine.isWorking = false;
ticketMachine.status = "Avaible and waiting for clients";
//change the picture of the ticketmachine
ticketMachine.updateImage(icons.TICKETMACHINE_FREE, simulator.getTime());
//send the client to queue to receive the meal
client.moveTo( new Position( auxPosition2.getX()-10, auxPosition2.getY() ), simulator.getTime());
Waiter.addClient(client, simulator);
//check if the next activity of sells ticket can starts immediately
if(waitingQueue.size() > 0) {
this.scheduleNextClient(simulator.getTime());
} else {
ticketMachineFree.addLast(this);
client = null; //delete the machine's reference to the its client
}
}
}
/**
* @(#)Waiter.java
*
* Waiter that deliver the meal for the client in the restaurant
*/
import java.util.*;
import javax.swing.JOptionPane;
public class Waiter extends SimEntity {
private final int id; //entity unique identification in this group
static private int count = 0; //total of TicketMachines created
static private LinkedList<Waiter> waiterFree = new LinkedList<Waiter>(); //list of waiters avaiable
static private LinkedList<Client> waitingQueue = new LinkedList<Client>(); //list of client waiting for an avaiable waiter
static private int maxClients = 0; //Max. number of clients waiting for an avaiable waiter
static private double timeToDeliver_mean = 0; //mean time that a waiter spent to deliver the meal
static private double timeToDeliver_stdDev = 0; //an its standart deviation (assuming a normal distribution)
private Waiter waiter = this; //auxiliar variable to make the code more readible
private Client client = null; //reference to the client that is interacting with the waiter
private Position auxPosition1 = null; //individual tickemachine position where the client should be to buy the ticket
private Position auxPosition2 = null; //individual tickemachine position where the client should be to buy the ticket
public String toString() { return "Waiter Nº" + id; } //Override toString method
/////////////////////////////////////////////////////////////////////////////////////////////////
//PROPRIETIES
/////////////////////////////////////////////////////////////////////////////////////////////////
public int getId() { return id; }
static public int getNumberOfEntities() { return count; }
static public int getNumberOfClients() { return waitingQueue.size(); }
static public int getMaxNumberOfClients() { return maxClients; }
static public LinkedList<Waiter> getListOfWaiters() {
return (LinkedList<Waiter>) waiterFree.clone();
}
static public void setTimeToDeliver_mean(double t) {
if(t>0) timeToDeliver_mean = t;
}
static public void setTimeToDeliver_stdDev(double t) {
if(t>0) timeToDeliver_stdDev = t;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//CONSTRUCTOR
/////////////////////////////////////////////////////////////////////////////////////////////////
public Waiter(Simulator simulator) {
super(simulator); //call the superclass constructor
id = ++count; //entity unique identification in this group
name = "Waiter " + id; //particular name of the entity
desc = "Hired Waiter"; //description of the entity type
icon = icons.WAITER_FREE; //inicial entity image
status = "Ready!"; //inicial status (only for information)
x = 841-id*25; //inicial x coordenate
y = 43; //inicial y coordenate
setStartPosition(x,y); //save the inicial position in the listOfMoves
auxPosition1 = new Position(x, y + 55); //Position where the client should be to receive the meal
auxPosition2 = new Position(x, y + 35); //Position where the client should be to receive the meal
setVisible(); //set the entity to be drawn on the screen
waiterFree.addFirst(this); //set the waiter avaiable for the clients
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//ADD CLIENT TO THE QUEUE
/////////////////////////////////////////////////////////////////////////////////////////////////
//each place position in the waiting queue (max size = 92)
static Position queuePositions[] = {
new Position(780,120), new Position(780,135), new Position(780,150), new Position(780,165), new Position(780,180),
new Position(120,300), new Position(120,285), new Position(120,270), new Position(120,255), new Position(120,240),
new Position(120,225), new Position(120,210),
};
static Random randomWaiter = new Random();
static public void addClient(Client client, Simulator simulator) {
if(waitingQueue.size() < queuePositions.length) { //the client can join the queue
waitingQueue.addLast(client);
if (waitingQueue.size() > maxClients) { //updates max size of clients waiting for the meal
maxClients = waitingQueue.size();
}
client.status = "Waiting in the queue to reveive the meal";
//make the client move throw the line until the last free place in the queue
double dt = 0;
for(int i = queuePositions.length-1; i >= waitingQueue.size()-1; i--) {
client.moveTo(queuePositions[i], simulator.getTime());
}
//checks if the activity of delivery the meal can begin immediately
if(waiterFree.size() > 0) {
Waiter waiter = waiterFree.remove( randomWaiter.nextInt(waiterFree.size()));
waiter.scheduleNextClient(simulator.getTime());
}
} else { //there is no place in the queue
JOptionPane.showMessageDialog(null,
"The waiting queue for the meal got too crowded!" +
"Some clients may be lost."
);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//SCHEDULE CLIENT /////////////////////////////////////////////////////////////////////////////////////////////////
//since this part of the code was repeated two times, I found interesting to put it in a function for modify only one in place when needed
public void scheduleNextClient(double time) {
this.client = waitingQueue.removeFirst();
double dt = client.moveTo(auxPosition1, time);
dt += client.moveTo(auxPosition2, time + dt);
simulator.Schedule(this, Events.WAITER_START_DELIVERY, time + dt);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//EVENTS
/////////////////////////////////////////////////////////////////////////////////////////////////
//interface with simulator
public void Execute(SimEvent event) {
switch(event.getRoutine()) {
case WAITER_START_DELIVERY : e_startDelivery(event);
break;
case WAITER_END_DELIVERY : e_endDelivery(event);
break;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//START DELIVERY /////////////////////////////////////////////////////////////////////////////////////////////////
static Random randomTime = new Random();
public void e_startDelivery(SimEvent event) {
//activity time in milliseconds
double dt = 1000*(timeToDeliver_mean + randomTime.nextGaussian()*timeToDeliver_stdDev);
//set waiter in working status
waiter.isWorking = true;
waiter.workTimeCount += dt;
waiter.lastUsedTime = simulator.getTime() + dt;
waiter.status = "Attending the client " + client.getName();
//changes client from waiting for a meal to client receiving the meal
client.isWorking = true;
client.workTimeCount += dt;
client.lastUsedTime = simulator.getTime() + dt;
client.status = "Receiving the meal";
//change the picture of the waiter
waiter.updateImage(icons.WAITER_BUSY, simulator.getTime(), dt);
//make the clients in the queue to walk a little
for (Client waitingClient : waitingQueue) {
waitingClient.moveTo(queuePositions[waitingQueue.indexOf(waitingClient)], simulator.getTime());
}
//shedule the next event
simulator.Schedule(this, Events.WAITER_END_DELIVERY, simulator.getTime() + dt);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//END DELIVERY
/////////////////////////////////////////////////////////////////////////////////////////////////
public void e_endDelivery(SimEvent event) {
//changes client from receiving the meal to client eating the meal
client.isWorking = false;
client.status = "Walking to the table";
//changes the waiter status from busy to free
waiter.isWorking = false;
waiter.status = "Avaible and waiting for clients";
//change the picture of the waiter
waiter.updateImage(icons.WAITER_FREE, simulator.getTime());
//change the picture of the client
client.moveWithMealTo(new Position(auxPosition2.getX(), auxPosition2.getY()+20 ), simulator.getTime());
Table.addClient(client, simulator);
//check if the next activity of deliver the meal can starts immediately
if(waitingQueue.size() > 0) {
this.scheduleNextClient(simulator.getTime());
} else {
waiterFree.addLast(this);
client = null; //delete the machine's reference to the its client
}
}
}
Um comentário:
Boa Tarde. Parabéns pelo Blog é inteligente e de muito bom gosto. Caso possua empilhadeiras no estado ainda a serem reformadas entre em contato. empilhashop.com.br (Empilhadeiras usadas) falecom@empilhashop.com.br Muito Obrigado. EmpilhaShop
Postar um comentário