Magazyn wysokiego składowania zmienia koszt każdej pomyłki. Paleta odłożona w złe gniazdo na wysokości dziesięciu metrów oznacza ponowny przejazd korytarzem i kolejny cykl podnoszenia, więc system ma pomyłkę uniemożliwić, a nie tylko zapisać. Magazynowe systemy informatyczne w takim obiekcie projektuje się warstwowo, a każdej warstwie przypisuje się inną klasę awarii.

Ta strona opisuje architekturę: co robią terminal i aplikacja oraz baza danych i ERP, a także gdzie kończy się odpowiedzialność WMS, a zaczyna sterowanie urządzeniami automatyki. Ogólny podział warstw omawia tekst o informatycznym systemie magazynowym, a model dokumentów i ruchów opisuje strona o magazynowym systemie informatycznym. Pracę operatora przy regałach pokazuje artykuł o aplikacji dla magazynów wysokiego składowania.

Magazynowe systemy informatyczne w wysokim składzie

W magazynie płaskim błąd adresu poprawia się krokiem. W wysokim składzie poprawia go dopiero drugi przejazd wózka, a w wąskim korytarzu blokuje on pracę pozostałych. Z tej różnicy wynikają cztery wymagania wobec architektury:

  • Adres z poziomem regału - lokalizacja musi wskazywać belkę, a nie tylko regał, bo dla wózka to dwie różne operacje.
  • Potwierdzenie skanem - stan zmienia się po skanie gniazda, a nie po wysłaniu zadania.
  • Rezerwacja gniazda - gniazdo docelowe blokuje się w chwili utworzenia zadania, zanim wózek ruszy.
  • Ciągłość pracy - chwilowy brak łączności nie może zatrzymać odkładania i pobierania palet.

Zestawienie poniżej przypisuje te wymagania do warstw. Piąty wiersz dotyczy magazynów z automatyką fizyczną i w pozostałych obiektach nie występuje.

WarstwaZadanie w wysokim składzieSzczególne wymaganieTypowy objaw awarii
Terminalskanowanie gniazda i palety, potwierdzanie ruchuodczyt z wysokości, praca w cieniu radiowym regałówskan bez odpowiedzi lub potwierdzenie zgubione
Aplikacjawalidacja i przydział zadań wózkomzgodność gniazda z wózkiem i paletązadanie trafia do wózka, który nie sięgnie gniazda
Baza danychstan lokalizacji i historia ruchówjedna paleta w jednym gnieździedwa zadania wskazują to samo gniazdo
ERPdokumenty księgowe i handloweprzyjęcie dokumentu dopiero po zatwierdzeniurozbieżność stanu księgowego i lokalizacyjnego
Sterowanie automatykąruch przenośników i urządzeń składującychoddzielenie zleceń biznesowych od bezpieczeństwa maszynzlecenie wysłane, brak potwierdzenia z urządzenia

Reguła: stan lokalizacji zmienia się dopiero po potwierdzeniu ruchu, a nie po wysłaniu zadania. Wysłane zadanie tworzy rezerwację, a nie przesunięcie.

Terminal na wózku i etykiety na regale

Terminal montowany na wózku albo noszony przez magazyniera skanuje dwa kody: etykietę gniazda i etykietę palety. Skan lokalizacji potwierdza, że wózek stoi przed właściwym gniazdem, a skan palety, że podniesiono właściwą jednostkę. Dla pozycji dokumentu, czyli palet, system generuje etykiety nośników, które ułatwiają identyfikację jednostek logistycznych na każdym etapie obiegu towaru.

Ręczny terminal przemysłowy z ekranem dotykowym trzymany w dłoniach na tle regałów magazynowych
Terminal jako warstwa zbierająca zdarzenia z hali: skan gniazda i skan palety.

Paletę identyfikuje się jednoznacznie numerem SSCC, czyli 18-cyfrowym kodem jednostki logistycznej. Zasady jego budowy opisuje standard GS1, a informacje o kluczu identyfikacyjnym zawiera strona GS1 Polska o SSCC. Jeśli ten sam numer widnieje na etykiecie i w bazie, a potem w dokumencie ERP, żaden z tych zapisów nie wymaga tłumaczenia.

Łączność bywa słabszym ogniwem niż terminal. Regały metalowe i wąskie korytarze tworzą cienie radiowe, więc zasięg Wi-Fi projektuje się dla każdego korytarza, a nie dla hali jako całości. Zestawienie sprzętu radiowego zawiera strona o terminalach radiowych, a wymagania wobec terminali w hali opisuje tekst o terminalu radiowym w magazynie.

Wymaganie wobec aplikacji terminalowej jest jedno: potwierdzenie ruchu ma dojść do serwera dokładnie raz, nawet przy przerwie w łączności. Terminal zapisuje potwierdzenie lokalnie i ponawia wysyłkę z tym samym identyfikatorem zadania, a serwer rozpoznaje duplikat i go pomija.

Aplikacja i przydział zadań

Warstwa aplikacji zamienia przyjęcie palety w zadanie odkładania. Sprawdza przy tym wymiary palety względem prześwitu gniazda oraz masę względem nośności belki, a osobno klasę wózka względem wysokości poziomu. Wybór samego gniazda, czyli rozmieszczenie według rotacji, opisuje artykuł o slottingu i analizie ABC, a zasady oceny lokalizacji zbiera strona o kryteriach wyboru lokalizacji.

Klasa wózka i zasięg gniazda

Każde gniazdo niesie atrybut klasy wózka, która je obsłuży, a każdy wózek klasę, do której należy. Przydział zadań filtruje kolejkę tym warunkiem, zanim wybierze najstarsze zadanie, dzięki czemu wózek czołowy nie dostaje zadania sięgającego poza jego zasięg. Wartości zasięgu zależą od modelu wózka i konstrukcji regału, więc ustala się je przy konfiguracji obiektu, a nie na stałe w kodzie. Osobna kwestia to priorytet: zadania wydania mogą wyprzedzać odkładanie, gdy kolejka do rampy rośnie, ale jest to parametr procesu i wymaga zatwierdzenia przez kierownika magazynu.

Zadanie przechodzi przez kilka statusów i tylko jeden z nich zmienia stan lokalizacji. Zestawienie pokazuje cykl zadania odkładania oraz to, kto zmienia jego status.

Status zadaniaZnaczenieKto zmienia statusSkutek dla stanu lokalizacji
Utworzonereguły wskazały gniazdo doceloweaplikacjagniazdo zarezerwowane, stan bez zmian
Przydzielonezadanie przypisane konkretnemu wózkowiaplikacjabez zmian
W tokuoperator zeskanował paletęterminalpaleta w drodze, gniazdo nadal zarezerwowane
Wykonaneskan gniazda potwierdził odłożenieterminalpaleta przypisana do gniazda
Anulowanegniazdo okazało się zajęte lub zablokowaneaplikacja lub operatorrezerwacja zwolniona, wyznaczenie nowego gniazda

Rozdzielenie rezerwacji od zapisu ruchu ma prosty powód: zadania czekają w kolejce, a w tym czasie inny operator nie może dostać tego samego gniazda. Bez rezerwacji dwa wózki jadą do jednego miejsca, a drugi z nich wraca z paletą, którą trzeba odłożyć ponownie. Stan lokalizacji zasila widok zajętości magazynu, w którym kierownik sprawdza w graficznej tabeli, które gniazda są zajęte i gdzie leży wskazany indeks.

Baza danych i stan lokalizacji

Baza jest miejscem, w którym gwarantuje się to, czego aplikacja nie może zapewnić sama. Jeżeli dwa zadania trafią na serwer w tej samej chwili, kolejność rozstrzyga silnik bazy, a nie pamięć procesu. Poniższy szkic tabel pokazuje mechanizm; nazwy są przykładowe i nie odpowiadają schematowi konkretnego produktu.

CREATE TABLE dbo.Locations (
    LocationId int IDENTITY(1, 1) PRIMARY KEY,
    Aisle      tinyint NOT NULL,
    Bay        tinyint NOT NULL,
    RackLevel  tinyint NOT NULL,
    Status     varchar(10) NOT NULL DEFAULT 'Free'  -- Free, Reserved, Occupied, Blocked
);

