PPI协议.docx
《PPI协议.docx》由会员分享,可在线阅读,更多相关《PPI协议.docx(33页珍藏版)》请在冰豆网上搜索。
![PPI协议.docx](https://file1.bdocx.com/fileroot1/2023-2/28/f5cb47e6-215b-4c90-acfd-4d0ed3dcd1f9/f5cb47e6-215b-4c90-acfd-4d0ed3dcd1f91.gif)
PPI协议
西门子PPI协议分析:
西门子S7-200PLC之间或者PLC与PC之间通信有很多种方式:
自由口,PPI方式,MPI方式,Profibus方式。
使用自由口方式进行编程时,在上位机和PLC中都要编写数据通信程序。
使用PPI协议进行通信时,PLC可以不用编程,而且可读写所有数据区,快捷方便。
但是西门子公司没有公布PPI协议的格式。
用户如果想使用PPI协议监控,必须购买其监控产品或第三方厂家的组态软件。
这样给用户自主开发带来一定困难,特别是自行开发的现场设备就不能通过PPI协议接入PLC。
其它通讯方式编程也存在编程复杂,需要购买软件和授权等局限性
(1)。
通过数据监视、分析的方法,我们找出了PPI协议的关键报文格式,可用于上位机、现场设备与S7-200CPU之间通讯。
PC与PLC采用主从方式通讯,PC按如下的格式发读写指令,PLC作出接收正确的响应(返回应答数据E5H或F9H见下文分析),上位机接到此响应则发出确认命令(10025C5E16),PLC再返回给上位机相应数据。
一般上位机要连接PLC就要先发送如下数据100200494B16你可以理解为我们常用的对讲机通话模式:
00呼叫02,听到请回答10起始符02是之上位机要联系的下位级的地址站号00就是上位级本本身自己的站号49寻呼指令16终止符其中4B为校验码,是这样得来的:
02+00+49的最后两位就是校验码,这就是所说的偶校验或称和校验。
计算器在16进制计算时公式(02+00+49)mod100得出的数就是校验码,你计算一下是不是等于4B啊!
其他的所有ppi协议校验都是如此。
假如02站号的PLC收到寻呼信号那么会回答:
100002000216意思是:
报告00,02收到,请指示这样的解释是不是有意思啊!
你有更好的解释吗
我们先来看看西门子老型号的PLC的读密码指令:
请用串口软件以16进制发送,端口设置9600;e;8;1
发送:
681B1B6802006C320100000000000E00000401120A100200080000030005E0D216意思:
要求传送系统存储区05E0位开始的8个字符。
如果通讯无误,PLC会返回E5,意思:
已经收到
那么这时上位机再次发送指令1002005C5E16意思:
请执行命令。
那么这时PLC就真的执行命令了返回如下字符:
681D1D680002083203000000000002000C00000401FF0400409B9802069D9A00767D16
好了,说到这里就此停止,大家看看密码是多少啊!
你多做实验一定能得出结果的。
CNplc中鲜为人知的二次加密:
上面是plc所返回的密码,但是已经加密了,你如果不懂解码,还是算不出密码来。
其实新版的plc不光cn一种,所有02版的plc在加密的时候都改动了密码,密码在传输的过程中进行了再加密!
这就是鲜为人知的二次加密!
看下面我做的通过串口监视截获的数据:
我下载程序,当软件要求我输入下载密码的时候,我输入密码:
,可是截获的竟然是一组这样的数据:
6821216802007C3207000000190008000C0001120411450100FF0900086767000067670000FE16
提示:
6767000067670000其实就是我刚才输入的8个2的密码,在这里加密了。
。
。
。
下面呢我公布一下二次加密的代码。
大家来算一下,这个数据是怎么得来的。
密码代码:
无大小写区分
0=651=642=673=664=615=606=637=628=6D9=6CA=14B=17C=16D=11E=10F=13G=12H=1DI=1CJ=1FK=1EL=19M=18N=1BO=1AP=05Q=04R=07S=06T=01X=0DY=0CZ=0F
怎样读取PLC的版本号:
我们在解密中首先要确定的是PLC的版本号。
就是要看看是老版本还是02版的,也好做出加解密方案。
他的通讯源码是这样的:
681B1B6802007C320100000000000E00000401120A100200140000030000000916
发送完上面数据PLC返回E5.再次发送确认指令:
1002005C5E16这时plc的版本号就返回来了。
看下面:
682929680002083203000000000002001800000401FF0400A04350552032323620434E20202020202030323031D716
你看这一段:
4350552032323620434E20202020202030323031就是plc版本号的ascii码。
用asc方式显示就会看的更明白上面数据是:
CPUSP226SPCN0201(sp就是空格)
读取密码保护位(保护等级)指令
681B1B6802006C320100000000000E00000401120A100200010000030005D8C316
全部清空plc指令:
6821216802007C3207000000240008000C0001120411450100FF0900081619060D0108181EEE16
读命令分析:
一次读一条数据
SDLELERSDDASAFCDASPSSAPDUFCSED
SDStartDelimiter)开始定界符(68H)
LE:
(Length)报文数据长度
LER:
(RepeatedLength)重复数据长度
SD:
(StartDelimiter)开始定界符(68H)
SA:
(SourceAddress)目标地址,指该地址的值,就是PLC的地址
DA:
(DestinationAddress)本地地址,指该地址的指针,就是上位机自己的地址
FC:
(FunctionCode)功能码,5CH为交替周期触发,6CH为首次信息周期触发,7CH为交替周期触发。
DSAP:
(DestinationServiceAccessPoint)目的服务存取点
SSAP:
(SourceServiceAccessPoint)源服务存取点
DU:
(DataUnit)数据单元
FCS:
(FrameCheckSequence)校验码
ED:
(EndDelimiter)结束分界符(16H)
报文数据长度和重复数据长度为自DA至DU的数据长度,校验码为DA至DU数据的和校验,只取其中的末字节值关于这个校验码的计算方法同上面说明。
在读写PLC的变量数据中,读数据的功能码为6CH,写数据的功能码为7CH。
对于一次读取一个数据,读命令都是33个字节。
前面的0—21字节是相同的,为0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SD
LE
LER
SD
DA
SA
FC
开始符
长度
长度
开始符
站号
源地址
功能码
协议识别
远程控制
冗余识别
冗余识别
协议数据
单元参考
参数长度
参数长度
数据长度
数据长度
04读05写
变量地址数
68
1B
1B
68
02
00
6C
32
01
00
00
00
00
00
0E
00
00
04
01
12
0A
10
下面我们列表分析读取PLC密码的指令:
681B1B6802006C320100000000000E00000401120A100200080000030005E0D216
22
23
24
25
26
27
28
29
30
31
32
DU
FCS
DE
读取长度
数据个数
存储器类型
偏移量
校验码
结束符
02
00
08
00
00
03
00
05
E0
D2
16
因为是PC上发的读PLC数据的命令,SA=00,DA=02,如果有多个站,DA要改成相应的站号。
读命令中从DA到DU的长度为1B即27个字节。
从22字节开始根据读取数据的类型、位置不同而不同。
上表是读不同存储器命令的Byte22—32。
字节
22
23
24
25
26
27
28
29
30
31
32
功能
读取长度
数据个数
存储器类型
偏移量
校验码
结束符
读
01
00
01
00
00
82
00
00
00
64
16
读
01
00
01
00
00
83
00
00
00
65
16
读
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
读
01
00
01
00
00
81
00
00
05
68
16
读
01
00
01
00
00
81
00
00
07
6A
16
上表读命令的Byte22-32从表中我们可以得出以下结果:
Byte22读取数据的长度
01:
1Bit02:
1Byte
04:
1Word06:
DoubleWord
Byte24数据个数,这里是01,一次读多个数据时见下面的说明。
Byte26存储器类型,01:
V存储器00:
其它
Byte27存储器类型
04:
S05:
SM06:
AI07:
AQ1E:
C
81:
I82:
Q83:
M84:
V1F:
T
Byte28,29,30存储器偏移量指针(存储器地址*8),如:
VB100,存储器地址为100,偏移量指针为800,转换成16进制就是320H,则Byte28—29这三个字节就是:
000320。
Byte31校验和,前面已说到这是从(DA+SA+DSAP+SSAP+DU)Mod256。
一次读多条数据
对于一次读多个数据的情况,前21Byte与上面相似只是长度LD,LDr及Byte14不同:
Byte14数据块占位字节,它指明数据块占用的字节数。
与数据块数量有关,长度=4+数据块数*10,如:
一条数据时为4+10=0E(H);同时读M,V,Q三个不同的数据块时为4+3*10=22(H)。
Byte22总是02即以Byte为单位。
Byte24以字节为单位,连续读取的字节数。
如读2个VD则Byte24=8
Byte19---30按上述一次读一个数据的格式依次列出,
Byte31---42另一类型的数据,也是按上述格式给出。
以此类推,一次最多读取222个字节的数据。
写命令分析:
一次写一个DoubleWord类型的数据,写命令是40个字节,其余为38个字节。
写一个DoubleWord类型的数据,前面的0—21字节为:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
开始符
长度
长度
开始符
68
21
21
68
02
00
7C
32
01
00
00
00
00
00
0E
00
00
04
01
12
0A
10
6823236802006C320100000000000E00000401120A10
写一个其它类型的数据,前面的0—21字节为:
(与上面比较,只是长度字节发生变化)
6821216802006C320100000000000E00000401120A10
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
数据长度
数据个数
存储类型
偏移量
数据形式
数据位数
写入值
校验码
终止符
01
00
01
00
00
82
00
00
00
00
03
00
01
01
79
16
从22字节开始根据写入数据的值和位置不同而变化。
上表是几个写命令的Byte22—40。
字节22232425262728293031323334353637383940
写入位置及值长度个数类型偏移量位数值、校验码、结束符
=10100010000820000000003000101007116
=00100010000830000000003000100007016
=10100010000830000010003000101007216
vb100=10020001000184000320000400081000AE16
vb100=FF02000100018400032000040008FF009D16
VW100=FFFF04000100018400032000040010FFFFA616
VD100=FFFFFFFF06000100018400032000040020FFFFFFFFB81
写命令的Byte22—最后,经分析我们可以得出以下结果:
Byte22--Byte30写入数据的长度、存储器类型、存储器偏移量与读命令相同。
T,C等不能用写命令写入。
Byte32如果写入的是位数据这一字节为03,其它则为04
Byte34写入数据的位数
01:
1Bit08:
1Byte10H:
1Word20H:
1DoubleWord
Byte35--40值、校验码、结束符
如果写入的是位、字节数据,Byte35就是写入的值,Byte36=00,Byte37=检验码,Byte38=16H,结束。
如果写个的是字数据(双字节),Byte35,Byte36就是写入的值,Byte37=检验码,Byte38=16H,结束。
如果写个的是双字数据(四字节),Byte35—38就是写入的值,Byte39=检验码,Byte40=16H,结束。
本主题由plcjiemi于2009-12-2609:
52提升收藏分享评分
回复引用订阅报告道具TOP
plcjiemi发短消息
加为好友
plcjiemi(暮然回首)当前离线
UID1帖子225精华1积分2240阅读权限200性别男来自山东临沂在线时间282小时注册时间2009-1-19最后登录2010-10-14
管理员
帖子225积分2240威望1731金币4769来自山东临沂在线时间282小时注册时间2009-1-19最后登录2010-10-142#
发表于2009-3-116:
07|只看该作者怎样读取PLC的版本号:
我们在解密中首先要确定的是PLC的版本号。
就是要看看是老版本还是02版的,也好做出加解密方案。
他的通讯源码是这样的:
681B1B6802007C320100000000000E00000401120A100200140000030000000916
发送完上面数据PLC返回E5.再次发送确认指令:
1002005C5E16这时plc的版本号就返回来了。
看下面:
682929680002083203000000000002001800000401FF0400A04350552032323620434E20202020202030323031D716
你看这一段:
4350552032323620434E20202020202030323031就是plc版本号的ascii码。
用asc方式显示就会看的更明白上面数据是:
CPUSP226SPCN0201(sp就是空格)
引用引用第41楼zhujiafei于2008-12-2613:
48发表的:
楼主所说的基本是对的,密码代码是对的,只是CN的密码存放地址好象已经不是05E0了,不知改放哪里了,有哪位高人知道。
建议给楼主加分
下面我来证明05E0这个地址是对的,一直没有变,只是你读上来的的时候,CN的版本的密码就只显示000000000000000000密码保护位可以直接显示出来,没有隐藏,只是密码看不到,地址确定是对的,且没有换地址,只是加了隐藏,不相信的话你可以加3级密码,用串口监视软件监控一下,先下载后再比较程序,记住是比较,不是下载,比较时可以只选系统块,那么你监控读出的代码数据是和你用编程器拆解读出的BIN文件是一样一样的。
密码前一位就是密码保护级别。
由此而证明密码地址是没有变化的,还是05E0位置,只是加了读出防护,用比较系统块的方法可以证明。
我曾经试着用比较的方法找到密码,但是有密码也是比较不了的。
我看关键是某一个标志位起了作用。
。
。
。
。
。
。
关键是在校验码!
密码等级改了校验码没改就不行!
但改密码等级不改校验码回上载上来没程序的!
呵呵!
而校验码地算法是密码等级及你加的密码换算出来的一种算法!
一般人是看不出规律的!
回复引用评分报告道具TOP
plcjiemi发短消息
加为好友
plcjiemi(暮然回首)当前离线
UID1帖子225精华1积分2240阅读权限200性别男来自山东临沂在线时间282小时注册时间2009-1-19最后登录2010-10-14
管理员
帖子225积分2240威望1731金币4769来自山东临沂在线时间282小时注册时间2009-1-19最后登录2010-10-143#
发表于2009-3-116:
07|只看该作者改写密码保护位指令
6820206802007C320100000000000E00050501120A100800010000030005D80004000804EF16
6820206802007C320100000000000E00050501120A100200010000030005D80003000804E816
回复引用评分报告道具TOP
plcjiemi发短消息
加为好友
plcjiemi(暮然回首)当前离线
UID1帖子225精华1积分2240阅读权限200性别男来自山东临沂在线时间282小时注册时间2009-1-19最后登录2010-10-14
管理员
帖子225积分2240威望1731金币4769来自山东临沂在线时间282小时注册时间2009-1-19最后登录2010-10-144#
发表于2009-3-116:
08|只看该作者其实拆机更简单读出bin文件,不过解码方式是和上面的ppi协议解密返回的密码是一样的需要解码下载KB)
2009-12-2422:
44
回复引用评分报告道具TOP
plcjiemi发短消息
加为好友
plcjiemi(暮然回首)当前离线
UID1帖子225精华1积分2240阅读权限200性别男来自山东临沂在线时间282小时注册时间2009-1-19最后登录2010-10-14
管理员
帖子225积分2240威望1731金币4769来自山东临沂在线时间282小时注册时间2009-1-19最后登录2010-10-145#
发表于2009-3-409:
47|只看该作者现在只有拆机才是cn四级解密的最好办法,麻烦点,不过没办法啊
楼上提供的图片很好,不过看样子硬件价格不低吧,一个编程器加一个转接座,还有一根ppi电缆,好贵噢。
我买的一批价格低廉的24c编程器,连转接座和ppi电缆总价才200多,有的网友光买一个编程器就2000多啊,真晕,狂晕。
下载KB)
2