Controlador de movemento SERVOSILA

Acerca de Servosila Motion Controller
Servosila Motion Controller é un software integrado para controlar o movemento dos modernos sistemas robóticos multieixes. O software funciona en Linux, Windows ou como firmware en MCUs integrados.
Servosila Motion Controller usa o código G para os seguintes propósitos:
- como unha forma de definir a xeometría de movementos coordinados nun formato de texto,
- como un protocolo de comunicacións de alto nivel entre o controlador de movemento e aplicacións de usuario de nivel superior,
- como unha linguaxe de script simple para programar sistemas robóticos multieixes,
- como lingua de destino para IA xerativa e LLM.
Arquitectura de software
Servosila Motion Controller, mostrado como unha caixa gris nun diagrama de arquitectura a continuación, execútase como un proceso en segundo plano en Linux ou Windows. O proceso se comunica cos servounidades a través da rede CAN ou USB. O proceso Motion Controller proporciona unha interface de memoria compartida de baixa latencia para a comunicación entre procesos cun único proceso de aplicación, que se mostra como unha caixa branca no diagrama. Para abstraer as complexidades da interface de memoria compartida, co Motion Controller ofrécese unha biblioteca ligada dinámicamente chamada Servopilot DLL. A DLL "delgada" expón unha API moito máis sinxela (en comparación coa interface de memoria compartida) para enviar comandos de código G ao controlador de movemento e para recibir información de telemetría e estado de volta. A API DLL descríbese neste documento.
Internamente, o proceso do controlador de movemento ten un Pipeline 0 e un Pipeline 1 para recibir comandos de código G dun proceso de aplicación. As canalizacións son amortiguadores cíclicos de tamaño fixo. Hai dúas canalizacións para que se poidan executar en paralelo dous fluxos independentes de comandos de código G se é necesario. Ao enviar un novo comando de código G, un proceso de aplicación pode optar por engadir o comando a unha canalización ou a outra ou substituír as ordes dunha canalización por un novo conxunto de comandos. Os comandos do código G son executados por unha máquina virtual, un compoñente interno do proceso do controlador de movemento. Dado que os comandos de código G son enviados por un proceso de aplicación nun formulario de texto, hai un compilador interno que traduce o texto a un código binario interno que entende a máquina virtual. É posible enviar un comando de código G dunha soa liña, así como o texto dun programa completo de código G. O compilador procesa os textos liña por liña e empurra os comandos a canalizacións para a súa execución pola máquina virtual. A Máquina Virtual procesa as canalizacións de xeito "primeiro en entrar, primeiro en saír" (FIFO). O controlador de movemento ten unha frecuencia de bucle de control configurable (por exemplo, 500 Hz) que rexe o rendemento de todo o sistema de control de movemento. Un único proceso de solicitude só se pode asociar a un único proceso de control de movemento. É posible executar varios procesos de control de movemento asignándolles un shared_memory_id único. A API de DLL de Servopilot non é segura para fíos nin é reentrante. Os programas de aplicación pódense escribir en calquera linguaxe de programación que admita a carga de bibliotecas ligadas dinámicamente (DLL). As opcións típicas son C++, Python, C#, MATLAB e LabView.
Servopilot DLL API
Conexión ao controlador de movemento
- externo "C" bool connect(int shared_memory_id);
- externo “C” bool desconectar();
A función connect() conecta a DLL de Servopilot a un segmento de memoria compartida que se usa para a comunicación entre procesos entre un proceso de aplicación e o proceso do controlador de movemento. O proceso do controlador de movemento ten un shared_memory_id único, un número enteiro preconfigurado. A función toma este ID como único argumento. A función devolve verdadeiro se un segmento de memoria compartida co identificador indicado foi conectado correctamente. A función disconnect() separa a DLL de Servopilot do segmento de memoria compartida. Chamar a esta rutina ao final dun proceso de solicitude é opcional.
Enviar comandos de código G ao proceso Motion Controller
- externo “C” bool gcode(const char* program_text);
- extern “C” bool gcode_replace (const char* program_text);
- extern “C” bool execute (const char* program_text);
- extern “C” bool execute_replace(const char* program_text);
A función gcode() enviou un comando de código G ou varios comandos ás canalizacións do proceso do controlador de movemento. Consérvanse todos os comandos de código G anteriores que estiveron sentados en canalizacións. Unha canalización é un buffer cíclico FIFO. Os novos comandos engádense ás canalizacións que se executarán despois de que se executasen todas as ordes anteriores da canalización. A función non agarda a que os comandos sexan realmente executados; só empurra os comandos ás canalizacións e volve. A función gcode_replace() borra primeiro todas as canalizacións e despois empurra novos comandos nas canalizacións para a súa execución prioritaria. Como resultado, o Motion Controller interrompe todos os movementos en curso e continúa inmediatamente con novos movementos definidos por ordes de código G definidas recentemente. Tal substitución pódese facer coa velocidade da frecuencia do bucle de control, por exemplo, para o control baseado en par. A función non agarda a que se executen realmente os novos comandos. A función execute() é a mesma que gcode() excepto que a chamada da función só devolve unha vez que se executaron os novos comandos do código G. Teña en conta que todos os comandos anteriores que xa estiveron sentados nos pipelines execútanse primeiro. Un avancetage de execute() sobre gcode() está na simplicidade do fluxo de control da aplicación. Unha desvantaxetagÉ que unha chamada a execute() pode deter o proceso de aplicación durante un período prolongado, durante todo o tempo necesario para executar todos os comandos de código G de todas as canalizacións. A función execute_replace() é a mesma que a función gcode_replace() excepto que a chamada da función só devolve despois de que se executen as ordes recentemente enviadas.
| Borra a canalización de comandos de código G anteriores | Agarda ata que os novos comandos sexan realmente executados, polo que se paraliza Proceso de solicitude | |
| gcode() | Non | Non |
| gcode_replace() | Si | Non |
| executar () | Non | Si |
| execute_replace() | Si | Si |
Todas as funcións devolven verdadeiras se os novos comandos de código G foron enviados con éxito ás canalizacións do proceso do controlador de movemento para a súa execución.
Sincronización de procesos
- extern “C” int synchronize();
A función synchronize() permite que o proceso de aplicación espere ata que o proceso de control de movemento remate de executar todos os comandos de código G enviados anteriormente. A chamada da función deténgase ata que todas as canalizacións estean baleiras. Esta chamada pode paralizar o proceso de solicitude durante un período prolongado, durante todo o tempo que sexa necesario para executar todos os comandos de código G de todas as canalizacións.
Xestión do estado do proceso
- externo “C” bool pausa();
- externo “C” bool resume();
- externo "C" bool reset();
- extern “C” int get_mode();
Estas funcións xestionan o estado do proceso do controlador de movemento. A función pause() suspende temporalmente a execución de comandos de código G polo proceso do controlador de movemento. Esta función úsase para pausar o funcionamento dun sistema robótico. A operación reiniciarase mediante unha chamada a resume().
| Resultado de a get_mode() chamar | Un modo de operación correspondente do controlador de movemento |
| 0 | DESACTIVADO |
| 1 | PAUSA |
| 2 | FALTA |
| 3 | CORRANDO |
Telemetría de Eixos
- externo “C” double get_axis_cursor(int número_eixe);
- externo “C” double get_axis_position(int número_eixe);
- extern “C” int get_axis_work_zone_count (int número_eixe);
- extern “C” int get_axis_fault_bits(int número_eixe);
- extern “C” bool is_axis_online(int axis_number);
A función get_axis_cursor() devolve unha posición de referencia rotativa ou angular que o controlador de movemento transmite como posición comandada ao eixe nun momento determinado. Pola contra, get_axis_position() devolve unha posición de telemetría real do eixe, onde o eixe está fisicamente nun momento dado. Dado que os eixes teñen inercia física, a posición do eixe "cursor" virtual do programa de código G adoita estar por diante da posición real do eixe físico. Os resultados de get_axis_cursor() e get_axis_position() devólvense en milímetros ou graos dependendo do tipo de eixe (lineal ou rotativo). A función get_axis_work_zone_count() devolve a posición do eixe de telemetría nos recontos do codificador. A función get_axis_fault_bits() devolve os datos de Bits de falla recibidos do eixe mediante telemetría. Consulte a Referencia do dispositivo da súa servounidade para obter información sobre como interpretar o valor devolto. Cero (0) significa "Sen falla". Non cero (!=0) significa algún tipo de fallo no eixe. A función is_axis_online() indica se o servocontrolador do eixe está a transmitir telemetría na rede CAN ou USB.
Example Aplicación en Python

- Visítanos en www.servosila.com/en/motion-control
e - YouTube: http://www.youtube.com/user/servosila
- www.servosila.com
Documentos/Recursos
![]() |
Controlador de movemento SERVOSILA [pdfManual de instrucións Controlador de movemento, controlador |

