摘要: 可編程邏輯控制器(PLC)廣泛應(yīng)用于眾多領(lǐng)域,為了推廣PLC技術(shù),設(shè)計(jì)了一個(gè)基于AT89C55單片機(jī)的PLC模塊,集成了多路開(kāi)關(guān)量I/O及模擬量輸入以及高速開(kāi)關(guān)量輸入,成功應(yīng)用于工程項(xiàng)目中,并投入實(shí)驗(yàn)室使用。
關(guān)鍵詞: 可編程邏輯控制器;單片機(jī);開(kāi)關(guān)量;模擬量;監(jiān)控
隨著高職教育的迅速發(fā)展,將PLC技術(shù)引進(jìn)高職教學(xué)并作為一門(mén)較為重要的課程,在高職教育中已達(dá)成共識(shí),是課程建設(shè)現(xiàn)代化的重要措施。本文在研究AT89C55單片機(jī)后,以該單片機(jī)為核心設(shè)計(jì)了一個(gè)綜合PLC系統(tǒng),集成了多路開(kāi)關(guān)量I/O及模擬量輸入,并可以通過(guò)RS232/RS485與上位機(jī)進(jìn)行通訊,已經(jīng)作為若干高校的實(shí)驗(yàn)設(shè)備使用,并且,在要求較高的工程項(xiàng)目中也得到了具體的應(yīng)用。
1 PLC的硬件功能設(shè)計(jì)
該P(yáng)LC的設(shè)計(jì)思想基于三菱PLC的操作語(yǔ)言,仿照三菱編程器的操作,利用AT89C55單片機(jī)作為主控芯片,輔以其它芯片完成相關(guān)功能,其邏輯圖見(jiàn)圖1所示。為了達(dá)到教學(xué)目的,在設(shè)計(jì)思路上和常規(guī)的PLC有幾個(gè)不同點(diǎn):一是為了使學(xué)生更多地接觸不同的輸出方式并進(jìn)行相關(guān)的實(shí)驗(yàn),設(shè)計(jì)了兩種輸出形式,即8路繼電器輸出和4路晶體管輸出,而且,繼電器輸出的端子中有四路沒(méi)有公共端子,三個(gè)端子完全引出,由學(xué)生自由組合,可擴(kuò)大控制范圍;二是在輸入上,除了16路開(kāi)關(guān)量輸入外,還設(shè)計(jì)了2路模擬量輸入和高速開(kāi)關(guān)量計(jì)數(shù)器輸入;三是源代碼開(kāi)放,工科院校自控和計(jì)算機(jī)專(zhuān)業(yè)都開(kāi)設(shè)單片機(jī)課程,由于條件所限,學(xué)生將實(shí)踐和學(xué)習(xí)相結(jié)合的機(jī)會(huì)并不多,鑒于這種情況,將源代碼開(kāi)放,學(xué)生可以學(xué)習(xí)、補(bǔ)充、修改程序,既完善了PLC程序,又鍛煉了教師和學(xué)生。
在大部分PLC中,例如,三菱[1]、歐姆龍和西門(mén)子等,上述功能一般由獨(dú)立的模塊來(lái)實(shí)現(xiàn)。這里將各種功能集成到一個(gè)PLC模塊中,可以降低實(shí)驗(yàn)設(shè)備的成本。在圖1中,為增加學(xué)生對(duì)輸出模塊的認(rèn)識(shí),可控硅模塊可以和繼電器模塊互換,結(jié)構(gòu)只是一個(gè)可控硅光耦(例如MOC3023)驅(qū)動(dòng)一個(gè)雙向可控硅(例如BTA10-600)。
IC卡的目的是當(dāng)學(xué)生使用編程器編程時(shí),用來(lái)記錄學(xué)生的程序,有利于程序的修改和調(diào)試以及教師評(píng)分,用于實(shí)際工程項(xiàng)目中的PLC省略此功能。串行通信接口支持RS232和RS485兩種標(biāo)準(zhǔn),撥碼開(kāi)關(guān)給出本機(jī)地址,使用RS485接口組成監(jiān)控網(wǎng)絡(luò)時(shí)使用。

2 單片機(jī)語(yǔ)言的選擇及系統(tǒng)軟件設(shè)計(jì)
一般說(shuō)來(lái),現(xiàn)在通用的單片機(jī)編程語(yǔ)言有匯編語(yǔ)言和C語(yǔ)言,C語(yǔ)言編程方便、易讀,但需要占用較多的內(nèi)存,從而導(dǎo)致執(zhí)行速度變慢。PLC是以循環(huán)掃描程序行的方式來(lái)工作的,對(duì)實(shí)時(shí)性要求較高,一個(gè)掃描周期一般不大于20ms,這樣,當(dāng)程序較長(zhǎng)時(shí),速度就顯得尤為重要了。因此,選擇匯編語(yǔ)言作為PLC的系統(tǒng)設(shè)計(jì)語(yǔ)言。
由于PLC語(yǔ)言是面向用戶的,可以支持的語(yǔ)言并不是單片機(jī)可識(shí)別的,而且要求可以由用戶修改并下載到單片機(jī)的程序存儲(chǔ)器中,因此需要一個(gè)譯碼模塊,在執(zhí)行中把每一行用戶程序翻譯成機(jī)器可識(shí)別的子程序或過(guò)程。具體實(shí)現(xiàn)的方法為:
用戶程序4個(gè)字節(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í)行。
程序中較難實(shí)現(xiàn)的是繼電器的上升沿或下降沿檢測(cè)。在PLC語(yǔ)言中許多情況是要檢測(cè)上升沿或下降沿的,有近千個(gè)繼電器,在每個(gè)循環(huán)中對(duì)所有的繼電器都進(jìn)行檢測(cè)記錄,無(wú)論時(shí)間或記錄位置(寄存器)都是難以實(shí)現(xiàn)的,故開(kāi)辟了一個(gè)存儲(chǔ)區(qū),專(zhuān)門(mén)記錄激活了(即使用中)的繼電器狀態(tài),在程序運(yùn)行前,先對(duì)繼電器掃描,把激活的繼電器依序登錄,當(dāng)程序運(yùn)行到該繼電器時(shí)就對(duì)該繼電器進(jìn)行當(dāng)前狀態(tài)同前一周期狀態(tài)比較登記,當(dāng)前一次狀態(tài)與當(dāng)前狀態(tài)相反時(shí)便認(rèn)為是上升沿(或下降沿)到達(dá)。
3 開(kāi)關(guān)量I/O的軟硬件設(shè)計(jì)
開(kāi)關(guān)量I/O是PLC的重要內(nèi)容,一般來(lái)說(shuō),為了提高抗干擾能力,輸入與MCU之間是通過(guò)光耦隔離的,考慮到成本和盡量減少接口的占用,采用16選1模擬開(kāi)關(guān)CD4067(U8),4條地址線用4個(gè)光耦521-1(U10-13)隔離。
由于受光耦響應(yīng)速度和掃描周期的限制,不允許使用每個(gè)周期依序查詢的辦法,故在程序中設(shè)計(jì)了一毫秒定時(shí)(2)中斷,每毫秒查詢一個(gè)接口,同時(shí)將接口狀態(tài)映射到BIT 30H-3FH,因此,只需要對(duì)BIT30H-3FH查詢,便可知道接口狀態(tài)。中斷程序如下:
ORG 2BH
LJMP INPUT ;每毫秒中斷一次
INPUT: PUSH PSW
PUSH ACC
PUSH DPL





