Advanced
10 rungs
5 I/O

ควบคุมอุณหภูมิแบบ PID + PWM

PID Temperature Control with PWM

ควบคุมอุณหภูมิแบบ P (สัดส่วน) — อ่านค่าจากเซนเซอร์อนาล็อก, สั่ง heater ผ่าน PWM ด้วย duty ที่คำนวณจาก (SV − PV) × Kp. ปรับ setpoint และ gain ได้จาก HMI

หลักการ

โปรแกรมควบคุมอุณหภูมิแบบ P-only + PWM ที่เขียน handmade (ไม่ใช้ EPID wizard) เหมาะสำหรับ:

  • เครื่องอุ่นของเหลว
  • เตาอบขนาดเล็ก
  • ระบบอบแห้งที่ไม่ต้องการความแม่นยำระดับ ±0.1°C

สูตร PID / Control Law

Error(t) = SV − PV(t)
Output(t) = Kp × Error(t)                    (P-only, simplest form)
Duty(t) = clamp(Output(t), 0, Period)        (จำกัด 0–100%)
Y0 = (PWM_counter < Duty) ? ON : OFF         (PWM output)

โดย:

  • PV (Process Value) อ่านจาก analog input (PT-100 / TC / 4–20 mA)
  • SV (Setpoint) ตั้งจาก HMI
  • Kp (Proportional gain) ยิ่งสูง → ตอบสนองเร็วแต่อาจแกว่ง
  • Period = 2.0 s (ช่วงเวลาของ PWM, ตั้งที่ TV200 K200)

Register Map

Registerค่าหมายเหตุ
D10PV (เช่น 250 = 25.0°C)อ่านจาก F-4PT / F-4TC / F-4AI
D12SV (เช่น 500 = 50.0°C)ตั้งจาก HMI, default 500
D14Kp (เช่น 20 = 2.0)scaled ×10 เพื่อเก็บ 1 decimal
D20Error = SV − PVคำนวณทุก scan
D22Duty cycle (0–2000)clamped
Y0Heater (ผ่าน SSR)PWM output

เหตุผลที่ไม่ใช้ EPID

EPID ของ SamSoar2022 ต้องกำหนดค่า Kp, Ti, Td, sampling time ผ่าน EPID Wizard ใน IDE ก่อน compile ไม่สามารถกำหนดทั้งหมดใน ladder โปรแกรมที่ import ผ่าน CSV ได้

โปรแกรมนี้จึงเขียน PID แบบ manual ที่ import แล้วใช้ได้ทันที (สามารถขยายเป็น PI หรือ PID เต็มด้วยการเพิ่ม integral/derivative terms ได้)

ขยายเป็น PID เต็ม

เพิ่ม D22 (Integral accumulator) และ D24 (Previous error) แล้วใช้สูตร:

P = Error × Kp
I(t) = I(t−1) + Error × Ki × Δt
D(t) = (Error(t) − Error(t−1)) × Kd / Δt
Output = P + I + D    (แล้ว clamp)

ดู คำแนะนำ PID Control สำหรับ derivation และ tuning

โปรแกรม PLC

ควบคุมอุณหภูมิแบบ PID + PWM — PID Temperature Control with PWM
ควบคุมอุณหภูมิแบบ P (สัดส่วน) — อ่านค่าจากเซนเซอร์อนาล็อก, สั่ง heater ผ่าน PWM ด้วย duty ที่คำนวณจาก (SV − PV) × Kp. ปรับ setpoint และ gain ได้จาก HMI
N0Start/Stop + ค่าเริ่มต้น
Latch Start/Stop — เปิด PID loop ผ่าน X0 (Start) / X1 (Stop NC)
X0M0X1M0
ตั้งค่าเริ่มต้น: SV = 50.0°C (D12=500)
M8150MOVK500, D12
ตั้งค่าเริ่มต้น: Kp gain (D14=20 = 2.0)
M8150MOVK20, D14
N1คำนวณ PID (P-only)
Error = SV − PV (D20 = D12 − D10) — ค่าบวกหมายถึงต้องให้ความร้อน
M0SUBD12, D10, D20
Duty = Error × Kp (D22 = D20 × D14 / 10 ปรับ scale)
M0MULD20, D14, D22
Clamp ขีดล่าง: ถ้า D22 < 0 ตั้งเป็น 0 (ไม่ให้ heater ติดลบ)
D22 < K0MOVK0, D22
Clamp ขีดบน: ถ้า D22 > 2000 ตั้งเป็น 2000 (สูงสุด 100%)
D22 > K2000MOVK2000, D22
N2Output PWM (Time-Proportional)
Timer คาบ PWM — 2.0 s (K200 × 10ms = 2000ms) ใช้ T200-series
M0TONTV200, K200
รีเซ็ต Timer PWM เมื่อครบรอบ (เพื่อให้ PWM วิ่งต่อเนื่อง)
T200RSTTV200
Output ไปฮีตเตอร์ (Y0) — ติดเมื่อตำแหน่ง PWM ปัจจุบัน < duty cycle
M0TV200 < D22Y0
Network count: 3, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

I/O Assignment

AddressRoleNote
X0ปุ่ม Enable (NO)ปุ่มสตาร์ท PID loop
X1ปุ่ม Stop (NC)
D10PV (ค่าจริง จาก analog input)ต่อกับ PT-100 / TC / 4-20mA sensor ผ่าน analog extension (F-4PT, F-4TC, F-4AI). Scale: 1 ตำแหน่งทศนิยม (250 = 25.0°C)
D12SV (Setpoint ปรับจาก HMI ได้)Default 500 (50.0°C) — เขียนค่าใหม่จาก HMI เพื่อเปลี่ยน setpoint
Y0Output ฮีตเตอร์ (PWM)ขับ SSR ผ่าน transistor output ของ PLC

Parameters ที่ปรับได้

D12default: 500 (50.0°C)

Setpoint — ตั้งจาก HMI ได้ตลอด

D14default: 20 (Kp = 2.0)

Proportional gain — เพิ่มถ้าตอบสนองช้า, ลดถ้าแกว่ง

TV200 / K200default: 2.0 s

คาบ PWM — สั้นลง = ตอบสนองเร็วแต่ต้องใช้ SSR + โหลด switching เร็ว, ยาวขึ้น = นุ่มนวลแต่ lag เพิ่ม

อุปกรณ์ที่แนะนำ

คำถามที่พบบ่อย

ทำไมไม่ใช้คำสั่ง EPID?

EPID ต้องกำหนดค่า Kp, Ti, Td, sampling time ผ่าน EPID Wizard ใน SamSoar2022 IDE ซึ่งไม่สามารถฝังใน CSV import ได้ โปรแกรมนี้ถึงเลือกเขียน P-control แบบ manual ที่ import แล้วใช้ได้เลย

ต้องการเพิ่ม Integral + Derivative ให้เป็น PID เต็มทำยังไง?

เพิ่ม D22 (I accumulator), D24 (Prev error), D26 (D component). สูตร I: D22 += (Error × Ki × dt). D: D26 = (Error − D24) × Kd / dt. แล้วรวม: D22 + D26 + P term → clamp → PWM. ดูรายละเอียดใน docs/plc/advanced-techniques/plc-pid-control

ทำไมต้อง clamp duty 0-2000?

PWM output ต้องไม่เกิน period. ถ้า duty > period, Y0 ติดตลอด = 100% duty. ถ้าให้คำนวณได้ติดลบ, PWM จะไม่ทำงาน. Clamp ช่วยป้องกันทั้ง 2 กรณี

ทำไม Kp = 20 (ไม่ใช่ 2.0 ตรงๆ)?

Samkoon PLC ใช้ integer math เป็นหลัก. D14 = 20 แทน Kp = 2.0 (คูณ 10 เพื่อรักษา 1 decimal precision). เวลาคำนวณ: Duty = Error × D14 ได้ผลลัพธ์ที่ scale ถูกต้อง

อุปกรณ์ที่ต้องการนอกจาก PLC?

1) Analog input module — F-4PT (PT-100 RTD), F-4TC (Thermocouple), หรือ F-4AI (4-20mA). 2) SSR สำหรับขับ heater (เพราะ PLC transistor output รับกระแสไม่ได้สูง). 3) Heater element.

วิธีนำเข้าไฟล์ใน SamSoar2022

  1. ดาวน์โหลดไฟล์ pid-temperature-pwm.csv จากแท็บ CSV ด้านบน
  2. เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
  3. เมนู File → Import → เลือกไฟล์ .csv ที่เพิ่งดาวน์โหลด
  4. กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
  5. ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC