PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯

2023-11-19

PPI协议详解 ppi通讯协议  ppi通信协议  vb与ppi协议通讯

PPI协议详解 ppi通讯协议  ppi通信协议  vb与ppi协议通讯

我们提供 PPI协议的官方文档,协议更新时间为2005年,下面是我们根据文档解析的PPI读取变量返回数据,网上的文献大部分都是讲解如何发送的,对于接收提的很少,其中接收有很多控制位,下面的表格都一一列出,如果想做可靠的工控必须对这些位进行解析,对照官方文档才能做出可靠的工控产品 西门官方PPI协议下载


说明

PPI帧头

PPI数据载荷区

PPI帧尾

数据头

参数1

参数2

变量1

起始

长度(重复)

起始

目的地址

源地址

功能码

PPI协议ID

远程操作

冗余识别

16位

默认0

数据参

考码

16位

参数个数

16位

数据长度

错误

标志

错误码

服务ID

变量个数

访问结果

数据类型

数据位数(bit个数)

数据区

校验+结束符

字节序

0

1

2

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

VB0返回

68

16

16

68

00

02

08

32

03

00

00

00

00

00

02

00

05

00

00

04

01

ff

04

00

08

7f

d5

16

 

 

 

VW0返回

68

17

17

68

00

02

08

32

03

00

00

00

00

00

02

00

06

00

00

04

01

ff

04

00

10

7f

ff

dd

16

 

 

VW1返回

68

17

17

68

00

02

08

32

03

00

00

00

00

00

02

00

06

00

00

04

01

ff

04

00

10

ff

ff

5d

16

 

 

VD0返回

68

19

19

68

00

02

08

32

03

00

00

00

00

00

02

00

08

00

00

04

01

ff

04

00

20

7f

ff

ff

ff

ed

16

M0返回

68

16

16

68

00

02

08

32

03

00

00

00

00

00

02

00

05

00

00

04

01

ff

04

00

08

08

5e

16

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 




S7-200PPI通信协议

 

PPI通信协议是一种主从式的通信协议,上位机即PC机为主,PLC为从。通信开始由计算机发起,PLC予以响应。

 

1)、计算机按通信任务,用一定格式,向PLC发送通信命令。

 

2)、PLC收到命令后,进行命令校验,如无误,则向计算机发送数据E5H或F9H,作出初步应答。

 

3)、计算机收到初步应答后,再向PLC发送SD DA SA FCFCS ED确认命令。

 

这里,SD为起始字符,为10H;DA为目的,即PLC地址02H;SA为数据源,即计算机地址00H;FC为功能码,取5CH;FCS为SA、DA、FC和的256余数,为5EH;末字节ED为结束符,也是16H。如按以上设定的计算机及PLC地址,则发送10、02、00、5C、5E、及16,6个字节的十六进制数据,以确认所发命令。

 

4)、PLC收到此确认后,执行计算机所发送的通信命令,并向计算机返回相应数据。它的通信过程要往复两次才完成一次的通信,比较麻烦,但较严谨,不易出错。

 

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

 

SD:(Start Delimiter)开始定界符,占1字节,为68H

 

LE:(Length)报文数据长度,占1字节,标明报文以字节计,从DA到DU的长度;

 

LER:(Repeated Length)重复数据长度,同LE

 

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

 

DA:(DestinationAddress)目标地址,占1字节,指PLC在PPI上地址,一台PLC时,一般为02,多台PLC时,则各有各的地址;

 

SA:(Source Address)源地址,占1字节,指计算机在PPI上地址,一般为00;

 

FC:(Function Code)功能码,占1字节,6CH一般为读数据,7CH一般为写数据

 

DSAP:(Destination Service Access Point)目的服务存取点,占多个字节

 

SSAP:(Source Service Access Point)源服务存取点,占多个字节

 

DU:(Data Unit)数据单元,占多个字节

 

FCS:(Frame CheckSequence)占1字节,从DA到DU之间的校验和的256余数;

 

ED:(End Delimiter)结束分界符,占1字节,为16H

 

命令类型

 

