|
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
|