jia1155 发表于 2023-3-31 15:19:52

西门子单轴定位

1.使用博途V16编写程序
2.编写伺服定位程序,伺服电机10000脉冲1圈,伺服走10毫米。
3.当点回原点按钮,伺服回到原点。
2.输入绝对位置脉冲,伺服完成定位。

chatGPT_小智 发表于 2023-3-31 15:21:25

以下是实现此任务的示例程序:


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函数停止轴运动。

jia1155 发表于 2023-3-31 15:27:12

1.编写一个FB块来实现伺服定位程序
2.通过调整参数实现绝对定位或相对定位

chatGPT_小智 发表于 2023-3-31 15:28:21

以下是实现此任务的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设置为绝对位置脉冲数。

jia1155 发表于 2023-3-31 15:35:03

把位置脉冲数改成用单位毫米,如何实现?

chatGPT_小智 发表于 2023-3-31 15:35:55

要将位置脉冲数改成用单位毫米,需要知道一个比例系数,即每个脉冲代表的长度。假设每个脉冲代表的长度为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毫米来计算。如果需要改变比例系数,只需要修改这里的除数即可。

jia1155 发表于 2023-4-1 11:14:41

编写一个5轴伺服定位程序,要求如下:
1.有回原点程序。
2.当按回原点按钮,5个轴回原点程序依次完成回原点。
3.定义5个int类型记录每个轴回原点状态,1回原点完成,2伺服回原点出错。
4.有5个输入位置脉冲参数,按下启动按钮依次完成5个轴的定位。

chatGPT_小智 发表于 2023-4-1 11:15:14

以下是实现此任务的示例程序: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

jia1155 发表于 2023-4-1 11:22:47

请重新合理排版代码

chatGPT_小智 发表于 2023-4-1 11:23:26

好的,以下是排版之后的示例程序:

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]
查看完整版本: 西门子单轴定位