Modbus

来自Jack's Lab
(版本间的差异)
跳转到: 导航, 搜索
(Overview)
第2行: 第2行:
  
 
[[文件:Modbus-rtu-framec.jpg]]
 
[[文件:Modbus-rtu-framec.jpg]]
 +
  
 
'''相关标准:'''
 
'''相关标准:'''
  
 
* [CJ/T224-2012 电子远传水表 ]
 
* [CJ/T224-2012 电子远传水表 ]
 +
* [DL/T645-2007 多功能电能表通信协议]
 +
* [[Bim]]
  
 
<br>
 
<br>

2019年11月21日 (四) 09:31的版本

目录

1 Overview

Modbus-rtu-framec.jpg


相关标准:

  • [CJ/T224-2012 电子远传水表 ]
  • [DL/T645-2007 多功能电能表通信协议]
  • Bim


1.1 Address

Valid slave device addresses are in the range of 0 ... 247 (decimal).

The individual slave devices are assigned addresses in the range of 1... 247.

Value 0 is reserved for broadcast messages (no response).

When the slave sends its response, it places its own address in this address field of the response frame to let the master know which slave is responding.


1.2 Function

Valid codes are in the range of 1... 255 (decimal).

The function code field tells the slave what kind of action to perform.

For a normal response, the slave simply echoes the original function code.

For an exception response, the slave returns a code that is equivalent to the original function code with its most significant bit set to a logic 1.

All Modbus devices recognize the same set of function codes.


1.3 Data

The data field contains additional information which the slave must use to take the action defined by the function code.

This can include items like register addresses, quantity of items to be handled, etc.

If no error occurs, the data field contains the data requested. If an error occurs, the field contains an exception code that the master application can use to determine the next action to be taken.


1.4 CRC

The checksum is calculated by the master and sent to the slave.

The checksum is re-calculated by the slave and compared to the value sent by the master. If a difference is detected, the slave will not construct a response to the master.



2 Function

2.1 Discrete Coils/Flags

  • 0x01 - Read Coils
  • 0x02 - Read Discrete Inputs
  • 0x05 - Write Single Coil
  • 0x0F - Write Multiple Coils


2.2 Registers

  • 0x03 - Read Holding Registers
  • 0x04 - Read Input Registers
  • 0x06 - Write Single Register
  • 0x10 - Write Multiple Registers
  • 0x16 - Mask Write Register
  • 0x17 - Read Write Multiple Registers



3 CRC

uint16_t crc16(const uint8_t *data, uint16_t len)
{
    static const uint16_t crc_table[] = {
        0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
        0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
        0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
        0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
        0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
        0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
        0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
        0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
        0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
        0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
        0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
        0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
        0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
        0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
        0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
        0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
        0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
        0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
        0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
        0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
        0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
        0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
        0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
        0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
        0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
        0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
        0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
        0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
        0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
        0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
        0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
        0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
    };

    uint8_t temp;
    uint16_t crcw = 0xFFFF;

    while (len--) {
        temp = *data++ ^ crcw;
        crcw >>= 8;
        crcw ^= crc_table[temp];
    }

    return crcw;
}



4 Examples

4.1 Broadcast to read meter addr

Send:

0x00 0x03 0x0000 0x0001 0x85DB


Received:

0x01 0x03 0x02 0x0001 0x7984
0x17 0x03 0x02 0x0001 0x7777



5 Tools

























个人工具
名字空间

变换
操作
导航
工具箱