Modbus底层原理分析

Modbus底层原理分析

文章目录

    • 概要
    • 基础知识介绍
    • 底层原理分析
    • 为什么ModbusRTU使用十六进制通信
    • 小结

概要

1979年,由美国莫迪康公司发明了Modbus通信协议,主要是用来实现控制器之间的通信。本次我将给大家分享一些自己的学习心得。我将会从以下三个方面来分享

1. 基础知识介绍

2. 底层原理分析

3. ModbusRTU为什么要使用十六进制通信

基础知识介绍

首先,我们在实际工作中,我们调试ModbusRTU通信协议时,有四大要素:从站地址、功能码、数据、校验信息。其次我们在深入学习中也需要了解存储区,功能码,协议分类、以及报文(Tx,Rx)。

底层原理分析

现在我们来介绍一下底层的存储区、功能码。

一. 存储区

存储区可以理解成我们电脑中的内存,我们都知道计算机中的内存用途主要是通过CPU读取内存进行程序执行以及数据存储。那么Modbus中的存储区是专用于工业通信的数据交换地。计算机内存中使用过指针、变量名直接访问,Modbus中是通过功能码+地址读写。其中,最与众不同的地方在于存储区是有结构的,通常为四类,而且四类有专属编号:

  1. 0区 输出线圈
  2. 1区 输入线圈
  3. 4区 输出寄存器
  4. 3区 输入寄存器

除此之外,每类还有自己存储范围,在介绍存储范围之前,有个概念先帮助大家理解清楚。在线圈中有65536位(bit/线圈),在其存储中相当于有65536个开关,所以你可以叫他存储布尔值类型。在寄存器中有65536个寄存单元。每个单元有16位,存储的是字节,不存(0/1),两者看似相同,实则不同。在存储范围中,又有两种存储地址

第一种:长地址模型(理想存储地范围【0 ~ 65535】)

  1. 0区:000001 - 065536
  2. 1区:100001 - 165536
  3. 3区:300001 - 365536
  4. 4区:400001 - 465536

第二种:短地址模型(理想存储地范围【0 ~ 9998】)

  1. 0区:00001 - 09999
  2. 1区:10001 - 19999
  3. 3区:30001 - 39999
  4. 4区:40001 - 49999

我知道大家看到这里对于这个就蒙圈了,别着急,是因为这些地址都是人为赋予的,只是为了区分他们的编号,假设我们使用的是长模型,000001就是属于0区,100001就是属于1区,如此划分目的就是为了人类能分得清。地址=【x区】0000 + 1(位的索引号)+ 偏移量,这就是底层规则。那么短地址模型原理和长地址模型一致。

二. 功能码

功能码在存储区的概念种又进行了细分,有专属于自己的十六进制编号

读取:

  1. 读取输出线圈 0X01
  2. 读取输入线圈 0X02
  3. 读取输入寄存器 0X04
  4. 读取输出寄存器 0X03

写入:

  1. 写入输出线圈
    1. 写入单个线圈 0X05
    2. 写入多个线圈 0X0F
  2. 写入输出寄存器
    1. 写入单个寄存器 0X06
    2. 写入多个寄存器 0X10

为了方便记忆,我画了一个盒模型(外层是读取,里层是写入),写入只能写输出类线圈,输入里线圈是无法写入的,以下盒模型的里层,应该是放在右边的,作者由于太懒就不重画了,大家理解一下

为什么ModbusRTU使用十六进制通信

假设我们有个值是55,需要主站到从站读取,我们来看看如果是二进制,十进制会发生什么

  1. 二进制,55的二进制=110111,虽然机器可以读取,但人为调试中,数字多,需换算,且一旦数错一位,整个数据都会乱。对于需要快速检查数据的工程师来说是灾难。
  2. 十进制,RTU通信的时候,是怎么翻译数据的,当又一个55的数据过来,此时会先把55分成两个字符串的5,计算机去查 ASCII 码表,在翻译组装成55,占了两个字节,如果是三位数就更占用空间,效率低下。
  3. 十六进制完美解决这个问题,虽然底层跑的是00110111,但是记作37(Hex) ,3对应0011,7对应0111,这样不仅人为不繁琐,且通信时也无需中转,十进制和二进制的弊端都可解决。

小结

本期主要给大家介绍了ModBus的基础知识,以及底层原理分析,下一期会给大家介绍ModbusTcp的一些相关知识,以及可能会结合实战分享,谢谢大家。