HELLO 各位小伙伴,上次看到有朋友后台留言“始终人口回归”非常感慨,原本计划的一些推文也一直没完成,所以今天继续更新一下P00程序分析。
还请各位记得 分享 在看 关注 点赞 收藏
DEF EXT_PGNO (FUNCT :OUT ) ;外部程序号函数,参数FUNCT
;********************************
; 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 ;检查外部自动配置参数APPL_RUN是否输入
$OUT[APPL_RUN]=FALSE ;输出ARRL_RUN为false
ENDIF
SWITCH FUNCT ;用函数输入的参数进行分支
;*******************
CASE #PGNO_ACKN ;程序号询问
;*******************
IF (PGNO_REQ>0) THEN ;如果程序号请求配置大于0(外部自动配置)
$OUT[PGNO_REQ]=FALSE ;初始化程序号请求
ENDIF
IF (PGNO_REQ<0) THEN
$OUT[PGNO_REQ*(-1)]=TRUE ;如果程序号请求配置小于0 输入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 ;类型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 ;如果程序号镜像为1 则进行程序号镜像输出
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 ;如果程序号有效配置为0
MsgState(nHandle, "Wait for $EXT_START=True", "P00") ;等待外部启动信息
REPEAT
IF REFLECT_PROG_NR==1 THEN ;如果程序号镜像配置为1,则开始镜像
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 ;如果程序号有效配置为小于0 ,(反结果)
MsgState(nHandle, "Wait for PGNO_VALID=False", "P00") ;等待程序号有效信息
REPEAT
IF REFLECT_PROG_NR==1 THEN ;如果程序号镜像为1 则进行程序号镜像输出
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 ;程序号类型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 ;程序号类型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 ;程序号类型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