1读命令 读命令长度都是33个字节。字节021,都是相同的,为:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 12 0A 10”。而从字节22开始,将根据读取数据的软器件类型及地址的不同而不同。

 

字节22,表示读取数据的单位。为01时,1bit;为02时,1字节;为04时,1字;为06时,双字。

 

字节23,恒0。

 

字节24,表示数据个数。01,表示一次读一个数据。如为读字节,最多可读208个字节,即可设为DEH。

 

字节25,恒0.

 

字节26,表示软器件类型。为01时,V存储器;为00时,其它。

 

字节27,也表示软器件类型。为04时,S;为05时,SM;为06时,AI;为07时AQ;为1E时,C;为81时,I;为82时,Q;为83时,M;为84时,V;为1F时,T。

 

字节28、29及30,软器件偏移量指针(存储器地址乘8),如:VB100,存储器地址为100,偏移量为800,转换成十六进制就是320H,则字节28到30这三个字节就是00、03、及20.

 

字节31、32为FCS和ED。

 

 

 

返回数据  与发送命令格式数据相同,但包含一条数据。具体是:

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

 

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

 

这里的SD、LE、Ler、SD、SA及FC与命令含义相同。但SD为PLC地址,DA为计算机地址。此外:

 

字节16:数据块占用的字节数,即从字节21到校验和前的字节数。一条数据时:字,为06;双字,为08;其它为05.

 

字节22:数据类型,读字节为04.

 

字节23、24:读字节时,为数据个数,单位以位计,1个字节为08;2个字节为10(16进制计),余类推。

 

字节25及其后至校验和之前,为返回所读值。

 

如读VB100开始3个字节,其命令码为:

 

68 1B 1B 68 02 00 6C 32 01 00 0000 00 00 0E 00 00 04 01 12 0A 10 02 00 03 00 01 84 00 03 20 8D 16(红色02为字节为单位,03为读3个字节)

 

68 1B 1B 68 02 00 6C 3201 00 00 00 00 00 0E 00 00 04 01 12 0A 10 04 00 01 00 01 84 00 0D 08 84 16

 

返回码:

 

68 18 18 68 00 02 08 32 03 00 0000 00 00 02 00 07 00 00 04 01 FF 04 00 18 99 34 568B 16

 

(这里红色99、34、56分别为VB100、VB101、VB102的值)

 

2)写命令 写一个字节,命令长为38个字节,字节0~字节21为:

 

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

 

写一个字,命令长为39个字节,字节0~字节21为:

 

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

 

写一个双字数据,命令长为41个字节,字节0~21为:

 

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

 

 

字节22~字节30,为写入数据的长、存储器类型、存储器类型、存储器偏移量。这些与读数据的命令相同。字节32如果是写入的是位数据,这一字节为03,,其它则为04.

 

字节34写入数据的位数:01:1位,08:1字节,10H:1字,20H:1双字。

 

字节35~字节40为校验码、结束符。

 

如果写入的是位、字节数据,字节35就是写入的值,字节36为00,字节37为校验码,字节38为16H、结束码。如果写入的是字数据(双字节),字节35、字节36就是写入的值,字节37为校验码,字节38为16H、结束码.如果写入的是双字数据(4字节),字节35~字节38就是写入的值,字节39为校验码,字节40为16H、结束码。

 

如写入QB0=FF,其命令为:

 

68 20 20 68 02 00 7C 32 01 00 0000 00 00 0E 00 05 05 01 12 0A 1002 00 01 00 00 82 00 00 0000 04 00 08 FF 86 16

 

如写入VB100=12,其命令如下:

68 20 20 68 02 00 7C 32 01 00 0000 00 00 0E 00 05 05 01 12 0A 1002 00 01 00 01 84 00 03 200004 00 08 12 BF16

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

10 02 00 5C 5E 16

PLC返回数据 E5 后,写入成功。

 

如写入VW100=1234,其命令如下:

68 21 21 68 02 00 7C 32 01 00 0000 00 00 0E 00 06 05 01 12 0A 1004 00 01 00 01 84 00 03 20 00 040010 12 34 FE 16

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

10 02 00 5C 5E 16

