黃光慈,周菊,曹希龍,萬(wàn)林林,方濤
(徐州徐工施維英機(jī)械有限公司,江蘇 徐州 221004)
目前市面上,所有的控制系統(tǒng)都是以電腦 PC 為控制核心,兼用其他控制元件來(lái)完成整體的控制要求。不同的是,有的是使用 PC+PLC 來(lái)完成,有的采用PC+PLC+配料模塊來(lái)完成,更有直接采用一臺(tái) PC 完成全部處理的功能。各種方式各有利弊。
采用 PC 獨(dú)立設(shè)計(jì)的控制系統(tǒng),普通的商用 PC 難以達(dá)到使用要求,因此需要使用專(zhuān)用的工控機(jī),同時(shí)工控機(jī)主板上必須具有多塊 PCI 插槽,因?yàn)樾枰~外安裝多個(gè)信號(hào)采集卡。當(dāng)外界信號(hào)通過(guò)信號(hào)采集卡進(jìn)入 PC之后,即可根據(jù)程序指令來(lái)輸出不同的動(dòng)作,讓指定的外部元件動(dòng)作。市場(chǎng)上采用這種獨(dú)立 PC 設(shè)計(jì)的控制方式的廠(chǎng)家較少,主要是因?yàn)椋?/p>
(1)軟件設(shè)計(jì)的難度較大。軟件不光是數(shù)據(jù)的處理分析,還需要對(duì)生產(chǎn)流程進(jìn)行控制,實(shí)現(xiàn)各種互鎖條件等等。開(kāi)發(fā)難度巨大。
(2)硬件成本較高。除去一臺(tái)專(zhuān)業(yè)的工控機(jī),還需要額外擴(kuò)展多塊價(jià)格不菲的信號(hào)采集卡。
(3)PC 機(jī)直接與外界信號(hào)相連,容易受到外界信號(hào)的干擾?;炷翑嚢枵镜纳a(chǎn)環(huán)境復(fù)雜,控制室中由于強(qiáng)電、弱電柜的存在,隨時(shí)有著強(qiáng)大的電磁干擾的存在。因此,一旦有強(qiáng)電流進(jìn)入電腦主板,輕則燒毀信號(hào)采集卡,重則導(dǎo)致電腦主板直接燒毀。而主板一旦毀壞,則整臺(tái) PC 機(jī)都無(wú)法工作,由此將給攪拌站帶來(lái)巨大的損失。
在這種方式中,PC 作為上位機(jī),PLC 作為下位機(jī),兩者之間通過(guò) MODBUS 協(xié)議進(jìn)行通訊。PLC 即所謂可編程邏輯控制器,是專(zhuān)業(yè)的用于工業(yè)控制領(lǐng)域的編程控制器,經(jīng)過(guò)多年的發(fā)展,市場(chǎng)上已經(jīng)可以買(mǎi)到多種價(jià)格相對(duì)便宜而又穩(wěn)定耐用的 PLC 產(chǎn)品,比如西門(mén)子PLC、三菱 PLC 等等。
這種方式的好處顯而易見(jiàn),PC 不再需要與外部信號(hào)連接,因此就降低了 PC 被外界干擾電流損壞的風(fēng)險(xiǎn)。其次,由于與外界信號(hào)相連的是 PLC,因此就算PLC 被外界干擾損壞,也只需要更換一個(gè) PLC 模塊即可,而一個(gè) PLC 模塊價(jià)格是遠(yuǎn)遠(yuǎn)低于 PC 的。第三,生產(chǎn)控制由 PLC 來(lái)處理,因此對(duì)于上位機(jī)來(lái)說(shuō),無(wú)論是編程開(kāi)發(fā)的壓力還是處理生產(chǎn)流程的壓力都要小很多。
但是,這種方式的缺點(diǎn)也同樣明顯。第一,PLC 編程與目前現(xiàn)有的 PC 編程語(yǔ)言差異較大,需要由完全不同的人員來(lái)編寫(xiě)。這就需要至少兩人來(lái)負(fù)責(zé)控制系統(tǒng)的開(kāi)發(fā),一個(gè)負(fù)責(zé)上位機(jī)開(kāi)發(fā),另一人負(fù)責(zé)下位機(jī)開(kāi)發(fā)。不過(guò) PLC 編程總體來(lái)說(shuō)比 PC 編程還是要簡(jiǎn)單很多的。因此總體上并沒(méi)有多大的難度。第二,由于 PLC 的專(zhuān)長(zhǎng)是處理數(shù)字量,即對(duì)0或1進(jìn)行條件判斷,但是對(duì)于模擬量的處理,PLC 由于其本身 CPU 處理能力的限制,對(duì)模擬量的處理速度非常慢。因此,在攪拌站的控制中,對(duì)于上位機(jī)來(lái)說(shuō)又需要承擔(dān)一部分生產(chǎn)的職能,即由上位機(jī)進(jìn)行運(yùn)算來(lái)控制PLC 進(jìn)行配料、投料等等。因此,這種 PC+PLC 的設(shè)計(jì)方式,并沒(méi)有完全的將上位機(jī)的數(shù)據(jù)管理和下位機(jī)生產(chǎn)流程控制分開(kāi)。由此就又產(chǎn)生了第三種控制模式,即采用 PC +PLC+配料模塊設(shè)計(jì)的控制系統(tǒng)。
這種方式與 1.2 中所述方式的不同在于,新增了配料模塊。配料模塊就是將 PC 的流程控制功能獨(dú)立出來(lái),由專(zhuān)門(mén)的硬件進(jìn)行控制,并在合適的時(shí)間將動(dòng)作信號(hào)傳遞給 PLC,然后由 PLC 進(jìn)行生產(chǎn)控制。上位機(jī)通過(guò) MODBUS 協(xié)議與每個(gè)配料模塊相連,然后將配方值傳送到配料模塊中。同時(shí)每個(gè)配料秤在生產(chǎn)中的重量,全都由傳感器輸送給配料模塊,然后配料模塊經(jīng)過(guò)計(jì)算分析之后,輸出相應(yīng)的配料信號(hào)或投料信號(hào),之后 PLC接收到配料模塊產(chǎn)生的信號(hào)之后,可以根據(jù)當(dāng)前的條件進(jìn)行判斷是否執(zhí)行相應(yīng)的流程即可。
目前,采用這種方式的廠(chǎng)家比較多。因?yàn)樗鼘?shí)現(xiàn)了“專(zhuān)人做專(zhuān)事”的控制模式,通過(guò)不同模塊之間的協(xié)同合作來(lái)完成生產(chǎn)控制。同時(shí),目前市場(chǎng)上也有很多廠(chǎng)家單獨(dú)生產(chǎn)配料模塊,這些廠(chǎng)家生產(chǎn)的配料模塊,經(jīng)過(guò)多年的市場(chǎng)檢驗(yàn),已經(jīng)比較成熟,對(duì)于配料的精度已經(jīng)掌握比較好,因此可以直接購(gòu)買(mǎi)現(xiàn)成的模塊,然后再進(jìn)行MODBUS 通訊編程即可。同時(shí),這種模式因?yàn)槭∪チ松a(chǎn)流程的控制,只需要開(kāi)發(fā) MODBUS 協(xié)議即可,因此開(kāi)發(fā)難度比上一種也要簡(jiǎn)單一些。
簡(jiǎn)單地說(shuō),這種模式就是以多個(gè)簡(jiǎn)單的模塊進(jìn)行組合起來(lái),就能夠?qū)崿F(xiàn)負(fù)責(zé)的流程控制模式。而每個(gè)模塊承擔(dān)的職責(zé)相對(duì)單一且清晰,編程難度也不是很大。同時(shí),筆者本人所從事的攪拌站軟件開(kāi)發(fā)工作中,也采用的是 PC+PLC+配料模塊的方式進(jìn)行攪拌站控制的。
PC 平臺(tái)上的編程語(yǔ)言有上百種,有不需要編譯就能直接運(yùn)行的腳本語(yǔ)言,如 JavaScript;也有必須預(yù)編譯才能執(zhí)行的語(yǔ)言,如 Java、C#;甚至還有使用中文進(jìn)行編程的“易語(yǔ)言”,等等。但是,如何從中選擇合適的語(yǔ)言進(jìn)行開(kāi)發(fā)呢?筆者總結(jié)出來(lái)以下幾條原則:
(1)該編程語(yǔ)言必須能夠穩(wěn)定的運(yùn)行于 PC 平臺(tái)上,且能夠方便快速的進(jìn)行桌面應(yīng)用程序的開(kāi)發(fā)。
(2)該語(yǔ)言需要有大量的第三方開(kāi)發(fā)工具包,換句話(huà)說(shuō),必須有大量的編程人員使用這種語(yǔ)言進(jìn)行開(kāi)發(fā),即所謂豐富的軟件生態(tài)環(huán)境。
(3)該語(yǔ)言必須能夠直接調(diào)用 Windows 平臺(tái)的各種 API 函數(shù)。
(4)該語(yǔ)言必能能夠很好地在 x86 和 x64 兩種Windows 平臺(tái)的架構(gòu)下運(yùn)行。
基于以上幾點(diǎn),在目前的主流開(kāi)發(fā)語(yǔ)言中,優(yōu)先推薦的就是 C#、C++、Java 這三種編程語(yǔ)言。同時(shí),筆者個(gè)人認(rèn)為 Java 的優(yōu)勢(shì)在于開(kāi)發(fā)企業(yè)級(jí)的應(yīng)用軟件,而在工業(yè)控制領(lǐng)域的應(yīng)用則并不是非常廣泛。因此,其實(shí)最優(yōu)的選擇就是 C# 和 C++ 了。前者是微軟目前大力推廣的編程語(yǔ)言,且 .net 平臺(tái)已經(jīng)集成在了 Windows7及以上的平臺(tái)上,可以說(shuō)是“背靠大樹(shù)好乘涼”。而后者也是擁有多年歷史,廣泛應(yīng)用于各種平臺(tái)與硬件軟件中。但是 C++ 需要程序員去處理內(nèi)存、野指針等問(wèn)題,處理起來(lái)復(fù)雜且棘手。而 C# 則無(wú)需考慮這些問(wèn)題。因此,目前在工業(yè)控制領(lǐng)域中,使用最廣泛的就是C# 編程了。筆者本人所在的軟件開(kāi)發(fā)團(tuán)隊(duì),也是使用C# 進(jìn)行攪拌站上位機(jī)軟件開(kāi)發(fā)的。
PLC 方面則無(wú)需贅述,使用梯形圖編程即可。
模塊化的設(shè)計(jì)是軟件編程中的重要思想,模塊的使用者不需要知道模塊的內(nèi)部構(gòu)造,只需要在需要時(shí)調(diào)用相關(guān)模塊,然后在模塊處理完成之后獲取到結(jié)果即可。對(duì)于中間的步驟,無(wú)需讓外界知曉。這里著重以筆者所在的設(shè)計(jì)團(tuán)隊(duì)進(jìn)行開(kāi)發(fā)攪拌站控制系統(tǒng)進(jìn)行模塊設(shè)計(jì)方面的分析。
MODBUS 協(xié)議并不是一個(gè)全雙工的通信協(xié)議,即MODBUS 協(xié)議支持讀寫(xiě)操作,但是兩個(gè)動(dòng)作不能同時(shí)進(jìn)行。而且,在攪拌站運(yùn)行的過(guò)程中,對(duì) PLC 的讀操作要多于寫(xiě)操作,因?yàn)樾枰獙?PLC 的狀態(tài)實(shí)時(shí)的反饋的電腦的顯示界面中;而寫(xiě)操作,除非在特殊情況下需要進(jìn)行手動(dòng)干預(yù),否則一般不需要進(jìn)行大量的寫(xiě)操作。因此,基于以上兩個(gè)點(diǎn)分析,筆者所在的軟件開(kāi)發(fā)團(tuán)隊(duì)中,開(kāi)發(fā)出了一個(gè)所謂的 “通訊節(jié)拍器”進(jìn)行軟件通訊。具體的模型可以解釋為一下內(nèi)容:
(1)通訊節(jié)拍器一般情況下只對(duì) PLC 進(jìn)行讀取。
(2)通訊節(jié)拍器內(nèi)容有一個(gè)任務(wù)隊(duì)列,即需要進(jìn)行的寫(xiě)操作。通訊節(jié)拍器會(huì)實(shí)時(shí)監(jiān)測(cè)任務(wù)隊(duì)列中的情況,當(dāng)這個(gè)任務(wù)隊(duì)列為空時(shí),即沒(méi)有需要進(jìn)行的寫(xiě)操作時(shí),節(jié)拍器就進(jìn)行默認(rèn)操作,即讀操作。
(3)當(dāng)需要進(jìn)行寫(xiě)操作時(shí),會(huì)有一個(gè)新的寫(xiě)操作對(duì)象被添加到通訊節(jié)拍器的任務(wù)隊(duì)列中。通訊節(jié)拍器會(huì)監(jiān)測(cè)到任務(wù)隊(duì)列中有新的寫(xiě)操作被添加進(jìn)來(lái)時(shí),會(huì)停止默認(rèn)的讀操作,然后開(kāi)始進(jìn)行寫(xiě)入操作。
(4)一個(gè)寫(xiě)入操作完成之后,繼續(xù)檢測(cè)任務(wù)隊(duì)列,是否還有其他寫(xiě)操作,如果有則繼續(xù)下一個(gè)寫(xiě)入操作。重復(fù)此循環(huán),直到任務(wù)隊(duì)列被清空。
(5)任務(wù)隊(duì)列清空后,恢復(fù)進(jìn)行默認(rèn)的讀操作。
在使用 VisualStudio 進(jìn)行軟件開(kāi)發(fā)時(shí),可以進(jìn)行控件的拖拽和編輯,以此來(lái)完成界面的編輯。但是要求是目標(biāo)電腦上必須安裝了 VisualStudio,且這樣的改動(dòng)是直接修改源程序的,這樣顯然會(huì)給現(xiàn)場(chǎng)調(diào)試帶來(lái)巨大不便,因?yàn)榘惭b一個(gè) VS 需要耗費(fèi)數(shù)小時(shí)的時(shí)間,且直接修改源代碼也存在較大風(fēng)險(xiǎn)。那么能不能使用 C# 編寫(xiě)一個(gè)能夠自定義和修改界面的程序呢?
答案當(dāng)然是能的。這里需要使用到微軟自帶的組件DesignSruface 以及 DesignSurfaceManager 組件。在應(yīng)用程序的引用列表中,添加 System.ComponentModel 的引用,然后直接在程序中就可以引用 DesignSruface 以及 DesignSurfaceManager 組件了。有了以上兩個(gè)組件之后,編輯器最主要的框架可以說(shuō)就搭好了,剩下要做的就是具體的實(shí)例和重寫(xiě)相關(guān)方法和類(lèi)。具體的編碼工作完成之后,即可以實(shí)現(xiàn)簡(jiǎn)單的界面編輯操作。如圖 1。
在圖1中,可以看到左邊的工具欄顯示了各種控件,中間是當(dāng)前的界面,右邊則是一個(gè)控件的屬性。在這個(gè)編輯器中,就可以改動(dòng)或編輯各種界面,改動(dòng)之后會(huì)生成一個(gè) XML 文件,之后再進(jìn)行讀取就可以將整個(gè)界面呈現(xiàn)出來(lái)。
數(shù)據(jù)持久化是每一個(gè)軟件系統(tǒng)中必須面臨的問(wèn)題。一個(gè)好的數(shù)據(jù)持久化框架,能夠減少大量重復(fù)代碼的開(kāi)發(fā),增加開(kāi)發(fā)效率。筆者所在的團(tuán)隊(duì)中,使用的SQLServer 數(shù)據(jù)庫(kù),因此就需要在程序運(yùn)行中頻繁地對(duì)SQLServer 數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě)。在所有的讀寫(xiě)操作中,都需要一下幾個(gè)共同的操作:
(1)創(chuàng)建 SQL 連接字符串。
(2)根據(jù) SQL 連接字符串創(chuàng)建 SqlConnection 對(duì)象對(duì)目標(biāo)數(shù)據(jù)庫(kù)進(jìn)行嘗試連接。
(3)對(duì)數(shù)據(jù)庫(kù)的連接成功以后,在執(zhí)行不同的操作,如增刪改查等等。
圖1 界面編輯器
根據(jù)軟件開(kāi)發(fā)的原則,將不變的部分封裝起來(lái),將變化的部分獨(dú)立出來(lái)。于是,在上述的 1、2 步驟中,建立起一個(gè)通用的數(shù)據(jù)庫(kù)代理對(duì)象,通過(guò)代理對(duì)象來(lái)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)。然后將步驟三獨(dú)立出來(lái),成為一個(gè)委托,將不同的操作調(diào)用不同的委托即可。程序代碼如下:
以上代碼中,ReadDataHandler
以上就是一個(gè)數(shù)據(jù)庫(kù)代理的部分代碼段。通過(guò)這個(gè)代碼段,只需要編寫(xiě)相應(yīng)的數(shù)據(jù)轉(zhuǎn)換成對(duì)象的方法,然后調(diào)用 ReadDataHandler 的委托,傳遞給數(shù)據(jù)庫(kù)代理的相關(guān)方法即可完成對(duì)數(shù)據(jù)庫(kù)的讀操作。而無(wú)需再進(jìn)行數(shù)據(jù)庫(kù)的創(chuàng)建連接、測(cè)試連接等步驟。因?yàn)閿?shù)據(jù)庫(kù)代理對(duì)象已經(jīng)替我們完成了這寫(xiě)操作。
編碼原則是在程序開(kāi)發(fā)過(guò)程中,由前人經(jīng)過(guò)大量實(shí)踐總結(jié)出來(lái)的一些經(jīng)驗(yàn),而并非具體的語(yǔ)法規(guī)則。只是采用這些規(guī)則會(huì)對(duì)程序的開(kāi)發(fā)維修帶來(lái)很多方便,因此,在所有的軟件開(kāi)發(fā)團(tuán)隊(duì)中,都有一套自己的編碼原則。這里簡(jiǎn)單介紹幾條筆者所在的團(tuán)隊(duì)的編碼原則:
(1)每個(gè)類(lèi)的命名必須以這個(gè)類(lèi)所表示的實(shí)際意義來(lái)進(jìn)行命名,使用類(lèi)中文名稱(chēng)對(duì)應(yīng)的英文來(lái)命名。如果,一個(gè)混凝土的生產(chǎn)計(jì)劃,可以命名為ConcreteProductPlan。
(2)類(lèi)的命名方式采用駱駝命名法則,即每個(gè)單詞的首字母大寫(xiě),其余字母小寫(xiě)的方式,如生產(chǎn)任務(wù),可以寫(xiě)為 ProduceMission。
(3)私有變量必須以小寫(xiě) m 和下劃線(xiàn)開(kāi)后,之后是采用駱駝命名法則的變量的實(shí)際名稱(chēng)。比如,一個(gè)私有的時(shí)間變量,表示混凝土的生產(chǎn)開(kāi)始時(shí)間,則可以命名為:
(4)常量必須以全大寫(xiě)的方式命名。
(5)類(lèi)中的每個(gè)方法不應(yīng)有過(guò)長(zhǎng)的方法體,最長(zhǎng)不能超過(guò)100行。如果行數(shù)超過(guò)了 100,則需要對(duì)這個(gè)方法進(jìn)行拆分,將其拆分成若干個(gè)小方法。
(6)每個(gè)類(lèi)中的方法,無(wú)論是共有還是私有,一律采用駱駝命名法進(jìn)行。并且必須以這個(gè)方法所起到的實(shí)際作用來(lái)命名。
控制系統(tǒng)是混凝土攪拌站的核心和大腦,因此,一個(gè)良好優(yōu)秀的程序設(shè)計(jì),不光能夠?yàn)殚_(kāi)發(fā)人員來(lái)帶來(lái)更高的效率,也能為用戶(hù)帶來(lái)良好的體驗(yàn)。本文以筆者所從事的開(kāi)發(fā)工作出發(fā),簡(jiǎn)單敘述了不同市面上幾種控制系統(tǒng)和控制系統(tǒng)的相關(guān)部件及其優(yōu)缺點(diǎn)。軟件發(fā)開(kāi)是一條無(wú)止境的道路,望與各位軟件開(kāi)發(fā)者共勉。