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