- หน้าแรก
- คลังความรู้
- PLC
- ควบคุมแบบลำดับขั้น
// บทที่ 22.7 · PLC · Sequential Control
การควบคุมแบบลำดับขั้น: สเตตแมชชีน SFC/GRAFCET สัญญาณไฟจราจร สายพานคัดแยก และถังผสมแบบแบตช์
เครื่องจักรส่วนใหญ่ทำงานเป็นลำดับ: รอ → เติม → ผสม → ปล่อย → รอ การเขียนโปรแกรมลำดับด้วยวงจรล็อกตัวเองซ้อนกันได้ผลในงานเล็ก แต่จะยุ่งเหยิงเมื่อเครื่องซับซ้อน วิธีที่วิศวกรใช้คือคิดเป็น สเตตแมชชีน ก่อน แล้วค่อยแปลงเป็นภาษาใดก็ได้
- ขั้นตอนออกแบบ: เขียนขั้น (state) → เงื่อนไขเปลี่ยนขั้น (transition) → เอาต์พุตของแต่ละขั้น
- มีขั้นทำงานทีละหนึ่งขั้นเสมอ (ยกเว้นกิ่งขนานใน SFC)
- แลดเดอร์: SET ขั้นถัดไป + RESET ขั้นปัจจุบัน ในรังเดียวกัน · ST: CASE State OF
- เอาต์พุตเขียนท้ายโปรแกรมเป็น OR ของขั้น
สเตตแมชชีน: ขั้น เงื่อนไข เอาต์พุต กลาง
S1 Transition rule กฎการเปลี่ยนขั้น
S2 One active step มีขั้นทำงานหนึ่งขั้น (ลำดับเชิงเส้น)
S3 Outputs from steps เอาต์พุตจากขั้น
ตัวอย่างไฟจราจรในซิมูเลเตอร์ใช้ไทเมอร์ต่อเป็นโซ่ (T1→T6) เป็นสเตตแมชชีนแบบง่าย: ขั้นปัจจุบันระบุได้จากไทเมอร์ตัวไหนครบแล้ว เหมาะกับลำดับที่ขึ้นกับเวลาล้วน ๆ งานที่มีเงื่อนไขจากเซนเซอร์ใช้วิธี SFC ด้านล่าง
SFC / GRAFCET: ถังผสมแบบแบตช์ กลาง
แปลงเป็นแลดเดอร์ด้วย SET/RESET
// ขั้นเริ่มต้นเมื่อเปิดเครื่อง (first scan) S X0 = FirstScan // แต่ละรัง: ขั้นปัจจุบัน AND เงื่อนไข → SET ขั้นถัดไป, RESET ขั้นปัจจุบัน S X1 = X0 & START & !LL R X0 = X0 & START & !LL S X2 = X1 & LM R X1 = X1 & LM S X3 = X2 & LH R X2 = X2 & LH S X4 = X3 & T3.Q R X3 = X3 & T3.Q S X0 = X4 & !LL R X4 = X4 & !LL T3 = TON(X3, 60s) // ส่วนเอาต์พุต (S3) V1 = X1 · V2 = X2 · M1 = X3 · V3 = X4
แปลงเป็น Structured Text ด้วย CASE
CASE Step OF 0: IF Start AND NOT LL THEN Step := 10; END_IF 10: IF LM THEN Step := 20; END_IF // เติม A 20: IF LH THEN Step := 30; END_IF // เติม B 30: IF TMix.Q THEN Step := 40; END_IF // กวน 40: IF NOT LL THEN Step := 0; END_IF // ปล่อย END_CASE TMix(IN := Step = 30, PT := T#60S); V1 := Step = 10; V2 := Step = 20; M1 := Step = 30; V3 := Step = 40;
เลขขั้นเว้นทีละ 10 เพื่อแทรกขั้นใหม่ภายหลังได้โดยไม่ต้องเลื่อนเลขทั้งโปรแกรม และแสดง Step บน HMI ช่างจะรู้ทันทีว่าเครื่องรออะไรอยู่
ตัวอย่างเติมถังอัตโนมัติ (มีโรงงานจำลอง)
กด START ระบบเติมน้ำจนถึง LH หยุด และเติมใหม่เมื่อระดับต่ำกว่า LL เปิดก๊อก (I0.4) ให้มีการใช้น้ำ ดูการ SET/RESET ของปั๊ม Q0.0 ตามสวิตช์ระดับ — นี่คือวงจรสองระดับแบบเดียวกับ ปั๊มลูกลอย แต่เขียนในโปรแกรม
โหมดอัตโนมัติ-มือ หยุด และกลับจุดเริ่ม ขั้นสูง
- Auto / Manual: โหมดมือให้สั่งเอาต์พุตทีละตัวจาก HMI แต่ยังผ่านอินเตอร์ล็อก (เช่น ห้ามเปิดวาล์วปล่อยขณะเติม) ลำดับขั้นหยุดนับขณะอยู่โหมดมือ
- Cycle stop: กดหยุดแล้วให้ทำรอบปัจจุบันจนจบก่อนหยุดที่ขั้น 0 — เหมาะกับงานที่หยุดกลางรอบแล้วเสียวัตถุดิบ
- Immediate stop / E-stop: ตัดเอาต์พุตทั้งหมดทันที เก็บขั้นที่หยุดไว้ และต้องผ่านขั้นตอนกลับจุดเริ่ม (homing) หรือกู้คืนด้วยมือก่อนเริ่มใหม่
- Timeout ต่อขั้น: ทุกขั้นที่รอเซนเซอร์ควรมีไทเมอร์เฝ้า เช่น เติมนานเกิน 5 นาทีแปลว่าวาล์วค้างหรือเซนเซอร์เสีย → แจ้งเตือนพร้อมบอกขั้น
คำถามที่พบบ่อย
ทำไมโปรแกรมลำดับขั้นที่เขียนด้วยวงจรล็อกตัวเองหลายชั้นมักมีบั๊ก?
เพราะสถานะของเครื่องกระจายอยู่ในบิตหลายตัวที่ไม่มีกฎบังคับว่าต้องเป็นหนึ่งเดียว ทำให้เกิดสองขั้นทำงานพร้อมกันหรือไม่มีขั้นไหนทำงานได้ วิธีสเตตแมชชีนเก็บสถานะในตัวแปรเดียว (หรือบิตขั้นที่ SET/RESET คู่กันอย่างมีวินัย) ทำให้มีขั้นเดียวที่ทำงานเสมอ และรู้ทันทีว่าเครื่องค้างที่ไหน
เอาต์พุตควรเขียนในแต่ละขั้นหรือท้ายโปรแกรม?
แนะนำให้ส่วนลำดับคำนวณแค่ “ขั้นปัจจุบัน” แล้วมีส่วนเอาต์พุตแยกที่ท้ายโปรแกรม เขียนเอาต์พุตแต่ละตัวครั้งเดียวเป็น OR ของขั้นที่ต้องการให้ทำงาน เช่น ปั๊ม = ขั้น1 OR ขั้น4 วิธีนี้ป้องกันคอยล์ซ้ำและเพิ่มเงื่อนไขโหมดมือหรือหยุดฉุกเฉินได้จุดเดียว