รูปปกบทความ เจาะลึก Variables Section

1. 🎯 ตอนที่ 6: เจาะลึก Variables Section (ส่วนประกาศตัวแปร) ปูพื้นฐานให้แน่นก่อนร่ายมนต์โค้ด

2. 📖 เปิดฉาก (The Hook)

จิบกาแฟแล้วมาลุยกันต่อครับน้องๆ! ถ้าย้อนกลับไปสมัยก่อน ตอนที่เราเขียน PLC รุ่นเก่าๆ เวลาเราจะเก็บค่าอะไรสักอย่าง เราต้องจำ “Address” ของมัน เช่น %MW100 หรือ D100 ใช่ไหมครับ? ลองจินตนาการว่าโปรเจกต์ของน้องมีมอเตอร์ 50 ตัว มีเซนเซอร์ 100 ตัว… การมานั่งจำว่า %MW100 คือความเร็วมอเตอร์ตัวที่ 1 และ %MW102 คือความเร็วมอเตอร์ตัวที่ 2 มันเป็นอะไรที่ทำลายเซลล์สมองมาก! แถมเวลาส่งโค้ดให้เพื่อนร่วมงานทำต่อ เพื่อนก็งงเป็นไก่ตาแตก

การจำ Address ดิบๆ ก็เหมือน “การต้องจำเบอร์โทรศัพท์เพื่อนทุกคนโดยไม่เมมชื่อ” นั่นแหละครับ! แต่ในโลกของ CODESYS และมาตรฐาน IEC 61131-3 เรามีระบบที่ชาญฉลาดกว่านั้น นั่นคือการใช้ “Variables Section” เพื่อตั้งชื่อตัวแปร (Identifier) ให้มนุษย์อ่านรู้เรื่อง วันนี้พี่จะพาไปเจาะลึกโครงสร้างของการประกาศตัวแปร ว่ามันมีกี่ประเภท และมีกฎการตั้งชื่ออย่างไรให้โค้ดของเราดูเป็นมืออาชีพ (Professional Software Engineer) ครับ!

3. 🧠 แก่นวิชา (Core Concepts)

ในโปรแกรม CODESYS โค้ดแต่ละ POU (Program Organization Unit) จะถูกแบ่งออกเป็น 2 ส่วนชัดเจนคือ “ส่วนประกาศตัวแปร (Declaration Part)” ด้านบน และ “ส่วนเขียนโค้ด (Implementation Part)” ด้านล่าง

สำหรับส่วนประกาศตัวแปร จะถูกครอบด้วยโครงสร้างพื้นฐานที่เรียกว่า VAR และจบด้วย END_VAR เสมอ รูปแบบไวยากรณ์ (Syntax) มาตรฐานคือ: <ชื่อตัวแปร> : <ชนิดข้อมูล> {:= <ค่าเริ่มต้น>};

แต่เดี๋ยวก่อน! โกดังเก็บข้อมูลของเราไม่ได้มีแค่แบบเดียว CODESYS มีประเภทของตัวแปร (Scope) ให้เลือกใช้ตามหน้าที่การทำงาน ดังนี้ครับ:

  • VAR ... END_VAR: ตัวแปรแบบ Local ใช้ได้เฉพาะใน POU หรือโปรแกรมที่มันถูกสร้างขึ้นมาเท่านั้น คนอื่นมองไม่เห็น (เหมือนตู้เซฟส่วนตัว)
  • VAR_INPUT ... END_VAR: ตัวแปรรับค่าขาเข้า มักใช้ใน Function Block (FB) เพื่อรับคำสั่งจากภายนอก
  • VAR_OUTPUT ... END_VAR: ตัวแปรส่งค่าขาออก ใช้สำหรับส่งผลลัพธ์ออกไปให้ระบบอื่น
  • VAR_GLOBAL ... END_VAR: ตัวแปรระดับ Global ประกาศไว้ใน GVL (Global Variable List) สามารถถูกเรียกใช้ได้จากทุกโปรแกรมในโปรเจกต์ (เหมือนบอร์ดประกาศของโรงงาน)
  • VAR CONSTANT ... END_VAR: ค่าคงที่ เป็นตัวแปรที่ “ห้ามเปลี่ยนค่าเด็ดขาด” ในขณะรันโปรแกรม เหมาะสำหรับตั้งค่า Limit หรือ Delay Time

กฎเหล็กในการตั้งชื่อตัวแปร (Identifier Rules):

  1. ต้องขึ้นต้นด้วยตัวอักษรภาษาอังกฤษ (A-Z, a-z) หรือเครื่องหมายขีดล่าง _ (Underscore) เท่านั้น
  2. ประกอบด้วยตัวอักษร ตัวเลข หรือขีดล่างได้ แต่ ห้ามเว้นวรรค และ ห้ามมีขีดล่างติดกัน 2 ตัว (เช่น Motor__Speed ถือว่าผิด)
  3. ไม่แยกตัวพิมพ์เล็ก-พิมพ์ใหญ่ (Case-insensitive) แปลว่า var1 และ VAR1 คือตัวเดียวกัน
  4. ห้าม ใช้คำสงวน (Keywords) ของระบบ เช่น TON, IF, VAR, END_VAR มาตั้งเป็นชื่อตัวแปรเด็ดขาด
