2024西門子通信協(xié)議S7COMM_第1頁
2024西門子通信協(xié)議S7COMM_第2頁
2024西門子通信協(xié)議S7COMM_第3頁
2024西門子通信協(xié)議S7COMM_第4頁
2024西門子通信協(xié)議S7COMM_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PAGEPAGE10/19西門子通信協(xié)議S7COMM工控安全|西門子通信協(xié)議S7COMM(Part1)隨著網(wǎng)絡(luò)強國工業(yè)4.0,工控安全市場今年明顯有相當(dāng)大的改善,無論從政策還是客戶需求,都在逐步擴(kuò)大中但是,搞工控安全研究的人員卻寥寥無幾,一方面,沒有可以研究和學(xué)習(xí)的便利的環(huán)境;另一方面工控安全是個跨學(xué)課的技術(shù),需要了解多方面的知識,有比較高的技術(shù)上的門檻特別是工控系統(tǒng)中通信協(xié)議,在工控系統(tǒng)中通信協(xié)議存在眾多標(biāo)準(zhǔn),也存在眾多私有協(xié)議,如果你有過使用組態(tài)軟件的經(jīng)歷,你便會發(fā)現(xiàn),在第一步連接設(shè)備時除連接設(shè)備的方式有以太網(wǎng)/串行等方式外,各家基本上都存在自己的私有通信議比如:西門子的是S7Comm協(xié)議所以,本文主要介紹西門子的S7Comm協(xié)議(適用于S7-300S7-400S7-1200)本文中S7Comm協(xié)議結(jié)構(gòu)都是逆向而來,如有錯誤之處,請拍磚一西門子PLC系統(tǒng)構(gòu)成在介紹西門子S7Comm協(xié)議,首先得明白西門子PLC的大概構(gòu)造雖然我們不必像專寫PLC程序員那樣下圖1就是一個組態(tài)完畢的西門子S7300的模型:圖1西門子S7-300根據(jù)標(biāo)號,各模塊分別是:電源模塊(PS),供電專用CPU模塊(CPU),負(fù)責(zé)處理信息通信模塊(IM)數(shù)字量輸入模塊(DI)數(shù)字量輸出模塊(DO)模擬量輸入模塊(AI)模擬量輸出模塊(AO)想具體了解的,請閱讀\h西門子S7-300教程第2章二S7協(xié)議結(jié)構(gòu)S7Comm(S7Communication)是西門子專有的協(xié)議,是西門子S7通訊協(xié)議簇里的一種種S7協(xié)議的TCP/IP實現(xiàn)依賴于面向塊的ISO傳輸服務(wù)S7協(xié)議被封裝在TPKT和ISO-COTP協(xié)議中,這使得PDU(協(xié)議數(shù)據(jù)單元)能夠通過TCP傳送它用于PLC編程,在PLC之間交換數(shù)據(jù),從SCADA(監(jiān)控和數(shù)據(jù)采集)系統(tǒng)訪問PLC數(shù)據(jù)以及診斷目的S7Comm以太網(wǎng)協(xié)議基于OSI模型:7ApplicationLayerS7communication6PresentationLayerS7communication5SessionLayer S7communication(TPKT)4TransportLayerISO-on-TCP(RFC1006)3NetworkLayer IP2DataLinkLayer 1PhysicalLayer 其中,第1-4層會由計算機(jī)自己完成(底層驅(qū)動程序),關(guān)于這些神馬的定義,上網(wǎng)查一下;第5層TPKT,應(yīng)用程數(shù)據(jù)傳輸協(xié)議,介于TCP和COTP協(xié)議之間這是一個議,主要用來在COTP和TCP之間建立橋梁;第6層COTP,按照維基百科的解釋,COTPOSI7層協(xié)議定義的位于TCP之上的協(xié)議COTP以“Packet”為基本單位來傳輸數(shù)據(jù),這樣接收方會得到與發(fā)送方具有相同邊界的數(shù)據(jù);第7層,S7communication,這一層和用戶數(shù)據(jù)相關(guān),對PLC成可能會對TPKT和COPT迷惑,其實在具體的報文中,TPKT的作用是包含用戶協(xié)議(5~7層)的數(shù)據(jù)長度(字節(jié)數(shù));COTP的作用是定義了數(shù)據(jù)傳輸?shù)幕締挝唬ㄔ赟7Comm中PDUTYPE:DTdata)圖2S7Comm協(xié)議OSI模型三TPKT協(xié)議TPKT協(xié)議是應(yīng)用程數(shù)據(jù)傳輸協(xié)議,介于TCP和COTP協(xié)議之間這是一個議,主要用來在COTP和TCP之間建立橋梁其英文介紹如下:TPKTisan“encapsulation”protocol.ItcarriestheOSIpacketinitsownpacket’sdatapayloadandthenpassestheresultingstructuretoTCP,fromthenon,thepacketisprocessedasaTCP/IPpacket.TheOSIprogramspassingdatatoTPKTareunawarethattheirdatawillbecarriedoverTCP/IPbecauseTPKTemulatestheOSIprotocolTransportServiceAccessPoint(TSAP).TPKT結(jié)構(gòu)如圖3:圖3TPKT協(xié)議結(jié)構(gòu)其中,TPKT的結(jié)構(gòu)為:(Unsignedinteger1byteVersion,版本信息(Unsignedinteger1byteReserved,保留(值為0×00)2-3(Unsignedinteger,2bytes):Length,TPKTCOTPS7三層協(xié)議的總長度,也就是TCP的payload的長度,如圖4所示:圖4一個TPKT的例子從圖4中可知,其version=3,length=25(0×0019)四COTP協(xié)議COTP(\hISO8073/X.224COTPConnection-OrientedTransportProtocol)是OSI7層協(xié)議定義的位于TCP之上的協(xié)議COTP以“Packet”為基本單位來傳輸數(shù)據(jù),得到與發(fā)送方具有相同邊界的數(shù)據(jù)COTP協(xié)議分為兩種形態(tài),分別是COTP連接包(COTPConnectionPacket)和COTP功能包(COTPFuctionPacket)COTPConnectionPacketCOTP連接包(COTPConnectionPacket)也就是S7Comm的握手包,其格式如圖5所示示圖5COTP連接包的結(jié)構(gòu)其中,COTP連接包的頭結(jié)構(gòu)為:(Unsignedinteger1byteLength,COTP后續(xù)數(shù)據(jù)的長度(注意:長度不包含length的長度),一般為17bytes(Unsignedinteger,1byte):PDUtyp,類型有:0×1:EDExpeditedData,加急數(shù)據(jù)0×2:EAExpeditedDataAcknowledgement0×4:UD,用戶數(shù)據(jù)0×5:RJReject,拒絕0×6:AKDataAcknowledgement0×7:ERTPDUError,TPDU錯誤0×8:DRDisconnectRequest0xC:DCDisconnectCon?rm,斷開確認(rèn)0xD:CCConnectCon?rm,連接確認(rèn)0xECRConnectRequest,連接請求0xFDTData,數(shù)據(jù)傳輸2~3(Unsignedinteger,2bytes):Destinationreference.4~5(Unsignedinteger,2bytes):Sourcereference.型6(1byte):opt,其中包括ExtendedformatsNoexplicit?owcontrol,值都是Boolean類型7~?(length-7bytes,一般為bytesParameter,參數(shù)一般參數(shù)包含Parametercode(Unsignedinteger1byte)Parameterlength(Unsignedinteger1byte)Parameterdata三部分算了,還是來個例子,更加明了:圖6連接請求包圖6中,PDU類型為連接請求(0x0e),表示該數(shù)據(jù)包是一個連接請求包比,圖7為圖6的連接請求的響應(yīng)包:圖7連接確認(rèn)包COTPFuctionPacket相對而言,COTPFuctionPacket比COTPConnectionPacket簡單多了,其結(jié)構(gòu)如圖8示:圖8COTP功能包的格式其中,COTPP功能包的頭結(jié)構(gòu)為:(Unsignedinteger1byteLength,COTP后續(xù)數(shù)據(jù)的長度(注意:長度不包含length的長度),一般為2bytes(Unsignedinteger,1byte):PDUtype,類型有:0×1:EDExpeditedData,加急數(shù)據(jù)0×2:EAExpeditedDataAcknowledgement0×4:UD,用戶數(shù)據(jù)0×5:RJReject,拒絕0×6:AKDataAcknowledgement0×7:ERTPDUError,TPDU錯誤0×8:DRDisconnectRequest0xC:DCDisconnectCon?rm,斷開確認(rèn)0xD:CCConnectCon?rm,連接確認(rèn)0xECRConnectRequest,連接請求0xFDTData,數(shù)據(jù)傳輸型(1byte):opt,其中包括ExtendedformatsNoexplicit?owcontrol,值都是Boolean類型舉個例子,如圖9所示:圖9數(shù)據(jù)傳輸包上圖中,PDU類型為連接請求(0x0f),表示該數(shù)據(jù)包是一個數(shù)據(jù)傳輸?shù)陌麿K,COTP的兩中結(jié)構(gòu)介紹完了,接下來的S7Comm協(xié)議才是本文的重點五S7Comm協(xié)議上面,介紹了TPKT和COTP協(xié)議,現(xiàn)在開始介紹S7Comm協(xié)議,Areuready?S7Comm數(shù)據(jù)作為COTP數(shù)據(jù)包的有效載荷,第一個字節(jié)總是0×32作為協(xié)議標(biāo)識符S7Comm協(xié)議包含三部分:HeaderParameterData圖10S7Comm協(xié)議結(jié)構(gòu)根據(jù)實現(xiàn)的功能不同,S7comm協(xié)議的結(jié)構(gòu)會有所不同S7CommHeaderS7Comm的頭,定義了該包的類型參數(shù)長度數(shù)據(jù)長度等,其結(jié)構(gòu)如圖11所示:圖11S7CommHeader結(jié)構(gòu)所以,S7CommHeader的格式為:(unsignedinteger,1byte):ProtocolId,協(xié)議ID,通常為0×32;(unsignedinteger,1byte):ROSCTR,PDUtype,PDU的類型,一般有以下值:0×01–JOB(Request:jobwithacknowledgement):作業(yè)請求。由主設(shè)備發(fā)送的請求(例如,讀/寫存儲器,讀/寫塊,啟動/停止設(shè)備,設(shè)置通信);0×02ACK(acknowledgementwithoutadditional?eld單確認(rèn)(未遇到過由S7300/400設(shè)備發(fā)送得);0×03–ACK_DATA(Response:acknowledgementwithadditional?eld):確認(rèn)數(shù)據(jù)響應(yīng),這個一般都是響應(yīng)JOB的請求;0×07–USERDATA:原始協(xié)議的擴(kuò)展,參數(shù)字段包含請求/響應(yīng)ID(用于編程/調(diào)試,讀取SZL,安全功能,時間設(shè)置,循環(huán)讀取?)。2~3(unsignedinteger2bytes):RedundancyIdenti?cation(Reserved),冗余數(shù)據(jù),為0×0000;4~5(unsignedinteger2bytes):ProtocolDataUnitReference,it’sincreasedbyrequestevent協(xié)議數(shù)據(jù)單元參考,通過請求事件增加;6~7(unsignedinteger2bytes):Parameterlength,thetotallength(bytes)ofpart參數(shù)的總長度;8~9(unsignedinteger,2bytes):Datalength,數(shù)據(jù)長度如果讀取PLC內(nèi)部數(shù)據(jù),此處為0×0000;對于其他功能,則為Data部分的數(shù)據(jù)長度;來看一個例子解釋一下,如圖12所示:圖12一個S7Comm頭結(jié)構(gòu)的例子其中最重要的字段就是ROSCTR,它決定了后續(xù)參數(shù)的結(jié)構(gòu),這個介紹在響應(yīng)數(shù)據(jù)包中,還有可能存在錯誤信息就拿圖12為例,如果出錯了,其響應(yīng)包如圖13所示:圖13帶有錯誤信息的響應(yīng)包其錯誤信息結(jié)構(gòu)為:(unsignedinteger,1bytes):Errorclass,錯誤類型:其詳細(xì)的Errorclass,參考\h6.1.1頭結(jié)構(gòu)的錯誤類型;(unsignedinteger,1bytes):Errorcode,錯誤代碼;由此,可見圖13的錯誤類型是Noerror,至于錯誤代碼,啥含義我也母知道為了更好理解,接下來就不按照ParameterData的順序介紹,而是按照PDU紹,尿急的趕緊上廁所哈!作業(yè)請求(Job)和確認(rèn)數(shù)據(jù)響應(yīng)(Ack_Data)上面介紹了S7CommPDU的結(jié)構(gòu)和通用協(xié)議頭其頭部結(jié)構(gòu)\hS7Comm中Job和Ack_Data中的Parameter項的第一個字段是function(功能碼),\h為Unsignedinteger,大小為1byte,其詳細(xì)的功能碼,請參考6.2.1Job和Ack_Data\h所以接下來,將進(jìn)一步介紹各功能碼對應(yīng)的結(jié)構(gòu)和作用建立通信(Setupcommunication[0xF0])建立通信在每個會話開始時被發(fā)送,然后可以交換任何其他消息它用于協(xié)商ACK隊列的大小和最大PDU長度,雙方聲明它們的支持值A(chǔ)CK隊列的長度決定了可以同時啟動而需要確認(rèn)的并行作業(yè)的數(shù)量PDU和隊列長度字段都是大端先說Job吧!當(dāng)PDU類型為Job時,建立通信功能中Parameter的結(jié)構(gòu),如下圖:圖14S7comm的結(jié)構(gòu)(建立通信的作業(yè)請求)具體的Parameter結(jié)構(gòu),如下:(Unsignedinteger,1byte):Parameterpart:Reservedbyteincommunicationpdu,保留字節(jié);(Unsignedinteger,2bytes):MaxAmQ(paralleljobswithack)calling;(Unsignedinteger,2bytes):MaxAmQ(paralleljobswithack)called;(Unsignedinteger,2bytes):Parameterpart:NegotiatePDUlength協(xié)商PDU長度舉個例子:圖15建立通信的請求那么其確認(rèn)響應(yīng)的結(jié)構(gòu)如何呢?跟請求時一樣的,如圖14所示那么圖16為圖15的確認(rèn)響應(yīng):圖16建立通信的確認(rèn)響應(yīng)如圖1516所示,其協(xié)商結(jié)果為:ACK隊列的大小為1;最大PDU長度為240讀取值(Read[0x04])數(shù)據(jù)讀寫操作通過指定變量的存儲區(qū)域(參考\h6.3區(qū)域(Areanames)),地址(偏移量)及其大小或類型(參考\h6.4.1Transportsizesinitemdata)來執(zhí)行先說Job吧!當(dāng)PDU類型為Job時,那么其S7Comm結(jié)構(gòu),如圖17所示:圖17S7comm的結(jié)構(gòu)(讀取值的作業(yè)請求)所以,接下來的Parameter字段是itemcount(項目個數(shù)),其類型為Unsigned大小為1byte那么一個item的結(jié)構(gòu)是咋樣的呢?如下(圖17中item1):(Unsignedinteger1bytespeci?cation,確定項目結(jié)構(gòu)的主要類型,通常為0×12,代表變量規(guī)范;(Unsignedinteger,1byte):Lengthoffollowingaddressspeci?cation,本Item其余部分的長度;(Unsignedinteger1byteSyntaxIdsofvariablespeci?cation,確定尋址模式和其余項目結(jié)構(gòu)的格式;其詳細(xì)的SyntaxId,參考\h6.5SyntaxIdsofvariablespeci?cation;3(Unsignedinteger,1byte):Transportsizesinitemdata,確定變量的類型和長度:其詳細(xì)的Transportsize,參考\h6.4.1transportsizesinitemdata;4~5(Unsignedinteger,2byte):Requestdatalength,請求的數(shù)據(jù)長度;6~7(Unsignedinteger2byte):DBnumber,DB模塊的編號,如果訪問的不是DB區(qū)域此處為0×0000;8(Unsignedinteger,1byte)::Area,區(qū)域類型:其詳細(xì)的區(qū)域類型,參考\h6.3區(qū)域(Areanames);9~11(Unsignedinteger,3byte):Address,地址頭暈了吧?哈哈哈~~先舉個例子:圖18讀值操作的作業(yè)請求圖17中item1是讀取DB1的0×000010(DB1.DBX2.0BIT1)值,并且類型為BIT的請求PDU類型為Job時,S7Comm結(jié)構(gòu)介紹完了,那PDU類型為Ack_Data時,其S7Comm結(jié)構(gòu)如何呢?圖19S7comm的結(jié)構(gòu)(讀取值的確認(rèn)數(shù)據(jù)響應(yīng))是的,其Parameter只有functionitemcount兩個字段繼續(xù),那么接下來的是Data啦!其結(jié)構(gòu)如下:(Unsignedinteger,1byte):Returncode,返回代碼:詳細(xì)的Returncode,請參考\h6.6.1Returnvaluesofanitemresponse;(Unsignedinteger1byteTransportsize,數(shù)據(jù)的傳輸尺寸:其詳細(xì)的Transportsize,參考\h6.4.2Transportsizesindata;2~3(Unsignedinteger,2bytes):Length,數(shù)據(jù)的長度;4~4+length(?):Data,數(shù)據(jù);(Unsignedinteger1byteFillbyte,填充字節(jié)繼續(xù)看圖18響應(yīng)的數(shù)據(jù)包,如圖20所示:圖20讀值操作的確認(rèn)數(shù)據(jù)響應(yīng)圖20中,item1是讀取DB1的0×000010(DB1.DBX2.0BIT1)值,并且類型為BIT應(yīng),其響應(yīng)的數(shù)據(jù)為01寫入值(Write[0x05])Write中Parameter的結(jié)構(gòu)跟\h5.2.2讀取值(ReadVar[0x04])一樣,但是Write寫入值,所以Write比Read多Data項結(jié)構(gòu)如下:圖21S7comm的結(jié)構(gòu)(寫入值的作業(yè)請求)由此,Data的結(jié)構(gòu)為:(Unsignedinteger1byteReturncode,返回代碼,這里是未定義,所以為Reserved(0×00);(unsignedinteger1byte):Transportsize,確定變量的類型和長度:詳細(xì)的Transportsize,參考\h6.4.2Transportsizesindata;2-3(unsignedinteger,2bytes):Length,寫入值的數(shù)據(jù)長度;(1byte):Data,寫入的值;(unsignedinteger1byte):Fillbyte,填充字節(jié),如果數(shù)據(jù)的長度不足Length的話,充;舉個例子:圖22向地址為0×000008的Flags(M)寫入0×00的作業(yè)請求圖22中,是一個向地址為0×000008的Flags(M)寫入0×00的作業(yè)請求那PDU類型為Ack_Data時,其S7Comm的結(jié)構(gòu)如何呢?圖23S7comm的結(jié)構(gòu)(寫入值的確認(rèn)數(shù)據(jù)響應(yīng))對的,Parameter也只有functionitemcount兩個字段而Data中也只有一個Returncode字段,其結(jié)構(gòu)如下:0(Unsignedinteger,1byte):Returncode,返回代碼:詳細(xì)的Returncode,請參考\h6.6.1Returnvaluesofanitemresponse;繼續(xù)看圖22的響應(yīng)數(shù)據(jù)包,如圖24所示:圖24向地址為0×000008的Flags(M)寫入0×00的確認(rèn)響應(yīng)圖24中的item1,說明向地址為0×000008的Flags(M)寫入0×00成功未完待續(xù)PAGEPAGE1/26|西門子通信協(xié)議S7COMM(Part2)-工控安全|西門子通信協(xié)議S7COMM(Part2)前言隨著網(wǎng)絡(luò)強國工業(yè)4.0,工控安全市場今年明顯有相當(dāng)大的改善,無論從政策還是客戶需求,都在逐步擴(kuò)大中但是,搞工控安全研究的人員卻寥寥無幾,一方面,沒有可以研究和學(xué)習(xí)的便利的環(huán)境;另一方面工控安全是個跨學(xué)課的技術(shù),需要了解多方面的知識,有比較高的技術(shù)上的門檻特別是工控系統(tǒng)中通信協(xié)議,在工控系統(tǒng)中通信協(xié)議存在眾多標(biāo)準(zhǔn),也存在眾多私有協(xié)議,如果你有過使用組態(tài)軟件的經(jīng)歷,你便會發(fā)現(xiàn),在第一步連接設(shè)備時除連接設(shè)備的方式有以太網(wǎng)/串行等方式外,各家基本上都存在自己的私有通信議比如:西門子的是S7Comm協(xié)議上一篇文章\h|西門子通信協(xié)議S7COMM(Part1)》帶來了西門子PLC系統(tǒng)構(gòu)S7協(xié)議結(jié)構(gòu)、TPKT協(xié)議、COTP協(xié)議、S7Comm協(xié)議五大塊內(nèi)容,本文緊接著上文中的S7Comm協(xié)議章節(jié)繼續(xù)開展,沒看過上一篇的小伙伴需要補補課哦,不然會不知所云~下載下載是Step7發(fā)送塊數(shù)據(jù)給PLC(圖25)。在西門子設(shè)備上,程序代碼和(大部分)程序數(shù)據(jù)存儲在塊中,這些塊有自己的頭和編碼格式。在西門子設(shè)備中有8種不同類型的功能塊,具體的請參考\h6.7。這些塊在上/下載請求中用特殊的ASCII文件名尋址。這個文件名的結(jié)構(gòu)如下:(1byte):Fileidentifier(ASCII),文件標(biāo)識符。其有_(CompleteModule)、(Moduleheaderforup-loading)兩種文件標(biāo)識符;(2bytes):Blocktype,塊類型。具體類型,請參考\h6.7;(5bytes):Blocknumber,塊編號;(1byte):Destinationfilesystem(ASCII),目標(biāo)的文件系統(tǒng)。其有三種文件系統(tǒng)P(Passive(copied,butnotchained)module):被動文件系統(tǒng)(Activeembeddedmodule):主動文件系統(tǒng)(Activeaswellaspassivemodule):既主既被文件系統(tǒng)工控安全工控安全|西門子通信協(xié)議S7COMM(Part2)PAGEPAGE10/26例如:文件名為_0A00001P(文件標(biāo)識是_,塊類型為DB,塊的編號為00001,目標(biāo)塊的文件系統(tǒng)是P。),用于將DB1復(fù)制到被動文件系統(tǒng)或從被動文件系統(tǒng)復(fù)制。下載有3中不同的功能類型:請求下載(Requestdownload[0x1A])下載塊(Downloadblock[0x1B])下載結(jié)束(Downloadended[0x1C])在下載過程中,先是Step7向PLC發(fā)送一個請求下載的Job,PLC收到后則回復(fù)一個Ack_Data。在發(fā)送完所有字節(jié)后,Step7向PLC發(fā)送一個下載結(jié)束的Job來關(guān)閉下載會話。時序圖如下:圖25下載時序圖(圖片來源:互聯(lián)網(wǎng))好了,開始介紹下載的結(jié)構(gòu)啦!如圖26所示,即為一個完整的下載過程:圖26一個完整的下載過程例子請求下載(Requestdownload[0x1A])先來介紹,當(dāng)PDU類型為Job時,Requestdownload[0x1A]沒有Data,其Parameter構(gòu),如下:(1byte):FunctionStatus,功能碼狀態(tài);(2bytes):forallunknownbytesinblockcontrol;3(4bytes):無意義,一般為0x00000000;(1byte):filenamelength,文件名長度;(?bytes):filename,defaultis9byte,文件名,長度一般為9個字節(jié);(1byte):Fileidentifier(ASCII),文件標(biāo)識符。其有_(CompleteModule)、(Moduleheaderforup-loading)兩種文件標(biāo)識符;(2bytes):Blocktype,塊類型。具體類型,請參考\h6.7;(5bytes):Blocknumber,塊編號;(1byte):Destinationfilesystem(ASCII),目標(biāo)的文件系統(tǒng)。其有P(Passive(copied,butnotchained)module)、A(Activeembeddedmodule)、B(Activeasaspassivemodule)三種文件系統(tǒng);(1byteLengthpart2inbytes,參數(shù)的第二部分長度,也就是接下來的字段長度;(1byte):Unknownchar(ASCII);(6bytes):Lengthloadmemoryinbytes(ASCII);(6bytes):LengthofMC7codeinbytes(ASCII)。其實就是告訴PLC要下載塊。舉個例子:圖27請求下載_0800001P的作業(yè)請求如圖27所示,文件標(biāo)識是_(CompleteModule),塊類型為OB,塊的編號為00001,目標(biāo)塊的文件系統(tǒng)是P(Passive(copied,butnotchained)module),所以文件名為_0800001P。那PDU類型為Ack_Data時,Requestdownload[0x1A]的Parameter中只有一個function。下圖即為圖27的響應(yīng):圖28請求下載_0800001P的確認(rèn)數(shù)據(jù)響應(yīng)OK,請求下載完成后,接下來就可以Downloadblock了!下載塊(Downloadblock[0x1B])上面說了,下載是Step7發(fā)送塊數(shù)據(jù)給PLC。當(dāng)PDU類型為Job時,Downloadblock[0x1B]也沒有Data,其Parameter的結(jié)構(gòu),如下:(1byte):FunctionStatus,功能碼狀態(tài);(2bytes):forallunknownbytesinblockcontrol;3(4bytes):無意義,一般為0x00000000;(1byte):filenamelength,文件名長度;(?bytes):filename,defaultis9byte,文件名,長度一般為9個字節(jié);(1byte):Fileidentifier(ASCII),文件標(biāo)識符。其有_(CompleteModule)、$(Moduleheaderforup-loading)兩種文件標(biāo)識符;(2bytes):Blocktype,塊類型。具體類型,請參考\h6.7;(5bytes):Blocknumber,塊編號;(1byte):Destinationfilesystem(ASCII),目標(biāo)的文件系統(tǒng)。其有P(Passive(copied,butnotchained)module)、A(Activeembeddedmodule)、B(Activeaswellaspassivemodule)三種文件系統(tǒng);是的,Downloadblock[0x1B]的Parameter比Requestdownload[0x1A]的Parameter的第一部分相同!為了更好比較,舉個例子:圖29下載塊_0800001P的作業(yè)請求上圖是下載_0800001P的作業(yè)請求。那PDU類型為Ack_Data時,Downloadblock[0x1B]有Parameter和Data,其Parameter的結(jié)構(gòu),如下:1(1byte):FunctionStatus,功能碼狀態(tài);而其Data的結(jié)構(gòu),如下:(Unsignedinteger,2bytes):Length,數(shù)據(jù)長度;(Unsignedinteger,2bytes):Unknownbyte(s)inblockcontrol,未知字節(jié);(Label,data_length-4bytes):Data,數(shù)據(jù);下圖即為圖29的響應(yīng):圖30下載塊_0800001P的響應(yīng)下載結(jié)束(Downloadended[0x1C])當(dāng)PDU類型為Job時,Downloadended[0x1C]也沒有Data,其Parameter的結(jié)構(gòu),如下:(1byte):FunctionStatus,功能碼狀態(tài);(2bytes):forallunknownbytesin3(4bytes):無意義,一般為0x00000000;(1byte):filenamelength,文件名長度;(?bytes):filename,defaultis9byte,文件名,長度一般為9個字節(jié);(1byte):Fileidentifier(ASCII),文件標(biāo)識符。其有_(CompleteModule)、(Moduleheaderforup-loading)兩種文件標(biāo)識符;(2bytes):Blocktype,塊類型。具體類型,請參考\h6.7;(5bytes):Blocknumber,塊編號;(1byte):Destinationfilesystem(ASCII),目標(biāo)的文件系統(tǒng)。其有P(Passive(copied,butnotchained)module)、A(Activeembeddedmodule)、B(Activeasaspassivemodule)三種文件系統(tǒng);是的,Downloadended[0x1C]跟Downloadblock[0x1B]的Parameter和Requestdownload[0x1A]的Parameter的第一部分相同!舉個例子:圖31結(jié)束下載_0800001P的作業(yè)請求那PDU類型為Ack_Data時,Downloadended[0x1C]的Parameter中只有一個function。下圖即為圖31的響應(yīng):圖32結(jié)束下載_0800001P的響應(yīng)這樣,整個下載過程就完成了!下載到這就介紹完了,接著就介紹上傳啦!上傳上傳是PLC發(fā)送塊數(shù)據(jù)給Step7(如圖33)。上傳有3中不同的功能類型:開始上傳(Startupload[0x1D])上傳(Upload[0x1E])上傳結(jié)束(Endupload[0x1F])在上傳過程中,先是Step7向PLC發(fā)送一個開始上傳的Job,PLC收到后則回復(fù)一個Ack_Data,并告訴Step7塊的長度、上傳會話ID。然后PLC繼續(xù)上傳塊數(shù)據(jù)到Step7,直到Step7收到所有字節(jié)。最后,Step7發(fā)送結(jié)束上傳的作業(yè)請求來關(guān)閉上傳會話。時序圖如下:圖33上傳的時序圖(圖片來源:互聯(lián)網(wǎng)好了,開始介紹上傳的結(jié)構(gòu)啦!如圖34所示,即為一個完整的下載過程:圖34一個完整的上傳過程例子開始上傳(Startupload[0x1D])先來介紹,當(dāng)PDU類型為Job時,Startupload[0x1D]沒有Data,其Parameter的結(jié)構(gòu),下:(1byte):FunctionStatus,功能碼狀態(tài);(2bytes):forallunknownbytesinblockcontrol;(4bytes):上傳的會話ID,此時為0x00000000;(1byte):filenamelength,文件名長度;(?bytes):filename,defaultis9byte,文件名,長度一般為9個字節(jié);(1byte):Fileidentifier(ASCII),文件標(biāo)識符。其有_(CompleteModule)、(Moduleheaderforup-loading)兩種文件標(biāo)識符;(2bytes):Blocktype,塊類型。具體類型,請參考\h6.7功能塊;(5bytes):Blocknumber,塊編號;(1byte):Destinationfilesystem(ASCII),目標(biāo)的文件系統(tǒng)。其有P(Passive(copied,butnotchained)module)、A(Activeembeddedmodule)、B(Activeaswellaspassivemodule)三種文件系統(tǒng);其實就是告訴PLC你上傳的位置。舉個例子:圖35開始上傳的作業(yè)請求如圖35所示,文件標(biāo)識是_CompleteModule),塊類型為0B(SDB),塊的編號為00000,目標(biāo)塊的文件系統(tǒng)是A(Activeembeddedmodule),所以文件名為_0B00000A那PDU類型為Ack_Data時,Startupload[0x1D]的Parameter的結(jié)構(gòu),如下:(1byte):FunctionStatus,功能碼狀態(tài);(2bytes):forallunknownbytesinblockcontrol;(4bytes):上傳的會話ID,告訴Step7上傳會話ID;(Unsignedinteger,1byte):BlocklengthstringLength;(Characterstring):Blocklength,塊的長度;下圖即為圖35的響應(yīng):圖36開始上傳的響應(yīng)圖36中,其上傳會話ID為0×00000007。上傳(Upload[0x1E])上面說了,上傳是PLC發(fā)送塊數(shù)據(jù)給Step7。當(dāng)PDU類型為Job時,Upload[0x1E]也沒有Data,其Parameter的結(jié)構(gòu),如下:(1byte):FunctionStatus,功能碼狀態(tài);(2bytes):forallunknownbytesinblockcontrol;(4bytes):上傳的會話ID,告訴Step7上傳會話ID;為了更好比較,舉個例子:圖37上傳的作業(yè)請求那PDU類型為Ack_Data時,Upload[0x1E]有Parameter和Data,其Parameter的結(jié)構(gòu),下:1(1byte):FunctionStatus,功能碼狀態(tài);而其Data的結(jié)構(gòu),如下:(Unsignedinteger,2bytes):Length,數(shù)據(jù)長度;(Unsignedinteger,2bytes):Unknownbyte(s)inblockcontrol,未知字節(jié);(Label,data_length-4bytes):Data,數(shù)據(jù);下圖即為圖37的響應(yīng):圖38上傳的確認(rèn)數(shù)據(jù)響應(yīng)上傳結(jié)束(Endupload[0x1F])上傳結(jié)束的過程,即為所有數(shù)據(jù)上傳完成后,Step7發(fā)送結(jié)束上傳的作業(yè)請求,PLC后就關(guān)閉會話,然后返回一個響應(yīng)。當(dāng)PDU類型為Job時,Endupload[0x1F]也沒有Data,其Parameter的結(jié)構(gòu),如下:(1byte):FunctionStatus,功能碼狀態(tài);(2bytes):Errorcode,錯誤代碼:詳細(xì)的Errorcode,參考\h6.1.2Errorcodeinparameterpart;(4bytes):上傳的會話ID,告訴Step7上傳會話ID;舉個例子:圖39上傳結(jié)束的作業(yè)請求那PDU類型為Ack_Data時,Endupload[0x1F]的Parameter中只有一個function。圖40所示,即為圖39的響應(yīng):圖40上傳結(jié)束的響應(yīng)這樣,整個上傳過程就完成了!程序調(diào)用服務(wù)(PIservice[0x28])程序調(diào)用是用于在PLC執(zhí)行修改執(zhí)行/內(nèi)存狀態(tài)的日常工作。這些命令可以用于啟動或停止PLC控制程序、激活或刪除程序塊。當(dāng)PDU類型為Job時,PIservice[0x28]沒有Data,只有Parameter,那Parameter的結(jié)構(gòu),如下:(7bytes):Unknown;(Unsignedinteger,2bytes):Parameterblocklength;(?bytes):Parameterblock,參數(shù);(Unsignedinteger,1byte):Stringlength,PIservice的字符串長度;(Characterstring,ASCII):PI(programinvocation)Servicename,程序調(diào)用服務(wù)名,參考\h6.8程序調(diào)用服務(wù)名(PIservicenames)。Parameter包含兩個主要部分:服務(wù)名稱參數(shù):取決于方法類型,可以將它們看作是它的參數(shù)服務(wù)名稱及其相關(guān)參數(shù)的示例:_INSE:激活設(shè)備上下載的塊,參數(shù)是塊的名稱(比如:OB1)。_DELE:從設(shè)備的文件系統(tǒng)中刪除一個塊,該參數(shù)也是該塊的名稱。P_PROGRAM:設(shè)置設(shè)備的運行狀態(tài)(啟動、停止、復(fù)位)。_GARB:壓縮PLC內(nèi)存。_MODU:將ram復(fù)制到ROM,參數(shù)包含文件系統(tǒng)標(biāo)識符(A/E/P)。如果服務(wù)調(diào)用的參數(shù)是塊的話,那么Parameterblock的結(jié)構(gòu)如下:(1byte):Numberofblock;(1byte):Unknown,默認(rèn)為0x00;bytes):filename,文件名:(2bytes,ASCII):Blocktype,塊類型。具體類型,請參考\h6.7功能塊;(5bytes,ASCII):Blocknumber,塊編號;(1byte,ASCII):Destinationfilesystem(ASCII),目標(biāo)的文件系統(tǒng)。其有P(Passive(copied,butnotchained)module)、A(Activeembeddedmodule)、B(Activeaswellaspassivemodule)三種文件系統(tǒng);舉個例子,如圖41所示:圖41_INSE(激活PLC模塊)的作業(yè)請求上圖可知服務(wù)名稱是_INSE,參數(shù)是0B0004P(SDB4),那么它的作業(yè)請求是激活PLC中SDB4,那么它的請求響應(yīng)又是如何呢?如圖42所示:圖42_INSE(激活PLC模塊)的響應(yīng)而另一種情況,如圖43所示:圖43_MODU(復(fù)制RAM到ROM)的作業(yè)請求上圖中,其Parameterblock中只有ArgumentPLCSTOP[0x29]PLCSTOP基本上跟\h5.2.6程序調(diào)用服務(wù)(PIservice0x28])一致,唯一有Parameterblock,而它的PIservice為P_PROGRAM。搞不明白為啥單獨占用一個功能碼~~~看個例子吧,如圖44所示:圖44PLCSTOP的作業(yè)請求到此為此JOB和ACK_DATA類型下的功能碼都介紹完了,接下來介紹S7commm協(xié)議的擴(kuò)展。協(xié)議拓展(Userdata)上面介紹了S7Comm的JOB和ACK_DATA兩個PDU類型,那接著將介紹PDU類型是UserData的內(nèi)容,它用于編程/調(diào)試、讀取SZL、安全功能、時間設(shè)置,循環(huán)讀取等,可以說是S7Comm中最復(fù)雜的一部分。大家不要慌哈,Areuready?Okay,當(dāng)PDU類型為UserData時,其S7Comm結(jié)構(gòu),如圖45所示:圖45S7Comm的結(jié)構(gòu)(UserData)圖45中藍(lán)色部分為S7Comm頭部,橘色為Parameter部分,具體的Parameter結(jié)構(gòu)如下:(3bytes):參數(shù)頭(Parameterhead);(1byte):參數(shù)長度(Parameterlength),它的可能是8字節(jié)或12字節(jié);(1byte):未知定義;(1/2byte,高位):參數(shù)類型(Type),常見的類型可參考\h《6.9拓展協(xié)議的參數(shù)類型》;\h(1/2byte,Lownibble):功能組(Functiongroup),常見的功能組可參考《6.10拓展協(xié)議的能組》;(1byte):子功能碼(SubFunction);(1byte):序號。接著就是一一介紹各個功能組。轉(zhuǎn)換工作模式(Mode-transition[0x0])當(dāng)功能組為轉(zhuǎn)換工作模式(Mode-transition)時,請求報文中是沒有Data部分的,而主要起作用的是子功能碼(Subfunction),常見的子功能碼有:STOP(0x00):STOP模式;WarmRestart(0x01):暖啟動;RUN(0x02):RUN模式;HotRest

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論