Modbus底层原理分析
文章目录概要基础知识介绍底层原理分析为什么ModbusRTU使用十六进制通信小结概要1979年由美国莫迪康公司发明了Modbus通信协议主要是用来实现控制器之间的通信。本次我将给大家分享一些自己的学习心得。我将会从以下三个方面来分享1. 基础知识介绍2. 底层原理分析3. ModbusRTU为什么要使用十六进制通信基础知识介绍首先我们在实际工作中我们调试ModbusRTU通信协议时有四大要素从站地址、功能码、数据、校验信息。其次我们在深入学习中也需要了解存储区功能码协议分类、以及报文TxRx。底层原理分析现在我们来介绍一下底层的存储区、功能码。一. 存储区存储区可以理解成我们电脑中的内存我们都知道计算机中的内存用途主要是通过CPU读取内存进行程序执行以及数据存储。那么Modbus中的存储区是专用于工业通信的数据交换地。计算机内存中使用过指针、变量名直接访问Modbus中是通过功能码地址读写。其中最与众不同的地方在于存储区是有结构的通常为四类而且四类有专属编号0区 输出线圈1区 输入线圈4区 输出寄存器3区 输入寄存器除此之外每类还有自己存储范围在介绍存储范围之前有个概念先帮助大家理解清楚。在线圈中有65536位bit/线圈在其存储中相当于有65536个开关所以你可以叫他存储布尔值类型。在寄存器中有65536个寄存单元。每个单元有16位存储的是字节不存0/1两者看似相同实则不同。在存储范围中又有两种存储地址第一种长地址模型理想存储地范围【0 ~ 65535】0区000001 - 0655361区100001 - 1655363区300001 - 3655364区400001 - 465536第二种短地址模型理想存储地范围【0 ~ 9998】0区00001 - 099991区10001 - 199993区30001 - 399994区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对应00117对应0111这样不仅人为不繁琐且通信时也无需中转十进制和二进制的弊端都可解决。小结本期主要给大家介绍了ModBus的基础知识以及底层原理分析下一期会给大家介绍ModbusTcp的一些相关知识以及可能会结合实战分享谢谢大家。