หน้าแรกคู่มือPLCเทคนิคขั้นสูงสอนการเขียน PID Control ใน PLC พร้อมตัวอย่าง PWM และทฤษฎี
PLC
เริ่มต้น
45 นาที

สอนการเขียน PID Control ใน PLC พร้อมตัวอย่าง PWM และทฤษฎี

เรียนรู้การเขียน PID Control ใน PLC แบบง่ายๆ ครบถ้วน ตั้งแต่ทฤษฎี PWM การควบคุม On-Off จนถึงการปรับ PID Parameter พร้อมตัวอย่างการควบคุมอุณหภูมิ

อัพเดทล่าสุด: 8/3/2569

ราคาชุดอุปกรณ์

฿18,220

การเขียน PID Control ใน PLC

การควบคุม PID (Proportional-Integral-Derivative) เป็นเทคนิคสำคัญในระบบอัตโนมัติ ในบทความนี้จะสาธิตการเขียน PID Control ทั้งทฤษฎีและปฏิบัติด้วยตัวอย่างการต้มน้ำร้อนให้ได้อุณหภูมิ 50 องศาเซลเซียส

ระบบควบคุมพื้นฐาน

องค์ประกอบของระบบ

ระบบการต้มน้ำประกอบด้วย 3 ส่วนหลัก:

  1. Controller (PLC): รับค่า Set Value (SV) และออก Output ไปควบคุม Process
  2. Process (Heater): ตัวต้มน้ำที่ถูกควบคุม
  3. Sensor: อ่านค่า Process Variable (PV) ส่งกลับไปยัง Controller

การเชื่อมต่อวงจร:

  • ใช้ PT-100 Sensor แบบ 3-wire เชื่อมต่อกับ PLC
  • Output ใช้ Transistor ขับ SSR (Solid State Relay) ควบคุม Heater
  • สำหรับ HMI ใช้ 2-in-1 รุ่น 4.3" หรือ 7" กับ Module F-4PT

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

PWM — Period 2000 ms, Y0 = Duty Cycle
D14 กำหนด Duty (0-2000). เมื่อ TV200 < D14 → Y0 ติด
N0
Period Timer: T200-T249 = 10ms resolution, K200 = 2000ms
M8000TONTV200, K200
Output ตาม Duty Cycle: Y0 ติดเมื่อ TV200 < D14
TV200 < D14Y0
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

ตัวอย่างการใช้งาน:

  • D14 = 0: Output ปิดตลอด (0%)
  • D14 = 1000: Output ติด 1 วิ ปิด 1 วิ (50%)
  • D14 = 2000: Output ติดตลอด (100%)

การควบคุมแบบ On-Off

ปัญหาของ On-Off Control

On-Off Control พื้นฐาน
เปิด Heater เต็ม 100% เมื่อ PV < SV, ปิดเมื่อ PV > SV. ทำให้เกิด Overshoot
N0
PV < SV → Output 100%
D12 < D10MOVDK2000, D14
PV > SV → Output 0%
D12 > D10MOVDK0, D14
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

ปัญหาที่เกิด:

  • เกิด 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

SUBD D10 D12 D20    // Error = SV - PV (32-bit subtract)
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

// คำนวณ 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))

// คำนวณ 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

Main — Trigger PID Subroutine
M2 เริ่ม → PLS สร้าง one-shot M5 → CALL subroutine
N0
M2 กด → สร้าง pulse M5 (one-shot)
M2PLSM5
M2 ON → เรียก Subroutine P_SELF_PID
M2CALLP_SELF_PID
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

Subroutine Self PID: Initialization

Init — Reset State ตอนเริ่ม PID
ทำงานครั้งเดียวเมื่อ M5 pulse (ตอน M2 เริ่มกด)
N0
Reset Timer T10
M5RSTT10, K1
Clear Integral term (D28)
M5MOVFK0.0, D28
Clear Previous Error (D32)
M5MOVFK0.0, D32
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

Subroutine Self PID: Cycle Timing

Cycle — Sampling Timer + Cycle Flag
TON นับตาม D6000 (Sampling Time). เมื่อครบ → M6 ติด 1 cycle
N0
TON นับตาม Sampling Time ใน D6000
M8000TONTV10, D6000
Timer ครบ → SET M6 (cycle flag)
T10SETM6
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

Subroutine Self PID: Error + P Term

Error Calculation + P Term
ทุก Cycle (M6 ON): คำนวณ Error แล้วคูณ KP ได้ P term
N0
Error = SV - PV (32-bit subtract)
M6SUBDD10, D12, D20
แปลง Error เป็น Float
M6DTOFD20, D22
P Term: D24 = Error × KP
M6MULFD22, D6200, D24
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

Subroutine Self PID: I Term (gated by M7501)

I Term — Integral
คำนวณเมื่อ M6 ON และ M7501 OFF (เปิดใช้ I-Control)
N0
Error × KP
M6M7501MULFD22, D6200, D26
หารด้วย TI
M6M7501DIVFD26, D6400, D26
บวกกับ I ตอนก่อน
M6M7501ADDFD26, D28, D26
เก็บค่าสำหรับรอบต่อไป
M6M7501MOVFD26, D28
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

