Advanced
16 rungs
8 I/O

บันทึกตำแหน่ง Servo (Teach) + เล่นซ้ำ (Playback)

Servo Teaching + 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 อีกครั้ง)

ตัวแปรสำคัญ

RegisterPurpose
D1000 – D1009Saved positions (10 slots)
Z0Teach write index (0–9)
Z1Playback read index (0–9)
D250Number of saved positions
D8140Pulse accumulator ของ Y0 (ตำแหน่งปัจจุบันจริงของ motor)
M10Playback running flag

⚠ หมายเหตุเรื่อง Homing

โปรแกรมนี้ไม่ได้ทำ Homing อัตโนมัติ — ผู้ใช้ควร ZRN home ก่อนเริ่ม Teach ไม่งั้น pulse counter D8140 จะเริ่มจากค่าสุ่ม (ค้างจากครั้งก่อน) ทำให้ตำแหน่งที่ บันทึกอ้างจุดศูนย์ผิด

สามารถเพิ่ม rung ZRN ได้ (ดู docs/plc/complete-plc/13-servo-commands สำหรับ ZRN syntax)

ลำดับการทำงาน

  1. เงื่อนไข
    X10 — Mode selector
    สลับโหมด OFF = Teach (สอนตำแหน่ง), ON = Playback (เล่นซ้ำ)
    ถ้า OFF → เข้าโหมด Teach
  2. อินพุต
    X0 / X1 — Jog +/−
    กดค้าง → PLSF K5000 Y0 หมุน motor เดินหน้า (X0) หรือถอยหลัง (X1) ต่อเนื่อง ปล่อยปุ่ม = หยุดทันที
    jog ไปจนถึงตำแหน่งที่ต้องการ แล้วกด Save
  3. ประมวลผล
    X2↑ → MOVD D8140 → D1000[Z0], INC Z0
    ขอบขาขึ้น → copy ค่า pulse accumulator ปัจจุบัน (D8140) ลง slot ที่ Z0 ชี้ แล้วเลื่อน index, อัปเดต D250 = Z0
    เต็ม 10 slot (Z0 ≥ K10) → ไม่เพิ่ม index อีก
    เก็บได้ถึง 10 ตำแหน่ง (D1000–D1009)
  4. รีเซ็ต
    X3↑ → FMOV K0 D1000 K10, Z0 = 0
    Clear All — ล้างตำแหน่งที่บันทึกไว้ทั้งหมดและรีเซ็ต index กับ D250
    สลับ X10 = ON → เข้าโหมด Playback
  5. อินพุต
    X4↑ → Z1 = 0, SET M10
    ขอบขาขึ้น + D250 > 0 → รีเซ็ต read index แล้ว latch flag กำลัง run
    เริ่มไล่เล่นตำแหน่งที่บันทึกไว้
  6. เอาต์พุต
    EDRVA D1000[Z1] → Y0 / Y4
    ขณะ M10 ติด → สั่ง servo เคลื่อนไปตำแหน่ง absolute ที่ slot Z1 ชี้ (pulse Y0, direction Y4)
    M8134↓ (pulse เสร็จ) → INC Z1 ไป slot ถัดไป
  7. เงื่อนไข
    Z1 ≥ D250 → RST M10
    ไล่ครบทุกตำแหน่งที่บันทึกไว้ → หยุด playback (รอกด Run อีกครั้ง)
    ยังไม่ครบ → วน EDRVA ตำแหน่งถัดไปต่อ

โปรแกรม PLC

