實戰攻堅!
本節,給大家講解針對EASY-M0806R這款PLC的SCAN用戶驅動子程序該完成的功能。
通過前面的講解,大家應該知道,SCAN是在梯形圖完成一次掃描以后被系統調用的程序,在這個程序里面,我們需要更新輸入輸出口的狀態以及LED的狀態。
SCAN
SCAN: LCALL USER_SCAN_O ;輸出端口和LED更新
LCALL USER_SCAN_I ;輸入端口和LED更新
RET
USER_SCAN_O:
;刷新輸出端口
MOV DPTR,#RAM_PY+1 ;Y00--Y05
MOVX A,@DPTR
CPL A
MOV SFRPAGE,#0FH
ANL A,#3FH
MOV B,A
MOV A,P1
ANL A,#0C0H
ORL A,B ;使P1.6,P1.7保持原來的狀態
MOV P1,A ;刷新輸出
;刷新輸出LED
SWAP A
MOV C,ACC.4
MOV P0.4,C
MOV C,ACC.5
MOV P0.5,C
MOV C,ACC.6
MOV P0.6,C
MOV C,ACC.7
MOV P0.7,C
MOV C,ACC.0
MOV P4.1,C
MOV C,ACC.1
MOV P4.0,C
RET
USER_SCAN_I: MOV A,INPUT_CNT
JZ USER_SCAN_I1
RET
USER_SCAN_I1: LCALL USER_SCAN_IS ;判斷8次采樣值是否相同
JB F0,USER_SCAN_I2
MOV C,ACC.7 ;調整輸入口
MOV F0,C
MOV C,ACC.0
MOV ACC.7,C
MOV C,F0
MOV ACC.0,C
MOV C,ACC.6
MOV F0,C
MOV C,ACC.1
MOV ACC.6,C
MOV C,F0
MOV ACC.1,C
MOV C,ACC.5
MOV F0,C
MOV C,ACC.2
MOV ACC.5,C
MOV C,F0
MOV ACC.2,C
MOV C,ACC.4
MOV F0,C
MOV C,ACC.3
MOV ACC.4,C
MOV C,F0
MOV ACC.3,C
MOV INPUT_PORTA,A ;相同則更新輸入數據寄存器
MOV DPTR,#RAM_PX+1 ;X00--X07
MOV A,INPUT_PORTA
MOVX @DPTR,A ;更新X00--X07
;刷新輸入LED
MOV A, INPUT_PORTA
CPL A
MOV P2,A
USER_SCAN_I2: MOV INPUT_CNT,#08H
RET
;判斷8個采樣數據是否相同,相同則F0=0
USER_SCAN_IS: MOV DPTR,#XINPUT
MOVX A,@DPTR
MOV M0,A
MOV R7,#7
USER_SCAN_IS1: INC DPTR
MOVX A,@DPTR
CJNE A,M0,USER_SCAN_IS2
DJNZ R7,USER_SCAN_IS1
CLR F0
RET
USER_SCAN_IS2: SETB F0
RET
關于本段代碼的詳細說明,筆者將改變一下方式,在下面的回帖為大家講解。當然筆者在關鍵處已經做了注釋,大家可以先看看并結合之前的程序研究一下,發帖提出問題,看看筆者的回答與自己的理解有何偏差。
如果沒有人發帖,筆者自然是希望看文章的朋友們都理解了筆者的代碼,就小小的懶惰一回吧,嘿嘿~!
當然如果大家的問題很多,那么筆者就寫“科威PLC芯片組開發實例(十二)”,詳細給大家說明SCAN中代碼的含義。
本帖首發中國工控網科威PLC論壇,轉載請聲明!