หน้าแรกคู่มือPLCพื้นฐาน PLC และ SamSoar2022จัดการ Sequence Control ปริมาณมาก
PLCเริ่มต้น · Beginner11 นาที

จัดการ Sequence Control ปริมาณมาก

เปลี่ยน Sequence Control จาก Stage Coil (S) มาเก็บ Stage ไว้ใน D200 ตัวเดียว แล้วเรียกใช้ Function Block ภาษา C จาก Library ด้วยคำสั่ง CALLM เช่น RPCI หาเส้นรอบวงของวงกลม

แทนที่จะใช้ Stage Coil หลายตัว ให้เก็บ Stage ปัจจุบันเป็นตัวเลขใน D200 แล้วใช้ LDW= เช็ค Stage กับ MOV ย้าย Stage โค้ดจะสั้นและอ่านง่ายกว่า ส่วนงานคำนวณซับซ้อนให้เรียก Function Block ภาษา C ด้วย CALLM เช่น RPCI ที่คืนค่าเส้นรอบวงจากรัศมี

อัพเดทล่าสุด: 26 ตุลาคม 2569

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

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

฿3,690

เก็บ Stage ไว้ใน D-Tag แทน Stage Coil

EP นี้ต่อจากโจทย์กระบอกลมใน EP ที่แล้ว ซึ่งใช้ Stage Coil (S1–S4) คุมแต่ละ Stage พอ Stage เยอะขึ้นต้องคอย Set/Reset Coil หลายตัว คราวนี้เปลี่ยนมาเก็บ Stage ปัจจุบันเป็นตัวเลขใน D-Tag ตัวเดียว (D200 = Current State) แล้วสนใจแค่ว่าตอนนี้ D200 มีค่าเท่าไหร่

โจทย์ (Number State)

D200Stageไป Stage ถัดไปเมื่อ
1กระบอกลมทำงานผ่านไป 3.5 วินาที
2กระบอกลมหยุดผ่านไป 2.0 วินาที
3กระบอกลมทำงานM130 ติด
4กระบอกลมหยุดผ่านไป 2.0 วินาที แล้วกลับไป Stage 1

ข้อดีของการใช้ D-Tag

  • ไม่ต้องใช้ Stage Coil หลายตัว และไม่ต้องคอยตัดการทำงานของ Stage ก่อนหน้า เพราะ D200 มีได้ค่าเดียว
  • ลดปริมาณโค้ดที่ต้องเขียน โค้ดจึงอ่านง่ายขึ้นเยอะ

แก้โค้ดใน Subroutine Auto

1. หยุดและล้าง Stage

เดิม Rung ที่ตัดการทำงานใช้ Reset S1 จำนวน 4 ตัว เปลี่ยนเป็น Move ค่า K0 ไปที่ D200 แทน

ล้าง Stage ด้วย MOV K0
Is Safe (M99) ดับ หรือกด Stop (M110) → D200 = 0
N0
M99 ขอบขาลง หรือ M110 → D200 = 0 หยุดทุก Stage
M99↓M110MOVK0, D200
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

2. เริ่มและเปลี่ยน Stage

Rung Start เปลี่ยนจากการเช็ค S2/S3/S4 เป็นเช็คว่า D200 เท่ากับ K0 หรือเปล่าด้วย LDW= ก่อนเข้า Stage 1 ส่วนแต่ละ Stage เช็ค D200 ด้วย LDW= แล้วเปลี่ยน Set/Reset Coil เป็น MOV ค่า Stage ถัดไปเข้า D200 — Rung เช็คว่า Stage จบหรือยังย้ายขึ้นไปต่อขนานใต้ Rung ของ Stage นั้นได้เลย

State Machine ด้วย D200 (4 Stage)
LDW= เช็ค Stage ปัจจุบัน แล้ว MOV ค่า Stage ถัดไปเข้า D200 เมื่อเงื่อนไขครบ
N0
Start (M100) + D200 = 0 + ไม่กด Stop + Is Safe → Stage 1
M100D200 = K0M110M99MOVK1, D200
Stage 1: Timer T10 (D100 = 35 → 3.5 วินาที) ครบแล้วไป Stage 2
D200 = K1TONTV10, D100T10MOVK2, D200
Stage 2: Timer T11 (D102 = 20 → 2.0 วินาที) ครบแล้วไป Stage 3
D200 = K2TONTV11, D102T11MOVK3, D200
Stage 3: รอ M130 ติด แล้วไป Stage 4
D200 = K3M130MOVK4, D200
Stage 4: Timer T12 (D104) ครบแล้วกลับ Stage 1
D200 = K4TONTV12, D104T12MOVK1, D200
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

