PC與PLC通信軟件的設(shè)計開發(fā)
為了便于對工業(yè)設(shè)備的運(yùn)作進(jìn)行統(tǒng)一監(jiān)控,生產(chǎn)上經(jīng)常需要通過一臺PC與多臺PLC(Programmable Logic Controller)進(jìn)行數(shù)據(jù)交換,特別是通過PLC將現(xiàn)場設(shè)備的一些關(guān)鍵參數(shù)傳輸?shù)?/font>PC上并顯示出來。為了迎合顧客的這個需求,各大PLC生產(chǎn)廠家都花大力氣開發(fā)出了一系列以各類協(xié)議為基準(zhǔn)的功能強(qiáng)大的管理監(jiān)控軟件,譬如Siemens公司開發(fā)的WINCC應(yīng)用軟件,其功能就令人眼花繚亂。
本文引用地址:http://butianyuan.cn/article/2810.htm但同時應(yīng)該指出的是,這些軟件大都價格昂貴,而且其繁多的功能在許多小規(guī)模的生產(chǎn)場合或是教學(xué)使用中也并不十分必要,種種實際因素的限制使得購買這些軟件對于很大一部分用戶來說是不合算的。在這樣一個背景下,開發(fā)一個簡易實用的通信程序就體現(xiàn)出一定的價值。
本設(shè)計的主要目的是要滿足中小用戶及教學(xué)中利用PC對PLC進(jìn)行監(jiān)控的需要。在實現(xiàn)通信的過程中,PLC被設(shè)置為Freeport自由口通信模式,所以用戶只需要使用普通的PC和PLC,以PC/PPI電纜外加雙絞線將其依次連接就可以了。另外本設(shè)計中用到的PC至少要有一個串行通信口,PLC方面則主要是以帶DP口的Siemens S7 200 系列PLC為例進(jìn)行說明。
本軟件在功能上主要包括PLC->PC和PC->PLC兩部分,在實際編寫時PC和PLC兩方面均須編程。其中PC程序用Visual Basic6.0編寫,以其自帶的MSComm通信控件作主要的通信控制,PLC程序則在STEP7 MicroWIN環(huán)境中編寫。同時假定一臺PC與七臺PLC進(jìn)行通信。
整個軟件實現(xiàn)的基本功能就是當(dāng)用戶需要讀取數(shù)據(jù)時,在控制界面(如圖1)上選擇某臺PLC并點(diǎn)擊“接收數(shù)據(jù)”按鈕后,相應(yīng)PLC將會把存儲在發(fā)送區(qū)的數(shù)據(jù)發(fā)送過來,發(fā)送結(jié)束后,數(shù)據(jù)接收框顯示“數(shù)據(jù)接收完”;當(dāng)用戶需要發(fā)送數(shù)據(jù)給某臺PLC時,也先選擇需要的PLC,再在數(shù)據(jù)發(fā)送框中填入要發(fā)送的數(shù)據(jù),點(diǎn)擊“發(fā)送數(shù)據(jù)”按鈕,PC就會將用戶填入的數(shù)據(jù)送到PLC中接收數(shù)據(jù)區(qū),PLC同時還會把接收到的這個數(shù)據(jù)顯示出來。并且整個程序可以很方便地進(jìn)行功能擴(kuò)展。
下面就分別從PC和PLC兩個方面具體說明通信的實現(xiàn)過程。
這里,PC程序是占主導(dǎo)地位的,其流程圖示于圖2。由PC程序來傳達(dá)用戶究竟是要進(jìn)行讀還是寫操作,以及具體對哪臺PLC進(jìn)行操作。這幾項命令在軟件中由一個控制字來表達(dá),其定義如圖3。
當(dāng)PC方面程序開始運(yùn)行后,MSComm控件將把串口初始化,而后程序等待用戶選擇要進(jìn)行操作的PLC并點(diǎn)擊“發(fā)送數(shù)據(jù)”或“接收數(shù)據(jù)”按鈕。根據(jù)用戶的操作,程序會自動生成一個相應(yīng)的控制字,并將其傳送給PLC。如果此時用戶是要讀取某臺PLC的數(shù)據(jù),則PC在發(fā)送完控制字后會停下來等待相應(yīng)PLC將數(shù)據(jù)發(fā)送過來。一旦接收到數(shù)據(jù),PC會首先判斷是否結(jié)束幀,如不是,就將此數(shù)據(jù)裝入數(shù)據(jù)接收區(qū),然后發(fā)送確認(rèn)幀給PLC,并把接收到的數(shù)據(jù)在控制界面上的接收數(shù)據(jù)框中顯示出來提供給用戶。如果是結(jié)束幀,PC就會顯示在數(shù)據(jù)接收框中顯示出“數(shù)據(jù)接收完”,而后程序停止運(yùn)行直至用戶再次進(jìn)行操作。
如果用戶是要向某臺PLC發(fā)送數(shù)據(jù),PC將會在發(fā)送完相應(yīng)控制字后打開一個定時器,時間到后便讀取PLC已經(jīng)送來的EOF文件結(jié)束字符(ASCII碼為26)。讀取這個字符可以觸發(fā)MSComm的OnComm事件,并使其CommEvent屬性值為comEvEOF。這樣,通過一個以CommEvent為表達(dá)式的條件分支語句就可以使程序轉(zhuǎn)入發(fā)送有效數(shù)據(jù)(即用戶寫入控制界面上發(fā)送數(shù)據(jù)框的數(shù)據(jù))的操作。這里設(shè)置定時器的目的會在下面介紹PLC方面程序時予以具體說明。PC執(zhí)行完發(fā)送程序段就會暫停下來等待用戶的下一步指示。
PLC在初始化結(jié)束之后就根據(jù)PC送來的控制字進(jìn)行相應(yīng)的操作,其程序流程圖如圖4所示。PLC首先將接收到的控制字拆分,判斷出用戶的具體要求,然后調(diào)用相應(yīng)的子程序。如用戶需要讀取數(shù)據(jù),PLC將會把存儲在發(fā)送緩沖區(qū)的數(shù)據(jù)依次發(fā)送過來。每次發(fā)送完一個數(shù)據(jù)后,PLC就等待PC發(fā)一個確認(rèn)幀過來,只有接收到這個確認(rèn)幀,PLC才會將下一個數(shù)據(jù)發(fā)送出去,以此保證通信雙方保持同步。并且,PLC在每次發(fā)送數(shù)據(jù)前要檢驗一下這個數(shù)據(jù)是不是結(jié)束幀,由于在預(yù)處理PLC的發(fā)送表時將其統(tǒng)統(tǒng)裝入了結(jié)束幀,而后才從頭依次裝入有效數(shù)據(jù),故一旦有效數(shù)據(jù)發(fā)完,PLC必然會發(fā)出一個結(jié)束幀。當(dāng)PLC檢測到要發(fā)送的是結(jié)束幀后將會把這個結(jié)束幀發(fā)出,然后程序暫停運(yùn)行直至PC再次送來讀/寫指令。
如果用戶是要進(jìn)行寫操作,PLC在對控制字進(jìn)行相應(yīng)判斷后,將會發(fā)送一個EOF給PC,以此觸發(fā)PC發(fā)送有效數(shù)據(jù)。前面提到了在PC程序中設(shè)置定時器,其目的是要保證PC能夠可靠地讀到PLC發(fā)來的EOF,由于程序的運(yùn)行是需要一定時間的,故PLC不可能在PC發(fā)送完控制字后立即回送EOF。根據(jù)筆者的測試,設(shè)置定時器在2s左右是比較合適的。PLC在接收完數(shù)據(jù)后就會停下來等待PC發(fā)送新的控制字。
由于采用了事件驅(qū)動的Visual Basic為編程語言,并且還用到了它自帶的MSComm通信控件進(jìn)行對數(shù)據(jù)傳輸?shù)闹饕刂?,整個軟件體系思路清晰,代碼易于編寫,并且在功能上很容易進(jìn)行擴(kuò)展。以此設(shè)計中軟件為藍(lán)本,用戶可以方便地根據(jù)自身具體需要開發(fā)出更加符合自己要求的軟件,而在硬件方面就根本不需要添加什么設(shè)備。■
參考文獻(xiàn)
1鐘肇新.王灝. 可編程控制器入門教程,華南理工大學(xué)出版社,1995.5
2宋偉.吳建國. Visual Basic 6.0編程基礎(chǔ),清華大學(xué)出版社,1999.2
評論