ตอนที่ 6: เจาะลึก 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):
- ต้องขึ้นต้นด้วยตัวอักษรภาษาอังกฤษ (A-Z, a-z) หรือเครื่องหมายขีดล่าง
_(Underscore) เท่านั้น - ประกอบด้วยตัวอักษร ตัวเลข หรือขีดล่างได้ แต่ ห้ามเว้นวรรค และ ห้ามมีขีดล่างติดกัน 2 ตัว (เช่น
Motor__Speedถือว่าผิด) - ไม่แยกตัวพิมพ์เล็ก-พิมพ์ใหญ่ (Case-insensitive) แปลว่า
var1และVAR1คือตัวเดียวกัน - ห้าม ใช้คำสงวน (Keywords) ของระบบ เช่น
TON,IF,VAR,END_VARมาตั้งเป็นชื่อตัวแปรเด็ดขาด

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