Aplikacje dla Windows CE / mobile w systemie Studio WMS.net działają na terminalach radiowych, które przez lata były podstawowym wyposażeniem magazynów. Magazynier skanuje etykietę, aplikacja przekazuje odczyt do bazy SQL Server, a serwer sprawdza zgodność operacji z dokumentem.

Artykuł dotyczy tego, co ta platforma umożliwia i gdzie kończą się jej możliwości. Model pracy na przykładzie Windows Mobile opisuje tekst Windows Mobile w magazynie WMS, a przebieg wymiany sprzętu - artykuł o migracji terminali z Windows CE na Android. Tutaj punkt ciężkości leży na ograniczeniach platformy.

Aplikacje dla Windows CE w Studio WMS.net - zadania terminala

Materiały o Studio WMS.net opisują aplikacje mobilne dla terminali z Windows CE jako narzędzie do inwentaryzacji i kompletacji zamówień. Terminal obsługuje także pozostałe operacje magazynowe. Pracownik ma przy sobie aktualne dane o stanach magazynowych, co ogranicza pomyłki i skraca obchód hali.

ZadanieWkład terminalaKontrola po stronie serwera
Inwentaryzacjaskanowanie lokalizacji i towaru, wpis ilościporównanie ze stanem w systemie i raport różnic
Kompletacjapotwierdzanie kolejnych pozycji dokumentusprawdzenie, czy pozycja należy do dokumentu
Przeniesienie nośnikapodanie numeru nośnika i miejsca docelowegotransakcja zmieniająca lokalizację
Podgląd stanówzapytanie o towar lub lokalizacjęodczyt aktualnego stanu z bazy

Reguła: terminal zbiera potwierdzenia, a o zgodności operacji z dokumentem decyduje serwer.

Konkretne moduły programu na terminalu Motorola Symbol MC9090 opisuje artykuł o parametrach tego kolektora, a ogólne pojęcie urządzenia - strona o terminalu radiowym. Ofertę sprzętu przedstawia serwis producenta w części o terminalach radiowych.

Podział ról jest stały: biuro rejestruje dokumenty PZ i WZ na stanowisku komputerowym, a magazynier potwierdza ich wykonanie na terminalu. Ten sam podział zachowują urządzenia następnej generacji, więc wymiana sprzętu nie zmienia procesu.

Ilustracja terminali radiowych używanych w magazynie do obsługi operacji z Windows CE
Terminale radiowe, na których działają aplikacje mobilne z sekcji o zadaniach terminala.

Wsparcie platformy Windows CE i jego skutki

Nazwy Windows CE i Windows Mobile bywają używane zamiennie, ale to różne wydania. Windows Mobile powstał na jądrze Windows CE jako system dla urządzeń kieszonkowych z pakietem aplikacji, a Windows CE pozostał systemem bazowym dla terminali przemysłowych.

Windows CE rozwijano później pod nazwą Windows Embedded Compact. Microsoft publikuje daty zakończenia wsparcia w tabelach cyklu życia produktu, a dla obu ostatnich wersji rozszerzone wsparcie już się skończyło.

Wersja systemuKoniec wsparcia rozszerzonego
Windows Embedded Compact 7kwiecień 2021
Windows Embedded Compact 2013październik 2023

Daty pochodzą ze stron cyklu życia Windows Embedded Compact 7 oraz Windows Embedded Compact 2013. Konkretny terminal może pracować na starszym wydaniu, więc datę dla własnej floty ustala się po sprawdzeniu wersji systemu w urządzeniu.

Skutki braku wsparcia są praktyczne. System nie dostaje poprawek bezpieczeństwa, a producent terminala wydaje aktualizacje oprogramowania sprzętowego według własnej polityki, która dla modeli wycofanych z oferty zwykle się kończy. Nowe wymagania szyfrowania połączeń mogą więc trafić na urządzenie, którego biblioteki kryptograficzne są zamrożone na dacie ostatniej aktualizacji.

Ograniczenia sprzętowe terminala

