恭喜,你发布的帖子
发布于 2020-04-04 09:39:57
2楼
能把完整的换刀程序贴出来一起讨论吗?$是系统变量前缀,但从这段程序无法判断T$1代表的是啥?我发一段有注释的换刀程序以及参数供参考:
_TM[0]: 当前刀库刀套号
; _TM[1]: 编程刀具所在的刀套号
; _TM[3]: 主轴刀套上安装的刀具号
; _TM[5]: 1=程序测试标记
; _TM[6]: 程序测试时主轴上的刀具号
; _ZSFR[0]: 刀位差
; $C_T: 编程刀具号
; $PTOOLNO: 主轴刀套内的刀具号
; 刀具数据:
; $TC_DP1[刀具号 ,1]: 刀具类型
; $TC_DP3[刀具号 ,1]: 刀具几何参数-刀具长度1
; $TC_DP6[刀具号 ,1]: 刀具几何参数-刀具半径
; $TC_DP12[刀具号,1]: 刀具磨损- 长度1 方向
; $TC_DP15[刀具号,1]: 刀具磨损- 半径 方向
; $TC_DP24[刀具号,1]: 刀具尺寸0:正常 1: 过大
; 在该子程序中表示空刀套
; $TC_DP25[刀具号,1]: 刀套号
程序结果:
; 通过辅助功能 H1 向 PLC发送编程刀具所在的刀套号以及
; 刀库的旋转方向 (方向通过 H1 的符号表示)
; 特殊情况:
; 在程序仿真和程序测试状态下无刀库和换刀动作. 为使程
; 序仿真时的刀具参数可以起作用, 本固定循环记录仿真前
; 主轴的有效刀具号, 在仿真结束时恢复主轴刀具, 然后再
; 进行换刀.
TM[10]=0 ;跳转标志初始化
IF ((_TM[5]==0)AND($P_ISTEST==1)) GOTOF _SIMU1
IF ((_TM[5]==1)AND($P_ISTEST==1)) GOTOF _SIMU2
IF ((_TM[5]==1)AND($P_ISTEST==0)) GOTOF _E_SIM
_ZSFR[1]=$MN_USER_DATA_INT[0] ;刀库最大刀位数
_ZSFR[2]=_ZSFR[1]/2 ;最大刀位数/2
IF $C_T==$P_TOOLNO GOTOF NOCHG1
IF $C_T>_ZSFR[1] GOTOF NOCHG2;编程刀具> 最大刀具号
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_T_CHG:
IF $C_T<>0 GOTOF _T_N0
;T=0 时, 取出存储的空刀套号vvvvvvvvvvvvvvvvvvvvvvvv
_TM[1]=_TM[4]
GOTOF _T_POS
_T_N0:
MSG("编程刀具号为: T" <<$C_T)
_TM[1]=$TC_DP25[$C_T,1]
_T_POS:
;判断刀库旋转方向vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
_ZSFR[0]=_TM[1]-_TM[0] ;位置差
IF _ZSFR[0]==0 GOTOF _T_STEP
IF (((_ZSFR[0]>0)AND(_ZSFR[0]<=_ZSFR[2]))OR((_ZSFR[0]<0)AND(_ZSFR[0]<-_ZSFR[2]))) GOTOF _MGZ_P
IF (((_ZSFR[0]>0)AND(_ZSFR[0]>=_ZSFR[2]))OR((_ZSFR[0]<0)AND(_ZSFR[0]>-_ZSFR[2]))) GOTOF _MGZ_N
_MGZ_P:
H1=_TM[1]
GOTOF _T_STEP
_MGZ_N:
H1=-_TM[1]
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_T_STEP:
;正常换刀时,T功能生效, 刀具参数在换刀后生效========
;R0=H1
T=$C_T
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
GOTOF _END
_E_SIM:
;--------------------------------------------------
T=_TM[6] ;恢复主轴刀具号
M96 ;主轴刀具参数生效
MSG("恢复主轴刀具号:"<<_TM[6])
G04 F5
_TM[5]=0 ;清除程序测试标记
_TM[6]=0 ;
_TM[10]=0 ;
GOTOB _T_CHG
_SIMU1:
;仿真方式时,T功能生效, 刀具参数立即生效============
_TM[5]=1 ;记录程序测试状态
_TM[6]=$P_TOOLNO ;记录主轴刀具号
_TM[10]=10 ;无换刀动作
_SIMU2:
T=$C_T
M96
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
GOTOF _END
NOCHG1:
_TM[10]=10 ;无换刀动作
MSG("没有换刀: 编程刀具等于主轴刀具 ")
G04 F2
GOTOF _END
NOCHG2:
_TM[10]=10 ;无换刀动作
MSG("没有换刀: 编程刀号超过最大值. 循环启动继续或复位")
M00
_END:
M17
%_N_TOOL_SPF
;$PATH=/_N_CST_DIR
PROC TOOL SAVE DISPLOF
IF _TM[10]==10 GOTOF _END ;没有找到刀具
;--------------------------------------------------
G500 ;取消工件坐标系
D0 ;取消刀补
; Z 轴返回固定点, 主轴准停, Mxx 启动机械手动作
M86 ;SPOS=$MN_USER_DATA_FLOAT[0] ;启动机械手换刀
;--------------------------------------------------
;
;
;
;--------------------------------------------------
IF $C_T==0 GOTOF _RE_T ;还刀
IF $P_TOOLNO==0 GOTOF _IN_T ;取刀
STOPRE
; 交换刀具 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
$TC_DP25[_TM[3],1]=_TM[1] ;编程刀具所在刀套号
$TC_DP24[_TM[3],1]=0 ;清除主轴刀具标志
_TM[3]=$C_T ;主轴刀具套中为编程刀具
STOPRE
$TC_DP25[_TM[3],1]=_TM[4] ;编程刀具所在刀套号
$TC_DP24[_TM[3],1]=1 ;标出在主轴上的刀具
_TM[0]=_TM[1]
MSG("换刀步骤3: 换刀完成")
G04 F1
GOTOF _T_ACT
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_IN_T:
; 装入刀具 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
_TM[3]=$C_T ;主轴刀具套中为编程刀具
_TM[0]=_TM[1] ;刷新当前刀套号
_TM[4]=_TM[1] ;记忆首次取刀的刀套号
$TC_DP24[_TM[3],1]=1 ;标出在主轴上的刀具
MSG("换刀步骤1: 装刀完成")
G04 F1
GOTOF _T_ACT
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
_RE_T:
; 退还刀具 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
$TC_DP24[_TM[3],1]=0 ;清除空刀套的位置
_TM[0]=_TM[4] ;主轴刀具返回空刀套
_TM[3]=0 ;主轴刀具套中刀具号为0
_TM[4]=0 ;主轴刀具套中刀具号为0
MSG("换刀步骤2: 还刀完成")
G04 F1
_T_ACT:
M96 ;激活刀具参数
D1 ;主轴恢复速度控制方式
_TM[0]=_TM[1] ;刷新当前刀套号
STOPRE
_END:
M17
%_N_INI_SPF
;$PATH=/_N_CST_DIR
PROC INI SAVE DISPLOF
_TM[11]=$MN_USER_DATA_INT[0] ;刀库最大刀位数
_TM[0]=1 ;当前刀套号
_TM[1]=0 ;编程刀具所在刀套号
_TM[3]=0 ;主轴刀套中刀具号
_TM[4]=0 ;首次换刀的刀套号
_TM[5]=0 ;非程序测试状态
_TM[6]=0 ;程序测试时主轴刀具号
_TM[10]=1 ;计数器, 换刀步骤
_INI:
$TC_DP25[_TM[10],1]=_TM[10] ;初始化刀套号
$TC_DP24[_TM[10],1]=0 ;标出空刀套的位置
_TM[10]=_TM[10]+1
_TM[11]=_TM[11]-1
IF _TM[11] > 0 GOTOB _INI
_TM[10]=0
M99 ;初始化PLC刀库计数器
T0
M96 ;激活刀具参数
M17
请填写推广理由:
分享
只看
楼主