
SERVOSILA Bewegingsbeheerder

Oor Servosila Motion Controller
Servosila Motion Controller is ingebedde sagteware vir die beheer van beweging van moderne multi-assige robotstelsels. Die sagteware loop op Linux, Windows of as 'n firmware op ingebedde MCU's.
Servosila Motion Controller gebruik G-kode vir die volgende doeleindes:
- as 'n manier om meetkunde van gekoördineerde bewegings in 'n teksformaat te definieer,
- as 'n hoëvlak kommunikasie protokol tussen die Motion Controller en hoërvlak gebruikerstoepassings,
- as 'n eenvoudige skriftaal vir die programmering van multi-as robotstelsels,
- as 'n teikentaal vir generatiewe KI en LLM's.
Sagteware argitektuur
Servosila Motion Controller, getoon as 'n grys blokkie op 'n argitektuurdiagram hieronder, loop as 'n agtergrondproses in Linux of Windows. Die proses kommunikeer met servo-aandrywers via CAN- of USB-netwerk. Die Motion Controller-proses bied 'n lae-latency gedeelde geheue-koppelvlak vir interproseskommunikasie met 'n enkele toepassingsproses, getoon as 'n wit blokkie op die diagram. Om kompleksiteite van die gedeelde geheue-koppelvlak weg te abstraheer, word 'n dinamies gekoppelde biblioteek genaamd Servopilot DLL, met die Motion Controller voorsien. Die "dun" DLL stel 'n baie eenvoudiger API bloot (in vergelyking met die gedeelde geheue-koppelvlak) vir die indiening van G-kode-opdragte aan die Bewegingsbeheerder en om telemetrie- en statusinligting terug te ontvang. Die DLL API word in hierdie dokument beskryf.
Intern het die Motion Controller-proses 'n Pyplyn 0 en 'n Pyplyn 1 vir die ontvangs van G-kode-opdragte vanaf 'n Aansoekproses. Die pyplyne is sikliese buffers van 'n vaste grootte. Daar is twee pyplyne sodat twee onafhanklike strome G-kode opdragte parallel uitgevoer kan word indien nodig. Wanneer 'n nuwe G-kode-opdrag ingedien word, kan 'n Aansoekproses kies om die opdrag by een pyplyn of die ander te voeg of om opdragte in 'n pyplyn te vervang met 'n nuwe stel opdragte. Die G-kode opdragte word uitgevoer deur 'n virtuele masjien, 'n interne komponent van die Motion Controller proses. Aangesien G-kode opdragte deur 'n Aansoekproses in 'n teksvorm ingedien word, is daar 'n interne samesteller wat die teks vertaal in 'n interne binêre kode wat deur die virtuele masjien verstaan word. Dit is moontlik om 'n enkelreël G-kode opdrag sowel as die teks van 'n volledige G-kode program in te dien. Die samesteller verwerk die tekste reël-vir-reël en stoot die opdragte in pyplyne vir uitvoering deur die virtuele masjien. Die virtuele masjien verwerk die pyplyne op 'n "eerste in, eerste uit"-basis (EIEU). Die Bewegingsbeheerder het 'n konfigureerbare beheerlusfrekwensie (bv. 500 Hz) wat die werkverrigting van die hele bewegingsbeheerstelsel beheer. 'n Enkele Aansoekproses word slegs toegelaat om aan 'n enkele Bewegingsbeheerproses te koppel. Dit is moontlik om verskeie bewegingsbeheerprosesse uit te voer deur unieke shared_memory_id's aan hulle toe te ken. Die Servopilot DLL API is nie draadveilig of hertoetreeder nie. Die toepassingsprogramme kan in enige programmeertaal geskryf word wat die laai van dinamies gekoppelde biblioteke (DLL) ondersteun. Die tipiese keuses is C++, Python, C#, MATLAB en LabView.
Servopilot DLL API
Koppel aan Motion Controller
- eksterne "C" bool connect (int shared_memory_id);
- eksterne "C" bool ontkoppel ();
Die connect() funksie heg Servopilot DLL aan 'n gedeelde geheue segment wat gebruik word vir interproses kommunikasie tussen 'n Aansoek proses en die Motion Controller proses. Die Motion Controller-proses het 'n unieke shared_memory_id, 'n voorafgekonfigureerde heelgetalnommer. Die funksie neem hierdie ID as die enigste argument. Die funksie gee waar as 'n gedeelde geheuesegment met die gegewe identifiseerder suksesvol aan geheg is. Die disconnect() funksie maak Servopilot DLL los van die gedeelde geheue segment. Die oproep van hierdie roetine aan die einde van 'n Aansoekproses is opsioneel.
Die indiening van G-kode-opdragte aan die Motion Controller-proses
- eksterne "C" bool gcode (const char* program_text);
- eksterne “C” bool gcode_replace(const char* program_text);
- eksterne “C” bool uitvoer (const char* program_text);
- eksterne "C" bool execute_replace (const char* program_text);
Die gcode()-funksie het 'n G-kode-opdrag of veelvuldige opdragte na die pyplyne van die Motion Controller-proses gedruk. Alle vorige G-kode opdragte wat in die pyplyne gesit het, word bewaar. 'n Pyplyn is EIEU sikliese buffer. Die nuwe opdragte word by die pyplyne aangeheg om uitgevoer te word nadat al die vorige opdragte vanaf die pyplyn uitgevoer is. Die funksie wag nie vir die opdragte om werklik uitgevoer te word nie; dit druk net die opdragte na die pyplyne en keer terug. Die gcode_replace()-funksie maak eers al die pyplyne skoon en stoot dan nuwe opdragte in die pyplyne vir prioriteituitvoering. As gevolg hiervan, onderbreek die Bewegingsbeheerder alle deurlopende bewegings en gaan onmiddellik voort met nuwe bewegings wat gedefinieer word deur 'n nuut ontvangde stel G-kode opdragte. So 'n vervanging kan gedoen word met die spoed van beheerlusfrekwensie, bv. vir wringkrag-gebaseerde beheer. Die funksie wag nie vir die nuwe opdragte om werklik uitgevoer te word nie. Die execute()-funksie is dieselfde as gcode() behalwe dat die funksie se oproep slegs terugkeer sodra die nuwe G-kode-opdragte uitgevoer is. Let daarop dat alle vorige opdragte wat reeds in die pyplyne gesit het, eerste uitgevoer word. 'n Advantage van execute() oor gcode() is in die eenvoud van toepassingsbeheervloei. 'n Nadeeltage is dat 'n execute()-oproep die Aansoekproses vir 'n lang tydperk kan stop, vir soveel tyd as wat dit neem om alle G-kode-opdragte vanaf al die pyplyne uit te voer. Die execute_replace()-funksie is dieselfde as die gcode_replace()-funksie, behalwe dat die funksie se oproep eers terugkeer nadat die nuut-ingelegde opdragte uitgevoer is.
| Vee die pyplyn van vorige G-kode-opdragte uit | Wag totdat die nuwe opdragte werklik uitgevoer word, en sodoende word die Aansoekproses | |
| gcode() | Nee | Nee |
| gcode_replace() | Ja | Nee |
| uitvoer() | Nee | Ja |
| uitvoer_vervang() | Ja | Ja |
Al die funksies keer waar as die nuwe G-kode-opdragte suksesvol aan die pyplyne van die Motion Controller-proses voorgelê is vir uitvoering.
Prosessinchronisasie
- extern "C" int sinchroniseer();
Die sinchronize()-funksie laat die Aansoekproses toe om te wag totdat die Motion Control-proses klaar is met die uitvoer van alle voorheen ingediende G-kode-opdragte. Die funksie se oproep stop totdat alle pyplyne leeg is. Hierdie oproep kan die Aansoekproses vir 'n lang tydperk tot stilstand bring, vir soveel tyd as wat dit neem om alle G-kode-opdragte vanaf al die pyplyne uit te voer.
Proses Staatsbestuur
- eksterne "C" bool pause();
- eksterne "C" bool CV ();
- eksterne "C" bool reset();
- eksterne "C" int get_mode();
Hierdie funksies bestuur die toestand van die Motion Controller-proses. Die pause()-funksie skort die uitvoering van G-kode-opdragte deur die Motion Controller-proses tydelik op. Hierdie funksie word gebruik om die werking van 'n robotstelsel te onderbreek. Die operasie word herbegin met 'n resume() oproep.
| Resultaat van 'n kry_modus() bel | 'n Ooreenstemmende modus van werking van die Bewegingsbeheerder |
| 0 | AF |
| 1 | ONDERBREK |
| 2 | FOUT |
| 3 | HARDLOOP |
Asse-telemetrie
- eksterne "C" dubbel get_as_cursor(int as_number);
- eksterne "C" dubbel kry_as_posisie (int as_nommer);
- eksterne "C" int get_axis_work_zone_count(int axis_number);
- eksterne "C" int get_axis_fault_bits(int as_number);
- eksterne "C" bool is_axis_online(int axis_number);
Die funksie get_axis_cursor() gee 'n roterende of 'n hoekverwysingsposisie terug wat die Bewegingsbeheerder as 'n opdragposisie na die as op 'n spesifieke oomblik oordra. In teenstelling hiermee gee get_axis_position() 'n werklike telemetrieposisie van die as terug, waar die as fisies op 'n gegewe oomblik is. Aangesien asse fisiese traagheid het, is die G-kode-program se virtuele “wyser”-asposisie gewoonlik voor die fisiese as se werklike posisie. Die resultate van beide get_axis_cursor() en get_axis_position() word in millimeter of grade teruggegee, afhangende van die astipe (lineêr of roterend). Die get_axis_work_zone_count() funksie gee die telemetrie-asposisie terug in enkodeerdertellings. Die get_axis_fault_bits()-funksie gee 'n Fault Bits-data terug wat vanaf die as via telemetrie ontvang is. Verwys na jou servoaandrywer se Device Reference vir inligting oor hoe om die teruggekeerde waarde te interpreteer. Nul (0) beteken “Geen Fout”. Nie-nul (!=0) beteken 'n soort fout in die as. Die is_axis_online()-funksie vertel of die as se servobeheerder telemetrie op die CAN- of USB-netwerk uitsaai of nie.
Example Toepassing in Python

- Besoek ons by www.servosila.com/en/motion-control
en - YouTube: http://www.youtube.com/user/servosila
- www.servosila.com
Dokumente / Hulpbronne
![]() | Bewegingsbeheerder |
Verwysings
- Gebruikershandleidingmanual.tools