CREATE TABLE dbo.PalletPlacement (
    Sscc       char(18) NOT NULL PRIMARY KEY,
    LocationId int NOT NULL REFERENCES dbo.Locations (LocationId)
);

-- jedna paleta w jednym gnieździe (regał jednogłębokości)
CREATE UNIQUE INDEX UX_PalletPlacement_Location
    ON dbo.PalletPlacement (LocationId);

Indeks unikalny odrzuci drugą paletę w tym samym gnieździe nawet wtedy, gdy błąd w aplikacji ominie sprawdzenie. Składnię i ograniczenia opisuje dokumentacja o indeksach unikalnych w SQL Server. W regale dwugłębokim klucz obejmuje także głębokość, więc definicję trzeba dopasować do konstrukcji regału.

Rezerwację gniazda wykonuje jedno polecenie, które sprawdza status i zmienia go w tej samej operacji. Gdy nie zmieni żadnego wiersza, gniazdo nie było wolne i zadanie wraca do wyznaczenia:

UPDATE dbo.Locations
SET Status = 'Reserved'
WHERE LocationId = @LocationId
  AND Status = 'Free';

IF @@ROWCOUNT = 0
    THROW 50001, 'Gniazdo nie jest wolne.', 1;

Reguła: warunek Status = „Free” w klauzuli WHERE działa jak zamek: dwie równoległe sesje nie zarezerwują tego samego wiersza, bo druga zobaczy już zmieniony status. Historia zmian zostaje w dzienniku ruchów, więc dla każdego gniazda można odtworzyć, kto i kiedy je zajął.

Automatyka i warstwa sterowania

W magazynach wysokiego składowania system WMS współpracuje również z automatyką fizyczną, taką jak przenośniki i sortery oraz automatyczne systemy składowania i wyszukiwania towaru (AS/RS). Integracja z takimi urządzeniami ogranicza udział pracy ręcznej i zwiększa przepustowość bez rozbudowy powierzchni. Jeden operator nadzoruje wtedy więcej urządzeń, a WMS koordynuje kolejność zadań kierowanych do poszczególnych stref.

W typowej architekturze pomiędzy WMS a maszynami stoi warstwa sterowania magazynem (WCS), a nad samymi urządzeniami sterownik PLC. W mniejszych instalacjach rola WCS bywa wbudowana w oprogramowanie dostawcy urządzeń. Każda warstwa decyduje o czym innym, co pokazuje poniższy podział.

WarstwaDecyduje oNie decyduje oTypowy komunikat
WMSjaki towar oraz skąd i dokąd, z jakim priorytetemtrajektorii i prędkości urządzeniazlecenie transportu palety
WCSkolejności i trasie urządzeń, unikaniu kolizjistanie księgowym towarurozkaz ruchu dla urządzenia
Sterownik PLCruchu mechanicznym, czujnikach, blokadach bezpieczeństwatym, co znajduje się na paleciesygnały wejść i wyjść

Reguła: WMS wysyła zlecenie, czyli co i dokąd, a nie polecenie ruchu urządzenia. Bezpieczeństwo maszyn należy do sterownika, nigdy do aplikacji biznesowej.

Zlecenie do warstwy sterowania wysyła się z identyfikatorem, który pozwala ponowić wysyłkę bez podwójnego wykonania. Przykład w C# pokazuje ideę na hipotetycznym interfejsie REST; rzeczywiste interfejsy sterowników bywają inne, także oparte na protokołach przemysłowych:

using System.Net.Http.Json;

public sealed record TransportOrder(
    Guid OrderId, string Sscc, string FromLocation, string ToLocation);

public static async Task<bool> SendAsync(
    HttpClient http, TransportOrder order, CancellationToken ct)
{
    using var req = new HttpRequestMessage(HttpMethod.Post, "/api/transport-orders")
    {
        Content = JsonContent.Create(order)
    };
    req.Headers.Add("Idempotency-Key", order.OrderId.ToString());

    using var resp = await http.SendAsync(req, ct);
    return resp.IsSuccessStatusCode;
}