บันทึกตำแหน่ง Servo (Teach) + เล่นซ้ำ (Playback) — Servo Teaching + Playback
โปรแกรม Teach-and-Play สำหรับ servo — ผู้ใช้ jog มอเตอร์ไปตำแหน่งที่ต้องการ แล้วกด Save เพื่อบันทึก (เก็บได้ 10 ตำแหน่งใน D1000-D1009) พอกด Playback จะ EDRVA ไปทีละตำแหน่งตามลำดับด้วย indexed addressing
N0ตั้งค่า Index เริ่มต้น
First-scan init: เคลียร์ Z0, Z1, D250 = 0 พร้อมกัน แตกขนานจากคอนแทค M8150 ตัวเดียว
M8150MOVK0, Z0MOVK0, Z1MOVK0, D250
N1โหมด Teach: Jog +/−
Teach mode — jog เดินหน้า (X10 OFF + X0 ค้าง) → pulse Y0 ต่อเนื่อง, Y4 OFF (dir+)
X10X0PLSFK5000, Y0
Teach mode — ตั้ง direction = + เมื่อ jog เดินหน้า
X10X0RSTY4
Teach mode — jog ถอยหลัง (X10 OFF + X1 ค้าง) → Y4 ON (dir−)
X10X1SETY4
Teach mode — pulse ขณะ jog ถอยหลัง
X10X1PLSFK5000, Y0
N2โหมด Teach: บันทึกตำแหน่ง
Teach — บันทึกตำแหน่ง (X2 ขอบขาขึ้น + Teach mode + ยังไม่เต็ม) → copy D8140 ลง D1000[Z0]
X2X10Z0 < K10MOVDD8140, D1000[Z0]
Teach — เพิ่ม index Z0 หลังจากบันทึก
X2X10Z0 < K10INCZ0, Z0
Teach — อัปเดตจำนวนที่บันทึกไว้ D250 = Z0
X2X10Z0 < K10MOVZ0, D250
N3โหมด Teach: ลบทั้งหมด
Teach — ลบทั้งหมด (X3 ขอบขาขึ้น + Teach mode) → FMOV K0 D1000 K10
X3X10FMOVK0, D1000, K10
Teach — ลบ: รีเซ็ต index ของ Teach
X3X10MOVK0, Z0
Teach — ลบ: รีเซ็ตจำนวนที่บันทึกไว้
X3X10MOVK0, D250
N4โหมด Playback: เล่น Sequence
Playback — Start (X4 ขอบขาขึ้น + Playback mode + D250 > 0) → รีเซ็ต Z1, latch M10
X4X10D250 > K0MOVK0, Z1
Playback — latch flag กำลัง run (M10)
X4X10D250 > K0SETM10
Playback — สั่ง EDRVA ไปยังตำแหน่งที่บันทึกไว้ D1000[Z1] (ต่อเนื่องขณะ M10 ติด)
M10EDRVAD1000[Z1], K10000, K100, K100, Y0, Y4
Playback — Pulse เสร็จ (M8134↓) และยังมีตำแหน่งเหลือ → INC Z1
M8134M10INCZ1, Z1
Playback — Z1 ถึงจุดสุดท้าย (>= D250) → หยุด playback, RST M10
M10Z1 >= D250RSTM10
Network count: 5, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

I/O Assignment

AddressRoleNote
X0ปุ่ม Jog+ (กดค้างเพื่อเดินหน้า)ใช้ตอน Teach mode เท่านั้น
X1ปุ่ม Jog− (กดค้างเพื่อถอยหลัง)ใช้ตอน Teach mode เท่านั้น
X2ปุ่ม Save ตำแหน่ง (NO, ขอบขาขึ้น)กดเพื่อบันทึกตำแหน่งปัจจุบัน
X3ปุ่ม Clear All (NO, ขอบขาขึ้น)ล้างตำแหน่งที่บันทึกไว้ทั้งหมด
X4ปุ่ม Run playback (NO, ขอบขาขึ้น)ใช้ตอน Playback mode เท่านั้น
X10Mode selector (OFF=Teach, ON=Playback)toggle switch หรือ selector
Y0Pulse output ไป servo
Y4Direction output ไป servo

Parameters ที่ปรับได้

D1000 - D1009default: 0

ตำแหน่งที่บันทึกไว้ (10 slot) — อ่าน/เขียนจาก HMI ได้เพื่อดูค่าที่บันทึกไว้

D250default: 0

จำนวนตำแหน่งที่บันทึก (เพิ่มขึ้นทุกครั้งที่ Save) — Playback จะวิ่งถึง slot ที่ D250 แล้วหยุด

Z0 / Z1default: 0

Index ของ 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

  1. ดาวน์โหลดไฟล์ servo-teaching.csv จากแท็บ CSV ด้านบน
  2. เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
  3. เมนู File → Import → เลือกไฟล์ .csv ที่เพิ่งดาวน์โหลด
  4. กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
  5. ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC