MODBUS TCP协议内容

1 简介

modbus由MODICON公司于1979年开发,是一种工业现场总线协议标准。1996年施耐德公司推出基于以太网TCP/IP的modbus协议:modbusTCP。

Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。

标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口,采用master/slave方式通信。

2 ModbusTCP数据帧

ModbusTCP的数据帧可分为两部分:MBAP+PDU。

2.1 报文头MBAP

MBAP为报文头,长度为7字节,组成如下:

事务处理标识协议标识长度单元标识符

2字节2字节2字节1字节

事务处理标识 :可以理解为报文的序列号,一般每次通信之后就要加1以区别不同的通信数据报文。

协议标识符 :00 00表示ModbusTCP协议。

长度 :表示接下来的数据长度,单位为字节。

单元标识符 :可以理解为设备地址。

2.2 帧结构PDU

PDU由功能码+数据组成。功能码为1字节,数据长度不定,由具体功能决定。

2.2.1 功能码

modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器。

线圈:PLC的输出位,开关量,在MODBUS中可读可写

离散量:PLC的输入位,开关量,在MODBUS中只读

输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在MODBUS中只读

保持寄存器:PLC中用于输出模拟量信号的寄存器,在MODBUS中可读可写

根据对象的不同,modbus的功能码有:

0x01:读线圈

0x05:写单个线圈

0x0F:写多个线圈

0x02:读离散量输入

0x04:读输入寄存器

0x03:读保持寄存器

0x06:写单个保持寄存器

0x10:写多个保持寄存器

2.2.2 PDU详细结构

0x01:读线圈

在从站中读1~2000个连续线圈状态,ON=1,OFF=0

请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)

响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)

如:在从站0x01中,读取开始地址为0x0002的线圈数据,读0x0008位

00 01 00 00 00 06 01 01 00 02 00 08

回:数据长度为0x01个字节,数据为0x01,第一个线圈为ON,其余为OFF

00 01 00 00 00 04 01 01 01 01

0x05:写单个线圈

将从站中的一个输出写成ON或OFF,0xFF00请求输出为ON,0x000请求输出为OFF

请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)

响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)

如:将地址为0x0003的线圈设为ON

00 01 00 00 00 06 01 05 00 03 FF 00

回:写入成功

00 01 00 00 00 06 01 05 00 03 FF 00

0x0F:写多个线圈

将一个从站中的一个线圈序列的每个线圈都强制为ON或OFF,数据域中置1的位请求相应输出位ON,置0的位请求响应输出为OFF

请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L

响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L

0x02:读离散量输入

从一个从站中读1~2000个连续的离散量输入状态

请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)

响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))

如:从地址0x0000开始读0x0012个离散量输入

00 01 00 00 00 06 01 02 00 00 00 12

回:数据长度为0x03个字节,数据为0x01 04 00,表示第一个离散量输入和第11个离散量输入为ON,其余为OFF

00 01 00 00 00 06 01 02 03 01 04 00

0x04:读输入寄存器

从一个远程设备中读1~2000个连续输入寄存器

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)

如:读起始地址为0x0002,数量为0x0005的寄存器数据

00 01 00 00 00 06 01 04 00 02 00 05

回:数据长度为0x0A,第一个寄存器的数据为0x0c,其余为0x00

00 01 00 00 00 0D 01 04 0A 00 0C 00 00 00 00 00 00 00 00

0x03:读保持寄存器

从远程设备中读保持寄存器连续块的内容

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)

如:起始地址是0x0000,寄存器数量是 0x0003

00 01 00 00 00 06 01 03 00 00 00 03

回:数据长度为0x06,第一个寄存器的数据为0x21,其余为0x00

00 01 00 00 00 09 01 03 06 00 21 00 00 00 00

0x06:写单个保持寄存器

在一个远程设备中写一个保持寄存器

请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)

响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)

如:向地址是0x0000的寄存器写入数据0x000A

00 01 00 00 00 06 01 06 00 00 00 0A

回:写入成功

00 01 00 00 00 06 01 06 00 00 00 0A

0x10:写多个保持寄存器

在一个远程设备中写连续寄存器块(1~123个寄存器)

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)

响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

如:向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F

00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F

回:写入成功

00 01 00 00 00 06 01 10 00 00 00 01

3 ModbusTCP通信

3.1 通信方式

modbus设备可分为主站(poll)和从站(slave)。主站只有一个,从站有多个,主站向各从站发送请求帧,从站给予响应。在使用TCP通信时,主站为client端,主动建立连接;从站为server端,等待连接。

主站请求:功能码+数据

从站正常响应:请求功能码+响应数据

从站异常响应:异常功能码+异常码,其中异常功能码即将请求功能码的最高有效位置1,异常码指示差错类型

注意:需要超时管理机制,避免无期限的等待可能不出现的应答

3.2 在linux下使用modbusTCP连接

IANA(Internet Assigned Numbers Authority,互联网编号分配管理机构)给Modbus协议赋予TCP端口号为502,这是目前在仪表与自动化行业中唯一分配到的端口号。

通信过程

1.connect 建立TCP连接

2.准备modbus报文

3.使用send命令发送报文

4.在同一连接下等待应答

5.使用recv命令读取报文,完成一次数据交换

6.通信任务结束时,关闭TCP连接

