การเขียน Manual Auto ด้วย Sub-routine
ต่อยอด Sequence Control จาก 2 เป็น 4 สถานะ พร้อม Cycle Count เพิ่ม Safety Logic ด้วยเซนเซอร์ NC แล้วแยกโปรแกรมเป็น Sub Routine โหมด Manual และ Auto เรียกใช้ด้วยคำสั่ง CALL ใน SamSoar2022
สร้าง Sub Routine ชื่อ Manual กับ Auto ย้ายโค้ด Sequence Control เข้า Auto แล้วใน Main ใช้ M200 แบบ NC สั่ง CALL Manual และแบบ NO สั่ง CALL Auto โค้ด Auto จึงทำงานไม่ได้จนกว่าจะเลือกโหมด Auto คลิปนี้ยังขยาย State Machine เป็น 4 สถานะ นับรอบด้วย INC และเพิ่ม Safety Logic ก่อนเข้าเรื่อง Sub Routine
อัพเดทล่าสุด: 26 ตุลาคม 2569
ภาพรวม
EP.9 ของซีรีส์ Complete PLC ต่อเรื่อง Sequence Control จากตอนที่แล้ว มี 3 ส่วน:
- ขยาย State Machine จาก 2 เป็น 4 สถานะ และนับจำนวนรอบ (Cycle Count)
- เพิ่ม Safety Logic ให้หยุดเครื่องเมื่อเซนเซอร์ความปลอดภัยทำงาน
- แยกโปรแกรมเป็น Sub Routine โหมด Manual และ Auto แล้วเรียกใช้ด้วย
CALL
ทุกอย่างในคลิปทดสอบด้วย Simulate ของ SamSoar2022
State Machine แบบ 4 สถานะ
ตอนที่แล้วมี 2 สถานะ แต่ถ้าตีความโจทย์เครื่องจักรให้ครบจะมี 4 สถานะ:
| สถานะ | การทำงาน | เงื่อนไขไปสถานะถัดไป |
|---|---|---|
| 1 | กระบอกลมทำงาน | ผ่านไป 3.5 วินาที |
| 2 | กระบอกลมหยุด | ผ่านไป 2.0 วินาที |
| 3 | กระบอกลมทำงาน | M130 ติด |
| 4 | กระบอกลมหยุด | ผ่านไป 2.0 วินาที แล้ววนกลับสถานะ 1 |
และนับว่าเครื่องทำงานไปแล้วกี่รอบ (Cycle Count)
ค่าเวลาตอนเริ่มต้น
M8150 (First scan) ─┬─ MOV K35 D100 D100: Delay On (3.5 วินาที)
├─ MOV K20 D102 D102: Delay Off (2.0 วินาที)
└─ MOV K20 D104 D104: Delay Off 2 (2.0 วินาที, เพิ่มใหม่สำหรับสถานะ 4)
ปุ่ม Stop และปุ่ม Start
M110 (Stop) ──────────────────────────────────── RST S1 K4
M100 (Start) ─ S2(NC) ─ S3(NC) ─ S4(NC) ─ M110(NC) ── SET S1 K1
- ปุ่ม Stop แก้จาก
RST S1 K2เป็นRST S1 K4เพราะตอนนี้มี 4 สถานะ ต้อง Reset 4 คอยล์ (S1–S4) - การกด Start เพื่อเข้าสถานะ 1 ต้องเอา NC ของทุกสถานะที่ไม่ใช่ S1 (คือ S2, S3, S4) มาขวางไว้ ไม่อย่างนั้นแต่ละ Stage มีโอกาส Overlap กัน
โค้ดแต่ละสถานะ
S1 ─ S2(NC) ──────── TON TV10 D100 (สถานะ 1: นับ 3.5 วินาที)
S1 ─ T10 ─────────┬─ RST S1 K1
└─ SET S2 K1
S2 ─ S3(NC) ──────── TON TV11 D102 (สถานะ 2: นับ 2.0 วินาที)
S2 ─ T11 ─────────┬─ RST S2 K1
└─ SET S3 K1
S3 ─ M130 ────────┬─ RST S3 K1 (สถานะ 3: รอจนกว่า M130 ติด)
└─ SET S4 K1
S4 ──────────────── TON TV12 D104 (สถานะ 4: นับ 2.0 วินาที)
S4 ─ T12 ─────────┬─ RST S4 K1
├─ SET S1 K1
└─ ↑(ขอบขาขึ้น) ─ INC D106 D106 D106: Count
- สถานะ 1 และ 2 เป็นโค้ดเดิมจากตอนที่แล้ว เพิ่มแค่ NC ของ S3 ขวางในสถานะ 2 ตามหลัก "เอา Stage ถัดไปมาตัด Stage ก่อนหน้า"
- สถานะ 3 คือเนื้อจริงของโจทย์ พอเงื่อนไขของสถานะ 2 เป็นจริงจะ Set S3 แล้วรอเงื่อนไขสำเร็จคือ M130 ติด จึง Reset S3 และไปสถานะ 4
- สถานะ 4 ใช้ Timer TV12 นับเวลา (Comment: Cylinder Off 2 Done) พอ T12 ติดก็ Reset S4 และกลับไป Set S1
- ในขั้นสุดท้ายใช้ ขอบขาขึ้น กับคำสั่ง INC นับเพิ่มทีละ 1 ทำงานครบ 1 → 2 → 3 → 4 นับเป็น 1 Cycle
Output กระบอกลม
S1 ─┬─ S2(NC) ─ S4(NC) ── OUT M120 M120: Cylinder
S3 ─┘
กระบอกลมต้องทำงานในสถานะ 1 และ 3 จึงเอา S3 มาขนานกับ S1 ส่วน S2 กับ S4 เป็นสถานะที่กระบอกลมดับ จึงใส่เป็น NC อนุกรมขวางไว้
ทดสอบด้วย Simulate
กด Start (M100) สถานะ 1 เริ่มทำงาน รอ 3.5 วินาทีไปสถานะ 2 แล้วไปสถานะ 3 และค้างอยู่ตรงนั้น (กระบอกลม M120 ติดอยู่) จนกว่าจะมีคนกด M130 ให้ติด จึงเข้าสถานะ 4 แล้ววนกลับไปสถานะ 1 ตัวนับ D106 เพิ่มขึ้นทุกรอบ และกด Stop เมื่อไหร่ก็ได้ ทั้ง Cycle และกระบอกลมจะหยุด
เพิ่ม Safety Logic
เครื่องจักรที่ทำให้ผู้ใช้งานบาดเจ็บได้มักมีเซนเซอร์ม่านแสงหรือ Emergency Button ซึ่งส่วนมากต่อเข้ามาแบบ NC เราเอาเซนเซอร์เหล่านี้มาสร้างคอยล์ช่วยที่บอกว่า "ตอนนี้ปลอดภัย":
M98(NC) ──────────────────────────── OUT M99 M98: Safety Sensor, M99: Is Safe
M99 ↓(ขอบขาลง) ─┬─────────────────── RST S1 K4
M110 (Stop) ────┘
M100 ─ S2(NC) ─ S3(NC) ─ S4(NC) ─ M110(NC) ─ M99 ── SET S1 K1
- ถ้ามีเซนเซอร์ความปลอดภัยมากกว่าหนึ่งตัวก็ใส่อนุกรมต่อกันไป อ่านโค้ดแล้วรู้ทันทีว่าถ้า M99 ติด แปลว่าทุกอย่างปลอดภัย
- เอา M99 แบบ ขอบขาลง มาขนานกับปุ่ม Stop เมื่อไหร่ที่ความปลอดภัยเปลี่ยนจาก 1 เป็น 0 จะ Reset ทุกสถานะ
- เอา M99 มาขวางในแถวปุ่ม Start ด้วย สถานะต้องปลอดภัยก่อนถึงจะเริ่มสถานะ 1 ได้ ถึงจะกด M100 ค้างไว้ก็เริ่มไม่ได้
Sub Routine (Sub Program) คืออะไร
ที่ผ่านมาเราเขียนทุกอย่างใน Main Program ซึ่งรันจากซ้ายไปขวา บนลงล่าง เมื่อโปรแกรมใหญ่ขึ้นเรื่อยๆ เราสามารถเขียน Sub Program หรือโปรแกรมย่อย แล้วค่อยเอามาประกอบเป็นโปรแกรมใหญ่ ช่วยให้จัดการโค้ดได้ดีขึ้น อ่านง่ายขึ้น เรียกใช้ซ้ำได้ หรือใช้แยกโหมด Manual กับ Auto
คลิปใช้ตัวอย่างโหมด Manual / Auto เพราะเครื่องจักรก่อนเดิน Auto ต้องมีโหมด Manual ให้ผู้ใช้งานเข้ามาจัดตำแหน่งอุปกรณ์ เปิดมอเตอร์ เปิดกระบอกลม หรือเช็คเซนเซอร์ต่างๆ
สร้าง Sub Routine Manual และ Auto
- ใน Project Tree คลิกขวาที่ Sub program → Add → Add Sub Routine ตั้งชื่อ
Manual - ทำซ้ำอีกครั้ง ตั้งชื่อ
Auto - ดับเบิลคลิก Manual จะได้หน้า Network ใหม่ของ Sub Routine นั้น
โค้ดโหมด Manual
M150 ──────────────── OUT M120 M150: Cylinder On Off Manual
ในตัวอย่างนี้โหมด Manual มีแค่ให้คนกดเปิดปิดกระบอกลม M120 ได้ตามใจ แล้ว Compile
ย้ายโค้ดเข้าโหมด Auto
- กลับมาที่ Main ลากครอบโค้ด Sequence Control ที่เขียนไว้ (ตั้งแต่ Safety Logic ลงไปถึงล่างสุด)
- กด Ctrl+X (Cut)
- ไปที่หน้า Auto กด Ctrl+V (Paste) แล้วกด F4 เพื่อ Compile
โค้ดส่วน State Machines ใน Main จะเหลือแค่นิดเดียว คือแถว M8150 ที่ตั้งค่าเวลาเริ่มต้น
เรียกใช้ Sub Routine ด้วย CALL
ควรมีปุ่มให้ผู้ใช้งานเลือกโหมด ส่วนมากใช้ Selector Switch หรือถ้าใช้ HMI ก็สร้างปุ่มเลือก Manual / Auto ได้ ในคลิปใช้ M200:
M200(NC) ──────────────── CALL Manual M200: Manual Mode
M200(NO) ──────────────── CALL Auto
- M200 ดับ (NC ต่อ) = โหมด Manual, M200 ติด (NO ต่อ) = โหมด Auto
- คำสั่งเรียก Sub Routine คือ
CALL(ไม่มีตัว M) เว้นวรรคตามด้วยชื่อ เช่นCALL Manual CALLM(มีตัว M) เป็นการเรียก Function Block ไม่ใช่ Sub Routine
ทดสอบโหมด Manual และ Auto
- กด Simulate ตอน PLC เริ่มทำงาน M200 ยังดับ จึงเรียก Manual ก่อน ซึ่งถูกต้องแล้ว เพราะก่อนเดิน Auto ต้องผ่านโหมด Manual
- เข้าหน้า Manual แล้วกด M150 ให้ติดดับ กระบอกลมก็ติดดับตาม
- ถ้ามีคนแอบไปกด M100 Start ของฝั่ง Auto จะไม่มีอะไรทำงานเลย เพราะยังไม่ได้ CALL Auto โค้ด Auto จึงถูก Block ไว้จนกว่าจะสั่งเป็นโหมด Auto
- สั่ง M200 ให้ติด แล้วไปที่หน้า Auto กด M100 สถานะจะเดินจาก 1 → 2 → 3 → 4 ได้ตามปกติ
จุดอ่อนของวิธีนี้
ฝั่ง Auto มีแค่ 4 Stage การจะเข้า Stage 1 ต้องเอา Stage 2, 3, 4 มาขวาง NC ไว้ ถ้ามี 10 หรือ 20 Stage โค้ดตรงนี้จะยาวและอ่านไม่ค่อยรู้เรื่อง วิธีแก้ปัญหานี้อยู่ในตอนต่อไป
สรุป
- State Machine 4 สถานะใช้ S1–S4 Reset ด้วย
RST S1 K4และนับรอบด้วยขอบขาขึ้น +INC D106 D106 - Safety Logic: เซนเซอร์ NC สร้าง M99 (Is Safe) ใช้ขอบขาลงของ M99 สั่ง Reset และใช้ M99 ขวางการ Start
- Sub Routine แยกโค้ด Manual / Auto ได้ เรียกด้วย
CALL <ชื่อ>โดยเลือกโหมดจาก M200
ตอนถัดไป
10. จัดการ Sequence Control ปริมาณมาก
ควรอ่านก่อน:
มีคำถาม? ติดต่อทีมงาน
