Advanced
10 rungs
7 I/O

เซอร์โว 2 แกนวิ่งพร้อมกัน — XY Linear Interpolation

Two-Axis Synchronous Move (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 เพราะรองรับการเปลี่ยนค่าระหว่างทำงาน

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

First scan
  ↓
M1 (X done) = M2 (Y done) = OFF
F_max = 10000 (D202)
  ↓
HMI กรอก D200, D201
  ↓
กด Start (X0) (rising edge)
  ↓
คำนวณ F_X, F_Y (rungs จะแสดง)
  ↓
EDRVA แกน X → D200 ที่ความถี่ D210
EDRVA แกน Y → D201 ที่ความถี่ D211
  ↓
M8134↓ และ M8132↓ (Y2 pulse flag) → SET M1, M2
  ↓
M1 ∧ M2 → SET M3 (Both Done)

ข้อจำกัด

  • ตัวอย่างนี้ทำงานเฉพาะ กรณี ทุกค่าเป็นบวก (ไม่กำลังกลับทิศ)
  • งานจริงต้อง:
    • 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

โปรแกรม PLC

เซอร์โว 2 แกนวิ่งพร้อมกัน — XY Linear Interpolation — Two-Axis Synchronous Move (XY Linear Interpolation)
วิ่ง X (Y0) และ Y (Y2) พร้อมกันไปพิกัดเป้าหมาย — ความถี่ scaled ให้ถึงพร้อมกัน เส้นทางเป็นเส้นตรง
N0ตั้งค่า F_max เริ่มต้น
First scan — F_max = 10 kHz
M8150MOVK10000, D202
N1Start/Stop + ล้าง Done flag
Latch Start/Stop
X0M0X1M0
ขอบขาขึ้นปุ่ม Start — ล้าง Done flag ทุกตัว (MPS แตก 3 branch: M1, M2, M3)
X0RSTM1RSTM2RSTM3
N2Scale ความถี่ให้ถึงพร้อมกัน
กรณี |X| >= |Y|: F_X = full speed, แล้วคำนวณ F_Y = F_max × Y / X (3 branch ใช้เงื่อนไขเดียวกัน)
X0D200 >= D201MOVD202, D210MULD202, D201, D220DIVD220, D200, D211
กรณี |Y| > |X|: F_Y = full speed, แล้วคำนวณ F_X = F_max × X / Y (3 branch ใช้เงื่อนไขเดียวกัน)
X0D201 > D200MOVD202, D211MULD202, D200, D221DIVD221, D201, D210
N3Output Pulse (ทั้ง 2 แกน)
EDRVA 2 แกน — X (D200@D210 ผ่าน Y0/Y4) และ Y (D201@D211 ผ่าน Y2/Y6) ใช้ M0 เป็นเงื่อนไขร่วมกัน
M0M1EDRVAD200, D210, K100, K100, Y0, Y4M2EDRVAD201, D211, K100, K100, Y2, Y6
N4ตรวจจับ Done + ไฟแสดงสถานะ
X เสร็จ — ขอบขาลงของ M8134 (pulse-out flag)
M8134M0SETM1
Y เสร็จ — ขอบขาลงของ M8132 (pulse-out flag ของ Y2)
M8132M0SETM2
ทั้งคู่เสร็จ → ตั้ง M3, จุดไฟ Done (Y3)
M1M2SETM3
ไฟ Done (Y3)
M3Y3
Network count: 5, gap: 12
นำเข้าไฟล์ใน SamSoar2022: File → Import → เลือกไฟล์ .csv

I/O Assignment

AddressRoleNote
X0ปุ่ม Start (NO)
X1ปุ่ม Stop (NC)
Y0Pulse output แกน X
Y2Pulse output แกน Y
Y4Direction แกน X
Y6Direction แกน Y
Y3ไฟ Done

Parameters ที่ปรับได้

D200default: 0

ตำแหน่งเป้าหมายแกน X (absolute pulse) — HMI กรอกค่า

D201default: 0

ตำแหน่งเป้าหมายแกน Y (absolute pulse) — HMI กรอกค่า

D202default: 10000

F_max — ความถี่หลักของแกนที่ยาวกว่า (Hz)

D210 / D211default: คำนวณ

F_X / F_Y — คำนวณอัตโนมัติให้ถึงเป้าหมายพร้อมกัน

M1 / M2default: 0

Flag 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

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