嵌入式(二十九):modbus协议

1、IO模块在CPU看来就是可访问的寄存器,分为数据寄存器(如计数器类)、状态控制寄存器、模式方式寄存器三类。
2、SBUF串行缓冲区,只要把状态设置好,就可以实现数据的传输。
3、真正的ARM基本上都会有内存管理,即MMU,可以支持操作系统,而且真正ARM的计算单元会强很多。
4、异步通信:收发双方独自用自己的时间,要求约定波特率,双方可以用自己的时钟产生波特率。传久了之后会存在一个误差(由于钟不一样)。
5、同步通信:收发双方时钟同步,需要传递时钟,不会存在误差。
6、lin是汽车上常用到的总线。stm32可与汽车连接
7、usart为通用同步异步收发器,利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信
8、STM32的串口是可以有多种模式功能的。
9、每一个串口可以分配、定义在不同的引脚上,如放在usb计算机通信引脚和485引脚,分别是com1和com2。
10、stm32中有5个串口,串口1usart1首地址为0x4001 3800,同理可以找到串口2usart2、串口3usart3、串口4uart4和串口5uart5的首地址。
11、每个串口有7个32位寄存器。这七个寄存器的起始地址都从同一个首地址开始,加上不同的偏移。
12、UART只能用于异步串行通讯,而USART既能用于同步串行通讯,又能用于异步串行通讯
13、PC机串行通信接口8250:
a、8250主要功能:
①、支持RS232异步通信协议,自动插入/删除起始位、停止位、奇偶校验位
②、数据位5~8位,停止位1、1.5、2
③、波特率可编程,波特率因子:16
④、有与MODEM接口信号
⑤、多种中断源输出:发完一个字符、收到一个字符、数据帧错、校验错、溢出等
b、8250结构和工作原理:
①、在PC机看来,每个串口有10个寄存器
②、基地址:COM1:3F8h、COM2:2F8h
③、偏移地址:0-6
④、接收/发送缓冲寄存器各一个,用同一地址
⑤、DLAB位为“0/1”,+0、+1访问不同单元
⑥、PC为串口通信开辟一个缓冲区,规定缓冲区中数据满足多少个字节的时候触发一次响应
14、现在的计算机将8250芯片兼容在了南桥芯片中。
15、PC机编程:
a、面向寄存器(物理IO地址):不规范、不推荐
①、DOS单任务环境尚可
②、效率低
③、程序移植性差
b、利用系统功能调用(BIOS、DOS调用):过时
①、DOS下传统方法
②、效率低
③、与WINDOWS多任务操作系统融合性差
c、WINDOWS编程接口(API函数):推荐
①、WINDOWS编程基本方法,灵活、规范、高效
d、面向控件编程(面向对象设计语言):推荐
①、WINDOWS编程方法,规范、最高效率,与API比欠灵活
16、RS485接口:
a、RS232的主要限制
①、最大直连距离:15m(19200b/S时)
②、最高通信速率:20Kb/S
b、原因:
①、单端电平信号传送易受共模干扰;
②、信号电平摆幅过大不易提高频率;
③、驱动器负荷电容过大(2500p),易引起码元畸变
c、逻辑电平传送方法:双端(平衡)传送
①、A-A’ 高于 B-B’ 0.2V:“1”
②、B-B’ 高于 A-A’ 0.2V:“0”
d、采用分时的方法传送字节
e、是一种串行通信,而不是并行的
f、单工多机通信的时候,总线上的数据可以共享,但是任意两个板子不能同时发送数据,需要分时发送数据
g、双工多机通信的时候,总线上的数据可以共享,收发可以实时,但是存在主从结构
17、集中控制系统:有一个计算机充当中央处理器,控制多个对象。是一种封闭式计算机控制系统。当时只有大集团才能提供,只有大公司才买得起——制约计算机用于自动控制
18、现场总线控制系统:是一种开放性互联控制系统。不用计算机,通过总线将所有的对象进行链接,使控制对象间可以通过串行总线交互信息;无论谁生产,只要符合统一协议,就可以互通互用。然后让对象之间可以实现相互控制。无数自动化设备提供商 —— 谁都可提供、谁都买得起,产生新一代工业自动化。
19、实验:了解现场总线控制系统中的统一协议是什么样子,即了解现场总线协议(modbus协议)。并把我们的设计做成一个满足现场总线协议的东西(通过485总线或者串口)。就是说,我们的实验七,是要把我们之前的实验设计,改成满足现场总线协议的设计。
20、问题:
a、统一协议是个什么样子?——现场总线协议。
Modbus通信协议是由modicon公司推出的,定义了一种数据传输的规范。协议采用的是主从通信模式。协议的应用主要有三种:Modbus RTU,Modbus ASCII 和Modbus TCP三种,其中Modbus RTU与Modbus ASCII均为支持RS-485总线的通信协议,Modbus TCP是支持以太网的通信协议,在工业现场一般都是采用Modbus RTU协议,一般而言,大家说的基于串口通信的Modbus通信协议都是指Modbus RTU通信协议。
Modbus RTU通信协议格式:
RTU协议中的指令由地址码(一个字节),功能码(一个字节),起始地址(两个字节),数据(N个字节),校验码(两个字节)五个部分组成,其中数据又由数据长度(两个字节,表示的是寄存器个数,假定内容为M)和数据正文(M乘以2个字节)组成,而RTU协议是采用3.5个字节的空闲时间作为指令的起始和结束。
在这里插入图片描述
由于协议中地址码是一个字节,则理论上modbus最大可支持的结点为1~255个,但协议官网文档中说明最大只支持247个结点。
RS-485总线只是规定了接口的电气标准,并没有规定应用层的通信协议,所以很多公司都是自定义基于RS-485总线的应用层通讯协议。而modbus通信协议则是基于RS-485总线上的标准应用层的协议。
b、如何设计符合现场总线协议的系统。
modbus简单总结,可以分为以下几点:
①系统中,只允许有一个设备为主机;
②任何时候,从机不允许向主机发送数据;
③系统上电后,主机与所有从机都要默认保持为接收状态(监听状态);
④每次的数据交换都要由主机发起:
具体实现过程为:
a.首先主机将自己转为发送状态;
b.主机按预先约定的格式主机发出寻址帧→主机恢复为接收态;
c.等待所寻址的从机做应答;
所以MODBUS定义:
①只能由一台主机;
②每个从机都必须有一个唯一的地址。
③那么你那地址是啥?怎么定义?
其实呢,可以理解每个从机的地址为手机号,但这样比喻的并不恰当,为什么这么说呢。那是因为咱么最终代码的实现还是要通过C语言来写出来,而发送的数据包中都含地址域,说的明确一点,那就是所有从机都判断定义好的从机ID(寻址),而不是像手机一样,拨打谁的号码就只有给他打电话。
协议规定,MODBUS地址范围为0~247,其中0号地址为 广播地址(主机呼叫所有用户),即主机向0号地址发送数据,也就是把该数据包发送至所用从机(群聊)
主机向地址0(所有从机)发送的时候,所有的从机都不做回应。
首先了解MODBUS的两种编码格式:RTU格式 和 ASC格式;
RTU:远程终端控制单元。可以称他为 ”十六进制编码”或叫”二进制”也可以。假如说我数据要发送0X03,那么这里发送格式如下:
在这里插入图片描述
在这里插入图片描述
从机地址是发送方地址,因为只有一个主机,所以只需要一个地址;
功能码就是指”做什么”的问题;
而这里要加校验位为了提高数据的可靠性,RTU采用CRC16的校验方式;其数据包末尾加16位的校验位,当然校验位是采用他特定格式的算法得出的。
很明显,数据包末尾没有所谓的停止位,协议规定:主机发送的数据包的停顿时间到达3.5个字符时间作为结束的”标志”,从机就认为此次数据结束。假如说此次<3.5字符时间,则从机会认为继续接收!
举个例子:假若我们串口波特率是9600bit/s(每秒发送9600位),则每位发送的时间t=1000000us/9600≈104us;
而一个字需要10位(上文有解释),则一个字节所耗费的时间为:T=10X104us=1040us;
则3.5T=3.5X1040us=3645us≈4ms;这里我们选取4ms!
这个时间只是一个参考时间,不用太精确,我们也可以选取5-6ms;
也就是说咱们程序中,需要做两个准备:
①硬件定时器,32可以定时为1ms,51可以定义为2ms,都没关系;
②串口;
ASC:是不是感觉很眼熟,没错,这就是ASCII的简写!还是以0X03为例:
在这里插入图片描述
也就是把数据都以ASC码方式转换为二进制发送,这样传输就多了8个字节, ASC格式为1+8+8+1=18位!
在这里插入图片描述
与RTU除了上述不同,ASC编码方式是有”开始位”和”停止位”:
开始位:’:’,ASCII码为0X3A;
停止位:’/r/n’,ASCII码为13、10;
校验码:采用LRC校验,他怎么计算呢?
计算方法:
①LRC=(地址码)+(功能码)+(数据1)+(数据2)+ … +(数据N);
②LRC/256后取余数,其结果不会超过256,所以它的范围为0~255;
③再将计算结果取反+1(补码);
从设备回答要与主机查询的数据包格式要一致,主机用RTU,那么我也用这种格式!
从机回包也就两种可能:
①你要的我能正确的给你;
②你要的我没有或者数据不对;
能正确回应时,功能码与主机发送的功能码保持一致!
不能正确回应时,从机回应的功能码要在接收到主机的功能码的基础上+128;
那么主机收到从机功能码后判断是否<128,是的话则从机传输的数据是可靠的;反之,是不可靠的。主机可将正确性显示到LCD等直观设备上
非常重要:MODBUS正常的功能码一定<128!

猜你喜欢

转载自blog.csdn.net/qq_40851744/article/details/106437046