1、PLC 中实现直线插补算法实例 /采用逐点逼近算法 /终点判别 :分别判断各坐标轴的进给步数 /整体程序 :采用虚拟坐标控制原理,即将 “ 实际坐标轴 ” 平移变换为 “ 虚拟坐标轴 ” ,从而简化控制复杂度 ; 大多数资料里只讲解了确定象限的直线段控制,采用“虚拟坐标轴”原理,可以实现跨象限的直线段控制 /可以适用于四象限工作 /一次移动的脉冲基准,默认为 “1“ /此程序只有参考意义,无实际工程实用价值! ! STEP7 5.5 编写! 希望对大家有帮助! BXL (苏州 ) 2012-12-31 /以下为第一象限 的偏差算法 /以下为 四 象限的算法 FUNCTION_BLOCK FB1
2、/实例程序 VERSION: 1.0 AUTHOR: BXL KNOW_HOW_PROTECT VAR_INPUT X_StartPoint:DINT;/X 轴起点坐标 Y_StartPoint:DINT;/Y 轴起点坐标 X_StopPoint:DINT;/X 轴终点坐标 Y_StopPoint:DINT;/Y 轴终点坐标 END_VAR VAR_OUTPUT X_JD_Value:DINT;/X 轴绝对控制时,位置脉冲值 Y_JD_Value:DINT;/Y 轴绝对控制时,位置脉冲值 X_XD_Value:DINT;/X 轴相对控制时,脉冲增量值 Y_XD_Value:DINT;/Y 轴相
3、对控制时,脉冲增量值 X_XD_Forward:BOOL;/X 轴相对控制时,正向行进 X_XD_Reverse:BOOL;/X 轴相对控制时,反向行进 Y_XD_Forward:BOOL;/Y 轴相对控制时,正向行进 Y_XD_Reverse:BOOL;/Y 轴相对控制时,反向行进 END_VAR VAR_IN_OUT Run:BOOL;/运行命令 END_VAR VAR Save_X_StopPoint:DINT;/虚拟 X 轴终点坐标 Save_Y_StopPoint:DINT;/虚拟 Y 轴终点坐标 Fi_ErrorValue:DINT;/第 i 步偏差值 X_StepValue:DI
4、NT;/X 轴进给步数值 Y_StepValue:DINT;/Y 轴进给步数值 Save_Run:BOOL;/运行命令寄存 Quadrant_1:BOOL;/第一象限 Quadrant_2:BOOL;/第二象限 Quadrant_3:BOOL;/第三象限 Quadrant_4:BOOL;/第四象限 END_VAR BEGIN/程序开始 /* /初始化数据 IF Run AND (NOT Save_Run) THEN X_JD_Value:=X_StartPoint; Y_JD_Value:=Y_StartPoint; X_XD_Value:=0; Y_XD_Value:=0; X_XD_For
5、ward:=FALSE; X_XD_Reverse:=FALSE; Y_XD_Forward:=FALSE; Y_XD_Reverse:=FALSE; Fi_ErrorValue:=0; X_StepValue:=0; Y_StepValue:=0; Save_X_StopPoint:=X_StopPoint-X_StartPoint;/计算虚拟 X 轴终点坐标 Save_Y_StopPoint:=Y_StopPoint-Y_StartPoint;/计算虚拟 Y 轴终点坐标 IF (Save_X_StopPoint=0)AND(Save_Y_StopPoint=0) THEN/判断终点和起点相
6、等 Quadrant_1:=FALSE; Quadrant_2:=FALSE; Quadrant_3:=FALSE; Quadrant_4:=FALSE; Run:=FALSE; ELSIF (Save_X_StopPoint0)AND(Save_Y_StopPoint0) THEN/判断虚拟坐标位于第一象限 Quadrant_1:=TRUE; Quadrant_2:=FALSE; Quadrant_3:=FALSE; Quadrant_4:=FALSE; ELSIF (Save_X_StopPoint0) THEN/判断虚拟坐标位于第二象限 Quadrant_1:=FALSE; Quadra
7、nt_2:=TRUE; Quadrant_3:=FALSE; Quadrant_4:=FALSE; ELSIF (Save_X_StopPoint0)AND(Save_Y_StopPoint=0 THEN/偏差判别 IF Quadrant_1 THEN/第一象限, X 轴正向进给 X_JD_Value:=X_JD_Value+1; Y_JD_Value:=Y_JD_Value+0; X_XD_Value:=1; Y_XD_Value:=0; X_XD_Forward:=TRUE; X_XD_Reverse:=FALSE; Y_XD_Forward:=FALSE; Y_XD_Reverse:=F
8、ALSE; END_IF; IF Quadrant_2 THEN/第二象限, X 轴反向进给 X_JD_Value:=X_JD_Value-1; Y_JD_Value:=Y_JD_Value+0; X_XD_Value:=1; Y_XD_Value:=0; X_XD_Forward:=FALSE; X_XD_Reverse:=TRUE; Y_XD_Forward:=FALSE; Y_XD_Reverse:=FALSE; END_IF; IF Quadrant_3 THEN/第三象限, X 轴反向进给 X_JD_Value:=X_JD_Value-1; Y_JD_Value:=Y_JD_Valu
9、e+0; X_XD_Value:=1; Y_XD_Value:=0; X_XD_Forward:=FALSE; X_XD_Reverse:=TRUE; Y_XD_Forward:=FALSE; Y_XD_Reverse:=FALSE; END_IF; IF Quadrant_4 THEN/第四象限, X 轴正向进给 X_JD_Value:=X_JD_Value+1; Y_JD_Value:=Y_JD_Value+0; X_XD_Value:=1; Y_XD_Value:=0; X_XD_Forward:=TRUE; X_XD_Reverse:=FALSE; Y_XD_Forward:=FALS
10、E; Y_XD_Reverse:=FALSE; END_IF; Fi_ErrorValue:=Fi_ErrorValue-ABS(Save_Y_StopPoint);/偏差计算 X_StepValue:=X_StepValue+1;/X 轴进给步数计算 ELSE/偏差判别 IF Quadrant_1 THEN/第一象限, Y 轴正向进给 X_JD_Value:=X_JD_Value+0; Y_JD_Value:=Y_JD_Value+1; X_XD_Value:=0; Y_XD_Value:=1; X_XD_Forward:=FALSE; X_XD_Reverse:=FALSE; Y_XD_F
11、orward:=TRUE; Y_XD_Reverse:=FALSE; END_IF; IF Quadrant_2 THEN/第二象限, Y 轴正向进给 X_JD_Value:=X_JD_Value+0; Y_JD_Value:=Y_JD_Value+1; X_XD_Value:=0; Y_XD_Value:=1; X_XD_Forward:=FALSE; X_XD_Reverse:=FALSE; Y_XD_Forward:=TRUE; Y_XD_Reverse:=FALSE; END_IF; IF Quadrant_3 THEN/第三象限, Y 轴反向进给 X_JD_Value:=X_JD_V
12、alue+0; Y_JD_Value:=Y_JD_Value-1; X_XD_Value:=0; Y_XD_Value:=1; X_XD_Forward:=FALSE; X_XD_Reverse:=FALSE; Y_XD_Forward:=FALSE; Y_XD_Reverse:=TRUE; END_IF; IF Quadrant_4 THEN/第四象限, Y 轴反向进给 X_JD_Value:=X_JD_Value+0; Y_JD_Value:=Y_JD_Value-1; X_XD_Value:=0; Y_XD_Value:=1; X_XD_Forward:=FALSE; X_XD_Reve
13、rse:=FALSE; Y_XD_Forward:=FALSE; Y_XD_Reverse:=TRUE; END_IF; Fi_ErrorValue:=Fi_ErrorValue+ABS(Save_X_StopPoint);/偏差计算 Y_StepValue:=Y_StepValue+1;/Y 轴进给步数计算 END_IF; IF (X_StepValue=ABS(Save_X_StopPoint)AND(Y_StepValue=ABS(Save_Y_StopPoint) THEN/终点判别 Run:=FALSE; END_IF; END_IF; Save_Run:=Run; /* END_FUNCTION_BLOCK