更新KUKA程序

This commit is contained in:
zhusenlin
2026-02-06 19:32:09 +08:00
parent fdd197f9cd
commit bdc205a668
77 changed files with 10688 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
&ACCESS RVO
&REL 1
&COMMENT BrkTst-main task for unconfigured brake test axes
&PARAM EDITMASK = *
&PARAM DISKPATH = KRC:\R1\TP\BrakeTest
DEFDAT BrakeTestAxes PUBLIC
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
DECL INT SUCCESS
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLERATIONS)
ENDDAT

View File

@@ -0,0 +1,30 @@
&ACCESS RVO
&REL 1
&COMMENT BrkTst-main task for unconfigured brake test axes
&PARAM EDITMASK = *
&PARAM DISKPATH = KRC:\R1\TP\BrakeTest
DEF BRAKETESTAXES(AxesBitMask: IN)
;BRAKETESTAXES(AxesBitMask: IN)
;examples for parameter AxesBitMask
;no parameter or -1 means all configured axes
;'b00000000000011' means axis 1 and 2
;'b10000000000001' means axis 1 and 12
;'b11000000000000' means axis 11 and 12
;FOLD {H}
INT AxesBitMask
ON_ERROR_PROCEED
AxesBitMask=AxesBitMask*1
IF ($ERR.Number<>0) THEN
AxesBitMask=-1
ERR_CLEAR($ERR)
ELSE
ERR_RAISE($ERR)
ENDIF
gBraketestForce=true
BRAKETESTREQ(AxesBitMask)
gBraketestForce=false
;ENDFOLD
END

View File

@@ -0,0 +1,17 @@
&ACCESS RV
&REL 1
&COMMENT path after test
&PARAM EDITMASK = *
&PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
DEFDAT BrakeTestBack
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
EXT BAS (BAS_COMMAND :IN,REAL :IN )
DECL INT SUCCESS
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;Make here your modifications
;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLERATIONS)
ENDDAT

View File

@@ -0,0 +1,19 @@
&ACCESS RV
&REL 1
&COMMENT path after test
&PARAM EDITMASK = *
&PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
DEF BrakeTestBack( )
;FOLD INI
;FOLD BASISTECH INI
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
;ENDFOLD (BASISTECH INI)
;FOLD USER INI
;Make your modifications here
;ENDFOLD (USER INI)
;ENDFOLD (INI)
;Teach here the motion to the position after the brake test.
END

View File

@@ -0,0 +1,19 @@
&ACCESS RV
&REL 1
&COMMENT parkposition
&PARAM EDITMASK = *
&PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
&PARAM DISKPATH = KRC:\R1\TP\BrakeTest
DEFDAT BRAKETESTPARK PUBLIC
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
EXT BAS (BAS_COMMAND :IN,REAL :IN )
DECL INT SUCCESS
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;Make here your modifications
;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLERATIONS)
DECL E6AXIS XParkPosition={A1 999.000,A2 999.000,A3 999.000,A4 999.000,A5 999.000,A6 999.000,E1 999.000,E2 999.000,E3 999.000,E4 999.000,E5 999.000,E6 999.000}
DECL FDAT FParkPosition={TOOL_NO 1,BASE_NO 0,IPO_FRAME #BASE,POINT2[] " "}
ENDDAT

View File

@@ -0,0 +1,35 @@
&ACCESS RV
&REL 1
&COMMENT parkposition
&PARAM EDITMASK = *
&PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
&PARAM DISKPATH = KRC:\R1\TP\BrakeTest
DEF BrakeTestPark( )
;FOLD INI
;FOLD BASISTECH INI
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
;ENDFOLD (BASISTECH INI)
;FOLD USER INI
;Make your modifications here
;ENDFOLD (USER INI)
;ENDFOLD (INI)
;Teach here the motion to the parking position. The parking position is needed when the robot has failed the brake test.
;FOLD {h}
WHILE ParkPositionInNotValid()
MsgDialog(SUCCESS,"ParkPositionIsNotValid",brakeTestMdbName[],,,,,,,"Ok")
HALT
ENDWHILE
;ENDFOLD
;FOLD SPTP ParkPosition Vel=10 % DEFAULT Tool[1] Base[0] ;%{PE}
;FOLD Parameters ;%{h}
;Params IlfProvider=kukaroboter.basistech.inlineforms.movement.spline; Kuka.IsGlobalPoint=False; Kuka.PointName=ParkPosition; Kuka.BlendingEnabled=False; Kuka.MoveDataPtpName=DEFAULT; Kuka.VelocityPtp=10; Kuka.VelocityFieldEnabled=True; Kuka.ColDetectFieldEnabled=True; Kuka.CurrentCDSetIndex=0; Kuka.MovementParameterFieldEnabled=True; IlfCommand=SPTP
;ENDFOLD
SPTP XParkPosition WITH $VEL_AXIS[1] = SVEL_JOINT(10.0), $TOOL = STOOL2(FParkPosition), $BASE = SBASE(FParkPosition.BASE_NO), $IPO_MODE = SIPO_MODE(FParkPosition.IPO_FRAME), $LOAD = SLOAD(FParkPosition.TOOL_NO), $ACC_AXIS[1] = SACC_JOINT(PDEFAULT), $APO = SAPO_PTP(PDEFAULT), $GEAR_JERK[1] = SGEAR_JERK(PDEFAULT), $COLLMON_TOL_PRO[1] = USE_CM_PRO_VALUES(0)
;ENDFOLD
END
;FOLD {h}
Global DEFFCT BOOL ParkPositionInNotValid()
RETURN ((XParkPosition.A1 == 999) AND (XParkPosition.A2 == 999) AND (XParkPosition.A3 == 999) AND (XParkPosition.A4 == 999) AND (XParkPosition.A5 == 999) AND (XParkPosition.A6 == 999) AND (XParkPosition.E1 == 999) AND (XParkPosition.E2 == 999) AND (XParkPosition.E3 == 999) AND (XParkPosition.E4 == 999) AND (XParkPosition.E5 == 999) AND (XParkPosition.E6 == 999))
ENDFCT
;ENDFOLD

View File

@@ -0,0 +1,24 @@
&ACCESS RVO
&REL 1
&COMMENT BrkTst-main task
&PARAM EDITMASK = *
&PARAM DISKPATH = TP/BrakeTest
DEFDAT BRAKETESTREQ PUBLIC
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
DECL INT SUCCESS
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLERATIONS)
DECL BRAKE_STATE RobotBrkState
GLOBAL CHAR brakeTestMdbName[30]
brakeTestMdbName[]="BrkTst"
GLOBAL INT MaxCountResultUnknown = 10
GLOBAL BOOL gBraketestForce=false
DECL INT CountResultUnknown = 0
ENDDAT

