---
title: "การควบคุมแบบลำดับขั้น: สเตตแมชชีน SFC/GRAFCET สัญญาณไฟจราจร สายพานคัดแยก และถังผสมแบบแบตช์"
url: https://modsengineeringmath.com/learn/plc/sequential-control/
site: "Mod's Engineering Mathematics (อาจารย์มด)"
language: th
updated: 2026-10-14
---

> ออกแบบโปรแกรม PLC แบบลำดับขั้นอย่างเป็นระบบ: แผนภาพสถานะ ขั้นและเงื่อนไขเปลี่ยนขั้นตาม SFC/GRAFCET (IEC 60848) วิธีเขียนเป็นแลดเดอร์ด้วย SET/RESET และเป็น Structured Text ด้วย CASE ตัวอย่างไฟจราจรสองทิศ ถังผสมแบบแบตช์ เติมถังอัตโนมัติ โหมดอัตโนมัติ-มือ หยุดฉุกเฉิน การกลับจุดเริ่ม และการวินิจฉัยว่าเครื่องค้างที่ขั้นไหน พร้อมซิมูเลเตอร์

ฉบับ Markdown ของ https://modsengineeringmath.com/learn/plc/sequential-control/ สำหรับผู้ช่วย AI และเครื่องมือค้นหา สูตรเขียนเป็น LaTeX ($…$ และ $$…$$) แล็บโต้ตอบและรูปมีเฉพาะในหน้าเว็บ

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

THภาษาไทยENEnglish

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


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

สรุปใน 30 วินาที

- ขั้นตอนออกแบบ: เขียนขั้น (state) → เงื่อนไขเปลี่ยนขั้น (transition) → เอาต์พุตของแต่ละขั้น

- มีขั้นทำงานทีละหนึ่งขั้นเสมอ (ยกเว้นกิ่งขนานใน SFC)

- แลดเดอร์: SET ขั้นถัดไป + RESET ขั้นปัจจุบัน ในรังเดียวกัน · ST: CASE State OF

- เอาต์พุตเขียนท้ายโปรแกรมเป็น OR ของขั้น

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

รูป 1 · ไฟจราจรสองทิศ: หกขั้นวนรอบ แต่ละขั้นมีไทเมอร์ของตัวเอง เงื่อนไขเปลี่ยนขั้นคือไทเมอร์ครบ

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

$$X_{n+1} \leftarrow 1,\ X_n \leftarrow 0 \quad \text{เมื่อ}\quad X_n \wedge t_{n\to n+1}$$

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

$$\sum_i X_i = 1$$

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

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

ต้องเปิด JavaScript

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

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

รูป 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 ตามสวิตช์ระดับ — นี่คือวงจรสองระดับแบบเดียวกับ ปั๊มลูกลอย แต่เขียนในโปรแกรม

ต้องเปิด JavaScript

## โหมดอัตโนมัติ-มือ หยุด และกลับจุดเริ่ม ขั้นสูง

- Auto / Manual: โหมดมือให้สั่งเอาต์พุตทีละตัวจาก HMI แต่ยังผ่านอินเตอร์ล็อก (เช่น ห้ามเปิดวาล์วปล่อยขณะเติม) ลำดับขั้นหยุดนับขณะอยู่โหมดมือ

- Cycle stop: กดหยุดแล้วให้ทำรอบปัจจุบันจนจบก่อนหยุดที่ขั้น 0 — เหมาะกับงานที่หยุดกลางรอบแล้วเสียวัตถุดิบ

- Immediate stop / E-stop: ตัดเอาต์พุตทั้งหมดทันที เก็บขั้นที่หยุดไว้ และต้องผ่านขั้นตอนกลับจุดเริ่ม (homing) หรือกู้คืนด้วยมือก่อนเริ่มใหม่

- Timeout ต่อขั้น: ทุกขั้นที่รอเซนเซอร์ควรมีไทเมอร์เฝ้า เช่น เติมนานเกิน 5 นาทีแปลว่าวาล์วค้างหรือเซนเซอร์เสีย → แจ้งเตือนพร้อมบอกขั้น

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

ทำไมโปรแกรมลำดับขั้นที่เขียนด้วยวงจรล็อกตัวเองหลายชั้นมักมีบั๊ก?
เพราะสถานะของเครื่องกระจายอยู่ในบิตหลายตัวที่ไม่มีกฎบังคับว่าต้องเป็นหนึ่งเดียว ทำให้เกิดสองขั้นทำงานพร้อมกันหรือไม่มีขั้นไหนทำงานได้ วิธีสเตตแมชชีนเก็บสถานะในตัวแปรเดียว (หรือบิตขั้นที่ SET/RESET คู่กันอย่างมีวินัย) ทำให้มีขั้นเดียวที่ทำงานเสมอ และรู้ทันทีว่าเครื่องค้างที่ไหน

เอาต์พุตควรเขียนในแต่ละขั้นหรือท้ายโปรแกรม?
แนะนำให้ส่วนลำดับคำนวณแค่ “ขั้นปัจจุบัน” แล้วมีส่วนเอาต์พุตแยกที่ท้ายโปรแกรม เขียนเอาต์พุตแต่ละตัวครั้งเดียวเป็น OR ของขั้นที่ต้องการให้ทำงาน เช่น ปั๊ม = ขั้น1 OR ขั้น4 วิธีนี้ป้องกันคอยล์ซ้ำและเพิ่มเงื่อนไขโหมดมือหรือหยุดฉุกเฉินได้จุดเดียว

มด

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

## คำถามที่พบบ่อย (FAQ)

**ทำไมโปรแกรมลำดับขั้นที่เขียนด้วยวงจรล็อกตัวเองหลายชั้นมักมีบั๊ก?**
เพราะสถานะของเครื่องกระจายอยู่ในบิตหลายตัวที่ไม่มีกฎบังคับว่าต้องเป็นหนึ่งเดียว ทำให้เกิดสองขั้นทำงานพร้อมกันหรือไม่มีขั้นไหนทำงานได้ วิธีสเตตแมชชีนเก็บสถานะในตัวแปรเดียว (หรือบิตขั้นที่ SET/RESET คู่กันอย่างมีวินัย) ทำให้มีขั้นเดียวที่ทำงานเสมอ และรู้ทันทีว่าเครื่องค้างที่ไหน

**เอาต์พุตควรเขียนในแต่ละขั้นหรือท้ายโปรแกรม?**
แนะนำให้ส่วนลำดับคำนวณแค่ “ขั้นปัจจุบัน” แล้วมีส่วนเอาต์พุตแยกที่ท้ายโปรแกรม เขียนเอาต์พุตแต่ละตัวครั้งเดียวเป็น OR ของขั้นที่ต้องการให้ทำงาน เช่น ปั๊ม = ขั้น1 OR ขั้น4 วิธีนี้ป้องกันคอยล์ซ้ำและเพิ่มเงื่อนไขโหมดมือหรือหยุดฉุกเฉินได้จุดเดียว
