查看: 474|回复: 2
收起左侧

[教程经验] CNC自定义代码

sakura 2023-3-14 17:20:18 | 显示全部楼层 |阅读模式
邀请回答

马上注册,享受更多特权

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

x
//判断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=>Proval.dT1 ,
               DT2=>Proval.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=>Proval.dT1 ,
               DT2=>Proval.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=> );        

点评

源代码,直接复制,感谢分享  发表于 2023-3-15 11:00




上一篇:codesys中有没有变量表示当前轴在凸轮关系中的位置?
下一篇:AC802型PLC CODESYS V3模拟通讯

已有 0 人打赏作者

回复 邀请回答送花

使用道具 举报

晨曦2022 2023-3-15 14:35:55 | 显示全部楼层
汇川有CNC产品吗?:
回复 送花

使用道具 举报

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

本版积分规则

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

INOVANCE汇川技术 公众号

扫码下载掌上汇川APP

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

4000-300124

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

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

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