การใช้งาน 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
เป้าหมายของระบบ
EP.14 ของซีรีส์ Complete HMI ใช้ C Script ที่เรียนมา 2 ตอนก่อนหน้า มาอ่าน Barcode Scanner แบบ USB ที่เสียบเข้ากับหน้าจอ HMI โดยตั้งเป้าหมายไว้ 3 ข้อ:
- แสดงข้อมูลที่อ่านได้จาก Barcode Scanner บน HMI
- เก็บข้อมูลที่สแกนได้ 10 ตัวย้อนหลัง (History)
- นำข้อมูลที่สแกนได้ล่าสุดไปกำหนดสูตรการผลิต (เปลี่ยน Recipe)
คลิปนี้ทำข้อ 1 ให้เสร็จ ส่วน History และการเปลี่ยน Recipe อยู่ในตอนต่อไป
Reserved Register ที่เกี่ยวข้อง
Barcode Scanner
| Register | ความหมาย |
|---|---|
| LB60147 | End mark of QR code scanning USB ติดเป็น 1 เมื่อยิงบาร์โค้ดเสร็จ ใช้เป็นเงื่อนไขให้โค้ดทำงาน |
| LW60997 | ตั้งเป็น 1 แล้วหน้าจอจะรอรับข้อมูลจาก Barcode Scanner |
| LW60999 | ความยาวของตัวอักษรที่อ่านได้ เช่น 2, 4 หรือ 13 ตัว ใช้กำหนดจำนวนรอบของลูปตอนเก็บข้อมูล |
| LW61000 เป็นต้นไป (ถึง LW61127) | ที่ที่หน้าจอพักข้อมูลที่อ่านได้ไว้ให้ก่อน เราค่อยคัดลอกไปเก็บใน Local Word ที่กำหนดเอง |
Recipe (ใช้ในตอนต่อไป)
| Register | ความหมาย |
|---|---|
| RWI0 | Recipe number register ระบุ Recipe ปัจจุบันของหน้าจอ |
| LB60100 | Recipe download เมื่อ Trigger บิตนี้ Recipe ปัจจุบันจะถูกเขียนจากหน้าจอไปที่ PLC |
ข้อจำกัดของ ASCII
C Script รองรับตัวอักษร ASCII โดย Default ซึ่งใช้ได้เฉพาะตัวอักษรภาษาอังกฤษ ตัวเลข และอักขระพิเศษบางตัว ควรรู้ด้วยว่าแต่ละตัวอักษรเก็บเป็นค่าอะไร เช่น ตัว A (ตัวใหญ่) = 41 ในเลขฐาน 16 = 65 ในเลขฐาน 10
1. สร้างหน้า Barcode
- Copy หน้าเดิมมา Paste แล้วเปลี่ยน Property เป็น ID 21 ชื่อ Barcode
- แก้หัวข้อในหน้า
- สร้างปุ่ม Navigate มาหน้านี้เหมือนเดิม และเปลี่ยน Appearance เป็น Barcode
2. Script Initialize — บอก HMI ว่าจะใช้ Barcode Scanner
ใน Script Editor สร้าง Script ใหม่ชื่อ BarcodeScannerInit แล้วตั้ง LW60997 เป็น 1:
#include "MacroInit.h"
//#include "subFun1.c" //Example
#include "MacroInit.h"
void Macro_main(IN *p)
{
MarcoInit
MarcoInit
//ToDo
#define UseScanner 60997
LocalWord[UseScanner] = 1;
}#define คืออะไร
นอกจากการประกาศตัวแปร ยังมี Preprocessor Directive อย่าง #define ก่อน Compile ตัว Compiler จะเอาค่าที่เรากำหนดไว้ไปแทนในโค้ดให้ จึงไม่ต้องประกาศตัวแปร
- เขียน
#defineตามด้วยชื่อ แล้วตามด้วยค่า เช่น#define UseScanner 60997 - ไม่ต้อง ใส่เครื่องหมาย
=และ ไม่ต้อง ปิดด้วย; - จากนั้นเขียน
LocalWord[UseScanner]แทนLocalWord[60997]ได้เลย Compile ผ่านปกติ
กลับมาอ่านโค้ดทีหลังก็รู้ทันทีว่าตำแหน่งที่ตั้งเป็น 1 เกี่ยวกับ Scanner ดูแลโค้ดระยะยาวได้ไม่งง
3. Script หลัก — ScanLogic
สร้าง Script ใหม่ชื่อ ScanLogic สำหรับเอาข้อมูลที่สแกนได้ไปเก็บ:
#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;
}
}อธิบายโค้ด
- กลุ่มแรก (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 และทดสอบ
- Download ลง HMI
- ถอดสาย USB-C ออก แล้วเสียบสาย USB-A ของ Barcode Scanner เข้าที่พอร์ตของหน้าจอ
- Navigate ไปหน้า Barcode แล้วสแกน จะเห็นความยาวตัวอักษร (เช่นบาร์โค้ด AB ได้ 2) และข้อมูลที่อ่านได้
สิ่งที่ยังขาดคือการเก็บ History หลายตำแหน่ง และการเอาข้อมูลที่อ่านได้ไปเปลี่ยน Recipe ซึ่งอยู่ในตอนต่อไป
สรุป
- LW60997 = 1 (ใน Init Script) เปิดรับข้อมูลจาก Scanner
- LB60147 บอกว่าสแกนเสร็จ, LW60999 คือความยาว, LW61000 เป็นต้นไปคือข้อมูล
- ใน Global Script คัดลอกข้อมูลไปเก็บที่ตำแหน่งของเราเอง (LW10000) แล้ว Reset LB60147
#defineช่วยตั้งชื่อ Register ให้โค้ดอ่านง่ายและดูแลง่าย
ตอนถัดไป
15. ใช้ Barcode กำหนดสูตรการผลิต
ควรอ่านก่อน:
มีคำถาม? ติดต่อทีมงาน
