Engineering tools · EPC · GS1

مبدل کد RFID

ابزار تبدیل بین SGTIN-96 (Hex RFID) و بارکد (GTIN) + شماره سریال. سازگار با خواننده‌های RFID استاندارد مانند Zebra، Chainway، Impinj، Nextwaves. بر اساس استاندارد داده برچسب GS1 EPC.

مبدل RFID

تبدیل بین Hex RFID (SGTIN-96) و بارکد GS1 (GTIN) + شماره سریال.

Scheme:SGTIN-9696 bits / Header 0x30

منطق کد و گام به گام

// 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

کد توسعه‌دهنده

از این منطق ابزار در پروژه خود استفاده کنید. یک زبان در زیر انتخاب کنید.

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}

توضیح

SGTIN-96 یک رشته باینری 96 بیتی است که به 6 بخش تقسیم شده:

HDRFLTPRTCMP (24)ITEM (20)SERIAL (38)
هدر (8 بیت)Bits 0-8 (8)
001100000x30

پیشوند استاندارد (00110000) که این را به عنوان SGTIN-96 شناسایی می‌کند.

فیلتر (3 بیت)Bits 8-11 (3)
0113

نوع شیء (مثلاً 1 = کالای خرده‌فروشی). به راهنمای مرجع زیر مراجعه کنید.

پارتیشن (3 بیت)Bits 11-14 (3)
1015

پارتیشن 5 به این معناست: کد شرکت 24 بیت و کد محصول 20 بیت اشغال می‌کند.

پیشوند شرکتBits 14-38 (24)
1000100001010111110000118935363

کد شرکت منحصربه‌فرد اختصاص‌یافته توسط GS1.

ارجاع اقلامBits 38-58 (20)
00010111011001011101095837

کد محصول خاص شما.

شماره سریال (38 بیت)Bits 58-96 (38)
000000000000000000000000000000000000011

شناسه منحصربه‌فرد برای هر محصول فیزیکی خاص.

تجسم رابطه بین بارکد فیزیکی شما و کد محصول الکترونیکی (EPC).

نمودار اتصال بین بارکد (GTIN) و URI SGTIN-96
  1. گام 1: مقدار هدر باینری را برای طرح EPC تعیین کنید. مقدار هدر باینری برای SGTIN-96 "00110000" است.
  2. گام 2: مقدار پارتیشن را بر اساس تعداد ارقام در پیشوند شرکت از جدول مقدار پارتیشن انتخاب کنید.
  3. گام 3: مقدار فیلتر، مقدار پارتیشن، پیشوند شرکت، ارجاع اقلام و شماره سریال را به مقدار باینری تبدیل کنید.
  4. گام 4: مقادیر باینری هدر، فیلتر، پارتیشن، پیشوند شرکت، ارجاع اقلام و شماره سریال را به ترتیب الحاق کنید تا EPC باینری تشکیل شود.

راهنمای مرجع SGTIN-96

مقدارتوضیح
0همه موارد دیگر
برای اقلامی که در دسته‌های دیگر قرار نمی‌گیرند استفاده می‌شود. به ندرت در خرده‌فروشی عمومی استفاده می‌شود.
1کالای فروشگاهی نقطه فروش
واحد مصرفی استاندارد فروخته شده در نقطه فروش. مثال: یک بطری شامپو.
2جعبه کامل برای حمل
واحد حمل استاندارد حاوی چندین قلم. مثال: یک کارتن 12 بطری شامپو. برای لجستیک برای تمایز بین 'یک جعبه' و 'یک قلم' حیاتی است.
3رزرو شده
برای استفاده آینده رزرو شده.
4گروه‌بندی بسته داخلی
گروه‌بندی کوچک‌تر از یک جعبه کامل، اغلب برای نمایش قفسه یا جابجایی. مثال: بسته 3 تایی شرین‌پیچ شده در داخل کارتن اصلی.
5رزرو شده
برای استفاده آینده رزرو شده.
6بار واحدی
واحد لجستیکی بزرگ، معمولاً یک پالت حاوی چندین جعبه.
7قطعه داخل واحد مصرف‌کننده
یک قطعه خاص داخل واحد مصرف‌کننده. مثال: درب باتری داخل یک اسباب‌بازی.
مقدارپیشوند شرکتارجاع اقلام
040 بیت / 12 رقم4 بیت / 1 رقم
137 بیت / 11 رقم7 بیت / 2 رقم
234 بیت / 10 رقم10 بیت / 3 رقم
330 بیت / 9 رقم14 بیت / 4 رقم
427 بیت / 8 رقم17 بیت / 5 رقم
524 بیت / 7 رقم20 بیت / 6 رقم
620 بیت / 6 رقم24 بیت / 7 رقم

سؤالات متداول SGTIN-96

  • به سیستم می‌گوید که سطح بسته‌بندی برچسب چیست. اگر سیستم یک برچسب 'جعبه' (فیلتر 2) بخواند، می‌داند که حاوی چندین قلم است. این از شمارش مضاعف جلوگیری می‌کند (مثلاً شمارش یک جعبه فقط به عنوان یک واحد) و امکان تأیید حمل معتبر را فراهم می‌کند.
  • جعبه (فیلتر 2) واحد حمل اصلی برای حمل و نقل است. بسته داخلی (فیلتر 4) تقسیمی درون آن جعبه است، معمولاً برای جابجایی یا نمایش آسان‌تر (مثلاً بسته 6 تایی درون جعبه 24 تایی). سیستم‌های لجستیک جعبه‌ها را ردیابی می‌کنند؛ عملیات فروشگاه ممکن است بسته‌های داخلی را کارآمدتر مدیریت کنند.
  • رمزگشایی ناموفق می‌شود یا بارکد اشتباه تولید می‌کند. پارتیشن دقیقاً تعیین می‌کند که پیشوند شرکت کجا تمام می‌شود و ارجاع اقلام从哪里 شروع می‌شود. اگر این 'نقطه تقسیم' اشتباه باشد، کد شرکت متفاوتی از آنچه در نظر داشتید دریافت خواهید کرد.
  • GTIN استاندارد (بارکد) فقط نوع محصول را شناسایی می‌کند (مثلاً 'نوشابه 12 اونس'). SGTIN-96 یک شماره سریال اضافه می‌کند و به هر قوطی یک هویت منحصربه‌فرد می‌دهد. این امکان ردیابی سطح اقلام را فراهم می‌کند و به شما امکان می‌دهد دقیقاً ردیابی کنید کدام قلم خاص فروخته شد، دزدیده شد یا منقضی شد.
  • بله. همانطور که در مبدل بالا نشان داده شده، رشته SGTIN-96 شامل GTIN-14 کامل است. با حذف شماره سریال و اطلاعات هدر، می‌توانید بارکد خرده‌فروشی اصلی را کاملاً بازسازی کنید.
  • هدر (0x30) یک پیشوند استاندارد 8 بیتی است که توسط GS1 تعریف شده است. به سادگی به هر خواننده RFID می‌گوید: "این برچسب با استاندارد SGTIN-96 کدگذاری شده است." هدرهای دیگری برای استانداردهای مختلف وجود دارند (مانند SSCC برای پالت‌ها یا GIAI برای دارایی‌ها).