HMIขั้นสูง · Advanced13 นาที

การใช้งาน Barcode Scanner กับ HMI

เสียบ Barcode Scanner แบบ USB เข้ากับ HMI Samkoon แล้วเขียน C Script ใน SKTool อ่านข้อมูลที่สแกนจาก Reserved Register LW61000 คัดลอกไปเก็บที่ LW10000 และแสดงผลบนหน้าจอ พร้อมการใช้ #define ตั้งชื่อ Register

ตั้ง LW60997 = 1 ใน Init Script ให้ HMI รับข้อมูลจาก Barcode Scanner แล้วใน Global Script เมื่อ LB60147 เป็น 1 (สแกนเสร็จ) ให้วนลูปคัดลอกข้อมูลจาก LW61000 ตามความยาวใน LW60999 ไปเก็บที่ LW10000 แล้ว Reset LB60147 กลับเป็น 0

อัพเดทล่าสุด: 26 ตุลาคม 2569

ชุดอุปกรณ์สำหรับบทความนี้

ราคาชุดอุปกรณ์

฿6,150

เป้าหมายของระบบ

EP.14 ของซีรีส์ Complete HMI ใช้ C Script ที่เรียนมา 2 ตอนก่อนหน้า มาอ่าน Barcode Scanner แบบ USB ที่เสียบเข้ากับหน้าจอ HMI โดยตั้งเป้าหมายไว้ 3 ข้อ:

  1. แสดงข้อมูลที่อ่านได้จาก Barcode Scanner บน HMI
  2. เก็บข้อมูลที่สแกนได้ 10 ตัวย้อนหลัง (History)
  3. นำข้อมูลที่สแกนได้ล่าสุดไปกำหนดสูตรการผลิต (เปลี่ยน Recipe)

คลิปนี้ทำข้อ 1 ให้เสร็จ ส่วน History และการเปลี่ยน Recipe อยู่ในตอนต่อไป

Reserved Register ที่เกี่ยวข้อง

Barcode Scanner

Registerความหมาย
LB60147End mark of QR code scanning USB ติดเป็น 1 เมื่อยิงบาร์โค้ดเสร็จ ใช้เป็นเงื่อนไขให้โค้ดทำงาน
LW60997ตั้งเป็น 1 แล้วหน้าจอจะรอรับข้อมูลจาก Barcode Scanner
LW60999ความยาวของตัวอักษรที่อ่านได้ เช่น 2, 4 หรือ 13 ตัว ใช้กำหนดจำนวนรอบของลูปตอนเก็บข้อมูล
LW61000 เป็นต้นไป (ถึง LW61127)ที่ที่หน้าจอพักข้อมูลที่อ่านได้ไว้ให้ก่อน เราค่อยคัดลอกไปเก็บใน Local Word ที่กำหนดเอง

Recipe (ใช้ในตอนต่อไป)

Registerความหมาย
RWI0Recipe number register ระบุ Recipe ปัจจุบันของหน้าจอ
LB60100Recipe download เมื่อ Trigger บิตนี้ Recipe ปัจจุบันจะถูกเขียนจากหน้าจอไปที่ PLC

ข้อจำกัดของ ASCII

C Script รองรับตัวอักษร ASCII โดย Default ซึ่งใช้ได้เฉพาะตัวอักษรภาษาอังกฤษ ตัวเลข และอักขระพิเศษบางตัว ควรรู้ด้วยว่าแต่ละตัวอักษรเก็บเป็นค่าอะไร เช่น ตัว A (ตัวใหญ่) = 41 ในเลขฐาน 16 = 65 ในเลขฐาน 10

1. สร้างหน้า Barcode

  1. Copy หน้าเดิมมา Paste แล้วเปลี่ยน Property เป็น ID 21 ชื่อ Barcode
  2. แก้หัวข้อในหน้า
  3. สร้างปุ่ม Navigate มาหน้านี้เหมือนเดิม และเปลี่ยน Appearance เป็น Barcode

2. Script Initialize — บอก HMI ว่าจะใช้ Barcode Scanner

ใน Script Editor สร้าง Script ใหม่ชื่อ BarcodeScannerInit แล้วตั้ง LW60997 เป็น 1:

BarcodeScannerInit
ตั้ง LW60997 = 1 ให้หน้าจอรอรับข้อมูลจาก Barcode Scanner
C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

#include "MacroInit.h"

void Macro_main(IN *p)
{
 MarcoInit
MarcoInit
//ToDo
  #define UseScanner 60997
  LocalWord[UseScanner] = 1;
}
ตำแหน่งข้อมูลที่ใช้
LocalWord[60997]

#define คืออะไร

นอกจากการประกาศตัวแปร ยังมี Preprocessor Directive อย่าง #define ก่อน Compile ตัว Compiler จะเอาค่าที่เรากำหนดไว้ไปแทนในโค้ดให้ จึงไม่ต้องประกาศตัวแปร

  • เขียน #define ตามด้วยชื่อ แล้วตามด้วยค่า เช่น #define UseScanner 60997
  • ไม่ต้อง ใส่เครื่องหมาย = และ ไม่ต้อง ปิดด้วย ;
  • จากนั้นเขียน LocalWord[UseScanner] แทน LocalWord[60997] ได้เลย Compile ผ่านปกติ

กลับมาอ่านโค้ดทีหลังก็รู้ทันทีว่าตำแหน่งที่ตั้งเป็น 1 เกี่ยวกับ Scanner ดูแลโค้ดระยะยาวได้ไม่งง

3. Script หลัก — ScanLogic

สร้าง Script ใหม่ชื่อ ScanLogic สำหรับเอาข้อมูลที่สแกนได้ไปเก็บ:

ScanLogic
เมื่อ LB60147 = 1 (สแกนเสร็จ) คัดลอกข้อมูลจาก LW61000 ตามความยาวใน LW60999 ไปที่ LW10000 แล้ว Reset Flag
C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

#include "MacroInit.h"

void Macro_main(IN *p)
{
 MarcoInit
MarcoInit
//ToDo
  #define DownloadRecipeTriggerBit 60100
  #define ScanFinishFlag 60147
  #define ScanDataLength 60999
  #define ScanDataStart 61000

  #define MaxDataLength 50
  #define NumberOfBarcodes 10
  #define SaveDataStart 10000

  int i;
  if (LocalBit[ScanFinishFlag] == 1)
  {
      for (i = 0; i < LocalWord[ScanDataLength]; i++)
      {
          LocalWord[SaveDataStart + i] = LocalWord[ScanDataStart + i];
      }

      LocalBit[ScanFinishFlag] = 0;
  }
}
ตำแหน่งข้อมูลที่ใช้
LocalBit[60147]LocalWord[60999]LocalWord[61000+]LocalWord[10000+]

อธิบายโค้ด

  • กลุ่มแรก (60100, 60147, 60999, 61000) คือ Reserved Register ต้องใช้ตัวเลขนี้ตามคู่มือ แต่ตั้งชื่อเป็นอะไรก็ได้
  • MaxDataLength 50 — ระบบรองรับบาร์โค้ดยาวไม่เกิน 50 ตัวอักษร คิดเผื่อไว้ ส่วนมากบาร์โค้ดยาวตั้งแต่ 2–4 จนถึง 13–15 ตัว
  • NumberOfBarcodes 10 — จำนวนบาร์โค้ดย้อนหลังที่จะเก็บ ต้องเผื่อพื้นที่ข้อมูลไว้ (ใช้ในตอนต่อไป)
  • SaveDataStart 10000 — ตำแหน่งที่เรากำหนดเอง เริ่มที่ LW10000 ไว้เก็บข้อมูลปัจจุบันและย้อนหลัง
  • เงื่อนไขหลัก: ถ้า ScanFinishFlag เป็น 1 แปลว่าสแกนจบแล้ว ให้วนลูปคัดลอกข้อมูล โดย i เริ่มที่ 0 และจำนวนรอบเท่ากับความยาวใน ScanDataLength ฝั่งซ้าย (Save) เริ่มที่ 10000 ฝั่งขวา (Scan) เริ่มที่ Reserved Register 61000
  • คัดลอกเสร็จแล้ว Reset ScanFinishFlag จาก 1 เป็น 0 เพื่อพร้อมสแกนครั้งต่อไป แล้ว Compile

4. ผูก Script กับหน้าจอ

  • Init Script → เพิ่ม BarcodeScannerInit พอเครื่องติด HMI จะรู้ว่าต้องอ่านข้อมูลจาก Barcode Scanner
  • Global Script → เพิ่ม ScanLogic ทุกครั้งที่มีการสแกนจะได้รัน Logic ที่เรากำหนดไว้

5. ตัวแสดงผลบนหน้า Barcode

  • Numeric Display ที่ LW60999 แสดงความยาวของข้อมูลที่อ่านได้
  • ASCII Display ที่ LW10000 ตั้ง Total = 24 ตัวอักษร

6. ต่อ Scanner และทดสอบ

  1. Download ลง HMI
  2. ถอดสาย USB-C ออก แล้วเสียบสาย USB-A ของ Barcode Scanner เข้าที่พอร์ตของหน้าจอ
  3. Navigate ไปหน้า Barcode แล้วสแกน จะเห็นความยาวตัวอักษร (เช่นบาร์โค้ด AB ได้ 2) และข้อมูลที่อ่านได้

สิ่งที่ยังขาดคือการเก็บ History หลายตำแหน่ง และการเอาข้อมูลที่อ่านได้ไปเปลี่ยน Recipe ซึ่งอยู่ในตอนต่อไป

สรุป

  • LW60997 = 1 (ใน Init Script) เปิดรับข้อมูลจาก Scanner
  • LB60147 บอกว่าสแกนเสร็จ, LW60999 คือความยาว, LW61000 เป็นต้นไปคือข้อมูล
  • ใน Global Script คัดลอกข้อมูลไปเก็บที่ตำแหน่งของเราเอง (LW10000) แล้ว Reset LB60147
  • #define ช่วยตั้งชื่อ Register ให้โค้ดอ่านง่ายและดูแลง่าย

ตอนถัดไป

15. ใช้ Barcode กำหนดสูตรการผลิต

18 นาทีขั้นสูง · Advanced

ควรอ่านก่อน: