1、引言
可編程序控制器(簡稱plc)是一種工業(yè)自動控制中使用的計算裝置。它廣泛應(yīng)用于鋼鐵、石油、化工、電力、建材、機械制造、汽車、輕紡、交通運輸、航天、環(huán)保及文化娛樂等各個行業(yè)。小到家用設(shè)備,大到航天器材,都有plc的應(yīng)用。
典型的plc由一個專用的cpu,一個存儲器和一組輸入輸出端口構(gòu)成,如圖1所示。它通過輸入端口接收來自傳感器的信號,并通過輸出端口發(fā)出控制信號驅(qū)動同它連接的外部設(shè)備。存儲器中安放控制程序,系統(tǒng)的活動由控制程序所驅(qū)動。
plc系統(tǒng)每隔一定的時間間隔(比如5毫秒)從輸入端口讀入信號,執(zhí)行計算,然后向輸出端口發(fā)送輸出信號。每一“輸入-計算-輸出”周期稱為一個掃描周期。plc程序在每個掃描周期中重復(fù)執(zhí)行一遍。plc的簡單應(yīng)用有洗衣機控制,電梯控制。復(fù)雜的應(yīng)用有自動機床控制,自動化工程控制。
plc程序設(shè)計具有不尋常的軟件編程模式。設(shè)計中需要考慮多個并行線程,它們之間的交互作用,以及在時間域上的行為。在plc的五種主要的編程語言當(dāng)中,源自繼電器控制系統(tǒng)的梯形圖語言采用了一種簡單的方式巧妙地處理了并行程序設(shè)計問題,然而,由于plc編程問題的固有復(fù)雜性,以及測試手段的缺乏,許多plc程序中依然存在大量的錯誤。
為了解決這一問題,靈芯實驗室正在開發(fā)plc測試系統(tǒng),為plc程序的調(diào)試提供解決方案。在這一系統(tǒng)的試用過程中,在兩本plc入門教科書的6個簡單程序例子中發(fā)現(xiàn)其中的4個程序里面至少包含8個錯誤。
●一個搶答器程序在兩個參賽者同時按下?lián)尨鸢粹o時,只有其中一個人的警報器能夠發(fā)出警報;
●一個噴泉程序中,噴水組在幾個指定時間上沒有按要求停止噴水,或開始噴水;
●一個交通燈控制程序中,綠燈閃爍控制不正常;系統(tǒng)啟動的時候,一個方向綠燈亮,另一個方向的紅燈卻不亮;強通結(jié)束之后,交通燈沒有立即恢復(fù)正常運行;
●在另一個交通燈程序中,按下停止按鈕之后,所有的燈熄滅,但兩個方向人行道上卻亮紅燈。
我們認為這一發(fā)現(xiàn)是不同尋常的。雖然每個程序員和教師都會犯編程錯誤,但是我們還從未在任何一本程序設(shè)計的教科書中發(fā)現(xiàn)如此高比例的程序錯。這一現(xiàn)象初步證實了plc程序 錯誤的廣泛性和嚴重性。
本文將逐一分析上述每一個程序的錯誤,指出錯誤原因。其中大部分程序,我們給出糾正了錯誤的新程序。期望這一分析能夠幫助plc程序員和教師提高plc程序設(shè)計的正確性。plc程序的執(zhí)行原理以及梯形圖的語義將在例子的介紹中同時給予解釋。我們相信,通過分析錯誤來學(xué)習(xí)是掌握遍程技巧的好方法。
圖1 plc構(gòu)造原理圖
2、搶答器程序
題目:搶答器程序
來源:plc應(yīng)用技術(shù)開發(fā)與實踐
編程平臺:西門子公司 s7-200
問題描述:
(1)主持人控制開始按鈕;
(2)3個搶答者每人控制自己的搶答按鈕;
(3)開始按鈕按下之后所有警報器斷電;
(4)之后每個搶答按鈕按下將使自己的警報器得電,并鎖住其他搶答者輸入信號的有效性。
變量分配:
i0.0 主持人按鈕;
i0.1,i0.2,i0.3 分別為三個搶答者按鈕;
q0.0,q0.1,q0.2 分別為對應(yīng)于搶答者的警報器輸出;
原書給出的搶答器梯形圖程序(見圖2)。
圖2 搶答器梯形圖程序
plc程序語義:
上述梯形圖程序的語義可以用比較簡短的方式表達出來:
q0.0 := (i0.1 or q0.0) and ~i0.0 and ~q0.1 and ~q0.2;
q0.1 := (i0.2 or q0.1) and ~i0.0 and ~q0.0 and ~q0.2;
q0.2 := (i0.3 or q0.2) and ~i0.0 and ~q0.0 and ~q0.1;
其中~i0.0表示i0.0的邏輯非。
plc的程序周期性地重復(fù)執(zhí)行,每個周期時間很短。在一個周期中,plc將讀入輸入值(這里是i0.1,i0.2和i0.3),經(jīng)過對上述程序的計算之后,把輸出變量(這里是q0.0,q0.1和q0.2)的值送到外部。注意上述程序在每個周期中都重復(fù)執(zhí)行。在每個周期中,程序的執(zhí)行由上往下由左至右。
當(dāng)一個搶答按鈕按下之后(比如i0.1=1),對應(yīng)的輸出(q0.0)馬上變成1。在下一周期中,即使該按鈕方開(i0.1=0)程序的輸出依然會保持為0,原因是程序依靠自反饋作用(or q0.0)。同時,由于在另外兩個程序段中含有~q0.1,因此它們的輸出都無法變成1,直到主持人按鈕i0.0把q0.0重新置0為止。
●程序問題
如果兩個搶答者在同一時刻按下按鈕,在程序中處于前面的搶答者的警報器輸出正常,另一個搶答者的警報器沒有輸出。
●程序分析
本問題分成三個程序段,它們本應(yīng)并行執(zhí)行方能達到公平的效果。但plc的cpu只能順序執(zhí)行程序,因此在程序中位置處于前面的搶答者的輸出產(chǎn)生之后,后面的程序輸出就被立即阻斷。因此兩個按鈕同時按下時,只有其中的一個得到響應(yīng)。
plc的編程模式來源于繼電器電路控制系統(tǒng),在那些系統(tǒng)中,上述三個程序段對于三個并行運行的電路,但是轉(zhuǎn)到cpu中之后,這些程序就不得不順序執(zhí)行。并行模型與順序執(zhí)行的沖突是許多程序錯誤的原因。在作者先前的論文中就對這一問題進行了分析[1]。
在順序執(zhí)行的機器上面實現(xiàn)plc并行語義是可能的。但是依然需要小心各種陷阱。下面的第一次嘗試存在一個錯誤,再后面一個程序改正了這個錯誤,通過了程序測試。
●程序修正嘗試
克服上面問題的一個自然的想法是使用中間變量保存每個程序段的輸出。這一思路導(dǎo)致下面的程序?qū)崿F(xiàn)(見圖3):
圖3 程序修正嘗試程序?qū)崿F(xiàn)圖
使用這一程序時,如果兩個搶答者的按鈕同時按下,對應(yīng)的兩個警報器會同時響。但是,在下一周期,兩個警報器的輸出又會同時恢復(fù)到0。原因是每一個搶答輸入都會導(dǎo)致另一個搶答無效,兩個搶答輸入就會同時導(dǎo)致對方無效。
●最終程序
下面的程序克服了上述問題,并且通過了基本的測試檢查(見圖4)。
它同前面程序不同之處在于把q0.0等變量的管轄范圍放寬了,因此一旦q0.0為1,只要主持人按鈕不按下,它的值就能繼續(xù)保持下去。
圖4 基本測試檢查結(jié)果
3、噴泉程序
題目:plc在噴泉中的應(yīng)用
來源:plc應(yīng)用技術(shù)開發(fā)與實踐
編程平臺:三菱公司fx2n系列
問題描述
(1)噴泉有a,b,c 3組噴頭;
(2)按動開始按鈕后,a組先噴,10秒后停,然后b組和c組同時噴;
(3)b和c噴10秒后b停,再10秒后c停;
(4)a,b又噴,5秒后,c也噴,持續(xù)10秒后全部停;
(5)再5秒后重返上述(2)到(4)步;
(6)按動停止按鈕后,a,b,c 3組噴頭全部停。
輸入輸出變量分配:
x0001:開始按鈕
x0002:結(jié)束按鈕
y0001:a組噴頭
y0002:b組噴頭
y0003:c組噴頭
內(nèi)部繼電器:m0—m5
定時器分配(見圖5):
t0:a組噴10秒; 0—10
t1:b,c組噴10秒; 10—20
t2:c組噴10秒; 20—30
t3:a,b組噴5秒;30—35
t4:a,b,c組噴10秒; 35—45
t5:a,b,c組停噴5秒; 45—50
同前一程序相比,這一程序中增加了t0,t1等定時器。定時器用t標(biāo)識,它的上方是定時器變量名,下方是預(yù)定的定時延遲。本例使用的是ton類型定時器,這種定時器只要輸入端由0轉(zhuǎn)1計時就開始,在計時過程中,輸入端必須始終保持為1,一旦定時器到時,它所對應(yīng)的變量就立即由0轉(zhuǎn)1。在計時過程中,如果輸入端轉(zhuǎn)0,則計時停止,定時器到時之后,只要輸入端繼續(xù)為1,那么計時器變量也繼續(xù)保持為1,一旦輸入變0,計時變量也轉(zhuǎn)為0。本例中的定時器按十分之一秒為單位計時。
這個程序含有三個錯誤,它的某些噴頭在預(yù)定停止的時刻沒有停止,在預(yù)定開始的時刻沒有開始。
程序錯誤(1):按照要求程序開始后20秒,c組噴發(fā)應(yīng)該停止,但該程序卻沒有停止c的噴發(fā)。
原因分析
c的噴發(fā)受到m1,m2和m3的控制,它們分別控制c組的第一,第二和第三次噴發(fā)。在第二次噴發(fā)結(jié)束之后,m2為0,噴發(fā)本應(yīng)停止,但調(diào)試中發(fā)現(xiàn)c的輸出(y0002)繼續(xù)為1,單步調(diào)試發(fā)現(xiàn), 此時m1為1,由此造成c組輸出繼續(xù)。分析發(fā)現(xiàn),產(chǎn)生m1的梯形圖有錯。應(yīng)該使用m1來產(chǎn)生反饋,但程序中用了b組的輸出變量y0001。 該變量恰好在c組第二次噴發(fā)之后重新置1,因此造成了c組繼續(xù)噴發(fā)。將此處改成m1之后這一錯誤即可消除。
程序錯誤(2):程序開始后50秒,a組噴發(fā)應(yīng)該重新開始,但實際運行中并未開始。
原因分析:
這是一個定時時間寫錯的簡單錯誤。定時器t4設(shè)定的時間應(yīng)為5秒(50),但梯形圖中錯寫成100(該書指令表程序中也是寫50,梯形圖中是一個失誤)。
程序錯誤(3):在糾正了上面兩個錯誤之后,程序依然無法通過測試。50秒之后,c組不應(yīng)該開始噴發(fā),但實際運行中噴發(fā)。
原因分析:
50秒之后,程序進入下一周期。此時程序該如何運行在原書中沒有清楚描述,這屬于描述不全。根據(jù)程序的具體實現(xiàn),可以看出作者的意圖是在50秒之后把整個噴發(fā)過程重演一遍。基于這樣的理解,程序應(yīng)該在50秒之后開始a組噴發(fā),但程序運行結(jié)果是,不但a組噴發(fā),而且c