工控網(wǎng)首頁
>

應(yīng)用設(shè)計

>

簡化監(jiān)控軟件的編程方法

簡化監(jiān)控軟件的編程方法

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

提交

查看更多評論