RFID

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.

Kodowanie EPC (SGTIN-96), TID i pamięć tagu – przewodnik dla IT
Spis treści
  1. Pamięć tagu Gen2: Reserved, EPC, TID, User
  2. Struktura SGTIN-96
  3. Kodowanie EPC SGTIN-96 – przykład krok po kroku
  4. EPC URI i inne zapisy tego samego numeru
  5. Ograniczenia SGTIN-96 i schematy TDS 2.x (SGTIN+)
  6. Hasła access i kill, blokada pamięci
  7. Kodowanie na drukarce RFID (ZPL)
  8. Kodowanie w SDK i czytnikach
  9. Checklista dla IT
  10. Ź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.

  1. Dane wejściowe: GTIN-14 05901234123457 (EAN-13 5901234123457 z zerem jako indicatorem), prefiks firmy 7-cyfrowy 5901234, numer seryjny 1001, filtr 1 (sztuka w sprzedaży).
  2. 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.
  3. Partycja: prefiks 7-cyfrowy → partycja 5 (101): 24 bity na prefiks, 20 bitów na numer pozycji.
  4. 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
  1. 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
  2. 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ślne 00000000.
  • 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ładzie useTIDfilter) ustawia się na true, gdy zmieniasz sam EPC, czyli bank źródłowy i docelowy to EPC,
  • blokadę ustawiasz przez LockAccessParams i lockWait(...).

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

  1. 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.
  2. Zapisz w danych podstawowych długość prefiksu GS1 dla każdego GTIN.
  3. 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).
  4. Zdecyduj o wartości filtra dla każdego poziomu opakowania.
  5. Przechowuj EPC w formacie kanonicznym (Pure Identity URI lub GTIN + seria), hex generuj na styku z urządzeniem.
  6. Zdecyduj o hasłach access/kill i blokadach przed startem produkcji; przetestuj je na próbnej partii.
  7. 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

Produkty z artykułu

Najczęś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.

Ładowanie...
Powrót do góry