Etykieta logistyczna wygląda na najprostszy element całego procesu. Kawałek papieru, kilka linii tekstu i pasek kresek. W praktyce to na niej opiera się każda kolejna operacja: przyjęcie, przesunięcie, kompletacja i wydanie. Jeśli kod na etykiecie jest zbudowany niepoprawnie, problem nie ujawnia się przy druku, tylko kilka dni później, u odbiorcy, przy odrzuconej dostawie. Poniżej pokazujemy, jak powstaje szablon w języku ZPL i jak sprawdzić go zanim wyjedzie z magazynu.

O czym przeczytasz na tej stronie

Dlaczego drukarki etykiet przyjmują kod, a nie obraz

Drukarka biurowa dostaje z komputera gotowy obraz strony. Drukarka etykiet działa inaczej - przyjmuje opis tekstowy i sama go rysuje. Język ZPL, opracowany przez Zebra Technologies, jest w tej roli standardem, który obsługują także urządzenia innych producentów.

Różnica wynika z trzech rzeczy. Pierwsza to objętość: opis etykiety zajmuje kilkaset bajtów, obraz tej samej etykiety setki kilobajtów, a przy druku seryjnym ta proporcja przekłada się wprost na czas oczekiwania. Druga to podział pracy - przeliczaniem opisu na punkty zajmuje się procesor drukarki, a nie serwer aplikacji. Trzecia jest najważniejsza dla magazynu: kod kreskowy rysowany bezpośrednio przez drukarkę powstaje w rozdzielczości głowicy, więc jego kreski mają ostre krawędzie. Obraz przeskalowany z innej rozdzielczości daje kreski rozmyte, a taki kod czytnik odczytuje gorzej, zwłaszcza pod kątem albo z dystansu.

Podstawowe komendy języka ZPL

Komendy ZPL zaczynają się od daszka, gdy dotyczą formatowania etykiety, albo od tyldy, gdy sterują samą drukarką. Każda etykieta zaczyna się znacznikiem otwierającym i kończy zamykającym, a wszystko pomiędzy nimi to definicja jednego wydruku.

Komendy spotykane w szablonach etykiet logistycznych
KomendaRolaUwagi praktyczne
^XA i ^XZotwarcie i zamknięcie formatu etykietywszystko poza tą parą drukarka ignoruje
^CI28ustawienie kodowania na UTF-8bez tego polskie znaki wychodzą jako krzaki
^FOx,ypunkt początkowy pola, liczony w punktach od lewego górnego rogupunkt to nie milimetr - przelicznik zależy od rozdzielczości
^A0N,h,wczcionka skalowalna, orientacja pozioma, wysokość i szerokość znakulitera N oznacza brak obrotu, R obrót o 90 stopni
^BYszerokość najcieńszej kreski kodudecyduje o czytelności bardziej niż wysokość
^BCo,h,f,g,ekod liniowy Code 128parametr f włącza czytelną interpretację pod kodem
^BXo,h,skod dwuwymiarowy DataMatrixparametr h to rozmiar pojedynczego modułu matrycy
^FD ... ^FStreść pola i jego zamknięciebrak zamknięcia powoduje sklejenie kolejnych pól

Najprostsza sensowna etykieta ma więc postać złożoną z otwarcia, ustawienia kodowania, kilku pól tekstowych, jednego pola kodu i zamknięcia. Wszystkie współrzędne liczone są w punktach, a nie w milimetrach - przy głowicy 203 punktów na cal jeden milimetr to około ośmiu punktów, przy 300 punktach na cal blisko dwunastu.

Tokeny danych, czyli jeden szablon na tysiąc etykiet

Etykieta o stałej treści przydaje się rzadko. W magazynie zmienia się prawie wszystko: nazwa towaru, numer partii, termin ważności, numer nośnika. Dlatego szablon zawiera tokeny - znaczniki, które w chwili wydruku system zastępuje wartościami z dokumentu.

W Studio WMS.net tokeny są wypisane nad polem kodu i wstawiają się w pozycji kursora po kliknięciu, więc nie trzeba ich pamiętać ani przepisywać. Zestaw obejmuje numer towaru, numer nośnika, partię, termin ważności w dwóch formatach, datę produkcji, ilość, nazwę, indeks kartotekowy oraz kod branży medycznej. Budowę numeru nośnika SSCC opisuje standard GS1 Polska.

Tokeny dostępne w szablonach i ich źródło
TokenCo podstawiaSkąd pochodzi wartość
{GTIN}globalny numer jednostki handlowejkartoteka asortymentowa
{SSCC}numer jednostki logistycznejrejestr jednostek albo generator z prefiksu firmy
{LOT}numer partii produkcyjnejpozycja dokumentu
{EXP}termin ważności w zapisie czytelnympozycja dokumentu
{EXPRRMMDD}ten sam termin w zapisie sześciocyfrowymprzeliczany automatycznie z terminu ważności
{PROD}data produkcjipozycja dokumentu
{ILOSC}ilość na jednostcepozycja dokumentu
{NAZWA} i {INDEKS}nazwa towaru i indeks kartotekowykartoteka asortymentowa
{HIBC}kod branży medycznejkartoteka asortymentowa

Dwa formaty daty to szczegół, który oszczędza sporo kłopotu. Pod kodem kreskowym potrzebny jest zapis sześciocyfrowy wymagany przez standard, a w tekście czytelnym dla człowieka data z myślnikami. Oba pochodzą z tego samego pola dokumentu, więc nie da się ich rozjechać. Skąd numer partii i termin ważności biorą się w systemie, opisujemy przy ewidencji partii produkcyjnych i dat ważności.

Kodowanie danych GS1 w polu kodu kreskowego

Pole tekstowe przyjmuje treść wprost. Pole kodu kreskowego wymaga dodatkowo zapisania, w jakim trybie drukarka ma kodować znaki i gdzie wstawić symbol funkcyjny standardu GS1. Służą do tego sekwencje sterujące umieszczane w danych pola.

etykieta paletowa - numer nośnika pod identyfikatorem 00:
^FO30,170^BY4^BCN,200,Y,N,N^FD>;>800{SSCC}^FS
>; przełącza kodowanie na tryb cyfrowy, >8 wstawia symbol funkcyjny

W kodzie dwuwymiarowym rolę symbolu funkcyjnego pełni znak ucieczki zdefiniowany w parametrach pola, zwykle podkreślenie z cyfrą jeden. Zasada pozostaje ta sama: identyfikatory zastosowań i ich wartości zapisuje się w danych pola w takiej kolejności, w jakiej mają zostać odczytane. Budowę samych identyfikatorów i zasady ich łączenia opisujemy przy kodach GS1-128 i GS1 DataMatrix.

Najczęstszy błąd w szablonie. Pomyłka o jeden znak między identyfikatorem a tokenem przesuwa cały ciąg. Etykieta wygląda normalnie, kod się drukuje, czytnik go odczytuje - ale parser dostaje dane w złych granicach pól. Tego rodzaju usterki nie widać ani w edytorze, ani na wydruku.

Podgląd wydruku i plik gotowy do wysłania

Zanim szablon trafi do obiegu, warto zobaczyć jego wynik na danych przykładowych. Zakładka podglądu podstawia przygotowane wartości pod tokeny i pokazuje trzy rzeczy naraz: gotowy kod, jego postać do pobrania oraz poglądowy wygląd etykiety.

Studio WMS.net - zakładka podglądu wydruku z danymi przykładowymi podstawianymi pod tokeny szablonu
Dane przykładowe podstawiane pod tokeny - można sprawdzić szablon bez pobierania danych z dokumentu

Po wygenerowaniu widać kod z podstawionymi wartościami i podgląd etykiety z narysowanym kodem kreskowym oraz czytelną interpretacją pod nim. Podgląd jest orientacyjny - rzeczywisty wygląd zależy od rozdzielczości głowicy i ustawień urządzenia - ale wystarcza, żeby wychwycić nachodzące na siebie pola albo tekst wychodzący poza etykietę.

Studio WMS.net - wygenerowany kod ZPL z podstawionymi wartościami oraz poglądowy wygląd etykiety paletowej
Wynikowy kod ZPL z podstawionymi wartościami i poglądowy wygląd etykiety paletowej z numerem nośnika

Gotowy kod można pobrać jako plik albo skopiować do schowka. W pracy produkcyjnej ten sam strumień wysyła się bezpośrednio na adres sieciowy drukarki, standardowo na port 9100, więc między systemem a urządzeniem nie ma sterownika, który mógłby coś zmienić po drodze.

Sprawdź szablon parserem, zanim pojedzie na drukarkę

