1 引言
可編程控制器(PLC)作為繼電控制盤(pán)的替代物,以極高的可靠性和應(yīng)用方便等特點(diǎn),成為當(dāng)今用途最為廣泛的工業(yè)控制器。現(xiàn)在它的應(yīng)用已突破了當(dāng)初邏輯控制的場(chǎng)合,深入到過(guò)程控制、位置控制、網(wǎng)絡(luò)通訊等工程領(lǐng)域。本文根據(jù)某工程的實(shí)際需要,以三菱PLC為模擬目標(biāo),提出了一種以單片機(jī)構(gòu)建PLC系統(tǒng)的思想

2 系">

      技術(shù)頻道

      基于單片機(jī)的PLC系統(tǒng)的實(shí)現(xiàn)

      1 引言
      可編程控制器(PLC)作為繼電控制盤(pán)的替代物,以極高的可靠性和應(yīng)用方便等特點(diǎn),成為當(dāng)今用途最為廣泛的工業(yè)控制器。現(xiàn)在它的應(yīng)用已突破了當(dāng)初邏輯控制的場(chǎng)合,深入到過(guò)程控制、位置控制、網(wǎng)絡(luò)通訊等工程領(lǐng)域。本文根據(jù)某工程的實(shí)際需要,以三菱PLC為模擬目標(biāo),提出了一種以單片機(jī)構(gòu)建PLC系統(tǒng)的思想

      2 系統(tǒng)構(gòu)成
      系統(tǒng)框圖見(jiàn)圖1。


      該系統(tǒng)CPU芯片使用了一種新型的51系列單片機(jī)即Cygnal公司的 C8051F040。其指令集與MSC_51指令集完全兼容,使用方便,且采用流水線結(jié)構(gòu),其周期由標(biāo)準(zhǔn)的12個(gè)系統(tǒng)時(shí)鐘周期降為1個(gè)系統(tǒng)時(shí)鐘周期,處理能力大大提高,峰值性能可達(dá)25MIPS。內(nèi)部集成了64K Flash ROM、4352字RAM、64位數(shù)據(jù)I/O口以及幾乎所有的模擬與數(shù)字外設(shè)如:ADC、DAC、SMBus、UART、CAN、SPI、PCA、電壓比較器、溫度傳感器、可編程增益放大器等。開(kāi)發(fā)工具采用標(biāo)準(zhǔn)的JTAG接口,以邊界掃描方式對(duì)CPU進(jìn)行非入侵式全速的在系統(tǒng)調(diào)試。其性能較之傳統(tǒng)51單片機(jī)有了很大的提高。
      CPU和外部I/O接口之間采用光電耦合器件,實(shí)行強(qiáng)電和弱電隔離,切斷現(xiàn)場(chǎng)干擾。計(jì)算機(jī)通過(guò)RS232串口與PLC系統(tǒng)通信,將PLC程序指令傳送到PLC。PLC將接收到的指令保存到非易失性RAM中。這樣做即可以長(zhǎng)期保存PLC程序,又可以方便地隨時(shí)修改程序。

      3 PLC程序的執(zhí)行過(guò)程
      常見(jiàn)PLC以掃描方式工作。每次掃描的工作過(guò)程分為三步。
      (1) 輸入處理 程序執(zhí)行前,PLC將全部輸入點(diǎn)的狀態(tài)讀到輸入鏡像寄存器。在程序執(zhí)行過(guò)程中,PLC不再讀取這些輸入點(diǎn)的狀態(tài),直到下一個(gè)掃描周期的輸入處理。
      (2) 程序處理 PLC根據(jù)讀入的外部輸入狀態(tài)和其它元件的狀態(tài)執(zhí)行用戶程序。這時(shí)的輸出指令只寫(xiě)到輸出鏡像寄存器,輸出點(diǎn)的狀態(tài)并沒(méi)有發(fā)生變化。
      (3) 輸出處理 全部指令執(zhí)行完畢,將輸出寄存器的內(nèi)容全部刷新到外部輸出點(diǎn)。程序回到第一步工作過(guò)程。
      本PLC系統(tǒng)的工作過(guò)程與此相同。輸入處理和輸出處理用單片機(jī)實(shí)現(xiàn)起來(lái)比較容易,無(wú)需贅述。系統(tǒng)的關(guān)鍵是用戶程序的處理。下面以三菱FX系列PLC一個(gè)簡(jiǎn)單的例子來(lái)說(shuō)明本PLC系統(tǒng)對(duì)用戶程序的處理方法。梯形圖和相應(yīng)的指令表見(jiàn)圖2。


      0:LD X000 9: LD X010
      1:AND X001 10:LD X011
      2:AND X002 11:AND X012
      3:LD X003 12:LD X013
      4:OR X004 13:AND X014
      5:ANB 14:ORB
      6:OUT Y000 15:OR X015
      7:OR X006 16:ANB
      8:LD X010 17:OUT Y001
      首先分析指令 AND X001,指令執(zhí)行前有狀態(tài)B,執(zhí)行該指令時(shí),將當(dāng)前狀態(tài)B 和X001的狀態(tài)進(jìn)行與運(yùn)算,形成狀態(tài)C,這是指令A(yù)ND X002執(zhí)行前狀態(tài)。C是B的刷新值,它們實(shí)際上是一個(gè)變量。這個(gè)變量反映程序執(zhí)行時(shí)當(dāng)前的狀態(tài)值。當(dāng)遇到輸出指令OUT Y000時(shí),就把當(dāng)前狀態(tài)值傳送給輸出寄存器。把AND X001作為一單元塊,可認(rèn)為這個(gè)單元塊有單輸入單輸出的結(jié)構(gòu)。輸入狀態(tài)和單元塊內(nèi)元件的狀態(tài)運(yùn)算后得到輸出狀態(tài)。
      再分析指令LD X003、OR X004,如果將這兩條指令組合后看作上述單輸入單輸出結(jié)構(gòu)的單元塊,執(zhí)行前的狀態(tài)為D,把X003、X004元件并聯(lián)后的狀態(tài)作為單元塊內(nèi)元件的狀態(tài),和D與運(yùn)算后得到狀態(tài)G.。但細(xì)化一步執(zhí)行LD X003這個(gè)子單元塊時(shí),當(dāng)前狀態(tài)D需保存,取X003的狀態(tài)作為當(dāng)前狀態(tài)值E,和X004或運(yùn)算后得到F。執(zhí)行ANB時(shí),把先保存的狀態(tài)值D和狀態(tài)值F與運(yùn)算后得到新的當(dāng)前狀態(tài)值G。
      這里執(zhí)行LD與AND產(chǎn)生區(qū)別是在于:AND指令沒(méi)有分支,而LD指令產(chǎn)生分支,程序執(zhí)行前的狀態(tài)值需要保存。同樣,在遇到分支合并時(shí),需要使用到先前保存的狀態(tài)值 。根據(jù)梯形圖的編寫(xiě)規(guī)則,狀態(tài)值的保存和使用是一種先進(jìn)后出的結(jié)構(gòu),所以可以使用進(jìn)棧和出棧的方法來(lái)實(shí)現(xiàn)。指令的具體實(shí)現(xiàn)過(guò)程歸納如下:凡是遇到產(chǎn)生分支的指令,例如LD指令,需將當(dāng)前狀態(tài)值進(jìn)棧保存,取當(dāng)前操作元件的狀態(tài)作為當(dāng)前狀態(tài)值;凡是遇到分支合并的指令,例如ORB、ANB指令,需將棧頂值出棧與當(dāng)前狀態(tài)值運(yùn)算成為新的當(dāng)前狀態(tài)值。
      在具體實(shí)現(xiàn)時(shí),采用了另一種形式的棧。由于三菱FX系列PLC的LD連續(xù)使用不能超過(guò)八次,因此采用一個(gè)可以位尋址的片內(nèi)RAM字節(jié)作為棧空間來(lái)存放當(dāng)前狀態(tài)值。如果使用棧空間的最高位作為當(dāng)前狀態(tài)值,每次壓棧就把該字節(jié)進(jìn)行不帶進(jìn)位的循環(huán)右移,出棧時(shí)反之。在LD X000指令執(zhí)行后,進(jìn)棧狀態(tài)A沒(méi)有出棧,LD X010指令又進(jìn)棧保存當(dāng)前狀態(tài)值,以前的壓棧值A(chǔ)廢之不用,即每條與母線相連的LD指令產(chǎn)生壓棧值都不出棧。這樣避免了因使用PUSH POP指令用一個(gè)字節(jié)的空間來(lái)保存一位的當(dāng)前狀態(tài)值造成的RAM利用效率低的問(wèn)題。
      LD X010后的指令執(zhí)行過(guò)程如下:LD X010 把當(dāng)前狀態(tài)值H壓棧,取X010的狀態(tài)作為當(dāng)前狀態(tài)值I;LD X011把當(dāng)前狀態(tài)值I壓棧,取X011的狀態(tài)作為當(dāng)前狀態(tài)值J;AND X012 把當(dāng)前狀態(tài)值J和X012的狀態(tài)與運(yùn)算后得到當(dāng)前狀態(tài)值K;LD X013把當(dāng)前狀態(tài)值K壓棧,取X013的狀態(tài)作為當(dāng)前狀態(tài)值L;AND X014把當(dāng)前狀態(tài)值L和X014的狀態(tài)與運(yùn)算后得到當(dāng)前狀態(tài)值M;ORB 彈出壓棧值K和當(dāng)前狀態(tài)值M或運(yùn)算后得到新的當(dāng)前狀態(tài)值M;OR X015把當(dāng)前狀態(tài)值M和X015的狀態(tài)或運(yùn)算后得到當(dāng)前狀態(tài)值N;ANB彈出壓棧值I和當(dāng)前狀態(tài)值N與運(yùn)算后得到新的當(dāng)前狀態(tài)值O;OUT Y002 把當(dāng)前狀態(tài)值寫(xiě)到Y(jié)002的輸出鏡像寄存器。
      4 檢查程序
      接收到程序后,在程序執(zhí)行之前,還需對(duì)程序的語(yǔ)法正確性進(jìn)行檢查。這里只介紹與程序狀態(tài)值棧相關(guān)指令的語(yǔ)法檢查。
      首先]需要設(shè)置一個(gè)位標(biāo)志EN_BUS和一計(jì)數(shù)器LD_N。ENBUS表示下一指令能夠與PLC梯形圖中的母線相連。計(jì)數(shù)器LD_N表示自與母線相連的指令之后由于LD指令引起的堆棧次數(shù)。檢查程序之前,初始化如下:
      EN _BUS=1
      LD_N=1
      檢查程序時(shí),如果遇到LD指令,程序流程如圖3(a);如果為ORB或ANB指令,則LD_N=LD _N-1;如果為OUT等與零母線相連的輸出指令,程序流程如圖3(b)。
      這些基本操作執(zhí)行后,如果檢測(cè)到LD _N大于8,說(shuō)明連續(xù)LD指令太多,程序狀態(tài)值棧空間溢出;如果LD _N等于0,說(shuō)明ANB或ORB指令數(shù)多于與LD指令,數(shù)量不匹配。還有些指令例如程序標(biāo)號(hào)P、循環(huán)范圍終止符NEXT等必須與母線相連。如果這些指令出現(xiàn)在EN _BUS=0的情況下,說(shuō)明該程序有錯(cuò)。
      5 結(jié)束語(yǔ)
      這種以單片機(jī)構(gòu)建的PLC系統(tǒng)成本低,系統(tǒng)可擴(kuò)展性好,可以方便得加上A/D、D/A等功能,應(yīng)用領(lǐng)域廣泛。

      文章版權(quán)歸西部工控xbgk所有,未經(jīng)許可不得轉(zhuǎn)載。

      主站蜘蛛池模板: 视频一区视频二区在线观看| aⅴ一区二区三区无卡无码| 精品亚洲一区二区三区在线播放| 国产精品日韩欧美一区二区三区 | 亚洲av成人一区二区三区| 精品少妇一区二区三区在线 | 国产成人一区二区三区在线| 合区精品久久久中文字幕一区 | 狠狠爱无码一区二区三区| 国产观看精品一区二区三区| 国产成人AV一区二区三区无码| 中文字幕人妻第一区| 亚洲精品伦理熟女国产一区二区| 波多野结衣一区二区三区88| 国产凹凸在线一区二区| 中文字幕亚洲综合精品一区| 色妞色视频一区二区三区四区| 成人国内精品久久久久一区 | 在线精品一区二区三区| 精品国产日产一区二区三区| 国产一区视频在线免费观看| 精品黑人一区二区三区| 久久久精品人妻一区二区三区| 日本一区二区三区在线视频观看免费| tom影院亚洲国产一区二区 | 亚洲天堂一区二区三区| 国产麻豆精品一区二区三区v视界 国产美女精品一区二区三区 | 中文字幕一区二区在线播放| 一级毛片完整版免费播放一区| 一区二区传媒有限公司| 欧美激情一区二区三区成人| 中文字幕av一区| 日韩久久精品一区二区三区| 国产免费av一区二区三区| 精品国产亚洲第一区二区三区| 伊人久久大香线蕉AV一区二区| 日本香蕉一区二区三区| www.亚洲一区| 亚洲丰满熟女一区二区哦| 日本国产一区二区三区在线观看| 国产在线一区二区三区av|