查看: 3382|回复: 36
收起左侧

[资料分享] CNC封装后FB三轴

邀请回答

马上注册,享受更多特权

您需要 登录 才可以下载或查看,没有帐号?立即注册   

x
FUNCTION_BLOCK FB_CNC_REF3
VAR_IN_OUT
        AxisX: AXIS_REF_SM3;
        AxisY: AXIS_REF_SM3;
        AxisZ: AXIS_REF_SM3;
END_VAR
VAR_INPUT
        dwIpoTime:INT;        //插补周期,与Ethercat周期一致;
        bExecute: BOOL;
        bAbort:BOOL;
        ncprogIn: POINTER TO SMC_CNC_REF;       
END_VAR
VAR_OUTPUT
        Done:BOOL;
        Busy:BOOL;
        dwSwitchesWORD;
        Error:BOOL;
        ErrorID:SMC_ERROR;
END_VAR
VAR
        ncd: SMC_NCDecoder;
        cv: SMC_CheckVelocities;
        SmoothPath: SMC_SmoothPath;
        RoundPath:SMC_RoundPath;
        SMC_Interpolator1:SMC_Interpolator;
        SMC_TRAFO_Gantry3D:SMC_TRAFO_Gantry3;
        SMC_TRAFOF_Gantry3D:SMC_TRAFOF_Gantry3D;
        SMC_ControlAxisByPosX,SMC_ControlAxisByPosY,SMC_ControlAxisByPosZ:SMC_ControlAxisByPos;       
        xStartIpo: BOOL;
        iState: INT;
        agiBufDecoder: ARRAY[0..199] OF SMC_GeoInfo;
        agiBufSmooth: ARRAY[0..199] OF SMC_GEOINFO;
        i:INT:=0;
        bExecuteR: R_TRIG;
        xStart: BOOL;
END_VAR
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
bExecuteR(CLK:=bExecute, Q=> );
IF bExecuteR.Q THEN
        iState:=0;
        xStart:=TRUE;
END_IF
CASE iState OF
0:        // idle
        IF xStart THEN
                iState:=10;
                xStartIpo := FALSE;
                ncd(bExecute:=FALSE, ncprog:=ncprogIn^);
                SmoothPath(bExecute:=FALSE, poqDataIn:=ncd.poqDataOut);        
                cv(bExecute:=FALSE, poqDataIn:=SmoothPath.poqDataOut);
                i:=i+1;
                xStart:=FALSE;
        END_IF
10:        // start reading and processing
        ncd.piStartPosition.dX:=AxisX.fSetPosition;
        ncd.piStartPosition.dY:=AxisY.fSetPosition;       
        ncd(
                bExecute:=TRUE ,
                bAppend:= ,
                bStepSuppress:= ,
                piStartPosition:= ,
                nSizeOutQueue:=SIZEOF(agiBufDecoder) ,
                pbyBufferOutQueue:=ADR(agiBufDecoder) ,
                ncprog:=ncprogIn^,
                bDone=> ,
                bBusy=> ,
                bError=> ,
                wErrorID=> ,
                poqDataOut=> ,
                iStatus=> ,
                iLineNumberDecoded=> ,
                GCodeText=> );
        SmoothPath(
                bExecute:=ncd.bExecute,
                bAbort:= ,
                bAppend:= ,
                poqDataIn:= ,
                dEdgeDistance:= ,
                dAngleTol:= ,
                nSizeOutQueue:=SIZEOF(agiBufSmooth) ,
                pbyBufferOutQueue:=ADR(agiBufSmooth) ,
                eMode:= ,
                bSymmetricalDistances:= ,
                eAddAxMode:= ,
                bDone=> ,
                bBusy=> ,
                bError=> ,
                wErrorID=> ,
                poqDataOut=> );       
        cv(
                bExecute:=ncd.bExecute,
                poqDataIn:= ,
                dAngleTol:= ,
                bBusy=> ,
                bError=> ,
                wErrorID=> ,
                poqDataOut=> );
               
        xStartIpo := ncd.bExecute;
        IF NOT cv.bBusy THEN
                iState:=0;
        END_IF
        IF SmoothPath.bDone AND cv.poqDataOut<>16#00000000 THEN
                iState:=20;
        END_IF

