;

Optimalizace výroby pomocí ERP systému – příležitost ke zvýšení efektivity až o 30 %

6. 6. 2023
Doba čtení: 3 minuty

Sdílet

Autor: Depositphotos
Pokud se vám nedaří optimalizovat výrobu, můžete dosahovat až o 30 % nižší efektivity se všemi negativními dopady, které to způsobuje. Zejména jde o skluzy v dodávkách zákazníkům a zbytečně vysoké náklady na výrobky.

Zvládnutí optimalizace výroby začíná střednědobým plánováním. ERP systém musí dokázat dynamicky v čase vyhodnotit zakázky a prognózy prodeje, porovnat je se zásobami, rozpracovaností a materiálem na cestě a navrhnout hrubý plán výroby a nákupu včetně optimalizace dávek. Hlavním cílem je včasné zabezpečení materiálu pro výrobu, příp. identifikace kritických úzkých míst ve výrobě pro jejich včasnou eliminaci.

Pak teprve navazuje krátkodobé rozvrhování výroby, jehož cílem je stanovení optimálního pořadí operací na pracovištích a organizace materiálového toku.

Při této činnosti musí ERP systém obsahovat rozdílnou podporu pro opakovanou a pro zakázkovou výrobu. V případě opakovaných výrob jsou firmy většinou vybaveny specializovanými linkami, na nichž se vyrábějí větší série. Dopředu jsou vymyšleny postupy pro přestavby linek, výrobní dokumentace je graficky propracovaná tak, aby se minimalizovaly chyby, operátoři jsou detailně školeni na konkrétní operace a promyšlený je i materiálový tok. ERP systém transformuje výrobní příkazy vygenerované střednědobým MRP plánováním do rozvrhů pro klíčová pracoviště, která určují takt výroby (tzv. pacemakery). Rozhodující je přitom optimalizace pořadí výrobků na takovém pracovišti s cílem splnit termíny zakázek a minimalizovat přestavby linek. Od výrobních rozvrhů těchto linek se pak odvíjejí rozvrhy předchozích, případně následných pracovišť. 

Často se s výhodou využívá organizace materiálového toku pomocí KANBANU a principů štíhlé výroby. V ERP systému se pro každý artikl (tedy vstupní materiály, díly, polotovary, podskupiny i výrobky) definují KANBAN smyčky. Obsahují vždy zdrojový supermarket, cílový supermarket, KANBAN množství a optimální množství KANBANŮ v cílovém supermarketu. ERP systém obvykle dokáže tyto parametry i automaticky vypočítat podle poptávky, informací z postupů a historie výroby. Jakmile klesne množství v cílovém supermarketu pod nastavené optimum, ERP systém generuje tahový signál na zdrojový supermarket pro doplnění. Zdrojem může být sklad, mezisklad nebo pracoviště a ERP systém optimalizuje pořadí práce ve zdrojích i při manipulaci podle priorit. Veškeré aktivity ve zdroji, na cestě i v cílovém supermarketu přitom monitoruje díky skenování operátorů RF terminály nebo průjezdy zásob RFID branami či hromadným snímáním štítků KANBAN karet kamerami.

zakázkových výrob mají firmy místo optimalizovaných výrobních linek k dispozici spíše univerzální stroje a obráběcí centra, na nichž lze uskutečnit velké množství velmi rozdílných operací. Pro krátkodobé rozvrhování výroby je pak rozhodující příprava CNC programů, pořadí operací se zohledněním výměny nástrojů a výměny vstupního materiálu. Tady se nelze spolehnout na připravené šablony pro stanovení pořadí operací, ale ERP systém musí nabídnout pokročilé APS rozvrhování, které podle termínů poptávky a dostupnosti materiálů stanoví priority operací a podle kapacit primárních zdrojů (pracovišť, pro něž stanovujeme fronty operací), sekundárních zdrojů (dostupnosti přípravků, operátorů…) a seřizovacích časů (definovaných pomocí matic podle parametrů vstupních materiálů a operací) vypočítá optimální pořadí operací pro jednotlivá pracoviště. Dobře optimalizovanou výrobu poznáte nejen podle vyšší efektivity pracovišť, ale i podle snížení zásob v meziskladech a eliminace zaskladňování a vyskladňování pro následující operace, protože materiál a polotovary putují přímo z pracoviště na pracoviště a nikde se nehromadí.

Součástí optimalizace výroby je i zajištění schopných výrobních operátorů.

U opakovaných výrob firmy nešetří na školitelích, školicích místnostech se vzorovými pracovišti a školicích procedurách. Cílem je průběžné proškolování nových i dosavadních operátorů na konkrétní operace pro dosažení spolehlivého výkonu. Díky optimalizaci pracovišť, výrobních postupů a dokumentace existuje mnoho operací, pro které lze relativně rychle zaškolit i zcela nezkušené pracovníky.

U zakázkových výrob je takových příležitostí méně. Rozmanitost úkonů a operací neumožňuje tak důslednou standardizaci jako opakovaná výroba a operátoři musejí svou zkušeností eliminovat absenci propracovaných grafických návodek.

Optimalizaci výroby také výrazně ovlivňuje nekvalita. Zejména opakovaná výroba je velmi citlivá na nečekané zmetky, protože nabourávají nastavené optimální dávky, KANBAN a většinou nejsou k dispozici rezervy na jejich doplňování. Proto firmy hodně investují do předcházení nekvalitě. Již při návrhu výrobků akcentují nemožnost záměn podobných dílů při montáži a jednoduchost operací. V grafických průvodkách upozorňují operátory na kritická místa výroby a hojně využívají i samokontrolu operátorů. U zakázkových výrob jsou standardní součástí postupů kontrolní operace a ERP systém musí dohlídnout na jejich poctivé provádění.

Optimalizace výroby je nikdy nekončící proces zasahující návrh výrobku, podobu pracovišť, skladovací i výrobní prostory, lidi i organizaci práce a materiálového toku. Zejména poslední jmenované aktivity výrazně ovlivňuje ERP podnikový informační systém. Pokud má potřebnou funkcionalitu a vy ji dokážete využít, můžete svou efektivitu skokově zvýšit.

Autor: Vladimír Bartoš, ředitel pro strategii, Minerva Česká republika

Autor článku

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »