Siemens PPI協(xié)議分析
大家好:由于前段時(shí)間的瘋狂的研究西門(mén)子PPI協(xié)議解密之故,所以無(wú)心插柳的研究出了較實(shí)用的西門(mén)子S7-200 PPI協(xié)議,今天奉獻大家。我們經(jīng)常要用于上位機、現場(chǎng)設備與S7-200CPU之間的通訊,但是西門(mén)子公司沒(méi)有公布PPI協(xié)議的格式,用戶(hù)如果想使用PPI協(xié)議監控,必須購買(mǎi)其監控產(chǎn)品或第三方廠(chǎng)家的組態(tài)軟件。大家要知道國內的組態(tài)王、紫金橋、力控等等組態(tài)公司是花了多少錢(qián)才得到的PPI的深層協(xié)議嗎?其實(shí)西門(mén)子工控產(chǎn)品的超高價(jià)壟斷掠奪行為已經(jīng)引起了我們國家及業(yè)內人士的抵制和抗議,他們的什么軟件都需要授權且對于系統的霸道性是有目共睹的。
這樣給用戶(hù)自主開(kāi)發(fā)就帶來(lái)了一定的困難,特別是想用VB、VC等語(yǔ)言自行開(kāi)發(fā),根本沒(méi)辦法接入PLC,要么你大把掏錢(qián)給他們。我是通過(guò)一個(gè)串口監視軟件的數據監視與分析,找出了PPI協(xié)議的關(guān)鍵報文格式所在。
其實(shí)西門(mén)子S7-200 PLC之間或者PLC與PC之間通信有很多種方式:自由口,PPI方式,MPI方式,Profibus方式。使用自由口方式進(jìn)行編程時(shí),在上位機和PLC中都要編寫(xiě)數據通信程序。使用PPI協(xié)議進(jìn)行通信時(shí),PLC可以不用編程,而且可讀寫(xiě)所有數據區,快捷方便。這也是我們之所以要研究、找出PPI協(xié)議的源動(dòng)力!
下面我們就要說(shuō)說(shuō)分析的方法了!
西門(mén)子的STEP 7 MicroWIN 是用于S7-200系列PLC的開(kāi)發(fā)工具,它使用PC機上的COM口通過(guò)一條PC/PPI編程電纜連到PLC的編程口上。這說(shuō)明,PC實(shí)際上是可以通過(guò)串口同S7-200 CPU通訊。只是我們不知道通訊協(xié)議而已。通過(guò)截獲PC機串口上的收發(fā)數據,對照Step 7軟件發(fā)出的指令,我們就有可能分析出有關(guān)指令的報文和通訊方式;然后,直接通過(guò)串口向PLC發(fā)送報文,以驗證這些指令報文是否正確。本著(zhù)這一思想,我們采用以下步驟獲得這些報文。
你首先下載上面那個(gè)英文的串口監控軟件,英文不好的網(wǎng)友可以使用我們?yōu)槟銤h化的漢化包,替換原文件即可,你必須使用這個(gè)軟件,因為我先前使用過(guò)很多的監控軟件,在收發(fā)數據很多的情況下都有死機現象,造成數據丟失,容易給我們錯誤分析。接下來(lái)你先打開(kāi)這個(gè)軟件,新建、選擇端口COM1,然后再將PC/PPI編程電纜接在COM1上,這樣,Step7 Micro/Win發(fā)給PLC的報文就可以在監視軟件上完全裸露的展現在你的面前了。我們按S7-200系統手冊設置好串口參數:9600,8,E偶校驗,1位停止位。然后設置好Step7軟件,使之能與S7-200 CPU正常通訊。從Step7軟件中發(fā)出一個(gè)明確指令,監視軟件就能顯示這條報文了(用16進(jìn)制顯示,ASCII碼的只能看到幾個(gè)版本號之類(lèi)的,其他都沒(méi)有意義)。
我們的破解策略就是通過(guò)軟件監視的方法,分析PLC內部固有的PPI通訊協(xié)議,然后上位機采用VB編程,遵循PPI通訊協(xié)議,讀寫(xiě)PLC數據,實(shí)現人機操作任務(wù)。這種通訊方法,與一般的自由通訊協(xié)議相比,省略了PLC的通訊程序編寫(xiě),只需編寫(xiě)上位機的通訊程序資源。S7-200的編程口物理層為RS-485結構,SIEMENS提供MicroWin軟件,采用的是PPI(Point to Point)協(xié)議,關(guān)于232串口轉485你可以采用我們網(wǎng)站開(kāi)發(fā)研制的自制PPI電纜,效果倍好哦!
請點(diǎn)擊下載!還是自己動(dòng)手,豐衣足食!
不能光說(shuō)不練!下面我們就說(shuō)說(shuō)西門(mén)子PLC到底是怎么通訊的。
PC與PLC采用主從方式通訊,PC按如下文的格式發(fā)讀寫(xiě)指令,PLC作出接收正確的響應(返回應答數據E5H或F9H見(jiàn)下文分析),上位機接到此響應則發(fā)出確認命令(10 02 00 5C 5E 16),PLC再返回給上位機相應數據。一般上位機要連接PLC就要先發(fā)送如下尋呼數據 10 02 00 49 4B 16 同志們吶!我們可都是有血、有肉、有思想、有靈感的高級動(dòng)物啊,面對這么多枯燥、無(wú)味、復雜、混亂的機器數字你怎么記呢?反正我是記不住。。╚_^開(kāi)始洗腦)這時(shí)你可以閉上眼睛,安靜、靜、再靜。。。。。。想一想戰爭時(shí)期的戰地對講機通話(huà)模式,那么這個(gè)初始的尋呼指令(10 02 00 49 4B 16)就可以理解為:“洞兩洞兩(02),我是洞洞(00),聽(tīng)到請回答,聽(tīng)到請回答!over!”。
現在我們來(lái)簡(jiǎn)單的分析一下這個(gè)指令的具體含義: 10起始符,咳嗽一聲要開(kāi)始講話(huà)的意思。02是上位機要聯(lián)系的下位機PLC的地址站號,就是要找的人。 00就是上位機電腦本身自己的站號。49尋呼指令,呼叫尋找的意思。16終止符,over、完畢、結束的意思。 其中4B為校驗碼,防止數據傳輸出錯而設計的,它是這樣得來(lái)的:02+00+49和的最后兩位就是校驗碼,這就是所說(shuō)的偶校驗或稱(chēng)和校驗也稱(chēng)余校驗,因為取的是除以100后的余數。計算器在16進(jìn)制計算時(shí)公式(02+00+49)mod 100得出的數就是校驗碼,你計算一下是不是等于4B!其他的所有PPI協(xié)議校驗都是如此。假如02站號的PLC收到尋呼信號那么會(huì )回答: 10 00 02 00 02 16 意思是:“報告洞洞(00) ,洞兩(02)收到,請指示,over!” 這樣的解釋是不是很好理解!你有更好的解釋嗎?既然找到了要找的人,接下來(lái)PC上位機電腦,就是司令啦!就可以發(fā)號施令了。這時(shí)上位機發(fā)出一條指令,這個(gè)指令下面詳細解說(shuō),發(fā)號施令后如果PLC正確接收就會(huì )返回 E5 字符,意思是:“明白!”。其實(shí)啊,說(shuō)到這里PLC只說(shuō)他明白,他已經(jīng)明白了上位機PC的指示,但并沒(méi)有執行命令,那么要怎么他才執行命令呢?就是上位機PC發(fā)出確認命令后才執行。這時(shí)上位機會(huì )發(fā)出確認指令(10 02 00 5C 5E 16),這里的5C是執行指令,意思是:“請洞兩立即執行,over!”。然后PLC就干他該干的工作了!原來(lái)PLC也不容易啊,怪不得叫下位機呢!就是下人的意思!
說(shuō)了這么多亂不亂吶?目的就是要理清上下級關(guān)系、主從關(guān)系,指令的順序,用一個(gè)好的記憶方法記住枯燥無(wú)味的機器碼。
下面我們列表分析讀取PLC密碼的指令:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 08 00 00 03 00 05 E0 D2 16
讀命令分析:一次讀一條數據
1.開(kāi)始定界符(68H)
2.報文數據長(cháng)度
3.重復數據長(cháng)度
4.開(kāi)始定界符(68H)
5.遠程目標地址,指該地址的值,就是PLC的地址
6.本地地址,指該地址的指針,就是上位機自己的地址
7.功能碼,5CH為交替周期觸發(fā),6CH為首次信息周期觸發(fā),7CH為交替周期觸發(fā)。
8-17.目的服務(wù)存取點(diǎn)
18-22.源服務(wù)存取點(diǎn) 18位分析:01:位排列 02:字節排列 04:字排列 06:雙字排列
23-31.數據單元
32.校驗碼
33.結束分界符(16H)
報文數據長(cháng)度和重復數據長(cháng)度為自DA至DU的數據長(cháng)度,校驗碼為DA至DU數據的和校驗,只取其中的末字節值關(guān)于這個(gè)校驗碼的計算方法同上面說(shuō)明。
在讀寫(xiě)PLC的變量數據中,讀數據的功能碼為 6CH,寫(xiě)數據的功能碼為 7CH。
對于一次讀取一個(gè)數據,讀命令都是33個(gè)字節。前面的1—22字節是相同的,為
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
起始符 | 長(cháng)度 | 起始符 | 遠程 | 本地 | 功能碼 | | | 通訊編號 | 參數長(cháng)度 | | | 04讀05寫(xiě) | 排列格式 |
68 | 1B | 1B | 68 | 02 | 00 | 6C | 32 | 01 | 00 | 00 | 00 | 88 | 00 | 0E | 00 | 00 | 04 | 01 | 12 | 0A | 10 |
讀取PLC密碼的指令:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 08 00 00 03 00 05 E0 D2 16
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
讀取長(cháng)度 | 數據個(gè)數 | 存儲器類(lèi)型 | 偏移量 | 校驗碼 | 終止符 |
02 | 00 | 08 | 00 | 00 | 03 | 00 | 05 | E0 | D2 | 16 |
因為是PC上發(fā)的讀PLC數據的命令,SA=00,DA=02,如果有多個(gè)站,DA要改成相應的站號。讀命令中從DA到DU的長(cháng)度為1B即27個(gè)字節。從23字節開(kāi)始根據讀取數據的類(lèi)型、位置不同而不同。上表是讀不同存儲器命令的Byte23—33。
字節 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 |
功能 | 讀取長(cháng)度 | 數據個(gè)數 | 存儲器類(lèi)型 | 偏移量 | 校驗碼 | 終止符 |
讀Q0.1 | 01 | 00 | 01 | 00 | 00 | 82 | 00 | 00 | 00 | 64 | 16 |
讀M0.0 | 01 | 00 | 01 | 00 | 00 | 83 | 00 | 00 | 00 | 65 | 16 |
讀M0.1 | 01 | 00 | 01 | 00 | 00 | 83 | 00 | 00 | 01 | 66 | 16 |
讀SMB34 | 02 | 00 | 01 | 00 | 00 | 05 | 00 | 00 | 01 | F9 | 16 |
讀VB100 | 02 | 00 | 01 | 00 | 01 | 84 | 00 | 03 | 20 | 8B | 16 |
讀VW100 | 04 | 00 | 01 | 00 | 01 | 84 | 00 | 03 | 20 | 8D | 16 |
讀VD100 | 06 | 00 | 01 | 00 | 01 | 84 | 00 | 03 | 20 | 8F | 16 |
讀I0.5 | 01 | 00 | 01 | 00 | 00 | 81 | 00 | 00 | 05 | 68 | 16 |
讀I0.7 | 01 | 00 | 01 | 00 | 00 | 81 | 00 | 00 | 07 | 6A | 16 |
上表讀命令的Byte23-33從表中我們可以得出以下結果:
Byte 23 讀取數據的長(cháng)度
01:1 Bit 02:1 Byte
04:1 Word 06:Double Word
Byte 25數據個(gè)數,這里是01 ,一次讀多個(gè)數據時(shí)見(jiàn)下面的說(shuō)明。
Byte 27 存儲器類(lèi)型,01:V存儲器 00:其它
Byte 28 存儲器類(lèi)型
04:S 05:SM 06:AI 07:AQ 1E: C
81:I 82:Q 83:M 84:V 1F: T
Byte 29,30,31存儲器偏移量指針(存儲器地址*8),如:VB100,存儲器地址為100,偏移量指針為800,轉換成16進(jìn)制就是320H,則Byte 29—31這三個(gè)字節就是:00 03 20。
Byte 32 校驗和,前面已說(shuō)到這是從(DA+SA+DSAP+SSAP+DU) Mod 256 。
一次讀多條數據
對于一次讀多個(gè)數據的情況,前21Byte與上面相似只是長(cháng)度LD,LDr及Byte 15不同:
Byte 15 數據塊占位字節,它指明數據塊占用的字節數。與數據塊數量有關(guān),長(cháng)度=4+數據塊數*10,如:一條數據時(shí)為4+10=0E(H);同時(shí)讀M,V,Q三個(gè)不同的數據塊時(shí)為4+3*10=22(H)。
Byte 23 總是02 即以Byte為單位。
Byte 25 以字節為單位,連續讀取的字節數。如讀2個(gè)VD則Byte25=8
Byte 19---30 按上述一次讀一個(gè)數據的格式依次列出,
Byte 31---42 另一類(lèi)型的數據,也是按上述格式給出。
以此類(lèi)推,一次最多讀取222個(gè)字節的數據。
寫(xiě)命令分析:
一次寫(xiě)一個(gè)Double Word類(lèi)型的數據,寫(xiě)命令是40個(gè)字節,其余為38個(gè)字節。寫(xiě)一個(gè)Double Word類(lèi)型的數據,前面的1—22字節為 :
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 15 | 17 | 18 | 19 | 20 | 21 | 22 |
開(kāi)始符 | 長(cháng)度 | 開(kāi)始符 | 遠程 | 本地 | 功能碼 | | | | | | | | | | | | | | | |
68 | 21 | 21 | 68 | 02 | 00 | 7C | 32 | 01 | 00 | 00 | 00 | 00 | 00 | 0E | 00 | 00 | 04 | 01 | 12 | 0A | 10 |
68 23 23 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
寫(xiě)一個(gè)其它類(lèi)型的數據,前面的0—21字節為 :(與上面比較,只是長(cháng)度字節發(fā)生變化)
68 21 21 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 |
數據長(cháng)度 | 數據個(gè)數 | 存儲類(lèi)型 | 偏移量 | 數據形式 | 數據位數 | 寫(xiě)入值 | 校驗碼 | 終止符 |
01 | 00 | 01 | 00 | 00 | 82 | 00 | 00 | 00 | 00 | 03 | 00 | 01 | 01 | 79 | 16 |