Advanced
18 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):

          ┌─────────────────────┐
          │ X10 = OFF (Teach)   │
          │                     │
          │ X0 → Jog+           │
          │ X1 → Jog−           │
          │ X2↑ → Save to       │
          │        D1000[Z0]    │
          │        Z0 = Z0 + 1  │
          │ X3↑ → Clear All     │
          └─────────────────────┘
                   │
          ┌────────┴────────┐
          │ X10 = ON (Play) │
          │                 │
          │ X4↑ → Run       │
          │   Z1 = 0        │
          │   M10 = 1       │
          │   EDRVA D1000[Z1]│
          │   M8134↓ → Z1++ │
          │   Z1 ≥ D250 →   │
          │     RST M10     │
          └─────────────────┘

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)

โปรแกรม PLC

บันทึกตำแหน่ง Servo (Teach) + เล่นซ้ำ (Playback) — Servo Teaching + Playback
โปรแกรม Teach-and-Play สำหรับ servo — ผู้ใช้ jog มอเตอร์ไปตำแหน่งที่ต้องการ แล้วกด Save เพื่อบันทึก (เก็บได้ 10 ตำแหน่งใน D1000-D1009) พอกด Playback จะ EDRVA ไปทีละตำแหน่งตามลำดับด้วย indexed addressing
N0First-scan init: Z0 = 0, Z1 = 0, D250 = 0
M8150MOVK0, Z0
N1First-scan init Z1
M8150MOVK0, Z1
N2First-scan init saved count
M8150MOVK0, D250
N3TEACH mode jog forward (X10 off + X0 held) — continuous pulse Y0, Y4=OFF (dir+)
X10X0PLSFK5000, Y0
N4TEACH mode direction + when jogging forward
X10X0RSTY4
N5TEACH mode jog backward (X10 off + X1 held) — Y4=ON (dir−)
X10X1SETY4
N6TEACH mode jog backward pulse
X10X1PLSFK5000, Y0
N7TEACH — Save position (X2 rising + teach mode + not yet full) → copy D8140 to D1000[Z0]
X2X10Z0 < K10MOVDD8140, D1000[Z0]
N8TEACH — increment teach index Z0 after save
X2X10Z0 < K10INCZ0
N9TEACH — update saved count D250 = Z0
X2X10Z0 < K10MOVZ0, D250
N10TEACH — Clear All (X3 rising in teach mode) → FMOV K0 D1000 K10
X3X10FMOVK0, D1000, K10
N11TEACH — Clear: reset teach index
X3X10MOVK0, Z0
N12TEACH — Clear: reset saved count
X3X10MOVK0, D250
N13PLAYBACK — Start (X4 rising + playback mode + D250 > 0) → reset Z1, latch M10
X4X10D250 > K0MOVK0, Z1
N14PLAYBACK — latch running flag M10
X4X10D250 > K0SETM10
N15PLAYBACK — drive EDRVA to saved position at D1000[Z1] (continuous while M10)
M10EEDRVAD1000[Z1], K10000, K100, K100, Y0, Y4
N16PLAYBACK — Pulse done (M8134↓) + still have positions left → INC Z1
M8134M10INCZ1
N17PLAYBACK — Z1 reached end (>= D250) → stop playback, RST M10
M10Z1 >= D250RSTM10
Rung count: 18, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

I/O Assignment

AddressRoleNote
X0Jog+ button (hold to move forward)ใช้ตอน Teach mode เท่านั้น
X1Jog− button (hold to move backward)ใช้ตอน Teach mode เท่านั้น
X2Save position button (NO, edge)กดเพื่อบันทึกตำแหน่งปัจจุบัน
X3Clear All button (NO, edge)ล้างตำแหน่งที่บันทึกไว้ทั้งหมด
X4Run playback button (NO, edge)ใช้ตอน Playback mode เท่านั้น
X10Mode selector switch (OFF=Teach, ON=Playback)toggle switch หรือ selector
Y0Pulse output to servo
Y4Direction output to servo

Parameters ที่ปรับได้

D1000 - D1009default: 0

Saved positions (10 slots). อ่าน/เขียนจาก HMI ได้เพื่อดูว่าบันทึกอะไรไว้

D250default: 0

Number of saved positions (เพิ่มขึ้นทุกครั้งที่ Save). Playback จะวิ่งถึง D250 slot แล้วหยุด

Z0 / Z1default: 0

Teach write index / Playback read index. Z1 สามารถ preset ก่อนกด Run เพื่อเริ่มจากกลาง sequence

PLSF K5000 Y0default: 5 kHz

Jog speed. เพิ่ม = jog เร็ว แต่อาจ overshoot ตำแหน่งเป้าหมาย

EDRVA K10000default: 10 kHz

Playback speed

อุปกรณ์ที่แนะนำ

คำถามที่พบบ่อย

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