Podgląd pokazuje, czy etykieta dobrze wygląda. Nie odpowiada natomiast na pytanie, czy zapisane w kodzie dane dadzą się poprawnie odczytać. Te dwie rzeczy nie są tym samym i właśnie na tej różnicy powstaje najwięcej kosztownych pomyłek.

Sprawdzenie zajmuje chwilę. Wystarczy skopiować z wygenerowanego kodu tę część, która trafia do symbolu, poprzedzić ją identyfikatorem symboliki i wkleić do transakcji weryfikacji etykiety. Parser rozbierze ciąg tak, jak zrobi to czytnik u odbiorcy.

Studio WMS.net - wynik sprawdzenia wygenerowanego kodu z szablonu, etykieta nie przechodzi weryfikacji
Kod wygenerowany z szablonu wklejony do parsera - protokół kontroli wskazuje nieznany identyfikator

Wynik na zrzucie powyżej pochodzi z prawdziwego testu, a nie z przykładu ułożonego pod tezę. Wzięliśmy jeden z szablonów demonstracyjnych, wygenerowaliśmy z niego wydruk i wkleiliśmy powstały ciąg do parsera. Protokół kontroli zgłosił nieznany identyfikator zastosowań na konkretnej pozycji oraz niezgodną cyfrę kontrolną numeru towaru, a pola terminu ważności i partii w ogóle nie powstały. Przyczyną był jeden nadmiarowy znak między identyfikatorem a tokenem numeru towaru - po jego usunięciu ten sam kod przechodzi wszystkie kontrole i daje trzy poprawne pola.

Co sprawdzić w wyniku weryfikacji szablonu
Element protokołuCzego szukaćTypowa przyczyna niepowodzenia
Rozpoznanie standarduczy parser skierował kod do właściwego standardubrak symbolu funkcyjnego na początku danych
Struktura pólczy liczba pól odpowiada oczekiwaniomprzesunięcie ciągu o jeden znak albo brak separatora
Separatorczy separator wystąpił tam, gdzie powinienpole zmiennej długości niezakończone w środku ciągu
Cyfry kontrolneczy numery przechodzą kontrolę sumyzła długość wartości podstawionej pod token
Pola datczy daty zostały rozpoznane i przeliczoneużycie tokena w zapisie czytelnym zamiast sześciocyfrowego

Cała procedura zajmuje mniej niż minutę na szablon, a wyłapuje dokładnie te błędy, które inaczej ujawniają się dopiero przy przyjęciu towaru u odbiorcy. Sam mechanizm kontroli opisujemy szerzej przy weryfikacji etykiet w czasie rzeczywistym.

Dobór parametrów do rozdzielczości głowicy

Ten sam szablon wydrukowany na urządzeniu o innej rozdzielczości da inny efekt, bo wszystkie współrzędne i wymiary podaje się w punktach. Szablon przygotowany dla głowicy 203 punktów na cal, wysłany na urządzenie 300 punktów na cal, wydrukuje się mniej więcej w dwóch trzecich zamierzonego rozmiaru.

Przelicznik i typowe zastosowania rozdzielczości
RozdzielczośćPunktów na milimetrTypowe zastosowanie
203 dpiokoło 8etykiety paletowe i kartonowe, kody liniowe, teksty od 3 mm wzwyż
300 dpiokoło 12małe etykiety jednostkowe, kody dwuwymiarowe, drobny druk
600 dpiokoło 24oznaczenia miniaturowe, elektronika, wyroby medyczne

Praktyczna zasada jest taka, że rozdzielczość dobiera się do najmniejszego elementu na etykiecie, a nie do jej wielkości. Duża etykieta paletowa z czytelnym kodem liniowym nie wymaga niczego więcej niż 203 punktów na cal, natomiast kod dwuwymiarowy na opakowaniu jednostkowym przy takiej głowicy będzie na granicy czytelności. Dlatego w module szablonów rozdzielczość jest zapisana przy każdym szablonie osobno, razem z wymiarem etykiety.

Drugi parametr wart uwagi to szerokość najcieńszej kreski. Zwiększenie jej z dwóch do czterech punktów podwaja szerokość całego kodu, ale też wyraźnie poprawia odczyt z odległości i pod kątem. Przy etykiecie paletowej, skanowanej często z wózka, ta zamiana miejsca na niezawodność zwykle się opłaca. Dobór urządzenia do warunków pracy omawiamy przy drukarkach kodów kreskowych, a wpływ jakości druku na odczyt - przy znakowaniu towarów w magazynie.

