ตัวอย่างโปรแกรมไฟกระพริบ PLC FX-5U Mitsubishi
ตัวอย่างโปรแกรม PLC: ไฟวิ่ง 5 ดวง (Running Light)
ตัวอย่างโปรแกรม: ไฟวิ่ง 5 ดวง (Sequence Control)
โจทย์: ไฟ 5 ดวง (Y0-Y4) ติดเรียงกันทีละดวง วนลูปไปเรื่อยๆ และสามารถปรับความเร็วได้
แนวคิดการเขียนโปรแกรม (Logic Concept)
เราจะใช้วิธี "การหมุนบิต (Bit Rotation)" ซึ่งเป็นวิธีที่ง่ายและมีประสิทธิภาพที่สุดสำหรับไฟวิ่ง
1. สร้าง Timer วนลูปเพื่อกำหนดจังหวะเวลา (Pulse Generator)
2. ใช้คำสั่ง ROLP (Rotate Left Pulse) เพื่อเลื่อนตำแหน่งไฟทีละดวง
3. ย้ายค่าจาก Register ไปยัง Output (Y)
เราจะใช้วิธี "การหมุนบิต (Bit Rotation)" ซึ่งเป็นวิธีที่ง่ายและมีประสิทธิภาพที่สุดสำหรับไฟวิ่ง
1. สร้าง Timer วนลูปเพื่อกำหนดจังหวะเวลา (Pulse Generator)
2. ใช้คำสั่ง ROLP (Rotate Left Pulse) เพื่อเลื่อนตำแหน่งไฟทีละดวง
3. ย้ายค่าจาก Register ไปยัง Output (Y)
1. กำหนดอุปกรณ์ (Device Assignment)
| Device | ชื่อเรียก (Symbol) | หน้าที่การทำงาน |
|---|---|---|
| X0 | Switch Start | สวิตช์เปิดการทำงาน (ON = เริ่มวิ่ง) |
| D0 | Speed Setting | ตัวเก็บค่าเวลา (หน่วย ms) เช่น ใส่ค่า 500 = 0.5 วินาที |
| T0 | Timer Loop | ตัวจับเวลาเพื่อสร้างจังหวะกระพริบ |
| D10 | Lamp Register | รีจิสเตอร์เก็บสถานะไฟ (Bit 0-4 จะถูกส่งไป Y0-Y4) |
| Y0 - Y4 | Lamp 1 - 5 | หลอดไฟแสดงผล 5 ดวง |
2. โปรแกรม Ladder Logic (FX5U Style)
ส่วนที่ 1: กำหนดค่าเริ่มต้น (Initialization)
เมื่อเริ่มระบบ ต้องกำหนดให้มีไฟติดก่อน 1 ดวง (Bit แรก) ไม่งั้นจะไม่มีอะไรให้วิ่ง
เกร็ดความรู้: SM402 (Initial Pulse)
คือ Special Relay ที่จะ "ทำงาน (ON) เพียงแค่ 1 สแกนไทม์แรก" ทันทีที่ PLC เริ่ม Run และจะดับตลอดไป
นิยมใช้สำหรับ การกำหนดค่าเริ่มต้น (Initialization) เช่น การเซ็ตค่าความเร็วเริ่มต้น หรือรีเซ็ตค่าต่างๆ เพื่อไม่ให้ค่าเก่าที่ค้างอยู่มารบกวนการทำงาน
คือ Special Relay ที่จะ "ทำงาน (ON) เพียงแค่ 1 สแกนไทม์แรก" ทันทีที่ PLC เริ่ม Run และจะดับตลอดไป
นิยมใช้สำหรับ การกำหนดค่าเริ่มต้น (Initialization) เช่น การเซ็ตค่าความเร็วเริ่มต้น หรือรีเซ็ตค่าต่างๆ เพื่อไม่ให้ค่าเก่าที่ค้างอยู่มารบกวนการทำงาน
(* เมื่อกด X0 และระบบเพิ่งเริ่มทำงาน (SM402 ทำงานแวบเดียวตอน Run) ให้ Set ค่าเริ่มต้น *)
X0 SM402 (Initial Pulse)
|--[ ]---------^--------------------[ MOV K1 D10 ]--|
(Set Bit 0 = ON)
(* กำหนดความเร็วเริ่มต้น ถ้า D0 เป็น 0 ให้ใส่ค่า 500ms ป้องกัน Error *)
SM400 (Always ON) D0=0
|--[ ]-------------[ = D0 K0 ]-----[ MOV K500 D0 ]--|
X0 SM402 (Initial Pulse)
|--[ ]---------^--------------------[ MOV K1 D10 ]--|
(Set Bit 0 = ON)
(* กำหนดความเร็วเริ่มต้น ถ้า D0 เป็น 0 ให้ใส่ค่า 500ms ป้องกัน Error *)
SM400 (Always ON) D0=0
|--[ ]-------------[ = D0 K0 ]-----[ MOV K500 D0 ]--|
ส่วนที่ 2: สร้างจังหวะเวลา (Timer Loop)
สร้าง Timer ที่วนลูปตัวเองเพื่อสร้างสัญญาณ Pulse ทุกๆ เวลาที่ตั้งไว้ใน D0
(* Timer T0 นับเวลาตามค่า D0 เมื่อครบกำหนด จะตัดตัวเองแล้วเริ่มใหม่ *)
X0 T0 (Done)
|--[ ]----------[ / ]-------------------( OUT T0 D0 )--|
X0 T0 (Done)
|--[ ]----------[ / ]-------------------( OUT T0 D0 )--|
ส่วนที่ 3: สั่งเลื่อนตำแหน่งไฟ (Shift Logic)
หัวใจสำคัญ: เมื่อ Timer ครบกำหนด ให้หมุนบิตใน D10 ไปทางซ้าย 1 ตำแหน่ง
(* เมื่อ T0 ทำงาน ให้หมุนบิตใน D10 ไปทางซ้าย 1 บิต *)
T0
|--[ ]----------------------------------[ ROLP D10 K1 ]--|
(Rotate Left 1 bit)
(* ตรวจสอบ: ถ้าบิตวิ่งเกินดวงที่ 5 (Bit 5 ขึ้นไป) ให้ Reset กลับมาดวงที่ 1 *)
D10 >= K32 (Bit 5 ON)
|--[ >= D10 K32 ]-----------------------[ MOV K1 D10 ]--|
T0
|--[ ]----------------------------------[ ROLP D10 K1 ]--|
(Rotate Left 1 bit)
(* ตรวจสอบ: ถ้าบิตวิ่งเกินดวงที่ 5 (Bit 5 ขึ้นไป) ให้ Reset กลับมาดวงที่ 1 *)
D10 >= K32 (Bit 5 ON)
|--[ >= D10 K32 ]-----------------------[ MOV K1 D10 ]--|
ส่วนที่ 4: ส่งออก Output (Output Mapping)
ย้ายค่าบิตจาก D10 ไปที่ Output จริง (Y0-Y4)
(* ย้ายค่า 5 บิตล่างของ D10 ไปที่ Y0-Y4 *)
SM400
|--[ ]----------------------------------[ K2Y0 = D10 ]----|
(* หมายเหตุ: K2Y0 หมายถึงกลุ่มข้อมูล 8 บิต เริ่มต้นที่ Y0 (Y0-Y7) *)
SM400
|--[ ]----------------------------------[ K2Y0 = D10 ]----|
(* หมายเหตุ: K2Y0 หมายถึงกลุ่มข้อมูล 8 บิต เริ่มต้นที่ Y0 (Y0-Y7) *)
3. อธิบายการทำงานทีละขั้นตอน
- เริ่มต้น (Start):
- เมื่อกด X0 PLC จะนำค่า
K1(เลขฐานสองคือ0000 0001) ไปใส่ใน D10 โดยอาศัยจังหวะแรกที่ SM402 ทำงาน - ผลลัพธ์: ไฟดวงที่ 1 (Y0) จะติดขึ้นมาเป็นค่าเริ่มต้น
- เมื่อกด X0 PLC จะนำค่า
- หน่วงเวลา (Delay):
- T0 จะเริ่มนับเวลาจนถึงค่าที่ตั้งใน D0 (เช่น 500ms)
- ขยับไฟ (Shift):
- เมื่อ T0 ทำงานครบกำหนด คำสั่ง
ROLPจะทำงาน 1 ครั้ง - ค่าใน D10 จะถูกหมุนไปทางซ้าย จาก
0000 0001(1) เป็น0000 0010(2) - ผลลัพธ์: ไฟดวงที่ 1 (Y0) ดับ และดวงที่ 2 (Y1) ติด
- เมื่อ T0 ทำงานครบกำหนด คำสั่ง
- วนลูป (Loop):
- กระบวนการนี้จะทำซ้ำไปเรื่อยๆ ไฟจะวิ่งจาก Y0 -> Y1 -> Y2 -> Y3 -> Y4
- รีเซ็ตลูป (Reset):
- เมื่อไฟวิ่งผ่านดวงที่ 5 (Y4) ค่าใน D10 จะกลายเป็น 32 (Bit 5 ON)
- คำสั่งเปรียบเทียบ
>= K32จะทำงาน และสั่ง Reset ค่า D10 กลับมาเป็น 1 อีกครั้ง เพื่อให้เริ่มที่ Y0 ใหม่
4. การนำไปประยุกต์ใช้
- เปลี่ยนจำนวนดวงไฟ: แก้ไขตรงคำสั่งเปรียบเทียบ เช่น ถ้ามี 8 ดวง ก็เปลี่ยนเป็น
>= K256(Bit 8) - เปลี่ยนความเร็ว: เปลี่ยนค่าใน D0 ผ่าน HMI หรือโปรแกรมได้เลย โดยไม่ต้องแก้ Ladder
- ไฟวิ่งสวนทาง: เปลี่ยนคำสั่งจาก
ROLP(หมุนซ้าย) เป็นRORP(หมุนขวา)
-- จบเอกสารตัวอย่าง --
