OEE - Předpočítaná data

Některé přehledy v TracePRO jsou náročnější na výpočet a jejich data jsou proto předpočítávána dávkovými skripty do speciálních tabulek. Tyto tabulky slouží jako zdroj dat pro samotné sestavy a jsou určeny i pro přímý přístup z externích nástrojů (BI nástroje, Excel, vlastní skripty apod.).

Tabulky jsou přepočítávány periodicky – při každém spuštění skriptu se data v daném časovém okně smažou a přepočítají znovu. Data v tabulkách tedy nejsou živá, ale odpovídají stavu v době posledního výpočtu.

Poznámka

Sloupec id je ve všech tabulkách automaticky generované celé číslo (auto-increment primární klíč). Nemá věcný význam, slouží pouze jako interní identifikátor řádku. Při každém přepočtu se hodnoty id mění.

Tabulka rep_oee_data

Předpočítaná data pro OEE přehledy. Tabulku plní dva různé skripty, každý zapisuje jiný typ záznamu (sloupec tp):

  • python -m tracecar.scripts.calc_oee_lsline production.ini – zapisuje záznamy typu lsline a gap (data z LS linek).

  • python -m tracecar.scripts.calc_oee_report production.ini – zapisuje záznamy typu repwork (data z repwork pracovišť).

Oba skripty při přepočtu smažou existující záznamy svého typu pro daná pracoviště a časové období a vloží nové. Záznamy různých typů si vzájemně nepřekáží.

Indexy:

  • (wp_id, period_tm0) – pro dotazy na konkrétní pracoviště a časové období

  • (order_id, op) – pro dotazy na konkrétní objednávku a operaci

Sloupce

Sloupec

Typ

Popis

id

INT

Primární klíč, bez věcného významu.

tp

VARCHAR(10)

Typ záznamu:

  • lsline – skutečný výrobní záznam z LS linky (plní calc_oee_lsline).

  • gap – neúčtovaný čas mezi dvěma záznamy na stejném pracovišti (plní calc_oee_lsline); order_id, op, wgroup_id jsou NULL, work_tm a stop_tm obsahují délku mezery.

  • repwork – výrobní záznam z repwork pracoviště (plní calc_oee_report).

wp_id

INT

ID pracoviště (p_workplace.id).

order_id

INT

ID výrobní objednávky (productionorder.id). NULL u záznamu typu gap.

op

INT

Číslo operace. NULL u záznamu typu gap.

wgroup_id

INT

ID pracovní skupiny (w_group.group_id). NULL u záznamu typu gap.

period_tm0

DATETIME

Začátek časového období, do kterého řádek patří (směna, den, týden).

period_tm1

DATETIME

Konec časového období.

prep_tm

DOUBLE

Skutečná doba přípravy (sekundy) připadající na toto období.

prep_std_tm

DOUBLE

Normovaná doba přípravy (sekundy) přiřazená tomuto období.

prep_full_tm

DOUBLE

Celková doba přípravy (sekundy) přes všechna období tohoto záznamu.

run_tm

DOUBLE

Skutečná doba výroby ve stavu ST_RUN (sekundy).

run_std_tm

DOUBLE

Normovaná doba výroby = STD_1PC * počet vyrobených kusů (sekundy).

work_tm

DOUBLE

Pracovní čas = end_tm - run_start (sekundy). U záznamu gap se rovná stop_tm.

stop_tm

DOUBLE

Potvrzený čas prostoje (sekundy). U záznamu gap = délka mezery.

break_tm

DOUBLE

Čas přestávek připadající na toto období (sekundy).

prep_start

DATETIME

Okamžik zahájení přípravy v tomto období. NULL pokud příprava nezasahuje.

run_start

DATETIME

Okamžik zahájení výroby v tomto období. U záznamu gap = začátek mezery.

end_tm

DATETIME

Konec záznamu v tomto období. U záznamu gap = konec mezery.

produced_pcs

INT

Počet dobrých kusů vyrobených v tomto období.

ng_pcs

INT

Počet kusů NG v tomto období.

Výpočet OEE ukazatelů z tabulky

Přehledy zobrazují hodnoty Dostupnost (Availability), Výkon (Performance), Kvalita (Quality) a OEE, které nejsou v tabulce uloženy – vypočítávají se za běhu ze sloupců výše. Vzorce se liší podle typu záznamu.

Záznamy typu lsline (a jejich součty):

