// FX5U PLC 正负位置定位控制程序
// 功能:支持绝对位置(正负坐标)和相对位置(正负偏移)控制
PROGRAM Main
VAR
// 初始化相关变量
Error_Init: INT; // 初始化错误代码
Done_Init: BOOL; // 初始化完成标志
// 绝对位置运动变量
正向按钮信号: BOOL; // 触发正向绝对位置(如X0)
负向按钮信号: BOOL; // 触发负向绝对位置(如X1)
Done_Abs1: BOOL; // 正向绝对运动完成
Busy_Abs1: BOOL; // 正向绝对运动中
Error_Abs1: INT; // 正向绝对运动错误
Done_Abs2: BOOL; // 负向绝对运动完成
Busy_Abs2: BOOL; // 负向绝对运动中
Error_Abs2: INT; // 负向绝对运动错误
// 相对位置运动变量
相对正向按钮: BOOL; // 触发正向相对运动(如X2)
相对负向按钮: BOOL; // 触发负向相对运动(如X3)
Done_Rel1: BOOL; // 正向相对运动完成
Busy_Rel1: BOOL; // 正向相对运动中
Error_Rel1: INT; // 正向相对运动错误
Done_Rel2: BOOL; // 负向相对运动完成
Busy_Rel2: BOOL; // 负向相对运动中
Error_Rel2: INT; // 负向相对运动错误
// 原点回归变量
回原点按钮: BOOL; // 触发原点回归(如X4)
Done_Home: BOOL; // 原点回归完成
Busy_Home: BOOL; // 原点回归中
Error_Home: INT; // 原点回归错误
END_VAR
// 1. 轴初始化(程序启动时执行一次)
IF NOT Done_Init THEN
MC_Init(
Axis := 1, // 轴编号1
Enable := TRUE, // 允许轴运动
PositiveLimit := FALSE, // 不使用正向硬限位
NegativeLimit := FALSE, // 不使用负向硬限位
ErrorId => Error_Init, // 错误代码输出
Done => Done_Init // 初始化完成标志
);
END_IF;
// 2. 原点回归(需先执行,建立位置基准)
IF 回原点按钮 AND Done_Init AND NOT Busy_Home THEN
MC_Home(
Axis := 1,
Mode := 1, // 模式1:接近开关+Z相脉冲
Velocity := 50.0, // 回归速度50mm/s
Offset := 0.0, // 原点偏移量0
Done => Done_Home,
Busy => Busy_Home,
ErrorId => Error_Home
);
END_IF;
// 3. 绝对位置控制(以原点为基准)
// 3.1 移动到+500位置(正向)
IF 正向按钮信号 AND Done_Init AND Done_Home AND NOT Busy_Abs1 AND NOT Busy_Abs2 AND NOT Busy_Rel1 AND NOT Busy_Rel2 THEN
MC_MoveAbsolute(
Axis := 1,
Position := 500.0, // 正向500mm
Velocity := 100.0, // 速度100mm/s
Acceleration:= 500.0, // 加速度500mm/s²
Deceleration:= 500.0, // 减速度500mm/s²
Jerk := 0, // 不加加速度
Done => Done_Abs1,
Busy => Busy_Abs1,
ErrorId => Error_Abs1
);
END_IF;
// 3.2 移动到-300位置(负向)
IF 负向按钮信号 AND Done_Init AND Done_Home AND NOT Busy_Abs1 AND NOT Busy_Abs2 AND NOT Busy_Rel1 AND NOT Busy_Rel2 THEN
MC_MoveAbsolute(
Axis := 1,
Position := -300.0, // 负向300mm
Velocity := 100.0,
Acceleration:= 500.0,
Deceleration:= 500.0,
Jerk := 0,
Done => Done_Abs2,
Busy => Busy_Abs2,
ErrorId => Error_Abs2
);
END_IF;
// 4. 相对位置控制(以当前位置为基准)
// 4.1 正向移动200mm
IF 相对正向按钮 AND Done_Init AND Done_Home AND NOT Busy_Abs1 AND NOT Busy_Abs2 AND NOT Busy_Rel1 AND NOT Busy_Rel2 THEN
MC_MoveRelative(
Axis := 1,
Distance := 200.0, // 正向移动200mm
Velocity := 100.0,
Acceleration:= 500.0,
Deceleration:= 500.0,
Jerk := 0,
Done => Done_Rel1,
Busy => Busy_Rel1,
ErrorId => Error_Rel1
);
END_IF;
// 4.2 负向移动150mm
IF 相对负向按钮 AND Done_Init AND Done_Home AND NOT Busy_Abs1 AND NOT Busy_Abs2 AND NOT Busy_Rel1 AND NOT Busy_Rel2 THEN
MC_MoveRelative(
Axis := 1,
Distance := -150.0, // 负向移动150mm
Velocity := 100.0,
Acceleration:= 500.0,
Deceleration:= 500.0,
Jerk := 0,
Done => Done_Rel2,
Busy => Busy_Rel2,
ErrorId => Error_Rel2
);
END_IF;
// 5. 清除完成标志(可选,根据需要)
IF Done_Abs1 THEN Done_Abs1 := FALSE; END_IF;
IF Done_Abs2 THEN Done_Abs2 := FALSE; END_IF;
IF Done_Rel1 THEN Done_Rel1 := FALSE; END_IF;
IF Done_Rel2 THEN Done_Rel2 := FALSE; END_IF;
IF Done_Home THEN Done_Home := FALSE; END_IF;
END_PROGRAM。
 

