เซอร์โว 2 แกนวิ่งพร้อมกัน — XY Linear Interpolation
วิ่ง X (Y0) และ Y (Y2) พร้อมกันไปพิกัดเป้าหมาย — ความถี่ scaled ให้ถึงพร้อมกัน เส้นทางเป็นเส้นตรง
หลักการ
เครื่อง CNC, plotter, pick-and-place ต้องการวิ่ง 2 แกน พร้อมกัน ให้ end-effector เดินตามเส้นตรง (linear interpolation)
ปัญหาถ้าใช้ DRVA แยก
ถ้า X = 50000 pulse, Y = 20000 pulse, ความถี่เท่ากัน 10 kHz:
Y axis: 20000 / 10000 Hz = 2 sec (เสร็จก่อน)
X axis: 50000 / 10000 Hz = 5 sec
เส้นทาง: Y พุ่งขึ้นก่อน, ค่อย X พุ่งไปต่อ — เป็น L-shape ไม่ใช่ diagonal
วิธีแก้: Frequency Scaling
ปรับความถี่ของแกนสั้นกว่า ให้ใช้เวลาเท่ากัน:
F_long = 10000 Hz (กำหนดมาตรฐานแกนยาว)
F_short = F_long × pulses_short / pulses_long
= 10000 × 20000 / 50000
= 4000 Hz
X: 50000 / 10000 Hz = 5 sec
Y: 20000 / 4000 Hz = 5 sec ← เสร็จพร้อมกัน
ทั้งคู่ออก pulse 5 วินาที พร้อมกัน → end-effector เดินเส้นตรง
คำนวณใน PLC
D200 = X_target (pulse, signed)
D201 = Y_target (pulse, signed)
D202 = F_max = 10000 Hz (max frequency for long axis)
Compute (every Start):
|X| = |D200|, |Y| = |D201|
ถ้า |X| >= |Y|:
F_X = D202 (full speed)
F_Y = D202 × |Y| / |X|
มิฉะนั้น:
F_Y = D202
F_X = D202 × |X| / |Y|
ตัวอย่างนี้ใช้ EDRVA แทน DRVA เพราะรองรับการเปลี่ยนค่าระหว่างทำงาน
ข้อจำกัด
- ตัวอย่างนี้ทำงานเฉพาะ กรณี ทุกค่าเป็นบวก (ไม่กำลังกลับทิศ)
- งานจริงต้อง:
- Direction handling (Y4 / Y5) — ตรวจ sign ของ delta แล้วตั้งทิศก่อน
- Acceleration sync — accel ทั้งคู่จบพร้อมกัน (advanced)
- Multi-segment path — interpolate G-code style
ขยายเพิ่ม
- 3-axis — เพิ่ม Z (Y4 pulse + Y6 dir) แล้ว F = max ของทั้ง 3
- Circular interpolation — ต้อง sin/cos table (advanced — ใช้ FB หรือ Macro)
- G-code parser — อ่านจาก SD card หรือ Modbus, แปลง 1 G01 = 1 sync move
ลำดับการทำงาน
- ประมวลผลFirst scan (M8150)ตั้งค่า F_max = K10000 ลง D202 ครั้งแรกที่ PLC เริ่มทำงานเคลียร์ Done flag เมื่อกด Start
- รีเซ็ตRST M1, M2, M3ขอบขาขึ้นปุ่ม Start ล้าง Flag X เสร็จ / Y เสร็จ / Both Done ก่อนเริ่มรอบใหม่
- อินพุตHMI → D200, D201ป้อนพิกัดเป้าหมายแกน X (D200) และแกน Y (D201) เป็นพัลส์ absolute
- อินพุตStart (X0) ขอบขาขึ้นปุ่ม Start latch M0 (Stop X1 ตัดวงจร) — เริ่มรอบการเคลื่อนที่คำนวณ frequency scaling ทันที
- เงื่อนไข|X| ≥ |Y| ?เทียบระยะ 2 แกนเพื่อหาแกนยาว — แกนยาวได้ F_max เต็ม อีกแกน scale ลงถ้า |X| ≥ |Y|: F_X = D202, F_Y = D202 × Y / X — มิฉะนั้น F_Y = D202, F_X = D202 × X / Y (สองรังใช้เงื่อนไขกลับด้านกัน)ได้ F_X (D210) และ F_Y (D211)
- เอาต์พุตEDRVA X (D200@D210, Y0/Y4) · EDRVA Y (D201@D211, Y2/Y6)ออก pulse ทั้ง 2 แกนพร้อมกันที่ความถี่ scaled — ใช้เวลาเท่ากัน end-effector เดินเส้นตรงรอ pulse จบทั้ง 2 แกน
- ประมวลผลM8134↓ → SET M1 · M8132↓ → SET M2ขอบขาลงของ pulse-output flag แต่ละแกน (M8134 = Y0, M8132 = Y2) ตั้ง Flag เสร็จ
- เอาต์พุตM1 ∧ M2 → SET M3 → Y3 ติดทั้งสองแกนเสร็จ → Both Done จุดไฟ Y3 แสดงการเคลื่อนที่จบรอบ
โปรแกรม PLC
I/O Assignment
| Address | Role | Note |
|---|---|---|
| X0 | ปุ่ม Start (NO) | |
| X1 | ปุ่ม Stop (NC) | |
| Y0 | Pulse output แกน X | |
| Y2 | Pulse output แกน Y | |
| Y4 | Direction แกน X | |
| Y6 | Direction แกน Y | |
| Y3 | ไฟ Done |
Parameters ที่ปรับได้
D200default: 0ตำแหน่งเป้าหมายแกน X (absolute pulse) — HMI กรอกค่า
D201default: 0ตำแหน่งเป้าหมายแกน Y (absolute pulse) — HMI กรอกค่า
D202default: 10000F_max — ความถี่หลักของแกนที่ยาวกว่า (Hz)
D210 / D211default: คำนวณF_X / F_Y — คำนวณอัตโนมัติให้ถึงเป้าหมายพร้อมกัน
M1 / M2default: 0Flag X เสร็จ / Y เสร็จ
M3default: 0ทั้งคู่เสร็จ — การเคลื่อนที่จบรอบ
อุปกรณ์ที่แนะนำ
คำถามที่พบบ่อย
ทำไมตัวอย่างนี้สมมติทุกค่าเป็นบวก?
เพื่อความเรียบง่าย — ในงานจริงต้อง: (1) คำนวณ delta = D200 - current_X (D8140) (2) ตรวจ sign → ตั้ง Y4 ทิศ (3) ใช้ค่า absolute (|delta|) ใน frequency scaling (4) MOV target absolute (ไม่ใช่ delta) ใน EDRVA EDRVA = absolute มันจัดการ direction ตาม sign ของ delta โดยอัตโนมัติถ้า direction Y ตั้งถูก
M8132 และ M8134 ต่างกันอย่างไร?
M8134 = Y0 pulse-output flag (ON เมื่อ Y0 กำลังออก pulse) M8132 = Y2 pulse-output flag (Samkoon FAS series) — แต่ละ pulse channel มี flag ของตัวเอง รุ่นเก่าอาจไม่มี M8132 ต้องดู special bit table ของ PLC ที่ใช้
ทำไม EDRVA ดีกว่า DRVA สำหรับงานนี้?
EDRVA ให้ pulse number และ frequency เปลี่ยนกลางคันได้ ในกรณีงาน multi-segment path (เช่น G-code) ต้อง override target ขณะ servo กำลังวิ่งเพื่อสมูตี้ DRVA ธรรมดา lock ค่า ตอน start ทำให้ต้องรอจบ segment ก่อนเสมอ
Acceleration ของ 2 แกนไม่ sync ตอน start/stop ใช่ไหม?
ใช่ — จุดอ่อนของ method นี้: ตอน accel/decel เส้นทางจะไม่เป็นเส้นตรงเป๊ะ (มี curve เล็กน้อย) ระยะ accel/decel ปกติ <100ms ที่ accel=K100 — สำหรับงานทั่วไปไม่เห็นด้วยตา CNC แม่นยำสูงต้องใช้ specialized motion controller (เช่น Samkoon SK-MC, Galil)
เอกสารที่เกี่ยวข้อง
วิธีนำเข้าไฟล์ใน SamSoar2022
- ดาวน์โหลดไฟล์
servo-2axis-sync.csvจากแท็บ CSV ด้านบน - เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
- เมนู File → Import → เลือกไฟล์
.csvที่เพิ่งดาวน์โหลด - กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
- ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC

