การทำระบบ Barcode Scanner กับ HMI Samkoon และ PLC

การใช้งาน Barcode ร่วมกันกับ PLC นั้น เป็นระบบที่ค่อนข้างได้รับความนิยมในช่วงเวลาที่ผ่านมา หากเราต้องการใช้ข้อมูลจาก Barcode มาเป็นเงื่อนไขของการทำงานของ PLC ของเรา เราจำเป็นต้องเรียนรู้เกี่ยวกับการใช้งาน Script ในหน้าจอ Samkoon กันก่อน โดยท่านสามารถอ่านจากบล็อคด้านล่าง หรือ กด link ไปที่วีดีโอสาธิต ได้เลยครับ

อุปกรณ์ที่ใช้

  • PLC: ยี่ห้อ AMSAMOTION รุ่น AMX-FX3U-26MT-E

  • HMI: ยี่ห้อ SAMKOON รุ่น SK-070MW

  • สาย USB-A

  • USB Barcode Scanner

วิธีทำ

1. ต่อ PLC เข้ากับหน้าจอ HMI และต่อหน้าจอ HMI เข้ากับ Barcode Scanner ด้วยสาย USB-A ตาม diagram ด้านล่าง

system-diagram

2. สร้าง Project ใหม่ในโปรแกรม SKTool โดยในการสาธิตนี้เราจะตั้งชื่อ Project ง่ายๆว่า barcode-hmi และตั้งค่าต่างๆตามรายละเอียดด้านล่างนี้

  • เลือก Model เป็น SK-070MW แล้วกด Next

  • Device Service เลือกเป็น Modbus และ Modbus RTU Master ซึ่งหมายความว่าเราให้หน้าจอเป็น Master แล้วกด Next

  • ในการสาธิตนี้เราจะตั้งชื่อ Screen Name ว่า Main และเลือก BG Color เป็นสีขาวและกด Finish

3. สร้าง Script เพื่อใช้ Barcode Scanner

  • เปิด Script Editor จากแถบซ้ายของโปรแกรม SKTOOL

  • กด New เพื่อสร้าง Script ใหม่ โดย Script ตัวนี้จะเป็นการ Config หน้าจอ HMI เพื่อใช้ Barcode Scanner ก่อน เราสามารถตั้งชื่อ Script ว่าอะไรก็ได้แต่ในตัวอย่างนี้ เราจะตั้งชื่อว่า 'Config'

  • เริ่มเขียน Code โดยเมื่ออ้างอิงจากคู่มือในส่วนของ Reserved Registers นั้น เราต้องตั้งค่า LocalWord ตัวที่ 60997 ให้มีค่าเท่ากับ 1 ดังนั้นเราจึงเขียน Code ตาม 2 บรรทัดด้านล่างลงไป

//ToDo
#define SCANNING_INPUT 60997
LocalWord[SCANNING_INPUT] = 1;
  • ทดลอง Compile Code และออกจากหน้า Code Editor

  • Double Click เพื่อเปิด Init Script ในแถบข้างซ้ายขึ้นมา แล้วกด New

  • เลือก Config->[ID:0] ใน Dropdown ซึ่งคือโค้ดที่เราเพิ่งเขียนเมื่อกี้ แล้วกด OK

  • สำหรับหน้าจอรุ่นนี้ ก่อนดาวน์โหลดต้องกดเลือก Remote setting ในแถบด้านซ้ายเพื่อใส่ Connect Password เข้าไปในหน้าจอ HMI โดยในตัวอย่างนี้เราจะใส่เป็น 123456 หลังจากนั้นกด Untick ตรงช่อง Allow remote upload and download

4. สร้าง Script เพื่อเขียน Logic ในการอ่านและใช้ข้อมูลจาก Barcode

  • เปิด Script Editor อีกครั้งและกด New โดยในตัวอย่างนี้เราจะตั้งชื่อมันว่า ScanLogic

เมื่ออ้างอิงจาก Essential Reserved Registers การเข้าถึงข้อมูลที่เก็บไว้ใน HMI เราจะสามารถทำผ่าน LocalBit Address 60147, LocalWord Address 60999 และ 61000 - 61127 ตามรายละเอียดในภาพด้านล่าง

essential-reserved-registers
  • เขียน Code ตามด้านล่าง

