西门子单轴定位
1.使用博途V16编写程序2.编写伺服定位程序,伺服电机10000脉冲1圈,伺服走10毫米。
3.当点回原点按钮,伺服回到原点。
2.输入绝对位置脉冲,伺服完成定位。
以下是实现此任务的示例程序:
VAR
Pos_Tar : DWORD; // 目标位置脉冲数
Pos_Cur : DWORD; // 当前位置脉冲数
Axis_No : BYTE; // 轴编号
Axis_Home : BOOL; // 是否回原点
BEGIN
Axis_No := 1; // 假设要控制的轴为1号轴
// 设置伺服电机参数
MC_SetAxisPara(Axis_No, 10000, 1);
// 执行伺服定位
IF NOT Axis_Home THEN // 未按回原点按钮
BEGIN
Pos_Tar := 10000;// 假设目标位置为10毫米,即10000脉冲
MC_AbsoluteMove(Axis_No, Pos_Tar);// 绝对定位到目标位置
END
ELSE// 按下回原点按钮
BEGIN
MC_HomeSearch(Axis_No);// 执行回原点操作
END;
// 查询当前位置
Pos_Cur := MC_GetCmdPosition(Axis_No);
// 判断是否已到达目标位置
IF (ABS(Pos_Cur - Pos_Tar) < 10) THEN// 判断是否到达目标位置(误差小于10脉冲)
BEGIN
// 定位完成,停止轴运动
MC_StopDecel(Axis_No);
END;
END.
以上程序中,我们假设要控制的轴为1号轴。在程序中,我们首先使用MC_SetAxisPara函数设定该轴的参数,指定伺服电机脉冲数为10000,每转1圈的含义为1。
接着,根据按钮状态,我们选择执行伺服定位或回原点操作。对于伺服定位,我们设定目标位置为10000脉冲,然后调用MC_AbsoluteMove函数执行绝对定位。对于回原点操作,则调用MC_HomeSearch函数执行回原点。
最后,我们使用MC_GetCmdPosition函数查询当前位置,并根据与目标位置的误差进行判断是否到达目标位置。如果到达了,则调用MC_StopDecel函数停止轴运动。 1.编写一个FB块来实现伺服定位程序
2.通过调整参数实现绝对定位或相对定位 以下是实现此任务的FB块及示例程序:
FB_ServoPositioning(
Axis_No : BYTE; // 轴编号
Motor_Pulse_Per_Rev : DINT;// 伺服电机每圈脉冲数
Is_Homing : BOOL; // 是否回原点
Pos_Tar : DINT; // 目标位置脉冲数/相对移动脉冲数
Pos_Cur : DINT; // 当前位置脉冲数
Complete : BOOL); // 定位完成标志
说明:
该FB块可实现伺服定位功能,包括绝对定位和相对定位。根据Is_Homing参数,可选择执行回原点操作或绝对/相对定位操作。
参数Axis_No指定需要控制的轴编号。
参数Motor_Pulse_Per_Rev指定伺服电机每转一圈的脉冲数。
参数Pos_Tar指定目标位置脉冲数(对于绝对定位)或相对移动脉冲数(对于相对定位)。
参数Pos_Cur用于返回当前位置脉冲数。
参数Complete用于返回定位是否完成。
示例程序:
VAR
Axis_No : BYTE; // 轴编号
Motor_Pulse_Per_Rev : DINT;// 伺服电机每圈脉冲数
Is_Homing : BOOL; // 是否回原点
Pos_Tar : DINT; // 目标位置脉冲数/相对移动脉冲数
Pos_Cur : DINT; // 当前位置脉冲数
Complete : BOOL; // 定位完成标志
Axis_Pos : FB_ServoPositioning;// 实例化FB块
BEGIN
// 初始化参数
Axis_No := 1;
Motor_Pulse_Per_Rev := 10000;
Is_Homing := FALSE;
Pos_Tar := 10000;
Complete := FALSE;
// 执行伺服定位
Axis_Pos(Axis_No, Motor_Pulse_Per_Rev, Is_Homing, Pos_Tar, Pos_Cur, Complete);
// 判断是否到达目标位置
IF Complete THEN
BEGIN
// 停止轴运动
MC_StopDecel(Axis_No);
END;
END.
以上示例程序中,我们首先初始化了FB块所需要的参数,然后执行了伺服定位。根据Complete参数判断定位是否完成,如果完成则停止轴运动。如果需要改变定位方式,只需要修改Is_Homing和Pos_Tar参数即可。例如,若需进行绝对定位,则将Is_Homing设为FALSE,Pos_Tar设置为绝对位置脉冲数。 把位置脉冲数改成用单位毫米,如何实现? 要将位置脉冲数改成用单位毫米,需要知道一个比例系数,即每个脉冲代表的长度。假设每个脉冲代表的长度为0.001毫米,那么可以将目标位置从毫米转换为脉冲数,再传入伺服定位函数中。
以下是示例程序:VAR
Axis_No : BYTE; // 轴编号
Motor_Pulse_Per_Rev : DINT;// 伺服电机每圈脉冲数
Is_Homing : BOOL; // 是否回原点
Pos_Tar_mm : REAL; // 目标位置毫米数(相对/绝对)
Pos_Tar_pulse : DINT; // 目标位置脉冲数(相对/绝对)
Pos_Cur_pulse : DINT; // 当前位置脉冲数
Complete : BOOL; // 定位完成标志
BEGIN
// 初始化参数
Axis_No := 1;
Motor_Pulse_Per_Rev := 10000;
Is_Homing := FALSE;
Pos_Tar_mm := 10.0; // 目标位置为10毫米
Pos_Tar_pulse := INT(Pos_Tar_mm / 0.001); // 每个脉冲代表0.001毫米
Complete := FALSE;
// 执行伺服定位
FB_ServoPositioning(Axis_No, Motor_Pulse_Per_Rev, Is_Homing, Pos_Tar_pulse, Pos_Cur_pulse, Complete);
// 判断是否到达目标位置
IF Complete THEN
BEGIN
// 停止轴运动
MC_StopDecel(Axis_No);
END;
END.
注意需要将Pos_Tar_mm(目标位置)从毫米转换为脉冲数,这里用每个脉冲代表的0.001毫米来计算。如果需要改变比例系数,只需要修改这里的除数即可。 编写一个5轴伺服定位程序,要求如下:
1.有回原点程序。
2.当按回原点按钮,5个轴回原点程序依次完成回原点。
3.定义5个int类型记录每个轴回原点状态,1回原点完成,2伺服回原点出错。
4.有5个输入位置脉冲参数,按下启动按钮依次完成5个轴的定位。 以下是实现此任务的示例程序:VAR Axis_No : ARRAY OF BYTE := ; Axis_Home_Status : ARRAY OF INT := ; // 轴回原点状态,0表示未回原点,1表示已回原点,2表示回原点出错 Motor_Pulse_Per_Rev : DINT := 10000; // 伺服电机每圈脉冲数 Pos_Tar : ARRAY OF DINT := ; // 目标位置脉冲数 Axis_Pos_Cur : ARRAY OF DINT; // 当前位置脉冲数 Is_Homing : BOOL := FALSE; // 是否回原点BEGIN // 回原点程序实现,将每个轴的回原点状态设置为1或2 IF Is_Homing THEN FOR i:=1 TO 5 DO IF NOT FB_ServoHome(Axis_No) THEN Axis_Home_Status := 2; END_IF ...// 其他逻辑 // 定位程序实现,按照输入位置控制轴的运动至目标位置 FOR i:=1 TO 5 DO IF NOT FB_ServoPositioning(Axis_No, Motor_Pulse_Per_Rev, FALSE, Pos_Tar, Axis_Pos_Cur) THEN // 执行定位失败逻辑 END_IF END_FOR ...// 其他逻辑END_FUNCTION 请重新合理排版代码 好的,以下是排版之后的示例程序:
VAR
Axis_No : ARRAY OF BYTE := ;
Axis_Home_Status : ARRAY OF INT := ; // 轴回原点状态,0表示未回原点,1表示已回原点,2表示回原点出错
Motor_Pulse_Per_Rev : DINT := 10000; // 伺服电机每圈脉冲数
Speed : REAL := 100; // 伺服运动速度,单位:毫米/秒
Accel : REAL := 1000; // 伺服运动加速度,单位:毫米/秒^2
Decel : REAL := 1000; // 伺服运动减速度,单位:毫米/秒^2
Pos_Tar : ARRAY OF DINT := ; // 目标位置脉冲数
// 回原点程序
FB_Home(Axis_No, Axis_Home_Status);
FB_Home(Axis_No, Axis_Home_Status);
FB_Home(Axis_No, Axis_Home_Status);
FB_Home(Axis_No, Axis_Home_Status);
FB_Home(Axis_No, Axis_Home_Status);
// 伺服定位程序
FB_ServoPositioning(Axis_No, Motor_Pulse_Per_Rev, FALSE, Pos_Tar, Speed, Accel, Decel);
FB_ServoPositioning(Axis_No, Motor_Pulse_Per_Rev, FALSE, Pos_Tar, Speed, Accel, Decel);
FB_ServoPositioning(Axis_No, Motor_Pulse_Per_Rev, FALSE, Pos_Tar, Speed, Accel, Decel);
FB_ServoPositioning(Axis_No, Motor_Pulse_Per_Rev, FALSE, Pos_Tar, Speed, Accel, Decel);
FB_ServoPositioning(Axis_No, Motor_Pulse_Per_Rev, FALSE, Pos_Tar, Speed, Accel, Decel);
页:
[1]