ModbusTCP协议 通讯详解

工作中需要与plc进行通讯 通讯协议为ModbusTCP    学习记录   (以下报文默认16进制)

1.报文格式

ModbusTCP与ModbusUDP的报文格式是一样的,它们之间的区别其实就是TCP与UDP的区别,因此下面就针对ModbusTCP的协议进行分析,ModbusTCP与ModbusRtu(ModbusASCII)之间的区别如下图:

从上图可以看出,ModbusTCP在Modbus串行通信的基础上,去除了校验(由于TCP本身就带有校验和)和设备地址(ModbusTCP弱化了设备地址,用IP地址来取代),再加上MBAP报文头(占7 bytes),下面针对MBAP进行分析说明:

长度 说明
事务处理标识符 2字节

  Modbus请求/响应事务处理的标识

(默认00 00)

协议标识符 2字节 (默认00 00)
报文长度 2字节 报文长度之后的字节总数
单元标识符 1字节 串行链路或其他总线的从站识别(默认01)

下面针对具体报文进行分析,Modbus协议在以太网链路上的报文格式如下所示:

事务处理标识符 协议标识符 报文长度 单元标识符 功能码 数据
2字节 2字节 2字节 2字节 2字节 2字节

有了以上理论基础之后,下面针对各个功能码进行详细分析:

2.功能码详解

声明:协议中的起始地址指的是索引,后面的地址指的是具体地址,对于任意一个存储区,索引都是从0开始的,但是对应的具体地址,与存储区是相关的,比如输出线圈,0对应00001;输入线圈,0对应10001;输入寄存器,0对应30001;保持寄存器,0对应40001。即起始地址转为十进制后+1等于对应plc的实际地址

1.读取输出线圈

发送报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 起始高 起始低 数量高 数量低
00 00 00 00 00 06 01 01 00  13 00 1B

发送报文含义:读取服务器1号从站输出线圈,起始地址为0x13=19,对应地址为00020,线圈数量为0x1B=27,即读取1号从站输出线圈,地址从00020-00046,共27个线圈的状态值。

返回报文格式如下:

事务处理/协议标识符 报文长度 单元标识码 功能码 字节计数 线圈字节
00 00 00 00 00 07 01 01 04 CD 6B B2 02

返回报文含义:返回服务器1号从站输出线圈00020-00046,共27个线圈的状态值,返回字节数为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

2.读取输入线圈

发送报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 起始高 起始低 数量高 数量低
00 00 00 00 00 06 01 02 00  C4 00 1D

发送报文含义:读取服务器1号从站输入线圈,起始地址为0xC4=196,对应地址为10197,线圈数量为0x1D=29,即读取1号从站输入线圈,地址从10197-10225,共29个线圈的状态值。

返回报文格式

事务处理/协议标识符 报文长度 单元标识码 功能码 字节计数 线圈字节
00 00 00 00 00 07 01 02 04 CD 6B B2 05

返回报文含义:返回服务器1号从站输入线圈10197-10225,共29个线圈的状态值,返回字节数为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

3.读取保持寄存器

发送报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 起始高 起始低 数量高 数量低
00 00 00 00 00 06 01 03 00  6B 00 02

发送报文含义:读取服务器1号从站保持寄存器,起始地址为0x6B=107,对应地址为40108,寄存器数量为0x02=2,即读取1号从站保持寄存器,地址从40108-40109,共2个寄存器的数值。

返回报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 字节计数 1高 1低 2高 2低
00 00 00 00 00 07 01 03 04 02 2B 01 06

返回报文含义:返回服务器1号从站保持寄存器40108-40109,共2个寄存器的数值,返回字节数为4个,分别为02 2B 01 06,40108对应数值为0x022B,40109对应数值为0x0106。

4.读取输入寄存器

发送报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 起始高 起始低 数量高 数量低
00 00 00 00 00 06 01 04 00  6B 00 02

发送报文含义:读取服务器1号从站输入寄存器,起始地址为0x6B=107,对应地址为30108,寄存器数量为0x02=2,即读取1号从站保持寄存器,地址从30108-30109,共2个寄存器的数值。

返回报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 字节计数 1高 1低 2高 2低
00 00 00 00 00 07 01 04 04 02 2B 01 06

