谷动谷力

 找回密码
 立即注册
查看: 1347|回复: 0
打印 上一主题 下一主题
收起左侧

PLC使用的是MODBUS-RTU通讯协议详解

[复制链接]
跳转到指定楼层
楼主
发表于 2022-9-17 15:16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PLC使用的是MODBUS-RTU通讯协议,MODBUS协议详细定义了校验码、数据序列等,这些都是特定数据交换的必要内容。MODBUS协议在一根通讯线上 使用主从应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,终端设备发出的应答信号以相反的方向传输给主机。MODBUS协议只允许在主机(PC,PLC等)和终端设备之间通讯,而不允许独立的终端设备之间的数据交换,这样各终端设备不会在它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。


1.MODBUS功能码简述

    下表列出MODBUS支持的部分功能代码:以十进制表示。

表1.1 MODBUS部分功能码

代码

中文名称

寄存器 PLC地址范围

位操作/字操作

操作数量

01

读线圈状态

Y(0-1000),M(1000-2000)

位操作(Y,M)

单个或多个

02

读离散输入状态

X(0-1000)

位操作

单个或多个

03

读保持寄存器

G(2000-3000),W(3000-4000),Ao(5000-5100),

T(8000-9000),C(9000-10000),Z(11000-15000)

字操作

单个或多个

04

读输入寄存器

环中间变量(0-5000),Ai(5000-5100),Ed(5100)

字操作

单个或多个

05

写单个线圈

Y(0-1000),M(1000-2000)

位操作

单个

06

写单个保持寄存器

G(2000-3000),W(3000-4000),Ao(5000-5100),

T(8000-9000),C(9000-10000),Z(11000-15000)

字操作

单个

15

写多个线圈

Y(0-1000),M(1000-2000)

位操作

多个

16

写多个保持寄存器

G(2000-3000),W(3000-4000),Ao(5000-5100),

T(8000-9000),C(9000-10000),Z(11000-15000)

字操作

多个

1.1功能码说明

    功能码可以分为位操作和字操作两类。位操作的最小单位为BIT,字操作的最小单位为两个字节。

        【位操作指令】    读线圈状态01H,读(离散)输入状态02H,写单个线圈06H和写多个线圈0FH。

        【字操作指令】    读保持寄存器03H,写单个寄存器06H,写多个保持寄存器10H。

1.2寄存器地址分配

表1.2 MODBUS寄存器地址分配

寄存器PLC地址

寄存器协议地址

适用功能

寄存器种类

读写状态

00000-09999

0000H-FFFFH

01H 05H 0FH

线圈状态

可读可写

00000-09999

0000H-FFFFH

02H

离散输入状态

可读

00000-09999

0000H-FFFFH

04H

输入寄存器

可读

00000-49999

0000H-FFFFH

03H 06H 0FH

保持寄存器

可读可写



1.3寄存器种类说明



表1.3 MODBUS寄存器种类说明

寄存器种类

说明

PLC类比

举例说明

线圈

状态

输出端口。可设定端口的输出状态,

也可以读取该位的输出状态。可分

为两种不同的执行状态,例如保持

型或边沿触发型。

Y

数字量输出

电磁阀输出,MOSFET输出,LED显示等。

离散

输入状态

输入端口。通过外部设定改变输入

状态,可读但不可写。

X

数字量输入

拨码开关,接近开关等。

保持

寄存器

输出参数或保持参数,控制器运行

时被设定的某些参数。可读可写。

AO

模拟量输出

模拟量输出设定值,PID运行参数,

变量阀输出大小,传感器报警上限下限。

输入

寄存器

输入参数。控制器运行时从外部设

备获得的参数。可读但不可写。

AI

模拟量输入

模拟量输入



1.4 PLC地址和协议地址区别

    PLC地址可以理解为协议地址的变种,在触摸屏和PLC编程中应用较为广泛。

1.4.1 寄存器PLC地址

    寄存器PLC地址指存放于控制器中的地址,这些控制器可以是PLC,也可以使触摸屏,或是文本显示器。

1.4.2 寄存器协议地址

    寄存器协议地址指指通信时使用的寄存器地址,例如PLC地址4x2001对应寻址地址G1,4x2002对应寻址地址G2,寄存器寻址地址使用10进制描述。再如,PLC寄存器地址3x5000对应协议地址Ai1,PLC寄存器地址4x5000对应协议地址Ao1,虽然两个PLC寄存器寄存器通信时使用相同的地址,但是需要使用不同的命令访问,所以访问时不存在冲突。

2、协议、字节格式说明

协议采用MODBUS 协议,RTU 模式,默认参数如下。

波特率: 19200

数据位: 8

校验位: Even(偶校验)

停止位 : 1



3、MODBUS 协议简单说明

1. 帧基本格式 主机请求命令

地址              功能代码     起始地址   数据长度        CRC
(1 个字节) (1 个字节)    (2 个字节)  (2 个字节)(2 个字节)

从机回应命令
地址              功能代码       数据长度    数据域       CRC
(1 个字节) (1 个字节)    (2 个字节)  (数据长度)(2 个字节)

从机回应的地址和功能码和主机请求命令相同,数据长度和主机的数据长度相同,数据 内容字节数和数据长度有关,字节数 n=数据长度 L*2



4、具体指令说明:

4.1读离散输入状态  (适用于1x开头的位状态)

<02 Read Discrete Inputs(1x)>

如主机读取PLC输入端X2端口的状态