Utrzymywanie kilku szablonów zamiast jednego uniwersalnego jest normą. Etykieta nośnika, etykieta kartonu i oznaczenie opakowania jednostkowego różnią się formatem i zestawem danych, ale korzystają z tego samego zestawu tokenów, więc wartości pochodzą zawsze z tych samych pól. Powiązanie nośnika z jego zawartością opisujemy przy etykietach logistycznych GS1, a jakość odczytów w skali całego magazynu - przy wskaźnikach skanowania.

Najczęściej zadawane pytania

Poniżej odpowiedzi na pytania, które najczęściej pojawiają się przy budowaniu własnych szablonów etykiet.

Kod ZPL to kilkaset bajtów tekstu, obraz tej samej etykiety to setki kilobajtów. Przy druku seryjnym różnica przekłada się wprost na czas oczekiwania i obciążenie sieci. Drugi powód jest ważniejszy: kod kreskowy rysowany przez drukarkę powstaje w rozdzielczości głowicy, więc jego krawędzie są ostre. Obraz przeskalowany z innej rozdzielczości daje rozmyte kreski, które czytnik odczytuje gorzej.

Odpowiada za polskie znaki diakrytyczne. Bez ustawienia kodowania na UTF-8 drukarka wydrukuje w miejscu liter z ogonkami znaki przypadkowe albo puste pola. Komenda powinna stać zaraz po znaczniku otwierającym etykietę, przed pierwszym polem tekstowym.

Wysokość to po prostu długość kresek i wpływa na to, z jakiej odległości da się odczytać kod. Szerokość modułu określa grubość najcieńszej kreski i decyduje o tym, czy kod w ogóle jest czytelny. Zbyt mała wartość przy niskiej rozdzielczości głowicy daje kod, który wygląda poprawnie, ale rozpada się przy odczycie pod kątem albo z większej odległości.

W kodzie liniowym używa się sekwencji sterującej wewnątrz danych pola, która przełącza kodowanie i wstawia symbol funkcyjny. W kodzie dwuwymiarowym rolę tę pełni znak ucieczki zdefiniowany w parametrach pola kodu. W obu przypadkach separator zapisuje się w danych, a nie jako osobną komendę, i to on decyduje, gdzie kończy się pole o zmiennej długości.

Wygenerować podgląd z danymi przykładowymi, skopiować wynikowy ciąg danych z pola kodu kreskowego i wkleić go do transakcji weryfikacji etykiety. Parser powie, ile pól wyodrębnił i czy cyfry kontrolne się zgadzają. Jeśli spodziewamy się trzech pól, a system zgłasza dwa albo nieznany identyfikator, szablon ma błąd.

Zwykle nie. Etykieta paletowa, etykieta kartonu zbiorczego i oznaczenie opakowania jednostkowego różnią się formatem, zestawem danych i rozdzielczością druku. Praktyka jest taka, że utrzymuje się kilka szablonów przypisanych do typów jednostek i standardów, a wspólny pozostaje zestaw tokenów, dzięki czemu dane pochodzą zawsze z tych samych pól dokumentu.

Glosariusz pojęć

ZPL
język opisu etykiety opracowany przez Zebra Technologies, przesyłany do drukarki jako zwykły tekst.
Token danych
znacznik w szablonie zastępowany rzeczywistą wartością z bazy w chwili generowania wydruku.
Punkt (dot)
najmniejszy element obrazu drukowany przez głowicę; liczba punktów na cal wynika z rozdzielczości urządzenia.
Szerokość modułu
grubość najcieńszej kreski kodu, wyrażona w punktach, decydująca o czytelności symbolu.
Interpretacja czytelna
ciąg znaków drukowany pod kodem, umożliwiający ręczne odczytanie danych, gdy skaner zawiedzie.
Zestaw znaków
ustawienie określające sposób kodowania liter, wymagane do poprawnego druku polskich znaków diakrytycznych.
Port 9100
standardowy port sieciowy, na który wysyła się strumień danych do drukarki etykiet.
Podzbiór kodu
tryb kodowania znaków w kodzie liniowym, osobny dla ciągów cyfrowych i dla alfanumerycznych.

Warto przeczytać