Kodowanie EPC (SGTIN-96), TID i pamięć tagu – przewodnik dla IT
Kodowanie EPC SGTIN-96 to zamiana numeru GTIN i numeru seryjnego sztuki na 96-bitowy identyfikator zapisany w banku EPC tagu UHF – według reguł GS1 EPC Tag Data Standard.
Spis treści
- Pamięć tagu Gen2: Reserved, EPC, TID, User
- Struktura SGTIN-96
- Kodowanie EPC SGTIN-96 – przykład krok po kroku
- EPC URI i inne zapisy tego samego numeru
- Ograniczenia SGTIN-96 i schematy TDS 2.x (SGTIN+)
- Hasła access i kill, blokada pamięci
- Kodowanie na drukarce RFID (ZPL)
- Kodowanie w SDK i czytnikach
- Checklista dla IT
- Źródła
Kodowanie EPC SGTIN-96 to zamiana numeru GTIN i numeru seryjnego sztuki na 96-bitowy identyfikator zapisany w banku EPC tagu UHF – według reguł GS1 EPC Tag Data Standard. W tym przewodniku dla działu IT znajdziesz organizację pamięci tagu Gen2 (Reserved, EPC, TID, User), strukturę SGTIN-96 z tabelą partycji, przeliczenie przykładowego GTIN na zapis szesnastkowy krok po kroku, formaty EPC URI, nowe schematy z TDS 2.0, hasła access i kill, blokady oraz sposób zapisu na drukarce RFID i w SDK.
Pamięć tagu Gen2: Reserved, EPC, TID, User
Tagi UHF zgodne z protokołem GS1 EPC UHF Gen2 (ISO/IEC 18000-63) – o samym protokole piszemy w artykule RFID w firmie – mają pamięć podzieloną na cztery banki. Aktualne wydanie protokołu Gen2 w repozytorium GS1 to wersja 3.0.1 z lutego 2026 r.
| Bank (numer) | Zawartość | Co musisz wiedzieć |
|---|---|---|
| Reserved (00) | hasło kill i hasło access, po 32 bity | protokół Gen2 definiuje tylko te dwa hasła |
| EPC (01) | StoredCRC (16 bitów), StoredPC (informacja sterująca protokołu), identyfikator EPC | tu zapisujesz SGTIN-96, SSCC-96 itd.; najczęstsze długości EPC to 96 i 128 bitów |
| TID (10) | identyfikator tagu: m.in. typ układu i producent | zapisywany przy produkcji, tylko do odczytu |
| User (11) | dane użytkownika | nie we wszystkich układach; od 32 bitów do ponad 64 kbit, fabrycznie pusta |
Kilka praktycznych konsekwencji:
- EPC zaczyna się od słowa 2 banku EPC. Przykład zapisu w Zebra RFID SDK for Android ustawia przesunięcie 2 (w słowach 16-bitowych) dla identyfikatora EPC – słowa 0 i 1 zajmują CRC i PC. To samo przesunięcie 2 przykład stosuje w banku Reserved dla hasła access.
- EPC nie zawsze jest unikalny fabrycznie. atlasRFIDstore zwraca uwagę, że część producentów układów nadaje unikalne EPC, a część nie – tagi z identycznym EPC wyglądają w odczycie jak jeden tag. Dlatego EPC koduje się samodzielnie: na drukarce RFID lub czytnikiem.
- TID to nie numer seryjny produktu. TID opisuje układ, a nie towar. Według karty Xerafy Pod Trak 60 TID jest unikalny i zablokowany przy produkcji, a pamięć EPC można nadpisywać, chronić hasłem lub trwale zablokować.
- Pojemność EPC zależy od układu. Karty z oferty podają np. 96 bitów EPC i 96 bitów TID (Pod Trak 60), 128 bitów EPC (OS2294-U8 22 x 94 mm) lub 96 albo 128 bitów EPC (OS1570-U8 15 x 70 mm). SGTIN-96 zmieści się w każdym z nich; dłuższe schematy – nie.
Nośniki z kartami podającymi pamięć znajdziesz w kategoriach etykiety RFID do drukarek kodujących i etykiety RFID według typu, a czytniki z funkcją zapisu – w kategorii czytniki RFID.
Jak dobrać sam nośnik do podłoża, opisujemy w artykule etykiety i tagi RFID – dobór inlaya.
Struktura SGTIN-96
SGTIN (Serialised Global Trade Item Number) to GTIN uzupełniony o numer seryjny sztuki – czym jest sam GTIN i jak wygląda w kodach kreskowych, wyjaśnia artykuł rodzaje kodów kreskowych w firmie. GS1 utrzymuje reguły zapisu w EPC Tag Data Standard (aktualnie TDS 2.3 z października 2025 r.), a ich maszynową postać – w Tag Data Translation (TDT 2.2). Według definicji SGTIN-96 w TDT 2.2:
| Pole | Bity | Zawartość |
|---|---|---|
| Nagłówek | 8 | 00110000 = hex 30 |
| Filtr | 3 | 0–7 |
| Partycja | 3 | dzieli 44 bity między prefiks firmy a numer pozycji |
| Prefiks firmy GS1 | 20–40 | wg tabeli partycji |
| Indicator / numer pozycji | 24–4 | wg tabeli partycji |
| Numer seryjny | 38 | liczba 0–274 877 906 943 |
Tabela partycji SGTIN-96
| Partycja | Prefiks firmy (bity / cyfry) | Indicator + numer pozycji (bity / cyfry) |
|---|---|---|
| 0 (000) | 40 / 12 | 4 / 1 |
| 1 (001) | 37 / 11 | 7 / 2 |
| 2 (010) | 34 / 10 | 10 / 3 |
| 3 (011) | 30 / 9 | 14 / 4 |
| 4 (100) | 27 / 8 | 17 / 5 |
| 5 (101) | 24 / 7 | 20 / 6 |
| 6 (110) | 20 / 6 | 24 / 7 |
Najważniejsza reguła dla programisty: z samego GTIN nie wyliczysz partycji. TDT wymaga przy kodowaniu parametru „długość prefiksu firmy GS1” (gs1companyprefixlength). Musisz go znać dla każdego GTIN – zwykle jest to stała dla własnych produktów firmy, ale towary innych dostawców mogą mieć prefiksy o różnej długości.
Wartości filtra SGTIN-96
Filtr pozwala czytnikowi szybko wybrać tylko określoną klasę obiektów (np. kartony, a nie sztuki). Tabela GS1 dla SGTIN-96:
| Wartość | Znaczenie wg GS1 |
|---|---|
| 0 | All Others (wszystkie pozostałe) |
| 1 | Point of Sale (POS) Trade Item – jednostka handlowa sprzedawana w kasie |
| 2 | Full Case for Transport – pełny karton transportowy |
| 3, 5 | zarezerwowane |
| 4 | Inner Pack Trade Item Grouping for Handling – opakowanie wewnętrzne |
| 6 | Unit Load – jednostka ładunkowa |
| 7 | jednostka wewnątrz jednostki handlowej lub komponent produktu nieprzeznaczony do osobnej sprzedaży |
Kodowanie EPC SGTIN-96 – przykład krok po kroku
Poniższy przykład używa umownych numerów (nie przypisuj ich do realnej firmy). Wynik policzyliśmy arytmetycznie i sprawdziliśmy programem w Pythonie, dekodując go z powrotem.
- Dane wejściowe: GTIN-14
05901234123457(EAN-13 5901234123457 z zerem jako indicatorem), prefiks firmy 7-cyfrowy5901234, numer seryjny1001, filtr 1 (sztuka w sprzedaży). - Podział GTIN (reguły TDT): indicator = 1. cyfra (
0); prefiks firmy = kolejne 7 cyfr (5901234); numer pozycji = indicator + pozostałe cyfry bez cyfry kontrolnej (0+12345=012345). Cyfra kontrolna (7) nie jest kodowana – przy dekodowaniu wylicza się ją ponownie. - Partycja: prefiks 7-cyfrowy → partycja 5 (101): 24 bity na prefiks, 20 bitów na numer pozycji.
- Zamiana pól na liczby binarne o stałej długości:
| Pole | Wartość dziesiętna | Bity | Zapis binarny |
|---|---|---|---|
| Nagłówek | 48 (hex 30) | 8 | 00110000 |
| Filtr | 1 | 3 | 001 |
| Partycja | 5 | 3 | 101 |
| Prefiks firmy | 5901234 | 24 | 010110100000101110110010 |
| Numer pozycji | 012345 = 12345 | 20 | 00000011000000111001 |
| Numer seryjny | 1001 | 38 | 00000000000000000000000000001111101001 |
- Sklejenie 96 bitów i podział na czwórki:
0011 0000 0011 0101 0110 1000 0010 1110 1100 1000 0000 1100 0000 1110 0100 0000 0000 0000 0000 0000 0000 0011 1110 1001 - Zamiana każdej czwórki na cyfrę szesnastkową:
3035682EC80C0E40000003E9– to 24 znaki hex, czyli 12 bajtów zapisywanych w banku EPC.
Kontrola: zdekodowanie 3035682EC80C0E40000003E9 daje z powrotem pola 48 / 1 / 5 / 5901234 / 12345 / 1001. Zwróć uwagę, że numer pozycji 012345 ma wiodące zero – w zapisie binarnym znika, więc przy dekodowaniu trzeba go dopełnić do 6 cyfr według tabeli partycji. Pierwsze dwa znaki 30 pozwalają od razu rozpoznać SGTIN-96 w surowych odczytach z czytnika.
EPC URI i inne zapisy tego samego numeru
TDT definiuje dla SGTIN-96 kilka poziomów zapisu tego samego identyfikatora:
| Poziom | Przykład dla naszych danych | Do czego |
|---|---|---|
| Binarny (hex) | 3035682EC80C0E40000003E9 |
zawartość banku EPC |
| EPC Tag URI | urn:epc:tag:sgtin-96:1.5901234.012345.1001 |
zawiera filtr i nazwę schematu – do konfiguracji kodowania |
| EPC Pure Identity URI | urn:epc:id:sgtin:5901234.012345.1001 |
sama tożsamość obiektu, bez filtra – do baz danych i wymiany między systemami |
| Ciąg elementów GS1 | (01)05901234123457(21)1001 | kod kreskowy GS1 z GTIN i numerem seryjnym |
| GS1 Digital Link | …/01/05901234123457/21/1001 | adres URI, np. w kodzie QR |
W Pure Identity URI prefiks i numer pozycji są rozdzielone kropką – właśnie dlatego URI przenosi informację o długości prefiksu, której nie ma w samym GTIN. Wybierz jeden format jako „kanoniczny” w systemie (zwykle Pure Identity URI albo GTIN + numer seryjny) i konwertuj do binarnego tylko na styku z czytnikiem lub drukarką.
Ograniczenia SGTIN-96 i schematy TDS 2.x (SGTIN+)
- Numer seryjny tylko liczbowy, bez zer wiodących – 38 bitów, maksymalnie 274 877 906 943 (12 cyfr). Według GS1 schematy 96-bitowe obsługują wyłącznie numery złożone z cyfr, które nie zaczynają się od zera – numer „001001” zapisany jako liczba straciłby zera. Jeśli Twoje numery seryjne zawierają litery lub zera wiodące, SGTIN-96 ich nie zmieści; schematy TDS 2.0 potrafią zachować zera wiodące. TDT obejmuje także schemat SGTIN-198.
- Wymagana długość prefiksu – bez niej nie zakodujesz partycji.
- TDS 2.0 dodało dwanaście nowych schematów EPC. GS1 podkreśla, że nie mają one wartości partycji, więc nie trzeba znać długości prefiksu firmy, natywnie obsługują ciągi elementów GS1 i GS1 Digital Link, a po EPC w banku EPC/UII można opcjonalnie zapisać dodatkowe dane AIDC (np. datę ważności czy numer partii) jako alternatywę dla pamięci User. Dotychczasowe schematy, w tym SGTIN-96, pozostają wspierane.
- SGTIN+ według TDT 2.2 ma nagłówek 11110111 (hex F7), bit przełącznika danych +AIDC, 3-bitowy filtr, GTIN (AI 01) i numer seryjny (AI 21) o długości 1–20 znaków z zestawu znaków GS1 – także alfanumeryczny. Wariant DSGTIN+ umieszcza datę przed GTIN.
Zanim wybierzesz SGTIN+, sprawdź, czy obsługuje go Twój middleware, oprogramowanie czytników i drukarek oraz partnerzy, którzy będą odczytywać tagi. SGTIN-96 jest najprostszy w obsłudze, gdy numery seryjne są liczbowe, a prefiks znany.
Hasła access i kill, blokada pamięci
Hasła
- Hasło access (32 bity) – potrzebne do operacji na zablokowanych bankach. Według dokumentacji ZPL blokowanie i odblokowywanie (wartości L i U komendy
^RLM) wymaga hasła access innego niż domyślne00000000. - Hasło kill (32 bity) – służy do trwałego wyłączenia tagu. Zebra opisuje operację Kill jako trwale czyniącą tag bezużytecznym; wymaga podania hasła kill.
Hasła zapisuje się w banku Reserved. Na drukarce Zebra robi to komenda ^RFW,H,P – np. ^RFW,H,P^FD12345678,88887777^FS ustawia hasło access 12345678 i kill 88887777, a ^RFS,H,P^FD12345678^FS podaje hasło już zapisane w tagu do kolejnych komend blokady. Hasła traktuj jak dane uwierzytelniające: nie zapisuj ich w jawnych szablonach etykiet ani w logach.
Blokada (lock)
Komenda ^RLM,k,a,e,u ustawia osobno stan hasła kill (k), hasła access (a), banku EPC (e) i banku User (u). Dla każdego z nich dostępne są wartości: U – odblokuj, L – zablokuj, O – trwale odblokuj, P – trwale zablokuj. ^RLB,s,n trwale blokuje wybrane sekcje pamięci User (rozmiar sekcji zależy od producenta tagu). W Zebra RFID SDK for Android odpowiada temu klasa LockAccessParams z uprawnieniami:
| Uprawnienie (SDK) | Działanie wg Zebra |
|---|---|
| LOCK_PRIVILEGE_READ_WRITE | odczyt i zapis chronionej pamięci tylko z poprawnym hasłem |
| LOCK_PRIVILEGE_PERMA_LOCK | pamięć trwale niezapisywalna; dla haseł access i kill także nieodczytywalna |
| LOCK_PRIVILEGE_PERMA_UNLOCK | tagu nigdy nie da się zablokować – zawsze do odczytu i zapisu |
| LOCK_PRIVILEGE_UNLOCK | bank zapisywalny niezależnie od tego, czy hasło access jest zerowe |
Operacje „perma” są nieodwracalne. Zanim włączysz je w produkcji, przetestuj cały cykl na próbnej partii tagów i sprawdź, czy proces (np. ponowne kodowanie przy zwrocie towaru) nie wymaga późniejszej zmiany EPC.
Kodowanie na drukarce RFID (ZPL)
Drukarka RFID Zebra zapisuje tag komendą ^RF w trakcie druku etykiety. Kalibrację, ustawienia ^RS i obsługę etykiet VOID opisujemy w artykule drukarka RFID – jak drukować i kodować etykiety RFID. Tutaj dwa sposoby przekazania naszego SGTIN-96:
1. Gotowy ciąg hex – system sam liczy EPC, a drukarka zapisuje 12 bajtów (format H jest domyślny, bank domyślnie EPC 96-bit):
^XA ^RFW,H^FD3035682EC80C0E40000003E9^FS ^FO50,50^A0N,40^FDSN 1001^FS ^XZ
2. Pola EPC – komenda ^RB definiuje podział 96 bitów (suma pól musi równać się zadeklarowanej długości, tu 96 bitów), a ^RFW,E przyjmuje wartości pól w zapisie dziesiętnym (w przykładzie SGTIN-96 w dokumentacji Zebra – oddzielone przecinkami). Dla partycji 5 podział wynosi 8, 3, 3, 24, 20, 38:
^XA ^RB96,8,3,3,24,20,38^FS ^RFW,E^FD48,1,5,5901234,12345,1001^FS ^XZ
Przewodnik Zebra pokazuje analogiczny przykład ^RB96,8,3,3,20,24,38 (partycja 6) i odczyt komendą ^RFR,E. Pamiętaj, że ^RB jest trwałe – obowiązuje w kolejnych formatach, dopóki go nie zmienisz – więc przy mieszanych prefiksach wysyłaj je w każdym formacie. Parametr banku m komendy ^RF przyjmuje m.in. 0 (Reserved), 1 (EPC), 2 (TID), 3 (User) oraz A – EPC z automatyczną korektą bitów PC (według Zebra tylko w ZD500R oraz seriach ZT400 i ZT600); domyślna wartość to E – EPC 96-bit, zapis od adresu bitowego 20h.
Kodowanie w SDK i czytnikach
Gdy kodujesz tagi już naklejone (np. tagi twarde na palety lub środki trwałe), używasz czytnika z funkcją zapisu. Zebra RFID SDK for Android (wersja 2.0.5.292) wymienia wśród obsługiwanych urządzeń m.in. terminal TC22R – w ofercie jest Zebra TC22R, czytnik/zapis RFID, 865–868 MHz UHF. Zapis wygląda w SDK następująco:
- tworzysz
TagAccess.WriteAccessParams, ustawiasz bank (MEMORY_BANK_EPC,MEMORY_BANK_USER,MEMORY_BANK_RESERVED), przesunięcie w słowach (dla EPC – 2), dane i hasło access (hex), - wywołujesz
reader.Actions.TagAccess.writeWait(...); według komentarza w przykładzie Zebra 6. parametr (w przykładzieuseTIDfilter) ustawia się natrue, gdy zmieniasz sam EPC, czyli bank źródłowy i docelowy to EPC, - blokadę ustawiasz przez
LockAccessParamsilockWait(...).
W czytnikach stacjonarnych kodowanie i odczyt obsługuje się przez interfejsy producenta – np. Bluebird FR901 według specyfikacji obsługuje protokół EPCglobal LLRP i API dla .NET. Jak czytać SSCC-96 i SGTIN-96 w bramkach na rampie, opisujemy w artykule bramki i tunele RFID.
Checklista dla IT
- Wybierz schemat: SGTIN-96 dla sztuk z liczbowym numerem seryjnym, SSCC-96 dla palet, a schematy TDS 2.x tam, gdzie potrzebujesz numerów alfanumerycznych lub danych AIDC w banku EPC.
- Zapisz w danych podstawowych długość prefiksu GS1 dla każdego GTIN.
- Ustal źródło numerów seryjnych (jeden serwis, bez duplikatów) i ich zakres (maks. 274 877 906 943 dla SGTIN-96, bez zer wiodących).
- Zdecyduj o wartości filtra dla każdego poziomu opakowania.
- Przechowuj EPC w formacie kanonicznym (Pure Identity URI lub GTIN + seria), hex generuj na styku z urządzeniem.
- Zdecyduj o hasłach access/kill i blokadach przed startem produkcji; przetestuj je na próbnej partii.
- Po zapisie weryfikuj: odczyt EPC i porównanie z systemem; TID możesz zapisać jako dodatkowy atrybut rekordu.
Kodujesz EPC po raz pierwszy i chcesz dobrać tagi, drukarkę RFID lub czytnik z funkcją zapisu? Napisz do nas – dobierzemy sprzęt i pomożemy w konfiguracji urządzeń oraz integracji z WMS/ERP.
Źródła
- GS1 – EPC Tag Data Standard (TDS 2.3)
- GS1 – TDS: artefakty
- GS1 – Tag Data Translation 2.2: definicja SGTIN-96 (XML)
- GS1 – Tag Data Translation 2.2: definicja SGTIN-96 (JSON)
- GS1 – Tag Data Translation 2.2: definicja SGTIN+
- GS1 – Tag Data Translation 2.2: artefakty
- GS1 – tabela wartości filtra SGTIN-96 (TDT 1.6.0)
- GS1 – TDS 2.0 launch
- GS1 – EPC UHF Gen2 Air Interface Protocol (3.0.1)
- atlasRFIDstore – 17 Things You Might Not Know About Gen 2 RFID Tag Memory Banks
- Zebra – RFID Programming Guide (^RB, ^RF, ^RL)
- Zebra Docs – ZPL ^RF
- Zebra Docs – ZPL ^RL
- Zebra Docs – ZPL ^RB
- GS1 Support – Serialisation considerations when encoding EPC on RAIN RFID tags
- Zebra Docs – 123RFID Mobile: Kill
- Zebra TechDocs – RFID SDK for Android: About
- Zebra TechDocs – RFID SDK for Android: Tag Write
- Zebra TechDocs – RFID SDK for Android: Lock Access
- Bluebird FR901 – specyfikacja (TSC Auto ID)
Produkty z artykułu
Na zamówienieXerafy Pod Trak 60 - etykieta RFID UHF IP68X6020-GLC01-U91,00 zł netto
Na zamówienieTag RFID UHF OS2294-U8 NXP UCODE 8 22 x 94 mm3313850,25 zł netto
Na zamówienieEtykieta RFID UHF OS1570-U8 15 x 70 mm, NXP UCODE 8/93313200,24 zł netto
Wysyłka 24 hZebra TC22R, czytnik/zapis RFID, 6" FHD, 865-868 MHz UHF, 6 GB RAM, 64 GB Flash, Wi-Fi 6E, BT 5.2, NFC, Android, 7000 mAhTC2205-0G1250SS-E85 610,57 zł netto
Na zamówienieBluebird FR901 – czytnik RFID stacjonarny, Linux, 8 portów antenowychFR901-WLNA5 079,67 zł nettoNajczęściej zadawane pytania
Czym różni się EPC od TID?
EPC to identyfikator obiektu, który zapisujesz sam – np. SGTIN-96 z GTIN i numerem seryjnym. TID to identyfikator układu zapisany przy produkcji tagu, tylko do odczytu, z informacją m.in. o typie układu i producencie. W systemie kluczem biznesowym jest EPC, a TID może służyć jako dodatkowa kontrola.
Dlaczego zakodowany SGTIN-96 zaczyna się od „30”?
Pierwsze 8 bitów to nagłówek schematu. Dla SGTIN-96 ma on wartość 00110000, czyli hex 30; SSCC-96 ma nagłówek 00110001 (hex 31), a SGTIN+ – 11110111 (hex F7). Po dwóch pierwszych znakach rozpoznasz schemat w surowych odczytach.
Czy do kodowania SGTIN-96 potrzebuję długości prefiksu firmy?
Tak. Partycja, czyli podział bitów między prefiks firmy a numer pozycji, zależy od długości prefiksu, a tej nie da się odczytać z samego GTIN. Schematy wprowadzone w TDS 2.0 (np. SGTIN+) nie mają partycji i tej informacji nie wymagają.
Czy numer seryjny w SGTIN-96 może zawierać litery?
Nie. Pole numeru seryjnego ma 38 bitów i przyjmuje liczby od 0 do 274 877 906 943; według GS1 numer nie może też mieć zer wiodących. Dla numerów alfanumerycznych potrzebny jest inny schemat – np. SGTIN+, który według TDT przyjmuje do 20 znaków z zestawu znaków GS1.
Czy hasło kill można cofnąć?
Nie – Zebra opisuje operację Kill jako trwale czyniącą tag bezużytecznym. Podobnie trwała blokada (perma lock) jest nieodwracalna. Dlatego hasła i blokady planuje się przed wdrożeniem i testuje na próbnej partii.