บันทึกตำแหน่ง Servo (Teach) + เล่นซ้ำ (Playback)
โปรแกรม Teach-and-Play สำหรับ servo — ผู้ใช้ jog มอเตอร์ไปตำแหน่งที่ต้องการ แล้วกด Save เพื่อบันทึก (เก็บได้ 10 ตำแหน่งใน D1000-D1009) พอกด Playback จะ EDRVA ไปทีละตำแหน่งตามลำดับด้วย indexed addressing
หลักการ
โปรแกรมนี้แบ่งเป็น 2 โหมด สลับด้วย X10 (Teach/Playback toggle)
Teach mode (X10 = OFF)
- X0 (Jog+) — ขณะกดค้าง → motor หมุนไปข้างหน้าด้วย
PLSFต่อเนื่อง - X1 (Jog−) — ขณะกดค้าง → motor หมุนถอยหลังด้วย
PLSF - X2 (Save) — ขอบขาขึ้น → copy ค่า D8140 (pulse accumulator ปัจจุบัน)
ไปที่
D1000[Z0]แล้ว INC Z0. เต็ม 10 slot → Z0 ไม่เพิ่มอีก (เขียนทับ slot สุดท้าย) - X3 (Clear All) — ขอบขาขึ้น →
FMOV K0 D1000 K10+ Z0 = 0. รีเซ็ตทั้งหมด
Playback mode (X10 = ON)
- X4 (Run) — กดเพื่อเริ่ม playback — สั่ง
EDRVAไปยังD1000[Z1]ทีละตำแหน่ง - เมื่อ pulse เสร็จ (M8134↓) → INC Z1, ไป slot ถัดไป
- Z1 ถึงจำนวน saved positions (D250) → Reset Z1, หยุด (รอกด Run อีกครั้ง)
ตัวแปรสำคัญ
| Register | Purpose |
|---|---|
| D1000 – D1009 | Saved positions (10 slots) |
| Z0 | Teach write index (0–9) |
| Z1 | Playback read index (0–9) |
| D250 | Number of saved positions |
| D8140 | Pulse accumulator ของ Y0 (ตำแหน่งปัจจุบันจริงของ motor) |
| M10 | Playback running flag |
⚠ หมายเหตุเรื่อง Homing
โปรแกรมนี้ไม่ได้ทำ Homing อัตโนมัติ — ผู้ใช้ควร ZRN home ก่อนเริ่ม Teach
ไม่งั้น pulse counter D8140 จะเริ่มจากค่าสุ่ม (ค้างจากครั้งก่อน) ทำให้ตำแหน่งที่
บันทึกอ้างจุดศูนย์ผิด
สามารถเพิ่ม rung ZRN ได้ (ดู docs/plc/complete-plc/13-servo-commands สำหรับ ZRN syntax)
ลำดับการทำงาน
- เงื่อนไขX10 — Mode selectorสลับโหมด OFF = Teach (สอนตำแหน่ง), ON = Playback (เล่นซ้ำ)ถ้า OFF → เข้าโหมด Teach
- อินพุตX0 / X1 — Jog +/−กดค้าง → PLSF K5000 Y0 หมุน motor เดินหน้า (X0) หรือถอยหลัง (X1) ต่อเนื่อง ปล่อยปุ่ม = หยุดทันทีjog ไปจนถึงตำแหน่งที่ต้องการ แล้วกด Save
- ประมวลผลX2↑ → MOVD D8140 → D1000[Z0], INC Z0ขอบขาขึ้น → copy ค่า pulse accumulator ปัจจุบัน (D8140) ลง slot ที่ Z0 ชี้ แล้วเลื่อน index, อัปเดต D250 = Z0เต็ม 10 slot (Z0 ≥ K10) → ไม่เพิ่ม index อีกเก็บได้ถึง 10 ตำแหน่ง (D1000–D1009)
- รีเซ็ตX3↑ → FMOV K0 D1000 K10, Z0 = 0Clear All — ล้างตำแหน่งที่บันทึกไว้ทั้งหมดและรีเซ็ต index กับ D250สลับ X10 = ON → เข้าโหมด Playback
- อินพุตX4↑ → Z1 = 0, SET M10ขอบขาขึ้น + D250 > 0 → รีเซ็ต read index แล้ว latch flag กำลัง runเริ่มไล่เล่นตำแหน่งที่บันทึกไว้
- เอาต์พุตEDRVA D1000[Z1] → Y0 / Y4ขณะ M10 ติด → สั่ง servo เคลื่อนไปตำแหน่ง absolute ที่ slot Z1 ชี้ (pulse Y0, direction Y4)M8134↓ (pulse เสร็จ) → INC Z1 ไป slot ถัดไป
- เงื่อนไขZ1 ≥ D250 → RST M10ไล่ครบทุกตำแหน่งที่บันทึกไว้ → หยุด playback (รอกด Run อีกครั้ง)ยังไม่ครบ → วน EDRVA ตำแหน่งถัดไปต่อ
โปรแกรม PLC
I/O Assignment
| Address | Role | Note |
|---|---|---|
| X0 | ปุ่ม Jog+ (กดค้างเพื่อเดินหน้า) | ใช้ตอน Teach mode เท่านั้น |
| X1 | ปุ่ม Jog− (กดค้างเพื่อถอยหลัง) | ใช้ตอน Teach mode เท่านั้น |
| X2 | ปุ่ม Save ตำแหน่ง (NO, ขอบขาขึ้น) | กดเพื่อบันทึกตำแหน่งปัจจุบัน |
| X3 | ปุ่ม Clear All (NO, ขอบขาขึ้น) | ล้างตำแหน่งที่บันทึกไว้ทั้งหมด |
| X4 | ปุ่ม Run playback (NO, ขอบขาขึ้น) | ใช้ตอน Playback mode เท่านั้น |
| X10 | Mode selector (OFF=Teach, ON=Playback) | toggle switch หรือ selector |
| Y0 | Pulse output ไป servo | |
| Y4 | Direction output ไป servo |
Parameters ที่ปรับได้
D1000 - D1009default: 0ตำแหน่งที่บันทึกไว้ (10 slot) — อ่าน/เขียนจาก HMI ได้เพื่อดูค่าที่บันทึกไว้
D250default: 0จำนวนตำแหน่งที่บันทึก (เพิ่มขึ้นทุกครั้งที่ Save) — Playback จะวิ่งถึง slot ที่ D250 แล้วหยุด
Z0 / Z1default: 0Index ของ Teach (write) / Playback (read) — Z1 สามารถ preset ก่อนกด Run เพื่อเริ่มกลาง sequence
PLSF K5000 Y0default: 5 kHzความเร็ว Jog — เพิ่ม = jog เร็ว แต่อาจ overshoot ตำแหน่งเป้าหมาย
EDRVA K10000default: 10 kHzความเร็ว Playback
อุปกรณ์ที่แนะนำ
คำถามที่พบบ่อย
D1000[Z0] ทำงานยังไง?
Z0 เป็น Index register — ใช้ offset address ตอน scan. D1000[Z0] เมื่อ Z0=0 → D1000, Z0=3 → D1003, Z0=5 → D1005 etc. ทำให้เขียน indexed table ได้ง่ายโดยไม่ต้องเขียน rung ซ้ำ 10 ครั้ง
ทำไม Jog ใช้ PLSF ไม่ใช่ DRVI?
PLSF = continuous pulse ที่ frequency คงที่ (ไม่มีเป้าหมาย pulse count). DRVI ต้องกำหนดจำนวน pulse ล่วงหน้า. Jog ต้องการให้ motor หมุนขณะกดปุ่มเท่านั้น — ปล่อยปุ่ม = หยุดทันที. PLSF ทำได้เพราะหยุดทันทีเมื่อเงื่อนไขปิด
ถ้าอยาก Save เกิน 10 ตำแหน่งทำยังไง?
เพิ่มขนาด storage และ max index: (1) เปลี่ยน AW< Z0 K10 เป็น K20 (หรือจำนวนที่ต้องการ) ใน 3 rungs ของ Save (2) FMOV K0 D1000 K20 ตอน Clear All ต้องตรงกัน (3) Address range: D1000-D1019 ถ้า 20 slot
Teach mode กด Save แต่ไม่บันทึก?
เช็ค: (1) X10 ต้องเป็น OFF (Teach mode) (2) Z0 ต้อง < 10 (ไม่เต็ม) — ถ้าเต็มต้อง Clear All ก่อน (3) X2 ต้องเป็น momentary ที่ถูก detect ขอบขาขึ้น — ถ้าต่อค้างก็จะบันทึกครั้งเดียวตอน scan แรก
ตำแหน่งที่เล่นซ้ำไม่ตรงกับตอน Teach?
ต้อง Home (ZRN) ก่อน teach ทุกครั้งที่เปิดเครื่องใหม่ เพราะ D8140 (pulse accumulator) จะเริ่มจากค่าค้างเก่า ถ้าไม่ Home, ค่าที่ Save ไว้จะเป็น 'offset จาก จุดสุ่ม' ไม่ใช่ 'offset จาก home'
เอกสารที่เกี่ยวข้อง
วิธีนำเข้าไฟล์ใน SamSoar2022
- ดาวน์โหลดไฟล์
servo-teaching.csvจากแท็บ CSV ด้านบน - เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
- เมนู File → Import → เลือกไฟล์
.csvที่เพิ่งดาวน์โหลด - กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
- ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC

