60 sztuk w paczce, 19 zadań w historii, 877 gramów pobrane. Uzysk tego zlecenia ma trzy wartości
Historia zadań pozwala policzyć uzysk jednego zlecenia na cztery sposoby i każdy daje inną liczbę. Który mnożnik wchodzi do oferty, a który do terminu.
Zamówienie na 60 tulei dystansowych wyszło w jednej paczce, a w historii zadań zostało po nim 19 pozycji i 877 gramów pobranego materiału. Szesnaście pozycji ma status completed, dwie cancelled, jedna error. Dopóki te trzy nie wejdą do rachunku, zlecenie wygląda na rozliczone lepiej, niż zostało.
Uzysk tego zlecenia da się policzyć na cztery sposoby i każdy da inną liczbę: 84,2 proc. na zadaniach, 80,3 proc. na sztukach, 84,9 proc. na gramach i tyle samo na czasie pracy. Różnica między nimi to nie zaokrąglenie, a dobór mianownika. To ona decyduje, czy następne takie zlecenie wyjdzie na zero, czy na minus.
Które pole historii zadania mówi, ile naprawdę zostało pobrane
Dane do tego rachunku są już zapisane, tylko nie w tym miejscu, w które się zagląda. Każdy wpis w historii Moonrakera ma pole filament_used w milimetrach, print_duration i total_duration w sekundach oraz status o siedmiu możliwych wartościach. Dwie rzeczy w tym zestawie zmieniają sposób liczenia. Pierwsza: zużycie jest w milimetrach żyłki, nie w gramach, więc trzeba je przeliczyć samodzielnie. Druga: zużycie i czas są zapisywane także dla zadań przerwanych, czyli dokładnie dla tych, które w rozliczeniu zwykle giną.
Przeliczenie jest jednym mnożeniem. Przekrój żyłki 1,75 mm to 2,405 mm², więc metr materiału ma objętość 2,405 cm³. Dla PLA o gęstości 1,24 g/cm³ według karty materiału (ISO 1183) daje to 2,98 g na metr — przy innym materiale podstaw gęstość ze swojej karty, bo dla PETG i ASA wynik będzie inny o kilka procent.
| Pole wpisu | Jednostka | Co z niego wynika w rozliczeniu |
|---|---|---|
| status | tekst, 7 wartości | czy zadanie weszło do zlecenia, czy do strat |
| filament_used | mm żyłki | masa po przemnożeniu przez przekrój i gęstość |
| print_duration | s | czas pracy bez pauz — podstawa stawki godzinowej |
| total_duration | s | czas zajętości stanowiska razem z pauzami |
| end_time | czas uniksowy albo null | null oznacza wpis bez domknięcia, nie zadanie udane |
Panel pokazuje jeden słupek „failed”, a w danych jest pięć powodów
Interfejs upraszcza to, co widać w danych. Mainsail pokazuje status zadania w trzech kubełkach — completed, cancelled i failed — i pozwala filtrować listę po statusie. W samym Moonrakerze nieudane zakończenie ma pięć osobnych wartości: cancelled, error, klippy_shutdown, klippy_disconnect i interrupted. Dla rozliczenia zlecenia to pięć różnych pozycji kosztowych.
cancelled to decyzja operatora, czyli najczęściej wada zauważona w trakcie. error i klippy_shutdown to przerwanie po stronie sprzętu albo konfiguracji. klippy_disconnect i interrupted mówią o infrastrukturze wokół drukarki, nie o wydruku: drugi z nich jest ustawiany dopiero przy starcie usługi dla wpisów, które zostały w stanie in_progress. Zlecenie, w którym dwa zadania mają klippy_disconnect, nie ma problemu z materiałem ani z modelem — ma problem z zasilaniem albo z siecią, i wtedy przeliczanie oferty jest naprawianiem złego objawu.
Suma w zakładce statystyk liczy też to, co pojechało do kosza
Zbiorcze podsumowanie jest wygodne i właśnie dlatego myli. Endpoint /server/history/totals zwraca total_jobs, total_print_time i total_filament_used, a w kodzie komponentu historii akumulacja tych sum nie ma żadnego warunku na status — zadanie zakończone jako cancelled czy error dolicza swoje gramy i sekundy dokładnie tak samo jak udane. Wyjątkiem są wpisy oznaczone jako interrupted, bo ten status nadaje zapytanie SQL przy starcie i do sum nie wraca.
Praktyczny skutek jest taki, że suma z panelu to zużycie brutto, razem z brakami. Jeśli ktoś dzieli ją przez liczbę wysłanych sztuk, dostaje koszt jednostkowy, w którym straty już siedzą — i dodanie do niego naddatku na braki liczy je po raz drugi. Jeśli natomiast dzieli przez liczbę wszystkich zadań, dostaje liczbę, która nie opisuje niczego. Suma nadaje się do zamówień materiału, a nie do rozliczenia zlecenia. Dla rozliczenia potrzebna jest lista wpisów z filtrem po statusie i po zakresie dat, a nie jeden licznik, który na dodatek ma reset_totals i mógł być kiedyś zerowany.
Trzy mianowniki, trzy uzyski: zadania, sloty i gramy
Poniższy rachunek jest przykładem z jawnie podanymi wejściami — nie pomiarem z konkretnego warsztatu. Wejścia: cztery sztuki na jedno zadanie, zadanie udane trwa 190 minut i pobiera 16 400 mm żyłki, czyli 48,9 g (12,2 g na sztukę). W historii jest 19 zadań: 16 udanych, dwa przerwane przez operatora (3 100 mm i 38 minut oraz 12 700 mm i 152 minuty) i jedno zakończone błędem pod koniec druku (15 900 mm i 183 minuty). Z 64 sztuk, które wyszły z udanych zadań, trzy nie weszły w tolerancję na pomiarze. Zostało 61 sztuk dobrych, z czego 60 pojechało do klienta.
| Co liczysz | Licznik | Mianownik | Uzysk | Mnożnik |
|---|---|---|---|---|
| zadania | 16 udanych | 19 wszystkich | 84,2 proc. | 1,19 |
| sloty na sztuki | 61 dobrych | 76 (19 zadań × 4) | 80,3 proc. | 1,25 |
| materiał | 744 g dobrych | 877 g pobranych | 84,9 proc. | 1,18 |
| czas pracy | 2 898 min | 3 413 min | 84,9 proc. | 1,18 |
Uzysk slotowy jest najniższy, bo jego mianownik zakłada, że każde zajęte zadanie oddaje pełne cztery sztuki — a przerwane zadanie zajmuje slot w harmonogramie niezależnie od tego, w której minucie padło. Uzysk materiałowy jest wyższy, bo zadanie przerwane w 20. minucie zabiera gramy proporcjonalnie do tego, co zdążyło wyjść. Materiał i czas wypadły tu równo tylko dlatego, że w przykładzie koszt sztuki jest proporcjonalny do czasu; rozjeżdżają się, gdy braki kumulują się na końcu druku albo na pomiarze.
Wniosek operacyjny: mnożnik dobiera się do tego, co w danym zleceniu jest ograniczeniem. Gdy wąskim gardłem jest czas pracy stanowiska — mnożnik czasowy. Gdy zlecenie zjada drogi materiał — materiałowy. Gdy termin zależy od liczby wolnych okien w harmonogramie — slotowy, czyli ten najwyższy. Wzięcie jednego dla wszystkich trzech daje dwie liczby zawyżone i jedną zaniżoną.
Naddatek 20 procent nie wyrównuje uzysku 80 procent
Najczęstszy błąd w tym rachunku jest arytmetyczny, nie pomiarowy: braki wchodzą do oferty jako dodany procent, a powinny wejść jako dzielenie przez uzysk. Żeby wysłać 60 sztuk przy uzysku 80 proc., trzeba zaplanować 60 / 0,8 = 75 sztuk, czyli naddatek 25 proc. Naddatek 20 proc. odpowiada uzyskowi 83,3 proc., nie 80. Przy jednym zleceniu to trzy sztuki mniej w planie i paczka, której nie da się domknąć bez dodatkowego zadania; przy serii — stała dziura w marży, której nie widać w żadnej pozycji oferty.
| Uzysk | Mnożnik (1 / uzysk) | Równoważny naddatek |
|---|---|---|
| 95 proc. | 1,053 | +5,3 proc. |
| 90 proc. | 1,111 | +11,1 proc. |
| 85 proc. | 1,176 | +17,6 proc. |
| 80 proc. | 1,250 | +25,0 proc. |
| 75 proc. | 1,333 | +33,3 proc. |
| 70 proc. | 1,429 | +42,9 proc. |
| 60 proc. | 1,667 | +66,7 proc. |
W przykładzie z tabeli wyżej naiwna wycena na 60 sztuk zakładała 732 g i 47,5 godziny pracy. Faktycznie poszło 877 g i 56,9 godziny, czyli o 19,8 proc. więcej w obu pozycjach. Mnożnik 1,18 na materiale pokrywa to niemal dokładnie, a 1,25 na slotach jest potrzebny po stronie harmonogramu, nie ceny — zlecenie wymaga 19 okien, a nie 15, i to jest liczba, którą podaje się klientowi jako termin. Ten sam błąd poza drukiem wygląda identycznie: oferta policzona na ścieżce, w której nic nie wraca do poprawki, zostawia poprawki poza rachunkiem, co dobrze widać na rozbiorze godzin uciekających z wyceny projektu rozliczanego czasem.
Odrzut na suwmiarce nie zostawia śladu w historii zadań
Historia zadań zna status zadania, nie status sztuki. Zadanie, z którego jedna z czterech tulei wyszła poza tolerancję, ma w bazie completed i w żadnym polu nie pojawi się informacja, że trzy sztuki idą do paczki, a jedna do kosza. Te trzy sztuki z przykładu — 36,6 g materiału i 142 minuty pracy — są w sumie zużycia, ale nie da się ich z niej wyłuskać bez drugiego rejestru.
Drugi rejestr może być arkuszem na pięć kolumn: identyfikator zadania, numer sztuki, etap wykrycia (po zdjęciu, po obróbce, na pomiarze, u klienta), powód i materiał. To wystarczy, żeby po dwóch miesiącach odpowiedzieć na pytanie, które naprawdę decyduje o wycenie: czy braki rozkładają się równo, czy siedzą w jednym materiale, jednej geometrii albo jednym stanowisku. Jeżeli ten rejestr ma się wypełniać sam, a nie wieczorem z pamięci, to zadanie dla prostej automatyzacji — po stronie warsztatu jednoosobowego zwykle wystarczy formularz i arkusz, a podstawy automatyzacji powtarzalnej roboty w jednoosobowej działalności da się złożyć bez programowania.
Rozkład ma jeszcze jedno zastosowanie: pokazuje, kiedy brak przestaje być pozycją w kalkulacji. Odrzut wykryty na pomiarze oznacza, że proces nie trzyma tolerancji, którą zadeklarowano w ofercie — i wtedy podniesienie mnożnika tylko ukrywa problem przed samym sobą. Odrzut wykryty u klienta oznacza, że kontrola odbiorcza nie działa, a to kosztuje więcej niż materiał.
Benchmarki z publikacji różnią się dwudziestokrotnie, bo mierzą inne rzeczy
Pokusa, żeby zamiast pomiaru wziąć liczbę z literatury, kończy się rozrzutem rzędu wielkości. Badanie Song i Telenko z 2019 r., prowadzone w otwartej pracowni uczelnianej, zarejestrowało 41,1 proc. nieudanych wydruków, z czego 26,3 proc. wszystkich wydruków przypisano błędowi człowieka. Przegląd literatury w pracy o monitorowaniu druku modelami językowymi zbiera z kolei wynik 20 proc. nieudanych wydruków z PLA (Wittbrodt i wsp., 2013) oraz 34 proc. odpadu materiałowego dla ABS (Song i Telenko, 2017). Dla warsztatów produkcyjnych krąży natomiast przedział 1-3 proc. podawany bez opisu próby i metody pomiaru.
Te liczby nie są ze sobą sprzeczne, tylko liczą inne rzeczy: udział nieudanych zadań, masę zmarnowanego materiału i udział sztuk odrzuconych to trzy różne wskaźniki. Pracownia otwarta ma inny rozkład przyczyn niż stanowisko, na którym ten sam model idzie dziesiąty raz. Dlatego liczba z publikacji nadaje się do porównania po fakcie, a nie do wstawienia w ofertę — do oferty wchodzi uzysk policzony z własnych 19 wpisów.
Lista kontrolna przed wyceną powtarzalnego zlecenia
- Wyciągnij z historii wpisy z okresu poprzedniej serii tego samego modelu, nie z całego kwartału.
- Policz zadania w rozbiciu na statusy; cancelled trzymaj osobno od error i klippy_disconnect.
- Przelicz filament_used z milimetrów na gramy po gęstości z karty materiału, który pójdzie na to zlecenie.
- Sprawdź, czy w historii nie ma wpisów interrupted — nie ma ich w sumach zbiorczych.
- Nie bierz total_filament_used jako podstawy kosztu jednostkowego; ta suma zawiera już braki.
- Policz trzy uzyski osobno: zadaniowy, slotowy i materiałowy.
- Do oferty wstaw mnożnik 1 / uzysk, nie dodany procent.
- Do terminu wstaw uzysk slotowy, bo harmonogram liczy okna, nie gramy.
- Sprawdź, czy braki nie kumulują się w jednym materiale, jednej geometrii albo jednym stanowisku.
- Jeśli odrzuty wychodzą na pomiarze, zatrzymaj wycenę i wróć do tolerancji w ofercie.
Decyzja, którą trzeba podjąć przed następnym takim zleceniem, jest jedna: który z trzech uzysków wchodzi do oferty, a który do terminu. Jeżeli własne wpisy z historii dają uzysk poniżej mniej więcej 70 proc., mnożnik 1,43 nie jest rozwiązaniem — przy takim rozrzucie zlecenie na 60 sztuk wymaga 86 sztuko-slotów, czyli 22 zadań zamiast 15 — i żadna cena nie zmieści się w terminie, który klient zaakceptuje. Wtedy do zmiany jest proces albo deklarowana tolerancja, a nie arkusz z wyceną.