- 1. 读取输出线圈
- 2. 读取输入线圈
- 3. Read and hold register
- 4. Read input register
- 5. 预置单线圈
- 6. 预置单register
- 7. 预置多线圈
- 8. 预置多register
ModbusTCP与Modbus UDP的messageformat是一样的,它们之间的区别其实就是TCP与UDP的区别,因此下面就针对ModbusTCP的协议进行分析,Modbus TCP与Modbus Rtu(ModbusASCII)之间的区别如下图:

从上图可以看出,ModbusTCP在Modbus串行通信的基础上,去除了校验(由于TCP本身就带有checksum)和Device address(ModbusTCP弱化了Device address,用IPaddress来取代),再加上MBAPmessage头(占7 bytes),下面针对MBAP进行分析说明:
| 域 | Length | 说明 | 客户机 | 服务器 |
|---|---|---|---|---|
| 事务处理标识符 | 2byte | ModbusRequest/Response事务处理的标识 | 客户机启动 | CopyResponse |
| Protocol Identifier | 2byte | 0=Modbus协议 | 客户机启动 | CopyResponse |
| Length | 2byte | Length之后的byte总数 | 客户机启动 | 服务器启动 |
| Unit identifier | 1byte | 串行链路或其它总线的从站识别 | 客户端启动 | CopyResponse |
下面针对具体message进行分析,Modbus协议在以太网链路上的messageformat如下所示:
| 事务处理标识符 | Protocol Identifier | Length | Unit identifier | function code | data |
|---|---|---|---|---|---|
| 2 bytes | 2 bytes | 2 bytes | 1 byte | 1 byte | N bytes |
有了以上理论基础之后,下面针对各个function code进行详细分析:
读取输出线圈
sendmessageformat如下:

sendmessage含义:读取服务器1号从站输出线圈,starting address为0x13=19,对应address为00020,线圈quantity为0x1B=27,即读取1号从站输出线圈,address从00020-00046,共27个线圈的状态值。
这里值得注意一下,协议中的starting address指的是索引,后面的address指的是具体address,对于任意一个存储区,索引都是从0开始的,但是对应的具体address,与存储区是Related的,比如输出线圈,0对应00001;输入线圈,0对应10001;输入register,0对应30001;保持register,0对应40001。
返回messageformat如下:

返回message含义:返回服务器1号从站输出线圈00020-00046,共27个线圈的状态值,返回byte count为4个,分别为CD 6B B2 05。
CD=1100 1101 对应 00020-00027
6B=0110 1011 对应 00028-00035
B2=1011 0010 对应 00036-00043
05=0000 0101 对应 00044-00046
读取输入线圈
sendmessageformat如下:

sendmessage含义:读取服务器1号从站输入线圈,starting address为0xC4=196,对应address为10197,线圈quantity为0x1D=29,即读取1号从站输入线圈,address从10197-10225,共29个线圈的状态值。
返回messageformat如下:

返回message含义:返回服务器1号从站输入线圈10197-10225,共29个线圈的状态值,返回byte count为4个,分别为CD 6B B2 05。
CD=1100 1101 对应 10197-10204
6B=0110 1011 对应 10205-10212
B2=1011 0010 对应 10213-10220
05=0000 0101 对应 10221-10225
Read and hold register
sendmessageformat如下:

sendmessage含义:读取服务器1号从站保持register,starting address为0x6B=107,对应address为40108,number of registers为0x02=2,即读取1号从站保持register,address从40108-40109,共2个register的numerical value。
返回messageformat如下:

返回message含义:返回服务器1号从站保持register40108-40109,共2个register的numerical value,返回byte count为4个,分别为02 2B 01 06,40108对应numerical value为0x022B,40109对应numerical value为0x0106。
Read input register
sendmessageformat如下:

sendmessage含义:读取服务器1号从站输入register,starting address为0x6B=107,对应address为30108,number of registers为0x02=2,即读取1号从站保持register,address从30108-30109,共2个register的numerical value。
返回messageformat如下:

返回message含义:返回服务器1号从站输入register30108-30109,共2个register的numerical value,返回byte count为4个,分别为02 2B 01 06,30108对应numerical value为0x022B,30109对应numerical value为0x0106。
预置单线圈
sendmessageformat如下:

sendmessage含义:预置服务器1号从站单个线圈的值,Coil address为0x00AC=172,对应address为00173,断通标志0xFF00表示置位,0x000表示复位,即置位1号从站输出线圈00173。
返回messageformat如下:

返回message含义:预置单输出线圈原message返回。
预置单register
sendmessageformat如下:

sendmessage含义:预置服务器1号从站单个保持register的值,register address为0x0087=135,对应address为40136,写入值为0x039E,即预置1号从站保持register40136值为0x039E。
返回messageformat如下:

返回message含义:预置单保持register原message返回。
预置多线圈
sendmessageformat如下:

sendmessage含义:预置服务器1号从站多个线圈的值,Coil address为0x0013=19,对应address为00020,线圈数为0x0A=10,写入值为0xCD00,即预置1号从站线圈00020-00027=0xCD=1100 1101,00028-00029=0x00=0000 0000。
返回messageformat如下:

返回message含义:预置多输出线圈返回message是在原message基础上除去byte count及具体byte后返回。
预置多register
sendmessageformat如下:

sendmessage含义:预置服务器1号从站多个register的值,register address为0x0087=135,starting address为40136,number of registers为0x02=2,Endaddress为40137,写入值为0xCD00和0x0A10,即预置1号从站register40136=0x0105,40137=0x0A10。
返回messageformat如下:

返回message含义:预置多保持register返回message是在原message基础上除去byte count及具体byte后返回。
发表回复