本文關鍵字:
面向對象編程是計算機高級語言的一種先進的編程模式,在工業控制系統的plc程序中也可以采用這種設計思想,雖然我們無法實現面向對象的很多優秀特點如“繼承”,甚至于它根本就不具備面向對象編程語言的特點,但面向對象編程的基本概念就是類和類的實例(即對象),我們只需要使用這種概念就可以了。在計算機編程中我們需要把一些事物抽象和歸納,才能編寫類,而在工業控制系統中,控制對象如:電機,閥等等是很明顯的控制類別,不需要抽象就可以很明顯的針對它們編寫類,以下將會用到西門子的Step7編程語言和施奈德的Unity 編程語言來講解PLC的面向對象編程。 一、 實現方式 面向對象編程在Step7中使用功能塊(即FB)編程,一談到此大家就會想到西門子提出的模塊化編程,不錯,就是這個模塊化編程,但西門子提出的模塊化、背景數據塊、多重背景等名詞并不能讓大家很明白的理解和使用這種優秀的設計理念。如果大家從面向對象編程的角度去理解,則可以很好的理解這種設計模式?!癋B塊”被看 成“類”,它可以被看成是對相似的控制對象的代碼歸納,如對MM440的變頻器可以編寫FB塊:MtrMM440,這在面向對象編程中稱為“類”,當需要 編程控制具體的電機時,可以給它分配一個背景DB塊,在面向對象編程中稱為類的實現(即創建類的實例:對象),當需要控制多個電機時,可以分配不同的背景 DB到這個FB塊,即創建類的多個實例。Step7中有另外一種程序塊,即FC塊,以FC塊為主的編程在西門子中稱為結構化編程,這也可以類比于計算機編程中的面向過程編程,即純粹以函數為主體的編程。 施奈德的Unity軟件編程可以更好的理解面向對象編程。它的DFB定義中包含輸入/輸出參數,私有/共有變量,以及代碼實現,而這正是計算機的面向對象 編程中“類”的基本元素,而創建類的實例(對象)就像創建普通的“布爾”變量一樣,只需在“Function Blocks”中定義這種“類”的變量即可。 Step7和Unity都可以采用面向過程和面向對象編程方式,這兩種編程方式的區別類似于計算機高級語言中的C語言和C++語言編程的區別。 以下的講解將會把Step7中的FB和Unity中的DFB稱為“類”,Step7中的FB+背景DB以及Unity中DFB的實例稱為“對象”。 二、 面向對象編程架構 以上講解的是實現細節,而編程思想是建立在程序架構上的,不是某個局部使用了面向對象方式,則可以稱之為這種編程就是面向對象編程。這種編程需要從以下方面著手: 1、 電路設計的結構化。 這里主要以自動線為主介紹,對于單機機床可以是它的簡化結構, <1>、自動線層:這是最高層次,它擁有一個主PLC,對屬于它下面的各區域控制 <2>、工程層:擁有獨立的配送電系統,但沒有PLC,只有分布式模塊,由自動線控制。顧名思義,它有著較大的獨立性,可以作為一個單獨的工程項目設計和制造,當自動線比較小時,可以省略該層次。 <3>、功能組層:根據工藝劃分,將實現某一個工藝功能的區段設備劃分為一個功能組,它隸屬于工程層,當工程層被省略時,隸屬于自動線層。 面向對象編程并不一定要求使用以上的結構,但好的電氣結構更利于面向對象編程。 2、 任何控制對象邏輯都在“類”中實現。 為了做到這點,必須分析與控制對象相關的信息,譬如,對于一個電機,有以下相關的信息需要考慮: 輸入信息: <1>、電路保護信息,如電機的空氣開關,熱繼電器等。 <2>、功能保護信息,如運動電機的限位開關,風機的風壓開關,油泵的油位開關等。 <3>、啟動和終止條件,以上的電路保護和功能保護都可能導致電機運轉終止,復位也可能導致重啟動,但這里的條件指的是正常運行的啟動和終止條件,譬如順序控制的流程步。 <4>、控制模式:如手動和自動等。 <5>、故障復位:通過復位信息,重新啟動。 輸出信息: <1>、控制輸出,如控制電機的主接觸器。 <2>、狀態信息輸出 <3>、故障輸出 ......... 狀態儲存信息: 用于代碼實現的中間變量以及可以被人機界面讀出的狀態變量等 把以上信息都整合到一個類中,并盡量使類的參數標準化。不過,同高級編程語言還是曾在一些差別,針對Step7,應該遵循的標準是:程序結構由FC實現,對象控制由FB實現,如下的一種結構體系(其電氣結構來自上面的介紹):這只不過是一個粗略的PLC程序架構體系,好的架構應該更完善和科學。 3、 規劃好數據結構 數據結構的定義相當重要,并盡量統一這些結構,不要顧慮存儲空間,當今的PLC內存足以容納大量的數據。說明一點的是在Step7中盡量不要在類的外部定義數據結構(UDT),而是在類里面定義,雖然會造成不同類中同一結構的重復性定義,但卻提高了類的獨立性。 三、 優越性 1、 標準化 使用這種設計模式,可以將程序設計分為兩個階段,即標準庫、基本架構開發,以及實際應用層面設計。其中標準庫、基本架構是制定程序標準化的基礎,而應用層設計是針對具體的控制工程編程,這樣可以把程序設計人員分成兩類,一類是標準開發,由資深程序員負責,一類是應用設計(其中程序調試規劃到應用設計),由 經過標準化培訓的一般程序員完成,通過這種分配就可以解決中國工業自動化中面臨的尷尬局面。傳統的中國控制工業,一個程序設計由一個人完成,這樣他還必須負責現場調試,而擁有豐富經驗的程序員一般是三十歲后,這時他已經成家,而顯然長期出差對家庭不利,很多優秀的程序員為了家庭考慮不得不改行,要么轉到管 理崗位,要么去制造工廠搞設備維護,這是資源的嚴重流失。毫無疑問,使用以上的設計流程,我么可以讓經驗豐富的程序員搞標準庫和架構的設計,而讓剛踏入這個行業的年輕人搞應用設計和調試,這不僅可以讓老程序員繼續他自己的工作,而不影響家庭,也可以讓年輕的程序員參入現場調試,培養自己的經驗,提高自己的 收入。 這可能讓某些人士擔心,認為年輕的程序員可以參加現場的調試嗎?可以肯定的是沒有標準化支撐的程序不僅年輕的程序員編不出來,而且現場調試會問題多多。但有了好的標準化后,一年半以上工作經驗的程序員就應該能夠獨立面對自動線。 PLC中的面向對象編程的核心就是黑匣子編程,針對Step7,我們使用FB去實現每一個對象的控制,控制邏輯、報警處理、信號交換全在FB中,對于應用設計人員,不需要明白里面的代碼實現,只需要了解該FB的功能以及如何使用好它就行,這樣對于應用程序人員的編程能力要求大大降低,對于編程只不過是遵循架構,拷貝代碼,改變輸入輸出條件而已。 那么調試呢?很多人認為使用FB編程的最大麻煩就是FB的多次調用后,根本無法診斷這些代碼,從技術層面上講確實如此,我們除了從背景DB上查看信息外, 是無法在它多次被調用后監控代碼的,但我已說過,這是黑匣子編程,我們不需要診斷這些代碼,只需要知道什么樣的輸入、什么樣的參數設定導致什么樣的輸出就行,代碼的邏輯與功能好壞是由標準庫開發人員負責的,這就要求標準開發人員需要對他設計的功能塊在不同條件下進行不同的測試,保證無誤,還需要編寫完整、 詳盡的功能說明文檔,以便于應用設計人員了解這些塊,標準架構并不是制定出來就一勞永逸的,針對千變萬化的工程,它是需要不斷完善和修訂的,這也是一個工程公司可以實實在在進行知識積累的地方。 程序不僅需要給調試人員使用,而且用戶(設備維護人員)也需要了解,如果把完整的標準庫文檔給用戶,可能曾在技術外泄的可能,若不給,對他們診斷設備可能曾在困難,這就需要標準制定人員制作另外一分文檔,即設備維護文檔,其知識的透漏以用戶能夠使用程序進行診斷為限。 2、 重用性和易管理型 計算機面向對象編程的優點也有重用性和易管理型,在PLC中也曾在,以Step7為例,需要討論FC和FB的差異。觀察數據類型,FB比FC只不過多一個 “STAT”類型,在使用上FB需要背景DB,FC不需要,但就這個差別導致FB擁有自己獨立的數據儲存空間,而FC的數據儲存卻必須借助公有變量(如中 間變量M或者共享DB),有這樣一種準則,程序塊的獨立性越強,其重用性也越好,產生數據訪問沖突的可能性也更少,則更易于管理。有些公司生產的PLC, 其程序語言沒有類似FB 的這種特性,這時可以采用類似“FC+共享DB”的替代方案解決,但它的獨立性已經大大降低。 同樣的代碼的獨立性是標準制定的一個重要環節,很難想象一個與其他功能塊之間有著千絲萬縷聯系的功能塊能夠被作為標準塊在不同工程中有效的重復使用。 縱觀計算機語言的發展,最開始的編程都是令人恐怖的,而當今的編程讓人們得到很大的解脫,有很多現成的標準類庫實用,人們可以把更多的編程精力放在實現功能本身上,plc編程也應該朝這種方向發展,應該讓更多的人從事應用層面的設計,那些標準功能塊不應該重復的被不同人員開發,雖然各大PLC廠開發了大量 的程序庫,但工業控制對象各式各樣,不同行業都應該擁有自己的程序庫,而代碼的可重用性是評價這些功能塊好壞的關鍵。 3、 設計思想的先進性 在電路圖設計中我們早已經在使用針對控制對象的繪圖方式,即把基本的主配送電路和PLC配置完成后,我們會針對每一個現場控制對象如:電機、閥、氣缸等控制對象繪制電路圖,他們的電源來自主配送電路,控制和反饋與PLC建立連接,硬件連鎖根據實際情況調整,一個個控制對象就象搭建積木一樣有組織的堆積起來,同樣的,編程也是針對一個個控制對象使用相應的標準控制塊實現就可以,把程序控制細節實現了有效的封裝,使程序看起來簡潔和易于維護,而好的設計可以把原理圖和程序進行很好的關聯,甚至于做到一對一的關系,如原理圖中的一個控制對象可以在程序中找到相應的FB調用與之對應,真正做到面向控制對象編程。 可能有人疑慮,PLC編程大部分是步進編程,這一個個標準塊都是針對控制對象的,那控制順序如何實現呢?這就要求編寫專門的順序控制FB塊,或者使用Siemens現成的Graph7來實現,這點與一般編程沒什么差別。 結束語:現在的工業控制領域有很多程序高手,他們很精通算法,也有著自己的編程理念,當我和一些人探討標準化時,他們認識到標準化的高效性,但認為這樣無法體現自己的編程水準,是的,如上所述作為應用層面的程序設計是不要很高的編程水平,但要想想,一個人難道能一輩子去搞現場調試嗎?若想體現自己的價值,可 以從事標準編程。我更希望他們能花一點時間研究程序架構,各行各業,真正的大師是系統架構設計者,編程小技巧只不過是為好的架構錦上添花。 |