Modbus底层原理分析
文章目录
- 概要
- 基础知识介绍
- 底层原理分析
- 为什么ModbusRTU使用十六进制通信
- 小结
概要
1979年,由美国莫迪康公司发明了Modbus通信协议,主要是用来实现控制器之间的通信。本次我将给大家分享一些自己的学习心得。我将会从以下三个方面来分享
1. 基础知识介绍
2. 底层原理分析
3. ModbusRTU为什么要使用十六进制通信
基础知识介绍
首先,我们在实际工作中,我们调试ModbusRTU通信协议时,有四大要素:从站地址、功能码、数据、校验信息。其次我们在深入学习中也需要了解存储区,功能码,协议分类、以及报文(Tx,Rx)。
底层原理分析
现在我们来介绍一下底层的存储区、功能码。
一. 存储区
存储区可以理解成我们电脑中的内存,我们都知道计算机中的内存用途主要是通过CPU读取内存进行程序执行以及数据存储。那么Modbus中的存储区是专用于工业通信的数据交换地。计算机内存中使用过指针、变量名直接访问,Modbus中是通过功能码+地址读写。其中,最与众不同的地方在于存储区是有结构的,通常为四类,而且四类有专属编号:
- 0区 输出线圈
- 1区 输入线圈
- 4区 输出寄存器
- 3区 输入寄存器
除此之外,每类还有自己存储范围,在介绍存储范围之前,有个概念先帮助大家理解清楚。在线圈中有65536位(bit/线圈),在其存储中相当于有65536个开关,所以你可以叫他存储布尔值类型。在寄存器中有65536个寄存单元。每个单元有16位,存储的是字节,不存(0/1),两者看似相同,实则不同。在存储范围中,又有两种存储地址
第一种:长地址模型(理想存储地范围【0 ~ 65535】)
- 0区:000001 - 065536
- 1区:100001 - 165536
- 3区:300001 - 365536
- 4区:400001 - 465536
第二种:短地址模型(理想存储地范围【0 ~ 9998】)
- 0区:00001 - 09999
- 1区:10001 - 19999
- 3区:30001 - 39999
- 4区:40001 - 49999
我知道大家看到这里对于这个就蒙圈了,别着急,是因为这些地址都是人为赋予的,只是为了区分他们的编号,假设我们使用的是长模型,000001就是属于0区,100001就是属于1区,如此划分目的就是为了人类能分得清。地址=【x区】0000 + 1(位的索引号)+ 偏移量,这就是底层规则。那么短地址模型原理和长地址模型一致。
二. 功能码
功能码在存储区的概念种又进行了细分,有专属于自己的十六进制编号
读取:
- 读取输出线圈 0X01
- 读取输入线圈 0X02
- 读取输入寄存器 0X04
- 读取输出寄存器 0X03
写入:
- 写入输出线圈
- 写入单个线圈 0X05
- 写入多个线圈 0X0F
- 写入输出寄存器
- 写入单个寄存器 0X06
- 写入多个寄存器 0X10
为了方便记忆,我画了一个盒模型(外层是读取,里层是写入),写入只能写输出类线圈,输入里线圈是无法写入的,以下盒模型的里层,应该是放在右边的,作者由于太懒就不重画了,大家理解一下
为什么ModbusRTU使用十六进制通信
假设我们有个值是55,需要主站到从站读取,我们来看看如果是二进制,十进制会发生什么
- 二进制,55的二进制=110111,虽然机器可以读取,但人为调试中,数字多,需换算,且一旦数错一位,整个数据都会乱。对于需要快速检查数据的工程师来说是灾难。
- 十进制,RTU通信的时候,是怎么翻译数据的,当又一个55的数据过来,此时会先把55分成两个字符串的5,计算机去查 ASCII 码表,在翻译组装成55,占了两个字节,如果是三位数就更占用空间,效率低下。
- 十六进制完美解决这个问题,虽然底层跑的是00110111,但是记作
37(Hex) ,3对应0011,7对应0111,这样不仅人为不繁琐,且通信时也无需中转,十进制和二进制的弊端都可解决。
小结
本期主要给大家介绍了ModBus的基础知识,以及底层原理分析,下一期会给大家介绍ModbusTcp的一些相关知识,以及可能会结合实战分享,谢谢大家。
