Siemens PPI协议分析
这篇文章是我做PPI协议分析时候读过的,写的挺便于理解的,也转载过来,供有需要的朋友阅读。其中加了一点点我理解的东西,并且证明是正确的! 原文地址:http://wenku.baidu.com/view/c57e5c37ee06eff9aef807bd.html?from=rec&pos=0&weight=136&lastweight=70&count=4 大家好:我是山东临沂的郝金红,PLC解密网是我的个人网站。由于前段时间的疯狂的研究西门子PPI协议解密之故,所以无心插柳的研究出了较实用的西门子S7-200PPI协议,今天奉献大家。我们经常要用于上位机、现场设备与S7-200CPU之间的通讯,但是西门子公司没有公布PPI协议的格式,用户如果想使用PPI协议监控,必须购买其监控产品或第三方厂家的组态软件。大家要知道国内的组态王、紫金桥、力控等等组态公司是花了多少钱才得到的PPI的深层协议吗?其实西门子工控产品的超高价垄断掠夺行为已经引起了我们国家及业内人士的抵制和抗议,他们的什么软件都需要授权且对于系统的霸道性是有目共睹的,而且我是深受其害的。^_^我最近弄了个WINCC,装了一个星期还没装上,网友告诉我要重做系统才可以,悲哀啊。。。。。。 这样给用户自主开发就带来了一定的困难,特别是想用VB、VC等语言自行开发,根本没办法接入PLC,要么你大把掏钱给他们。洋为中用,最近在国外网站得到一个串口监视软件,带协议分析的相当不错,你吧!我就是通过此软件的数据监视、分析方法,找出了PPI协议的关键报文格式所在。 其实西门子S7-200PLC之间或者PLC与PC之间通信有很多种方式:自由口,PPI方式,MPI方式,Profibus方式。使用自由口方式进行编程时,在上位机和PLC中都要编写数据通信程序。使用PPI协议进行通信时,PLC可以不用编程,而且可读写所有数据区,快捷方便。这也是我们之所以要研究、找出PPI协议的源动力! 下面我们就要说说分析的方法了! 西门子的STEP7MicroWIN是用于S7-200系列PLC的开发工具,它使用PC机上的COM口通过一条PC/PPI编程电缆连到PLC的编程口上。这说明,PC实际上是可以通过串口同S7-200CPU通讯。只是我们不知道通讯协议而已。通过截获PC机串口上的收发数据,对照Step7软件发出的指令,我们就有可能分析出有关指令的报文和通讯方式;然后,直接通过串口向PLC发送报文,以验证这些指令报文是否正确。本着这一思想,我们采用以下步骤获得这些报文。 首先你这个英文的串口监控软件,英文不好的网友可以用金山快译翻译一下,你必须使用这个软件,因为我先前使用过很多的监控软件,在收发数据很多的情况下都有死机现象,造成数据丢失,容易给我们错误分析。接下来你先打开这个软件,新建、选择端口COM1,然后再将PC/PPI编程电缆接在COM1上,这样,Step7Micro/Win发给PLC的报文就可以在监视软件上完全裸露的展现在你的面前了。我们按S7-200系统手册设置好串口参数:9600,8,E偶校验,1位停止位。然后设置好Step7软件,使之能与S7-200CPU正常通讯。从Step7软件中发出一个明确指令,监视软件就能显示这条报文了(用16进制显示,ASCII码的只能看到几个版本号之类的,其他都没有意义)。 我们的破解策略就是通过软件监视的方法,分析PLC内部固有的PPI通讯协议,然后上位机采用VB编程,遵循PPI通讯协议,读写PLC数据,实现人机操作任务。这种通讯方法,与一般的自由通讯协议相比,省略了PLC的通讯程序编写,只需编写上位机的通讯程序资源。S7-200的编程口物理层为RS-485结构,SIEMENS提供MicroWin软件,采用的是PPI(PointtoPoint)协议,关于232串口转485你可以采用我们网站开发研制的自制PPI电缆,效果倍好哦!还是自己动手,丰衣足食啊! 不能光说不练啊!下面我们就说说西门子PLC到底是怎么通讯的。 PC与PLC采用主从方式通讯,PC按如下文的格式发读写指令,PLC作出接收正确的响应(返回应答数据E5H或F9H见下文分析),上位机接到此响应则发出确认命令(10025C5E16),PLC再返回给上位机相应数据。一般上位机要连接PLC就要先发送如下寻呼数据100200494B16同志们呐!我们可都是有血、有肉、有思想、有灵感的高级动物啊,面对这么多枯燥、无味、复杂、混乱的机器数字你怎么记呢?反正我是记不住啊!(^_^开始洗脑)这时你可以闭上眼睛,安静、静、再静。。。。。。想一想战争时期的战地对讲机通话模式,那么这个指令(100200494B16)就可以理解为:00呼叫02,听到请回答。10起始符02是上位机要联系的下位级的地址站号,就是要找的人00就是上位级本本身自己的站号49寻呼指令16终止符其中4B为校验码,是这样得来的:02+00+49的最后两位就是校验码,这就是所说的偶校验或称和校验也称余校验,因为取的是余数。计算器在16进制计算时公式(02+00+49)mod100得出的数就是校验码,你计算一下是不是等于4B啊!其他的所有PPI协议校验都是如此。假如02站号的PLC收到寻呼信号那么会回答:100002000216意思是:报告00,02收到,请指示这样的解释是不是有意思啊!你有更好的解释吗?接下来呢,找到了要寻呼的人PC就是司令啦就可以发号施令了,发号施令后PLC正确接收后就会发送E5字符,意思是:“02洞两明白”。其实啊,说到这里PLC只说他明白,他已经明白了上位机PC的指示,但并没有执行命令,那么要怎么他才执行命令呢?就是上位机PC发出确认命令后才执行。这时上位机会发出(1002005C5E16),意思是:“请立即执行”。然后PLC就干他应当干的工作了啊!原来PLC也不容易啊,怪不得叫下位机呢! 说了这么多乱不乱呐!目的就是要理清上下级关系、主从关系,指令的顺序,用一个好的记忆方法记住枯燥无味的机器码。 读命令分析:一次读一条数据
下面我们列表分析读取PLC密码的指令:681B1B6802006C320100000000000E00000401120A100200080000030005E0D216
因为是PC上发的读PLC数据的命令,SA=00,DA=02,如果有多个站,DA要改成相应的站号。读命令中从DA到DU的长度为1B即27个字节。从22字节开始根据读取数据的类型、位置不同而不同。上表是读不同存储器命令的Byte22—32。
上表读命令的Byte22-32从表中我们可以得出以下结果:
6823236802006C320100000000000E00000401120A10
从22字节开始根据写入数据的值和位置不同而变化。上表是几个写命令的Byte22—40。 写命令的Byte22—最后,经分析我们可以得出以下结果:
写指令:先发1002005C5E16后发写指令
1、写一位M区(例子M0.0) 先发1002005C5E16收到E5后 发6820206802007C320100000000000E00050501120A1001000100008300000000030001018016 收到E5说明写入完成(只要报文长度,跟校验码对了,就会回复E5)
报文长度为:目标地址到倒数第二位的校验位前面的字节长度(根据写入值不通报文长度不同) 功能码:7C表示写入;6C表示读取。 17位:05表示写入;04表示读取。 16位:16位的05表示写入的是位或者字节(即用一个字节存储) 06表示字;08表示双字(4个字节);0C表示8个字节
数据长度(22位):01位;02字节;04字;06双字。 数据个数:0100表示一个;0200表示连续的两个;0400连续的4个。 存储类型:26位:01V区;00其他。 27位:04S区;05SM区;06AI;07AQ;1EC; 81I;82Q;83M;84V;1FT 偏移量:000000000000000000000XXX(XXX表示位) 例如:10.3=1010.011即000053 数据形式:03表示位;04表示其他。 数据位数:即写入数据多少位。01一位;08八位;10十六位;20三十二位。 写入值:写入位,字节均用一个字节存储;写入双字得用四个字节。 校验码:即报文的偶校验(所有之和Mod100H) 终止符:16H
若M10.3=1写入,00005301D3(校验码D3是从开头第五个02到倒数第三个01的所有数字的偶校验(算术和)) 因为01010.011(10.3)为000053 即:6820206802007C320100000000000E00050501120A100100010000830000530003000101D316
M10.3=0 即:6820206802007C320100000000000E00050501120A100100010000830000530003000100D216
2、写V区一个字节(例子VB100=10H) 先发1002005C5E16收到E5后 发:6820206802007C320100000000000E00050501120A100200010001840003200004000810bd16
3、写V区一个字(双字) 发:6821216802007C320100000000000E00060501120A1004000100018400032000040010abcd3016 发:6823236802007C320100000000000E00080501120A1006000100018400032000040020abcdeffe3116
读指令:先发读指令,后发1002005C5E16 1、读取数据(例子读取VW10的值,值为FFFF) 先发读取命令: 681B1B6802006C320100000000000E00000401120A10020002000184000050B916(红色或者改为04000100校验也得改) 回复E5 然后发送1002005C5E16 收到数据: 681717680002083203000000000002000600000401FF040010FFFF5D16
读指令的前21位都是相同的。读取长度,数据个数,存储类型,偏移量都与写指令里面的定义一样。
收到数据中的 16位:05表示收到数据用一个字节存储,可能是PLC位,也可能是一个字节;06表示用两个字节存储,即一个字;08双字;0C表示8个字节。 21位:FF 22位:数据形式,03表示位;04表示其他。(主要针对C,T可能是位也可能是计数值,计数时间) 24位:表示读取数值的位数。01表示一位;08八位;10十六位;20三十二位。 25位开始之后几位:要读取的数值。
若回复F9(会产生不同结果,但接受值不变) 然后发送1002005C5E16 收到数据:(关闭串口再打开的不同结果) DAA1211B9032616640408000000002000600000401FF040010FFFF5D16 B4A1211B1030616640808000000002000600000401FF040010FFFF5D16 681717680002083203000000000002000600000401FF040010FFFF5D16
4、读取VB10 681B1B6802006C320100000000000E00000401120A10020001000184000050B816 681616680002083203000000000002000500000401FF040008FF5516
5、读取VD10 681B1B6802006C320100000000000E00000401120A10060001000184000050BC16 681919680002083203000000000002000800000401FF040020FFFF00006F16
6、读取VB10后面的8个字节 681B1B6802006C320100000000000E00000401120A10020008000184000050Bf16 681D1D680002083203000000000002000C00000401FF040040FFFF0000000000009316
7、读取V10.0 681B1B6802006C320100000000000E00000401120A10010001000184000050B716 681616680002083203000000000002000500000401FF030001014F16
4、读取Q0.1 发送:681B1B6802006C320100000000000E00000401120A100100010000820000016516 回复:E5 然后发送1002005C5E16 收到数据: 681616680002083203000000000002000500000401FF030001004E16Q0.1为0时 681616680002083203000000000002000500000401FF030001014F16Q0.1为1时 5、读取Q1.3 发送:681B1B6802006C320100000000000E00000401120A1001000100008200000B6516 681616680002083203000000000002000500000401FF030001004E16 6、读取M0.0 发送:681B1B6802006C320100000000000E00000401120A100100010000830000006516 681616680002083203000000000002000500000401FF030001004E16 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |