什么是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