王忠遠(yuǎn),李玉文,王小雨
(內(nèi)蒙古電子信息職業(yè)技術(shù)學(xué)院,內(nèi)蒙古 呼和浩特 010010)
在國(guó)內(nèi)自動(dòng)化控制領(lǐng)域中,西門(mén)子S7-200 PLC與PC機(jī)、單片機(jī)、觸摸屏等之間的串行通信,可通過(guò)PLC自帶PPI協(xié)議實(shí)現(xiàn),但PLC 內(nèi)部固化的PPI通信協(xié)議沒(méi)有官方公布。本文應(yīng)用分支串口、串口調(diào)試工具和Step7 Micro/Win32軟件解析讀寫(xiě)PLC的收發(fā)數(shù)據(jù)幀,整理PPI協(xié)議讀寫(xiě)命令幀格式數(shù)據(jù),為應(yīng)用通用高級(jí)語(yǔ)言編寫(xiě)PLC串口通信程序提供參考。
串口分支器制作需要兩個(gè)九針串口COM1、COM2,通過(guò)轉(zhuǎn)接頭將COM1的RX、TX分別接到COM2的TX、RX,即交叉接線,實(shí)現(xiàn)用COM2來(lái)監(jiān)聽(tīng)COM1的發(fā)送數(shù)據(jù)。使用PC/PPI通信電纜連接COM1和PLC串口,配置通信參數(shù)(波特率9600bit/s,數(shù)據(jù)位8位,偶校驗(yàn)1位,停止位1位),從COM1中發(fā)讀寫(xiě)指令,COM2上的監(jiān)聽(tīng)16進(jìn)制報(bào)文。
PPI通信協(xié)議是一種主從式的通信協(xié)議[1],實(shí)現(xiàn)一個(gè)完整任務(wù)通常需要5步:(1)上位機(jī)發(fā)讀寫(xiě)任務(wù)命令:上位機(jī)按照任務(wù)命令向PLC發(fā)送幀格式的通信任務(wù)命令。(2)下位機(jī)收任務(wù)命令并返回應(yīng)答數(shù)據(jù):PLC收任務(wù)命令校驗(yàn)無(wú)誤后回傳上位機(jī)應(yīng)答數(shù)據(jù)(E5H或F9H),表示接收數(shù)據(jù)正確。(3)上位機(jī)發(fā)執(zhí)行命令:上位機(jī)收E5或E9后,及時(shí)發(fā)送執(zhí)行命令:SD DA SA FC FCS ED (1002005C5E16);SD起始符,SA數(shù)據(jù)源地址,DA目的地址,F(xiàn)C功能碼,F(xiàn)CS校驗(yàn)碼5E=DA+SA+FC,ED結(jié)束符。(4)下位機(jī)收?qǐng)?zhí)行命令并回傳執(zhí)行命令相應(yīng)數(shù)據(jù):下位機(jī)收到執(zhí)行命令后,完成讀寫(xiě)操作,同時(shí)回傳上位機(jī)執(zhí)行命令相應(yīng)的數(shù)據(jù)。(5)上位機(jī)接收數(shù)據(jù)并再次進(jìn)行確認(rèn)。
PPI協(xié)議讀任務(wù)命令幀長(zhǎng)為33個(gè)字節(jié),包含幀頭、數(shù)據(jù)頭、讀命令數(shù)據(jù)和幀尾4部組成[2],幀頭7字節(jié)(開(kāi)始符SD、長(zhǎng)度LE、長(zhǎng)度LER、開(kāi)始符SD、目的地址DA、原地址SA、功能碼FC);數(shù)據(jù)頭12字節(jié)(協(xié)議ID 、遠(yuǎn)程操作、冗余識(shí)別2字節(jié)、協(xié)議數(shù)據(jù)、參考單元、參數(shù)長(zhǎng)度2字節(jié)、數(shù)據(jù)長(zhǎng)度2字節(jié)、讀寫(xiě)標(biāo)識(shí)、變量地址數(shù));讀命令數(shù)據(jù)12字節(jié)(恒定3字節(jié)、數(shù)據(jù)類(lèi)型、恒字節(jié)、一次讀取數(shù)、數(shù)據(jù)個(gè)數(shù)2字節(jié)、存儲(chǔ)器類(lèi)型、存儲(chǔ)器偏移量指針3字節(jié));幀尾2字節(jié)(校驗(yàn)碼、結(jié)束符)。例舉讀取輸入I變量的位、字節(jié)、字、雙字任務(wù)命令數(shù)據(jù)幀,如表1所示(各字節(jié)數(shù)均為16進(jìn)制)。
Byte1=Byte2 數(shù)據(jù)長(zhǎng)度(表1中1B對(duì)應(yīng)Byte序號(hào)為4-30);Byte6 功能碼(6C讀、7C寫(xiě));Byte13、14 參數(shù)長(zhǎng)度(0E=Byte18*0C+2);Byte22 存儲(chǔ)單元的數(shù)據(jù)類(lèi)型(位Bit 01,字節(jié)Byte 02,字Word 04,雙字Double Word 06);Byte24 讀數(shù)據(jù)類(lèi)型(如:讀2個(gè)IW則回傳字節(jié)數(shù)2*2=4字節(jié)數(shù)據(jù));Byte26 存儲(chǔ)單元數(shù)據(jù)個(gè)數(shù)(V 01,其他00);Byte27 存儲(chǔ)單元類(lèi)型(S 04,SM 05,AI 06,AQ 07,C 1E,T 1F,I 81,Q 82,M 83,V 84);Byte28、29、30存儲(chǔ)器偏移量指針值(如:讀位I0.7偏移量07,讀VB1偏移量指針為1*8=08);Byte31 校驗(yàn)碼(Byte4+...+Byte30)除256取余,Byte32結(jié)束符為16。
表1 PPI協(xié)議讀命令幀格式數(shù)據(jù)
PPI協(xié)議寫(xiě)任務(wù)命令幀的長(zhǎng)度為37+N個(gè)字節(jié),N為待寫(xiě)的字節(jié)數(shù),整幀包含幀頭、數(shù)據(jù)頭、寫(xiě)命令數(shù)據(jù)、數(shù)據(jù)區(qū)和幀尾5部組成[3],例舉寫(xiě)入輸出Q的位、字節(jié)、字、雙字命令數(shù)據(jù)幀,如表2所示。
表2 PPI協(xié)議寫(xiě)命令幀格式數(shù)據(jù)
Byte16 數(shù)據(jù)長(zhǎng)度N+4,寫(xiě)入位或字節(jié)N=1、字N=2、雙字N=4;Byte22、24、26、27、28、29、30同讀數(shù)據(jù)幀格式;Byte32 寫(xiě)入位時(shí)03,其他04;Byte34 寫(xiě)入位數(shù),1位 01,1字節(jié) 08,1字10H,1雙字 20H;寫(xiě)入位或字節(jié)數(shù)據(jù)(Byte35為寫(xiě)入值,幀長(zhǎng)38字節(jié)),寫(xiě)入字?jǐn)?shù)據(jù)(Byte35、36為寫(xiě)入值,幀長(zhǎng)39字節(jié)),寫(xiě)入雙字?jǐn)?shù)據(jù)(Byte35—38為寫(xiě)入值,幀長(zhǎng)41字節(jié));Byte35+N 校驗(yàn)碼 (Byte4+...+Byte(34+N))MOD 256。
當(dāng)PC機(jī)接收到PLC應(yīng)答數(shù)據(jù)E5或E9后,發(fā)送6字節(jié)16進(jìn)制的執(zhí)行命令(1002005C5E16)到PLC,PLC接收?qǐng)?zhí)行命令回傳相應(yīng)讀寫(xiě)數(shù)據(jù)幀格式數(shù)據(jù)。
讀I0.0返回?cái)?shù)據(jù)01:68161668000208320300000 0000002000500000401FF030001014F16;讀IB0返回?cái)?shù)據(jù)00:681616680002083203000000000002000500000401FF0 40008005616;讀IW0返回?cái)?shù)據(jù)0001:6817176800020832030 00000000002000600000401FF04001000015616;讀IW0IW1返回?cái)?shù)據(jù)00010000:68191968000208320300000000000200 0800000401FF0400200001。
00007216;讀ID0返回?cái)?shù)據(jù)與讀IW0IW1一致;寫(xiě)命令返回?cái)?shù)據(jù):68121268000208320300000000。
0002000100000501FF4716。其中Byte21返回FF成功,返回03失??;Byte22 數(shù)據(jù)類(lèi)型 位03、其他04。
本文分析了西門(mén)子S7 - 200PLC PPI協(xié)議中的讀寫(xiě)任務(wù)命令報(bào)文數(shù)據(jù)幀格式和讀寫(xiě)返回?cái)?shù)據(jù),為從事工控教學(xué)或開(kāi)發(fā)技術(shù)人員提供一些可供借鑒的資料,但由于篇幅的關(guān)系沒(méi)有提供高級(jí)語(yǔ)言串口編程實(shí)例,讀者通過(guò)以上實(shí)例數(shù)據(jù)表分析,可寫(xiě)出PPI協(xié)議的各種讀寫(xiě)幀指令。