您所在的位置:首页 > 工控资讯> 工控资讯
工控资讯
工控资讯

VB与西门子S7 200 PPI协议通讯

2013-12-05 浏览次数: 来源:

VB与西门子S7 200 PPI协议通讯

通过硬件和软件侦听的方法,分析PLC内部固有的PPI通讯协议,然后上位机采用VB编程,遵循PPI通讯协议,读写PLC数据,实现人机操作任务。这种通讯方法,与一般的自由通讯协议相比,省略了PLC的通讯程序编写,只需编写上位机的通讯程序资源

 

S7-226的编程口物理层为RS-485结构,SIEMENS提供MicroWin软件,采用的是PPI(Point to Point)协议,可以用来传输、调试PLC程序。在现场应用中,当需要PLC与上位机通讯时,较多的使用自定义协议与上位机通讯。在这种通讯方式中,需要编程者首先定义自己的自由通讯格式,在PLC中编写代码,利用中断方式控制通讯端口的数据收发。采用这种方式,PLC编程调试较为烦琐,占用PLC的软件中断和代码资源,而且当PLC的通讯口定义为自由通讯口时,PLC的编程软件无法对PLC进行监控,给PLC程序调试带来不便。

SIEMENS S7-200PLC的编程通讯接口,内部固化的通讯协议为PPI协议,如果上位机遵循PPI协议来读写PLC,就可以省略编写PLC的通讯代码。如何获得PPI协议?可以在PLC的编程软件读写PLC数据时,利用第三个串口侦听PLC的通讯数据,或者利用软件方法,截取已经打开且正在通讯的端口的数据,然后归纳总结,解析出PPI协议的数据读写报文。这样,上位机遵循PPI协议,就可以便利的读写PLC内部的数据,实现上位机的人机操作功能。

 

软件设计

系统中测控任务由SIEMENS S7-226PLC完成,PLC采用循环扫描方式工作,当定时时间到时,执行数据采集或PID控制任务,完成现场的信号控制。计算机的监控软件采用VB编制,利用MSComm控件完成串口数据通讯,通讯遵循的协议为PPI协议。

 

PPI协议

西门子的PPIPoint to Point)通讯协议采用主从式的通讯方式,一次读写操作的步骤包括:首先上位机发出读写命令,PLC作出接收正确的响应,上位机接到此响应则发出确认申请命令,PLC则完成正确的读写响应,回应给上位机数据。这样收发两次数据,完成一次数据的读写[5]

其通讯数据报文格式大致有以下几类:

 