Subroutine Self PID: D Term (gated by M7502)

D Term — Derivative
คำนวณเมื่อ M6 ON และ M7502 OFF (เปิดใช้ D-Control)
N0
Error ปัจจุบัน - Error ก่อน
M6M7502SUBFD22, D32, D34
คูณ KP
M6M7502MULFD34, D6200, D34
คูณ TD
M6M7502MULFD34, D6600, D34
เก็บ Error ปัจจุบันไว้ใช้รอบต่อไป
M6M7502MOVFD22, D32
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

Subroutine Self PID: Sum + Clamp + Output

Sum P+I+D + Clamp + PWM Output
N0
D30 = P + I
M6ADDFD24, D26, D30
D30 = (P+I) + D
M6ADDFD30, D34, D30
Clamp high: ถ้า D30 > 2000 → 2000
D30 > K2000.0MOVFK2000.0, D30
Clamp low: ถ้า D30 < 0 → 0
D30 < K0.0MOVFK0.0, D30
แปลง Float → 32-bit integer สำหรับ PWM
M6FTODD30, D14
Network count: 1, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

การตั้งค่าพารามิเตอร์

ค่าพารามิเตอร์สำคัญ

  • D6000: Sampling Time (ms) - แนะนำ 1000 (1 วินาที)
  • D6200: KP - ค่าความแรงของ Proportional
  • D6400: TI - Integral Time (วินาที)
  • D6600: TD - Derivative Time (วินาที)

เทคนิค Auto-Tuning

ใช้วิธี Ziegler-Nichols หรือ Auto-Tuning:

  1. เซ็ต I และ D เป็น 0
  2. เพิ่ม KP จนระบบเริ่มแกว่ง
  3. บันทึกค่า KP critical และ Period การแกว่ง
  4. คำนวณพารามิเตอร์ตามสูตร Ziegler-Nichols

การแก้ปัญหาที่พบบ่อย

ระบบไม่เสถียร (Oscillation)

สาเหตุ:

  • KP สูงเกินไป
  • TI น้อยเกินไป (KI สูงเกินไป)

วิธีแก้:

  1. ลด KP ลง 20-30%
  2. เพิ่ม TI (ลด KI)
  3. เพิ่ม TD เล็กน้อย

มี Steady State Error

สาเหตุ:

  • ไม่ได้ใช้ I-Control
  • TI สูงเกินไป (KI ต่ำเกินไป)

วิธีแก้:

  1. เปิดใช้ I-Control (ปิด M7501)
  2. ลดค่า TI

เกิด Overshoot มาก

สาเหตุ:

  • KP หรือ KI สูงเกินไป
  • ไม่ได้ใช้ D-Control

วิธีแก้:

  1. เปิดใช้ D-Control (ปิด M7502)
  2. เพิ่มค่า TD
  3. ลด KP หรือเพิ่ม TI

ระบบตอบสนองช้า

สาเหตุ:

  • KP ต่ำเกินไป
  • TI สูงเกินไป

วิธีแก้:

  1. เพิ่ม KP
  2. ลด TI (เพิ่ม KI)

เคล็ดลับการปรับแต่ง

  1. เริ่มต้นด้วย P-Control: ตั้ง I และ D เป็น 0 ก่อน
  2. ปรับทีละตัว: อย่าปรับหลายพารามิเตอร์พร้อมกัน
  3. บันทึกค่า: เก็บค่าที่ได้ผลดีไว้เป็นอ้างอิง
  4. ทดสอบ Disturbance: ลองเปลี่ยนภาระหรือสภาวะแวดล้อม
  5. ใช้ Data Logging: เก็บข้อมูลเพื่อวิเคราะห์ผลการควบคุม

สรุป

การเขียน PID Control เองใน PLC ช่วยให้เข้าใจหลักการทำงานของระบบควบคุมอย่างลึกซึ้ง แม้จะซับซ้อนกว่าการใช้ Function Block สำเร็จรูป แต่ให้ความยืดหยุ่นในการปรับแต่งและแก้ไขปัญหา

ข้อดีของการเขียนเอง:

  • เข้าใจหลักการทำงานอย่างถ้วนถี่
  • สามารถปรับแต่งได้ตามความต้องการ
  • แก้ปัญหาได้อย่างตรงจุด
  • ไม่ต้องพึ่งพา Function Block ของผู้ผลิต

ข้อควรระวัง:

  • ต้องทำความเข้าใจทฤษฎีก่อน
  • การ Debug ใช้เวลามากกว่า
  • ต้องระวังการ Overflow ของตัวแปร
  • จำเป็นต้องมีการป้องกันค่าผิดปกติ

การฝึกฝนด้วยตัวอย่างการต้มน้ำเป็นจุดเริ่มต้นที่ดี เพราะสามารถทำได้ง่ายและเข้าใจผลการทำงานได้ชัดเจน