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 — Enable PID loop via X0 (Start) / X1 (Stop NC)
X0M0X1M0
N1First-scan init: default SV=50.0°C (D12=500), Kp=2.0 (D14=20)
M8150MOVK500, D12
N2First-scan init: Kp gain
M8150MOVK20, D14
N3Error = SV − PV (D20 = D12 − D10). Positive error = need to heat
M0SUBD12, D10, D20
N4Duty = Error × Kp (D22 = D20 × D14 / 10 to compensate scale)
M0MULD20, D14, D22
N5Clamp duty low: if D22 < 0, set to 0 (no negative heating)
D22 < K0MOVK0, D22
N6Clamp duty high: if D22 > 2000, set to 2000 (max 100%)
D22 > K2000MOVK2000, D22
N7PWM period timer — 2.0 s (K200 × 10ms = 2000ms) using T200-series
M0TONTV200, K200
N8Reset PWM timer when it completes (self-reset to form continuous PWM)
T200RSTTV200
N9Heater output: Y0 ON when current PWM position < duty cycle
M0TV200 < D22Y0
Rung count: 10, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

I/O Assignment

AddressRoleNote
X0Enable button (NO)ปุ่ม start PID loop
X1Stop button (NC)
D10PV (Process Value, from analog input)ต่อกับ PT-100 / TC / 4-20mA sensor ผ่าน analog extension (F-4PT, F-4TC, F-4AI). Scale: 1 decimal (250 = 25.0°C)
D12SV (Setpoint, tunable from HMI)Default 500 (50.0°C). เขียนค่าใหม่จาก HMI เพื่อเปลี่ยน setpoint
Y0Heater output (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 period. สั้นลง = ตอบสนองเร็วแต่ต้อง SSR + โหลด switching เร็ว. ยาวขึ้น = smoother แต่ 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