PLC返回数据 E5 后,写入成功。

 

请注意以上红体字的含义。

 

以上命令如执行成功,则返回

 

68 12 12 68 00 02 08 32 03 00 0000 00 00 02 00 01 00 00 05 01 FF 47 16

 

否则返回:

 

68 0F 0F 68 00 02 08 32 02 00 0000 00 00 00 00 00 85 00 C3 16

 

3STOP命令 stop命令使得S7-200CPUrun状态转换到stop状态(此时cpu模块上的模式开关应处于runterm位置)。计算机发出如下命令:

 

68 1D 1D 68 02 00 6C 32 01 00 0000 00 00 10 00 00 29 00 00 00 00 00 09 50 5F 50 52 4F 47 52 41 4D AA 16

 

PLC返回:E5,同时PLC即转为stop状态。

 

但计算机再发确认报文(10 02 00 5C 5E 16)

 

PLC将返回:68 10 10 68 00 02 08 32 03 00 00 00 00 00 01 00 00 00 00 29 69 16

 

到此,才算完成这个通信过程。

 

4RUN命令 run命令使得S7-200 cpustop状态转换到run状态(此时cpu模块上的模式开关应处于runterm位置)。PC机发出如下命令:

 

68 21 21 68 02 00 6C 32 01 00 0000 00 00 14 00 00 28 00 00 00 00 00 00 FD 00 00 09 50 5F 50 52 4F 47 52 41 4DAA 16

 

PLC返回:E5,同时PLC即转为RUN状态。

 

但计算机再发确认报文(10 02 00 5C 5E 16)

 

PLC将返回:68 10 10 68 00 02 08 32 03 00 00 00 00 00 01 00 00 00 00 29 69 16

 

至此,才算完成这个通信过程。

 

注:以上介绍的不是西门子发布的正式通信协议,还有其它内容。

 

建议结合些通信的例子来进行测试。

 

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

变量地址数

 

 

默认ID

68

1B

1B

68

02

00

6C

32

01

00

00

00

00

00

0E

00

00

04

01

12

0A

10

下面我们列表分析读取PLC密码的指令:68 1B 1B 68 02 00 6C32 01 00 00 00 00 00 0E 00 00 04 01 12 0A10 02 00 08 00 00 03 00 05 E0 D2 16

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

功能

读取长度16位小端

数据个数16位小端

存储器类型

偏移量

校验码

结束符

读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 读取数据的长度
01:1 Bit 02:1 Byte
04:1 Word 06:Double Word
Byte 24数据个数,这里是01 ,一次读多个数据时见下面的说明。
Byte 26 存储器类型,01:V存储器 00:其它
Byte 27 存储器类型
04:S 05:SM 06:AI 07:AQ 1E: C
81:I 82:Q 83:M 84:V 1F: T
Byte 28,29,30存储器偏移量指针(存储器地址*8),如:VB100,存储器地址为100,偏移量指针为800,转换成16进制就是320H,则Byte 28—29这三个字节就是:00 03 20。
Byte 31 校验和,前面已说到这是从(DA+SA+DSAP+SSAP+DU) Mod 256 。
一次读多条数据
对于一次读多个数据的情况,前21Byte与上面相似只是长度LD,LDr及Byte 14不同:
Byte 14 数据块占位字节,它指明数据块占用的字节数。与数据块数量有关,长度=4+数据块数*10,如:一条数据时为4+10=0E(H);同时读M,V,Q三个不同的数据块时为4+3*10=22(H)。
Byte 22 总是02 即以Byte为单位。
Byte 24 以字节为单位,连续读取的字节数。如读2个VD则Byte24=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 0100 00 00 00 00 0E 00 00 04 01 12 0A10
写一个其它类型的数据,前面的0—21字节为 :(与上面比较,只是长度字节发生变化)
68 21 21 68 02 00 6C 32 0100 00 00 00 00 0E 00 00 04 01 12 0A10

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。
字 节 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 3839 40
写入位置及值长度 个数 类型 偏移量 位数 值、校验码、 结束符
M0.0=1 01 00 01 00 00 83 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 A6 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 写入数据的长度、存储器类型、存储器偏移量与读命令相同。T,C等不能用写命令写入。
Byte 32 如果写入的是位数据这一字节为03,其它则为04
Byte 34 写入数据的位数
01: 1 Bit 08: 1 Byte 10H: 1 Word 20H: 1 Double Word
Byte 35--40值、校验码、结束符
如果写入的是位、字节数据,Byte35就是写入的值,Byte36=00,Byte37=检验码,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 5C5E 16
PLC返回: E5
我们先来看看西门子S7-200PLC的读取密码指令:
请用串口软件以16进制发送,端口设置9600;e;8;1
发送:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 120A 10 02 00 08 00 00 0300 05 E0 D2 16意思:要求传送系统存储区05E0位开始的8个字符(这就是8个密码数值)。
如果通讯无误,PLC会返回 E5,意思:已经收到
那么这时上位机再次发送指令 10 02 00 5C 5E 16 意思:请执行命令。(说到这里打住一下,PLC返回E5指令后上位机PC要在很短的时间内发送确认指令,晚了刚才的指令就无效了具体多长时间我也没测准,反正1、2秒时间是没有问题的。)那么这时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 9D9A 00 76 7D 16

