Modbus教程

四种寄存器说明

线圈状态(coil status 输出端口 对应PLC DO(数字输出)如电磁阀,MOSFET输出

离散输入状态(input status)输入端口 对应PLC DI(数字输入) ,如拨码开关,接近开关

保持寄存器(holding Register)输出参数 对应PLC AO (模拟输出)。

输入寄存器(input  Register)输入参数,对应PLC AI(模拟输入)。

图1:

 

寄存器种类

寄存器PLC地址(address)

Modbus协议地址

简称

读写状态

线圈状态

00001~09999

0000~FFFF (address-1)

0X

读写

离散输入状态

10001~19999

0000~FFFF(address-10001)

1X

保持寄存器

40001~49999

0000~FFFF(address-40001)

4x

读写

输入寄存器

30001~39999

0000~FFFF(address-30001)

3X

 

注意:程序(代码中)实际使用的是0~FFFF的地址,和PLC地址的关系如上图。PLC地址开头0,1,4,3实际表明了操作的是何种寄存器。

 

Modbus报文主要由四个部分组成。设备地址,功能码,数据域,校验。

功能码

如下图:图2

功能码

名称

寄存器PLC地址

位、子操作

操作数量

01

读线圈

 见图1,下同

1或多

02

读离散输入

 

1或多

03

读保持寄存器

 

1或多

04

读输入寄存器

 

1

05

写单个线圈

 

1

06

写单个保持寄存器

 

1

15

写多个线圈

 

16

写多个保持寄存器

 

软件说明

下面以Modbus Poll 和Modbus Slave为例,说明Modbus协议具体内容。

下载这个两个软件,版本6.X,注册码分别是

slave
5455415451475662

master
5A5742575C5D10

 对于Slave

F8设置:

1.从机地址

2.设置四种寄存器的一个,配置其开始地址和地址数量。

F3连接设置,默认就好,Modbus master同理。

 点击Display ->Commnunications查看通信数据。Master相同。

对于Master

F8配置

1.从机地址

2.图2 中八种功能码中 的一种

3起始地址(已经给出40011对应10这样的例子)。

4数据量。

5扫描频率。

 

协议格式 

读协议

报文格式:

主===> 从

从设备地址,功能码,起始地址,寄存器数量,校验。

从===>主

从设备地址,功能码,数据域字节数,数据域,校验。

说明:起始地址和寄存器数量都是big endian (高字节在前,低字节在后),short类型。

从设备返回的数据域构成:对于位类型,会把每8个位合并成一个byte类型。

对于字类型,N个寄存器会有N*2个字节,按照高字节在前,低字节在后的顺序。

例1:01读线圈状态

slave id为34,寄存器选项为0X,设置起始地址2000,数量20,

具体数据如图所示

Master配置成

读取线圈状态:从设备ID为34,起始地址2000,数量为20的。

通信数据

下行:22 01 07 D0 00 14 3B DB

上行:22 01 03 07 03 03 CA 2D

例2:02读取离散输入状态

读取从设备ID 为1,起始地址为0,数量20个离散输入寄存器

通信数据:

下行:01 02 00 00 00 14 78 05

上行:01 02 03 03 03 03 C8 BF

例3:03读取保持寄存器

从设备id 50,地址60,数量3

通信数据:

下行:32 03 00 3C 00 03 C0 04

上行:32 03 06 0C 8E 00 38 00 29 49 44

例4:04读取输入寄存器

从设备ID 24,起始地址0,数量4

通信数据:

下行:18 04 00 00 00 04 F3 C0

上行:18 04 08 00 0C 00 2D 00 0B 00 2A CE 4A

写协议

 报文格式:

单个数据

主===>从:从设备ID,功能码,起始地址,变更数据,校验。

从===>主:从设备ID,功能码,起始地址,变更数据,校验。

多个数据

主===>从:从设备ID,功能码,起始地址,寄存器数量,字节数量,变更数据,校验

从===>主:从设备ID,功能码,起始地址,寄存器数量,校验

起始地址和寄存器数量都是2个字节。

例5:05写单个线圈

设置从设备ID 为24,寄存器地址56,在数据编辑框中写1或者0

通信数据:18 05 00 38 FF 00 0F FE,返回相同。

如果对线圈写0,通信数据变为18 05 00 38 00 00 4E 0E

例6:06写单个保持寄存器

从设备ID,为1,寄存器地址50,写一个数据52

通信数据:01 06 00 32 00 34 29 D2,返回相同。

例7:15写多个线圈

从设备ID为100,寄存器地址50 ,数量20个,写数据如下图

通信数据:

下行:64 0F 00 32 00 14 03 03 07 03 E2 29

上行:64 0F 00 32 00 14 FD FE

 例8:16写多个保持寄存器

从设备ID为48,寄存器地址100,数量为4

写入如下数据

通信数据:

下行:30 10 00 64 00 04 08 01 01 00 33 00 17 00 09 93 2B

 上行:30 10 00 64 00 04 84 34

 异常响应

报文格式:从设备ID,功能码,异常码,校验

返回报文将功能码最高位置为1,

异常码说明:

01 非法功能码

02 非法数据地址

03非法数据值

04从设备故障

参考文档:

https://wenku.baidu.com/view/d233d09feff9aef8941e0698.html

原文地址:https://www.cnblogs.com/legion/p/9404229.html