Controller di movimento SERVOSILA
Informazioni sul controller di movimento Servosila
Servosila Motion Controller è un software integrato per il controllo del movimento dei moderni sistemi robotici multiasse. Il software funziona su Linux, Windows o come firmware su MCU incorporati.
Servosila Motion Controller utilizza il codice G per i seguenti scopi:
- come un modo per definire la geometria dei movimenti coordinati in un formato testo,
- come protocollo di comunicazione di alto livello tra il Motion Controller e le applicazioni utente di livello superiore,
- come semplice linguaggio di scripting per la programmazione di sistemi robotici multiasse,
- come linguaggio di destinazione per l'intelligenza artificiale generativa e i LLM.
Architettura del software
Servosila Motion Controller, mostrato come un riquadro grigio nel diagramma dell'architettura riportato di seguito, viene eseguito come processo in background in Linux o Windows. Il processo comunica con i servoazionamenti tramite rete CAN o USB. Il processo Motion Controller fornisce un'interfaccia di memoria condivisa a bassa latenza per la comunicazione tra processi con un singolo processo applicativo, mostrato come una casella bianca nel diagramma. Per eliminare le complessità dell'interfaccia di memoria condivisa, con il Motion Controller viene fornita una libreria collegata dinamicamente chiamata Servopilot DLL. La DLL "sottile" espone un'API molto più semplice (rispetto all'interfaccia di memoria condivisa) per inviare comandi G-code al Motion Controller e per ricevere informazioni di telemetria e stato. L'API DLL è descritta in questo documento.
Internamente, il processo del Motion Controller ha una Pipeline 0 e una Pipeline 1 per ricevere comandi G-code da un processo applicativo. Le pipeline sono buffer ciclici di dimensione fissa. Sono presenti due pipeline in modo che due flussi indipendenti di comandi G-code possano essere eseguiti in parallelo, se necessario. Quando si invia un nuovo comando del codice G, un processo di applicazione può scegliere di aggiungere il comando a una pipeline o all'altra o di sostituire i comandi in una pipeline con un nuovo set di comandi. I comandi del codice G vengono eseguiti da una macchina virtuale, un componente interno del processo Motion Controller. Poiché i comandi del codice G vengono inviati da un processo applicativo in forma di testo, esiste un compilatore interno che traduce il testo in un codice binario interno compreso dalla macchina virtuale. È possibile inviare un comando in codice G a riga singola così come il testo di un programma in codice G completo. Il compilatore elabora i testi riga per riga e inserisce i comandi nelle pipeline per l'esecuzione da parte della macchina virtuale. La macchina virtuale elabora le pipeline in base al principio "first in, first out" (FIFO). Il Motion Controller ha una frequenza del circuito di controllo configurabile (ad esempio 500 Hz) che governa le prestazioni dell'intero sistema di controllo del movimento. Un singolo processo applicativo può essere collegato solo a un singolo processo Motion Control. È possibile eseguire più processi Motion Control assegnando loro shared_memory_id univoci. L'API DLL Servopilot non è thread-safe né rientrante. I programmi applicativi possono essere scritti in qualsiasi linguaggio di programmazione che supporti il caricamento di librerie collegate dinamicamente (DLL). Le scelte tipiche sono C++, Python, C#, MATLAB e LabView.
API DLL del servopilota
Collegamento al controller di movimento
- extern “C” bool connect(int shared_memory_id);
- extern “C” bool disconnesso();
La funzione connect() collega la DLL Servopilot a un segmento di memoria condivisa utilizzato per la comunicazione interprocesso tra un processo applicativo e il processo Motion Controller. Il processo Motion Controller ha un shared_memory_id univoco, un numero intero preconfigurato. La funzione accetta questo ID come unico argomento. La funzione restituisce true se un segmento di memoria condivisa con l'identificatore specificato è stato collegato con successo. La funzione disconnessione() scollega la DLL Servopilot dal segmento di memoria condivisa. La chiamata a questa routine al termine di un processo di candidatura è facoltativa.
Invio dei comandi del codice G al processo del Motion Controller
- extern “C” bool gcode(const char* testo_programma);
- extern “C” bool gcode_replace(const char* program_text);
- extern “C” bool esegui (const char* testo_programma);
- extern “C” bool esegui_sostituisci(const char* testo_programma);
La funzione gcode() ha inviato un comando G-code o più comandi alle pipeline del processo Motion Controller. Tutti i precedenti comandi del codice G presenti nelle pipeline vengono conservati. Una pipeline è un buffer ciclico FIFO. I nuovi comandi vengono aggiunti alle pipeline per essere eseguiti dopo che tutti i comandi precedenti della pipeline sono stati eseguiti. La funzione non attende l'effettiva esecuzione dei comandi; invia semplicemente i comandi alle pipeline e ritorna. La funzione gcode_replace() prima cancella tutte le pipeline e poi inserisce nuovi comandi nelle pipeline per l'esecuzione prioritaria. Di conseguenza, il Motion Controller interrompe tutti i movimenti in corso e continua immediatamente con i nuovi movimenti definiti dai comandi del codice G impostati appena ricevuti. Tale sostituzione può essere effettuata con la velocità della frequenza del circuito di controllo, ad es. G. per il controllo basato sulla coppia. La funzione non attende l'effettiva esecuzione dei nuovi comandi. La funzione eseguite() è uguale a gcode() tranne per il fatto che la chiamata della funzione restituisce solo una volta eseguiti i nuovi comandi del codice G. Tieni presente che tutti i comandi precedenti già presenti nelle pipeline vengono eseguiti per primi. Un vantaggiotagLa caratteristica di eseguire() su gcode() sta nella semplicità del flusso di controllo dell'applicazione. Uno svantaggiotage è che una chiamata di esecuzione() può bloccare il processo di applicazione per un periodo prolungato, per tutto il tempo necessario per eseguire tutti i comandi del codice G da tutte le pipeline. La funzioneexecute_replace() è uguale alla funzione gcode_replace() tranne per il fatto che la chiamata della funzione ritorna solo dopo che i comandi appena inviati sono stati eseguiti.
Cancella la pipeline dei precedenti comandi del codice G | Attende finché i nuovi comandi non vengono effettivamente eseguiti, bloccando così il Processo di candidatura | |
codice g() | NO | NO |
gcode_replace() | SÌ | NO |
eseguire() | NO | SÌ |
esegui_sostituisci() | SÌ | SÌ |
Tutte le funzioni restituiscono true se i nuovi comandi del codice G sono stati inviati con successo alle pipeline del processo Motion Controller per l'esecuzione.
Sincronizzazione dei processi
- extern “C” int sincronizza();
La funzione sincronizza() consente al processo di applicazione di attendere finché il processo di controllo del movimento non termina l'esecuzione di tutti i comandi del codice G precedentemente inviati. La chiamata della funzione si blocca finché tutte le pipeline non sono vuote. Questa chiamata potrebbe bloccare il processo di candidatura per un periodo prolungato, per tutto il tempo necessario per eseguire tutti i comandi del codice G da tutte le pipeline.
Gestione dello stato del processo
- extern “C” bool pause();
- extern “C” bool curriculum();
- extern “C” bool reset();
- extern “C” int get_mode();
Queste funzioni gestiscono lo stato del processo del Motion Controller. La funzione pause() sospende temporaneamente l'esecuzione dei comandi del codice G da parte del processo Motion Controller. Questa funzione viene utilizzata per mettere in pausa il funzionamento di un sistema robotico. L'operazione viene riavviata utilizzando una chiamata curriculum().
Risultato di a get_mode() chiamata | Una modalità di funzionamento corrispondente del Motion Controller |
0 | SPENTO |
1 | IN PAUSA |
2 | COLPA |
3 | CORSA |
Telemetria degli assi
- extern “C” double get_axis_cursor(int numero_asse);
- extern “C” double get_axis_position(int numero_asse);
- extern “C” int get_axis_work_zone_count(int numero_asse);
- extern “C” int get_axis_fault_bits(int numero_asse);
- extern “C” bool is_axis_online(int numero_asse);
La funzione get_axis_cursor() restituisce una posizione di riferimento rotativa o angolare che il Motion Controller trasmette come posizione comandata all'asse in un momento particolare. Al contrario, get_axis_position() restituisce una posizione telemetrica effettiva dell'asse, dove l'asse si trova fisicamente in un dato momento. Poiché gli assi hanno un'inerzia fisica, la posizione dell'asse virtuale del "cursore" del programma G-code è solitamente davanti alla posizione effettiva dell'asse fisico. I risultati di get_axis_cursor() e get_axis_position() vengono restituiti in millimetri o gradi a seconda del tipo di asse (lineare o rotativo). La funzione get_axis_work_zone_count() restituisce la posizione dell'asse telemetrico nei conteggi dell'encoder. La funzione get_axis_fault_bits() restituisce i dati sui bit di errore ricevuti dall'asse tramite telemetria. Fare riferimento al riferimento del dispositivo del servoazionamento per informazioni su come interpretare il valore restituito. Zero (0) significa “Nessun errore”. Diverso da zero (!=0) indica una sorta di guasto nell'asse. La funzione is_axis_online() indica se il servocontrollore dell'asse sta trasmettendo o meno la telemetria sulla rete CAN o USB.
Example Applicazione in Python
- Venite a trovarci a www.servosila.com/en/motion-control
E - Italiano: http://www.youtube.com/user/servosila
- www.servosila.com
Documenti / Risorse
![]() |
Controller di movimento SERVOSILA [pdf] Manuale di istruzioni Controller di movimento, controller |