SERVOSILA 运动控制器

关于Servosila运动控制器
Servosila 运动控制器是用于控制现代多轴机器人系统运动的嵌入式软件。 该软件可以在 Linux、Windows 上运行,也可以作为嵌入式 MCU 上的固件运行。
Servosila 运动控制器使用 G 代码用于以下目的:
- 作为一种以文本格式定义协调运动几何形状的方法,
- 作为运动控制器和更高级别用户应用程序之间的高级通信协议,
- 作为用于编程多轴机器人系统的简单脚本语言,
- 作为生成式人工智能和法学硕士的目标语言。
软件架构
Servosila 运动控制器(在下面的架构图中显示为灰色框)在 Linux 或 Windows 中作为后台进程运行。 该过程通过 CAN 或 USB 网络与伺服驱动器通信。 运动控制器进程提供低延迟共享内存接口,用于与单个应用程序进程进行进程间通信,如图中的白框所示。 为了抽象化共享内存接口的复杂性,运动控制器提供了一个称为 Servopilot DLL 的动态链接库。 “瘦”DLL 公开了一个更简单的 API(与共享内存接口相比),用于向运动控制器提交 G 代码命令并接收回遥测和状态信息。 本文档中描述了 DLL API。
在内部,运动控制器进程具有管道 0 和管道 1,用于从应用程序进程接收 G 代码命令。 管道是固定大小的循环缓冲区。 有两个管道,以便在需要时可以并行执行两个独立的 G 代码命令流。 当提交新的 G 代码命令时,应用程序进程可以选择将该命令附加到一个管道或另一个管道,或者用一组新命令替换管道中的命令。 G 代码命令由虚拟机(运动控制器进程的内部组件)执行。 由于 G 代码命令由应用程序进程以文本形式提交,因此有一个内部编译器将文本转换为虚拟机可以理解的内部二进制代码。 可以提交单行 G 代码命令以及完整的 G 代码程序文本。 编译器逐行处理文本并将命令推送到管道中以供虚拟机执行。 虚拟机按照“先进先出”(FIFO) 的方式处理管道。 运动控制器具有可配置的控制环路频率(例如500 Hz),用于控制整个运动控制系统的性能。 单个应用程序进程仅允许附加到单个运动控制进程。 通过为多个运动控制进程分配唯一的共享内存 ID,可以运行多个运动控制进程。 Servopilot DLL API 不是线程安全的或可重入的。 应用程序可以用任何支持加载动态链接库(DLL)的编程语言编写。 典型的选择是 C++、Python、C#、MATLAB 和 LabView.
舵机 DLL API
连接至运动控制器
- extern “C” bool connect(int共享内存_id);
- 外部“C”布尔断开();
connect() 函数将 Servopilot DLL 连接到共享内存段,用于应用程序进程和运动控制器进程之间的进程间通信。 运动控制器进程有一个唯一的shared_memory_id,一个预先配置的整数。 该函数将此 ID 作为唯一的参数。 如果已成功附加具有给定标识符的共享内存段,则该函数返回 true。 connect() 函数将 Servopilot DLL 从共享内存段中分离出来。 在应用程序进程结束时调用此例程是可选的。
向运动控制器进程提交 G 代码命令
- extern “C” bool gcode(const char* program_text);
- extern “C” bool gcode_replace(const char* program_text);
- extern“C”布尔执行(const char*program_text);
- extern“C”boolexecute_replace(const char*program_text);
gcode() 函数将一个或多个 G 代码命令推送到运动控制器进程的管道。 管道中所有先前的 G 代码命令都将被保留。 管道是 FIFO 循环缓冲区。 新命令将附加到管道中,以便在执行管道中的所有先前命令后执行。 该函数并不等待命令被实际执行; 它只是将命令推送到管道并返回。 gcode_replace()函数首先清除所有管道,然后将新命令推入管道中优先执行。 因此,运动控制器会中断所有正在进行的运动,并立即继续由新接收到的 G 代码命令组定义的新运动。 这种替换可以通过控制环频率的速度来完成,例如用于基于扭矩的控制。 该函数不会等待新命令被实际执行。 execute() 函数与 gcode() 相同,只是该函数的调用仅在新的 G 代码命令执行后才返回。 请注意,首先执行管道中已经存在的所有先前命令。 一个先进的tag与 gcode() 相比,execute() 的优点在于应用程序控制流的简单性。 缺点tage 是,execute() 调用可能会使应用程序进程停滞很长一段时间,其持续时间与执行所有管道中的所有 G 代码命令所需的时间一样长。 execute_replace() 函数与 gcode_replace() 函数相同,只是该函数的调用仅在执行新提交的命令后才返回。
| 清除先前 G 代码命令的管道 | 等待新命令实际执行,从而停止 申请流程 | |
| 代码() | 不 | 不 |
| gcode_replace() | 是的 | 不 |
| 执行() | 不 | 是的 |
| 执行替换() | 是的 | 是的 |
如果新的 G 代码命令已成功提交到运动控制器进程的管道以供执行,则所有函数都会返回 true。
进程同步
- extern“C”int 同步();
Synchronize() 函数允许应用程序进程等待,直到运动控制进程完成执行所有先前提交的 G 代码命令。 该函数的调用将停止,直到所有管道都为空。 此调用可能会使应用程序进程停滞很长一段时间,其持续时间与执行所有管道中的所有 G 代码命令所需的时间一样长。
进程状态管理
- 外部“C”布尔暂停();
- 外部“C”布尔恢复();
- 外部“C”布尔重置();
- extern “C” int get_mode();
这些函数管理运动控制器进程的状态。 pause() 函数暂时挂起运动控制器进程执行 G 代码命令。 该功能用于暂停机器人系统的操作。 使用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代码程序的虚拟“光标”轴位置通常领先于物理轴的实际位置。 get_axis_cursor() 和 get_axis_position() 的结果均以毫米或度为单位返回,具体取决于轴类型(线性或旋转)。 get_axis_work_zone_count() 函数返回编码器计数中的遥测轴位置。 get_axis_fault_bits() 函数返回通过遥测从轴接收的故障位数据。 有关如何解释返回值的信息,请参阅伺服驱动器的设备参考。 零 (0) 表示“无故障”。 非零 (!=0) 表示轴中存在某种故障。 is_axis_online() 函数告知轴的伺服控制器是否正在 CAN 或 USB 网络上广播遥测数据。
ExampPython 中的文件应用程序

- 请访问我们 www.servosila.com/en/motion-control
和 - YouTube: http://www.youtube.com/user/servosila
- www.servosila.com
文件/资源
![]() |
SERVOSILA 运动控制器 [pdf] 使用说明书 运动控制器、控制器 |

