เซอร์โว 2 แกนผ่านเกียร์ — วิ่งความเร็วเท่ากัน + Homing
เซอร์โว 750W 2 ตัวขับจานข้อเหวี่ยงผ่านเกียร์ 1:50 ให้หมุน 15 รอบ/นาที เท่ากัน — Homing ด้วย ZRN แล้ววิ่งต่อเนื่องด้วย EDRVI โหมด continuous (พัลส์ = 0x7FFFFFFF) ที่มี accel/decel ในตัว ล็อกเฟส 2 จานให้หมุดตรงมุมกันด้วย Home Sensor (FAT-16MT มีพัลส์แค่ Y0/Y1)
โจทย์
PLC FAT-16MT-DC-E 1 ตัว คุมเซอร์โว 750W 2 ตัว แต่ละตัวต่อหัวเกียร์ทด 1:50 ต้องการให้ เพลาปลายเกียร์วิ่ง 15 รอบ/นาที เท่ากันทั้ง 2 แกน มี Home Sensor (proximity) ที่เพลาแต่ละตัว ลำดับการทำงาน
การสั่ง ON/OFF เป็น สวิทช์กดค้าง (maintained) ที่ X0 — กดค้าง X0 = ON, ปล่อย X0 = OFF (ไม่ใช่ปุ่ม Start/Stop แยก จึงไม่ต้อง latch)
- กดค้าง X0 (ON) → servo ON, ทั้ง 2 ตัววิ่งช้าๆ (~5 รอบ/นาที) หา Home ตัวที่เจอก่อนหยุดรออีกตัว
- ทั้งคู่เจอ Home → ค่อยๆเร่งพร้อมกันจนถึง 15 รอบ/นาที วิ่งเท่ากันตราบที่ยังกดค้าง X0
- ปล่อย X0 (OFF) → ทั้งคู่ค่อยๆชะลอแล้วจอดที่ Home (sensor อยู่ใกล้เพลา หมุนไม่ถึง 1 รอบก็เจอ) → servo OFF
- กดค้าง X0 อีกครั้ง → วนลูปเดิม ถ้าอยู่ที่ Home อยู่แล้วก็เริ่มที่ขั้น 2 ได้เลย (ปล่อย X0 ระหว่าง homing = ยกเลิกกลับ IDLE; ค้าง X0 ค้างไว้ตอนเปิดไฟ PLC จะไม่ออกตัวเอง ต้องปล่อยแล้วกดใหม่)
ข้อจำกัดฮาร์ดแวร์ที่กำหนดทุกอย่าง
FAT-16MT (และ PLC transistor 16 จุดทุกตัว) มีพอร์ตพัลส์ความเร็วสูง แค่ Y0 กับ Y1 — พอดี 2 แกน แต่ ไม่มีช่องพัลส์สำรอง จึงจัด แกน 1 = Y0, แกน 2 = Y1
คำนวณความถี่ (ยึดค่า PPR ของเซอร์โว — ตัวอย่างนี้ PPR = 10000 พัลส์/รอบมอเตอร์)
RUN : ปลายเกียร์ 15 rpm → มอเตอร์ 15×50 = 750 rpm → 750/60×10000 = 125,000 Hz
HOME : ปลายเกียร์ ~5 rpm → มอเตอร์ 250 rpm → ~41,667 Hz (ใช้ ~K40000)
CREEP: ปลายเกียร์ ~1 rpm → มอเตอร์ 50 rpm → ~8,333 Hz (ใช้ ~K8000)
คาบผ่าน Home ที่ 15 rpm = 1 รอบ / 4 วินาที → เป้า 4000 ms (K400 × 10ms)
125 kHz อยู่ในพิสัย EDRVI (สูงสุด 200 kHz) แต่ ใกล้ขีดจำกัดสำหรับสายพัลส์ single-ended ที่ยาว 10 ม. แนะนำ (ก) ตั้ง electronic gear เป็น PPR = 5000 → 62.5 kHz และ (ข) ใส่ pull-up 1kΩ ไป 24V ที่ Y0/Y1 + สาย twisted-shielded หรือแปลงเป็น line-driver ที่ปลายไดรฟ์ตัวไกล
ทำไม EDRVI (ไม่ใช่ PLSF หรือ DRVI ธรรมดา)
EDRVI (Enhanced DRVI — real-time frequency modulation) ให้ครบทั้ง 3 อย่างที่งานนี้ต้องการ ในคำสั่งเดียว
- วิ่งต่อเนื่อง — ตั้งจำนวนพัลส์ =
K2147483647(0x7FFFFFFF) → ออกพัลส์ต่อเนื่อง ทางบวกไม่รู้จบ (0x80000000= ทางลบ) — เป็น sentinel ที่คู่มือรองรับ ไม่ใช่ move ที่จะจบ เฉพาะ EDRVI เท่านั้น ที่ทำได้ EDRVA ไม่มีโหมดนี้ - accel/decel ในตัว — ตั้งเวลาเร่ง/ชะลอแยกกันได้ (trapezoidal/S-curve) ไม่ต้องไล่ความถี่ ทีละ step ด้วยซอฟต์แวร์ → เข้า RUN ก็ตั้งความถี่เป็น F_run คำสั่งเร่งให้เองนุ่มๆ
- เปลี่ยนความถี่เรียลไทม์ — แก้รีจิสเตอร์ความถี่ระหว่างวิ่ง คำสั่งคำนวณเส้นโค้งใหม่ พร้อม accel/decel ให้เอง → ใช้ทำ sync trim ได้ตรงๆ
หมายเหตุ: ในโหมด continuous เปลี่ยน "จำนวนพัลส์" ไม่ได้ หลังเริ่มแล้ว — แต่ ความถี่ เปลี่ยนได้ (ซึ่งคือสิ่งที่เราต้องการ) ส่วนเวลา accel/decel ตั้งครั้งเดียวตอนเริ่ม แก้ระหว่างวิ่งไม่ได้
Homing ยังใช้ ZRN (หา proximity แล้วหยุดให้เอง interrupt-based) ZRN กับ EDRVI ใช้พอร์ต Y0/Y1 ร่วมกัน จึง สลับกันทำงานตาม state ไม่เปิดพร้อมกัน
State machine (D100)
0 IDLE → 1 HOMING → 2 RUN → 3 STOPPING → 0
ZRN เปิดเฉพาะ state 1 | EDRVI (Y0/Y1) เปิด state 2–3
การเร่งเข้าสู่ RUN และการชะลอตอน STOPPING เป็นหน้าที่ของ EDRVI เอง — ไม่มี state RAMP แยก
กลไกปลายเกียร์ = จานหมุน + ข้อเหวี่ยง
ปลายเกียร์เป็น จานกลมหมุนต่อเนื่อง (15 รอบ/นาที) มีหมุดข้อเหวี่ยงที่ริมจาน (เหมือนเพลาข้อเหวี่ยง) ไม่ใช่แผ่นวิ่งเชิงเส้น จึงเป็น การหมุนทางเดียวต่อเนื่อง — ตรงกับ EDRVI continuous พอดี (ไม่มีกลับทิศ ไม่มีลิมิตปลายทาง) Home Sensor จับธงที่ริมจาน 1 ครั้ง/รอบ ใช้เป็นดัชนีตำแหน่งมุม
วิธี Sync — ล็อกเฟส 2 จานให้ตรงกัน (ไม่ใช่แค่ความเร็วเท่า)
เพราะเป็นจานข้อเหวี่ยง 2 ตัวที่ต้องประสานกัน สิ่งที่ต้องคุมคือ เฟส (มุมหมุดตรงกัน) ไม่ใช่แค่ความเร็วเฉลี่ยเท่า — ความถี่ต่างกันนิดเดียวจะสะสมเป็นเฟสเคลื่อนเรื่อยๆ
ทำเป็น phase lock (ตรงกับที่โจทย์อยากให้เทียบเวลาผ่าน Home ของ 2 ตัว): แกน 1 ตรึงที่
F_run เป็น master, ตัวจับเวลาเฟส D340 รีเซ็ตทุกครั้งแกน 1 ผ่าน Home แล้ว จับค่าตอน
แกน 2 ผ่าน Home → D342 = แกน 2 ตามหลัง/นำหน้าแกน 1 กี่ 10ms ถ้าหลุดแบนด์ก็เร่ง/หน่วง
แกน 2 ชั่วคราว (±Δ) ให้หมุดกลับมาตรงมุม (เริ่มต้นทั้งคู่ homed พร้อมกันจึงตรงเฟสตั้งแต่ต้น
ความเร็วเท่ากันเป็นผลพลอยได้) ค่าแบนด์ K5/K200/K395 อิงคาบ 4000ms — ถ้าเปลี่ยน rpm/PPR ต้องปรับ
ทางเลือกที่แม่นกว่า — electronic crankshaft ด้วยตัวนับพัลส์: ZRN ศูนย์ตัวนับสะสม
D8140(Y0)/D8142(Y1) เป็น 0 ตอน home อยู่แล้ว พอวิ่ง EDRVI ต่อเนื่อง ผลต่างD8140 − D8142คือค่าเฟสเป็นจำนวนพัลส์ตรงๆ (ละเอียดระดับ 1/PPR รอบ) จะ trim จากค่านี้ แทนเวลา Home ก็ได้ แล้วใช้ Home Sensor เป็นตัวตรวจ/รีเซ็ตเฟสเป็นระยะ
หมายเหตุการใช้งานจริง (ต้องจูนหน้างาน)
- EDRVI operand = DRVI ทุกตัว (
<pulses> <freq> <accel> <decel> <pulseY> <dirY>) ต่างแค่ "ความถี่" แก้ระหว่างวิ่งได้ — ในที่นี้ pulses =K2147483647(continuous +) - ลำดับ operand ของ ZRN — ใช้ฟอร์ม creep ก่อน seek ตามตัวอย่าง
servo-homing-zrn(คู่มือบางหน้าสลับ seek มาก่อน — ยืนยันตอนคอมไพล์ F4) - ทิศทาง — สมมติเดินหน้า = DIR OFF (M8068/M8192~ ปรับ polarity ได้) แกนไหนกลับทิศให้สลับสาย DIR หรือใส่ความถี่ติดลบ
- หน่วงตอน Servo-ON — มี timer 200ms (T2) กันไม่ให้ ZRN เริ่มก่อนไดรฟ์พร้อม
- STOPPING ตั้งความถี่เป็น creep แล้วรอ decel (T3 ~1.5s) ก่อนค่อยจอดที่ Home ทีละแกน (ตรงกับ "อาจจะหน่วงเวลานิดหน่อย" ในโจทย์)
- โปรแกรมนี้เป็น ฉบับร่างสำหรับนำเข้า + คอมไพล์ (F4) + ทดสอบบนฮาร์ดแวร์ แล้วค่อยปรับจูน
ลำดับการทำงาน
- อินพุตกดค้าง X0 (ON, maintained)ขอบขาขึ้น X0 ขณะ IDLE → Servo ON (Y6/Y7) + หน่วง 200ms ให้ไดรฟ์พร้อม → เข้า HOMINGstate 0 → 1
- ประมวลผลHOMING — ZRN ทั้ง 2 แกน ~5 rpmแต่ละแกนหา Home เอง (X2/X3) ตัวที่เจอก่อนหยุดรอ จนครบทั้งคู่ครบ 2 แกน → RUN
- เอาต์พุตRUN — EDRVI continuous (0x7FFFFFFF)ตั้งความถี่ = F_run, EDRVI เร่งให้เองด้วย accel ในตัว แล้ววิ่งคงที่ 15 rpmPhase lock: เทียบเวลาผ่าน Home แกน 2 กับแกน 1 (D342) แล้วปรับ D212 ให้หมุดข้อเหวี่ยงตรงมุมกัน
- รีเซ็ตปล่อย X0 (OFF) → STOPPINGตั้งความถี่ = creep → EDRVI ชะลอให้เอง รอ ~1.5s แล้วจอดที่ Home ทีละแกนจอดครบ 2 แกน → Servo OFF
- ประมวลผลIDLE (servo off)กลับ state 0 — กด ON อีกครั้งวนลูปเดิม (ถ้าอยู่ Home แล้ว ZRN จบเร็ว)
โปรแกรม PLC
I/O Assignment
| Address | Role | Note |
|---|---|---|
| X0 | สวิทช์ ON/OFF แบบกดค้าง (maintained) | กดค้าง = ON (วิ่ง), ปล่อย = OFF (หยุด+จอด Home); ขอบขาขึ้นเริ่ม homing |
| X1 | (ว่าง — เดิมเป็นปุ่ม Stop) | ใช้เป็น E-stop/safety แยกได้ในอนาคต |
| X2 | Home proximity แกน 1 (NO) | ON เมื่อเพลาถึง Home |
| X3 | Home proximity แกน 2 (NO) | ON เมื่อเพลาถึง Home |
| Y0 | Pulse แกน 1 (high-speed) | ZRN/EDRVI ใช้พอร์ตนี้ร่วมกัน |
| Y1 | Pulse แกน 2 (high-speed) | ZRN/EDRVI ใช้พอร์ตนี้ร่วมกัน |
| Y2 | ไฟแสดงสถานะ Run | |
| Y3 | ไฟแสดงสถานะ Ready / อยู่ที่ Home | |
| Y4 | Direction แกน 1 | OFF = เดินหน้า (ใช้ทั้ง ZRN และ EDRVI) |
| Y5 | Direction แกน 2 | OFF = เดินหน้า |
| Y6 | Servo-ON แกน 1 (→ ไดรฟ์) | |
| Y7 | Servo-ON แกน 2 (→ ไดรฟ์) |
Parameters ที่ปรับได้
D220default: 125000F_run — ความถี่วิ่ง 15 รอบ/นาที (Hz) ที่ PPR 10000 ปรับตาม electronic gear จริง
D222default: 40000ความเร็วหา Home (~5 รอบ/นาที) ใช้เป็น seek speed ของ ZRN
D224default: 8000Creep — ความเร็วคืบเข้าจอดที่ Home (~1 รอบ/นาที)
D230 / D232default: 1000 / 1000เวลา accel / decel ของ EDRVI (ms) — มากขึ้น = นุ่มขึ้น ตั้งครั้งเดียว แก้ระหว่างวิ่งไม่ได้
D330default: 3000ขั้นเร่ง/หน่วงเฟสแกน 2 (Hz) เวลาเฟสหลุดแบนด์ — ใหญ่ไป = แกว่ง เล็กไป = ลู่เข้าช้า
D340 / D342default: 0ตัวจับเวลาเฟส (รีเซ็ตตอนแกน 1 ผ่าน Home) / ค่า lag เฟสแกน 2 ที่จับได้ (×10ms) — band K5/K200/K395 อิงคาบ 4000ms
TV2 / TV3 / TV201default: K2 / K15 / K1หน่วง Servo-ON 200ms · รอชะลอถึง creep 1500ms · ฐานเวลา sync 10ms
อุปกรณ์ที่แนะนำ
คำถามที่พบบ่อย
ทำไมใช้ EDRVI ไม่ใช่ PLSF หรือ DRVI ธรรมดา?
EDRVI ให้ครบในคำสั่งเดียว: (1) วิ่งต่อเนื่องได้จริงด้วยการตั้งจำนวนพัลส์ = K2147483647 (0x7FFFFFFF) — เป็น sentinel ที่คู่มือรองรับ ไม่ใช่ move ที่จะจบ (2) มี accel/decel ในตัว ไม่ต้องไล่ความถี่ทีละ step แบบ PLSF (3) เปลี่ยนความถี่เรียลไทม์พร้อมเส้นโค้ง accel/decel ให้เอง เหมาะกับ sync trim ส่วน DRVI เป็น move ระยะคงที่และเปลี่ยนค่าระหว่างวิ่งไม่ได้
ตั้งจำนวนพัลส์ K2147483647 มันจะหยุดเมื่อครบไหม?
ไม่ — K2147483647 (0x7FFFFFFF) เป็นค่าพิเศษที่คู่มือกำหนดให้ EDRVI 'ออกพัลส์ต่อเนื่องทางบวกไม่รู้จบ' (0x80000000 = ทางลบ) ไม่ใช่จำนวนพัลส์จริงที่จะนับจนครบแล้วหยุด เฉพาะ EDRVI เท่านั้นที่มีโหมดนี้ EDRVA ไม่มี ข้อแม้คือพอเข้าโหมด continuous แล้วเปลี่ยน 'จำนวนพัลส์' ไม่ได้ แต่ 'ความถี่' เปลี่ยนได้ (ซึ่งคือสิ่งที่เราใช้)
FAT-16MT คุม 2 เซอร์โวได้จริงไหม?
ได้พอดี — PLC transistor 16 จุดมีพอร์ตพัลส์ความเร็วสูงแค่ Y0 กับ Y1 จึงรองรับได้สูงสุด 2 แกน (แกน 1 = Y0, แกน 2 = Y1) ไม่มีช่องสำรอง ถ้าต้องการแกนที่ 3 ต้องขยับไป PLC 32/50/66 จุด (Y0–Y3) หรือรุ่น multi-pulse
ปลายเกียร์เป็นจานข้อเหวี่ยง — ต้องคุมแค่ความเร็ว หรือคุมเฟสด้วย?
ต้องคุม 'เฟส' (มุมหมุดตรงกัน) ไม่ใช่แค่ความเร็วเฉลี่ยเท่า เพราะจาน 2 ตัวที่ประสานกันถ้าเฟสเคลื่อนแม้นิดเดียวกลไกจะเยื้อง/ฝืน โปรแกรมจึงทำ phase lock: ตรึงแกน 1 ที่ F_run เป็น master วัดว่าแกน 2 ผ่าน Home ช้า/เร็วกว่าแกน 1 กี่ 10ms (D342) แล้วเร่ง/หน่วงแกน 2 ชั่วคราวให้หมุดกลับมาตรงมุม เริ่มต้นทั้งคู่ homed พร้อมกันจึงตรงเฟสตั้งแต่แรก ความเร็วเท่ากันเป็นผลพลอยได้ ถ้าต้องการละเอียดกว่านี้ใช้ผลต่างตัวนับพัลส์ D8140−D8142 (electronic crankshaft) แทนเวลา Home ได้
X0 เป็นสวิทช์แบบไหน?
สวิทช์กดค้าง (maintained): กดค้าง X0 = ON (วิ่ง), ปล่อย X0 = OFF (ชะลอแล้วจอดที่ Home) ไม่ต้องมีปุ่ม Stop แยกและไม่ต้อง latch — M0 ตามระดับ X0 ตรงๆ ขอบขาขึ้นของ X0 ขณะ IDLE เป็นตัวเริ่ม homing ปล่อย X0 ระหว่าง homing = ยกเลิกกลับ IDLE และถ้าค้าง X0 ไว้ตั้งแต่เปิดไฟ PLC เครื่องจะไม่ออกตัวเอง (ไม่มีขอบขาขึ้น) ต้องปล่อยแล้วกดใหม่ — กันสตาร์ทเองตอนไฟมา
ตอนปล่อย X0 (OFF) ทำไมต้องรอ ~1.5 วินาทีก่อนจอด?
พอปล่อย X0 เราตั้งความถี่ = creep แล้ว EDRVI จะชะลอจาก 15 rpm ลงมาตามเวลา decel (T3 รอให้ชะลอครบ ~1.5s) จากนั้นแต่ละแกนจะวิ่ง creep จนเจอ Home (หมุนไม่ถึง 1 รอบก็เจอ) แล้วตัด EDRVI หยุดตรง Home — ตรงกับโจทย์ 'อาจจะหน่วงเวลานิดหน่อย' ปรับ T3 ให้พอดีกับเวลา decel จริงได้
เอกสารที่เกี่ยวข้อง
วิธีนำเข้าไฟล์ใน SamSoar2022
- ดาวน์โหลดไฟล์
dual-servo-geared-sync.csvจากแท็บ CSV ด้านบน - เปิด SamSoar2022 → สร้างโปรเจกต์ใหม่ (หรือเปิดโปรเจกต์ที่มีอยู่)
- เมนู File → Import → เลือกไฟล์
.csvที่เพิ่งดาวน์โหลด - กด F4 เพื่อ Compile — ตรวจสอบว่าไม่มี error
- ตรวจการต่อสายตามตาราง I/O ด้านบน แล้ว Download โปรแกรมเข้า PLC