4 Modbus poll / Modbus slave

modbus poll 和modbus slave是一组modbus仿真软件,可以实现modbus RTU、TCP、串口仿真等。

在modbusTCP中,modbus poll 作为客户端请求数据,modbus slave 作为服务器端处理请求。

使用c语言编写客户端连接modbus slave时,注意数据格式,一条指令一次性发出,否则连接会出错。

使用软件时,需要指定功能码,在setup->slave definition或者poll definition中进行设置。

– slave ID:从站编号(事务标识符)

– function:功能码,0x01对应线圈操作,0x02对应离散量操作,0x03对应保持寄存器操作,0x04对应输入寄存器操作

– address:开始地址

– quantity:寄存器/线圈/离散量 的数量

Linux C作为客户端连接modbus slave的源码:

链接:https://pan.baidu.com/s/146svXpit0umpk809TV1Sdw 密码:b6gn

————————————————

版权声明:本文为CSDN博主「菜菜子汪汪汪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/iknow_nothing/article/details/84292914

(0)

相关推荐

  • Modbus协议深入讲解

    已更新 2019-9-17概览Modbus是一种工业协议,于1979年开发,旨在实现自动化设备之间的通信. Modbus最初是作为通过串行层传输数据的应用级协议实现的,现已扩展到包括通过串行.TCP/ ...

  • 西门子s7-200smart modbus-tcp通信实例编程详细指导

    西门子S7-200Modbus-TCP通信例子[]绝密[]NDA[X]公开一. 组网概述本文以 ZKA-4488-ETH 为例介绍西门子PLC与深圳市综科智控科技开发有限公司的IO设备进行Modbus ...

  • ModbusTCP协议报文详细分析

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

  • 大神是这样理解 串口通讯与MODBUS协议的

    工控PLC技术公众号 去学工控技术1. 基本的通讯方式基本的通讯方式有并行通讯和串行通讯两种.并行通信:是指数据的各位同时进行传送的通信方式.串行通信:是指数据一位一位顺序传送的通信方式.2. 串行通 ...

  • 干货|手把手带你搞懂Modbus通信协议

    干货福利,第一时间送达! 摘要:昨天有小伙伴在群里问关于Modbus通信协议的,大家都比较积极地解答,所以今天果子哥总结一下关于Modbus相关的知识,适合正在入门的小伙伴"食用" ...

  • 你好,我是Modbus TCP协议

    大家好,我是Modbus-TCP协议.前面的文章,我大哥(Modbus-RTU协议)曾做过自我介绍(原文网址: https://www.founderchip.com/?id=65),今天这篇文章,我 ...

  • 终于有人把TCP协议与UDP协议给搞明白了

    网络编程有三个要素,分别是IP地址.端口号和通信协议,那本文主要讲述的是TCP与UDP这两种通信协议,以及编程的实现. 首先,我们需要了解一下IP地址.端口号.通信协议的相关知识. 一.IP地址 网络 ...

  • 明知签订协议会侵犯第三人利益仍实施协议内容应认定该协议无效(最高法院公布的参考性案例中确定的审判规则...

    当事人在签订协议时均明知其侵害了第三人已享有的合同权益,在未与第三人协商获得其同意的情况下,实施的该签约行为在客观上导致第三人的合法权益受到侵害,协议双方在主观上具有恶意性,属于"恶意串通, ...

  • 西门子S7-200 Smart系列PLC实现Modbus TCP\RTU\ASCII通信视频教程

    一.西门子S7-200 Smart系列PLC实现Modbus TCP以太网通信客户端视频教程: 西门子S7-200 Smart做Modbus TCP以太网客户端.Modbus Slave调试助手做Mo ...

  • Modbus通讯协议学习

    了解了它,会使你对串口通信有一个清晰的认识! 通用消息帧 ASCII消息帧 (在消息中的每个8Bit 字节都作为两个ASCII字符发送) 十六进制,ASCII字符0...9,A...F 消息中的每个A ...

  • 拆迁补偿协议应该怎么签?协议内容有没有问题一看便知

    拆迁安置补偿协议的作用就是为了约束双方按照协议内容履行自己的职责,当双方发生纠纷时可以根据协议快速地解决问题,一份合法有效的协议是有法律效力的受到法律保护也是法律维权的重要依据之一. 补偿协议的重要性 ...

  • 房屋拆迁补偿安置协议内容和特征有哪些呢?

    拆迁安置补偿协议有什么内容和特征?拆迁补偿安置协议是拆迁人与被拆迁人.房屋承租人为明确房屋拆迁补偿安置中的权利义务关系而订立的协议,是约定拆迁当事人之间民事权利义务的合同,它适用<民法通则> ...

  • 五分钟读懂TCP 协议

    TCP 是互联网核心协议之一,本文介绍它的基础知识. 一.TCP 协议的作用 互联网由一整套协议构成.TCP 只是其中的一层,有着自己的分工. (图片说明:TCP 是以太网协议和 IP 协议的上层协议 ...

  • 终于把 TCP 协议与 UDP 协议给整明白了!

    网络编程有三个要素,分别是IP地址.端口号和通信协议,那本文主要讲述的是TCP与UDP这两种通信协议,以及编程的实现. 首先,我们需要了解一下IP地址.端口号.通信协议的相关知识. 一.IP地址 网络 ...