Modbus RTU 主机发送

地址

(1 个字节)

功能代码

(1 个字节)

起始地址

(2 个字节)

数据长度

(2 个字节)

CRC

(2 个字节)

01

02

00 02

00 01

18 0A

PLC返回

地址

(1 个字节)

功能代码

(1 个字节)

数据长度



数据内容



CRC

(2 个字节)

0102

01

00

A1 88

例:

a 读取PLC输入端X2端口的状态


主机发送 01 02 00 02 00 01 18 0A

如果X2是断状态,则返回数据 01 02 01 00 A1 88

如果X2是通状态,则返回数据 01 02 01 01 60 48



b 读取PLC输入端X2->X6端口的状态


主机发送 01 02 00 02 00 05 19 C9

如果是全断状态,则返回数据 01 02 01 00 A1 88

如果X2,X3是通状态,则返回数据 01 02 01 03 E1 89 ,0x03的二进制码为0000 0011,则表示从起始地址两位X2,X3是通的。



4.2 读线圈状态  (适用于0x开头的位状态)

<01 Read Coils(0x)>

如主机读取PLC输出端Y2端口的状态

Modbus RTU 主机发送

地址

(1 个字节)

功能代码

(1 个字节)

起始地址

(2 个字节)

数据长度

(2 个字节)

CRC

(2 个字节)

01

01

00 02

00 01

5C 0A

PLC返回

地址

(1 个字节)

功能代码

(1 个字节)

数据长度



数据内容



CRC

(2 个字节)

0101

01

00

51 88

例:

a.读取PLC输出端Y2端口的状态


主机发送 01 01 00 02 00 01 5C 0A

如果Y2是断状态,则返回数据 01 01 01 00 51 88

如果Y2是通状态,则返回数据 01 01 01 01 90 48



b读取PLC输出端Y2-Y11端口的状态


主机发送 01 01 00 02 00 0A 1D CD

如果Y2是通状态,则返回数据 01 01 02 01 00 B8 6C

注意: 如果用Modbus Poll读取多个位状态,则地址位需要是8的整数倍,如读M1060-M1065的状态,则起始地址为0x1056起读16个



4.3 读保持寄存器  (适用于4x开头的寄存器)

<03 Read Holding Registers(4x)>

如主机读取PLC通用寄存器G1的值


Modbus RTU 主机发送

G1地址2001,转16进制是0x07D1

主机发送 01 03 07 D1 00 02 95 46

如:返回数据 01 03 04 00 64 00 C8 BA 7A

G1的值是0x0064,转10进制值100

G2的值是0x00C8,转10进制值200



4.4 读输入寄存器  (适用于3x开头的寄存器)

<04 Read Input Registers(3x)>

如主机读取PLC中时序环0的当前帧


Modbus RTU 主机发送

0环的当前帧地址是3x2

主机发送 01 04 00 02 00 01 90 0A

如:返回数据 01 04 02 00 01 78 F0

当前帧为第1帧

如:返回数据 01 04 02 00 03 F9 31

当前帧为第3帧



4.5 写单个线圈 (适用于0x开头的位状态)

<05 Write Single Coil(0x)>

如主机发送指令控制Y4通断 (Y4的地址是0x04)


如触发Y4通

主机发送:   01 05 00 04 FF 00 CD FB

返回数据    01 05 00 04 FF 00 CD FB

如触发Y4断

主机发送:   01 05 00 04 00 00 8C 0B

返回数据    01 05 00 04 00 00 8C 0B



4.6 写单个保持寄存器  (适用于4x开头的寄存器)

<06 Write Single Register(4x)>

如主机发送指令修改G1的值 (G1的地址是4x2001)


如修改G1的值为10

主机发送:   01 06 07 D1 00 0A 58 80

返回数据    01 06 07 D1 00 0A 58 80

如修改G1的值为500

主机发送:   01 06 07 D1 01 F4 D8 90

返回数据    01 06 07 D1 01 F4 D8 90



4.6 写多个线圈   (适用于0x开头的位状态)

<15 Write Multiple Coils(0x)>

如主机发送指令控制M10-M14通断 (M10的地址是0x1010)


如触发M10断,M11通,M12通,M13断,M14断,则发送的二进制码为00110

主机发送:   01 0F 03 F2 00 05 01 06 D6 B2

03 F2 是地址 1010的16进制数。

00 05 是位数据个数。

01    数据占用字节数

06    需要控制的状态 00110

返回数据    01 0F 03 F2 00 05 34 7F



4.7 写多个保持寄存器   (适用于0x开头的位状态)

<15 Write Multiple Coils(0x)>

如主机发送指令修改G0-G2的值 (G1的地址是4x2000)


如修改G0=4,G1=5,G2=6

主机发送:   01 10 07 D0 00 03 06 00 04 00 05 00 06 99 9E

07 D0 是G0地址 2000的16进制数。

00 03 是需要修改的数据个数。

06    数据占用字节数

00 04 第一个数值

00 05 第二个数值

00 06 第三个数值

99 9E CRC校验

返回数据    01 10 07 D0 00 03 80 85

作者:jenasi https://www.bilibili.com/read/cv17692469/ 出处:bilibili

+10
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|深圳市光明谷科技有限公司|光明谷商城|Sunshine Silicon Corpporation ( 粤ICP备14060730号|Sitemap

GMT+8, 2024-5-18 20:47 , Processed in 0.105900 second(s), 39 queries .

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表