ตอนที่ 4: ทำความเข้าใจโครงสร้างโปรเจกต์ (Project Structure) ใน CODESYS ก่อนลงมือลุยโค้ด

1. 🎯 ตอนที่ 4: ทำความเข้าใจโครงสร้างโปรเจกต์ (Project Structure) ใน CODESYS ก่อนลงมือลุยโค้ด
2. 📖 เปิดฉาก (The Hook)
จิบกาแฟยามเช้าแล้วมาคุยกันต่อครับน้องๆ! เวลาที่เราก้าวเท้าเข้าโรงงานใหม่เป็นครั้งแรก สิ่งแรกที่ต้องหาให้เจอคือ “ห้องคอนโทรลอยู่ไหน? เครื่องจักรวางยังไง?” ถูกไหมครับ? การเขียนโปรแกรมก็เหมือนกัน! โปรแกรมเมอร์หน้าใหม่หลายคนที่เพิ่งเปิดโปรแกรม CODESYS ขึ้นมาครั้งแรกมักจะช็อกกับหน้าต่าง (Windows) ที่ยุ่บยั่บไปหมด จนไม่รู้จะเริ่มเขียนโค้ดตรงไหน
หลายคนรีบใจร้อน พิมพ์โค้ด Structured Text (ST) ทันที แต่พอกดรัน (Run) อ้าว… ทำไมมอเตอร์ไม่หมุน? โค้ดก็เขียนถูกนี่นา! สาเหตุหลักเป็นเพราะเรายังไม่เข้าใจ “โครงสร้างโปรเจกต์ (Project Structure)” ของมันครับ ในโลกของ CODESYS โค้ดที่เขียนเสร็จแล้วจะไม่มีวันทำงานเลย ถ้ามันไม่ถูกจัดตารางเวรใน Task Configuration และไม่ถูกผูกเข้ากับฮาร์ดแวร์ใน Device Tree!
วันนี้พี่ฐานะซีเนียร์ จะพามาทัวร์หน้าจอ IDE ของ CODESYS เพื่อดูว่าฟันเฟืองแต่ละชิ้นอย่าง POU, Task Configuration และ Device Tree มันทำงานสอดประสานกันยังไงครับ
3. 🧠 แก่นวิชา (Core Concepts)
โครงสร้างโปรเจกต์ใน CODESYS ถูกออกแบบมาอย่างเป็นระบบตามมาตรฐาน IEC 61131-3 โดยประกอบด้วยหน้าต่างและองค์ประกอบหลักที่วิศวกรต้องใช้งานบ่อยๆ ดังนี้ครับ:
- Device Window (Device Tree): หรือต้นไม้ฮาร์ดแวร์ หน้าต่างนี้อยู่ฝั่งซ้ายมือ ใช้สำหรับจัดการฮาร์ดแวร์ทั้งหมดที่เรากำลังควบคุมอยู่ (เช่น PLC, I/O Modules) ภายใน Device จะประกอบไปด้วย
Applicationซึ่งเป็นที่เก็บโค้ดโปรแกรมหลักและตารางการทำงานของ PLC ตัวนั้นๆ (เปรียบเหมือน Solution Explorer ใน C# ครับ) - POU (Program Organization Unit): นี่คือ “ก้อนอิฐ” พื้นฐานที่สุดของการเขียนโปรแกรม POU สามารถเป็นได้ 3 แบบ คือ
Program (PRG)- โปรแกรมหลักFunction (FUN)- ฟังก์ชันคำนวณที่ไม่มีหน่วยความจำFunction Block (FB)- บล็อกคำสั่งที่มีหน่วยความจำในตัว (เสมือนแม่พิมพ์ Class ใน OOP)
- POU Window: หน้าต่างฝั่งซ้าย (ด้านล่างหรือแยกแท็บ) ที่ใช้จัดการ POU ที่สามารถนำไปใช้ได้ “ทั่วทั้งโปรเจกต์” (Global) ไม่ผูกมัดกับ PLC ตัวใดตัวหนึ่ง ทำให้เราสามารถสร้างฟังก์ชันมาตรฐานเก็บไว้ใช้ซ้ำได้ (Reusability)
- Task Configuration: เปรียบเสมือน “ตารางเวรการทำงาน” หรือผู้จัดการ (Scheduler) ที่คอยสั่งว่า POU หรือโปรแกรมตัวไหน จะถูกเรียกให้ทำงานเมื่อไหร่ (เช่น ให้ทำงานแบบ Cyclic ทุกๆ 20ms)
- Editor Window & Message Window: พื้นที่ตรงกลางคือ Editor สำหรับลุยเขียนโค้ด ST ส่วนด้านล่างคือ Message Window ที่คอยฟ้อง Error เวลาเรา Compile โค้ดครับ

4. 💻 ร่ายมนต์โค้ดคอนโทรล (Logic & Implementation)
เมื่อเราสร้างโปรเจกต์มาตรฐาน (Standard Project) ขึ้นมา CODESYS จะสร้างแอปพลิเคชันพื้นฐานให้เราโดยอัตโนมัติ ซึ่งประกอบด้วย PLC_PRG (โปรแกรมหลัก) และถูกจับใส่ไว้ใน MainTask ให้เรียบร้อยแล้ว
นี่คือตัวอย่างการประกาศใช้งาน POU ที่เราสร้างขึ้นใหม่ และนำมาเรียกใช้ในโปรแกรมหลัก PLC_PRG ครับ:
// =================================================================
// 1. สมมติว่าเราสร้าง POU แบบ Function Block ชื่อ 'fbMotorControl' ไว้
// (สร้างเป็นแม่พิมพ์ไว้ใน POU Window)
// =================================================================
// -----------------------------------------------------------------
// 2. กลับมาที่โปรแกรมหลัก: PLC_PRG (ถูกผูกไว้กับ MainTask แล้ว)
// -----------------------------------------------------------------
PROGRAM PLC_PRG
VAR
// ประกาศสร้าง Instance จากแม่พิมพ์ Function Block
// (เปรียบเสมือนการสั่ง myMotor = new fbMotorControl() ใน OOP)
myMotor : fbMotorControl;
xStart : BOOL; // สัญญาณรับจาก HMI
xStop : BOOL;
xStatus : BOOL; // ส่งไปทำ I/O Mapping กับ Output จริง
END_VAR
// เรียกใช้งาน myMotor ให้ทำงานในรอบสแกน (Scan Cycle) ปัจจุบัน
myMotor(xStartCmd := xStart, xStopCmd := xStop);
// นำผลลัพธ์ (Output) ของบล็อกไปใช้งานต่อ
xStatus := myMotor.xMotorRun;
// 💡 หัวใจสำคัญ: โค้ดทั้งหมดใน PLC_PRG นี้ จะถูกรันอย่างต่อเนื่อง
// ตามเวลาที่ตั้งไว้ใน Task Configuration (เช่น ทุกๆ 10ms)5. 🛡️ เคล็ดลับจากคัมภีร์ลับ (Under the Hood / Pro-Tips)
ในฐานะสถาปนิกระบบ พี่มีเรื่องที่มือใหม่มักจะ “ตกม้าตาย” บ่อยๆ มาเตือนครับ:
- เขียนโค้ดแทบตาย แต่ลืมใส่ Task!: กฎเหล็กคือ “โค้ดที่ไม่อยู่ใน Task จะไม่มีวันถูกประมวลผล” ถ้าคุณสร้าง POU ใหม่ขึ้นมา (เช่น
PRG_Conveyor) คุณต้องเดินไปที่ Task Configuration แล้วคลิกAdd POUเพื่อเอาโปรแกรมของคุณไปต่อคิวให้ CPU ประมวลผลเสมอครับ! - POUs vs Device Tree: ทำไมถึงมีเมนูให้เพิ่ม POU ได้ทั้งสองที่?
- ถ้าเพิ่ม POU ใต้หน้าต่าง
POUs(Project-wide) ก้อนโค้ดนี้จะใช้กับ PLC ตัวไหนก็ได้ในโปรเจกต์ - แต่ถ้าคลิกขวา Add POU ภายใต้
ApplicationในDevice Treeโค้ดนี้จะใช้ได้เฉพาะกับ PLC ตัวนั้นเท่านั้น (เหมาะสำหรับโค้ดที่ผูกติดกับ Hardware เฉพาะเจาะจง)
- ถ้าเพิ่ม POU ใต้หน้าต่าง
- ลำดับความสำคัญ (Priority): ในระบบใหญ่ๆ คุณสามารถสร้าง Task ได้หลายตัว เช่น
FastTask(ทำทุก 1ms สำหรับ Motion) และSlowTask(ทำทุก 100ms สำหรับดึงอุณหภูมิ) การกำหนด Priority และ Cycle Time ให้เหมาะสมในหน้า Task Configuration คือศิลปะขั้นสูงที่จะป้องกันไม่ให้ PLC ทำงานหนักจนเกิด Watchdog Error ครับ
6. 🏁 บทสรุป (To be continued…)
ตอนนี้เราก็เห็นภาพรวมแล้วนะครับว่า โค้ด Structured Text ของเราอาศัยอยู่ในบ้านที่เรียกว่า POU และมีผู้จัดการคอยคุมคิวที่ชื่อว่า Task Configuration ท้ายที่สุดพวกมันทั้งหมดจะถูกส่งลงไปรันบนสมองกลผ่าน Device Tree
เมื่อคุณเข้าใจโครงสร้าง (Architecture) พื้นฐานเหล่านี้แล้ว การ Debug หรือการสเกลระบบโรงงานที่ซับซ้อนก็จะไม่ใช่เรื่องน่ากลัวอีกต่อไป! ในตอนถัดไป เราจะมาเจาะลึกเรื่องชนิดข้อมูล (Data Types) และการสร้างตัวแปรในภาษา ST กันครับ เตรียมตัวสนุกได้เลย!
ต้องการที่ปรึกษาด้านการเขียนโปรแกรม PLC (CODESYS) และพัฒนาระบบ Automation ให้กับโรงงานของคุณ? ทีมงาน WP Solution พร้อมให้บริการออกแบบและติดตั้งระบบแบบครบวงจร ดูรายละเอียดบริการของเราได้ที่: www.wpsolution2017.com หรือพูดคุยปรึกษาเบื้องต้นได้ที่ Line: wisit.p