สอนการเขียน PID Control ใน PLC พร้อมตัวอย่าง PWM และทฤษฎี
เรียนรู้การเขียน PID Control ใน PLC แบบง่ายๆ ครบถ้วน ตั้งแต่ทฤษฎี PWM การควบคุม On-Off จนถึงการปรับ PID Parameter พร้อมตัวอย่างการควบคุมอุณหภูมิ
อัพเดทล่าสุด: 8/3/2569
ราคาชุดอุปกรณ์
การเขียน PID Control ใน PLC
การควบคุม PID (Proportional-Integral-Derivative) เป็นเทคนิคสำคัญในระบบอัตโนมัติ ในบทความนี้จะสาธิตการเขียน PID Control ทั้งทฤษฎีและปฏิบัติด้วยตัวอย่างการต้มน้ำร้อนให้ได้อุณหภูมิ 50 องศาเซลเซียส
ระบบควบคุมพื้นฐาน
องค์ประกอบของระบบ
ระบบการต้มน้ำประกอบด้วย 3 ส่วนหลัก:
- Controller (PLC): รับค่า Set Value (SV) และออก Output ไปควบคุม Process
- Process (Heater): ตัวต้มน้ำที่ถูกควบคุม
- Sensor: อ่านค่า Process Variable (PV) ส่งกลับไปยัง Controller
การเชื่อมต่อวงจร:
- ใช้ PT-100 Sensor แบบ 3-wire เชื่อมต่อกับ PLC
- Output ใช้ Transistor ขับ SSR (Solid State Relay) ควบคุม Heater
- สำหรับ HMI ใช้ Twin1 รุ่น 4.3" หรือ 7" กับ Module FX4BT
PWM (Pulse Width Modulation)
หลักการทำงาน
PWM เป็นเทคนิคการออก Output ที่มีค่าอยู่ระหว่าง 0-100% โดยการปรับ Duty Cycle:
- Duty Cycle 25%: Output ติด 25% ของเวลา
- Duty Cycle 75%: Output ติด 75% ของเวลา
- Duty Cycle 100%: Output ติดตลอด
การเขียน PWM Code
ladder
// กำหนด Period = 2000 ms (2 วินาที)
TON T0, K20 // 20 x 100ms = 2000ms
// ควบคุม Duty Cycle
CMP D14, T0 // เปรียบเทียบค่า D14 กับเวลาปัจจุบัน
OUT Y0 // Output ตาม Duty Cycle
ตัวอย่างการใช้งาน:
- D14 = 0: Output ปิดตลอด (0%)
- D14 = 1000: Output ติด 1 วิ ปิด 1 วิ (50%)
- D14 = 2000: Output ติดตลอด (100%)
การควบคุมแบบ On-Off
ปัญหาของ On-Off Control
การใช้วิธี On-Off Control พื้นฐาน:
ladder
// ถ้าอุณหภูมิต่ำกว่า Setpoint -> เปิด Heater เต็ม
CMP< D12, D10 // PV < SV
MOVD K2000, D14 // Output 100%
// ถ้าอุณหภูมิสูงกว่า Setpoint -> ปิด Heater
CMP> D12, D10 // PV > SV
MOVD K0, D14 // Output 0%
ปัญหาที่เกิด:
- เกิด Overshoot (อุณหภูมิสูงเกิน Setpoint)
- ระบบไม่เสถียร เกิดการแกว่งขึ้นลง
- ไม่เหมาะกับระบบที่มี Thermal Mass สูง
ทฤษฎี PID Control
การคำนวณ Error
สิ่งแรกที่ต้องคำนวณคือค่า Error:
Error = SV - PV
เช่น: SV = 50°C, PV = 45°C → Error = 5°C
P-Control (Proportional)
สูตร: P = KP × Error
ladder
SUBD D10, D12, D20 // Error = SV - PV
DTOF D20, D22 // แปลง Error เป็น Float
MULF D22, D6200, D24 // P = Error × KP
คุณสมบัติ:
- ง่ายต่อการเข้าใจ
- มี Steady State Error (ไม่สามารถลู่เข้าสู่ Setpoint ได้)
- KP สูงเกินไป จะทำให้ระบบไม่เสถียร
I-Control (Integral)
สูตร Continuous: I = KI × ∫Error dt
สูตร Discrete: I(k) = I(k-1) + (KP/TI) × Error
ladder
// คำนวณ Integral Term
MULF D22, D6200, D26 // Error × KP
DIVF D26, D6400, D26 // หารด้วย TI
ADDF D26, D28, D26 // บวกกับ I ตอนก่อน
MOVF D26, D28 // เก็บค่าสำหรับรอบต่อไป
คุณสมบัติ:
- แก้ปัญหา Steady State Error
- ทำให้ระบบลู่เข้าสู่ Setpoint ได้
- อาจทำให้เกิด Overshoot
D-Control (Derivative)
สูตร Continuous: D = KD × dError/dt
สูตร Discrete: D = KP × TD × (Error(k) - Error(k-1))
ladder
// คำนวณ Derivative Term
SUBF D22, D32, D34 // Error ปัจจุบัน - Error ก่อน
MULF D34, D6200, D34 // คูณ KP
MULF D34, D6600, D34 // คูณ TD
MOVF D22, D32 // เก็บ Error ปัจจุบันไว้ใช้รอบต่อไป
คุณสมบัติ:
- ลดการ Overshoot
- ปรับปรุงการตอบสนองของระบบ
- ทำให้ระบบเสถียรขึ้น
การเขียน PID แบบครบถ้วน
โครงสร้าง Main Program
ladder
// เริ่ม PID Control
LD M2 // สวิตช์เริ่ม PID
PULSE M5 // สร้าง Pulse เริ่มต้น
CALL P_SELF_PID // เรียกใช้ Subroutine
Subroutine Self PID
ladder
// การกำหนดค่าเริ่มต้น
LD M5
RST T10 // Reset Timer
MOVF K0, D28 // Clear Integral term
MOVF K0, D32 // Clear Previous Error
// Cycle Timing (ทุก 1 วินาที)
TON T10, D6000
LD T10
SET M6
// การคำนวณ PID
LD M6
// คำนวณ Error
SUBD D10, D12, D20 // SV - PV
DTOF D20, D22 // แปลงเป็น Float
// P Term
MULF D22, D6200, D24 // Error × KP
// I Term (ถ้า M7501 ปิด)
LDN M7501
MULF D22, D6200, D26
DIVF D26, D6400, D26
ADDF D26, D28, D26
MOVF D26, D28
// D Term (ถ้า M7502 ปิด)
LDN M7502
SUBF D22, D32, D34
MULF D34, D6200, D34
MULF D34, D6600, D34
MOVF D22, D32
// รวม P+I+D
ADDF D24, D26, D30
ADDF D30, D34, D30
// จำกัดค่า Output (0-2000)
CMPF> D30, K2000
MOVF K2000, D30
CMPF< D30, K0
MOVF K0, D30
// Output สุดท้าย
FTOD D30, D14 // แปลงเป็น Integer สำหรับ PWM
การตั้งค่าพารามิเตอร์
ค่าพารามิเตอร์สำคัญ
- D6000: Sampling Time (ms) - แนะนำ 1000 (1 วินาที)
- D6200: KP - ค่าความแรงของ Proportional
- D6400: TI - Integral Time (วินาที)
- D6600: TD - Derivative Time (วินาที)
เทคนิค Auto-Tuning
ใช้วิธี Ziegler-Nichols หรือ Auto-Tuning:
- เซ็ต I และ D เป็น 0
- เพิ่ม KP จนระบบเริ่มแกว่ง
- บันทึกค่า KP critical และ Period การแกว่ง
- คำนวณพารามิเตอร์ตามสูตร Ziegler-Nichols
การแก้ปัญหาที่พบบ่อย
ระบบไม่เสถียร (Oscillation)
สาเหตุ:
- KP สูงเกินไป
- TI น้อยเกินไป (KI สูงเกินไป)
วิธีแก้:
- ลด KP ลง 20-30%
- เพิ่ม TI (ลด KI)
- เพิ่ม TD เล็กน้อย
มี Steady State Error
สาเหตุ:
- ไม่ได้ใช้ I-Control
- TI สูงเกินไป (KI ต่ำเกินไป)
วิธีแก้:
- เปิดใช้ I-Control (ปิด M7501)
- ลดค่า TI
เกิด Overshoot มาก
สาเหตุ:
- KP หรือ KI สูงเกินไป
- ไม่ได้ใช้ D-Control
วิธีแก้:
- เปิดใช้ D-Control (ปิด M7502)
- เพิ่มค่า TD
- ลด KP หรือเพิ่ม TI
ระบบตอบสนองช้า
สาเหตุ:
- KP ต่ำเกินไป
- TI สูงเกินไป
วิธีแก้:
- เพิ่ม KP
- ลด TI (เพิ่ม KI)
เคล็ดลับการปรับแต่ง
- เริ่มต้นด้วย P-Control: ตั้ง I และ D เป็น 0 ก่อน
- ปรับทีละตัว: อย่าปรับหลายพารามิเตอร์พร้อมกัน
- บันทึกค่า: เก็บค่าที่ได้ผลดีไว้เป็นอ้างอิง
- ทดสอบ Disturbance: ลองเปลี่ยนภาระหรือสภาวะแวดล้อม
- ใช้ Data Logging: เก็บข้อมูลเพื่อวิเคราะห์ผลการควบคุม
สรุป
การเขียน PID Control เองใน PLC ช่วยให้เข้าใจหลักการทำงานของระบบควบคุมอย่างลึกซึ้ง แม้จะซับซ้อนกว่าการใช้ Function Block สำเร็จรูป แต่ให้ความยืดหยุ่นในการปรับแต่งและแก้ไขปัญหา
ข้อดีของการเขียนเอง:
- เข้าใจหลักการทำงานอย่างถ้วนถี่
- สามารถปรับแต่งได้ตามความต้องการ
- แก้ปัญหาได้อย่างตรงจุด
- ไม่ต้องพึ่งพา Function Block ของผู้ผลิต
ข้อควรระวัง:
- ต้องทำความเข้าใจทฤษฎีก่อน
- การ Debug ใช้เวลามากกว่า
- ต้องระวังการ Overflow ของตัวแปร
- จำเป็นต้องมีการป้องกันค่าผิดปกติ
การฝึกฝนด้วยตัวอย่างการต้มน้ำเป็นจุดเริ่มต้นที่ดี เพราะสามารถทำได้ง่ายและเข้าใจผลการทำงานได้ชัดเจน
มีคำถาม? ติดต่อทีมงาน