View File

@@ -0,0 +1,122 @@
&ACCESS RVO
&REL 1
&COMMENT BrkTst-main task
&PARAM EDITMASK = *
&PARAM DISKPATH = TP/BrakeTest
DEF BRAKETESTREQ(AxesBitMask: IN)
;BRAKETESTREQ
;fold {h}
INT Idx, Key, AxesBitMask
BOOL Test_Ende
BOOL BraketestForce
BraketestForce=false
IF gBraketestForce THEN
BraketestForce=true
ENDIF
gBraketestForce=false
ON_ERROR_PROCEED
AxesBitMask=AxesBitMask*1
IF ($ERR.Number<>0) THEN
AxesBitMask=-1
ERR_CLEAR($ERR)
ELSE
ERR_RAISE($ERR)
ENDIF
IF Varstate("$pro_ip.si01.name[]")==#declared THEN ;program selected
MsgDialog(Key, "DlgPeformManuallyBrakeTest", brakeTestMdbName[], , "Cancel", "GoToPark", "BTman",,,,,FALSE)
SWITCH Key ;dialogue answer
CASE 5
BraketestForce=TRUE
CASE 6
BrakeTestStart()
BraketestError()
CASE 7
Return
DEFAULT
Return
ENDSWITCH
ELSE ;cyclic call
IF NOT($BRAKETEST_REQ_INT) AND NOT(BraketestForce) THEN
Return
ENDIF
ENDIF
Test_Ende=false
RobotBrkState=#BT_UNTESTED
BrakeTestStart()
BAS (#INITMOV,0 )
repeat
PTP $AXIS_ACT
RobotBrkState = Test_BRAKE(AxesBitMask, BraketestForce)
SWITCH RobotBrkState
CASE #BT_WARNING,#BT_EXCESSIVE, #BT_MAXUNKNOWN, #BT_READY
CountResultUnknown = 0
Test_Ende = TRUE
CASE #BT_ERROR
BraketestError()
CASE #BT_UNKNOWN
Test_Ende = BraketestUnknown()
CASE #BT_UNTESTED
Test_Ende = TRUE
ENDSWITCH
until Test_Ende
BrakeTestBack()
END
DEF BraketestError()
INT Key
Key = 0
MsgDialog(Key, "BT_BRAKE_ERROR", brakeTestMdbName[]," ", "GoToPark",,,,,,,FALSE)
BrakeTestPark()
WAIT FOR TRUE
repeat
MsgNotify("ParkPositionReached", brakeTestMdbName[])
halt
until false
END
DEFFCT BOOL BraketestUnknown()
INT Key
Key=0
CountResultUnknown = CountResultUnknown + 1
IF (CountResultUnknown >= MaxCountResultUnknown) THEN
MsgDialog(Key, "BT_BRAKE_UNKNOWN", brakeTestMdbName[]," ", "TryAgain", "Cancel",,,,,,FALSE)
IF Key==7 then
Return FALSE
ELSE
Return TRUE
ENDIF
ELSE
Return TRUE
ENDIF
ENDFCT
;endfold

View File

@@ -0,0 +1,17 @@
&ACCESS RV
&REL 1
&COMMENT path to test
&PARAM EDITMASK = *
&PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
DEFDAT BrakeTestStart
;FOLD EXTERNAL DECLARATIONS;%{PE}%MKUKATPBASIS,%CEXT,%VCOMMON,%P
;FOLD BASISTECH EXT;%{PE}%MKUKATPBASIS,%CEXT,%VEXT,%P
EXT BAS (BAS_COMMAND :IN,REAL :IN )
DECL INT SUCCESS
;ENDFOLD (BASISTECH EXT)
;FOLD USER EXT;%{E}%MKUKATPUSER,%CEXT,%VEXT,%P
;Make here your modifications
;ENDFOLD (USER EXT)
;ENDFOLD (EXTERNAL DECLERATIONS)
ENDDAT

View File

@@ -0,0 +1,19 @@
&ACCESS RV
&REL 1
&COMMENT path to test
&PARAM EDITMASK = *
&PARAM TEMPLATE = C:\KRC\Roboter\Template\vorgabe
DEF BrakeTestStart( )
;FOLD INI
;FOLD BASISTECH INI
GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
INTERRUPT ON 3
;ENDFOLD (BASISTECH INI)
;FOLD USER INI
;Make your modifications here
;ENDFOLD (USER INI)
;ENDFOLD (INI)
;Teach here the motion to the start position of the brake test.
END

View File

@@ -0,0 +1,27 @@
&ACCESS RO
&REL 2396
&PARAM DISKPATH = KRC:\R1\TP\EthernetKRL
DEFDAT EthernetKRL PUBLIC
;************************************************************
; CopyRight KUKA Deutschland GmbH 2018
; last modified 23.11.2016
; prefix EKI
; functions Interface between KRL and Ethernet (non Realtime)
; This file is mainly designed to communicate
; with external devices like sensors, vision
; systems, other controllers and so on.
;************************************************************
;FOLD EKI_Declaration
;FOLD INTERNAL
GLOBAL STRUC EKI_STATUS INT Buff,Read,Msg_No,BOOL Connected,INT Counter
DECL CONST EKI_STATUS EKI_NULL_STATUS={Buff 0,Read 0,Msg_No 0,Connected FALSE,Counter 0}
DECL CONST INT TYPEFRAME=6
DECL CONST INT TYPENULL=0
DECL CONST INT ERRMSG_FORBIDDEN = 32768
DECL CONST INT ERRMSG_ALL = 32767
;ENDFOLD
;ENDFOLD EKI_Declaration
ENDDAT

View File

@@ -0,0 +1,707 @@
&ACCESS RO
&REL 2396
&PARAM DISKPATH = KRC:\R1\TP\EthernetKRL
DEF EthernetKRL( )
;************************************************************
; CopyRight KUKA Deutschland GmbH 2018
; last modified 11.07.2012
; prefix EKI
; functions Interface between KRL and Ethernet (non Realtime)
; This file is mainly designed to communicate
; with external devices like sensors, vision
; systems, other controllers and so on.
;************************************************************
END
;FOLD EKI_InternalProgram
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_Init(strChannelName[]:IN)
DECL CHAR strChannelName[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Ret = EKI_NULL_STATUS
Mode = #SYNC
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Init",strChannelName[])
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_Close(strChannelName[]:IN)
DECL CHAR strChannelName[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Ret = EKI_NULL_STATUS
Mode = #SYNC
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Close",strChannelName[])
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_LOCK(strChannelName[]:IN)
DECL CHAR strChannelName[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
DECL BOOL LOCK
Ret = EKI_NULL_STATUS
Mode = #SYNC
LOCK = TRUE
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_LockUnLock",strChannelName[], LOCK, Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_UNLOCK(strChannelName[]:IN)
DECL CHAR strChannelName[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
DECL BOOL LOCK
Ret = EKI_NULL_STATUS
Mode = #SYNC
LOCK = FALSE
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_LockUnLock",strChannelName[], LOCK, Ret.Connected)
; interrupt timeout to detect new edge
CONTINUE
wait sec 0.002
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_ClearBuffer(strChannelName[]:IN,strPlace[]:IN)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Ret = EKI_NULL_STATUS
Mode = #SYNC
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_ClearBuff",strChannelName[],strPlace[],Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_Open(strChannelName[]:IN)
DECL CHAR strChannelName[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Open",strChannelName[])
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
IF (Ret.Msg_No == 0) THEN
Ret.Connected = true
ENDIF
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_Clear(strChannelName[]:IN)
DECL CHAR strChannelName[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Clear",strChannelName[])
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_GetInteger(strChannelName[]:IN,strPlace[]:IN,value:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL INT value
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value,Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
GLOBAL DEFFCT EKI_STATUS EKI_GetInt(strChannelName[]:IN,strPlace[]:IN,value:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL INT value
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value,Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_GetIntegerArray(strChannelName[]:IN,strPlace[]:IN,value[]:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL INT value[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value[],Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
GLOBAL DEFFCT EKI_STATUS EKI_GetIntArray(strChannelName[]:IN,strPlace[]:IN,value[]:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL INT value[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value[],Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_GetBool(strChannelName[]:IN,strPlace[]:IN,value:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL BOOL value
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value,Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
GLOBAL DEFFCT EKI_STATUS EKI_GetBoolArray(strChannelName[]:IN,strPlace[]:IN,value[]:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL BOOL value[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value[],Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_GetReal(strChannelName[]:IN,strPlace[]:IN,value:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL REAL value
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value,Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
GLOBAL DEFFCT EKI_STATUS EKI_GetRealArray(strChannelName[]:IN,strPlace[]:IN,value[]:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL REAL value[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value[],Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_GetString(strChannelName[]:IN,strPlace[]:IN,value[]:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL CHAR value[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],value[],Ret.Buff, Ret.Read, TYPENULL,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_GetFrame(strChannelName[]:IN,strPlace[]:IN,value:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL FRAME value
DECL CHAR Buff[24]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
DECL INT Offset
Mode = #SYNC
Ret = EKI_NULL_STATUS
Ret.buff=1
Offset = 0
Cast_To(Buff[], Offset,value)
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],Buff[],Ret.Buff, Ret.Read, TYPEFRAME,Ret.Connected, Ret.Counter)
Offset=0
Cast_From(Buff[], Offset,value)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
GLOBAL DEFFCT EKI_STATUS EKI_GetFrameArray(strChannelName[]:IN,strPlace[]:IN,value[]:OUT)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL FRAME value[]
DECL CHAR Buff[3600]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
DECL INT Offset
DECL INT i,arraysize
DECL BOOL ReadContinue
DECL INT MayArrSz
DECL INT ReadElements
MayArrSz = 150
Mode = #SYNC
Ret = EKI_NULL_STATUS
REPEAT
ReadContinue = false
ReadElements=0
arraysize=0
; detect array size!
Offset=0
WHILE(($ERR.NUMBER==0) AND (arraysize<MayArrSz))
arraysize = arraysize + 1
ON_ERROR_PROCEED
CAST_TO(Buff[],Offset,value[arraysize+Ret.read])
ENDWHILE
IF ((arraysize+Ret.read == 1) AND ($ERR.NUMBER<>0)) THEN
Ret.Msg_No = -26
EXIT
ENDIF
IF ((arraysize == 1) AND ($ERR.NUMBER<>0)) THEN
EXIT
ENDIF
IF ((arraysize == MayArrSz) AND ($ERR.NUMBER==0)) THEN
ReadContinue = true;
ELSE
arraysize = arraysize - 1
ENDIF
Ret.Buff = arraysize
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Get",strChannelName[],strPlace[],Buff[],Ret.Buff,ReadElements, TYPEFRAME,Ret.Connected, Ret.Counter)
Offset = 0
FOR i=1 to ReadElements
Cast_From(Buff[], Offset,value[i + Ret.Read])
ENDFOR
Ret.Read = Ret.Read + ReadElements
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
UNTIL ((Ret.Msg_No <> 0) OR (ReadContinue == false) OR (Ret.Buff == 0) OR (arraysize<MayArrSz))
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_Send(strChannelName[]:IN,strPlace[]:IN, Len:IN)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
DECL INT Len
Mode = #SYNC
Ret = EKI_NULL_STATUS
IF (VARSTATE("Len") == #Declared) THEN
Len = 0
ENDIF
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Send",strChannelName[],strPlace[],Ret.Connected,Len)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_SetInt(strChannelName[]:IN,strPlace[]:IN,value:IN)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL INT value
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Set",strChannelName[],strPlace[],value,TYPENULL,Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_SetReal(strChannelName[]:IN,strPlace[]:IN,value:IN)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL REAL value
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Set",strChannelName[],strPlace[],value,TYPENULL,Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_SetBool(strChannelName[]:IN,strPlace[]:IN,value:IN)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL BOOL value
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Set",strChannelName[],strPlace[],value,TYPENULL,Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_SetString(strChannelName[]:IN,strPlace[]:IN,value[]:IN)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL CHAR value[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Set",strChannelName[],strPlace[],value[],TYPENULL,Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_SetFrame(strChannelName[]:IN,strPlace[]:IN,value:IN)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL FRAME value
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
DECL CHAR BUFF[24]
DECL INT Offset
Mode = #SYNC
Ret = EKI_NULL_STATUS
Offset = 0
Cast_To(BUFF[], Offset,value)
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_Set",strChannelName[],strPlace[], BUFF[], TYPEFRAME,Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_SetParameter(strChannelName[]:IN,strParName[]:IN,strValue[]:IN)
DECL CHAR strChannelName[]
DECL CHAR strParName[]
DECL CHAR strValue[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_SetParam",strChannelName[],strParName[],strValue[],Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
GLOBAL DEF EKI_Check(Ret:IN,Type:IN,strChannelName[]:IN)
DECL CHAR strChannelName[]
DECL EKI_STATUS Ret
DECL EKrlMsgType Type
INT Handle
DECL KrlMsg_T name
DECL KrlMsgPar_T params[3]
DECL KrlMsgOpt_T options
DECL STATE_T Stat
DECL MODUS_T Mode
DECL INT Offset
DECL INT Filter
DECL INT i
IF (VARSTATE("strChannelName[]")==#INITIALIZED) THEN
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_CheckErr",strChannelName[],Ret.Connected)
Ret.Msg_No = -Stat.Msg_No
ENDIF
Ret.Msg_No = (ERRMSG_ALL B_AND Ret.Msg_No)
IF (Ret.Msg_No <>0) THEN
name={modul[] "EthernetKRL", Nr 1, msg_txt[] "0"}
Filter = 255
FOR i=(0) TO (1)
name.nr = (Ret.Msg_No B_AND Filter)
IF (name.nr <> 0) THEN
Offset = 0
CONTINUE
SWRITE(name.msg_txt[],Stat,Offset,"eki%i",name.nr)
Handle = Set_KrlMsg(Type, name, params[], options)
ENDIF
Filter = 65280
ENDFOR
IF(Type==#Quit) THEN
WHILE(Exists_KrlMsg(Handle))
wait sec 0.2
ENDWHILE
ENDIF
ENDIF
IF (VARSTATE("strChannelName[]")==#INITIALIZED) THEN
EKI_Check_User(Ret,Type,strChannelName[])
ELSE
EKI_Check_User(Ret,Type)
ENDIF
END
; ===========================================================
GLOBAL DEFFCT EKI_STATUS EKI_CheckBuffer(strChannelName[]:IN,strPlace[]:IN)
DECL CHAR strChannelName[]
DECL CHAR strPlace[]
DECL STATE_T Stat
DECL MODUS_T Mode
DECL EKI_STATUS Ret
Mode = #SYNC
Ret = EKI_NULL_STATUS
CONTINUE
CWRITE($FCT_CALL,Stat,Mode,"EFC_eki_CheckBuff",strChannelName[],strPlace[],Ret.Buff,Ret.Connected, Ret.Counter)
Ret.Msg_No = -Stat.Msg_No
showMsgDepend(Ret)
RETURN Ret
ENDFCT
; ===========================================================
DEF showMsgDepend(Ret:OUT)
DECL EKI_STATUS Ret
IF (Ret.Msg_no B_AND ERRMSG_FORBIDDEN)==0 THEN
EKI_CHECK(Ret,#QUIT)
ENDIF
Ret.Msg_no = Ret.Msg_no B_AND ERRMSG_ALL
END
;ENDFOLD EKI_InternalProgram

View File

@@ -0,0 +1,39 @@
&ACCESS RO
&REL 2314
&PARAM DISKPATH = TP/EthernetKRL
DEF EthernetKRL_USER( )
;************************************************************
; CopyRight KUKA Deutschland GmbH 2018
; last modified 11.07.2012
; prefix EKI
; functions user routine for error handling
;************************************************************
END
;FOLD EKI_UserProgram
; ===========================================================
GLOBAL DEF EKI_Check_User(Ret:IN,Type:IN,strChannelName[]:IN)
;FOLD Initialize variables
DECL CHAR strChannelName[]
DECL EKI_STATUS Ret
DECL EKrlMsgType Type
INT Handle
DECL KrlMsg_T name
DECL KrlMsgPar_T params[3]
DECL KrlMsgOpt_T options
DECL STATE_T Stat
DECL MODUS_T Mode
DECL BOOL B
DECL INT Offset
;ENDFOLD
IF (VARSTATE("strChannelName[]")==#INITIALIZED) THEN
; strChannelName is initialized
ENDIF
;************************************************************
;write your error handling here
;************************************************************
END
;ENDFOLD EKI_UserProgram

View File

@@ -0,0 +1,3 @@
&ACCESS RV
DEFDAT SIGNALS PUBLIC
ENDDAT

103
KUKA/KRC/R1/TP/p00.dat Normal file
View File

@@ -0,0 +1,103 @@
&ACCESS R1
&COMMENT EXTERNAL package
DEFDAT P00
BOOL PLC_ENABLE=FALSE ; Enable error-code transmission to plc
INT I
INT F_NO=1
INT MAXERR_C=1 ; maximum messages for $STOPMESS
INT MAXERR_A=1 ; maximum messages for APPLICATION
DECL STOPMESS MLD
SIGNAL ERR $OUT[25] TO $OUT[32]
BOOL FOUND
STRUC PRESET INT OUT,CHAR PKG[3],INT ERR
DECL PRESET P[255]
; z.B. P[1] FEHLERCODE AN SPS = 1
;WENN:
;AUTOMATIK_EXTERN PKG[] = "P00"
;PARITAETSFEHLER = 10
; z.B. P[128] FEHLERCODE AN SPS = 128
;WENN:
;$STOPMESS-MELDUNG PKG[] = "CTL"
;NOT-AUS: = 1
; APPLICATION MESSAGES: P[1]...P[127]
P[1]={OUT 2,PKG[] "P00",ERR 10}
;...
;...
; $STOPMESS MESSAGES: P[128]...P[255]
P[128]={OUT 128,PKG[] "CTL",ERR 1}
;...
;...
P[255]={OUT 255,PKG[] "CTL",ERR 1001}
STRUC ERR_MESS CHAR P[3],INT E
DECL ERR_MESS ERR_FILE[64]
ERR_FILE[1]={P[] "XXX",E 0}
ERR_FILE[2]={P[] "XXX",E 0}
ERR_FILE[3]={P[] "XXX",E 0}
ERR_FILE[4]={P[] "XXX",E 0}
ERR_FILE[5]={P[] "XXX",E 0}
ERR_FILE[6]={P[] "XXX",E 0}
ERR_FILE[7]={P[] "XXX",E 0}
ERR_FILE[8]={P[] "XXX",E 0}
ERR_FILE[9]={P[] "XXX",E 0}
ERR_FILE[10]={P[] "XXX",E 0}
ERR_FILE[11]={P[] "XXX",E 0}
ERR_FILE[12]={P[] "XXX",E 0}
ERR_FILE[13]={P[] "XXX",E 0}
ERR_FILE[14]={P[] "XXX",E 0}
ERR_FILE[15]={P[] "XXX",E 0}
ERR_FILE[16]={P[] "XXX",E 0}
ERR_FILE[17]={P[] "XXX",E 0}
ERR_FILE[18]={P[] "XXX",E 0}
ERR_FILE[19]={P[] "XXX",E 0}
ERR_FILE[20]={P[] "XXX",E 0}
ERR_FILE[21]={P[] "XXX",E 0}
ERR_FILE[22]={P[] "XXX",E 0}
ERR_FILE[23]={P[] "XXX",E 0}
ERR_FILE[24]={P[] "XXX",E 0}
ERR_FILE[25]={P[] "XXX",E 0}
ERR_FILE[26]={P[] "XXX",E 0}
ERR_FILE[27]={P[] "XXX",E 0}
ERR_FILE[28]={P[] "XXX",E 0}
ERR_FILE[29]={P[] "XXX",E 0}
ERR_FILE[30]={P[] "XXX",E 0}
ERR_FILE[31]={P[] "XXX",E 0}
ERR_FILE[32]={P[] "XXX",E 0}
ERR_FILE[33]={P[] "XXX",E 0}
ERR_FILE[34]={P[] "XXX",E 0}
ERR_FILE[35]={P[] "XXX",E 0}
ERR_FILE[36]={P[] "XXX",E 0}
ERR_FILE[37]={P[] "XXX",E 0}
ERR_FILE[38]={P[] "XXX",E 0}
ERR_FILE[39]={P[] "XXX",E 0}
ERR_FILE[40]={P[] "XXX",E 0}
ERR_FILE[41]={P[] "XXX",E 0}
ERR_FILE[42]={P[] "XXX",E 0}
ERR_FILE[43]={P[] "XXX",E 0}
ERR_FILE[44]={P[] "XXX",E 0}
ERR_FILE[45]={P[] "XXX",E 0}
ERR_FILE[46]={P[] "XXX",E 0}
ERR_FILE[47]={P[] "XXX",E 0}
ERR_FILE[48]={P[] "XXX",E 0}
ERR_FILE[49]={P[] "XXX",E 0}
ERR_FILE[50]={P[] "XXX",E 0}
ERR_FILE[51]={P[] "XXX",E 0}
ERR_FILE[52]={P[] "XXX",E 0}
ERR_FILE[53]={P[] "XXX",E 0}
ERR_FILE[54]={P[] "XXX",E 0}
ERR_FILE[55]={P[] "XXX",E 0}
ERR_FILE[56]={P[] "XXX",E 0}
ERR_FILE[57]={P[] "XXX",E 0}
ERR_FILE[58]={P[] "XXX",E 0}
ERR_FILE[59]={P[] "XXX",E 0}
ERR_FILE[60]={P[] "XXX",E 0}
ERR_FILE[61]={P[] "XXX",E 0}
ERR_FILE[62]={P[] "XXX",E 0}
ERR_FILE[63]={P[] "XXX",E 0}
ERR_FILE[64]={P[] "XXX",E 0}
ENDDAT

452
KUKA/KRC/R1/TP/p00.src Normal file
View File

@@ -0,0 +1,452 @@
&ACCESS R1
&COMMENT EXTERNAL package
DEF P00 (COMMAND :IN,PGNO_FUNCT :IN,P_ID[] :OUT,E_NO :IN )
DECL P00_COMMAND COMMAND
DECL FUNCT_TYPE PGNO_FUNCT
DECL CHAR P_ID[]
E6AXIS AK_AXIS
REAL AX_DIST
INT E_NO
SWITCH COMMAND
CASE #INIT_EXT
INIT_EXT ( )
CASE #EXT_PGNO
EXT_PGNO (PGNO_FUNCT )
CASE #CHK_HOME
CHK_HOME ( )
CASE #EXT_ERR
EXT_ERR (P_ID[],E_NO )
ENDSWITCH
END
DEF INIT_EXT ( )
;********************************
; Function: initializing of the
; external interface
;********************************
BOOL ERROR
INT N
PGNO_ERROR=0
;********************************
;CHECK HOME
;********************************
;********************************
;INIT PGNO_REQ UND APPL_RUN
;********************************
IF (PGNO_REQ>0) THEN
$OUT[PGNO_REQ]=FALSE
ENDIF
IF (PGNO_REQ<0) THEN
$OUT[-PGNO_REQ]=TRUE
ENDIF
IF (APPL_RUN>0) THEN
$OUT[APPL_RUN]=FALSE
ENDIF
IF PLC_ENABLE AND (ERR_TO_PLC>0) THEN
$OUT[ERR_TO_PLC]=FALSE
ENDIF
IF REFLECT_PROG_NR==1 THEN
FOR N=0 TO PGNO_LENGTH-1
$OUT[PGNO_FBIT_REFL+N]=FALSE
ENDFOR
ENDIF
;*******************
REPEAT
;***********************************************************
ERROR=FALSE
REPEAT
IF ($I_O_ACTCONF==FALSE) THEN
ERROR=TRUE
MsgQuit("OperatorModeWrong", "P00")
ENDIF
UNTIL ($I_O_ACTCONF==TRUE)
SWITCH PGNO_TYPE
;*********************************************************
CASE 1,2 ;bci-coding,bcd-coding
;*********************************************************
;***** CHECK PGNO_LENGTH *****
IF (PGNO_LENGTH<1) THEN
ERROR=TRUE ;pgno_length
MsgQuit("PgNo_LengthRangeWrong", "P00")
ENDIF
IF (PGNO_TYPE==1) THEN ;bci-coding
IF (PGNO_LENGTH>16) THEN
ERROR=TRUE ;pgno_length
MsgQuit("PgNo_LengthRangeWrong", "P00")
ENDIF
ENDIF
IF (PGNO_TYPE==2) THEN ;bcd-coding
SWITCH PGNO_LENGTH
CASE 4,8,12,16
DEFAULT
ERROR=TRUE ;pgno_length
MsgQuit("PgNo_LengthWrong", "P00")
ENDSWITCH
ENDIF
;***** CHECK PGNO_FBIT *****
IF (PGNO_FBIT<1) THEN
ERROR=TRUE ;pgno_fbit
MsgQuit("PgNo_FBitWrong", "P00")
ENDIF
;***** CHECK PGNO_REQ *****
IF (PGNO_REQ==0) THEN
ERROR=TRUE ;pgno_req
MsgQuit("PgNo_ReqWrong", "P00")
ENDIF
IF (PGNO_REQ>0) THEN ;active high
$OUT[PGNO_REQ]=FALSE ;reset
WAIT SEC 0.2 ;delay for plc
ENDIF
IF (PGNO_REQ<0) THEN ;active low
$OUT[PGNO_REQ*(-1)]=TRUE ;reset
WAIT SEC 0.2 ;delay for plc
ENDIF
;*********************************************************
CASE 3 ;one out of n
;*********************************************************
;***** CHECK PGNO_LENGTH *****
IF (PGNO_LENGTH<1) THEN
ERROR=TRUE ;pgno_length
MsgQuit("PgNo_LengthRangeWrong", "P00")
ENDIF
IF (PGNO_LENGTH>16) THEN
ERROR=TRUE ;pgno_length
MsgQuit("PgNo_LengthRangeWrong", "P00")
ENDIF
;***** CHECK PGNO_FBIT *****
IF (PGNO_FBIT<1) THEN
ERROR=TRUE ;pgno_fbit
MsgQuit("PgNo_FBitWrong", "P00")
ENDIF
;*********************************************************
DEFAULT ;PGNO_TYPE wrong type
;*********************************************************
ERROR=TRUE ;pgno_type
MsgQuit ("PgNo_TypeWrong", "P00")
ENDSWITCH
;***********************************************************
UNTIL (ERROR==FALSE)
END
DEF EXT_PGNO (FUNCT :OUT )
;********************************
; Function: communication program
; for external mode
;********************************
DECL FUNCT_TYPE FUNCT
INT I,J,K,L,M,N,nHandle
BOOL P_RECV,P_CALC,bRes
J=1
K=0
L=1
P_RECV=FALSE
P_CALC=FALSE
IF (APPL_RUN>0) THEN
$OUT[APPL_RUN]=FALSE
ENDIF
SWITCH FUNCT
;*******************
CASE #PGNO_ACKN
;*******************
IF (PGNO_REQ>0) THEN
$OUT[PGNO_REQ]=FALSE
ENDIF
IF (PGNO_REQ<0) THEN
$OUT[PGNO_REQ*(-1)]=TRUE
ENDIF
IF (APPL_RUN>0) THEN
$OUT[APPL_RUN]=TRUE
ENDIF
;*******************
CASE #PGNO_GET
;*******************
IF REFLECT_PROG_NR==1 THEN
FOR N=0 TO PGNO_LENGTH-1
$OUT[PGNO_FBIT_REFL+N]=FALSE
ENDFOR
ENDIF
SWITCH PGNO_TYPE
;*******************
CASE 1,2
;*******************
IF (PGNO_VALID>0) THEN
WAIT FOR $IN[PGNO_VALID]==FALSE
ENDIF
IF (PGNO_VALID==0) THEN
WAIT FOR $EXT_START==FALSE
ENDIF
IF (PGNO_VALID<0) THEN
WAIT FOR $IN[PGNO_VALID*(-1)]==TRUE
ENDIF
IF (PGNO_REQ>0) THEN
$OUT[PGNO_REQ]=TRUE
ENDIF
IF (PGNO_REQ<0) THEN
$OUT[PGNO_REQ*(-1)]=FALSE
ENDIF
IF (PGNO_VALID>0) THEN
MsgState(nHandle, "Wait for PGNO_VALID=True", "P00")
REPEAT
IF REFLECT_PROG_NR==1 THEN
FOR I=0 TO PGNO_LENGTH-1
IF $IN[PGNO_FBIT+I]==TRUE THEN
$OUT[PGNO_FBIT_REFL+I]=TRUE
ELSE
$OUT[PGNO_FBIT_REFL+I]=FALSE
ENDIF
ENDFOR
ENDIF
UNTIL $IN[PGNO_VALID]==TRUE
bRes=Clear_KrlMsg (nHandle)
ENDIF
IF (PGNO_VALID==0) THEN
MsgState(nHandle, "Wait for $EXT_START=True", "P00")
REPEAT
IF REFLECT_PROG_NR==1 THEN
FOR I=0 TO PGNO_LENGTH-1
IF $IN[PGNO_FBIT+I]==TRUE THEN
$OUT[PGNO_FBIT_REFL+I]=TRUE
ELSE
$OUT[PGNO_FBIT_REFL+I]=FALSE
ENDIF
ENDFOR
ENDIF
UNTIL $EXT_START==TRUE
bRes=Clear_KrlMsg (nHandle)
ENDIF
IF (PGNO_VALID<0) THEN
MsgState(nHandle, "Wait for PGNO_VALID=False", "P00")
REPEAT
IF REFLECT_PROG_NR==1 THEN
FOR I=0 TO PGNO_LENGTH-1
IF $IN[PGNO_FBIT+I]==TRUE THEN
$OUT[PGNO_FBIT_REFL+I]=TRUE
ELSE
$OUT[PGNO_FBIT_REFL+I]=FALSE
ENDIF
ENDFOR
ENDIF
UNTIL $IN[PGNO_VALID*(-1)]==FALSE
bRes=Clear_KrlMsg (nHandle)
ENDIF
PGNO=0
SWITCH PGNO_TYPE
;*******************
CASE 1
;*******************
FOR I=0 TO PGNO_LENGTH-1
IF $IN[PGNO_FBIT+I] THEN
IF REFLECT_PROG_NR==1 THEN
$OUT[PGNO_FBIT_REFL+I]=TRUE
ENDIF
PGNO=PGNO+J
ENDIF
J=J*2
ENDFOR
;*******************
CASE 2
;*******************
FOR I=0 TO PGNO_LENGTH-1 STEP 4
N=0
J=1
FOR M=I TO I+3
IF $IN[PGNO_FBIT+M] THEN
N=N+J
IF REFLECT_PROG_NR==1 THEN
$OUT[PGNO_FBIT_REFL+M]=TRUE
ENDIF
ENDIF
J=J*2
ENDFOR
IF (N>9) THEN
PGNO_ERROR=2
PGNO=0
EXIT
ELSE
PGNO=PGNO+N*L
L=L*10
ENDIF
ENDFOR
ENDSWITCH
IF (PGNO_ERROR<>2) THEN
IF (PGNO_PARITY>0) THEN
P_RECV=$IN[PGNO_PARITY]
FOR I=0 TO PGNO_LENGTH-1
P_CALC=P_CALC EXOR $IN[PGNO_FBIT+I]
ENDFOR
IF (P_RECV<>P_CALC) THEN
PGNO=0
PGNO_ERROR=1
ELSE
PGNO_ERROR=0
ENDIF
ENDIF
IF (PGNO_PARITY<0) THEN
P_RECV=$IN[PGNO_PARITY*(-1)]
FOR I=0 TO PGNO_LENGTH-1
P_CALC=P_CALC EXOR $IN[PGNO_FBIT+I]
ENDFOR
IF (P_RECV<> NOT (P_CALC)) THEN
PGNO=0
PGNO_ERROR=1
ELSE
PGNO_ERROR=0
ENDIF
ENDIF
ENDIF
;*******************
CASE 3
;*******************
IF PGNO>0 THEN
WAIT FOR $IN[PGNO_FBIT+PGNO-1]==FALSE
ENDIF
K=0
REPEAT
FOR I=0 TO PGNO_LENGTH-1
IF $IN[PGNO_FBIT+I] THEN
IF K==0 THEN
K=I+1
ELSE
PGNO_ERROR=0
K=0
ENDIF
ENDIF
ENDFOR
UNTIL ((K<>0) OR (PGNO_ERROR==0))
PGNO=K
ENDSWITCH
;***********************************************************
CASE #PGNO_FAULT
;***********************************************************
IF PGNO_ERROR==1 THEN
MsgQuit("ParityFault", "P00", PGNO)
ENDIF
IF PGNO_ERROR==2 THEN
MsgQuit("BCDCodeError", "P00", PGNO)
ENDIF
IF PGNO_ERROR==0 THEN
IF (PGNO_TYPE==3) THEN
MsgQuit("ProgNumberWrong", "P00")
ELSE
MsgQuit("ProgramNotAvailable", "P00", PGNO)
ENDIF
ENDIF
PGNO_ERROR=0
IF (PGNO_REQ>0) THEN
$OUT[PGNO_REQ]=FALSE
ENDIF
IF (PGNO_REQ<0) THEN
$OUT[PGNO_REQ*(-1)]=TRUE
ENDIF
WAIT SEC 0.5
ENDSWITCH
END
DEF CHK_HOME ( )
BOOL H
IF ($I_O_ACTCONF==TRUE) THEN
REPEAT
H=TRUE
IF ($IN_HOME==FALSE) THEN
H=FALSE
REPEAT
MsgQuit("MoveHomeInT1", "P00")
IF (($MODE_OP==#T1) OR ($MODE_OP==#T2)) THEN
RETURN
ENDIF
HALT
UNTIL $IN_HOME==TRUE
ELSE
H=TRUE
ENDIF
UNTIL ((H==TRUE) OR ($I_O_ACTCONF==FALSE))
ENDIF
END
DEF EXT_ERR (P_ID :OUT, E_NO :IN )
;******************************
;Function : ext. error messages
; for package P00
;******************************
CHAR P_ID[]
INT E_NO,M
;********* MODUL-/FEHLER-NUMMER AUSWERTEN ********
I=1
FOUND=FALSE
IF (E_NO==0) THEN
IF PLC_ENABLE THEN
ERR=0
WAIT SEC 0.2
IF (ERR_TO_PLC >0) THEN
$OUT[ERR_TO_PLC]=FALSE
WAIT SEC 0.2
ENDIF
ENDIF
ELSE
IF PLC_ENABLE THEN
FOUND=FALSE
;******************************
; APPLIKATIONS-FEHLER AUSWERTEN
;******************************
I=1
REPEAT
IF (E_NO==P[I].ERR) THEN
IF (P_ID[1]==P[I].PKG[1]) THEN
IF (P_ID[2]==P[I].PKG[2]) THEN
IF (P_ID[3]==P[I].PKG[3]) THEN
FOUND=TRUE
ERR=P[I].OUT
F_WRITE ( )
ENDIF
ENDIF
ENDIF
ENDIF
I=I+1
UNTIL (I>MAXERR_A) OR FOUND
;***************************
; $STOPMESS-FEHLER AUSWERTEN
;***************************
I=128
IF (P_ID[1]=="C") THEN
IF (P_ID[2]=="T") THEN
IF (P_ID[3]=="L") THEN
M=MBX_REC(1,MLD)
IF M==0 THEN
REPEAT
IF (MLD.MESSNO==P[I].ERR) THEN
FOUND=TRUE
ERR=P[I].OUT
F_WRITE ( )
ENDIF
I=I+1
UNTIL (I>MAXERR_C+128-1) OR FOUND
ENDIF
ENDIF
ENDIF
ENDIF
IF (ERR_TO_PLC >0) THEN
$OUT[ERR_TO_PLC]=TRUE
ENDIF
ENDIF
ENDIF
END
DEF F_WRITE ( )
IF (F_NO>64) THEN
F_NO=1
ENDIF
ERR_FILE[F_NO].P[1]=P[I].PKG[1]
ERR_FILE[F_NO].P[2]=P[I].PKG[2]
ERR_FILE[F_NO].P[3]=P[I].PKG[3]
ERR_FILE[F_NO].E=P[I].ERR
F_NO=F_NO+1
END