Engineering tools · EPC · GS1

محول أكواد RFID

أداة تحويل بين SGTIN-96 (Hex RFID) والباركود (GTIN) + الرقم التسلسلي. متوافقة مع قارئات RFID القياسية مثل Zebra وChainway وImpinj وNextwaves. مبنية على معايير GS1 EPC Tag Data.

محول RFID

تحويل بين RFID Hex (SGTIN-96) وGS1 Barcode (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) وSGTIN-96 URI
  1. الخطوة 1: حدد القيمة الثنائية للترويسة لمخطط EPC. قيمة الترويسة الثنائية لـ SGTIN-96 هي "00110000".
  2. الخطوة 2: اختر قيمة التقسيم بناءً على عدد الأرقام في بادئة الشركة من جدول قيم التقسيم.
  3. الخطوة 3: حوّل قيمة الفلتر وقيمة التقسيم وبادئة الشركة ومرجع الصنف والرقم التسلسلي إلى قيمة ثنائية.
  4. الخطوة 4: اربط قيم الترويسة والفلتر والتقسيم وبادئة الشركة ومرجع الصنف والرقم التسلسلي الثنائية بالترتيب لتكوين EPC الثنائي.

دليل مرجع SGTIN-96

القيمةالوصف
0كل الأنواع الأخرى
تُستخدم للأصناف التي لا تناسب فئات أخرى. نادراً ما تُستخدم في التجزئة العامة.
1صنف تجارة نقطة البيع (POS)
وحدة المستهلك القياسية المباعة عند نقطة البيع. مثال: زجاجة شامبو واحدة.
2علبة كاملة للنقل
وحدة شحن قياسية تحتوي على أصناف متعددة. مثال: كرتون 12 زجاجة شامبو. حاسم للخدمات اللوجستية للتمييز بين 'صندوق واحد' و'صنف واحد'.
3محجوز
محجوز للاستخدام المستقبلي.
4تجميع صنف العبوة الداخلية
تجميع أصغر من الصندوق الكامل، غالباً للعرض على الأرفف أو المناولة. مثال: حزمة 3 محكمة بالشلrink المغلقة داخل الكرتون الرئيسي.
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)،他知道 contiene varios artículos. Esto previene el doble conteo (por ejemplo, contar una caja como una sola unidad) y permite la verificación de envío válida.
  • الصندوق (فلتر 2) هو وحدة الشحن الأساسية المستخدمة للنقل. العبوة الداخلية (فلتر 4) هو تقسيم داخل هذا الصندوق، عادةً لتسهيل المناولة أو العرض (مثل حزمة 6 داخل صندوق 24 علبة). تتتبع أنظمة الخدمات اللوجستية الصناديق؛ قد تتعامل عمليات المتجر بكفاءة مع العبوات الداخلية.
  • سيفشل فك الترميز أو ينتج باركود خاطئ. يحدد التقسيم بالضبط أين تنتهي بادئة الشركة وأين يبدأ مرجع الصنف. إذا كان "نقطة الانقسام" هذه خاطئة، ستحصل على رمز شركة مختلف عما هو مقصود.
  • GTIN القياسي (الباركود) يحدد فقط نوع المنتج (مثل 'صودا 12 أونصة'). يضيف SGTIN-96 رقم تسلسلي، مما يمنح كل علبة هوية فريدة. يتيح هذا التتبع على مستوى الصنف، مما يسمح بتتبع أي صنف محدد تم بيعه أو سرقته أو انتهت صلاحيته.
  • نعم. كما هو موضح في المحول أعلاه، تحتوي سلسلة SGTIN-96 على GTIN-14 الكامل. بإزالة الرقم التسلسلي ومعلومات الترويسة، يمكنك إعادة بناء باركود التجزئة الأصلي بدقة.
  • الترويسة (0x30) هي بادئة قياسية 8-بت محددة من GS1. تخبر ببساطة أي قارئ RFID: "هذه البطاقة مشفرة باستخدام معيار SGTIN-96." توجد ترويسات أخرى لمعايير مختلفة (مثل SSCC للبالتات أو GIAI للأصول).