Agregujte řádky podle (wp_id, period_tm0) (nebo libovolné hrubší granularity). Pro každý agregát platí:

avail_base = SUM(work_tm) - SUM(stop_tm) - SUM(break_tm)

Dostupnost  = avail_base / (SUM(work_tm) + SUM(prep_tm))
Výkon       = (SUM(run_std_tm) + SUM(prep_std_tm)) / avail_base
Kvalita     = (SUM(produced_pcs) - SUM(ng_pcs)) / SUM(produced_pcs)
OEE         = MIN(1, Dostupnost * Výkon * Kvalita)

Pokud je jmenovatel nulový, příslušný ukazatel je 0 (resp. NULL). work_tm u záznamu gap je roven stop_tm, takže mezery se správně promítají do Dostupnosti při součtu.

Záznamy typu repwork:

Sloupce mají jiné sémantické obsazení. Pro jeden řádek (nebo agregát):

-- work_tm zde = end_start = celková délka záznamu (end_tm - run_start)
-- stop_tm    = čas prostojů uvnitř záznamu
-- break_tm   = čas přestávek uvnitř záznamu
-- run_std_tm = STD_1PC * produced_pcs (normovaný čas výroby)

avail_base  = SUM(work_tm) - SUM(stop_tm) - SUM(break_tm)

Dostupnost  = avail_base / SUM(work_tm)
Výkon       = SUM(run_std_tm) / avail_base
Kvalita     = (SUM(produced_pcs) - SUM(ng_pcs)) / SUM(produced_pcs)
OEE         = MIN(1, Dostupnost * Výkon * Kvalita)

Hlavní rozdíl oproti lsline: prep_tm a prep_std_tm nejsou u repwork záznamů plněny (jsou NULL), jmenovatel Dostupnosti je tedy jen SUM(work_tm), nikoli SUM(work_tm) + SUM(prep_tm).

Rozdíl je vlastně jen v tom, že data typu lsline mají časy přípravy. Jinak by výpočet měl být stejný.

Tabulka rep_downtime_data

Předpočítaná data pro přehled prostojů. Jeden řádek = jeden prostoj na jednom pracovišti jako celistvý časový interval (není rozdělen na směny). Přehled prostojů pak při zobrazení tyto intervaly ořezává na hranice směn/dnů/týdnů sám.

Skript pro přepočet: python -m tracecar.scripts.calc_downtime_data production.ini

Skript přepočítává posledních 7 dní (lze změnit parametrem --days). Záznamy s is_ongoing = 1 (stroj byl stále v prostoji v okamžiku výpočtu) se při každém přepočtu smažou a přepočítají, i když nespadají do časového okna.

Index:

  • (wp_id, start) – pro dotazy na prostoje konkrétního pracoviště v časovém rozsahu

Sloupce

Sloupec

Typ

Popis

id

INT

Primární klíč, bez věcného významu.

wp_id

INT

ID pracoviště (p_workplace.id).

start

DATETIME

Začátek prostoje.

end

DATETIME

Konec prostoje. NULL pokud prostoj stále probíhal v okamžiku výpočtu (viz is_ongoing).

order_id

INT

ID výrobní objednávky (productionorder.id), která byla na pracovišti aktivní v době prostoje. NULL pokud žádná objednávka nebyla zahájena.

op

INT

Číslo operace aktivní v době prostoje. NULL pokud nebyla zahájena žádná operace.

worker_id

INT

ID pracovníka (p_worker.id) přihlášeného v okamžiku ukončení prostoje. NULL pokud nebyl nikdo přihlášen. Pokud se pracovník v průběhu prostoje změnil, záznamy jsou rozděleny – každý úsek má svého pracovníka.

param

VARCHAR(100)

Kód důvodu prostoje (interní klíč z číselníku prostojů). NULL nebo prázdný řetězec znamená „jiný důvod“.

info

VARCHAR(255)

Volný text zadaný obsluhou při hlášení prostoje.

is_unconfirmed

TINYINT(1)

1 pokud jde o nepotvrzený prostoj (obsluha nahlásila prostoj, ale nezadala důvod). Takový záznam má start = end – jde o bodovou událost bez délky trvání.

is_ongoing

TINYINT(1)

1 pokud prostoj stále probíhal v okamžiku výpočtu. Sloupec end je pak NULL. Takové záznamy jsou při každém přepočtu aktualizovány.

calc_tm

DATETIME

Okamžik, kdy byl řádek vypočítán (čas spuštění skriptu).