Terminale z Windows CE projektowano w czasach, gdy priorytetem była wytrzymałość i czas pracy, a nie moc obliczeniowa. Ograniczenia widać w projekcie ekranów aplikacji, które muszą być proste.

  • Ekran - typowo klasy QVGA, czyli 240 x 320 punktów, więc formularz mieści kilka pól i krótką listę.
  • Skaner - wbudowany skaner laserowy czyta kody liniowe, a kody dwuwymiarowe wymagają czytnika obrazowego.
  • Bateria - ogniwa tracą pojemność z wiekiem i część floty nie dowozi pełnej zmiany.
  • Pamięć - niewielka pamięć operacyjna ogranicza liczbę pozycji ładowanych jednocześnie.

Ostatnie ograniczenie rozwiązuje się po stronie bazy. Terminal pobiera listę pozycji dokumentu stronami po kilkanaście wierszy, a nie w całości. Poniższe zapytanie działa także na starszych wersjach SQL Server, bo używa funkcji ROW_NUMBER; nazwy tabel są przykładowe.

WITH n AS (
    SELECT NosnikId, LokalizacjaId,
           ROW_NUMBER() OVER (ORDER BY NosnikId) AS Lp
    FROM dbo.Nosnik
    WHERE DokumentId = @DokumentId
)
SELECT NosnikId, LokalizacjaId
FROM n
WHERE Lp BETWEEN @Od AND @Do
ORDER BY Lp;

Ograniczenia dotyczą także środowiska programistycznego. Aplikacje dla Windows CE pisze się zwykle w podzbiorze platformy .NET zwanym Compact Framework albo w kodzie natywnym. Podzbiór ma mniej klas niż pełna platforma, więc część bibliotek znanych z komputerów nie istnieje na terminalu, a ich nowsze wersje już się na nim nie pojawią.

Ilustracja terminala z systemem Windows Mobile w pracy magazynowej
Terminal starszej platformy, do którego odnoszą się ograniczenia ekranu i skanera.

Skanowanie i walidacja odczytu na terminalu

Skanowanie jest głównym sposobem wprowadzania danych, bo każdy znak wpisany z klawiatury to okazja do pomyłki. Skaner przekazuje odczyt do aplikacji jako ciąg znaków, a program sprawdza, czy ciąg jest poprawny, zanim trafi na serwer. Kontrola na terminalu oszczędza połączenie i od razu informuje operatora sygnałem dźwiękowym.

Najprostsza kontrola dotyczy cyfry kontrolnej. Kod EAN-13 ma trzynaście cyfr, z których ostatnia wynika z dwunastu poprzednich: cyfry na pozycjach parzystych (drugiej, czwartej itd.) mnoży się przez 3, sumę wszystkich składników dopełnia się do pełnej dziesiątki, a wynik porównuje z cyfrą odczytaną.

static bool PoprawnyEan13(string kod)
{
    if (kod == null || kod.Length != 13) return false;
    int suma = 0;
    for (int i = 0; i < 12; i++)
    {
        if (kod[i] < '0' || kod[i] > '9') return false;
        int cyfra = kod[i] - '0';
        suma += (i % 2 == 0) ? cyfra : 3 * cyfra;
    }
    if (kod[12] < '0' || kod[12] > '9') return false;
    return kod[12] - '0' == (10 - suma % 10) % 10;
}

Kody logistyczne GS1-128 na etykietach nośników mają inną budowę. Identyfikator zastosowania (00) poprzedza numer SSCC nośnika, a terminal ze skanerem laserowym odczyta taką etykietę, o ile jest wydrukowana czytelnie i nie jest zagięta. Opis kodów w magazynie zawiera artykuł o kodach EAN i GS1-128.

Ograniczenia sieciowe i bezpieczeństwa

Terminal łączy się z serwerem przez Wi-Fi hali, więc jakość pracy zależy od zasięgu i od przełączania się między punktami dostępowymi. Starsze urządzenia obsługują ograniczony zestaw metod szyfrowania sieci bezprzewodowej, a jego zakres wynika ze sterownika i wersji oprogramowania sprzętowego. Przy wdrożeniu należy sprawdzić, czy sieć hali nie wymaga metody, której terminal nie zna.

Adres serwera w konfiguracji terminala powinien być stały albo rezerwowany w DHCP, bo zmiana adresu odcina całą flotę do czasu poprawienia ustawień na każdym urządzeniu. Wygodniejsza bywa nazwa DNS zamiast adresu IP, o ile terminal poprawnie ją rozwiązuje.

