什么是Modbus

1. Modbus如何工作

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

java modbus设备寄存器数据 modbus寄存器值_从站

java modbus设备寄存器数据 modbus寄存器值_Data_02

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