รูปปกบทความ

1. 🎯 ตอนที่ 2: ทำไมต้อง CODESYS? เจาะลึกซอฟต์แวร์มาตรฐานสากล

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

สวัสดีครับน้องๆ ว่าที่ Automation Software Engineer ทุกคน จิบกาแฟแล้วมาลุยกันต่อครับ! น้องๆ เคยเจอปัญหาชวนปวดหัวแบบนี้ไหมครับ? ในโรงงานหนึ่งมีเครื่องจักร 10 เครื่อง ใช้ PLC ต่างกัน 5 ยี่ห้อ คอมพิวเตอร์ของโปรแกรมเมอร์ต้องลงซอฟต์แวร์ 5 ตัว ซื้อสายลิงก์ 5 แบบ และที่แย่ที่สุดคือ ต้องมานั่งจำคำสั่งและวิธีการเขียนโค้ดที่แตกต่างกันไปในแต่ละยี่ห้อ เวลาจะสเกลระบบหรือเอาโค้ดเก่ามาใช้ใหม่ (Reuse) ก็ทำไม่ได้เพราะมันล็อกติดกับฮาร์ดแวร์ (Proprietary System) โค้ด Ladder ที่เขียนไว้ก็ยาวเป็นสปาเกตตีจนคนที่มารับช่วงต่อแทบจะร้องไห้

ปัญหานี้จะหมดไปเลยครับ เมื่อเรารู้จักกับ CODESYS (Controller Development System) ซอฟต์แวร์ที่เปรียบเสมือน “ระบบปฏิบัติการ Android แห่งวงการ PLC” ที่เปลี่ยนแนวคิดการเขียนโปรแกรมเครื่องจักรให้กลายเป็นงาน Software Engineering อย่างแท้จริง วันนี้พี่จะพาไปเจาะลึกกันว่า ทำไมอุตสาหกรรมยุคใหม่ถึงหันมาใช้ CODESYS กันทั่วโลก!

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

CODESYS ถูกพัฒนาโดยบริษัท 3S-Smart Software Solutions GmbH จากประเทศเยอรมนี ตั้งแต่ปี 1994 โดยมีจุดเด่นที่ฉีกกฎเกณฑ์เดิมๆ ของ PLC ดังนี้ครับ:

  • อิสระจากฮาร์ดแวร์ (Hardware Independence): นี่คือไม้ตายของ CODESYS ครับ! ผู้ผลิตฮาร์ดแวร์มากกว่า 500 แบรนด์ทั่วโลก (อุปกรณ์กว่า 1,000 ชนิด) เลือกใช้ CODESYS เป็นตัวขับเคลื่อน (Runtime) ยกตัวอย่างแบรนด์ดังๆ เช่น ABB, WAGO, Festo, Bosch Rexroth หรือแม้แต่ WECON รวมไปถึงค่ายยักษ์ใหญ่ที่นำ CODESYS ไปเปลี่ยนชื่อ (Customize) เป็นของตัวเอง เช่น TwinCAT ของ Beckhoff หรือ SoMachine ของ Schneider Electric นั่นแปลว่า ถ้าน้องเขียน CODESYS เป็น น้องก็คุมฮาร์ดแวร์ได้ค่อนโลกแล้วครับ!
  • รองรับภาษามาตรฐาน IEC 61131-3 ครบถ้วน: CODESYS ให้คุณเลือกเขียนโปรแกรมได้ถึง 5 ภาษา ทั้งแบบกราฟิกอย่าง Ladder Diagram (LD), Function Block Diagram (FBD), Sequential Function Chart (SFC) และแบบข้อความอย่าง Instruction List (IL) และ Structured Text (ST) ซึ่งเป็นพระเอกของเรา นอกจากนี้ยังมี Continuous Function Chart (CFC) ให้ใช้อีกด้วย
  • All-in-One IDE: ไม่ต้องซื้อโปรแกรมแยกอีกต่อไป เพราะ CODESYS รวมทุกอย่างไว้ในที่เดียว ทั้งการทำหน้าจอ HMI (Visualization), การสื่อสาร Fieldbus (เช่น EtherCAT, Modbus, PROFINET), และระบบ SoftMotion / CNC / Robotics สำหรับคุมเซอร์โวมอเตอร์
  • รองรับ OOP (Object-Oriented Programming): นี่คือจุดที่ทำให้โปรแกรมเมอร์สาย IT หลงรัก เพราะเราสามารถใช้แนวคิด Class, Method, และ Inheritance มาช่วยออกแบบ Function Block ให้กลายเป็น “แม่พิมพ์” (OOP Concepts) สร้าง Instance ไปใช้กับอุปกรณ์กี่ร้อยตัวก็ได้ โค้ดสะอาดและดูแลรักษาง่ายขึ้นมหาศาล
  • ฟรีสำหรับนักพัฒนา พร้อม Simulator ในตัว: น้องๆ สามารถดาวน์โหลดมาใช้งานและจำลองการทำงาน (Soft PLC Simulator) ได้ฟรีๆ โดยไม่ต้องเสียเงินซื้อ PLC จริงมาลอง
รูปประกอบ

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