写指令:先发10 02 00 5C 5E 16 后发写指令

 

1、写一位M区(例子M0.0)

先发10 02 00 5C 5E 16 收到E5后

发   68 20 20 68 02 00 7C32 01 00 00 00 00 00 0E 0005 05 01 12 0A 10 01 00 01 00 00 83 00 00 00 00 03 00 01 0180 16

收到E5 说明写入完成(只要报文长度,跟校验码对了,就会回复E5)

 

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

开始符

报文长度

报文长度

开始符

目标

地址(PLC

源站地址(上位机)

功能码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

68

20

20

68

02

00

7C

32

01

00

00

00

00

00

0E

00

05

05

01

12

0A

10

报文长度为: 目标地址 到 倒数第二位的校验位前面 的字节长度(根据写入值不通报文长度不同)

功能码:7C表示写入;6C表示读取。

17位:05表示写入;04表示读取。

16位: 16位的05表示写入的是 位或者字节(即用一个字节存储)

       06 表示 字;  08表示双字(4个字节); 0C表示8个字节

 

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位):01位;02字节;04字;06双字。

数据个数:0100表示一个;0200表示连续的两个;0400连续的4个。

存储类型:26位:01 V区;00其他。

          27位:04 S区;05 SM区;06 AI;07 AQ;1E C;

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

偏移量: 0000 0000 0000 0000 0000 0XXX (XXX表示位)

例如:10.3=101 0.011 即00 00 53

数据形式:03表示位;04表示其他。

数据位数:即写入数据多少位。01一位;08八位;10十六位;20三十二位。

写入值:写入位,字节均用一个字节存储;写入双字得用四个字节。

校验码:即报文的偶校验(所有之和Mod 100H)

终止符:16H

 

若M10.3=1写入,  00 00 53             01 D3 (校验码D3是从开头第五个02到倒数第三个01的所有数字的偶校验(算术和))      

因为 0101 0.011(10.3)为00 00 53

即:68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 120A 10          01 00 01 00 00 8300 00 53 00 03 00 01 01D3 16

 

M10.3=0

即:68 20 20 68 02 00 7C 32 01 00 00 00 00 00 0E 00 05 05 01 120A 10          01 00 01 00 00 8300 00 53 00 03 00 01 00D2 16

 

 

2、写V区一个字节(例子VB100=10H)

先发10 02 00 5C 5E 16 收到E5后

发:68 20 20 68 02 00 7C 32 0100 00 00 00 00 0E 00 05 05 01 12 0A10           02 00 01 00 01 8400 03 20 00 04 00 08 10 bd16

 

3、写V区一个字(双字)

发:68 21 21 68 02 00 7C32 01 00 00 00 00 00 0E 00 06 05 01 12 0A 10           04 00 01 00 01 84 00 03 20 00 04 0010ab cd 30 16

