เซอร์โวซิล่า ตัวควบคุมการเคลื่อนที่

เกี่ยวกับ Servosila Motion Controller
Servosila Motion Controller คือซอฟต์แวร์ฝังตัวสำหรับควบคุมการเคลื่อนที่ของระบบหุ่นยนต์หลายแกนสมัยใหม่ ซอฟต์แวร์นี้ทำงานบน Linux, Windows หรือเป็นเฟิร์มแวร์บน MCU ฝังตัว
Servosila Motion Controller ใช้ G-code เพื่อวัตถุประสงค์ดังต่อไปนี้:
- เป็นวิธีในการกำหนดรูปทรงเรขาคณิตของการเคลื่อนไหวประสานกันในรูปแบบข้อความ
- เป็นโปรโตคอลการสื่อสารระดับสูงระหว่างตัวควบคุมการเคลื่อนไหวและแอปพลิเคชันผู้ใช้ระดับสูง
- เป็นภาษาสคริปต์ง่ายๆ สำหรับการเขียนโปรแกรมระบบหุ่นยนต์หลายแกน
- เป็นภาษาเป้าหมายสำหรับ AI เชิงสร้างสรรค์และ LLM
สถาปัตยกรรมซอฟต์แวร์
ตัวควบคุมการเคลื่อนที่ Servosila ซึ่งแสดงเป็นกล่องสีเทาในไดอะแกรมสถาปัตยกรรมด้านล่าง ทำงานเป็นกระบวนการเบื้องหลังใน Linux หรือ Windows กระบวนการนี้สื่อสารกับไดรฟ์เซอร์โวผ่านเครือข่าย CAN หรือ USB กระบวนการตัวควบคุมการเคลื่อนที่จัดเตรียมอินเทอร์เฟซหน่วยความจำที่ใช้ร่วมกันซึ่งมีความหน่วงต่ำสำหรับการสื่อสารระหว่างกระบวนการกับกระบวนการแอปพลิเคชันเดียว ซึ่งแสดงเป็นกล่องสีขาวในไดอะแกรม เพื่อแยกความซับซ้อนของอินเทอร์เฟซหน่วยความจำที่ใช้ร่วมกันออกไป จึงมีไลบรารีที่เชื่อมโยงแบบไดนามิกที่เรียกว่า Servopilot DLL มาพร้อมกับตัวควบคุมการเคลื่อนที่ DLL "แบบบาง" นี้จะเปิดเผย API ที่ง่ายกว่ามาก (เมื่อเทียบกับอินเทอร์เฟซหน่วยความจำที่ใช้ร่วมกัน) สำหรับการส่งคำสั่ง G-code ไปยังตัวควบคุมการเคลื่อนที่และสำหรับการรับข้อมูลระยะไกลและสถานะกลับมา API ของ DLL อธิบายไว้ในเอกสารนี้
ภายใน กระบวนการ Motion Controller มี Pipeline 0 และ Pipeline 1 สำหรับรับคำสั่ง G-code จากกระบวนการแอปพลิเคชัน Pipeline เป็นบัฟเฟอร์แบบวนซ้ำที่มีขนาดคงที่ มี Pipeline สองชุดเพื่อให้สามารถเรียกใช้คำสั่ง G-code สองชุดที่เป็นอิสระแบบขนานได้หากจำเป็น เมื่อส่งคำสั่ง G-code ใหม่ กระบวนการแอปพลิเคชันอาจเลือกที่จะผนวกคำสั่งเข้ากับ Pipeline หนึ่งหรืออีก Pipeline หนึ่ง หรือแทนที่คำสั่งใน Pipeline ด้วยชุดคำสั่งใหม่ คำสั่ง G-code ดำเนินการโดยเครื่องเสมือน ซึ่งเป็นส่วนประกอบภายในของกระบวนการ Motion Controller เนื่องจากคำสั่ง G-code ถูกส่งโดยกระบวนการแอปพลิเคชันในรูปแบบข้อความ จึงมีคอมไพเลอร์ภายในที่แปลข้อความเป็นรหัสไบนารีภายในที่เครื่องเสมือนเข้าใจได้ สามารถส่งคำสั่ง G-code บรรทัดเดียวได้เช่นเดียวกับข้อความของโปรแกรม G-code ที่สมบูรณ์ คอมไพเลอร์จะประมวลผลข้อความทีละบรรทัดและส่งคำสั่งไปยัง Pipeline เพื่อให้เครื่องเสมือนดำเนินการ เครื่องเสมือนจะประมวลผลไปป์ไลน์ตามหลักการ "เข้าก่อนออกก่อน" (FIFO) Motion Controller มีความถี่ของลูปควบคุมที่กำหนดค่าได้ (เช่น 500 Hz) ซึ่งควบคุมประสิทธิภาพของระบบควบคุมการเคลื่อนไหวทั้งหมด อนุญาตให้ Application Process เดียวเชื่อมต่อกับ Motion Control Process เดียวเท่านั้น สามารถเรียกใช้ Motion Control Process ได้หลายกระบวนการโดยกำหนด shared_memory_id ที่ไม่ซ้ำกันให้แต่ละกระบวนการ Servopilot DLL API ไม่ปลอดภัยต่อเธรดหรือเข้าซ้ำได้ โปรแกรมแอปพลิเคชันสามารถเขียนด้วยภาษาการเขียนโปรแกรมใดก็ได้ที่รองรับการโหลดไลบรารีที่เชื่อมโยงแบบไดนามิก (DLL) ตัวเลือกทั่วไปคือ C++, Python, C#, MATLAB และ LabView.
API DLL ของเซอร์โวไพลอต
การเชื่อมต่อกับตัวควบคุมการเคลื่อนไหว
- extern “C” บูลีนเชื่อมต่อ (int shared_memory_id);
- extern “C” bool disconnect();
ฟังก์ชัน connect() จะแนบ DLL ของ Servopilot เข้ากับเซกเมนต์หน่วยความจำที่ใช้ร่วมกันซึ่งใช้สำหรับการสื่อสารระหว่างกระบวนการระหว่างกระบวนการแอปพลิเคชันและกระบวนการ Motion Controller กระบวนการ Motion Controller มี shared_memory_id ที่ไม่ซ้ำกัน ซึ่งเป็นเลขจำนวนเต็มที่กำหนดค่าไว้ล่วงหน้า ฟังก์ชันจะใช้ ID นี้เป็นอาร์กิวเมนต์เพียงตัวเดียว ฟังก์ชันจะคืนค่าเป็นจริงหากเซกเมนต์หน่วยความจำที่ใช้ร่วมกันพร้อมตัวระบุที่กำหนดได้สำเร็จ ฟังก์ชัน disconnect() จะแยก DLL ของ Servopilot ออกจากเซกเมนต์หน่วยความจำที่ใช้ร่วมกัน การเรียกใช้รูทีนนี้เมื่อสิ้นสุดกระบวนการแอปพลิเคชันนั้นเป็นทางเลือก
การส่งคำสั่ง G-code ไปยังกระบวนการ Motion Controller
- extern “C” bool gcode(const char* program_text);
- extern “C” bool gcode_replace(const char* program_text);
- extern “C” bool ดำเนินการ (const char* program_text);
- extern “C” bool ดำเนินการ_replace(const char* program_text);
ฟังก์ชัน gcode() จะผลักคำสั่ง G-code หรือคำสั่งหลายคำสั่งไปยังไปป์ไลน์ของกระบวนการ Motion Controller คำสั่ง G-code ก่อนหน้าทั้งหมดที่อยู่ในไปป์ไลน์จะถูกเก็บรักษาไว้ ไปป์ไลน์คือบัฟเฟอร์แบบ FIFO คำสั่งใหม่จะถูกผนวกเข้ากับไปป์ไลน์ที่จะดำเนินการหลังจากคำสั่งก่อนหน้าทั้งหมดจากไปป์ไลน์ถูกดำเนินการแล้ว ฟังก์ชันจะไม่รอให้คำสั่งถูกดำเนินการจริง แต่จะผลักคำสั่งไปยังไปป์ไลน์แล้วส่งคืน ฟังก์ชัน gcode_replace() จะล้างไปป์ไลน์ทั้งหมดก่อน จากนั้นจึงผลักคำสั่งใหม่เข้าไปในไปป์ไลน์เพื่อดำเนินการตามลำดับความสำคัญ เป็นผลให้ Motion Controller ขัดจังหวะการเคลื่อนไหวที่กำลังดำเนินอยู่ทั้งหมดและดำเนินการต่อทันทีด้วยการเคลื่อนไหวใหม่ที่กำหนดโดยคำสั่ง G-code ชุดใหม่ที่ได้รับ การแทนที่ดังกล่าวสามารถทำได้ด้วยความเร็วของความถี่ของลูปควบคุม เช่น สำหรับการควบคุมตามแรงบิด ฟังก์ชันจะไม่รอให้คำสั่งใหม่ถูกดำเนินการจริง ฟังก์ชันexecute() จะเหมือนกับฟังก์ชัน gcode() ยกเว้นว่าการเรียกใช้ฟังก์ชันนี้จะคืนค่าเมื่อดำเนินการคำสั่ง G-code ใหม่แล้วเท่านั้น โปรดทราบว่าคำสั่งก่อนหน้าทั้งหมดที่อยู่ในไพพ์ไลน์จะถูกดำเนินการก่อนtage ของ execut() เมื่อเทียบกับ gcode() อยู่ที่ความเรียบง่ายของกระแสการควบคุมแอปพลิเคชัน ข้อเสียtage คือการเรียก execut() อาจทำให้กระบวนการแอปพลิเคชันหยุดชะงักเป็นระยะเวลานาน นานเท่ากับเวลาที่ใช้ในการดำเนินการคำสั่ง G-code ทั้งหมดจากทุกไพล์ไลน์ ฟังก์ชัน execut_replace() จะเหมือนกับฟังก์ชัน gcode_replace() ยกเว้นว่าการเรียกฟังก์ชันจะคืนค่าหลังจากดำเนินการคำสั่งที่ส่งมาใหม่แล้วเท่านั้น
| ล้างคำสั่ง G-code ก่อนหน้าออกจากไปป์ไลน์ | รอจนกว่าคำสั่งใหม่จะถูกดำเนินการจริง จึงทำให้ระบบหยุดทำงาน ขั้นตอนการสมัคร | |
| จีโค้ด() | เลขที่ | เลขที่ |
| gcode_replace() | ใช่ | เลขที่ |
| ดำเนินการ() | เลขที่ | ใช่ |
| ดำเนินการแทนที่() | ใช่ | ใช่ |
ฟังก์ชันทั้งหมดจะคืนค่าเป็นจริงถ้าคำสั่ง G-code ใหม่ถูกส่งไปยังไปป์ไลน์ของกระบวนการ Motion Controller เพื่อดำเนินการสำเร็จแล้ว
การซิงโครไนซ์กระบวนการ
- extern “C” int synchronize();
ฟังก์ชัน synchronize() อนุญาตให้ Application Process รอจนกว่ากระบวนการ Motion Control จะเสร็จสิ้นการดำเนินการคำสั่ง G-code ที่ส่งมาก่อนหน้านี้ทั้งหมด การเรียกใช้ฟังก์ชันจะหยุดลงจนกว่าไพล์ไลน์ทั้งหมดจะว่างเปล่า การเรียกใช้นี้อาจทำให้ Application Process หยุดลงเป็นระยะเวลานาน นานเท่ากับระยะเวลาที่ใช้ในการดำเนินการคำสั่ง G-code ทั้งหมดจากไพล์ไลน์ทั้งหมด
การจัดการสถานะกระบวนการ
- extern “C” bool หยุดชั่วคราว();
- extern “C” bool resume();
- extern “C” bool รีเซ็ต();
- extern “C” int get_mode();
ฟังก์ชันเหล่านี้จัดการสถานะของกระบวนการ Motion Controller ฟังก์ชัน Pause() จะระงับการดำเนินการคำสั่ง G-code ของกระบวนการ Motion Controller ชั่วคราว ฟังก์ชันนี้ใช้เพื่อหยุดการทำงานของระบบหุ่นยนต์ การทำงานจะเริ่มต้นใหม่โดยใช้การเรียก resume()
| ผลลัพธ์ของ รับโหมด() เรียก | โหมดการทำงานที่สอดคล้องกันของตัวควบคุมการเคลื่อนไหว |
| 0 | ปิด |
| 1 | หยุดชั่วคราว |
| 2 | ความผิดพลาด |
| 3 | วิ่ง |
การวัดระยะไกลของแกน
- extern “C” double get_axis_cursor(int axis_number);
- extern “C” double get_axis_position(int axis_number);
- extern “C” int get_axis_work_zone_count(int axis_number);
- extern “C” int get_axis_fault_bits(int axis_number);
- extern “C” bool is_axis_online(int axis_number);
ฟังก์ชัน get_axis_cursor() ส่งคืนตำแหน่งอ้างอิงแบบหมุนหรือเชิงมุมที่ตัวควบคุมการเคลื่อนที่ส่งเป็นตำแหน่งที่สั่งการไปยังแกนในช่วงเวลาหนึ่ง ในทางตรงกันข้าม get_axis_position() ส่งคืนตำแหน่งการวัดระยะไกลจริงของแกน โดยที่แกนนั้นอยู่ในช่วงเวลาที่กำหนด เนื่องจากแกนมีความเฉื่อยทางกายภาพ ตำแหน่งแกน "เคอร์เซอร์" เสมือนของโปรแกรม G-code จึงมักจะอยู่ข้างหน้าตำแหน่งจริงของแกนทางกายภาพ ผลลัพธ์ของทั้ง get_axis_cursor() และ get_axis_position() จะถูกส่งกลับเป็นมิลลิเมตรหรือองศา ขึ้นอยู่กับประเภทของแกน (เชิงเส้นหรือหมุน) ฟังก์ชัน get_axis_work_zone_count() ส่งคืนตำแหน่งแกนการวัดระยะไกลเป็นจำนวนตัวเข้ารหัส ฟังก์ชัน get_axis_fault_bits() ส่งคืนข้อมูลบิตความผิดพลาดที่ได้รับจากแกนผ่านการวัดระยะไกล โปรดดูข้อมูลอ้างอิงอุปกรณ์ของเซอร์โวไดรฟ์ของคุณสำหรับข้อมูลเกี่ยวกับวิธีการตีความค่าที่ส่งคืน ศูนย์ (0) หมายถึง "ไม่มีข้อผิดพลาด" ค่าที่ไม่ใช่ศูนย์ (!=0) หมายถึงมีข้อผิดพลาดบางประการในแกน ฟังก์ชัน is_axis_online() จะบอกว่าตัวควบคุมเซอร์โวของแกนกำลังส่งสัญญาณการวัดระยะไกลบนเครือข่าย CAN หรือ USB หรือไม่
Exampการประยุกต์ใช้งานใน Python

- เยี่ยมชมเราได้ที่ www.servosila.com/en/motion-control
และ - ยูทูป : http://www.youtube.com/user/servosila
- www.servosila.com
เอกสาร / แหล่งข้อมูล
![]() |
เซอร์โวซิล่า ตัวควบคุมการเคลื่อนที่ [พีดีเอฟ] คู่มือการใช้งาน ตัวควบคุมการเคลื่อนที่, ตัวควบคุม |

