State Machine Design Pattern

คู่มือเขียน PLC ด้วย Structured Text (ST) Ep.5: สถาปัตยกรรม State Machine (The Sequence Logic)

ในฐานะ CODESYS Solutions Architect ผมขอแนะนำว่าคุณมาถูกทางแล้วครับ การเปลี่ยนจาก Logic แบบ “If-This-Then-That” ที่พันกันยุ่งเหยิง (Spaghetti Code) มาเป็น State Machine Design Pattern คือก้าวสำคัญที่จะเปลี่ยนคุณจาก “คนเขียน PLC ทั่วไป” ให้เป็น “Automation Software Engineer” ครับ สำหรับ C# Developer แนวคิดนี้คือการนำ State Design Pattern มาใช้คู่กับโครงสร้าง switch...case เพื่อควบคุม Flow การทำงานของเครื่องจักรให้เป็นระเบียบและคาดเดาได้ครับ 1. Concept: State Variable & CASE Statement ใน C# คุณอาจคุ้นเคยกับ enum และ switch เพื่อจัดการ State ของ Application ใน CODESYS เราก็ทำแบบเดียวกันครับ: State Variable: คือตัวแปรที่ทำหน้าที่เป็น “Pointer” บอกว่าตอนนี้เครื่องจักรอยู่ที่ขั้นตอนไหน (Step ไหน) โดยเรามักจะใช้ INT (0, 10, 20…) หรือ ENUM (Idle, Run, Error) CASE Statement: คือคำสั่งที่ใช้แยกการทำงานของแต่ละ State ออกจากกันอย่างเด็ดขาด ในแต่ละรอบสแกน (PLC Cycle) จะมีเพียง 1 State เท่านั้น ที่ถูกประมวลผล กฎเหล็กของ State Machine: ...

1 กุมภาพันธ์ G 2026 · 3 นาที · Wisit P. (Senior Architect)
Function Blocks in ST

คู่มือเขียน PLC ด้วย Structured Text (ST) Ep.4: การเรียกใช้ Function Block มาตรฐาน (Timers & Triggers)

ในฐานะ CODESYS Solutions Architect ยินดีต้อนรับสู่โลกของ IEC 61131-3 ครับ สำหรับ C# Developer การทำความเข้าใจ Function Block (FB) นั้นง่ายมากครับ ให้มองว่า Function Block คือ “Class” ใน C# ครับ ก่อนใช้งาน ต้อง Instantiate (ประกาศตัวแปร) ก่อนเสมอ (เหมือน new Timer()) FB มี Memory/State (จำค่าเก่าได้ เช่น เวลาที่นับค้างไว้ หรือสถานะปุ่มรอบที่แล้ว) การเรียกใช้ (Call) คือการสั่งให้ Object นั้นทำงานในรอบสแกน (Cyclic Scan) นั้นๆ นี่คือ Best Practices ในการใช้งาน Standard Libraries (TON, R_TRIG) ในภาษา ST ครับ 1. วิธีการประกาศตัวแปร Instance (Declaration) ใน CODESYS เราไม่ใช้ keyword new ในการสร้าง Object แต่เราจะประกาศในส่วน VAR ครับ การประกาศนี้ระบบจะจอง Memory ให้โดยอัตโนมัติ ...

31 มกราคม G 2026 · 3 นาที · Wisit P. (Senior Architect)
Control Flow Logic in ST

คู่มือเขียน PLC ด้วย Structured Text (ST) Ep.2: การตัดสินใจของโปรแกรม (Control Flow: IF & CASE)

ในฐานะ CODESYS Solutions Architect ผมขอสรุปการเขียน Control Flow Statements ในภาษา ST ให้คุณเข้าใจง่ายๆ โดยเปรียบเทียบกับ C# ครับ หัวใจสำคัญของการเขียน Logic ใน PLC คือ “ความชัดเจน” (Readability) และ “ความปลอดภัย” (Safety) ครับ เพราะ Code ของเราควบคุมเครื่องจักรที่มีอันตราย ไม่ใช่แค่จัดการ Data เหมือนฝั่ง IT เรามาดูรายละเอียดกันครับ 1. IF…THEN…ELSIF…ELSE (The Decision Maker) ใน C# คุณใช้ if (condition) { } แต่ใน ST เราไม่มีปีกกา เราใช้ THEN และปิดท้ายด้วย END_IF; เสมอ Scenario: ระบบเติมน้ำเข้าถัง (Hysteresis Control) โจทย์คือควบคุมปั๊มน้ำ (Fill Pump) โดยใช้ Hysteresis Logic (น้ำต่ำเริ่มเติม, น้ำเต็มหยุดเติม) เพื่อป้องกันปั๊มทำงานกระชาก (Chattering) PROGRAM PLC_PRG VAR rLevel : REAL; // ระดับน้ำปัจจุบัน (0-100%) xPumpStart : BOOL; // สั่งปั๊มทำงาน // Config Parameters (ควรประกาศเป็น Constant หรือ Retain Variable) c_rLowLevel : REAL := 10.0; // จุดเริ่มทำงาน c_rHighLevel: REAL := 90.0; // จุดหยุดทำงาน END_VAR // --------------------------------------------------------- // Logic: Hysteresis Control // --------------------------------------------------------- IF rLevel < c_rLowLevel THEN // ถ้าน้ำต่ำกว่า 10% ให้เริ่มเดินปั๊ม (Set Active) xPumpStart := TRUE; ELSIF rLevel > c_rHighLevel THEN // ถ้าน้ำสูงเกิน 90% ให้หยุดปั๊ม (Reset) xPumpStart := FALSE; ELSE // ช่วงกลาง (10-90): ให้คงสถานะเดิมไว้ (Memory/Latch) // ไม่ต้องเขียน Code อะไร หรือเขียนย้ำว่า xPumpStart := xPumpStart; ; END_IF; 💡 Architect Insight: สังเกตว่าผมไม่ได้เขียน ELSE เพื่อสั่ง FALSE ทันทีที่ระดับเกิน 10% แต่ปล่อยให้มันทำงานจนถึง 90% นี่คือเทคนิค Hysteresis ที่ C# Developer ต้องปรับจูน Logic ให้เข้ากับ Physics ของโลกจริงครับ ...

29 มกราคม G 2026 · 3 นาที · Wisit P. (Senior Architect)