发:68 23 23 68 02 00 7C32 01 00 00 00 00 00 0E 00 08 05 01 12 0A 10           06 00 01 00 01 84 00 03 20 00 04 0020ab cd ef fe 31 16

 

 

读指令:先发读指令,后发10 02 005C 5E 16

1、读取数据(例子读取VW10的值,值为FF FF)

先发读取命令:

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 0001 84 00 00 50 B9 16  (红色或者改为04 00 01 00 校验也得改)

回复 E5

然后发送 10 02 00 5C 5E 16

收到数据:

68 17 17 68 00 02 08 32 03 00 0000 00 00 02 00 0600 00 04 01 FF0400 10 FF FF 5D 16

 

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

读指令的前21位都是相同的。读取长度,数据个数,存储类型,偏移量都与写指令里面的定义一样。

 

收到数据中的

16:05表示收到数据用一个字节存储,可能是PLC位,也可能是一个字节;06表示用两个字节存储,即一个字;08双字;0C表示8个字节。

22:数据形式,03表示位;04表示其他。(主要针对C,T可能是位也可能是计数值,计数时间)

24:表示读取数值的位数。01表示一位;08八位;10十六位;20三十二位。

25位之后几位:要读取的数值。

 

 

若回复F9(会产生不同结果,但接受值不变)

然后发送 10 02 00 5C 5E 16

收到数据:(关闭串口再打开的不同结果)

DA A1 21 1B 90 32 61 66 40 40 8000 00 00 02 00 06 00 00 04 01 FF 0400 10FF FF 5D 16

B4 A1 21 1B 10 30 61 66 40 80 80 00 00 00 02 00 06 00 00 04 01 FF 04 00 10FF FF 5D 16

68 17 17 68 00 02 08 32 03 00 0000 00 00 02 00 06 00 00 04 01 FF 0400 10 FF FF 5D 16

 

4、读取VB10

68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 120A 10             02 00 01 00 01 84 00 00 50 B8 16

68 16 16 68 00 02 08 32 03 00 0000 00 00 02 00 05 00 00 04 01 FF 0400 08FF 55 16

 

5、读取VD10

68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 120A 10 06 00 01 00 01 84 00 00 50 BC 16

68 19 19 68 00 02 08 32 03 00 0000 00 00 02 00 08 00 00 04 01 FF 0400 20FF FF 00 00 6F 16

 

6、读取VB10后面的8个字节

68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 120A 10 02 00 08 00 01 8400 00 50 Bf 16

68 1D 1D 68 00 02 08 32 03 00 0000 00 00 02 00 0C 00 00 04 01 FF 04 00 40FF FF 00 00 00 00 00 00 93 16

 

7、读取V10.0

68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 120A 10 01 00 01 00 01 8400 00 50 B7 16

68 16 16 68 00 02 08 32 03 00 0000 00 00 02 00 05 00 00 04 01 FF03 00 01 01 4F 16

 

4、读取Q0.1

发送:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 120A 10 01 00 01 00 00 8200 00 01 65 16

回复:E5

然后发送 10 02 00 5C 5E 16

收到数据:

68 16 16 68 00 02 08 32 03 00 0000 00 00 02 00 05 00 00 04 01 FF 03 00 01 004E 16                                              Q0.1为0时

68 16 16 68 00 02 08 32 03 00 0000 00 00 02 00 05 00 00 04 01 FF 03 00 0101 4F 16                                              Q0.1为1时

5、读取Q1.3

发送:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 120A 10 01 00 01 00 00 8200 00 0B 65 16

68 16 16 68 00 02 08 32 03 00 0000 00 00 02 00 05 00 00 04 01 FF 03 00 01 004E 16

6、读取M0.0

发送:68 1B 1B 68 02 00 6C 32 01 00 00 00 00 00 0E 00 00 04 01 120A 10 01 00 01 00 00 8300 00 00 65 16

