|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
上表读命令的Byte22-32从表中我们可以得出以下结果: Byte 28,29,30存储器偏移量指针(存储器地址*8),如:VB100,存储器地址为100,偏移量指针为800,转换成16进制就是320H,则Byte 28—29这三个字节就是:00 03 20。
68 23 23 68 02 00 6C 32 0100 00 00 00 00 0E 00 00 04 01 12 0A10
从22字节开始根据写入数据的值和位置不同而变化。上表是几个写命令的Byte22—40。 写命令的Byte22—最后, 经分析我们可以得出以下结果:
写指令:先发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)
报文长度为: 目标地址 到 倒数第二位的校验位前面 的字节长度(根据写入值不通报文长度不同) 功能码:7C表示写入;6C表示读取。 17位:05表示写入;04表示读取。 16位: 16位的05表示写入的是 位或者字节(即用一个字节存储) 06 表示 字; 08表示双字(4个字节); 0C表示8个字节
数据长度(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 5300 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 5300 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 2000 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
读指令的前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
------摘录自网络 , r>功能 |
读取长度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 0A 10
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 5300 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 5300 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 2000 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
------摘录自网络
, "BACKGROUND: rgb(255,204,153)">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 0A 10
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 5300 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 5300 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 2000 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
------摘录自网络
, r>功能读取长度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 0A 10
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 5300 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 5300 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 2000 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
------摘录自网络
, "BACKGROUND: rgb(255,204,153)">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 0A 10
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 5300 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 5300 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 2000 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
------摘录自网络
|