<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于AT89C55單片機的PLC研究

          基于AT89C55單片機的PLC研究

          作者: 時間:2012-01-19 來源:網(wǎng)絡(luò) 收藏

          隨著高職教育的迅速發(fā)展,將PLC技術(shù)引進(jìn)高職教學(xué)并作為一門較為重要的課程,在高職教育中已達(dá)成共識,是課程建設(shè)現(xiàn)代化的重要措施。本文在研究 AT89C55后,以該為核心設(shè)計了一個綜合PLC系統(tǒng),集成了多路I/O及輸入,并可以通過RS232/RS485與上位機進(jìn)行通訊,已經(jīng)作為若干高校的實驗設(shè)備使用,并且,在要求較高的工程項目中也得到了具體的應(yīng)用。

          1 PLC的硬件功能設(shè)計

          該PLC的設(shè)計思想基于三菱PLC的操作語言,仿照三菱編程器的操作,利用AT89C55作為主控芯片,輔以其它芯片完成相關(guān)功能,其邏輯圖見圖1所示。為了達(dá)到教學(xué)目的,在設(shè)計思路上和常規(guī)的PLC有幾個不同點:一是為了使學(xué)生更多地接觸不同的輸出方式并進(jìn)行相關(guān)的實驗,設(shè)計了兩種輸出形式,即8路繼電器輸出和4路晶體管輸出,而且,繼電器輸出的端子中有四路沒有公共端子,三個端子完全引出,由學(xué)生自由組合,可擴(kuò)大控制范圍;二是在輸入上,除了16路輸入外,還設(shè)計了2路輸入和高速計數(shù)器輸入;三是源代碼開放,工科院校自控和計算機專業(yè)都開設(shè)單片機課程,由于條件所限,學(xué)生將實踐和學(xué)習(xí)相結(jié)合的機會并不多,鑒于這種情況,將源代碼開放,學(xué)生可以學(xué)習(xí)、補充、修改程序,既完善了PLC程序,又鍛煉了教師和學(xué)生。

          在大部分PLC中,例如,三菱[1]、歐姆龍和西門子等,上述功能一般由獨立的模塊來實現(xiàn)。這里將各種功能集成到一個PLC 模塊中,可以降低實驗設(shè)備的成本。在圖1中,為增加學(xué)生對輸出模塊的認(rèn)識,可控硅模塊可以和繼電器模塊互換,結(jié)構(gòu)只是一個可控硅光耦(例如 MOC3023)驅(qū)動一個雙向可控硅(例如BTA10-600)。

          IC卡的目的是當(dāng)學(xué)生使用編程器編程時,用來記錄學(xué)生的程序,有利于程序的修改和調(diào)試以及教師評分,用于實際工程項目中的PLC省略此功能。串行通信接口支持RS232和RS485兩種標(biāo)準(zhǔn),撥碼開關(guān)給出本機地址,使用RS485接口組成監(jiān)控網(wǎng)絡(luò)時使用。


          2 單片機語言的選擇及系統(tǒng)軟件設(shè)計

          一般說來,現(xiàn)在通用的單片機編程語言有匯編語言和C語言,C語言編程方便、易讀,但需要占用較多的內(nèi)存,從而導(dǎo)致執(zhí)行速度變慢。PLC是以循環(huán)掃描程序行的方式來工作的,對實時性要求較高,一個掃描周期一般不大于20ms,這樣,當(dāng)程序較長時,速度就顯得尤為重要了。因此,選擇匯編語言作為PLC的系統(tǒng)設(shè)計語言。

          由于PLC語言是面向用戶的,可以支持的語言并不是單片機可識別的,而且要求可以由用戶修改并下載到單片機的程序存儲器中,因此需要一個譯碼模塊,在執(zhí)行中把每一行用戶程序翻譯成機器可識別的子程序或過程。具體實現(xiàn)的方法為:

          用戶程序4個字節(jié)為一幀:“XX XX XX XX”,其中第一字節(jié)為命令,例如,OR、 MOV、OUT等;第二字節(jié)為執(zhí)行元件,例如,繼電器、輸入等;第三、四字節(jié)為相關(guān)數(shù)據(jù),這與不同的命令內(nèi)容相關(guān),例如,“01 10 00 03”定義為“LD Y 03”,“00 XX XX XX”定義為“NOP”等。但是,數(shù)據(jù)區(qū)不足以表達(dá)數(shù)據(jù),可以有后續(xù)數(shù)據(jù),也是4字節(jié)為一幀,以FE為第一字節(jié),例如,“FE XX XX XX”,這樣,就將命令幀和數(shù)據(jù)幀區(qū)分了。用戶程序下載到 EEROM(FM25640),由主程序依序讀出,再交譯碼模塊翻譯后執(zhí)行。

          程序中較難實現(xiàn)的是繼電器的上升沿或下降沿檢測。在PLC語言中許多情況是要檢測上升沿或下降沿的,有近千個繼電器,在每個循環(huán)中對所有的繼電器都進(jìn)行檢測記錄,無論時間或記錄位置(寄存器)都是難以實現(xiàn)的,故開辟了一個存儲區(qū),專門記錄激活了(即使用中)的繼電器狀態(tài),在程序運行前,先對繼電器掃描,把激活的繼電器依序登錄,當(dāng)程序運行到該繼電器時就對該繼電器進(jìn)行當(dāng)前狀態(tài)同前一周期狀態(tài)比較登記,當(dāng)前一次狀態(tài)與當(dāng)前狀態(tài)相反時便認(rèn)為是上升沿(或下降沿)到達(dá)。

          3 開關(guān)量I/O的軟硬件設(shè)計

          開關(guān)量I/O是PLC的重要內(nèi)容,一般來說,為了提高抗干擾能力,輸入與MCU之間是通過光耦隔離的,考慮到成本和盡量減少接口的占用,采用16選1模擬開關(guān)CD4067(U8),4條地址線用4個光耦521-1(U10-13)隔離。

          由于受光耦響應(yīng)速度和掃描周期的限制,不允許使用每個周期依序查詢的辦法,故在程序中設(shè)計了一毫秒定時(2)中斷,每毫秒查詢一個接口,同時將接口狀態(tài)映射到BIT 30H-3FH,因此,只需要對BIT30H-3FH查詢,便可知道接口狀態(tài)。中斷程序如下:

          ORG 2BH

          LJMPINPUT ;每毫秒中斷一次

          INPUT:PUSH PSW

          PUSH ACC

          PUSH DPL

          PUSH DPH

          MOV C, P1.4

          MOV A, 25H

          MOV DPTR, #INPUT1

          RL A

          RL A

          JMP @A+DPTR

          INPUT1: MOV 30H, C

          SJMP INPUT2

          MOV 31H, C

          SJMP INPUT2

          MOV 32H, C

          SJMP INPUT2

          MOV 33H, C

          SJMP INPUT2

          MOV 34H, C

          SJMP INPUT2

          MOV 35H, C

          SJMP INPUT2

          MOV 36H, C

          SJMP INPUT2

          MOV 37H, C

          SJMP INPUT2

          MOV 38H, C

          SJMP INPUT2

          MOV 39H, C

          SJMP INPUT2

          MOV 3AH, C

          SJMP INPUT2

          MOV 3BH, C

          SJMP INPUT2

          MOV 3CH, C

          SJMP INPUT2

          MOV 3DH, C

          SJMP INPUT2

          MOV 3EH, C

          SJMP INPUT2

          MOV 3FH, C

          INPUT2: INC 25H

          ANL 25H, #0FH

          ANL P1, #0F0H

          MOV A, 25H

          ORL P1, A

          POP DPH

          POP DPL

          POP ACC

          POP PSW

          RETI

          首先保護(hù)PSW、ACC和DPTR,讀入當(dāng)前輸入P1.4至C寄存器。25H是CD4067的地址映像,指向當(dāng)前輸入地址,將當(dāng)前地址乘以4(跳轉(zhuǎn)地址占4個字節(jié)),跳轉(zhuǎn)到相應(yīng)位置得到輸入映像,指向下一個輸入地址,然后,恢復(fù)被保護(hù)的寄存器,返回。程序代碼長度為103個字節(jié),執(zhí)行所占用的時間為 0.018毫秒,完全滿足PLC的實時性要求。

          輸出分為兩部分,8個繼電器輸出和4個晶體管輸出,由于單片機上電時端口被置位,為了防止出現(xiàn)上電時誤導(dǎo)通,故而選用PNP管8550作為繼電器的驅(qū)動管,使得上電時晶體管處于截止?fàn)顟B(tài)。在軟件上只要對相應(yīng)端口復(fù)位,繼電器動作。

          4 PLC的測試與應(yīng)用

          利用文獻(xiàn)[2]中的通用多功能計算機監(jiān)控系統(tǒng)測試軟件,在攝氏40℃以上的環(huán)境中對PLC進(jìn)行測試,采用CRC校驗,每4秒發(fā)送一個數(shù)據(jù)包,連續(xù)測試48小時,PLC都能夠成功識別數(shù)據(jù)包,并返回正確的結(jié)果,完全能夠滿足實際的工程要求。

          內(nèi)蒙第一機械制造集團(tuán)公司是國有特大型企業(yè),生產(chǎn)軍用裝備。該公司的液壓件打壓試驗臺,就是采用該PLC進(jìn)行監(jiān)控的。全部試驗過程通過PLC、數(shù)據(jù)采集卡、工控機等進(jìn)行控制。試驗過程及結(jié)果通過計算機顯示屏隨時監(jiān)控,并通過打印機打印輸出試驗數(shù)據(jù)。

          在北方奔馳重型車輛制造有限公司的發(fā)動機轉(zhuǎn)速測量中,也使用了該PLC。這兩個監(jiān)控系統(tǒng)目前運行可靠。該PLC還批量投入實驗室使用,在高級技工考試中也得到了成功的應(yīng)用。

          本文作者創(chuàng)新點

          本文利用AT89C55單片機實現(xiàn)了工業(yè)和教學(xué)使用的PLC系統(tǒng),系統(tǒng)穩(wěn)定可靠,并用于實際的工業(yè)控制系統(tǒng)和教學(xué)設(shè)備中,對于替代昂貴的進(jìn)口PLC和節(jié)省教育經(jīng)費具有重要意義。

          作者簡介:王建明(1957-),男(漢族),內(nèi)蒙古包頭人,包頭職業(yè)技術(shù)學(xué)院副院長,副教授,主要從事計算機監(jiān)控技術(shù)的開發(fā)研究。E-mail: wjm7591@yahoo.com.cn

          Biography: Wang Jianming, male, the Han nationality, born in 1957, deputy headmaster and associate professor of Baotou Vocational Technical College. His main research field is the development of computer monitor system. E-mail: wjm7591@yahoo.com.cn

          參考文獻(xiàn)

          [1] 沈世斌. 三菱PLC 與PC 機間的通訊應(yīng)用[J], 微計算機信息, 2006,22(4-1):81-83.

          [2] 王建明. 智能設(shè)備的通用測試.工業(yè)控制計算機, 2002, 15(12):10-12.



          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();