什么是Modbus

1. Modbus如何工作

Modbus是通过设备之间的几根连线来传递数据,最简单的设置就是主站和从站之间用一跟串口线相连。数据通过一串0或者1来传递,也就是位。0为正电压,1为负电压。位数据传递速度非常快,常见的传输速度为9600波特(即9600bits/s).

2. 标准Modbus怎么存储数据

信息存储在从站的四个不同的表中。两个表存储数字量,称为线圈;两个表存储模拟量,称为寄存器。线圈和寄存器分别有一个只读,另一个可读写。每个表可存储9999个值。线圈是一位的,地址从0000到270E;寄存器是一个字的(16位,2字节)地址也是从0000到270E.

Coil/Register Numbers Data Addresses Type Table Name
1-9999 0000 to 270E Read-Write Discrete Output Coils
10001-19999 0000 to 270E Read-Only Discrete Input Contacts
30001-39999 0000 to 270E Read-Only Analog Input Registers
40001-49999 0000 to 270E Read-Write Analog Output Holding Registers

线圈/寄存器编号可以看做是位置的名字,它们不出现在实际发送的信息当中,数据地址(Data Address)出现在实际发送的信息中。

举个例子,第一个Holding Register的编号为40001,数据地址为0000.这两个数字的区别在于偏移量。

3. 什么是从站ID

在网络中,每一个从机分配一个唯一的设备地址,从1到247.当主机请求数据时,发送的信息的第一个字节就是从机地址,这样,从机接收到第一个字节后就知道是否忽略信息。

4. 什么是功能码

主机发送的第二个字节就是功能码。这个功能码告诉从机需要访问哪个表,是向这个表中写数据还是读数据。

Fun Code Action Table Name
01(01 hex) Read Discrete Output Coils
05(05 hex) Write single Discrete Output Coil
15(0F hex) Write multiple Discrete Output Coils
02(02 hex) Read Discrete Input Contacts
04(04 hex) Read Analog Input Registers
03(03 hex) Read Analog Output Holding Registers
06(06 hex) Write single Analog Output Holding Register
16(10 hex) Write multiple Analog Output Holding Registers

5. 什么是CRC

CRC即循环冗余校验码(Cyclic Redundancy check),是在每一个发送的信息后面加上的两字节,用于检验发送和接受是否出错。信息中的每一个字节都用于计算CRC。接受设备同时计算CRC,然后与发送方计算的CRC进行比较,如果两者不同,则产生错误。

6. Modbus发送指令和回应的格式

Modbus发送指令和回应的格式

Data Addresses Read Write Single Write Multiple
Discrete Output Coils 0xxxx FC01 FC05 FC15
Discrete Input Contacts 1xxxx FC02 NA NA
Analog Input Registers 3xxxx FC04 NA NA
Analog Output Holding Registers 4xxxx FC03 FC06 FC16

注:FC表示Function Code

eg1.

数据请求:
11 01 0013 0025 0E84
11: 从机地址 (0x11 = 17 )
01: 功能码01(读线圈状态)
0013: 线圈首地址(0x0013=19,+1偏移量=#20线圈)
0025: 要读的线圈数 (0x25 = 37, 20~56 )
0E84: CRC校验和

回应
11 01 05 CD6BB20E1B 45E6
11: 从机地址 (0x11 = 17 )
01: 功能码01(读线圈状态)
05:后面的字节数(37/8=5字节)
CD:线圈27 - 20 (1100 1101)
6B: 线圈35 - 28 (0110 1011)
B2: 线圈43 - 36 (1011 0010)
0E: 线圈51 - 44 (0000 1110)
1B: 3空格和线圈56 - 52 (0001 1011)
45E6: CRC校验和

其他例子与此类似,不再赘述。

来源:simplyModbus