68 16 16 68 00 02 08 32 03 00 0000 00 00 02 00 05 00 00 04 01 FF 03 00 01 00 4E 16

     
         
                                           
                                                             
                                                             
                                                             
                                                             
                                                             
                                                             
                                                             
                                                             
                                                             
                                                             

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 的相关文章

  • fread():从文件读取(不对齐)会导致跳过字节

    我有一个文件 使用 C 我想使用 fread 来自 stdio h 读取它的内容并将其写入结构的成员中 在我的例子中 开头有一个 2 字节 int 后面跟着一个 4 字节 int 但是 在将文件内容正确写入结构的前两个字节变量后 它会跳过两
  • 如何在PHP中逐字节写入套接字?

    如何在PHP中逐字节写入套接字 例如我该怎么做 socket write socket msg 14 56 255 11 7 89 152 strlen msg 7 伪代码连接的数字实际上是十进制中的字节 希望你能理解我 您可以使用pack
  • C# 中 bool* 的用处

    我可以用吗bool 以任何有意义的方式 我将如何转换bool to a byte例如 或存储bool 以一个字节为单位 我的目标是在我的项目中管理我自己的记忆 具体细节并不重要 只是我喜欢做的事情 现在我希望能够存储我自己的变量 并且我恰好
  • 对于这个 Java ByteBuffer 的行为有解释吗?

    我需要将数值转换为字节数组 例如 要将 long 转换为字节数组 我有以下方法 public static byte longToBytes long l ByteBuffer buff ByteBuffer allocate 8 buff
  • 使用 JavaScript 从二进制文件读取字节,无需 jQuery

    我正在尝试制作一个 javascript 模拟器 并且我希望它非常轻 所以我不想使用 jQuery 和 jDataView 加载 ROM Si 我用纯 JS 制作了自己的 ROM 加载器 它工作得很好 感谢这个网站上的许多主题 但是 IE
  • 如何在字节数组中搜索“StringA”?

    使用 FreePascal 如果没有 FP 示例 则使用 Delphi 给定一个作为 字节数组 的 2048 字节缓冲区 我如何在缓冲区中搜索 StringA var Buffer array 1 2048 of byte repeat i
  • JavaScript 中的 Java byteArray 等效项

    我正在尝试确定哪种编码方案将为 jpeg 文件类型提供数字 1 或 40 文件的起始数字 我正在开发的 REST API 需要一个类似于 1 94 43 34 等 的字节数组 在node js中 我可以将字节数组设置为十六进制或任何其他编码
  • 如何在Python中使用将双反斜杠替换为单反斜杠来替换字节字符串

    我想将 Python 中字节字符串的双反斜杠替换为单反斜杠 例如 有一个字节字符串 word b Z xa6 x97 x86j2 x08q r xca xe6m 我需要这个字节字符串 word b Z xa6 x97 x86j2 x08q
  • Ruby 如何处理字节/二进制?

    我正在尝试通过套接字发送一系列二进制字节 以满足我公司使用的特定标准 我公司中没有人以前使用过 Ruby 来实现这一点 但在其他语言中 他们一次发送一个字节的数据 通常使用某种 打包 方法 无论如何 我找不到动态创建二进制文件 或者根本无法
  • Powershell 字节数组到 INT

    我有一个包含两个值的字节数组 07 and DE 十六进制 我需要做的是以某种方式连接07DE并从该十六进制值获取十进制值 在这种情况下 它是2014 My code This line gives 11 bytes worth of in
  • Java Byte.parseByte() 错误

    我的代码中有一个小错误 我一生都无法弄清楚 我有一个字符串数组 它们是二进制数据的表示 从十六进制转换后 例如 一个索引是 1011 另一个索引是 11100 我遍历数组并用 0 填充每个索引 以便每个索引都是八个字节 当我尝试将这些表示形
  • write() 参数必须是 str,而不是字节 [重复]

    这个问题在这里已经有答案了 我是一名初学者程序员 正在阅读 Python 初学者 一书 我在尝试为问答游戏编写高分函数时遇到了一个问题 当调用函数 highscore user highscore 时 我尝试相应地分配参数 以便我可以将信息
  • Erlang 中的大型可变字节数组

    当我在 Erlang 中编写一个简单的 Minecraft 服务器应用程序时 我现在关心的问题是如何有效地存储和修改块数据 对于那些不了解 Minecraft 内部结构的人 我需要在内存中存储大量高达 32kB 大小的二进制文件 100 1
  • 静态 uint8_t 数组的输入过程和类型

    我目前正在尝试将 Arduino IDE 中的整数变量转换为静态 uint8 t 数组的值 我在用 include
  • 在 silverlight 中将对象(即任何对象,如人员、雇员)转换为 byte[]

    我有一个 person 对象 需要将其存储为 byte 并再次检索该 byte 并转换为 person 对象 并且 BinaryFormatter 在 silverlight 中不可用 由于 t0mm13b 提到的命名空间不是 Silver
  • C# 将字符转换为字节(十六进制表示)

    这似乎是一个简单的问题 但我无法弄清楚 我需要转换这个字符 lt 以字节 十六进制表示 表示 但如果我使用 byte b Convert ToByte lt i get 60 十进制表示 代替3c 60 0x3C 你已经有了正确的答案 但你
  • Ruby - 如何将消息长度表示为 2 个二进制字节

    我正在使用 Ruby 并且正在与一个网络端点进行通信 该端点需要在发送消息本身之前格式化 标头 标头中的第一个字段必须是消息长度 它被定义为网络字节顺序中的 2 个二进制字节消息长度 例如 我的消息长度是1024 如何将 1024 表示为二
  • 如何将 BYTE 数组转换为 char 数组以使用套接字 C++ 发送

    我有一些问题 我编写客户端服务器应用程序 其中使用 win 套接字发送和接收信息 在我的项目中需要发送BYTE数组到客户端 并在客户端上将此 char 数组转换为BYTE 我该如何创建它 请帮助我 因为send 函数只能发送char 谢谢
  • Java 中的无符号字节

    Java 中的字节默认是有符号的 我在其他帖子中看到 具有无符号字节的解决方法类似于 int num int bite 0xFF 有人可以向我解释一下为什么它会起作用并将有符号字节转换为无符号字节 然后将其转换为相应的整数吗 ANDing一
  • c++ - 将“std::vector”的内容保存到文件

    我使用 writeFileBytes 下面的函数来写入a的内容std vector

