发布于 2009-05-10 08:15:14
0楼
补充一下 完整的程序大家帮忙分析一下 有联系电话的留一下 指导一下
%_N_LA_SPF
;$PATH=/_N_CUS_DIR
PROC LA(REAL EJE_A) SAVE DISPLOF
DEF REAL _WWW, _VVV, _YYY, _EJE_A_ABS, _R899, _A_ABS, _AUX_DES
DEF REAL _DESBLOQUEO_A
IF(NOT $P_SEARCH)
_BLOQ_A:
IF $A_IN[12]==1 GOTOF _YA_BLOQ_A
M37
G04F2
GOTOB _BLOQ_A
_YA_BLOQ_A:
_BLOQ_B:
IF $A_IN[13]==1 GOTOF _YA_BLOQ
M39 ;B BLOCK
G04F2
GOTOB _BLOQ_B
_YA_BLOQ:
STOPRE
IF $A_IN[15]==0 GOTOF _NO_0
PRESETON(A,0)
R899=0
STOPRE
_NO_0:
IF EJE_A==R899 GOTOF _FIN1 ;SI POS PEDIDA=POS ACTUAL VA AL FINAL
IF $P_S[1]<>0 GOTOF _NREV
M5
S100M3
M5
_NREV:
STOPRE
_AUX_DES=POSITION_UNBLOCK_A-R900
IF _AUX_DES>=0 GOTOF _NO_NEGA1 ;SI A ES POSITIVO, SALTA
_AUX_DES=_AUX_DES+360 ;PONE VALOR POSITIVO EL ANGULO NEGAT.
GOTOF _A1
_NO_NEGA1:
_AUX_DES=_AUX_DES
_A1:
STOPRE
G04F1
IF _AUX_DES+EJE_A>=0 GOTOF _NO_NEGA ;SI A ES POSITIVO, SALTA
_EJE_A_ABS=_AUX_DES+EJE_A+360 ;PONE VALOR POSITIVO EL ANGULO NEGAT.
GOTOF _A
_NO_NEGA:
_EJE_A_ABS=_AUX_DES+EJE_A
_A:
STOPRE
IF _EJE_A_ABS>360 GOTOF _MAYOR ;SI A ES POSITIVO, SALTA
_EJE_A_ABS=_EJE_A_ABS
GOTOF _A3
_MAYOR:
_EJE_A_ABS=_EJE_A_ABS-360 ;SI CALCULADO >360 RESTO
_A3:
STOPRE
;EN LA VARIABLE _EJE_A_ABS, TENDREMOS SIEMPRE EL VALOR ABSOLUTO
;DE LA COTA PROGRAMADA DEL EJE A
IF EJE_A>177.5 GOTOF _ERROR1 ;NO SE PUEDE PROGRAMAR MAYOR DE 180
IF EJE_A<-180.0 GOTOF _ERROR2 ;NI MENOR DE -180
_YYY=EJE_A/2.5 ;CON ESTOS CALCULOS
_WWW=TRUNC(_YYY) ;VEREMOS SI LA COTA
STOPRE ;PROGRAMADA ES MULTIPLO
_VVV=_WWW-_YYY ;DE 2.5
IF _VVV<>0 GOTOF _ERROR3 ;SI NO ES MULTIPLO, ERROR
IF R899>=0 GOTOF _NO_NEGA_S
_R899=R899+360
GOTOF _B
_NO_NEGA_S:
_R899=R899
_B:
R897=$P_S[1]
IF $A_IN[6]==1 GOTOF _GAMA_B ;IN LOW GEAR POSITION
M5
S60M4 ;PASO A GAMA BAJA
G04F0.5
_GAMA_B: ;PROGRAMANDO UNA S DE
_DESBLOQUEO_A=_R899+_AUX_DES
IF _DESBLOQUEO_A>360 GOTOF _RESTAR
_DESBLOQUEO_A=_DESBLOQUEO_A
GOTOF _SEGUIR
_RESTAR:
_DESBLOQUEO_A=_DESBLOQUEO_A-360
_SEGUIR:
M5 ;GAMA BAJA Y LUEGO PARO
SPOS=_DESBLOQUEO_A ;POSICIONA CAB PARA DESBLOQUEAR
STOPRE
G4F0.1
G01 F8000 SPINDLE=_DESBLOQUEO_A ;PASAMOS EL CABEZAL A EJE
_DESB_A:
M36 ;DESBLOQUEAMOS EJE A
STOPRE
IF $A_IN[11]==0 GOTOB _DESB_A
G04F3.5
IF EJE_A==R899 GOTOF _FIN ;SI POS PEDIDA=POS ACTUAL VA AL FINAL
IF EJE_A==177.5 GOTOF _POS1 ;Si queremos ir a 177.5º
IF EJE_A==-180.0 GOTOF _POS2 ;Si queremos ir a -180º
$MA_POSCTRL_GAIN[0,AX5]=0.5
STOPRE
NEWCONF
STOPRE
G94
_POS:
IF EJE_A-R899>0 GOTOF _POS11
IF _EJE_A_ABS+COMPENSATION_A_NEG>=0 GOTOF _M1
G01 F18000 SPINDLE=ACN(_EJE_A_ABS+COMPENSATION_A_NEG+360)
R896=_EJE_A_ABS
GOTOF _M2
_M1:
G01 F18000 SPINDLE=ACN(_EJE_A_ABS+COMPENSATION_A_NEG)
R896=_EJE_A_ABS
_M2: ;NUEVO
GOTOF _POSI
_POS11:
IF _EJE_A_ABS+COMPENSATION_A_POS>=0 GOTOF _M3
G01 F18000 SPINDLE=ACP(_EJE_A_ABS+COMPENSATION_A_POS+360)
R896=_EJE_A_ABS
GOTOF _M4
_M3:
G01 F18000 SPINDLE=ACP(_EJE_A_ABS+COMPENSATION_A_POS)
R896=_EJE_A_ABS
_M4:
GOTOF _POSI
_POS1:
;IF R899<>-180.0 GOTOB _POS
;MSG("PASA POR EL PUNTO 5")
;M0
;MSG("") ;M00
;G01 F8000 SPINDLE=ACP(_EJE_A_ABS+COMPENSATION_A_POS)
;GOTOF _POSI
_POS2:
IF R899<>180.0 GOTOB _POS
G01 F18000 SPINDLE=ACN(_EJE_A_ABS+COMPENSATION_A_NEG)
R896=_EJE_A_ABS
GOTOF _POSI
_POSI:
STOPRE
G04F1
_BL_A:
M37 ;BLOQUEAR EJE A
IF $A_IN[12]==0 GOTOB _BL_A ;SI NO BLOQUEADO, SALTA
R899=EJE_A
STOPRE
;POSITION_ACTUAL_A=EJE_A
M5
STOPRE
GOTOF _FIN
_ERROR1:
MSG("EL VALOR PROGRAMADO ES MAYOR DE 180º")
GOTOB _ERROR1
_ERROR2:
MSG("EL VALOR PROGRAMADO ES MENOR DE -180º")
GOTOB _ERROR2
_ERROR3:
MSG("EL VALOR PROGRAMADO NO ES MULTIPLO DE 2.5º")
GOTOB _ERROR3
_FIN:
PRESETON(A,R899);;;;;;;;;;;;
STOPRE
CHEQUEO_POSICION_A
G04F0.2
S=R897 ;(M3) ;PASAMOS EL A A MODO CABEZAL
M5
G4 F0.2
_FIN1:
PRESETON(A,R899) ;EN PANTALLA VEREMOS LA COTA DEL A
$TC_CARR14[1]=R899 ;LLEVAMOS COTA DE A PARA PLANO INCLINADO
STOPRE
MSG()
_BLC:
IF $A_IN[12]==0 GOTOB _BLC ;SI A NO ESTA BLOQUEADO, ESPERA
STOPRE
DECALAJE
ENDIF
$MA_POSCTRL_GAIN[0,AX5]=1
STOPRE
NEWCONF
STOPRE
TCARR=1
TOROT
M17
M36 A 伸出指令
M37 A 缩回指令
$A_IN[12] A缩进到位检测
$A_IN[11] A伸出到位检测
另外的信号是关于B的状态的检测
学无止境
QQ :85830300 : MSN : fengyileng@live.cn