Engineering tools · EPC · GS1

Převodník kódů RFID

Nástroj pro převod mezi SGTIN-96 (RFID Hex) a čárovým kódem (GTIN) + sériovým číslem. Kompatibilní se standardními RFID čtečkami jako Zebra, Chainway, Impinj, Nextwaves. Založeno na GS1 EPC Tag Data Standard.

Převodník RFID

Převod mezi RFID Hex (SGTIN-96) a GS1 čárovým kódem (GTIN) + sériovým číslem.

Scheme:SGTIN-9696 bits / Header 0x30

Logika kódu a krok za krokem

// 1. Binary Conversion

src = bin(0x3076215F0C5D974000000001) // = "001100000111011000100001010111110000110001011101100101110100000000000000000000000000000000000001"

// 2. Extract Fields (Bit Slice)

header = src[0:8] "00110000" 0x30
filter = src[8:11] "011" 3
partition = src[11:14] "101" 5

// 3. Determine Partition Rule (Partition 5)

rule = PARTITIONS[5]
// Company Bits: 24, Item Bits: 20

// 4. Extract Company, Item & Serial

company = src[14:38] "100010000101011111000011" 8935363
itemRef = src[38:58] "00010111011001011101" 095837
serial = src[58:96] "00000000000000000000000000000000000001" 1

Kód pro vývojáře

Použijte tuto pomocnou logiku ve vašem projektu. Vyberte jazyk níže.

1// TypeScript / JavaScript SGTIN-96 Utils
2
3export const GS1_PARTITION_TABLE = [
4  { value: 0, partition: 0, companyPrefixBits: 40, itemReferenceBits: 4, companyDigits: 12, itemDigits: 1 },
5  { value: 1, partition: 1, companyPrefixBits: 37, itemReferenceBits: 7, companyDigits: 11, itemDigits: 2 },
6  { value: 2, partition: 2, companyPrefixBits: 34, itemReferenceBits: 10, companyDigits: 10, itemDigits: 3 },
7  { value: 3, partition: 3, companyPrefixBits: 30, itemReferenceBits: 14, companyDigits: 9, itemDigits: 4 },
8  { value: 4, partition: 4, companyPrefixBits: 27, itemReferenceBits: 17, companyDigits: 8, itemDigits: 5 },
9  { value: 5, partition: 5, companyPrefixBits: 24, itemReferenceBits: 20, companyDigits: 7, itemDigits: 6 },
10  { value: 6, partition: 6, companyPrefixBits: 20, itemReferenceBits: 24, companyDigits: 6, itemDigits: 7 },
11];
12
13export function encodeSgtin96(gtin: string, serial: string, filter: number) {
14  gtin = gtin.padStart(14, "0");
15  const p = GS1_PARTITION_TABLE.find(rule => {
16    const cp = parseInt(gtin.slice(1, 1 + rule.companyDigits));
17    const ir = parseInt(gtin[0] + gtin.slice(1 + rule.companyDigits, 13));
18    return cp < (1 << rule.companyPrefixBits) && ir < (1 << rule.itemReferenceBits);
19  });
20  if (!p) throw new Error("Invalid GTIN for SGTIN-96");
21
22  const cpVal = parseInt(gtin.slice(1, 1 + p.companyDigits));
23  const irVal = parseInt(gtin[0] + gtin.slice(1 + p.companyDigits, 13));
24  
25  let b = (0x30).toString(2).padStart(8,"0");
26  b += filter.toString(2).padStart(3,"0");
27  b += p.partition.toString(2).padStart(3,"0");
28  b += cpVal.toString(2).padStart(p.companyPrefixBits,"0");
29  b += irVal.toString(2).padStart(p.itemReferenceBits,"0");
30  b += parseInt(serial).toString(2).padStart(38,"0");
31  return binaryToHex(b);
32}
33
34export function decodeSgtin96(hex: string) {
35  const b = hexToBinary(hex);
36  const pVal = parseInt(b.substring(11, 14), 2);
37  const rule = GS1_PARTITION_TABLE.find(r => r.partition === pVal);
38  if (!rule) throw new Error("Invalid Partition");
39
40  const cp = parseInt(b.substring(14, 14 + rule.companyPrefixBits), 2);
41  const ir = parseInt(b.substring(14 + rule.companyPrefixBits, 14 + rule.companyPrefixBits + rule.itemReferenceBits), 2);
42  const serial = parseInt(b.substring(14 + rule.companyPrefixBits + rule.itemReferenceBits, 96), 2);
43
44  const cpStr = cp.toString().padStart(rule.companyDigits, "0");
45  const irStr = ir.toString().padStart(rule.itemDigits, "0");
46  const gtinCore = irStr[0] + cpStr + irStr.substring(1);
47
48  // Check digit calculation
49  let sum = 0;
50  for (let i = 0; i < 13; i++) {
51    sum += parseInt(gtinCore[i]) * (i % 2 === 0 ? 3 : 1);
52  }
53  const check = (10 - (sum % 10)) % 10;
54  
55  return {
56    gtin: gtinCore + check,
57    serial: serial.toString()
58  };
59}
60
61function binaryToHex(b: string) {
62  let hex = "";
63  for (let i = 0; i < b.length; i += 4) {
64    hex += parseInt(b.substring(i, i + 4), 2).toString(16).toUpperCase();
65  }
66  return hex;
67}
68
69function hexToBinary(h: string) {
70  let bin = "";
71  for (let i = 0; i < h.length; i++) {
72    bin += parseInt(h[i], 16).toString(2).padStart(4, "0");
73  }
74  return bin;
75}

Vysvětlení