Ponieważ system nie dostaje poprawek, terminal traktuje się jak urządzenie o podwyższonym ryzyku. Umieszcza się go w wydzielonym segmencie sieci, z dostępem tylko do serwera bazy lub aplikacji i bez wyjścia do Internetu. Konto, którego terminal używa do połączenia z SQL Server, ma prawo wykonywania wybranych procedur, a nie rolę właściciela bazy. Konfigurację takiego konta pokazuje artykuł o terminalu z Windows Mobile.

Zasada: urządzenie bez poprawek bezpieczeństwa łączy się wyłącznie z wydzielonego segmentu sieci i wyłącznie z jednym serwerem.

Praca offline i synchronizacja z serwerem

Materiały o aplikacjach mobilnych Studio WMS.net wskazują możliwość pracy w trybie offline, z synchronizacją zebranych danych z systemem centralnym po powrocie do sieci. Zakres tego trybu zależy od wersji aplikacji i konfiguracji, więc przed zakupem terminali warto potwierdzić u dostawcy, które operacje mogą powstać bez łączności.

Mechanizm synchronizacji opiera się na kolejce operacji zapisywanej lokalnie. Każda operacja dostaje identyfikator generowany na terminalu, a terminal wysyła ją, gdy tylko widzi serwer. Po utracie połączenia w trakcie wysyłki terminal nie wie, czy serwer zdążył zapisać operację, więc ponawia ją z tym samym identyfikatorem.

Reguła: operacja powtórzona po utracie łączności nie może zmienić stanu po raz drugi.

var op = new Operacja { Id = Guid.NewGuid(), Typ = "PRZENIESIENIE",
                        NosnikId = nosnik, DoLokalizacji = miejsce };
kolejka.Dodaj(op);            // zapis lokalny przed próbą wysyłki

while (kolejka.MaOczekujace && siec.Dostepna)
{
    var czekajaca = kolejka.Pierwsza();
    if (serwer.Wyslij(czekajaca)) kolejka.Usun(czekajaca.Id);
    else break;               // ponowienie po odzyskaniu łączności
}

Po stronie serwera identyfikator działa jak klucz idempotencji: druga wysyłka tej samej operacji nie zmienia stanu. Warunek na lokalizację źródłową odrzuca operację, która zdezaktualizowała się przez ruch wykonany w międzyczasie na innym terminalu.

SET XACT_ABORT ON;
IF NOT EXISTS (SELECT 1 FROM dbo.OperacjaTerminala WHERE OperacjaId = @OperacjaId)
BEGIN
    BEGIN TRANSACTION;
    INSERT INTO dbo.OperacjaTerminala (OperacjaId, TerminalId, Czas)
    VALUES (@OperacjaId, @TerminalId, SYSUTCDATETIME());

    UPDATE dbo.Nosnik SET LokalizacjaId = @DoLokalizacji
    WHERE NosnikId = @NosnikId AND LokalizacjaId = @ZLokalizacji;

    IF @@ROWCOUNT <> 1
    BEGIN
        ROLLBACK TRANSACTION;
        THROW 50003, N'Nośnik zmienił lokalizację - operacja do przeglądu.', 1;
    END;
    COMMIT TRANSACTION;
END;

Operacje odrzucone trafiają na listę do przeglądu, a nie znikają. Kierownik zmiany decyduje wtedy, czy powtórzyć ruch, czy poprawić stan ręcznie. Tak samo przebiega uzgadnianie różnic po inwentaryzacji w magazynie.

Uwaga techniczna: wpis usuwa się z lokalnej kolejki dopiero po potwierdzeniu z serwera, a nie w chwili wysłania.

Lokalna kolejka ma skończoną pojemność. Aplikacja powinna ostrzegać operatora, gdy liczba oczekujących operacji przekroczy ustalony próg, i nie pozwalać na dalszą pracę, jeśli pamięć się kończy.

Testy wdrożeniowe i utrzymanie floty terminali

Przed uruchomieniem aplikacji na nowej partii terminali wykonuje się testy, które odtwarzają warunki hali, a nie biura. Wynik jednego dnia w laboratorium niewiele mówi o zachowaniu urządzenia przy regale wysokiego składowania.