Wysłanie zlecenia nie zmienia stanu lokalizacji. Zmienia go dopiero potwierdzenie z warstwy sterowania, czyli sygnał czujnika przy gnieździe albo skan przy wejściu do układu. Szersze omówienie współpracy WMS z robotami i innymi urządzeniami zawiera strona o automatyzacji w magazynie, a decyzję o wdrożeniu w takim obiekcie opisuje artykuł, czy wdrożyć WMS w magazynie wysokiego składowania.

ERP i granica odpowiedzialności

W firmach świadczących usługi logistyczne systemy WMS stanowią zwykle technologię wspierającą nadrzędny system ERP. Oprogramowanie magazynowe, zainstalowane w magazynie albo w chmurze prywatnej, współpracuje z ERP przez wymianę dokumentów. Dla operatorów logistycznych jest to podstawa pracy, bo obsługują wielu nadawców i odbiorców jednocześnie.

W wysokim składzie WMS zapisuje znacznie więcej zdarzeń, niż ERP powinno zobaczyć. Ruch palety między gniazdami w obrębie tego samego magazynu zmienia lokalizację, ale nie zmienia stanu księgowego. Do ERP trafiają dopiero zdarzenia, które zmieniają stan magazynu lub jego wartość.

Zdarzenie w magazynieZapis w WMSDokument w ERP
Przesunięcie palety między gniazdamiruch lokalizacyjny w dziennikuzwykle brak dokumentu
Przyjęcie od dostawcyPZ z paletami i lokalizacjamiPZ zatwierdzone
Wydanie do odbiorcyWZ z listą paletWZ zatwierdzone
Przesunięcie do innego magazynuMM z paletamiMM w obu magazynach
Różnica po spisiepozycja korygującadokument korygujący stan

Wymiana obejmuje potwierdzenia dokumentów, a nie strumień ruchów, więc łącze do ERP nie musi nadążać za tempem wózków. Opis kanałów wymiany i powtórzeń bez duplikatów zawiera artykuł o integracji WMS z ERP.

Awarie i tryb awaryjny

Każda warstwa ma inny tryb awarii, więc każda potrzebuje własnego zachowania awaryjnego. Zasada jest jedna: awaria nie może prowadzić do cichej zmiany stanu, a niepewną paletę oznacza się i wyłącza z obrotu, zamiast zgadywać jej położenie. Cztery najczęstsze sytuacje i oczekiwana reakcja wyglądają następująco:

  • Terminal bez łączności - potwierdzenia trafiają do bufora na urządzeniu i wysyłają się po odzyskaniu sieci, z tym samym identyfikatorem zadania.
  • Urządzenie w błędzie - zlecenie zostaje w statusie oczekującym, a rezerwacja gniazda pozostaje do decyzji operatora.
  • Baza niedostępna - terminale nie przyjmują nowych zadań, a wykonane ruchy czekają na zapis, bo bez bazy nie da się zagwarantować unikalności gniazda.
  • ERP niedostępne - dokumenty zatwierdzone w WMS czekają w kolejce wysyłki, a praca hali toczy się bez zmian.
Pracownicy w kamizelkach odblaskowych rozmawiają przy wózku widłowym z terminalem na tle wysokich regałów
Decyzja operatora przy gnieździe w trybie awaryjnym: wyjaśnienie rozbieżności między stanem fizycznym a zapisem.

Najtrudniejszą sytuacją jest rozbieżność między stanem fizycznym a zapisem: gniazdo puste, gdy system spodziewa się palety, albo zajęte, gdy system uznaje je za wolne. Procedura jest prosta: najpierw gniazdo blokuje się w systemie, a operator weryfikuje jego zawartość skanem. Dopiero po tym kierownik zmiany zatwierdza korektę z zapisem przyczyny, a gniazdo wraca do obrotu. Wpis w historii ruchów pozwala później znaleźć źródło pomyłki.

Sprawdzenie tych zachowań należy do testów odbiorczych, a nie do dokumentacji: wyłącza się sieć terminala i zatrzymuje urządzenie, a następnie odłącza ERP, po czym obserwuje stan kolejki i rezerwacji. Producent prezentuje system na stronie programu magazynowego WMS.