จัดการ 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
เก็บ 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)
| D200 | Stage | ไป 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 แทน
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 นั้นได้เลย
3. คุม Output
Output กระบอกลม (M120) ติดที่ Stage 1 กับ Stage 3 จึงเขียน LDW= สองตัวขนานกันได้เลย
ทดสอบด้วย Simulate
- กด Compile แล้วเข้า Simulate กด Start
- ที่ Main Program ทำให้ M200 ติดเพื่อเข้า Auto Mode
- กลับมาที่ Subroutine Auto เช็ค Safety ก่อน — ถ้ามีคนขวาง Sensor กดปุ่ม Start แล้วต้องเริ่มทำงานไม่ได้
- เมื่อ Is Safe (M99) ติดอยู่ กด Start แล้วปล่อยให้ทำงาน Stage จะวิ่ง 1 → 2 → 3 แล้วรอ M130 ติด จึงเข้า Stage 4 และกลับไปเริ่ม Stage 1 ใหม่
- M120 ติดตาม Stage ที่คาดไว้
Function Block (Utility Function)
นอกจากแบ่งโปรแกรมเป็น Subroutine แล้ว ยังเขียนฟังก์ชันช่วยเหลือด้วยภาษา C ได้ด้วย มักเรียกกันว่า Utility Function หรือ Function Block แทนที่จะเขียนเป็น Ladder ก็เขียนเป็นโค้ดแล้วเรียกใช้จาก Ladder
เหมาะกับงานที่มีการคำนวณเยอะ เช่นแปลงขนาดลูกกลิ้งเป็นระยะทางที่ป้อนไป การคูณหารธรรมดาใช้คำสั่ง Multiply ได้ แต่ถ้าการคำนวณซับซ้อนขึ้น เช่นหาค่า Pythagoras ตรีโกณมิติ หรือคำนวณเป็นลูป ใช้ Function Block จะสะดวกกว่า
ดูฟังก์ชันใน Library
- ใน Project Tree ทางซ้ายหาหัวข้อ Funcblock
- ดับเบิลคลิกที่ Library จะเห็นฟังก์ชันตัวอย่างที่เขียนไว้ให้เยอะมาก (ถ้าเขียนภาษา C เป็นก็เขียนเองได้ แต่ EP นี้แค่เลือกใช้)
- ตัวอย่างที่ใช้คือ 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 แล้วเว้นวรรค จะขึ้นรายชื่อฟังก์ชันให้เลือก
ผลการทดสอบ
| D300 (รัศมี) | D302 (เส้นรอบวง) |
|---|---|
| 1 | 6.283185 |
| 3 | 18.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
ควรอ่านก่อน:
มีคำถาม? ติดต่อทีมงาน
