大家好!今天我们来说说P00这个程序
P00程序与外部自动配置息息相关,外部自动所配置的这些变量在P00里面都有详细的检查和执行
P00,是KUKA出厂自带的一个程序,主要使用用于Cell中。这个模块在R1/TP中
既然在系统中那就说明这个程序是可以被用户调用的,所以要知道其中包含了哪些模块,都是什么功能,下图就是P00程序中所包含的模块
接下来一个一个分析
主程序P00
主程序是一个功能调用程序,仅包含一个switch。用于提供外部调用。
其中包含了几个参数:
COMMAND:枚举类型参数,在config中声明了P00_COMMAND枚举,包含四个元素INIT_EXT,EXT_PGNO,CHK_HOME,EXT_ERR,正对应了SWITCH中的4个CASE。
PGNO_FUNCT:同样是config中声明的枚举类型,包含了3个元素,PGNO_GET,PGNO_ACKN,PGNO_FAULT,用于作为EXT_PGNO( )程序的参数进行传递。
P_ID[ ]和E_NO同是EXT_ERR( )程序的参数,分别是字符串和整数。
当主程序被调用,并且传入对应的参数时,其中的SWITCH,即可调用对应的程序了
INIT_EXT
从名字就可以看出,这是个初始化程序,初始了以下内容:
输出端:程序请求信号
输出端:程序运行中
输出端:故障发送给PLC
输出端:程序号镜像初始化为0
检查IO是否激活:
程序号类型
63 SWITCH PGNO_TYPE根据程序好类型进行分支
65 CASE 1,2 ;bci-coding,bcd-coding 二进制和 BCD
程序号长度判断
68 IF (PGNO_LENGTH<1) THEN 如果长度小于1输出错误报警
69 ERROR=TRUE ;pgno_length
70 MsgQuit("PgNo_LengthRangeWrong", "P00")
71 ENDIF
72 IF (PGNO_TYPE==1) THEN ;bci-coding如果类型等于1
73 IF (PGNO_LENGTH>16) THEN 如果长度大于16输出报警
74 ERROR=TRUE ;pgno_length
75 MsgQuit("PgNo_LengthRangeWrong", "P00")
76 ENDIF
77 ENDIF
78 IF (PGNO_TYPE==2) THEN ;bcd-coding 如果类型等于2
79 SWITCH PGNO_LENGTH 如果程序号长度不为4,8,12,16输出报警(这个switch的用法很不错)
80 CASE 4,8,12,16
81 DEFAULT
82 ERROR=TRUE ;pgno_length
83 MsgQuit("PgNo_LengthWrong", "P00")
84 ENDSWITCH
85 ENDIF
86 ;***** CHECK PGNO_FBIT *****
87 IF (PGNO_FBIT<1) THEN 检查程序号第一位是否小于1
88 ERROR=TRUE ;pgno_fbit
89 MsgQuit("PgNo_FBitWrong", "P00")
90 ENDIF
91 ;***** CHECK PGNO_REQ *****
92 IF (PGNO_REQ==0) THEN 检查程序好请求是否等于0
93 ERROR=TRUE ;pgno_req
94 MsgQuit("PgNo_ReqWrong", "P00")
95 ENDIF
96 IF (PGNO_REQ>0) THEN ;active high程序号请求大于0时初始化信号
97 $OUT[PGNO_REQ]=FALSE ;reset
98 WAIT SEC 0.2 ;delay for plc
99 ENDIF
100 IF (PGNO_REQ<0) THEN ;active low程序号请求为小于0时初始化
101 $OUT[PGNO_REQ*(-1)]=TRUE ;reset
102 WAIT SEC 0.2 ;delay for plc
103 ENDIF
104 ;*********************************************************
105 CASE 3 ;one out of n程序号类型为3“N 选 1”
106 ;*********************************************************
107 ;***** CHECK PGNO_LENGTH *****
108 IF (PGNO_LENGTH<1) THEN 程序号长度小于1报警
109 ERROR=TRUE ;pgno_length
110 MsgQuit("PgNo_LengthRangeWrong", "P00")
111 ENDIF
112 IF (PGNO_LENGTH>16) THEN 程序号长度小于16 报警
113 ERROR=TRUE ;pgno_length
114 MsgQuit("PgNo_LengthRangeWrong", "P00")
115 ENDIF
116 ;***** CHECK PGNO_FBIT *****
117 IF (PGNO_FBIT<1) THEN 程序号第一位小于1报警
118 ERROR=TRUE ;pgno_fbit
119 MsgQuit("PgNo_FBitWrong", "P00")
120 ENDIF
121
122 ;*********************************************************
123 DEFAULT ;PGNO_TYPE wrong type 程序号类型不为1,2,3时报警
124 ;*********************************************************
125 ERROR=TRUE ;pgno_type
126 MsgQuit ("PgNo_TypeWrong", "P00")
127 ENDSWITCH
128 ;***********************************************************
129 UNTIL (ERROR==FALSE) ;ERROR为假时结束循环