1、通讯协议ASCII模式,9600,7,e,1
2、通讯资料格式:
| STX | 头码‘:’(3AH) |
| ADR1 | 通讯地址: 8-bit位址包含了2个ASCII码 |
| ADR0 | |
| CMD1 | 命令码: 8-bit命令包含了2个ASCII码 |
| CMD0 | |
| DATA(0) | 资料内容: n个8-bit资料包含了2n个ASCII码 n〈=74个ASCII码 |
| DATA(1) | |
| ……… | |
| DATA(n-1) | |
| LRC CHK1 | 校验码: 8-bit校验码包含了2个ASCII码 |
| LRC CHK0 | |
| END1 | 尾码: END1=CR(0DH),END0=LF(0AH) |
| END0 |
PLC通讯地址出厂设定为0X01,因此(ADR1,ADR0)=‘0’,‘1’→=30H,31H
校验码:
校验码采用LRC方式,将ADR1至最后一个资料内容加总,将该值取2的补数,结果即为LRC校验码。
例:
| STX | ‘:’ |
| ADR1 ADR0 | ‘0’ ‘1’ |
| CMD1 CMD0 | ‘0’ ‘3’ |
| 启始资料地址 | ‘0’ ‘4’ ‘0’ ‘1’ |
| 资料数 | ‘0’ ‘0’ ‘0’ ‘1’ |
| LRC CHK1 LRC CHK0 | ‘F’ ‘6’ |
| END1 END0 | CR LF |
注1:
2补数的求法:(1补数再加1)
0A(H)=00001010(B)先取1补数(将b0-b7反相)得11110101(B),再加1为11110110(B)=F6(H)即为0A(H)的2补数。
注2:
在收到一串完整的通讯命令,要检查这串通讯命令是否有误,只要将(ADR1,0)至(LRC1,0)加总等于0,则通讯无误,否则表示命令中资料有些是错误的。
通讯异常PLC的回应:
PLC收到完整的通讯命令时,会判断命令是否有效,造成无效的原因有:
| 原 因 | EXCEPTION CODE |
| LRC CHK ERROR | 07 |
| DEIVCE ADDRESS INVALID | 02 |
| 要求的资料超过范围 | 03 |
| COMMAND CODE INVALID | 01 |
| 通讯命令格式INVALID | 07 |
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 01 |
| Starting Address Hi | 04 |
| Starting Address Lo | 00 |
| Number of Points Hi | 00 |
| Number of Points Lo | 10 |
| Error Check (LRC) | EA |
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 81 |
| Exception Code | 02 |
| Error Check (LRC) | 7C |
可用的命令码叙述如下:(每个device的address,请参考最后一页)
| Code | Name | Description |
| 01 | Read Coil Status | S,Y,M,T,C |
| 02 | Read Input Status | S,X,Y,M,T,C |
| 03 | Read Holding Registers | T,C,D |
| 05 | Force Single Coli | S,Y,M,T,C |
| 06 | Preset Single Register | T,C,D |
| 15 | Force Multiple Coli | S,Y,M,T,C |
| 16 | Preset Multiple Register | T,C,D |
| 17 | Report Slave ID | None |
Function Code :01,Read Coil Status
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 01 |
| Starting Address Hi | 06 |
| Starting Address Lo | 14 |
| Number of Points Hi | 00 |
| Number of Points Lo | 25 |
| Error Check (LRC) | BF |
例:从从动装置01读取线圈T20-T56
PC→PLC “:01 01 06 14 00 25 BF CR LF”
PLC→PC “:01 01 05 CD 6B B2 0E 1B E6 CR LF”
| Field Name | Contents |
| Slave Address | 01 |
| Function | 01 |
| Bytes Count | 05 |
| Data (Coils T27…T20) | CD |
| Data (Coils T35…T38) | 6B |
| Data (Coils T43…T36) | B2 |
| Data (Coils T51…T44) | 0E |
| Data (Coils T56…T52) | 1B |
| Error Check (LRC) | E6 |
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 02 |
| Starting Address Hi | 05 |
| Starting Address Lo | 14 |
| Number of Points Hi | 00 |
| Number of Points Lo | 25 |
| Error Check (LRC) | BF |
PC→PLC “:01 02 05 14 00 25 BF CR LF”
PLC→PC “:01 02 05 CD 6B B2 0E 1B E5 CR LF”
| Field Name | Contents |
| Slave Address | 01 |
| Function | 02 |
| Bytes Count | 05 |
| Data (Coils Y033…Y024) | CD |
| Data (Coils Y043…Y034) | 6B |
| Data (Coils Y053…Y044) | B2 |
| Data (Coils Y063…Y054) | 0E |
| Data (Coils Y070…Y0) | 1B |
| Error Check (LRC) | E5 |
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 03 |
| Starting Address Hi | 06 |
| Starting Address Lo | 14 |
| Number of Points Hi | 00 |
| Number of Points Lo | 08 |
| Error Check (LRC) | DA |
例:从从动装置01读取线圈T20-T27
PC→PLC “:01 03 06 14 00 08 DA CR LF”
PLC→PC “:01 03 10 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 B8 CR LF”
| Field Name | Contents |
| Slave Address | 01 |
| Function | 03 |
| Bytes Count | 10 |
| Data Hi(T20) | 00 |
| Data Lo(T20) | 01 |
| Data Hi(T21) | 00 |
| Data Lo(T21) | 02 |
| Data Hi(T22) | 00 |
| Data Lo(T22) | 03 |
| Data Hi(T23) | 00 |
| Data Lo(T23) | 04 |
| Data Hi(T24) | 00 |
| Data Lo(T24) | 05 |
| Data Hi(T25) | 00 |
| Data Lo(T25) | 06 |
| Data Hi(T26) | 00 |
| Data Lo(T26) | 07 |
| Data Hi(T27) | 00 |
| Data Lo(T27) | 08 |
| Error Check (LRC) | B8 |
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 05 |
| Coil Address Hi | 05 |
| Coil Address Lo | 00 |
| Force Data Hi | FF |
| Force Data Lo | 00 |
| Error Check (LRC) | F6 |
NMNN = 0x0000…Coil OFF
例:强制设定线圈 Y000 ON
PC→PLC “:01 05 05 00 FF 00 F6 CR LF”
PLC→PC “:01 05 05 00 FF 00 F6 CR LF”
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 05 |
| Coil Address Hi | 05 |
| Coil Address Lo | 00 |
| Force Data Hi | FF |
| Force Data Lo | 00 |
| Error Check (LRC) | F6 |
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 06 |
| Register Address Hi | 06 |
| Register Address Lo | 00 |
| Preset Data Hi | 12 |
| Preset Data Lo | 34 |
| Error Check (LRC) | AD |
PC→PLC “:01 06 06 00 12 34 AD CR LF”
PLC→PC “:01 06 06 00 12 34 AD CR LF”
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 06 |
| Register Address Hi | 06 |
| Register Address Lo | 00 |
| Preset Data Hi | 12 |
| Preset Data Lo | 34 |
| Error Check (LRC) | AD |
Case 0 :T0
Q→ :01 06 06 00 12 34 AD CR LF
Case 1 :C0
Q→ :01 06 0E 00 12 34 AF CR LF
Case 2 :C232
Q→ :01 06 0E E8 12 34 56 78 EF CR LF
Case 3 :D10
Q→ :01 06 10 0A 12 34 99 CR LF
Case 4 :D1000
Q→ :01 06 13 E8 12 34 BA CR LF
Function Code :15,Force Multiple Coils
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 0F |
| Coil Address Hi | 05 |
| Coil Address Lo | 00 |
| Quantity of Coils Hi | 00 |
| Quantity of Coils Lo | 0A |
| Byte Count | 02 |
| Force Data Hi | CD |
| Force Data Lo | 01 |
| Error Check (LRC) | 11 |
例:设定线圈 Y007…Y000 = 1100 1101,Y011…Y010 = 01。
PC→PLC “:01 0F 05 00 00 0A 02 CD 01 11 CR LF”
PLC→PC “:01 0F 05 00 00 0A E1 CR LF”
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 0F |
| Register To Address Hi | 05 |
| Register To Address Lo | 00 |
| Preset Data Hi | 00 |
| Preset Data Lo | 0A |
| Error Check (LRC) | E1 |
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 10 |
| Starting Address Hi | 06 |
| Starting Address Lo | 00 |
| Number of Register Hi | 00 |
| Number of Register Lo | 02 |
| Byte Count | 04 |
| Data Hi | 00 |
| Data Lo | 0A |
| Data Hi | 01 |
| Data Lo | 02 |
| Error Check (LRC) | C6 |
例:设定暂存器 T0 为 00 0A, T1 为 01 02。
PC→PLC “:01 10 06 00 02 00 04 00 0A 01 02 D6 CR LF”
PLC→PC “:01 10 06 00 00 02 E7 CR LF”
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 10 |
| Starting Address Hi | 06 |
| Starting Address Lo | 00 |
| Number of Register Hi | 00 |
| Number of Register Lo | 02 |
| Error Check (LRC) | E7 |
Returns a description of controller present at the slave address, the current status of the slave Run indicator, and other information specific to the slave device.
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 11 |
| Error Check (LRC) | EE |
| Field Name | Example (Hex) |
| Heading | 3A |
| Slave Address | 01 |
| Function | 11 |
| Byte Count | 04 |
| Slave ID | 01 |
| Run indicator Status 00 = OFF FF = ON | FF |
| Data 0 (D1001 HI) | 40 |
| Data 1 (D1001 LOW) | 10 |
| Error Check (LRC) | 9A |
| Device | Range | Effective Range | Address |
| S | 000-255 | " 000-127 | 0000-00FF |
| S | 246-511 | 0100-01FF | |
| S | 512-767 | 0200-02FF | |
| S | 768-1023 | 0300-03FF | |
| X | 000-377(8进制) | 000-177(8进制) | 0400-04FF |
| Y | 000-377(8进制) | 000-177(8进制) | 0500-05FF |
| T | 000-255 | 000-127 | 0600-06FF |
| M | 000-255 | " 0000-1279 | 0800-08FF |
| M | 256-511 | 0900-09FF | |
| M | 512-767 | 0A00-OAFF | |
| M | 768-1023 | 0B00-0BFF | |
| M | 1024-1279 | 0C00-0CFF | |
| C | 000-255 | 000-127 232-255 | 0E00-0EFF |
| D | 000-255 | " 000-599 1000-1143 | 1000-10FF |
| D | 256-511 | 1100-11FF | |
| D | 512-767 | 1200-12FF | |
| D | 768-1023 | 1300-13FF | |
| D | 1024-1279 | 1400-14FF |
1、通讯协议ASCII模式,9600,7,e,1
2、通讯资料格式:
| STX | 头码‘:’(3AH) |
| ADR1 | 通讯地址: 8-bit位址包含了2个ASCII码 |
| ADR0 | |
| CMD1 | 命令码: 8-bit命令包含了2个ASCII码 |
| CMD0 | |
| DATA(0) | 资料内容: n个8-bit资料包含了2n个ASCII码 n〈=74个ASCII码 |
| DATA(1) | |
| ……… | |
| DATA(n-1) | |
| LRC CHK1 | 校验码: 8-bit校验码包含了2个ASCII码 |
| LRC CHK0 | |
| END1 | 尾码: END1=CR(0DH),END0=LF(0AH) |
| END0 |
PLC通讯地址出厂设定为0X01,因此(ADR1,ADR0)=‘0’,‘1’→=30H,31H
校验码:
校验码采用LRC方式,将ADR1至最后一个资料内容加总,将该值取2的补数,结果即为LRC校验码。
例:
| STX | ‘:’ |
| ADR1 ADR0 | ‘0’ ‘1’ |
| CMD1 CMD0 | ‘0’ ‘3’ |
| 启始资料地址 | ‘0’ ‘4’ ‘0’ ‘1’ |
| 资料数 | ‘0’ ‘0’ ‘0’ ‘1’ |
| LRC CHK1 LRC CHK0 | ‘F’ ‘6’ |
| END1 END0 | CR LF |
注1:
2补数的求法:(1补数再加1)
0A(H)=00001010(B)先取1补数(将b0-b7反相)得11110101(B),再加1为11110110(B)=F6(H)即为0A(H)的2补数。
注2:
在收到一串完整的通讯命令,要检查这串通讯命令是否有误,只要将(ADR1,0)至(LRC1,0)加总等于0,则通讯无误,否则表示命令中资料有些是错误的。
通讯异常PLC的回应:
PLC收到完整的通讯命令时,会判断命令是否有效,造成无效的原因有:
| 原 因 | 例外码 |
| 校验码错误 | 07 |
| 错误的装置地址 | 02 |
| 要求的资料超过范围 | 03 |
| 命令码错误 | 01 |
| 通讯格式错误 | 07 |
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令码 | 01 |
| 启始地址高位 | 04 |
| 启始地址低位 | 00 |
| 资料高位 | 00 |
| 资料低位 | 10 |
| 校验码(LRC) | EA |
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令码 | 81 |
| 例外码 | 02 |
| 校验码(LRC) | 7C |
可用的命令码叙述如下:(每个装置的地址,请参考最后一页)
| 命令码 | 功能 | 作用范围 |
| 01 | 读线圈状态 | S,Y,M,T,C |
| 02 | 读输入状态 | S,X,Y,M,T,C |
| 03 | 读寄存器值 | T,C,D |
| 05 | 设定单一线圈 | S,Y,M,T,C |
| 06 | 预设单一寄存器 | T,C,D |
| 15 | 设定多个线圈 | S,Y,M,T,C |
| 16 | 预设多个寄存器 | T,C,D |
| 17 | 状态、机种报告 | None |
命令码 :01,读取线圈状态
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 01 |
| 启始地址高位 | 06 |
| 启始地址低位 | 14 |
| 资料高位 | 00 |
| 资料低位 | 25 |
| 校验(LRC) | BF |
例:从从动装置01读取线圈T20-T56
PC→PLC “:01 01 06 14 00 25 BF CR LF”
PLC→PC “:01 01 05 CD 6B B2 0E 1B E6 CR LF”
| 名称 | 内容 |
| 从站地址 | 01 |
| 命令 | 01 |
| 字节数 | 05 |
| 数据(线圈 T27…T20) | CD |
| 数据(线圈T35…T38) | 6B |
| 数据(线圈T43…T36) | B2 |
| 数据(线圈T51…T44) | 0E |
| 数据(线圈T56…T52) | 1B |
| 校验码 | E6 |
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 02 |
| 启始地址高位 | 05 |
| 启始地址低位 | 14 |
| 资料高位 | 00 |
| 资料低位 | 25 |
| 校验(LRC) | BF |
PC→PLC “:01 02 05 14 00 25 BF CR LF”
PLC→PC “:01 02 05 CD 6B B2 0E 1B E5 CR LF”
| 名称 | 内容 |
| 从站地址 | 01 |
| 命令 | 02 |
| 字节数 | 05 |
| 数据(线圈Y033…Y024) | CD |
| 数据(线圈Y043…Y034) | 6B |
| 数据(线圈Y053…Y044) | B2 |
| 数据(线圈Y063…Y054) | 0E |
| 数据(线圈Y070…Y0) | 1B |
| 校验(LRC) | E5 |
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 03 |
| 启始地址高位 | 06 |
| 启始地址低位 | 14 |
| 读取长度高位 | 00 |
| 读取长度低位 | 08 |
| 校验(LRC) | DA |
例:从从动装置01读取线圈T20-T27
PC→PLC “:01 03 06 14 00 08 DA CR LF”
PLC→PC “:01 03 10 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 B8 CR LF”
| 名称 | 内容 |
| 从站地址 | 01 |
| 命令 | 03 |
| 字节数 | 10 |
| 数据高位(T20) | 00 |
| 数据低位(T20) | 01 |
| 数据高位(T21) | 00 |
| 数据低位(T21) | 02 |
| 数据高位(T22) | 00 |
| 数据低位(T22) | 03 |
| 数据高位(T23) | 00 |
| 数据低位(T23) | 04 |
| 数据高位(T24) | 00 |
| 数据低位(T24) | 05 |
| 数据高位(T25) | 00 |
| 数据低位(T25) | 06 |
| 数据高位(T26) | 00 |
| 数据低位(T26) | 07 |
| 数据高位(T27) | 00 |
| 数据低位(T27) | 08 |
| 校验(LRC) | B8 |
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 05 |
| 线圈地址高位 | 05 |
| 线圈地址低位 | 00 |
| 设定数据高位 | FF |
| 设定数据低位 | 00 |
| 校验(LRC) | F6 |
NMNN = 0x0000…线圈 OFF
例:强制设定线圈 Y000 ON
PC→PLC “:01 05 05 00 FF 00 F6 CR LF”
PLC→PC “:01 05 05 00 FF 00 F6 CR LF”
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 05 |
| 线圈地址高位 | 05 |
| 线圈地址低位 | 00 |
| 设定数据高位 | FF |
| 设定数据低位 | 00 |
| 校验(LRC) | F6 |
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 06 |
| 预设地址高位 | 06 |
| 预设地址低位 | 00 |
| 预设数据高位 | 12 |
| 预设数据低位 | 34 |
| 校验(LRC) | AD |
PC→PLC “:01 06 06 00 12 34 AD CR LF”
PLC→PC “:01 06 06 00 12 34 AD CR LF”
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 06 |
| 预设地址高位 | 06 |
| 预设地址低位 | 00 |
| 预设数据高位 | 12 |
| 预设数据低位 | 34 |
| 校验(LRC) | AD |
Case 0 :T0
Q→ :01 06 06 00 12 34 AD CR LF
Case 1 :C0
Q→ :01 06 0E 00 12 34 AF CR LF
Case 2 :C232
Q→ :01 06 0E E8 12 34 56 78 EF CR LF
Case 3 :D10
Q→ :01 06 10 0A 12 34 99 CR LF
Case 4 :D1000
Q→ :01 06 13 E8 12 34 BA CR LF
命令码:15,设定多个线圈
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 0F |
| 线圈地址高位 | 05 |
| 线圈地址低位 | 00 |
| 线圈数量高位 | 00 |
| 线圈数量低位 | 0A |
| 位元数 | 02 |
| 设定数据高位 | CD |
| 设定数据低位 | 01 |
| 校验(LRC) | 11 |
例:设定线圈 Y007…Y000 = 1100 1101,Y011…Y010 = 01。
PC→PLC “:01 0F 05 00 00 0A 02 CD 01 11 CR LF”
PLC→PC “:01 0F 05 00 00 0A E1 CR LF”
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 0F |
| 寄存器地址高位 | 05 |
| 寄存器地址低位 | 00 |
| 预设数据高位 | 00 |
| 预设数据低位 | 0A |
| 校验(LRC) | E1 |
| 名称 | 例码 (Hex) | |
| 头码 | 3A | |
| 从站地址 | 01 | |
| 命令 | 10 | |
| 启始地址高位 | 06 | |
| 启始地址低位 | 00 | |
| 资料高位 | 寄存器数目 | 00 |
| 资料低位 | 02 | |
| 字节数 | 04 | |
| 数据高位 | 00 | |
| 数据低位 | 0A | |
| 数据高位 | 01 | |
| 数据低位 | 02 | |
| 校验(LRC) | C6 | |
例:设定暂存器 T0 为 00 0A, T1 为 01 02。
PC→PLC “:01 10 06 00 00 02 04 00 0A 01 02 D6 CR LF”
PLC→PC “:01 10 06 00 00 02 E7 CR LF”
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 10 |
| 启始地址高位 | 06 |
| 启始地址低位 | 00 |
| 资料高位 | 00 |
| 资料低位 | 02 |
| 校验(LRC) | E7 |
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 17 |
| 校验(LRC) | EE |
| 名称 | 例码 (Hex) |
| 头码 | 3A |
| 从站地址 | 01 |
| 命令 | 11 |
| 位元数 | 04 |
| 从站 ID | 01 |
| 运行状态指示 00 = OFF FF = ON | FF |
| 数据 0 (D1001 高) | 40 |
| 数据 1 (D1001 低) | 10 |
| 校验 (LRC) | 9A |
| 装置 | 范围 | 有效范围 | 地址 |
| S | 000-255 | " 000-127 | 0000-00FF |
| S | 246-511 | 0100-01FF | |
| S | 512-767 | 0200-02FF | |
| S | 768-1023 | 0300-03FF | |
| X | 000-377(8进制) | 000-177(8进制) | 0400-04FF |
| Y | 000-377(8进制) | 000-177(8进制) | 0500-05FF |
| T | 000-255 | 000-127 | 0600-06FF |
| M | 000-255 | " 0000-1279 | 0800-08FF |
| M | 256-511 | 0900-09FF | |
| M | 512-767 | 0A00-OAFF | |
| M | 768-1023 | 0B00-0BFF | |
| M | 1024-1279 | 0C00-0CFF | |
| C | 000-255 | 000-127 232-255 | 0E00-0EFF |
| D | 000-255 | " 000-599 1000-1143 | 1000-10FF |
| D | 256-511 | 1100-11FF | |
| D | 512-767 | 1200-12FF | |
| D | 768-1023 | 1300-13FF | |
| D | 1024-1279 | 1400-14FF |