随机推荐

  • 树莓派4B(buster)的源更换为北外(清华)国内源

    树莓派4B buster 的源更换为北外 清华 国内源 1 登陆到树莓派 ssh pi your raspi IP 2 备份源文件 sudo cp etc apt sources list etc apt sources list bak
  • GoogLeNet论文详解

    GoogLeNet 1 Introduction 得益于深度学习的优势和更强大的卷积神经网络的出现 图像分类和目标检测的准确率发生了令人意想不到的进步 在2014年的ILSVRC比赛中 GoogLeNet取得了第一名的成绩 所用模型参数不足
  • 详解如何修改Linux文件权限

    参考 详解如何修改Linux文件权限 Linux文件权限详解 在Linux系统中 可以使用chmod命令来修改文件的权限 该命令用于更改文件或目录的读取 r 写入 w 和执行 x 权限 以下是一些详细的说明和示例 使用数字表示权限 r 读取
  • Golang教程:(十六)结构体

    原文 https golangbot com structs 欢迎来到Golang系列教程的第十六篇 什么是结构体 结构体 struct 是用户自定义的类型 它代表若干字段的集合 有些时候将多个数据看做一个整体要比单独使用这些数据更有意义
  • element el-table render-header自定义复选框

    项目中需要对列表数据进行批量处理 表头增加复选框 并关联列表数据 el table提供解决方法 实现多选非常简单 手动添加一个el table column 设type属性为selection即可 尝试后在我的项目中不适用 于是找到另一种r
  • Redis缓存与数据库双写一致性解决方案

    目录 1 冤孽的诞生 1 1 需求起因 1 2 策略之争 2 标准解决方案 2 1 延时双删策略 2 2 异步更新缓存 基于订阅binlog的同步机制 3 基于binlog订阅实现步骤 3 1 准备材料 3 2 代码实现 1 冤孽的诞生 1
  • python两个二维数组加法_python中利用numpy.array()实现俩个数值列表的对应相加方法...

    python中利用numpy array 实现俩个数值列表的对应相加方法 小编想把用python将列表 1 1 1 1 1 1 1 1 1 1 和 列表 2 2 2 2 2 2 2 2 2 2 对应相加成 3 3 3 3 3 3 3 3 3
  • [嵌入式linux]PCIe 热拔插(rescan)

    linux下可通过 sys bus pci devices 0000 bus number device number function number 目录下的节点进行热拔插操作 板子上电前PCIe插槽有一块NVME的固态硬盘 0 1985
  • SDIO接口协议(MMC SD WIFI GPS 以太网)

    一文搞懂SDIO 曼巴精神传承人的博客 CSDN博客 sdio SDIO协议 觅食小鱼的博客 CSDN博客 sdio协议 传统的SD存储卡只有一排引脚 包括一个3 3V电源VDD 用于默认速度
  • 使用ReactiveCocoa实现iOS平台响应式编程

    使用ReactiveCocoa实现iOS平台响应式编程 TIGER IOS 10 使用ReactiveCocoa实现iOS平台响应式编程 ReactiveCocoa和响应式编程 在说ReactiveCocoa之前 先要介绍一下FRP Fun
  • linux arm mmu基础

    ARM MMU页表框架 先上一张arm mmu的页表结构的通用框图 以下的论述都由该图来逐渐展开 以上是arm的页表框图的典型结构 即是二级页表结构 其中第一级页表 L1 是由虚拟地址的高12bit bits 31 20 组成 所以第一级页
  • 常用的IDEA插件

    IDEA是程序员用的最多的开发工具 很多程序员想把它打造成一站式开发工具 于是安装了各种各样的插件 通过插件在IDEA中完成各种操作 无需安装其他软件 确实很方便 今天给大家分享下我平时常用的IDEA插件 个个是精品 Key Promote
  • 今天我花一个通宵的时间安装Windows11系统居然失败,忍不住哭了!

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 我们就不要废话了 直接上主题吧 Windows11 系统安装 提示此电脑无法运行完美
  • ospfv2详解

    文章目录 OSPFV2 技术背景 OSPF基本信息 OSPF 如何完成收敛 SPF计算 DR与BDR DR与BDR的选举 泛洪机制 影响OSPF邻接关系连理原因 1 状态 2 报文 参数 3 物理故障 lsa优先cost及防止环路 ospf
  • 通过doi可以检索到文献_经验丨我如何获得英文文献

    前阵子有师妹问我如何找英文文献 那这周就来分享分享我的经验 希望能有所帮助 那我们开始吧 本期推送目标 查找并下载目标英文文献 其实这里包含两个部分 第一个是找到想要的英文文献 第二个才是下载 如果已知目标文献信息 仅仅想要下载可以直接在往
  • C++——浅拷贝、深拷贝、写时拷贝详解

    C 浅拷贝 深拷贝 写时拷贝详解 浅拷贝与深拷贝 解决浅拷贝的问题 引用计数 写时拷贝 浅拷贝与深拷贝 用String类模拟用 将 0 拷贝进去 调用系统默认的拷贝构造函数 结果就是内容相同 地址相同 说明这个方法是浅拷贝方法 浅拷贝方法带
  • Java代码判断当前操作系统是Windows或Linux或MacOS

    package com magic system public class SystemUtils 判断操作系统是否是 Windows return true 操作系统是 Windows false 其它操作系统 public static
  • 在Visual studio 2019中创建Qt+OpenCv项目

    一般创建Qt项目 都会第一时间想到Qt creator 这个IDE确实好用 可自由选择编译器 mingw或Visual studio 但要同时结合OpenCv框架 整个配置过程太繁琐了 好像需要用到Cmake工具 综合考虑了一下 在Visu
  • C++中ListNode线性链表的定义及其使用方法(Leedcode两数相加题目)

    1 ListNode线性链表定义 struct ListNode int val ListNode next ListNode val 0 next NULL ListNode int x val x next NULL ListNode
  • PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯

    PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 PPI协议详解 ppi通讯协议 ppi通信协议 vb与ppi协议通讯 我们提供 PPI协议的官方文档 协议更新时间为2005年 下面是我们根据文档解析的PPI读取变量返回