| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 详解Modbus通信协议---清晰易懂 -> 正文阅读 |
|
[嵌入式]详解Modbus通信协议---清晰易懂 |
什么是协议在了解什么是Modbus之前,我们先来看下什么是
简单地说,在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。 而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IIC SPI UART串口通信协议等等。而Modbus也是一个串行通信协议。 什么是RS-485 RS-232我们在看Modbus的时候,经常会看到485串口,232串口,这些是什么呢? RS232,RS485是一种电平标准 数据在通信双方之间传输,本质是传输物理的电平 比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。 那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232 RS232:是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。
RS485:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2~-6V表示0,两线压差为+2~+6V表示1
如果还想继续了解可以看博主的这个博文: USB转串口 TTL RS-232 RS-485 COM口 UART区别 也就是RS-485电平标准确定传输过来的数据是0还是1,在此基础上,这些字节数据根据modbus通信协议来进行数据的交互传输。 硬件层协议:解决0和1的可靠传输,常有RS232、RS485、CAN、IIC、SPI … Modbus协议说明
最简单的说,Modbus就是一个总线通信协议,像IIC SPI这种,但是他不依赖于硬件总线 Modbus之所以使用广泛,是有他的优点的
举一个简单的例子,我们常用的IIC通信协议,需要在物理上连接iic总线,然后加上拉电阻,规定好物理层的高低电平。 Modebus通信过程注意Modbus是一主多从的通信协议 Modbus通信中只有一个设备可以发送请求。其他从设备接收主机发送的数据来进行响应,从机是任何外围设备,如I/O传感器,阀门,网络驱动器,或其他测量类型的设备。从站处理信息和使用Modbus将其数据发送给主站。 也就是说,不能Modbus同步进行通信,主机在同一时间内只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送,从机应答,主机不发送,总线上就没有数据通信。 从机不会自己发送消息给主站,只能回复从主机发送的消息请求。
举例现在,我们来探讨Modbus数据传输的方式,可以简单地理解成打电话。并且是单向通信的打电话 主机发送数据,首先需要从机的电话号码(区分每个从机,每个地址必须唯一),告诉从机打电话要干什么事情,然后是需要发送的内容,最后再问问从机,我说的话你都听清楚了没有呀,没有听错吧? 然后从机这里,得到了主机打过来的电话,从机回复主机需要的内容,主机得到从机数据,这样就是一个主机到从机的通信过程
Modbus存储区既然从机存储数据,那么肯定要有一个存储区,那就需要文件操作,我们都知道这文件可以分为只读(-r)和读写(-wr)两种类型 并且存储的数据类型可以分为 :布尔量 和 16位寄存器
Modbus协议规定了4个存储区 分别是0 1 3 4区 其中1区和4区是可读可写,1区和3区是只读。
并且Modbus还给每个区都划分了地址范围 主机向从机获取数据时,只需要告诉从机数据的起始地址,还有获取多少字节的数据,从机就可以发送数据给主机 Modbus数据模型规定了具体的地址范围,每一个从机,都有实际的物理存储,跟modbus的存储区相对应,主机读写从机的存储区,实际上就是对从机设备对应的实际存储空间进行读写。 Modbus协议类型在上面我们已经说明了Modbus可以在各种介质上传输,那么他的传输模式也分为三种。包括ASCII、RTU(远程终端控制系统)、TCP三种报文类型 串行端口存在多个版本的Modbus协议,而最常见的是下面四种:
Modbus RTU是一种紧凑的,十六进制表示数据的方式,Modbus ASCII是一种采用Ascii码表示数据,并且每个8Bit 字节都作为两个ASCII字符发送的表示方式。 Modbus协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验,RTU模式采用16 位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。 当然常用的就是RTU模式,ASCII一般很少 举一个简单的例子,如果我们需要发送一个数字 而ASCII码模式则将数据1和0转为’1’和’0’,需要发送 详细的我们等下再阐述 Modbus-RTU协议Modbus报文帧结构
Modbus报文是指主机发送给从机的一帧数据,其中包含着从机的地址,主机想执行的操作,校验码等内容 Modbus协议在串行链路上的报文格式如下所示:
Modbus功能码Modbus规定了多个功能,那么为了方便的使用这些功能,我们给每个功能都设定一个功能码,也就是指代码。 Modbus协议同时规定了二十几种功能码,但是常用的只有8种,用于对存储区的读写,如下表所示:
当然我们用的最多的就是03和06 一个是读取数据,一个是修改数据。 CRC校验错误校验(CRC)域占用两个字节包含了一个16位的二进制值。CRC值由传输设备计算出来,然后附加到数据帧上,接收设备在接收数据时重新计算CRC值,然后与接收到的CRC域中的值进行比较,如果这两个值不相等,就发生了错误。 CRC校验流程: 1、预置一个16位寄存器为0FFFFH(全1),称之为CRC寄存器。 2 、把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。 3、将CRC寄存器向右移一位,最高位填以0,最低位移出并检测。 4 、如果最低位为0:重复第三步(下一次移位);如果最低位为1:将CRC寄存器与一个预设的固定值(0A001H)进行异或运算。 5、重复第三步和第四步直到8次移位。这样处理完了一个完整的八位。 6 、重复第2步到第5步来处理下一个八位,直到所有的字节处理结束。 7、最终CRC寄存器的值就是CRC的值。 此外还有一种利用预设的表格计算CRC的方法,它的主要特点是计算速度快,但是表格需要较大的存储空间,该方法此处不在阐述 下面我们来看详细的发送和接收数据: 1、主机对从机读数据操作 主机发送报文格式如下:
含义:
从机回复报文格式如下:
含义:
2、主机对从机写数据操作 主机发送报文格式如下:
含义:
从机回复报文格式如下:
含义:
从机的回复和主机的发送是一样的,如果不一样说明出现了错误 Modbus-ACSII协议在消息中的每个字节都作为两个ASCII字符发送 十六进制的0-F 分别对应ASCII字符的0…9,A…F 也就是0x30~0x3A 0x41~0x46 下方是ascii的报文帧
可以看到数据部分更加繁琐,正常我们使用都是用RTU格式,ASCII码格式有了解即可。
注意:针对3.5个字符周期,其实是一个具体时间,但是这个时间跟波特率相关。 Modbus-TCP协议我们首先看下Modbus-TCP和Modbus-ACSII的区别 Modbus-TCP并不需要从从机地址,而是需要MBAP报文头 并且不需要差错校验,因为TCP本身就具有校验差错的能力 MBAP报文头格式如下: 其中事务处理表示符合协议标识符我们正常使用设置为0即可 长度为6个字节 0x0006 简单来说,也就是Modbus-TCP是在Modbus-ACSII的基础上,去掉校验,然后加上五个字节的0和一个06 最后附上 Modbus标准协议手册链接
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 8:43:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |