Engineering tools · EPC · GS1

ממיר קוד RFID

כלי המרה בין SGTIN-96 (Hex של RFID) לבין ברקוד (GTIN) + מספר סידורי. תואם לקוראי RFID סטנדרטיים כמו Zebra, Chainway, Impinj, Nextwaves. מבוסס על GS1 EPC Tag Data Standard.

ממיר RFID

המר בין RFID Hex (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) ל-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 יחידות בתוך הקרטון הראשי.
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) היא תת-חלוקה בתוך אותו ארגז, בדרך כלל לטיפול או תצוגה קלים יותר (כמו שישייה בתוך ארגז של 24 פחיות). מערכות לוגיסטיקה עוקבות אחר ארגזים; פעולות חנות עשויות לטפל ביעילות באריזות פנימיות.
  • הפענוח ייכשל או יפיק ברקוד שגוי. ה-Partition קובע בדיוק היכן מסתיים קידומת החברה ומתחיל הפניית הפריט. אם 'נקודת פיצול' זו שגויה, תקבל קוד חברה שונה ממה שהתכוונת.
  • GTIN סטנדרטי (ברקוד) מזהה רק את סוג המוצר (למשל, 'סודה 12oz'). SGTIN-96 מוסיף מספר סידורי, מה שנותן לכל פחית זהות ייחודית. זה מאפשר מעקב ברמת הפריט, ומאפשר לך לעקוב בדיוק אחר הפריט הספציפי שנמכר, נגנב או פג תוקפו.
  • כן. כפי שמוצג בממיר לעיל, מחרוזת SGTIN-96 מכילה את ה-GTIN-14 המלא. על ידי הסרת המספר הסידורי ומידע הכותרת, אתה יכול לשחזר בצורה מושלמת את הברקוד הקמעונאי המקורי.
  • ה-Header (0x30) הוא קידומת סטנדרטית של 8 סיביות המוגדרת על ידי GS1. זה פשוט אומר לכל קורא RFID: "תג זה מקודד באמצעות תקן SGTIN-96." קיימות כותרות אחרות עבור תקנים שונים (כמו SSCC עבור משטחים או GIAI עבור נכסים).