1、读写申请的数据格式如下:
SD LE LER SD DA SA FC DASP SSAP DU FCS ED 
SD:(Start Delimiter)开始定界符(68H)
LE:Length)报文数据长度
LER:Repeated Length)重复数据长度
SD: (Start Delimiter)开始定界符(68H)
SA:Source Address)源地址,指该地址的指针,为地址值乘以8
DA:Destination Address)目标地址,指该地址的指针,为地址值乘以8
FC:Function Code)功能码
DSAP:Destination Service Access Point)目的服务存取点
SSAP:Source Service Access Point)源服务存取点
DU:Data Unit)数据单元
FCS:Frame Check Sequence)校验码
ED:End Delimiter)结束分界符(16H

报文数据长度和重复数据长度为自DADU的数据长度,校验码为DADU数据的和校验,只取其中的末字节值。

在读写PLC的变量数据中,读数据的功能码为 6CH,写数据的功能码为 7CH

 

2PLC接收到读写命令,校验后正确,返回的数据格式为 E5H

 

3、确认读写命令的数据格式为:
SD SA DA FC FCS ED 
其中SD为起始符,为10H
SA为数据源地址
DA为目的地址
FC为功能码,取5CH
FCSSA+DA+FC的和的末字节
ED为结束符,取16H

 

PPI协议的软件编制

在采用上位机与PLC通讯时,上位机采用VB编程,计算机采用PPI电缆或普通的485串口卡与PLC的编程口连接,通讯系统采用主从结构,上位机遵循PPI协议格式,发出读写申请,PLC返回相应的数据。程序实现如下:

 

1、串口初始化程序:
MSComm1.CommPort = 1
MSComm1.Settings = "9600,e,8,1"
MSComm1.InputLen = 0
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary

PPI协议定义串口为以二进制形式收发数据,这样报文的通讯效率比ASCII码高。

 

2、串口读取数据程序,以读取VB100数据单元为例:
Dim Str_Read(0 To 32) ‘定义发送的数据为字节为元素的数组。
Str_ Read (32) = &H16 ‘相应的数组元素赋值,按照以下格式:
Str_ Read (29) = (100*8) \ 256 ‘地址为指针值,先取高位地址指针
Str_ Read (30) = (100*8) Mod 256 ‘取低位地址指针
Str_ Read (24) = 1 ‘读取的数据长度(Byte的个数)
For I=4 to 30
Temp_FCS = Temp_FCS + Str_Read(i)
Next I
Str_Read(31)= Temp_FCS Mod 256 ‘计算FCS校验码,其它数组元素赋值省略。

 

68 1B 1B 68 2 0 6C 32 1 0 0 0 0 0 E 0 0 4 1 12 A 10 2 0 1 0 1 84 0 3 20 8B 16 

 

PLC返回数据 E5 后,确认读取命令,发送以下数据:

10 02 00 5C 5E 16

10:启始码 02:源地址(PLC地址) 00:目的地址(上位机地址)

5C:功能码()

然后上位机VB程序接受到以下数据:

68 16 16 68 0 2 8 32 3 0 0 0 0 0 2 0 5 0 0 4 1 FF 4 0 8 22 78 16

 

首先识别目标地址和源地址,确认是这次申请的返回数据,然后经过校验检查,正确后解析出第26号数据(&H22)即为VB100字节的数据。

 

3、串口写入数据程序,以写VB100数据单元为例:

Dim Str_Write(0 To 37) ‘定义发送的数据为字节为元素的数组。

Str_Write (37) = &H16 ‘相应的数组元素赋值,按照以下格式

Str_Write (35) = &H10 ‘要写入的数据值

68 20 20 68 2 0 7C 32 1 0 0 0 0 0 E 0 5 5 1 12 A 10 2 0 1 0 1 84 0 3 20 0 4 0 8 C B9 16 

 

PLC返回数据 E5 后,确认写入命令,发送以下数据:

10 2 0 5C 5E 16

 

然后上位机VB程序接受到以下数据:

68 12 12 68 0 2 8 32 3 0 0 0 0 0 2 0 1 0 0 5 1 FF 47 16

 

这是PLC正确接收并写入信息的返回数据。

 

4、串口接收程序:

在数据接收程序中,利用VBMSComm控件,一次接收缓冲区中的全部数据,存放到数组形式的暂存单元中,然后分析每个元素的值,得到读写的数据。

Dim RCV_Array() As Byte

Dim Dis_Array As String

Dim RCV_Len As Long

RCV_Array = MSComm1.Input ‘取出串口接收缓冲器的数据。

RCV_Len = UBound(RCV_Array)

ReDim Temp(0 To UBound(RCV_Array))

For i = 0 To RCV_Len

Dis_Array = Dis_Array & Hex(RCV_Array (i)) & " "

Next i

Text1.Text = Dis_Array ‘接收到的数据送显示。

 

在程序的读写过程中,一次最大可以读写222个字节,目前给出的数据读写为整数格式。

 

数据类型 Str_ Read27) 

S 04H 

SM 05H 

I 81H 

Q 82H 

M 83H 

V 84H 

以上程序,是以读写PLCV变量区为例,利用PPI协议还可以读写S7-200PLC中的各种类型数据,包括IQSMMVTCS等数据类型,能够直接读出以上变量中的位、字节、字、双字等,其中读位变量时,是读取该位所在的字节值,然后上位机自动识别出该位的值。按照读写的数据类型,其中Str_ Read27)的值各不同:

在控制系统中,PLC与上位计算机的通讯,采用了PPI通讯协议,上位机每0.5秒循环读写一次PLCPLC编程时,将要读取的检测值、输出值等数据,存放在PLC的一个连续的变量区中,当上位机读取PLC的数据时,就可以一次读出这组连续的数据,减少数据的分次频繁读取。当修改设定值等数据时,进行写数据的通讯操作。

 

 

 