3. คุม Output

Output กระบอกลม (M120) ติดที่ Stage 1 กับ Stage 3 จึงเขียน LDW= สองตัวขนานกันได้เลย

Output — ติดที่ Stage 1 หรือ Stage 3
LDW= ขนานกับ ORW= เพื่อเปิด Output ได้หลาย Stage
N0
M120 (กระบอกลม) ON เมื่อ D200 = 1 หรือ D200 = 3
D200 = K1D200 = K3M120
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

ทดสอบด้วย Simulate

  1. กด Compile แล้วเข้า Simulate กด Start
  2. ที่ Main Program ทำให้ M200 ติดเพื่อเข้า Auto Mode
  3. กลับมาที่ Subroutine Auto เช็ค Safety ก่อน — ถ้ามีคนขวาง Sensor กดปุ่ม Start แล้วต้องเริ่มทำงานไม่ได้
  4. เมื่อ Is Safe (M99) ติดอยู่ กด Start แล้วปล่อยให้ทำงาน Stage จะวิ่ง 1 → 2 → 3 แล้วรอ M130 ติด จึงเข้า Stage 4 และกลับไปเริ่ม Stage 1 ใหม่
  5. M120 ติดตาม Stage ที่คาดไว้

Function Block (Utility Function)

นอกจากแบ่งโปรแกรมเป็น Subroutine แล้ว ยังเขียนฟังก์ชันช่วยเหลือด้วยภาษา C ได้ด้วย มักเรียกกันว่า Utility Function หรือ Function Block แทนที่จะเขียนเป็น Ladder ก็เขียนเป็นโค้ดแล้วเรียกใช้จาก Ladder

เหมาะกับงานที่มีการคำนวณเยอะ เช่นแปลงขนาดลูกกลิ้งเป็นระยะทางที่ป้อนไป การคูณหารธรรมดาใช้คำสั่ง Multiply ได้ แต่ถ้าการคำนวณซับซ้อนขึ้น เช่นหาค่า Pythagoras ตรีโกณมิติ หรือคำนวณเป็นลูป ใช้ Function Block จะสะดวกกว่า

ดูฟังก์ชันใน Library

  1. ใน Project Tree ทางซ้ายหาหัวข้อ Funcblock
  2. ดับเบิลคลิกที่ Library จะเห็นฟังก์ชันตัวอย่างที่เขียนไว้ให้เยอะมาก (ถ้าเขียนภาษา C เป็นก็เขียนเองได้ แต่ EP นี้แค่เลือกใช้)
  3. ตัวอย่างที่ใช้คือ RPCI — Get the perimeter of circle with word radius
// Get the perimeter of circle with word radius
void RPCI(WORD in, FLOAT out)
{
    *out = (*in) * 2 * PI;
}

ฟังก์ชันรับ 2 ตัว ตัวแรก in คือรัศมี ชนิด WORD ส่วนตัวที่สอง out คือผลลัพธ์ชนิด FLOAT ที่คืนค่าออกมา ซึ่งคือเส้นรอบวง (2πr)

เรียกใช้ด้วย CALLM

CALL ใช้เรียก Subroutine ส่วน CALLM ใช้เรียก Function Block — พิมพ์ CALLM แล้วเว้นวรรค จะขึ้นรายชื่อฟังก์ชันให้เลือก

CALLM — เรียก Function Block RPCI
D300 = รัศมี (Input), D302 = เส้นรอบวง (Output)
N0
M300 ON → D302 = 2π × D300
M300CALLMRPCI, D300, D302
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

ผลการทดสอบ

D300 (รัศมี)D302 (เส้นรอบวง)
16.283185
318.849556

ค่าที่ได้นำไปใช้ต่อใน Ladder Program ได้เลย

สรุป

  • เก็บ Stage เป็นตัวเลขใน D200 แล้วใช้ LDW= เช็ค และ MOV ย้าย Stage แทนการ Set/Reset Stage Coil หลายตัว
  • ล้างทุก Stage ได้ด้วย MOV K0 ไปที่ D200 คำสั่งเดียว
  • งานคำนวณซับซ้อนให้เรียก Function Block ภาษา C ด้วย CALLM

ตอนต่อไปจะเรียนเรื่อง High Speed Input

ตอนถัดไป

11. Encoder และ High Speed Counter

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