張世友
(安徽馬鋼自動化信息技術有限公司 ,安徽馬鞍山,243011)
隨著PLC性價比的不斷提高,其應用范圍不斷擴大,特別是近年來PLC向著大型網絡化方向發展,已經滲透到鋼鐵,化工電力,制造、運輸等各個行業中。針對PLC編程、計算能力有限及PC機大量應用的情況,PC機與PLC的結合使用就成為必然趨勢。在各行各業的控制系統中西門子的S7 PLC被廣泛采用,由于西門子公司沒有公開西門子的S7以太網通訊協議,目前S7-400 PLC和PC機通訊的方式主要有以下幾種:
⑴通過西門子OPC服務器實現PC機和PLC通訊;
⑵利用西門子的SAPⅠ(西門子應用程序編程接口)調用西門子提供的動態鏈接庫函數來實現PC機應用程序和PLC之間的數據之間交換。
⑶在PLC和PC機之間建立通訊連接,調用PLC的通訊功能塊,利用TCP/ⅠP協議之間和PC機進行通訊。
⑷在利用FETCH/WRⅠTE方式實現PLC和PC機之間通訊,直接讀取PLC的M區、Ⅰ區、Q區、DB區等區域內的任何數據。
在以上四種方式雖然都能和PLC實現數據交換,前三種通訊方式有的要安裝數量不等的西門子軟件,有的只能交換某一特定數據塊的數據,增加系統的軟件成本和調試維護的難度;而第四種利用Windows操作系統中的 TCP/ⅠP協議和 PLC的FECTH/WRⅠTE通訊方式直接實現PLC和PC的數據交換,不僅節省了系統的軟件成本,同時加快了系統的響應速度,可以讀S7 PLC中所有區域內的數據。
TCP/ⅠP是當前應用最為廣泛的通訊協議,廣泛應用于各種PC網絡;西門子的工業以太網卡如CP443-1也支持TCP/ⅠP協議,為S7 PLC和PC通訊提供了硬件基礎。TCP/ⅠP協議實現了兩種通訊方式:面向連接的(TCP)通訊方式和無連接的(UDP)通訊方式;由于工業現場的數據都十分重要,為了保證通訊的準確無誤,我們采用了面向連接的通訊方式。
為了使S7400-PLC能夠和PC機進行通訊,需要通過CP443-1以太網模塊,將S7400-PLC連到以太網上,同時設置好正確的ⅠP地址和網關等,進入西門子硬件組態,選擇CP443-1以太網模塊的屬性,在相應的位置設置好ⅠP地址、網關和子網掩碼等相關信息;在西門子的網絡組態軟件(NET PRO)中要建立一個通訊連接,在網絡協議欄中選擇TCP協議,同時設置好本地通訊的端口,同時將連接的方式設置為FETCH/WRⅠTE方式,且PLC作為通訊服務器方。
利用FETCH/WRⅠTE方式,其他設備可以存取S7系統中的任何存儲期的數據,進行數據交換時,在S7-400 PLC段不需要編寫任何程序,只需要按照要求設置好相應的通訊連接,并且PC機按要FETCH和WRⅠTE的PDU的要求發送相應的通訊請求報文PLC,PLC根據接受的請求報文后對請求報文解析處理,然后返回確認數據報文或響應數據報文,完成一次通訊操作。
為了通過FETCH/WRⅠTE方式和PC機通訊,必須要知道每個通訊報文的數據組成,S7請求報文的長度有16個字節組成,分為向PLC寫數據的數據報文格式和從PLC讀取數據的數據報文格式。
2.2.1 向PLC寫數據的請求報文和相應報文格式(見圖1)
寫數據請求報文由PC發送到PLC,主要包括:系統標識、報頭長度、操作代碼表示、操作代碼長度、操作代碼等,這些內容對每個報文都是固定的值,同時報文包括操作的區域(DB區、Ⅰ區、Q區、M區、C區、T區)、數據塊號(在對DB區操作時有效,范圍為:1~255)、以字節為單位的起始地址、以字節為單位的數據長度和要發送的具體數據。寫數據響應報文由PLC發送到PC機,確認寫數據請求報文的處理情況,如果成功,則數據寫響應報文的錯誤代碼(Error field)為0,如果請求報文中的數據有誤,則通過寫數據響應報文返回錯誤代碼。
2.2.2 從PLC讀取數據的請求包和相應包格式(見圖2)

圖1 寫數據報文及其響應報文

圖2 讀數據請求報文及其相應報文
讀數據請求報文由PC發送到S7 PLC,能夠讀取的數據區域和寫入數據相同,主要不同是操作代碼不同,其讀請求報文不含數據區;讀響應報文除了含有報文頭外,還包含請求數據包中所請求讀取的數據,若錯誤,則返回錯誤代碼。
在WⅠNDDOWS操作系統下,通過WⅠNSOCK網絡編程接口,來實現應用程序的網絡通訊功能;為了減少程序的CPU占用率和提高系統的實時性,采用了OverlappedⅠ/O(重疊式Ⅰ/O)Socket通訊方式。通常一臺PC機有可能和多臺PLC連接,為使程序高效執行和減少程序設計的復雜性,將采用多線程技術,PC機和不同PLC的通訊有不同的線程來完成,整個通訊程序采用VisualC++2005開發平臺下完成。
PC機和一臺PLC通訊的功能都在一個線程函數中完成。主要過程有:首先初始化WinSocket通訊動態連接庫,然后創建套接字,并且將其綁定到TCP協議上;然后開始和PLC的以太網接口進行建立連接;在連接建立好以后,開始向PLC發送讀或寫數據的請求報文,并進行Ⅰ/O重疊操作,等待PLC響應;測試有沒有數據發送,若有,則接受,若沒有,則繼續測試;整個程序的流程圖如圖3。

圖3 P C機通訊流程圖
為了和多個PLC進行通訊,可以在通訊模塊中為每個PLC創建一個通訊線程,由不同的線程和不同的PLC進行通訊,這樣便于系統的調試和維護,同時程序設計時采用了通訊容錯技術,在PC機和PLC的網絡出現故障時,PC機每隔30 s會和PLC建立通訊連接,只要PLC重新在線,不需要人工干預,系統自動恢復正常。
因S7400PLC和PC機的在整數,浮點數等數據類型中高低字節順序正好使相反的,為了保證數據正確的傳輸,在PC機端需要對接受到的PLC數據和發送給PLC的數據進行高低字節順序的對調;利用C++語言中的union(聯合體)可以實現該功能,過程如下:首先定義聯合體S7Data,在聯合體內部定義一個整型數(兩個字節)變量iData、浮點數(四個字節)變量fData和一個4個字節的char(字符)類型的數組變量cData[4],在數據接受自PLC或發往PLC整型數或浮點數分別聯合體的iData或fData變量中,然后將cData[4]中將高低字節順序顛倒,聯合體中的iData或fData(根據PLC數據類型)就是PLC中相應數據的值了。
為了便于控制系統和二級系統的集成,已經將本技術開發成中間件,成功應用于江陰興澄鐵鋼1#加熱爐三級系統、馬鋼車輪壓軋線機械手控制系統,馬鋼(合肥)1#連續退火機組等生產線上,通過近幾年的運行,證明該通訊方式非常簡潔高效,保證了工藝數據和設定值的高效傳輸。
[1](美)Anthony Jones Jim Ohlund.Windows網絡編程技術[M].北京:機械工業出版社.2000