其实西门子S7-200 PLC之间或者PLCPC之间通信有很多种方式:自由口,PPI方式,MPI方式,Profibus方式。使用自由口方式进行编程时,在上位机和PLC中都要编写数据通信程序。使用PPI协议进行通信时,PLC可以不用编程,而且可读写所有数据区,快捷方便。这也是我们之所以要研究、找出PPI协议的源动力!

 

 

不能光说不练啊!下面我们就说说西门子PLC到底是怎么通讯的。

 

 

 PCPLC采用主从方式通讯,PC按如下文的格式发读写指令,PLC作出接收正确的响应(返回应答数据E5HF9H见下文分析),上位机接到此响应则发出确认命令(10 02 5C 5E 16),PLC再返回给上位机相应数据。一般上位机要连接PLC就要先发送如下寻呼数据 10 02 00 49 4B 16 同志们呐!我们可都是有血、有肉、有思想、有灵感的高级动物啊,面对这么多枯燥、无味、复杂、混乱的机器数字你怎么记呢?反正我是记不住啊!(^_^开始洗脑)这时你可以闭上眼睛,安静、静、再静。。。。。。想一想战争时期的战地对讲机通话模式,那么这个指令(10 02 00 49 4B 16)就可以理解为:00呼叫02,听到请回答。 10起始符 02是上位机要联系的下位级的地址站号,就是要找的人 00就是上位级自己的站号 49寻呼指令 16终止符 其中4B为校验码,是这样得来的:02+00+49的最后两位就是校验码,这就是所说的偶校验或称和校验也称余校验,因为取的是余数。计算器在16进制计算时公式(02+00+49mod 100得出的数就是校验码,你计算一下是不是等于4B啊!其他的所有PPI协议校验都是如此。假如02站号的PLC收到寻呼信号那么会回答: 10 00 02 00 02 16  意思是:报告00 02收到,请指示  这样的解释是不是有意思啊!你有更好的解释吗?接下来呢,找到了要寻呼的人PC就是司令啦就可以发号施令了,发号施令后PLC正确接收后就会发送 E5 字符,意思是:“02洞两明白”。其实啊,说到这里PLC只说他明白,他已经明白了上位机PC的指示,但并没有执行命令,那么要怎么他才执行命令呢?就是上位机PC发出确认命令后才执行。这时上位机会发出(10 02 5C 5E 16),意思是:“请立即执行”。然后PLC就干他应当干的工作了啊!原来PLC也不容易啊,怪不得叫下位机呢!

 

 

说了这么多乱不乱呐!目的就是要理清上下级关系、主从关系,指令的顺序,用一个好的记忆方法记住枯燥无味的机器码。 

 

 

读命令分析:

一次读一条数据

SD LE LER SD DA SA FC DASP SSAP DU FCS ED 

SD:(Start Delimiter)开始定界符(68H)

LE:Length)报文数据长度

LER:Repeated Length)重复数据长度

SD: (Start Delimiter)开始定界符(68H)

SA:Source Address)目标地址(站号),指该地址的值,就是PLC的地址

DA:Destination Address)本地地址(站号),指该地址的指针,就是上位机自己的地址

FC:Function Code)功能码,5CH为交替周期触发,6CH为首次信息周期触发,7CH为交替周期触发。

DSAP:Destination Service Access Point)目的服务存取点

SSAP:Source Service Access Point)源服务存取点

DU:Data Unit)数据单元

FCS:Frame Check Sequence)校验码