SGTIN-96 je 96bitový binární řetězec rozdělený do 6 částí:

HDRFLTPRTCMP (24)ITEM (20)SERIAL (38)
Header (8 bitů)Bits 0-8 (8)
001100000x30

Standardní prefix (00110000) identifikující tento formát jako SGTIN-96.

Filtr (3 bity)Bits 8-11 (3)
0113

Typ objektu (např. 1 = Maloobchod). Viz referenční příručka.

Partice (3 bity)Bits 11-14 (3)
1015

Partition 5 znamená: Kód společnosti zabírá 24 bitů, Kód produktu zabírá 20 bitů.

Prefix společnostiBits 14-38 (24)
1000100001010111110000118935363

Jedinečný kód společnosti přidělený organizací GS1.

Referenční číslo položkyBits 38-58 (20)
00010111011001011101095837

Váš konkrétní kód produktu.

Sériové číslo (38 bit)Bits 58-96 (38)
000000000000000000000000000000000000011

Jedinečný identifikátor pro každý konkrétní fyzický produkt.

Vizualizace vztahu mezi vaším fyzickým čárovým kódem a elektronickým kódem produktu (EPC).

Diagram znázorňující propojení mezi čárovým kódem (GTIN) a SGTIN-96 URI
  1. Krok 1: Určete binární hodnotu záhlaví pro EPC schéma. Binární hodnota záhlaví pro SGTIN-96 je „00110000".
  2. Krok 2: Vyberte hodnotu Partition na základě počtu číslic v předponě společnosti z tabulky hodnot Partition.
  3. Krok 3: Převeďte hodnotu filtru, Partition, předponu společnosti, odkaz na položku a sériové číslo na binární hodnotu.
  4. Krok 4: Zřetězte v pořadí záhlaví, filtr, partition, předponu společnosti, odkaz na položku a binární hodnoty sériového čísla, abyste vytvořili binární EPC.

Referenční příručka SGTIN-96

HodnotaPopis
0Všechny ostatní
Používá se pro položky, které nepatří do jiných kategorií. Zřídka používané v běžném maloobchodě.
1Položka na prodejně (POS Trade Item)
Standardní spotřebitelská jednotka prodávaná na prodejním místě. Příklad: Jedna láhev šamponu.
2Plný kartón pro přepravu (Full Case)
Standardní přepravní jednotka obsahující více položek. Příklad: Karton 12 lahví šamponu. Kritické pro logistiku k rozlišení „jednoho kartónu" od „jedné položky".
3Vyhrazeno (Reserved)
Vyhrazeno pro budoucí použití.
4Seskupení vnitřního balení (Inner Pack)
Seskupení menší než plný kartón, často pro vystavení nebo manipulaci. Příklad: Svazek 3 ks zabalených v smršťovací fólii uvnitř hlavního kartónu.
5Vyhrazeno (Reserved)
Vyhrazeno pro budoucí použití.
6Jednotková zátěž (Unit Load)
Velká logistická jednotka, obvykle paleta obsahující více kartónů.
7Součást uvnitř (Component)
Konkrétní díl uvnitř spotřebitelské jednotky. Příklad: Víčko baterie uvnitř hračky.
HodnotaPředpona společnostiOdkaz na položku
040 Bity / 12 Číslice4 Bity / 1 Číslice
137 Bity / 11 Číslice7 Bity / 2 Číslice
234 Bity / 10 Číslice10 Bity / 3 Číslice
330 Bity / 9 Číslice14 Bity / 4 Číslice
427 Bity / 8 Číslice17 Bity / 5 Číslice
524 Bity / 7 Číslice20 Bity / 6 Číslice
620 Bity / 6 Číslice24 Bity / 7 Číslice

Často kladené dotazy k SGTIN-96

  • Říká systému úroveň balení tagu. Pokud systém přečte tag „Kartón" (Filtr 2), ví, že obsahuje více položek. To zabraňuje dvojímu počítání (např. počítání kartónu jako jedné jednotky) a umožňuje ověření přepravy.
  • Kartón (Filtr 2) je primární přepravní jednotka používaná pro přepravu. Vnitřní balení (Filtr 4) je členění uvnitř tohoto kartónu, obvykle pro snadnější manipulaci nebo vystavení (např. svazek 6 ks uvnitř kartónu 24 ks). Logistické systémy sledují kartóny; prodejní operace mohou efektivně zpracovávat vnitřní balení.
  • Dekódování selže nebo vytvoří nesprávný čárový kód. Partition přesně určuje, kde končí předpona společnosti a začíná odkaz na položku. Pokud je tento „bod rozdělení" nesprávný, získáte jiný kód společnosti, než bylo zamýšleno.
  • Standardní GTIN (čárový kód) identifikuje pouze typ produktu (např. „330ml nápoj"). SGTIN-96 přidává sériové číslo, které dává každé jednotce jedinečnou identitu. To umožňuje sledovatelnost na úrovni položky, takže můžete sledovat přesně, který konkrétní produkt byl prodán, ukraden nebo vypršel.
  • Ano. Jak je znázorněno v převodníku výše, řetězec SGTIN-96 obsahuje úplný GTIN-14. Odebráním sériového čísla a informací záhlaví můžete dokonale rekonstruovat původní maloobchodní čárový kód.
  • Záhlaví (0x30) je standardní 8bitová předpona definovaná organizací GS1. Jednoduše říká jakémukoli čtecímu zařízení RFID: „Tento tag je zakódován pomocí standardu SGTIN-96." Další záhlaví existují pro různé standardy (jako SSCC pro palety nebo GIAI pro aktiva).