一:modbus起源
1.起源
Modbus由Modicon公司于1979年开发,是一种工业现场总线协议标准。
Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是Modbus RTU、Modbus ASCII和Modbus TCP三种
其中Modbus TCP是在施耐德收购Modicon后1997年发布的。
- 分类:
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
运行在以太网上的协议
- 优势:
免费、简单、容易使用
- 应用场景:
Modbus协议是现在国内工业领域应用最多的协议,不只PLC设备,各种终端设备,比如水控机、水表、电表、工业秤、各种采集设备。
- 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字节),工业上主要用于控制IO设备。
线圈寄存器,类比为开关量,每一个bit都对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。
读可以用一个功能码表示读多个或者读单个
对应3个功能码
离散输入寄存器,离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。
对应功能码1个
- 输入和保持寄存器是字寄存器(每个寄存器数据占2个字节),工业上主要用于存储工业设备的值。
保持寄存器,这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。比如空调检测到的室温,这是不可以修改的,因为室温是根据实际的物理环境决定的。
功能码有对应的三个
输入寄存器,这个和保持寄存器类似,但是也是只支持读而不能写。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的温度传感器的值
对应的功能码也就一个
总结:
读都是可以一个功能码读多个或单个的。而写是分为写单个和写多个需要两个功能码。
所以对于只读的寄存器都只有一个功能码,而可读可写的寄存器都有三个功能码
- **功能码 **
功能码占一个字节
写多个线圈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个寄存器数据,写出主从数据收发协议。
00 00 00 00 00 06 11 0100 0100 01
00 00 00 00 00 04 11010100
- 写出控制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
版权归原作者 嵌入式厨神 所有, 如有侵权,请联系我们删除。