//ToDo
#define END_MARK_SCANNING 60147
#define SCAN_CODE_LENGTH 60999
#define STORAGE_START 61000
#define SELF_DEFINE_STORAGE 10000
int i = 0;
if (LocalBit[END_MARK_SCANNING] == 1)
{
   for (i = 0; i < LocalWord[SCAN_CODE_LENGTH]; i ++)
   {
       LocalWord[SELF_DEFINE_STORAGE + i] = LocalWord[STORAGE_START + 1];
   }
   LocalBit[END_MARK_SCANNING] = 0;
}
  • Compile code ด้านบน

  • เปิด Global Script ล่าง Script ตรงแถบด้านซ้ายแล้วกด New

  • เลือก ScanLogic->[ID:1] ใน Dropdown ซึ่งคือโค้ดที่เราเพิ่งเขียนเมื่อกี้ เลือก Frequency เป็น 50 แล้วกด OK

  • เปิด ASCII Display ตรงแถบด้านขวาและกดปุ่มหลังแถบ Monitor Address

  • ป้อนค่า LW 10000 ซึ่งเป็นตัวที่เราสนใจเข้าไปและกด ENT

  • ค่า Total ให้ระบุจำนวนตัวอักษรตามความยาว Barcode ซึ่งในตัวอย่างนี้ระุบุเป็น 8 เลือก Font size ตามต้องาร กด OK แล้วลากสร้างปุ่มขึ้นมา 1 ปุ่ม

  • Download สิ่งนี้เข้าไปในตัวหน้าจอ

  • ลอง Scan Barcode ที่เตรียมไว้ ถ้าทำทุกอย่างถูกต้อง ปุ่มตรงหน้าจอจะแสดงผลตามค่า ASCII ที่ดึงมาได้

  • ตาราง ASCII and Hexadecimals จะบอกเราได้ว่า ในค่า ASCII ที่เราต้องการนั้น เราต้อง Config เลขฐาน 16 อย่างไร เช่น ถ้าต้องการให้ ASCII เป็น 123 เมื่อเทียบจากในตารางแล้วจะได้ค่าของเลขฐาน 16 เป็น 313233 เป็นต้น

  • Code เพิ่มเพื่อเช็คว่า LocalWord ที่ 10,000 มีค่าเป็น 123 หรือไม่ และถ้าใช้จะสั่งให้ Y0 ติด โดย Code ใหม่จะเป็นตามด้านล่างนี้

//ToDo
#define END_MARK_SCANNING 60147
#define SCAN_CODE_LENGTH 60999
#define STORAGE_START 61000
#define SELF_DEFINE_STORAGE 10000
int i = 0;
if (LocalBit[END_MARK_SCANNING] == 1)
{
  for (i = 0; i < LocalWord[SCAN_CODE_LENGTH]; i++)
  {
    LocalWord[SELF_DEFINE_STORAGE + i] = LocalWord[STORAGE_START + 1];
  }
  LocalBit[END_MARK_SCANNING] = 0;
  // 1 (ASCII) => 31 (Hexadecimal)
  // 2 (ASCII) => 32 (Hexadecimal)
  // 1 ASCII Character => 8 bits
  // 1 Word => 2 ASCII Character
  if (LocalWord[SELF_DEFINE_STORAGE] == 0X3231 && LocalWord[SELF_DEFINE_STORAGE +  1] == 0X33)
  {
    Y0 = 1;
  }
}
  • Double click ตรง New ใต้แถบ Variable settings ด้านล่าง และตั้งค่า

    • Name: Y0

    • Data type: bool

    • Address: 0x0

แล้วกด Compile

  • Download ลง HMI

  • ลอง Scan อีกรอบที่ Barcode ตัว 123 จะเห็นว่า Y0 ติด

  • เขียนเงื่อนไขเพิ่มเติมสำหรับตัว 456 โดย Double Click ที่ ScanLogic->[ID:1] ใต้ Script list อีกรอบ

ให้เขียน Code เพิ่มตามด้านล่าง

//ToDo
#define END_MARK_SCANNING 60147
#define SCAN_CODE_LENGTH 60999
#define STORAGE_START 61000
#define SELF_DEFINE_STORAGE 10000
int i = 0;
if (LocalBit[END_MARK_SCANNING] == 1)
{
  for (i = 0; i < LocalWord[SCAN_CODE_LENGTH]; i++)
  {
    LocalWord[SELF_DEFINE_STORAGE + i] = LocalWord[STORAGE_START + 1];
  }
  LocalBit[END_MARK_SCANNING] = 0;
  // 1 (ASCII) => 31 (Hexadecimal)
  // 2 (ASCII) => 32 (Hexadecimal)
  // 1 ASCII Character => 8 bits
  // 1 Word => 2 ASCII Character
  if (LocalWord[SELF_DEFINE_STORAGE] == 0X3231 && LocalWord[SELF_DEFINE_STORAGE +  1] == 0X33)
  {
    Y0 = 1;
    Y1 = 0;
    Y2 = 0;
  }
  else if(LocalWord[SELF_DEFINE_STORAGE] == 0X3534 && LocalWord[SELF_DEFINE_STORAGE + 1] == 0X36)
  {
    Y0 = 0;
    Y1 = 1;
    Y2 = 0;
  }
  else if (LocalWord[SELF_DEFINE_STORAGE] == 0X3837 && LocalWord[SELF_DEFINE_STORAGE + 1] == 0X39)
  {
    Y0 = 0;
    Y1 = 0;
    Y2 = 1;
  }
  else
  {
    Y0 = 0;
    Y1 = 0;
    Y2 = 0;
  }
}
  • สร้าง Variable Y2 เพิ่มโดยการ Double Click แถวล่าง Y1 ในแถบ Variable settings ด้านล่าง ตั้งค่า Address เป็น Link 1 0X2

  • Compile Code และ Download ลง HMI

5. ถ้าทำทุกอย่างถูกต้อง เมื่อลอง Scan Barcode ต่างๆจะต้องเป็นไปตาม Logic ที่เขียนไว้ เช่น ถ้า Scan Barcode 123 => Y0 ติด ถ้า Scan 456 => Y1 ติด ถ้า Scan 789 => Y2 ติด และถ้า Scan Barcode ข้อมูลอื่นๆ จะไม่มีอะไรติดเลย