พิมพ์คำที่ต้องการค้นหา ทั้งภาษาไทยและอังกฤษ

  1. หน้าแรก
  2. คลังความรู้
  3. PLC
  4. ควบคุมแบบลำดับขั้น

// บทที่ 22.7 · PLC · Sequential Control

การควบคุมแบบลำดับขั้น: สเตตแมชชีน SFC/GRAFCET สัญญาณไฟจราจร สายพานคัดแยก และถังผสมแบบแบตช์

เครื่องจักรส่วนใหญ่ทำงานเป็นลำดับ: รอ → เติม → ผสม → ปล่อย → รอ การเขียนโปรแกรมลำดับด้วยวงจรล็อกตัวเองซ้อนกันได้ผลในงานเล็ก แต่จะยุ่งเหยิงเมื่อเครื่องซับซ้อน วิธีที่วิศวกรใช้คือคิดเป็น สเตตแมชชีน ก่อน แล้วค่อยแปลงเป็นภาษาใดก็ได้

เขียนโดย อาจารย์มดอัปเดต
สรุปใน 30 วินาที
  • ขั้นตอนออกแบบ: เขียนขั้น (state) → เงื่อนไขเปลี่ยนขั้น (transition) → เอาต์พุตของแต่ละขั้น
  • มีขั้นทำงานทีละหนึ่งขั้นเสมอ (ยกเว้นกิ่งขนานใน SFC)
  • แลดเดอร์: SET ขั้นถัดไป + RESET ขั้นปัจจุบัน ในรังเดียวกัน · ST: CASE State OF
  • เอาต์พุตเขียนท้ายโปรแกรมเป็น OR ของขั้น

สเตตแมชชีน: ขั้น เงื่อนไข เอาต์พุต กลาง

S0NS เขียว · EW แดงS1NS เหลือง · EW แดงS2แดงทุกทิศS3EW เขียว · NS แดงS4EW เหลือง · NS แดงS5แดงทุกทิศT 25 sT 3 sT 2 sT 25 sT 3 sT 2 sหนึ่งสถานะทำงานทีละสถานะ · เงื่อนไขเปลี่ยน = ไทเมอร์ของสถานะครบ · ปุ่มคนข้ามและโหมดกะพริบกลางคืนเพิ่มได้ง่าย
รูป 1 · ไฟจราจรสองทิศ: หกขั้นวนรอบ แต่ละขั้นมีไทเมอร์ของตัวเอง เงื่อนไขเปลี่ยนขั้นคือไทเมอร์ครบ

S1 Transition rule กฎการเปลี่ยนขั้น

Xn+1←1, Xn←0เมื่อXn∧tn→n+1X_{n+1} \leftarrow 1,\ X_n \leftarrow 0 \quad \text{เมื่อ}\quad X_n \wedge t_{n\to n+1}

S2 One active step มีขั้นทำงานหนึ่งขั้น (ลำดับเชิงเส้น)

∑iXi=1\sum_i X_i = 1

S3 Outputs from steps เอาต์พุตจากขั้น

Qj=⋁i∈AjXi⋅(เงื่อนไขอนุญาต)Q_j = \bigvee_{i \in A_j} X_i \cdot \text{(เงื่อนไขอนุญาต)}

ตัวอย่างไฟจราจรในซิมูเลเตอร์ใช้ไทเมอร์ต่อเป็นโซ่ (T1→T6) เป็นสเตตแมชชีนแบบง่าย: ขั้นปัจจุบันระบุได้จากไทเมอร์ตัวไหนครบแล้ว เหมาะกับลำดับที่ขึ้นกับเวลาล้วน ๆ งานที่มีเงื่อนไขจากเซนเซอร์ใช้วิธี SFC ด้านล่าง

SFC / GRAFCET: ถังผสมแบบแบตช์ กลาง

0รอSTART · NOT LL1V1เติม ALM2V2เติม BLH3M1 · T#60sกวนT3.Q4V3ปล่อยออกNOT LLLL LM LH = สวิตช์ระดับต่ำ กลาง สูง (1 = จมน้ำ)V1 V2 วาล์วเติม · V3 วาล์วปล่อย · M1 มอเตอร์กวนกฎ SFC:• ขั้นที่ทำงานอยู่ทำ action ของมัน• ข้ามได้เมื่อขั้นก่อนทำงานและเงื่อนไขจริง (ขั้นก่อนดับ ขั้นถัดไปติด ในสแกนเดียว)• กรอบคู่ = ขั้นเริ่มต้น
รูป 2 · กรอบคือขั้น ขีดขวางคือเงื่อนไขเปลี่ยนขั้น กล่องด้านขวาคือ action ที่ทำขณะขั้นนั้นทำงาน

แปลงเป็นแลดเดอร์ด้วย 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 วิธีนี้ป้องกันคอยล์ซ้ำและเพิ่มเงื่อนไขโหมดมือหรือหยุดฉุกเฉินได้จุดเดียว

อาจารย์มด · ธีรวุฒิ แสวงบุญ
อาจารย์สาขาวิชาวิศวกรรมไฟฟ้า มหาวิทยาลัยราชภัฏธนบุรี สมุทรปราการ · ดูโปรไฟล์