หน้าแรกคู่มือPLCพื้นฐาน PLC และ SamSoar2022การเขียน Manual Auto ด้วย Sub-routine
PLCเริ่มต้น · Beginner13 นาที

การเขียน 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

ชุดอุปกรณ์สำหรับบทความนี้

ราคาชุดอุปกรณ์

฿3,690

ภาพรวม

EP.9 ของซีรีส์ Complete PLC ต่อเรื่อง Sequence Control จากตอนที่แล้ว มี 3 ส่วน:

  1. ขยาย State Machine จาก 2 เป็น 4 สถานะ และนับจำนวนรอบ (Cycle Count)
  2. เพิ่ม Safety Logic ให้หยุดเครื่องเมื่อเซนเซอร์ความปลอดภัยทำงาน
  3. แยกโปรแกรมเป็น 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

  1. ใน Project Tree คลิกขวาที่ Sub program → Add → Add Sub Routine ตั้งชื่อ Manual
  2. ทำซ้ำอีกครั้ง ตั้งชื่อ Auto
  3. ดับเบิลคลิก Manual จะได้หน้า Network ใหม่ของ Sub Routine นั้น

โค้ดโหมด Manual

M150 ──────────────── OUT M120   M150: Cylinder On Off Manual

ในตัวอย่างนี้โหมด Manual มีแค่ให้คนกดเปิดปิดกระบอกลม M120 ได้ตามใจ แล้ว Compile

ย้ายโค้ดเข้าโหมด Auto

  1. กลับมาที่ Main ลากครอบโค้ด Sequence Control ที่เขียนไว้ (ตั้งแต่ Safety Logic ลงไปถึงล่างสุด)
  2. กด Ctrl+X (Cut)
  3. ไปที่หน้า 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

  1. กด Simulate ตอน PLC เริ่มทำงาน M200 ยังดับ จึงเรียก Manual ก่อน ซึ่งถูกต้องแล้ว เพราะก่อนเดิน Auto ต้องผ่านโหมด Manual
  2. เข้าหน้า Manual แล้วกด M150 ให้ติดดับ กระบอกลมก็ติดดับตาม
  3. ถ้ามีคนแอบไปกด M100 Start ของฝั่ง Auto จะไม่มีอะไรทำงานเลย เพราะยังไม่ได้ CALL Auto โค้ด Auto จึงถูก Block ไว้จนกว่าจะสั่งเป็นโหมด Auto
  4. สั่ง 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 ปริมาณมาก

11 นาทีเริ่มต้น · Beginner