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