0


Modbus Tcp协议

一:modbus起源

1.起源

Modbus由Modicon公司于1979年开发,是一种工业现场总线协议标准。

Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是Modbus RTU、Modbus ASCII和Modbus TCP三种

其中Modbus TCP是在施耐德收购Modicon后1997年发布的。

  1. 分类:

1)Modbus RTU

运行在串口上的协议,采用二进制表现形式以及紧凑的数据结构,通信效率较高,应用比较广泛

2)Modbus ASCII

运行在串口上的协议,采用ASCII码进行传输,并且每个字节的开始和结束都有特殊字符作为标志,传输效率远远低于Modbus RTU,一般只有通讯量比较少时才会考虑它。

注:在ASCII模式下,每个8位的字节被拆分成两个ASCII字符进行发送,比如十六进制0xAF(1010 1111),会被分解成ASCII字符“A”(0100 0001)和”F”(0100 0110)进行发送,其发送量显然比RTU增加一倍。

3)Modbus TCP

运行在以太网上的协议

  1. 优势:

免费、简单、容易使用

  1. 应用场景:

Modbus协议是现在国内工业领域应用最多的协议,不只PLC设备,各种终端设备,比如水控机、水表、电表、工业秤、各种采集设备。

  1. ModbusTCP特点(掌握):

1)采用主从问答式通信

2)Modbus TCP是应用层协议,基于传输层的TCP进行通信的

注:更好的理解网络模型的分层特点:

各层之间独立,每一层不需要知道下一层如何实现

当任何一层发生变化时,只要层间接口关系保持不变,则这层以上或以下层不受影响。

3)Modbus TCP端口号默认502

  • ModbusTCP的协议格式

ModbusTcp协议包含三部分:报文头、功能码、数据

MBAP:Modbus Application Protocol (modbus报文头)

PDU:Protocol Data Unit(协议数据单元)

Modbus TCP/IP协议最大数据帧长度为260字节

1.报文头

包含7个字节

二:寄存器

一共有四种类型的寄存器,分别是:线圈、离散量输入、输入寄存器、保持寄存器。

离散量和线圈其实就是位寄存器(每个寄存器数据占1字节),工业上主要用于控制IO设备。输入和保持寄存器是字寄存器(每个寄存器数据占2个字节),工业上主要用于存储工业设备的值。

  1. 离散量和线圈其实就是位寄存器(每个寄存器数据占1字节),工业上主要用于控制IO设备

线圈寄存器,类比为开关量,每一个bit都对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。

读可以用一个功能码表示读多个或者读单个

对应3个功能码

离散输入寄存器,离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。

对应功能码1个

  1. 输入和保持寄存器是字寄存器(每个寄存器数据占2个字节),工业上主要用于存储工业设备的值

保持寄存器,这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。比如空调检测到的室温,这是不可以修改的,因为室温是根据实际的物理环境决定的。

功能码有对应的三个

输入寄存器,这个和保持寄存器类似,但是也是只支持读而不能写。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的温度传感器的值

对应的功能码也就一个

总结:

读都是可以一个功能码读多个或单个的。而写是分为写单个和写多个需要两个功能码。

所以对于只读的寄存器都只有一个功能码,而可读可写的寄存器都有三个功能码

    1. **功能码 **

功能码占一个字节

写多个线圈0X0F

写多个保持寄存器0X10

具体协议分析可参考:

实例分享 | ModbusTCP报文详解

读数据:

主机--》从机

报文头----功能码---起始地址---数量

从机---》主机

报文头----功能码---字节计数---数据

写单个线圈

写单个

主机--》从机

报文头---功能码---地址--- 通/断标志 /数据

从机--》主机

原文返回

写多个线圈寄存器

写多个

主机--》从机

报文头---功能码--起始地址--数量--字节计数--数据

从机--》主机

报文头---功能码--起始地址--数量

主机询问数据流

00 00 00 00 00 06 0103 00 6300 02

03:功能码

0x0063:起始地址 6*16+3=99 ,40100

0002:个数 40100 40101

从机应答数据流

00 00 00 00 00 07 01 030402 1330 08

03:功能码

04:字节计数

0213 :40100数据

3008: 40101数据

练习:

  1. 读传感器数据,读1个寄存器数据,写出主从数据收发协议。

00 00 00 00 00 06 11 0100 0100 01

00 00 00 00 00 04 11010100

  1. 写出控制IO设备开关的协议数据,操作1个线圈,置1。

00 00 00 00 00 06 11 0500 63 ff 00

00 00 00 00 00 06 11 0500 63 ff 00


本文转载自: https://blog.csdn.net/m0_65222138/article/details/140360121
版权归原作者 嵌入式厨神 所有, 如有侵权,请联系我们删除。

“Modbus Tcp协议”的评论:

还没有评论