返回报文含义:返回服务器1号从站输入寄存器30108-30109,共2个寄存器的数值,返回字节数为4个,分别为02 2B 01 06,30108对应数值为0x022B,30109对应数值为0x0106。

5.预置单线圈

发送报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 线圈高 线圈低 断通标志 断通标志
00 00 00 00 00 06 01 05 00  AC FF 00

发送报文含义:预置服务器1号从站单个线圈的值,线圈地址为0x00AC=172,对应地址为00173,断通标志0xFF00表示置位,0x000表示复位,即置位1号从站输出线圈00173。

返回报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 线圈高 线圈低 断通标志 断通标志
00 00 00 00 00 06 01 05 00  AC FF 00

返回报文含义:预置单输出线圈原报文返回。

6.预置单寄存器

发送报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 寄存器高 寄存器低 写入值 写入值
00 00 00 00 00 06 01 06 00  87 03 9E

发送报文含义:预置服务器1号从站单个保持寄存器的值,寄存器地址为0x0087=135,对应地址为40136,写入值为0x039E,即预置1号从站保持寄存器40136值为0x039E。

返回报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 线圈高 线圈低 断通标志 断通标志
00 00 00 00 00 06 01 06 00  87 03 9E

返回报文含义:预置单保持寄存器原报文返回。

7.预置多线圈

发送报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 起始 数量 字节数 字节
00 00 00 00 00 09 01 0F 00 13 00 0A 02 CD 00

发送报文含义:预置服务器1号从站多个线圈的值,线圈地址为0x0013=19,对应地址为00020,线圈数为0x0A=10,写入值为0xCD00,即预置1号从站线圈00020-00027=0xCD=1100 1101,00028-00029=0x00=0000 0000。

返回报文格式如下:

事务处理/协议标识符 报文长度 单元标识码 功能码 起始 数量
00 00 00 00 00 06 01 0F 00 13 00 0A

返回报文含义:预置多输出线圈返回报文是在原报文基础上除去字节数及具体字节后返回。

8.预置多寄存器

发送报文格式如下:

事务处理/协议标识符 报文长度 单元标识符 功能码 起始 数量 字节数 字节
00 00 00 00 00 0B 01 10 00 87 00 02 04 01 05 0A 10

发送报文含义:预置服务器1号从站多个寄存器的值,寄存器地址为0x0087=135,起始地址为40136,寄存器数量为0x02=2,结束地址为40137,写入值为0xCD00和0x0A10,即预置1号从站寄存器40136=0x0105,40137=0x0A10。

返回报文格式如下:

事务处理/协议标识符 报文长度 单元标识码 功能码 起始 数量
00 00 00 00 00 07 01 10 00 87 00 02

返回报文含义:预置多保持寄存器返回报文是在原报文基础上除去字节数及具体字节后返回。

相关推荐

  1. ModbusTcp协议

    2024-07-22 16:50:02       36 阅读
  2. Modbus TCP协议介绍(ModbusTCP

    2024-07-22 16:50:02       27 阅读
  3. 计算机通信:FTP协议详解

    2024-07-22 16:50:02       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 16:50:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 16:50:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 16:50:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 16:50:02       55 阅读

热门阅读

  1. Linux的shell编程

    2024-07-22 16:50:02       18 阅读
  2. 【Vue】 组件通信方式

    2024-07-22 16:50:02       13 阅读
  3. Android 各个版本兼容型问题

    2024-07-22 16:50:02       18 阅读
  4. 透彻理解Transformer模型:详解及实用示例(C#版)

    2024-07-22 16:50:02       17 阅读
  5. 商品信息管理系统(C语言)

    2024-07-22 16:50:02       17 阅读
  6. Vue的模板编译:深入理解渲染函数与预编译模板

    2024-07-22 16:50:02       16 阅读
  7. Rust编程- 函数指针与返回闭包

    2024-07-22 16:50:02       17 阅读
  8. 0、springboot3 vue3开发平台-系统简介

    2024-07-22 16:50:02       17 阅读
  9. 将用户控件嵌入到 Excel 窗口中

    2024-07-22 16:50:02       15 阅读
  10. 数据仓库中的数据治理方法

    2024-07-22 16:50:02       17 阅读