ED:End Delimiter)结束分界符(16H

报文数据长度和重复数据长度为自DADU的数据长度,校验码为DADU数据的和校验,只取其中的末字节值,关于这个校验码的计算方法同上面说明。

在读写PLC的变量数据中,读数据的功能码为 6CH,写数据的功能码为 7CH

对于一次读取一个数据,读命令都是33个字节。前面的0—21字节是相同的,为 


0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

SD

LE

LER

SD

DA

SA

FC

 

 

 

 

 

 

 

 

 

 

开始符

长度

长度

开始符

站号

源地址

功能码

协议

识别

远程

控制

冗余

识别

冗余

识别

协议

数据

单元

参考

参数

长度

参数

长度

数据

长度

数据

长度

68

1B

1B

68

02

00

6C

32

01

00

00

00

00

00

0E

00

00


 

下面我们列表分析读取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

 


17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

 

 

 

 

 

 

 

 

 

 

 

 

 

 

DU

FCS

DE

 

04

05

变量地址数

 

 

 

读取长度

数据个数

存储器类型

偏移量

校验码

结束符

 

04

01

12

0A

10

02

00

08

00

00

03

00

05

E0

D2

16

 


 

因为是PC上发的读PLC数据的命令,SA=00DA=02,如果有多个站,DA要改成相应的站号。读命令中从DADU的长度为1B27个字节。从22字节开始根据读取数据的类型、位置不同而不同。上表是读不同存储器命令的Byte22—32


字节

22

23

24

25

26

27

28

29

30

31

32

 

 

 

 

 

 

 

 

 

DU

FCS

DE

功能

读取长度

数据个数

存储器类型

偏移量

校验码

结束符

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


 

上表读命令的Byte22-32从表中我们可以得出以下结果:

Byte 22 读取数据的长度

011 Bit 021 Byte 

041 Word 06Double Word

Byte 24数据个数,这里是01 ,一次读多个数据时见下面的说明。

Byte 26 存储器类型,01V存储器 00:其它

Byte 27 存储器类型

04S 05SM 06AI 07AQ 1E: C

81I 82Q 83M 84V 1F: T

Byte 28,29,30存储器偏移量指针(存储器地址*8),如:VB100,存储器地址为100,偏移量指针为800,转换成16进制就是320H,Byte 28—30这三个字节就是:00 03 20

Byte 31 校验和,前面已说到这是从(DA+SA+DSAP+SSAP+DU) Mod 256 

 

一次读多条数据

对于一次读多个数据的情况,前21Byte与上面相似只是长度LDLDrByte 14不同:

Byte 14 数据块占位字节,它指明数据块占用的字节数。与数据块数量有关,长度=4+数据块数*10,如:一条数据时为4+10=0E(H);同时读M,V,Q三个不同的数据块时为4+3*10=22(H)

Byte 22 总是02 即以Byte为单位。

Byte 24 以字节为单位,连续读取的字节数。如读2VDByte24=8

Byte 19---30 按上述一次读一个数据的格式依次列出,

Byte 31---42 另一类型的数据,也是按上述格式给出。

以此类推,一次最多读取222个字节的数据。

 

写命令分析:

一次写一个Double Word类型的数据,写命令是40个字节,其余为38个字节。写一个Double Word类型的数据,前面的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


 

68 23 23 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10

写一个其它类型的数据,前面的0~21字节为 :(与上面比较,只是长度字节发生变化)

68 21 21 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10


22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

数据长度

数据个数

存储类型

偏移量

数据形式

数据位数

写入值

校验码

终止符

 

 

 

01

00

01

00

00

82

00

00

00

00

03

00

01

01

79

16

 

 

 


 

22字节开始根据写入数据的值和位置不同而变化。上表是几个写命令的Byte22—40


字 节

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

数据长度

数据个数

存储类型

偏移量

数据形式

数据位数

校验码

结束符

 

 

M0.0=1

01

00

01

00

00

82

00

00

00

00

03

00

01

01

00

71

16

 

 

M0.0=0

01

00

01

00

00

83

00

00

00

00

03

00

01

00

00

70

16

 

 

M0.1=1

01

00

01

00

00

83

00

00

01

00

03

00

01

01

00

72

16

 

 

VB100=10

02

00

01

00

01

84

00

03

20

00

04

00

08

10

00

AE

16

 

 

VB100=FF

02

00

01

00

01

84

00

03

20

00

04

00

08

FF

00

9D

16

 

 

VW100

=FFFF

04

00

01

00

01

84

00

03

20

00

04

00

10

FF

FF

9D

16

 

 

VD100

=FFFFFFFF

06

00

01

00

01

84

00

03

20

00

04

00

20

FF

FF

FF

FF

B8

16


写命令的Byte22~最后, 经分析我们可以得出以下结果:

Byte 22-- Byte 30 写入数据的长度、存储器类型、存储器偏移量与读命令相同。TC等不能用写命令写入。 

Byte 32 如果写入的是位数据这一字节为03,其它则为04

Byte 34 写入数据的位数

01: 1 Bit 08: 1 Byte 10H: 1Word 20H: 1 Double Word 

Byte 35--40值、校验码、结束符

如果写入的是位、字节数据,Byte35就是写入的值,Byte36=00Byte37=检验码,Byte38=16H,结束。如果写个的是字数据(双字节),Byte35,Byte36就是写入的值, Byte37=检验码,Byte38=16H,结束。如果写个的是双字数据(四字节),Byte35—38就是写入的值, Byte39=检验码,Byte40=16H,结束。

  

看完上面的指令分析我们现在就举例几个常用的PPI协议来分析一下:

 

PC寻呼: 10 02 00 49 4B 16 

PLC返回: 10 00 02 02 04 16

PC发送: 10 02 00 5C 5E 16 

PLC返回 E5

 

我们先来看看西门子S7-200PLC的读取密码指令:

请用串口软件以16进制发送,端口设置9600e8

 

发送:

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 

意思: 要求传送系统存储区05E0位开始的8个字符(这就是8个密码数值)

如果通讯无误,PLC会返回 E5,意思:已经收到

那么这时上位机再次发送指令 10 02 00 5C 5E 16 

意思: 请执行命令。

(说到这里打住一下,PLC返回E5指令后上位机PC要在很短的时间内发送确认指令,晚了刚才的指令就无效了具体多长时间我也没测准,反正12秒时间是没有问题的。)那么这时PLC就真的执行命令了返回如下字符:

68 1D 1D 68 00 02 08 32 03 00 00 00 00 00 02 00 0C 00 00 04 01 FF 04 00 40 9B 98 02 06 9D 9A 00 76 7D 16

好了,说到这里就此停止,大家看看密码是多少啊!你如果真正明白了PPI协议就不难找出密码了,但是这个密码是经过二次加密的,并不是真正的密码,还需要破译,至于密码算法在此不便公开,不过你多做实验一定能得出结果的。

 

下面再看一个读取PLC版本号的指令:

我们在解密中首先要确定的是PLC的版本号。就是要看看是老版本还是02版的,也好做出加解密方案。他的通讯源码是这样的:

00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

68 1B 1B 68 02 00 7C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 14 00 00 03 00 00 00 09 16

发送完上面数据PLC返回E5

再次发送确认指令:10 02 00 5C 5E 16 

这时plc的版本号就返回来了。看下面:

68 29 29 68 00 02 08 32 03 00 00 00 00 00 02 00 18 00 00 04 01 FF 04 00 A0 43 50 55 20 32 32 36 20 43 4E 20 20 20 20 20 20 30 32 30 31 D7 16 

你看这一段:43 50 55 20 32 32 36 20 43 4E 20 20 20 20 20 20 30 32 30 31 就是plc版本号的ASCII码。用ASC方式显示就会看的更明白上面数据是:CPU SP 226 SP CN 0201 (SP就是空格)

 

再一个就是读TD200密码指令:

68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 02 00 01 84 00 00 50 B9 16 (VW10

M0指令

68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 12 0A 10 01 00 01 00 00 83 00 00 00 00 03 00 01 01 80 16

2223区(系统区)数据指令

68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 DE 00 00 03 00 00 00 C3 16 

读取密码保护位指令

68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10 02 00 01 00 00 03 00 05 D8 C3 16

改写密码保护位指令(你来验证是否可行)

68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 12 0A 10 08 00 01 00 00 03 00 05 D8 00 04 00 08 04 EF 16

68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 12 0A 10 02 00 01 00 00 03 00 05 D8 00 03 00 08 04 E8 16

全部清除指令:

68 21 21 68 02 00 7C 32 07 00 00 00 24 00 08 00 0C 00 01 12 04 11 45 01 00 FF 09 00 08 16 19 06 0D 01 08 18 1E EE 16 

块代码:08 程序块 0A数据块 0B系统块 

 

永宏PLC 四方变频器 维控触摸屏 威纶触摸屏 西门子产品 信控科技

分享到: 8

版权所有  安徽信控电气技术有限公司  皖ICP备17021212号

QQ客服热线