TestCo sprawdzaKryterium zaliczenia
Roamingprzełączanie między punktami dostępowymi podczas ruchuaplikacja wznawia pracę bez ponownego logowania
Skanowanie w złych warunkachetykiety zabrudzone lub zagięte oraz praca w chłodniodczyt lub czytelny komunikat o błędzie
Pełna zmianaczas pracy na jednej bateriiterminal działa do końca zmiany
Utrata łącznościwyjście poza zasięg w trakcie operacjioperacja trafia do kolejki, a nie ginie

Chłodnia stawia własne wymagania wobec baterii i ekranów, a przykład takiego wdrożenia opisuje artykuł o systemie WMS w mroźni. Po testach starsza flota wymaga ewidencji, bo awaria jednego terminala bez zapasu zatrzymuje stanowisko.

Wystarczy prosty rejestr wskazujący, które urządzenia są w obiegu i w jakim są stanie.

ElementCo ewidencjonowaćPo co
Terminalnumer seryjny, unikalny identyfikator w aplikacji, wersja programuodróżnienie urządzeń w zapisach operacji
Bateriadata wprowadzenia i kolejne wymianyplanowanie wymiany przed osłabieniem pracy zmiany
Konfiguracjaadres serwera, nazwa bazy, sposób autoryzacjiszybkie odtworzenie ustawień na urządzeniu zapasowym
Zapasliczba terminali i baterii w rezerwieciągłość pracy po awarii

Unikalny identyfikator terminala ma znaczenie wykraczające poza ewidencję. Gdy dwa urządzenia mają ten sam identyfikator, operacje z obu mieszają się w zapisach, a analiza pomyłek staje się niemożliwa.

Zgodność wersji ma znaczenie przy każdej aktualizacji serwera. Terminal wywołuje procedury o ustalonych parametrach i nie da się go zaktualizować w kilka minut jak komputera. Zmiany procedur obsługujących terminale wprowadza się więc w sposób zgodny wstecz: nowy parametr dostaje wartość domyślną, dzięki czemu starsza wersja aplikacji nadal działa.

ALTER PROCEDURE dbo.PotwierdzPrzeniesienie
    @OperacjaId uniqueidentifier,
    @NosnikId int,
    @DoLokalizacji int,
    @Uwagi nvarchar(200) = NULL   -- nowy parametr, opcjonalny
AS
BEGIN
    SET NOCOUNT ON;
    UPDATE dbo.Nosnik SET LokalizacjaId = @DoLokalizacji WHERE NosnikId = @NosnikId;
END;

Kiedy zostać przy Windows CE, a kiedy planować wymianę

Decyzja nie wymaga dat granicznych, tylko oceny czterech obszarów. Poniższa tabela zestawia sytuacje, w których dalsze użytkowanie terminali jest uzasadnione, i te, w których warto zaplanować wymianę.

ObszarMożna zostać przy Windows CEWarto planować wymianę
Kody na etykietachwyłącznie kody liniowekody dwuwymiarowe, na przykład GS1 DataMatrix
Bezpieczeństwowydzielona sieć, brak wymogu audytu poprawekaudyt lub polityka wymagająca aktualnego systemu
Stan flotysprawne baterie i dostępne urządzenia zapasowerosnąca liczba awarii, brak części
Rozwój procesuoperacje niezmienne od latnowe funkcje mobilne, na przykład zdjęcia i kody QR

Koszt wymiany obejmuje więcej niż same terminale. Dochodzą ładowarki i uchwyty, ponowna konfiguracja sieci, szkolenie operatorów przyzwyczajonych do klawiatury oraz okres, w którym pracują obie platformy. Dlatego wymianę planuje się etapami, po jednym stanowisku lub jednej strefie, tak aby stare urządzenia nie blokowały nowych.

Zmiana platformy dotyczy urządzeń i aplikacji klienckiej, a baza danych może pozostać ta sama. Model urządzeń z Androidem opisują artykuły o aplikacji magazynowej na Androida i o doborze kolektora danych, a ogólny przegląd aplikacji systemu - tekst o aplikacjach WMS. Szczegóły produktu zawiera strona Studio WMS.net w serwisie SoftwareStudio.

Tablety i terminale mobilne w magazynie jako następcy urządzeń z Windows CE
Urządzenia mobilne nowszej generacji, do których przechodzi się przy wymianie floty.