簡(jiǎn)化監(jiān)控軟件的編程方法
2006/4/25 11:58:00
我曾發(fā)表過(guò)《運(yùn)用VC#編程通過(guò)OPC方式實(shí)現(xiàn)PC機(jī)與西門子PLC通訊》的文章,并且自己開發(fā)了一個(gè)標(biāo)準(zhǔn)類庫(kù):S7Connection,然后我使用該類庫(kù)與西門子PLC通訊,運(yùn)用VC#編程設(shè)計(jì)監(jiān)控界面,但在實(shí)際使用中我發(fā)現(xiàn)其工作量比使用標(biāo)準(zhǔn)的組態(tài)軟件WinCC、Intouch要大得多,其工作量主要體現(xiàn)在PLC變量的創(chuàng)建、管理與訪問(wèn)上,現(xiàn)在我終于找到了一套解決方法,大大的簡(jiǎn)化了編程。 以下是整個(gè)框架圖: 上圖中的三個(gè)類S7MPI、AsynServer、SynServer在我之前發(fā)表的三篇文章中有介紹,這里主要針對(duì)同步訪問(wèn)類SynServer來(lái)介紹如何設(shè)計(jì)簡(jiǎn)化的編程結(jié)構(gòu)。 1、創(chuàng)建和使用數(shù)據(jù)庫(kù) 在一個(gè)監(jiān)控系統(tǒng)中可能需要幾百個(gè)變量與PLC通訊,西門子的OPC編程把變量稱為項(xiàng)(Item),把掃描周期相同的項(xiàng)歸納成組(Group),使用過(guò)WinCC的人很熟悉項(xiàng)和組。在使用OPC編程時(shí),首先需要向服務(wù)器添加組,然后向相應(yīng)的組中添加一系列用于訪問(wèn)PLC信息 的項(xiàng),當(dāng)項(xiàng)多大幾百個(gè)時(shí),用手動(dòng)編程的方式去添加它,工作量非常大,容易出錯(cuò),也不便于管理。 我們可以考慮設(shè)計(jì)一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)庫(kù),用于存儲(chǔ)項(xiàng)和組,然后設(shè)計(jì)一個(gè)管理軟件用于編輯數(shù)據(jù)庫(kù)中的這些項(xiàng)和組(上圖中的ProgramProduce軟件),再編寫一個(gè)標(biāo)準(zhǔn)類,用于讀取該數(shù)據(jù)庫(kù)的信息,并自動(dòng)把項(xiàng)和組添加到服務(wù)器中,在人機(jī)界面中訪問(wèn)PLC變量時(shí),直接通過(guò)該類獲取數(shù)據(jù),這就是上圖中Data類所起的作用。 所以創(chuàng)建的數(shù)據(jù)庫(kù)需要起到儲(chǔ)存項(xiàng)和組信息的作用,以下是三個(gè)表的關(guān)系: 顧名思義,Table_Server用于存儲(chǔ)服務(wù)器設(shè)定信息,Table_Group用于存儲(chǔ)組信息,Table_Item用于存儲(chǔ)項(xiàng)信息。 2、設(shè)計(jì)訪問(wèn)變量管理軟件ProgramProduce <1>該軟件首先需要能打開上面的數(shù)據(jù)庫(kù),如下圖: <2>能夠添加、編輯和刪除組,如下圖(要求點(diǎn)擊左邊的樹形結(jié)構(gòu)時(shí),右側(cè)能夠顯示當(dāng)前被選中的組信息): <3>能夠添加、編輯和刪除項(xiàng),如下圖(要求點(diǎn)擊左邊的樹形結(jié)構(gòu)時(shí),右側(cè)能夠顯示當(dāng)前被選中的項(xiàng)信息): 〈4〉要求能夠設(shè)定服務(wù)器信息: 〈5〉由于變量常常使用Excel軟件輸入,故還要求該軟件能夠把Excel文件中的內(nèi)容導(dǎo)入其中,而Excel的輸入應(yīng)該有規(guī)定,類似于下圖: 導(dǎo)入對(duì)話框的設(shè)計(jì)可參照下圖: 右上角列出當(dāng)前可用的組,左邊列出已成功導(dǎo)入的Excel文件中的內(nèi)容,選中相應(yīng)的一些項(xiàng)和某一個(gè)組,可把這些項(xiàng)添加到選定的組中。 這就是該軟件應(yīng)該具備的基本功能,在我把這個(gè)小軟件設(shè)計(jì)出來(lái)后,我感覺(jué)比其他一些組態(tài)軟件在變量管理方面好用一些。 3、 設(shè)計(jì)Data類 首先應(yīng)該根據(jù)指定的文件名打開數(shù)據(jù)庫(kù),然后完成添加組和項(xiàng)的工作,最后應(yīng)該提供訪問(wèn)接口,以便外部程序能夠通過(guò)其獲取和寫入PLC數(shù)據(jù)。嚴(yán)重建議讀寫PLC數(shù)據(jù)以變量的符號(hào)名為準(zhǔn),就像Step 7中的符號(hào)名。 4、現(xiàn)在來(lái)瞧一下我們?cè)L問(wèn)PLC信息需要的編程量 《1》、在程序開頭,創(chuàng)建對(duì)象,并確保該對(duì)象能夠被程序中的所有窗口訪問(wèn) S7Connection.Data dt=new S7Connection.Data(); 《2》、在需要訪問(wèn)數(shù)據(jù)的每一個(gè)窗體中添加一個(gè)定時(shí)器,并將Enable屬性設(shè)為false 《3》、在程序的某個(gè)初始化處編寫類似以下代碼,以打開訪問(wèn)接口: string fileName = System.IO.Directory.GetCurrentDirectory(); fileName += "\\dbHMI.mdb"; if (succ) timer1.Enabled = true; 當(dāng)然,可以使用序列化記錄數(shù)據(jù)庫(kù)路徑,若找不到數(shù)據(jù)庫(kù),彈出對(duì)話框,讓用戶尋找數(shù)據(jù)庫(kù)。 《4》、在定時(shí)器觸發(fā)事件中編寫讀取數(shù)據(jù)的代碼,類似如下: dt.RefreshGroup("wxy"); textBox1.Text = dt["MW1"].ToString(); textBox2.Text = dt["M2.0"].ToString(); … 注:在讀取數(shù)據(jù)前,一定要先使用代碼:dt.RefreshGroup("wxy");其中”wxy”為上面Table_Group表中的Name_Group字段存儲(chǔ)的值。而”MW1”則為Table_Item中的Symbol字段存儲(chǔ)的值(符號(hào)名可以是任意合法的名字,但不容許重復(fù))。 若讀取另一個(gè)組中的數(shù)據(jù)則需要再次編寫代碼: dt.RefreshGroup(groupName); 就這么簡(jiǎn)單,比以前的編程工作量小多了。 5、編寫自己的.Net控件,這樣可以設(shè)計(jì)美麗的外觀,也可以減少很多重復(fù)性的工作量。 我將會(huì)上傳: S7Connection類庫(kù): S7Connection.dll及說(shuō)明文檔:struct.doc ProgramProduce軟件: ProgramProduce.exe 數(shù)據(jù)庫(kù)文件:dbHMI.mdb Excel變量實(shí)例:address.xls 基本控件庫(kù):OPCControls.dll
提交
查看更多評(píng)論
其他資訊
工業(yè)自動(dòng)化設(shè)計(jì)高級(jí)參考
使用西門子的SCL語(yǔ)言編寫ABB變頻器的總線控制程序塊
PLC的面向?qū)ο缶幊?/p>
Siemens OPC編程的.NET類庫(kù)及使用說(shuō)明