20:
        ncd.bExecute:=FALSE;
        SmoothPath.bExecute:=FALSE;
        SMC_Interpolator1(
                bExecute:=bExecute,
                poqDataIn:=cv.poqDataOut,
                bSlow_Stop:= ,
                bEmergency_Stop:=SMC_ControlAxisByPosX.bError OR SMC_ControlAxisByPosX.bStopIpo OR SMC_ControlAxisByPosY.bError OR SMC_ControlAxisByPosY.bStopIpo
                                          OR SMC_ControlAxisByPosZ.bError OR SMC_ControlAxisByPosZ.bStopIpo,
                bWaitAtNextStop:= ,
                dOverride:= ,
                iVelMode:= ,
                dwIpoTime:=INT_TO_DWORD(dwIpoTime),
                dLastWayPos:= ,
                bAbort:=bAbort,
                bSingleStep:= ,
                bAcknM:= ,
                bQuick_Stop:= ,
                dQuickDeceleration:= ,
                dJerkMax:= ,
                dQuickStopJerk:= ,
                bDone=>Done,
                bBusy=>Busy,
                bError=>Error,
                wErrorID=>ErrorID,
                piSetPosition=> ,
                iStatus=> ,
                bWorking=> ,
                iActObjectSourceNo=> ,
                dVel=> ,
                vecActTangent=> ,
                iLastSwitch=> ,
                dwSwitches=>dwSwitches ,
                dWayPos=> ,
                wM=> );
        SMC_TRAFO_Gantry3D(
                pi:=SMC_Interpolator1.piSetPosition,
                dOffsetX:= ,
                dOffsetY:= ,
                dOffsetZ:= ,  
                dx=> ,
                dy=> ,
                dz=> );
        SMC_ControlAxisByPosX(
                Axis:=AxisX,
                iStatus:=SMC_Interpolator1.iStatus,
                bEnable:=SMC_Interpolator1.bWorking,
                bAvoidGaps:=TRUE,
                fSetPosition:=SMC_TRAFO_Gantry3D.dx,
                fGapVelocity:=10,
                fGapAcceleration:=10,
                fGapDeceleration:=10,
                fGapJerk:= ,
                bBusy=> ,
                bCommandAborted=> ,
                bError=> ,
                iErrorID=> ,
                bStopIpo=> );
        SMC_ControlAxisByPosY(
                Axis:=AxisY,
                iStatus:=SMC_Interpolator1.iStatus,
                bEnable:=SMC_Interpolator1.bWorking,
                bAvoidGaps:=TRUE,
                fSetPosition:=SMC_TRAFO_Gantry3D.dy,
                fGapVelocity:=10,
                fGapAcceleration:=10,
                fGapDeceleration:=10,
                fGapJerk:= ,
                bBusy=> ,
                bCommandAborted=> ,
                bError=> ,
                iErrorID=> ,
                bStopIpo=> );
        SMC_ControlAxisByPosZ(
                Axis:=AxisZ,
                iStatus:=SMC_Interpolator1.iStatus,
                bEnable:=SMC_Interpolator1.bWorking,
                bAvoidGaps:=TRUE,
                fSetPosition:=SMC_TRAFO_Gantry3D.dz,
                fGapVelocity:=10,
                fGapAcceleration:=10,
                fGapDeceleration:=10,
                fGapJerk:= ,
                bBusy=> ,
                bCommandAborted=> ,
                bError=> ,
                iErrorID=> ,
                bStopIpo=> );
        SMC_TRAFOF_Gantry3D(
                dOffsetX:= ,
                dOffsetY:= ,
                dOffsetZ:= ,
                minX:=0 ,
                maxX:=100 ,
                minY:=0 ,
                maxY:=100 ,
                minZ:=0 ,
                maxZ:=100 ,
                DriveX:=AxisX ,
                DriveY:=AxisY ,
                DriveZ:=AxisZ ,
                dx=> ,
                dy=> ,
                dz=> ,
                dnx=> ,
                dny=> ,
                dnz=> ,
                dm=> );
END_CASE

点评

谢谢分享  发表于 2022-6-27 10:07




上一篇:POUS和设备里编程的区别是什么?
下一篇:AM600CNC

已有 1 人打赏作者

zld 赏了楼主10水滴
回复 邀请回答送花

使用道具 举报

duquanplc 2021-9-13 17:46:13 | 显示全部楼层


感谢分享学习!!!!
回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册   

本版积分规则

有技术问题,就上汇川技术社区

INOVANCE汇川技术 公众号

扫码下载掌上汇川APP

全国服务热线:8:30-17:30

4000-300124

苏州地址:江苏省苏州市吴中区越溪友翔路16号

深圳地址:深圳市龙华新区观澜街道高新技术产业园汇川技术总部大厦

Copyright © 2003-2100 汇川技术 Powered by Discuz! X3.4 ( 苏ICP备12002088号 )
快速回复 返回列表 返回顶部