เพื่อให้น้องๆ เห็นภาพว่าการใช้ Structured Text (ST) และ Function Block (FB) ใน CODESYS มันดีกว่า Ladder แบบเก่ายังไง สมมติว่าเราต้องคุมมอเตอร์ 100 ตัว ถ้าเป็น Ladder ต้องวาดวงจร 100 รอบ แต่ใน CODESYS เราแค่สร้างแม่พิมพ์ (POU แบบ Function Block) แล้วสร้างตัวแปรมาเก็บสถานะ (Instance) ครับ

// =================================================================
// 1. สร้างแม่พิมพ์ Function Block สำหรับคุมมอเตอร์ (เขียนครั้งเดียวใช้ได้ตลอด)
// ชื่อ POU: fbMotorControl
// =================================================================
FUNCTION_BLOCK fbMotorControl
VAR_INPUT
    xStartCmd : BOOL;   // คำสั่งเริ่ม
    xStopCmd  : BOOL;   // คำสั่งหยุด
END_VAR
VAR_OUTPUT
    xMotorRun : BOOL;   // สั่งจ่ายไฟมอเตอร์
END_VAR

// -----------------------------------------------------------------
// Logic ด้วยภาษา ST: ควบคุมแบบง่ายๆ
// -----------------------------------------------------------------
IF xStartCmd AND NOT xStopCmd THEN
    xMotorRun := TRUE;
ELSIF xStopCmd THEN
    xMotorRun := FALSE;
END_IF;

// =================================================================
// 2. การเรียกใช้งานในโปรแกรมหลัก (Main Program)
// =================================================================
PROGRAM PLC_PRG
VAR
    // ประกาศ Array เพื่อสร้างมอเตอร์ 10 ตัว (Instantiate) ง่ายกว่านี้มีอีกไหม!
    aMotors : ARRAY [1..10] OF fbMotorControl; 
    
    // โครงสร้างข้อมูล User-Defined Type (DUT) เก็บคำสั่งจาก HMI
    xBtnStartMotor1 : BOOL;
    xBtnStopMotor1  : BOOL;
END_VAR

// -----------------------------------------------------------------
// การร่ายมนต์เรียกใช้ (Call)
// -----------------------------------------------------------------
// เรียกใช้มอเตอร์ตัวที่ 1 โดยป้อน Input และดึง Output ไปทำ I/O Mapping
aMotors(xStartCmd := xBtnStartMotor1, xStopCmd := xBtnStopMotor1);

// ผลลัพธ์: เอา aMotors.xMotorRun ไปผูกกับขา Digital Output ของ PLC ต่อได้เลย

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

ในฐานะรุ่นพี่ ขอเตือนไว้ก่อนว่าแม้ CODESYS จะเคลมเรื่องความยืดหยุ่นและการพอร์ตโค้ด (Portability) แต่มีจุดตายที่น้องๆ ต้องระวังเวลาทำงานจริงครับ:

  • Hardware Independence มีขีดจำกัดที่ I/O Mapping: ถึงแม้น้องจะย้ายโค้ด (POU, Function Block, User-Defined Type) จาก PLC ของ WAGO ไปใส่ PLC ของ WECON ได้ 100% แต่สิ่งที่น้อง “ต้องทำใหม่เสมอ” คือการจับคู่ตัวแปรกับขาฮาร์ดแวร์ หรือ I/O Mapping ครับ เพราะ Controller แต่ละยี่ห้อมี Address ของขั้วต่อ (Terminal) ไม่เหมือนกัน
  • ระวัง Target Device Mismatch: ก่อนดาวน์โหลดโปรแกรมลง PLC จริง ต้องตั้งค่า “Device” ในโปรเจกต์ให้ตรงกับ Firmware และรุ่นของฮาร์ดแวร์เป๊ะๆ ไม่อย่างนั้นระบบจะปฏิเสธการเชื่อมต่อ (Gateway Error) หรืออาจทำให้ PLC เข้าสู่โหมด Exception ได้
  • ใช้ Array คู่กับ FOR Loop: ถ้าน้องมีมอเตอร์ 100 ตัว การเรียก Instance ทีละบรรทัดก็ยังเหนื่อยอยู่ดี พี่แนะนำให้ใช้การจัดกลุ่มตัวแปร (Arrays) และวนลูป FOR ตามมาตรฐาน ST ซึ่งเป็นท่าไม้ตายที่โปรแกรมเมอร์คลาสสิกทำไม่ได้ครับ!

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

เห็นไหมครับว่า CODESYS เกิดมาเพื่อยกระดับการทำงานของเราจริงๆ จากโปรแกรมเมอร์ที่ต้องนั่งต่อสายไฟและวาด Ladder ซ้ำๆ ซากๆ มาเป็น Software Engineer ที่เน้นการออกแบบ Logic ให้ชาญฉลาดและนำกลับมาใช้ใหม่ได้ โหลดซอฟต์แวร์มาลองเล่นกับ Simulator กันดูนะครับ แล้วในตอนหน้า เราจะมาเจาะลึกเทคนิคการเขียน Structured Text (ST) แบบมืออาชีพกันต่อ!


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