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.
| Zadanie | Wkład terminala | Kontrola po stronie serwera |
|---|---|---|
| Inwentaryzacja | skanowanie lokalizacji i towaru, wpis ilości | porównanie ze stanem w systemie i raport różnic |
| Kompletacja | potwierdzanie kolejnych pozycji dokumentu | sprawdzenie, czy pozycja należy do dokumentu |
| Przeniesienie nośnika | podanie numeru nośnika i miejsca docelowego | transakcja zmieniająca lokalizację |
| Podgląd stanów | zapytanie 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.

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 systemu | Koniec wsparcia rozszerzonego |
|---|---|
| Windows Embedded Compact 7 | kwiecień 2021 |
| Windows Embedded Compact 2013 | paź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ą.

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.
| Test | Co sprawdza | Kryterium zaliczenia |
|---|---|---|
| Roaming | przełączanie między punktami dostępowymi podczas ruchu | aplikacja wznawia pracę bez ponownego logowania |
| Skanowanie w złych warunkach | etykiety zabrudzone lub zagięte oraz praca w chłodni | odczyt lub czytelny komunikat o błędzie |
| Pełna zmiana | czas pracy na jednej baterii | terminal działa do końca zmiany |
| Utrata łączności | wyjście poza zasięg w trakcie operacji | operacja 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.
| Element | Co ewidencjonować | Po co |
|---|---|---|
| Terminal | numer seryjny, unikalny identyfikator w aplikacji, wersja programu | odróżnienie urządzeń w zapisach operacji |
| Bateria | data wprowadzenia i kolejne wymiany | planowanie wymiany przed osłabieniem pracy zmiany |
| Konfiguracja | adres serwera, nazwa bazy, sposób autoryzacji | szybkie odtworzenie ustawień na urządzeniu zapasowym |
| Zapas | liczba terminali i baterii w rezerwie | cią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ę.
| Obszar | Można zostać przy Windows CE | Warto planować wymianę |
|---|---|---|
| Kody na etykietach | wyłącznie kody liniowe | kody dwuwymiarowe, na przykład GS1 DataMatrix |
| Bezpieczeństwo | wydzielona sieć, brak wymogu audytu poprawek | audyt lub polityka wymagająca aktualnego systemu |
| Stan floty | sprawne baterie i dostępne urządzenia zapasowe | rosnąca liczba awarii, brak części |
| Rozwój procesu | operacje niezmienne od lat | nowe 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.