ภาพแสดงโครงสร้าง Variable Scope และ Declaration

4. 💻 ร่ายมนต์โค้ดคอนโทรล (Logic & Implementation)

มาดูตัวอย่างการร่ายมนต์ประกาศตัวแปรแบบมืออาชีพ ในโปรแกรมหลัก PLC_PRG ของเรากันครับ สังเกตการแบ่งหมวดหมู่ให้เป็นระเบียบ:

PROGRAM PLC_PRG
// =================================================================
// 1. ตัวแปร Local พื้นฐาน (Local Variables)
// =================================================================
VAR
    xStartButton  : BOOL := FALSE; // สวิตช์เริ่มการทำงาน (กำหนดค่าเริ่มต้นเป็น FALSE)
    xStopButton   : BOOL := FALSE; // สวิตช์หยุดการทำงาน
    iProductCount : INT  := 0;     // จำนวนชิ้นงานที่นับได้
    rTemperature  : REAL := 25.5;  // อุณหภูมิปัจจุบัน (ทศนิยม)
END_VAR

// =================================================================
// 2. ค่าคงที่ (Constants) ที่ห้ามเปลี่ยนแปลงระหว่างรัน
// =================================================================
VAR CONSTANT
    c_rMaxTemp    : REAL := 100.0; // อุณหภูมิสูงสุดที่ยอมรับได้
    c_tDelayTime  : TIME := T#5s;  // เวลาหน่วงก่อนมอเตอร์ทำงาน
END_VAR

// =================================================================
// 3. ส่วนของ Logic การทำงาน (Implementation)
// =================================================================
// นำตัวแปรที่ประกาศมาเขียนเงื่อนไขด้วย Structured Text
IF xStartButton AND (rTemperature < c_rMaxTemp) THEN
    iProductCount := iProductCount + 1; // เพิ่มค่านับชิ้นงาน
END_IF;

5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)

ในฐานะ Architect พี่มีเทคนิคการทำงานจากคัมภีร์ลับที่จะทำให้น้องๆ ดูโปรขึ้นอีกขั้นครับ:

  • ใช้ “Hungarian Notation” เสมอ: การตั้งชื่อตัวแปรที่ดีควรบอก “ชนิดข้อมูล (Data Type)” ไว้ที่ตัวอักษรแรกของชื่อด้วยครับ เช่น เติม x หรือ b นำหน้า BOOL (xStartButton), เติม i นำหน้า INT (iCount), เติม r นำหน้า REAL (rTemperature) วิธีนี้จะช่วยให้น้องๆ ไม่งงเวลาเขียนสมการยาวๆ โค้ดจะไม่ Error เพราะชนิดข้อมูลชนกันครับ
  • ค่าเริ่มต้น (Initial Value) สำคัญมาก: ถึงแม้ CODESYS จะใจดี ตั้งค่าเริ่มต้นให้เป็น 0 หรือ FALSE อัตโนมัติในกรณีที่เราไม่ได้ระบุ (เช่น xMotor : BOOL;) แต่ Best Practice คือ “ควรเขียนกำหนดค่าเริ่มต้นไว้เสมอ” (เช่น xMotor : BOOL := FALSE;) เพื่อให้โปรแกรมเมอร์คนอื่นที่มาอ่านโค้ดเข้าใจเจตนาของเราชัดเจนครับ
  • ระวังกับดัก RETAIN: หากน้องๆ มีตัวแปรที่ต้องการให้ “จำค่าไว้ได้แม้ไฟดับ” (เช่น ยอดผลิตรวมของเครื่องจักร) น้องต้องใช้โครงสร้าง VAR RETAIN ... END_VAR แต่ข้อควรระวังคือ พื้นที่ RETAIN Memory ใน PLC แต่ละรุ่นมีจำกัดมาก อย่าเผลอประกาศทุกตัวแปรเป็น RETAIN หมดนะครับ ไม่งั้นโหลดโค้ดไม่ลงแน่นอน!

6. 🏁 บทสรุป (To be continued…)

เห็นไหมครับว่า Variables Section ไม่ใช่แค่พื้นที่เอาไว้พิมพ์ๆ ชื่อให้มันจบไป แต่มันคือ “รากฐานของสถาปัตยกรรมซอฟต์แวร์” ถ้าเราออกแบบโกดังข้อมูลของเราดี ตั้งชื่อเป็นระเบียบ โค้ด Structured Text ของเราก็จะอ่านง่ายเหมือนอ่านหนังสือภาษาอังกฤษ ลดปัญหา Bug และทำให้การส่งมอบงานให้ทีมงานลื่นไหลสุดๆ ครับ

ในตอนหน้า พี่จะพาไปเจาะลึกชนิดข้อมูลแต่ละประเภท ไม่ว่าจะเป็นสาย Boolean, สายตัวเลข (INT/REAL) หรือสายข้อความ (STRING) ว่าแต่ละตัวกินพื้นที่ความจำกี่บิต และมีข้อควรระวังอย่างไรเวลาจับมาคำนวณ เตรียมตัวลุยกันต่อได้เลยครับ!


ต้องการที่ปรึกษาด้านการเขียนโปรแกรม PLC (CODESYS) และพัฒนาระบบ Automation ให้กับโรงงานของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและติดตั้งระบบแบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p