侯建華
(西安西電電氣研究院有限責任公司,陜西 西安 710075)
西門子SIMATIC控制器在工業(yè)自動化領(lǐng)域應用廣泛。S7協(xié)議為西門子控制器與控制器、控制器與人機接口(human machine interface,HMI)等之間提供了穩(wěn)定可靠的工業(yè)通信,可以實現(xiàn)數(shù)據(jù)采集、組態(tài)、診斷、監(jiān)控等多種功能[1]。但S7協(xié)議是西門子的私有協(xié)議且不公開,這給第三方應用與西門子控制器之間的數(shù)據(jù)集成帶來了障礙。本文針對基于工業(yè)以太網(wǎng)和RFC1006標準的S7通信協(xié)議進行了研究,給出和分析了S7協(xié)議的OSI參考模型、S7通信建立的過程和報文格式,并在ARM+Linux嵌入式平臺上設(shè)計開發(fā)了S7協(xié)議驅(qū)動程序,實現(xiàn)了對西門子S7-1500 PLC的數(shù)據(jù)讀寫操作。
西門子SIMATIC所有控制器,例如S7系列PLC、其他嵌入式或基于計算機的控制器均支持S7協(xié)議。S7協(xié)議是一個協(xié)議族,是應用層的協(xié)議,支持基于工業(yè)以太網(wǎng)的Profinet、Profibus和MPI等通信。而基于工業(yè)以太網(wǎng)的RFC1006/ISO on TCP(ISO Transport Service on top of the TCP Version: 3)是S7協(xié)議中應用廣泛的一種。其底層遵循的是通用的以太網(wǎng)標準,PLC CPU模塊和以太網(wǎng)模塊均支持此通信[1]。
基于以太網(wǎng)ISO on TCP方式的S7通信,是建立在RFC1006標準之上的。西門子PLC與對象伙伴進行通信,使用RFC1006標準中定義的102端口[2-3]。其OSI參考模型如圖1所示。
第1~4層是通用的以太網(wǎng)通信標準。第4層RFC1006為西門子S7以太網(wǎng)通信提供服務。第5層TPKT為應用層數(shù)據(jù)傳輸協(xié)議,介于TCP和第6層COTP協(xié)議之間。這是一個傳輸服務協(xié)議,主要用來在COTP和TCP之間建立橋梁,封裝傳輸協(xié)議數(shù)據(jù)單元(transport protocol data units,TPDUs)。TPKT的作用是包含S7協(xié)議(5~7層)的數(shù)據(jù)長度。第6層面向連接的傳輸協(xié)議(connection-oriented transport protocol,COTP)是位于TCP之上的協(xié)議。COTP 以“包”為基本單位來傳輸數(shù)據(jù),其作用是定義了數(shù)據(jù)傳輸?shù)幕締挝籔DU和幀類型。在S7通信中,PDU類型主要為數(shù)據(jù)幀DT data。第7層S7通信,這一層和用戶數(shù)據(jù)相關(guān),主要定義了要訪問的數(shù)據(jù)的地址、格式、長度等信息[2-5]。
圖1 西門子S7協(xié)議OSI參考模型
應用程序與西門子PLC進行S7通信,其通信過程如圖2所示。
圖2 S7通信過程示意圖
①建立TCP連接。
②建立ISO on TCP連接。
③建立S7連接。
④按S7協(xié)議讀寫數(shù)據(jù)。
S7協(xié)議報文幀結(jié)構(gòu)如圖3所示。其報文分三部分:TPKT幀頭、COTP包和S7 PDU[2-6]。
圖3 S7協(xié)議報文幀結(jié)構(gòu)圖
TPKT幀頭包括:①版本號(Version),ISO on TCP(RFC1006)版本號,即最新版0x03;②包長度(Packet Length),包括TPKT幀頭、COTP和S7 PDU整個包的長度。
COTP包根據(jù)應用的不同共分為5種類型:連接請求(connect request,CR)、連接確認(connect confirm,CC)、斷開請求(disconnect request,DR)、數(shù)據(jù)幀(data,DT)、擴展數(shù)據(jù)幀(expedited data,ED)。一般常用的是CR和DT包。當請求建立ISOon TCP連接時為CR包且后面沒有S7 PDU時,在ISO on TCP連接建立后,再進行S7連接及S7數(shù)據(jù)通信時都為DT包。因此,正常通信時CR包只有一次,僅用于建立ISO on TCP連接。
S7 PDU包括以下內(nèi)容。
①報頭:S7協(xié)議的報文頭,指示了S7協(xié)議的標識、參數(shù)區(qū)和數(shù)據(jù)區(qū)的長度,在返回報文中還將包括狀態(tài)碼,指示錯誤等級和錯誤碼。
②參數(shù)區(qū):表示要讀取或?qū)懭霐?shù)據(jù)區(qū)域的參數(shù)格式,指示了數(shù)據(jù)區(qū)的傳輸單位、長度、區(qū)域、地址、數(shù)據(jù)項個數(shù)等信息。
③數(shù)據(jù)區(qū):表示從PLC返回或者要寫入PLC的數(shù)據(jù)。當向PLC發(fā)送的是請求建立S7連接或者讀取數(shù)據(jù)的報文時,報文沒有數(shù)據(jù)區(qū)。
嵌入式平臺采用ARM+Linux,選用基于Cortex-A8架構(gòu)的德州儀器(TI)公司AM3352芯片作為主處理器,主頻為800 MHz,運算能力高達1 600 DMIPS,配置512 MB DDR3和512 MB NAND FLASH,集成2路CAN、2路千兆網(wǎng)口、8路內(nèi)部ADC、6路UART、2路SPI、3路PWM、3路eCAP等接口。硬件平臺還包括電源模塊、以太網(wǎng)模塊、4路RS232/485模塊、掉電參數(shù)保存模塊、時鐘模塊、SD卡存儲模塊、LED狀態(tài)指示燈等[7]。
基于以上平臺,開發(fā)S7協(xié)議驅(qū)動程序。嵌入式平臺軟件架構(gòu)如圖4所示。系統(tǒng)為模塊化設(shè)計,每個協(xié)議驅(qū)動和管理模塊都是一個獨立的應用程序,所有的數(shù)據(jù)交互均以總線的形式在獨立開辟的內(nèi)存緩沖區(qū)上流轉(zhuǎn)。各驅(qū)動程序可獨立開發(fā),獨立下載,互不耦合。日志模塊負責異常和輸出的日志打印。初始化模塊負責讀取驅(qū)動需要的參數(shù)文件并初始化驅(qū)動。數(shù)據(jù)管理模塊負責開辟內(nèi)存緩沖區(qū),并與緩沖區(qū)進行交互,將驅(qū)動采集或上層應用寫入的數(shù)據(jù)進行保存,完成通道、設(shè)備、點的數(shù)據(jù)采集和存儲。驅(qū)動管理模塊負責各類驅(qū)動模塊的管理,自動加載系統(tǒng)中存在的驅(qū)動并進行監(jiān)護[8-10]。
圖4 嵌入式平臺軟件架構(gòu)圖
S7驅(qū)動程序模塊由C++語言開發(fā),主要實現(xiàn)對S7協(xié)議第5、6、7層編程,包括驅(qū)動對象類、通道類、設(shè)備類、變量類、TCP通信類、組織查詢報文類、報文解析類、xml解析器、打印日志類等。在Linux平臺下,將文件交叉編譯成可執(zhí)行的exe文件,在嵌入式平臺上并行運行,完成不同的功能。平臺上電啟動后驅(qū)動程序首先加載由配置管理工具配置的xml文件,完成初始化工作,建立S7通信連接,再循環(huán)進行S7數(shù)據(jù)的讀寫過程。對讀取的數(shù)據(jù)會實時寫入內(nèi)存緩沖區(qū),不斷刷新,以供其他模塊調(diào)用[8-10]。
①初始化。
驅(qū)動啟動后首先在內(nèi)存中構(gòu)建驅(qū)動對象,加載和解析xml配置文件,獲取PLC地址、端口號、機架槽號和變量點表信息,連接內(nèi)存緩沖區(qū),打開通信端口,完成一系列初始化工作。
②建立通信。
在完成初始化后,驅(qū)動自動組織兩條通信請求報文用于建立ISO_on_TCP連接和S7連接。發(fā)送COTP報文給PLC,在COTP報文中包含“連接請求”和目標PLC CPU的機架號和槽號,PLC反饋COTP報文,進行“連接確認”,建立ISO_on_TCP連接。然后再發(fā)送S7通信報文給PLC,請求建立S7 通信,PLC反饋S7報文進行“連接確認”。下一步將進行數(shù)據(jù)的讀寫操作[2-5]。 S7驅(qū)動初始化及通信流程如圖5所示。
圖5 S7驅(qū)動初始化及通信流程圖
③讀寫數(shù)據(jù)。
S7驅(qū)動讀寫數(shù)據(jù)流程如圖6所示。S7驅(qū)動對點進行循環(huán)掃描,根據(jù)協(xié)議幀格式組織合成S7通信報文并發(fā)送,并對PLC返回的報文進行判斷和解析,同時完成日志打印和與內(nèi)存緩沖區(qū)的數(shù)據(jù)交互,以實現(xiàn)對PLC數(shù)據(jù)的讀寫操作。
④與內(nèi)存緩沖區(qū)交互。
驅(qū)動初始化過程中,會根據(jù)通道、設(shè)備和點信息在內(nèi)存中創(chuàng)建表,建立內(nèi)存緩沖區(qū)用于統(tǒng)一存放數(shù)據(jù),并不斷刷新緩沖區(qū),作為驅(qū)動與其他模塊進行數(shù)據(jù)交互的接口。在掃描前,首先檢查是否有執(zhí)行寫操作的點。如果有,優(yōu)先進行寫操作。寫操作時,首先對讀取數(shù)據(jù)與待寫入的數(shù)據(jù)進行比較,如果數(shù)據(jù)相同,則不用執(zhí)行寫操作,以提高效率。寫操作的點執(zhí)行完后,再執(zhí)行只讀點的操作。S7驅(qū)動讀寫數(shù)據(jù)流程如圖7所示。
圖6 S7驅(qū)動讀寫數(shù)據(jù)流程圖
圖7 S7驅(qū)動與內(nèi)存緩沖區(qū)交互圖
測試的PLC為S7-1515,在嵌入式平臺添加S7通道。選擇PLC,設(shè)置好IP地址,端口號為102,TSAP為0302,增加待測的數(shù)據(jù)點,下載配置到嵌入式系統(tǒng),重啟后與PLC就自動建立起了S7連接。通過開發(fā)的上位軟件就可以看到實時采集的數(shù)據(jù),可實現(xiàn)對PLC輸入、輸出、位存儲區(qū)、數(shù)據(jù)塊、定時器、計數(shù)器區(qū)域數(shù)據(jù)的讀取,并可向輸出、位存儲區(qū)、數(shù)據(jù)塊成功寫入數(shù)據(jù)。測試結(jié)果驗證了S7協(xié)議和驅(qū)動程序的正確性,實現(xiàn)了嵌入式平臺系統(tǒng)與PLC的S7通信[11]。
本文主要對基于以太網(wǎng)和RFC 1006標準的S7協(xié)議進行了研究,給出了S7協(xié)議的參考模型、S7通信建立的過程和報文格式,并在ARM+Linux嵌入式平臺上設(shè)計開發(fā)了S7協(xié)議驅(qū)動程序,實現(xiàn)了對西門子S7-1500 PLC中各存儲區(qū)數(shù)據(jù)的讀寫操作,從而驗證了S7協(xié)議及S7驅(qū)動程序的正確性。西門子S7系列PLC在工業(yè)自動化領(lǐng)域應用廣泛。通過本文,可以對西門子S7協(xié)議有一個較深刻的認識,為用戶開發(fā)應用程序,以及實現(xiàn)與西門子PLC的通信提供了參考。