HMI
ขั้นสูง
20 นาที

if, else, loop และ String

เรียนรู้ภาษา C สำหรับ HMI ครอบคลุม Conditional Statement, Loop, Function และ String Handling เตรียมพร้อมใช้งาน Barcode Scanner

อัพเดทล่าสุด: 30/1/2569

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

฿6,990

บทนำ C Language สำหรับงานบาร์โค้ดใน HMI

บทความนี้เป็นส่วนต่อจากตอนที่ 1 ซึ่งจะครอบคลุมเรื่องสำคัญต่างๆ ของภาษา C สำหรับการใช้งานใน HMI ประกอบด้วย Conditional Statement, Loop, Function การสร้าง และ String Handling ที่จะนำไปใช้กับ Barcode Scanner ในตอนถัดไป

Conditional Statement (เงื่อนไขการทำงาน)

การใช้ IF Statement

IF Statement ใช้สำหรับกำหนดเงื่อนไขการทำงาน หาก condition เป็นจริง code block ข้างในจะถูกประมวลผล

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 if (LocalBit[0] == 1) {
   LocalWord[12] = 555;
 }
}

หมายเหตุ: การใช้ == (Comparison Operator) สำหรับเปรียบเทียบค่า

การใช้ IF-ELSE

เมื่อเงื่อนไขใน IF ไม่เป็นจริง จะทำงานใน ELSE block แทน

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 if (LocalBit[0] == 1) {
   LocalWord[12] = 555;
 } else {
   LocalWord[12] = 666;
 }
}

การใช้ ELSE IF

สำหรับกรณีที่มีหลายเงื่อนไข สามารถใช้ ELSE IF เพื่อเพิ่มเงื่อนไขระหว่างกลาง

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 if (LocalWord[13] > 100) {
   LocalWord[14] = 1;
 } else if (LocalWord[13] < 10) {
   LocalWord[14] = 2;
 } else {
   LocalWord[14] = 3;
 }
}

การทดสอบ Conditional Statement

  1. สร้าง switch สำหรับ LB0 ด้วย function Invert
  2. สร้าง Numeric Display สำหรับแสดงผล LW12, LW13, LW14
  3. เรียกใช้ Script แบบ Global Script ด้วยความถี่ 50 ms
  4. ทดสอบการทำงานใน Offline Simulate

While Loop (การวนซ้ำ)

ปัญหาของการเขียนแบบ Manual

การ copy ข้อมูลจาก Array ไปยัง Local Word หากทำแบบ manual จะเสียเวลาและไม่มีประสิทธิภาพ

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 // วิธีที่ไม่ดี
 LocalWord[20] = myData[0];
 LocalWord[21] = myData[1];
 LocalWord[22] = myData[2];
 // ... ต่อไปเรื่อยๆ
}

การใช้ FOR Loop

FOR Loop ประกอบด้วย 3 ส่วน: ค่าเริ่มต้น, เงื่อนไข, การเพิ่มค่า

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 short myData[5] = {2, 4, 6, 8, 10};
 short myDataLength = sizeof(myData) / sizeof(myData[0]);

 short i;
 for (i = 0; i < myDataLength; i++) {
   LocalWord_20[i] = myData[i];
 }
}

การคำนวนขนาด Array

การใช้ sizeof() function เพื่อคำนวนขนาด Array อัตโนมัติ

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 LocalWord[15] = sizeof(myData);        // ผลลัพธ์: 10 bytes (5 x 2 bytes)
 LocalWord[16] = sizeof(myData[0]);     // ผลลัพธ์: 2 bytes
 short myDataLength = LocalWord[15] / LocalWord[16];  // 10 / 2 = 5
}

เคล็ดลับ: การคำนวนแบบนี้ทำให้สามารถเพิ่ม element ใน Array ได้โดยไม่ต้องแก้ไข code

String Handling (การจัดการข้อความ)

การประกาศ String

String ในภาษา C คือ Character Array

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 char myChar = 'A';                    // ตัวอักษรเดี่ยว
 char myString[] = "IoT HMI";          // String (Character Array)
}

ปัญหาการแสดงผล String

การแสดง String ใน HMI ไม่สามารถใช้วิธีเดียวกับ Character เดี่ยวได้

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 LocalWord[25] = myChar;        // ใช้ได้กับ ASCII Display
 LocalWord[26] = myString;      // ไม่ทำงาน - ต้องใช้ Memory Copy
}

Function (การสร้างฟังก์ชัน)

การสร้าง Function

Function ช่วยให้ code สามารถใช้ซ้ำได้และมีโครงสร้างที่ดีขึ้น สร้างโดยการคลิกขวาที่ Sub script

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 // ในไฟล์ Increment.c
 short increment(short number) {
   return number + 1;
 }
}

การใช้ Function

  1. Import function ด้วย #include
  2. เรียกใช้ function ในโปรแกรมหลัก
C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 #include "increment.c"

 // ใช้งานใน Loop
 for (short i = 0; i < MyDataLength; i++) {
   LocalWord[20 + i] = increment(myData[i]);
 }
}

Memory Copy Function (Memcpy)

Memcpy ใช้สำหรับ copy String ไปยัง memory ที่กำหนด

C · SKTool Macro
#include "MacroInit.h"
//#include "subFun1.c" //Example

void Macro_main(IN *p)
{
 MarcoInit
 memcpy(LocalWord[30], myString, strlen(myString));
}

Parameter ของ Memcpy:

  1. Destination - ตำแหน่งที่ต้องการ copy ไป
  2. Source - String ต้นทาง
  3. Size - ขนาดของข้อมูล (ใช้ strlen() หาขนาด String)

การแสดง String ใน HMI

  1. ใช้ ASCII Display component
  2. ตั้งค่า Address เป็น LocalWord ที่ copy String ไว้
  3. กำหนดความยาวที่เหมาะสม
  4. ระบุจำนวนตัวอักษรที่ต้องการแสดง

การแก้ปัญหาที่พบบ่อย

Script ไม่ทำงาน

  • ตรวจสอบการตั้งค่า Global Script
  • ใช้ความถี่ 50ms สำหรับการทดสอบ
  • ตรวจสอบ syntax error ใน compiler

String ไม่แสดงผล

  • ใช้ memcpy() แทนการ assign โดยตรง
  • ตั้งค่า ASCII Display ให้ถูกต้อง
  • ตรวจสอบขนาด memory ที่จอง

Array Index Error

  • ใช้ sizeof() คำนวนขนาดอัตโนมัติ
  • ตรวจสอบ condition ใน FOR loop

เคล็ดลับการใช้งาน

  • Dynamic Array Size: ใช้ sizeof() เพื่อให้ code ปรับตัวได้เมื่อเพิ่มข้อมูล
  • Memory Management: วางแผนการใช้ LocalWord ให้เป็นระเบียบ
  • Function Reusability: สร้าง function สำหรับงานที่ทำซ้ำบ่อย
  • String Length: ใช้ strlen() แทนการนับตัวอักษรเอง

สรุป

ตอนที่ 2 นี้ครอบคลุมองค์ประกอบสำคัญของภาษา C สำหรับ HMI ได้แก่ Conditional Statement, FOR Loop, Function การสร้าง และ String Handling เหล่านี้เป็นพื้นฐานสำคัญที่จะนำไปประยุกต์ใช้กับ Barcode Scanner ในตอนถัดไป การเข้าใจเรื่องเหล่านี้จะช่วยให้สามารถเขียน Script ที่มีประสิทธิภาพและบำรุงรักษาได้ง่ายขึ้น