附件下载,需登录可以查看贴内更多信息
您需要 登录 才可以下载或查看,没有账号?立即注册
x
[FUNCTION_BLOCK HMI_CNC_SingelVAR_INPUT
ProgramNumber: UINT;//程序路径(1:GO1 2:G02, 3:G03,4:M)
Data: UDT_CNC_Base;
END_VAR
VAR_OUTPUT
M_OUT:WORD;
END_VAR
VAR_IN_OUT
AxisX: AXIS_REF_SM3;
AxisY: AXIS_REF_SM3;
ProgramInit:BOOL;//程序初始化
M_Test:BOOL;//M代码测试
END_VAR VAR
PathOptimize:BOOL;//路径优化
bExecute:BOOL; //启动命令
Proval:SMC_GEOINFO;
LINE_Interpolation1 : SMC_OUTQUEUE;
LINE_Interpolation1_0 : ARRAY[1..200] OF SMC_GEOINFO;
LINE_Interpolation1_1 : ARRAY[1..200] OF SMC_GEOINFO;
Posval:SMC_POSINFO;
InitIndex:INT;
SMC_SmoothPath_0: SMC_SmoothPath;
SMC_CheckVelocities_0: SMC_CheckVelocities;
SMC_Interpolator_0: SMC_Interpolator;
SMC_ControlAxisByPos_X: SMC_ControlAxisByPos;
SMC_ControlAxisByPos_Y: SMC_ControlAxisByPos;
r1: R_TRIG;
SMC_TRAFO_Gantry2_0: SMC_TRAFO_Gantry2;
SMC_TRAFOF_Gantry2D:SMC_TRAFOF_Gantry2;
ProgramIndex:UINT;
END_VAR
//
((********************************************Name:HMI_CNC_Continuation
Author:Sakura
Date:2022-05/30
Version:1.0
********************************************)
//判断G 代码的有效区域
IF ProgramInit AND InitIndex<>3 THEN
CASE InitIndex OF
0:
//预处理只能地址
LINE_Interpolation1.pbyBuffer:=ADR(LINE_Interpolation1_0);
//初始化程序空间,新建200个缓存
SMC_SetQueueCapacity(poq:=ADR(LINE_Interpolation1) , nSizeInBytes:= SIZEOF(LINE_Interpolation1_0));
InitIndex:=1;
1:
CASE ProgramNumber OF
1:
Posval.wAuxData:=3;//轴选os
Proval.iObjNo:=1;//MASK;
Proval.iSourceLine_No:=0;//G代码行号
proval.diSentenceNo:=0;
Proval.iMoveType:=SMC_MOVTYP.LIN;//类型
posval.dX:=Data.StartPosX;
posval.dy:=Data.StartPosY;
Proval.piStartPos:=posval;
posval.dX:=Data.DestPosX;
posval.dy:=Data.DestPosY;
Proval.piDestPos:=posval;
proval.dvel:=Data.Dvel;//速度
Proval.dVelEnd:=Data.DEndvel;//结束速度
Proval.dAccel:=Data.dAccel;//加速度
proval.dDecel:=Data.dDecel;//减速度
//数据刷入
SMC_CalcLengthGeo(pg:=ADR(Proval));
SMC_AppendObj(poq:=ADR(LINE_Interpolation1) , pgi:=ADR(Proval));
2:
Posval.wAuxData:=3;//轴选os
Proval.iObjNo:=1;//MASK;
Proval.iSourceLine_No:=0;//G代码行号
proval.diSentenceNo:=0;
Proval.iMoveType:=SMC_MOVTYP.CLW;//类型
posval.dX:=Data.StartPosX;
posval.dy:=Data.StartPosY;
Proval.piStartPos:=posval;
posval.dX:=Data.DestPosX;
posval.dy:=Data.DestPosY;
Proval.piDestPos:=posval;
CriclePointThree(
Enable:=TRUE ,
X1:=Data.StartPosX,
Y1:=Data.StartPosY ,
X2:=Data.ICentreCircle ,
Y2:=Data.JCentreCircle ,
X3:= Data.DestPosX ,
Y3:= Data.DestPosY,
Start:=ProgramNumber=2 ,
RX=> Proval.dP1 ,
RY=> Proval.dP2 ,
Radius=> Proval.dP3 ,
Done=> );
CW_CCW_Circle(
Seclect:= 1,
ICentreCircle:= Proval.dP1 ,
JCentreCircle:= Proval.dP2 ,
AxisX_fActPosition:= Data.StartPosX,
AxisY_fActPosition:= Data.StartPosY,
XEndPosition:=Data.DestPosX ,
YEndPosition:=Data.DestPosY ,
DT1=>roval.dT1 ,
DT2=>roval.dT2 );
proval.dvel:=Data.Dvel;//速度
Proval.dVelEnd:=Data.DEndvel;//结束速度
Proval.dAccel:=Data.dAccel;//加速度
proval.dDecel:=Data.dDecel;//减速度
//数据刷入
SMC_CalcLengthGeo(pg:=ADR(Proval));
SMC_AppendObj(poq:=ADR(LINE_Interpolation1) , pgi:=ADR(Proval));
3:
Posval.wAuxData:=3;//轴选os
Proval.iObjNo:=1;//MASK;
Proval.iSourceLine_No:=0;//G代码行号
proval.diSentenceNo:=0;
Proval.iMoveType:=SMC_MOVTYP.CCLW;//类型
posval.dX:=Data.StartPosX;
posval.dy:=Data.StartPosY;
Proval.piStartPos:=posval;
posval.dX:=Data.DestPosX;
posval.dy:=Data.DestPosY;
Proval.piDestPos:=posval;
CriclePointThree(
Enable:=TRUE ,
X1:=Data.StartPosX,
Y1:=Data.StartPosY ,
X2:=Data.ICentreCircle ,
Y2:=Data.JCentreCircle ,
X3:= Data.DestPosX ,
Y3:= Data.DestPosY,
Start:=ProgramNumber=3 ,
RX=> Proval.dP1 ,
RY=> Proval.dP2 ,
Radius=> Proval.dP3 ,
Done=> );
CW_CCW_Circle(
Seclect:= 2,
ICentreCircle:= Proval.dP1 ,
JCentreCircle:= Proval.dP2 ,
AxisX_fActPosition:= Data.StartPosX,
AxisY_fActPosition:= Data.StartPosY,
XEndPosition:=Data.DestPosX ,
YEndPosition:=Data.DestPosY ,
DT1=>roval.dT1 ,
DT2=>roval.dT2 );
proval.dvel:=Data.Dvel;//速度
Proval.dVelEnd:=Data.DEndvel;//结束速度
Proval.dAccel:=Data.dAccel;//加速度
proval.dDecel:=Data.dDecel;//减速度
//数据刷入
SMC_CalcLengthGeo(pg:=ADR(Proval));
SMC_AppendObj(poq:=ADR(LINE_Interpolation1) , pgi:=ADR(Proval));
// 4:
// Posval.wAuxData:=3;//轴选os
// Proval.iObjNo:=1;//MASK;
// Proval.iSourceLine_No:=0;//G代码行号
// proval.diSentenceNo:=0;
// Proval.iMoveType:=SMC_MOVTYP.MCOMMAND;//类型
// posval.dX:=Data.StartPosX;
// posval.dy:=Data.StartPosY;
// Proval.piStartPos:=posval;
// posval.dX:=Data.StartPosX;
// posval.dy:=Data.StartPosY;
// Proval.piDestPos:=posval;
// proval.iHelpID[0]:=Data.iHelpID;
// proval.dvel:=Data.Dvel;//速度
// Proval.dVelEnd:=Data.DEndvel;//结束速度
// Proval.dAccel:=Data.dAccel;//加速度
// proval.dDecel:=Data.dDecel;//减速度
// //数据刷入
// SMC_CalcLengthGeo(pg:=ADR(Proval));
// SMC_AppendObj(poq:=ADR(LINE_Interpolation1) , pgi:=ADR(Proval));
END_CASE ;
LINE_Interpolation1.bEndOfList:=TRUE;
InitIndex:=2;
2:
PathOptimize:=TRUE;
ProgramInit:=FALSE;
InitIndex:=3;
END_CASE
END_IF
SMC_SmoothPath_0(
bExecute:=PathOptimize ,
bAbort:= ,
bAppend:= ,
poqDataIn:= ADR(LINE_Interpolation1 ),
dEdgeDistance:=,
dAngleTol:= ,
nSizeOutQueue:=SIZEOF(LINE_Interpolation1_1) ,
pbyBufferOutQueue:=ADR(LINE_Interpolation1_1),
eMode:= ,
bSymmetricalDistances:= ,
bImprovedSymmetricCuts:= ,
eAddAxMode:= ,
dMinimumCurvatureRadius:= ,
bCheckCurvature:= ,
dRelativeCurvatureTol:= ,
bCheckAddAxVelJump:= ,
dMaxAddAxVelDifference:= ,
bDone=> ,
bBusy=> ,
bError=> ,
wErrorID=> ,
poqDataOut=> ,
udiStopsDueToCurvatureRadius=> );
SMC_CheckVelocities_0(
bExecute:= SMC_SmoothPath_0.bDone,
bAbort:= ,
poqDataIn:=SMC_SmoothPath_0.poqDataOut ,
dAngleTol:=,
bCheckAddAxVelJump:= ,
dMaxAddAxVelDifference:= ,
bBusy=> ,
bError=> ,
wErrorID=> ,
poqDataOut=> );
IF SMC_CheckVelocities_0.bBusy THEN
PathOptimize:=FALSE;
bExecute:=TRUE;
InitIndex:=0;
END_IF
SMC_Interpolator_0(
bExecute:=bExecute,
poqDataIn:=SMC_CheckVelocities_0.poqDataOut,
bSlow_Stop:= ,
bEmergency_Stop:=SMC_ControlAxisByPos_X.bError OR SMC_ControlAxisByPos_X.bStopIpo OR SMC_ControlAxisByPos_Y.bError OR SMC_ControlAxisByPos_Y.bStopIpo,
bWaitAtNextStop:= ,
dOverride:= ,
iVelMode:= ,
dwIpoTime:=4000,
dLastWayPos:= ,
bAbort:=,
bSingleStep:= ,
bAcknM:=,
bQuick_Stop:= ,
dQuickDeceleration:= ,
dJerkMax:= ,
dQuickStopJerk:= ,
bDone=>,
bBusy=>,
bError=>,
wErrorID=>,
piSetPosition=> ,
iStatus=> ,
bWorking=> ,
iActObjectSourceNo=> ,
dVel=> ,
vecActTangent=> ,
iLastSwitch=> ,
dwSwitches=> ,
dWayPos=> ,
wM=>M_OUT );
IF SMC_Interpolator_0.bBusy THEN
bExecute:=FALSE;
END_IF
SMC_TRAFO_Gantry2_0(
pi:= SMC_Interpolator_0.piSetPosition
);
SMC_ControlAxisByPos_X(
Axis:= AxisX,
iStatus:= SMC_Interpolator_0.iStatus,
bAvoidGaps:=TRUE,
bEnable:= SMC_Interpolator_0.bWorking,
fSetPosition:= SMC_TRAFO_Gantry2_0.dx,
fGapVelocity:= 10,
fGapAcceleration:= 10,
fGapDeceleration:= 10 );
SMC_ControlAxisByPos_Y(
Axis:= AxisY,
iStatus:= SMC_Interpolator_0.iStatus,
bAvoidGaps:=TRUE,
bEnable:= SMC_Interpolator_0.bWorking,
fSetPosition:= SMC_TRAFO_Gantry2_0.dY,
fGapVelocity:= 10,
fGapAcceleration:= 10,
fGapDeceleration:= 10 );
SMC_TRAFOF_Gantry2D(
DriveX:=AxisX,
DriveY:=AxisY,
dOffsetX:= ,
dOffsetY:= ,
minX:=0,
maxX:=100,
minY:=0,
maxY:=100,
dx=> ,
dy=> ,
dnx=> ,
dny=> ,
ratio=> ,
dnOffsetX=> ,
dnOffsetY=> );
免责声明:内容为网友自行发布或者来自互联网资源或者参考文献,如果侵犯了您的权益,请联系站长 1304546267@qq.com,我们会及时删除侵权内容,感谢您的理解! |