前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >P00程序解析2

P00程序解析2

作者头像
用户4442670
发布2024-04-19 18:46:20
800
发布2024-04-19 18:46:20
举报
文章被收录于专栏:机器人小农机器人小农

HELLO 各位小伙伴,上次看到有朋友后台留言“始终人口回归”非常感慨,原本计划的一些推文也一直没完成,所以今天继续更新一下P00程序分析。

还请各位记得 分享 在看 关注 点赞 收藏

代码语言:text
复制
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
本文参与?腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-04-19,如有侵权请联系?cloudcommunity@tencent.com 删除

本文分享自 机器人小农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com