以下是一个基于国产运动控制器(以雷赛 DMC 系列为例)的两轴插补运动例程,实现矩形轨迹的自动运行,包含初始化、参数配置、运动控制等完整流程,可作为基础模板修改使用。
#include "DMC.h" // 引入运动控制器库文件
#include <stdio.h>
// 定义轴号
#define X_AXIS 0 // X轴
#define Y_AXIS 1 // Y轴
// 矩形轨迹参数(单位:mm)
#define WIDTH 100 // 矩形宽度
#define HEIGHT 50 // 矩形高度
#define SPEED 50 // 运动速度 (mm/s)
#define ACCEL 100 // 加速度 (mm/s²)
#define DECEL 100 // 减速度 (mm/s²)
// 函数声明
void MotionController_Init(); // 控制器初始化
void Axis_Config(int axis); // 轴参数配置
void Rectangle_Trajectory(); // 矩形轨迹运动
void Error_Check(int result, const char* msg);// 错误检查
int main()
{
int ret;
// 初始化控制器
MotionController_Init();
// 配置X、Y轴参数
Axis_Config(X_AXIS);
Axis_Config(Y_AXIS);
printf("开始矩形轨迹运动...\n");
Rectangle_Trajectory();
printf("矩形轨迹运动完成\n");
// 关闭控制器连接
DMC_Close();
return 0;
}
// 控制器初始化
void MotionController_Init()
{
int ret;
// 打开控制器(默认IP:192.168.0.100,端口:5000)
ret = DMC_Open("192.168.0.100", 5000);
Error_Check(ret, "控制器连接失败");
// 复位控制器
ret = DMC_Reset();
Error_Check(ret, "控制器复位失败");
// 使能所有轴
ret = DMC_AxisOn(X_AXIS);
Error_Check(ret, "X轴使能失败");
ret = DMC_AxisOn(Y_AXIS);
Error_Check(ret, "Y轴使能失败");
// 回原点(使用限位开关+Z相方式)
printf("X轴回原点...\n");
ret = DMC_Home(X_AXIS, 1, 50, 20, 10); // 模式1,高速50,低速20,偏移10
Error_Check(ret, "X轴回原点失败");
printf("Y轴回原点...\n");
ret = DMC_Home(Y_AXIS, 1, 50, 20, 10);
Error_Check(ret, "Y轴回原点失败");
}
// 轴参数配置
void Axis_Config(int axis)
{
int ret;
// 设置速度参数
ret = DMC_SetSpeed(axis, SPEED);
Error_Check(ret, "速度设置失败");
// 设置加减速
ret = DMC_SetAccel(axis, ACCEL);
Error_Check(ret, "加速度设置失败");
ret = DMC_SetDecel(axis, DECEL);
Error_Check(ret, "减速度设置失败");
// 设置电子齿轮比(假设1000脉冲/mm)
ret = DMC_SetEGear(axis, 1000, 1); // 脉冲/用户单位 = 1000/1
Error_Check(ret, "电子齿轮比设置失败");
}
// 矩形轨迹运动(使用直线插补)
void Rectangle_Trajectory()
{
int ret;
// 1. 从原点(0,0)直线插补到(Width,0)
ret = DMC_LineInterp2(X_AXIS, Y_AXIS, WIDTH, 0, SPEED);
Error_Check(ret, "第一段直线插补失败");
DMC_WaitDone(X_AXIS, 10000); // 等待运动完成,超时10秒
// 2. 直线插补到(Width, Height)
ret = DMC_LineInterp2(X_AXIS, Y_AXIS, WIDTH, HEIGHT, SPEED);
Error_Check(ret, "第二段直线插补失败");
DMC_WaitDone(X_AXIS, 10000);
// 3. 直线插补到(0, Height)
ret = DMC_LineInterp2(X_AXIS, Y_AXIS, 0, HEIGHT, SPEED);
Error_Check(ret, "第三段直线插补失败");
DMC_WaitDone(X_AXIS, 10000);
// 4. 直线插补回到原点(0,0)
ret = DMC_LineInterp2(X_AXIS, Y_AXIS, 0, 0, SPEED);
Error_Check(ret, "第四段直线插补失败");
DMC_WaitDone(X_AXIS, 10000);
}
// 错误检查与处理
void Error_Check(int result, const char* msg)
{
if (result != 0) // 0表示成功,非0表示错误
{
int err_code;
char err_msg[256];
// 获取错误代码和描述
DMC_GetLastError(&err_code, err_msg, 256);
printf("[错误] %s:代码=%d,描述=%s\n", msg, err_code, err_msg);
DMC_Close(); // 关闭连接
exit(1); // 退出程序
}
}
例程说明
这个例程实现了一个基本的两轴矩形轨迹运动控制,主要包含以下功能模块:
使用说明
该例程可作为基础框架,扩展为更复杂的轨迹(如圆形、多边形),只需修改轨迹规划部分的插补指令和目标点坐标即可。