前言
前面讲了一些Android串口通信的一些数据校验和基本使用,下面说说串口通信中与硬件之接的协议ModBus
ModBus
什么是ModBus
自从 1979 年出现工业串行链路的事实标准以来,Modbus使成千上万的自动化设备能够通信。Modbus 是OSI模型第 7 层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。Modbus应用层协议和服务规范主要包含两类:一类是串行链路上的Modbus(Modbus 串行链路取决于TIA/EIA 标准:232-F 和 485-A),另一类是TCP/IP 上的Modbus(Modbus TCP/IP 取决于IETF 标准:RFC793 和 RFC791 有关)。Modbus通信栈示意图如下所示:
Modbus通信协议支持不同的通信方式,包括串行通信(如Modbus RTU和Modbus ASCII)和以太网通信(Modbus TCP/IP)。这使得Modbus非常适合用于各种工业应用,无论是在制造业、能源领域、建筑自动化,还是其他自动化控制系统。我们在看Modbus的时候,经常会看到485串口,232串口,详细请看拓展。
协议格式
MODBUS 协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的 MODBUS 协议映射能够在应用数据单元(ADU)上引入一些附加域。
- 地址域: 子节点的地址信息;
- 功能码: 指明服务器要执行的动作,有效的码字范围是十进制 1-255(128-255 为异常响应保留),当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作(功能码内容较多,建议查阅Modbus协议说明手册,上面介绍的很清晰)。
- 数据: 传输的数据内容,在某种请求中,数据可以是不存在的(0 长度),在此情况下服务器不需要任何附加信息,功 能码仅说明操作。
- 差错校验: 验证收、发的数据是否正确。比如前面写过的CRC校验。
Modbus协议是一种请求/应答方式的交互过程,主机主动发起通讯请求,从机响应主机的请求,从机在没有收到主机的请求时,不会主动发送数据,从机之间不会进行通讯。
MODBUS 数据模型
MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:
MODBUS 传输模式
1979年,Modicon 首先推出了串行Modbus标准,后来由于网络的普及,需要更高的传输速度,1997年制定了基于TCP网络的Modbus标准。 所以总的可分为两个传输模式:基于串行链路的和基于以太网TCP/IP的。
- 基于串口的Modbus-RTU 数据按照标准串口协议进行编码,是使用最广泛的一种Modbus协议,采用CRC-16_Modbus校验算法。
- 基于串口的Modbus-ASCII 所有数据都是ASCII格式,一个字节的原始数据需要两个字符来表示,效率低,采用LRC校验算法。
- 基于网口的Modbus-TCP
Modbus-TCP基于TCP/IP协议,占用502端口,数据帧主要包括两部分:MBAP(报文头)+PDU(帧结构),数据块与串行链路是一致的。
功能码分类
公共功能码
- 是较好地被定义的功能码,
- 保证是唯一的,
- MODBUS 组织可改变的,
- 公开证明的,
- 具有可用的一致性测试,
- MB IETF RFC 中证明的,
- 包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。
用户定义功能码
- 有两个用户定义功能码的定义范围,即 65 至 72 和十进制 100 至 110。
- 用户没有 MODBUS 组织的任何批准就可以选择和实现一个功能码
- 不能保证被选功能码的使用是唯一的。
- 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。
保留功能码
- 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。
举例
Modbus-RTU协议
主机对从机写数据操作
| 从站地址 | 功能码 | 数据地址(高) | 数据地址(低) | 数据(高) | 数据(低) | 校验 |
|---|---|---|---|---|---|---|
| 0x01 | 0x06 | 0x00 | 0x01 | 0x00 | 0x17 | 0x98 0x04 |
含义:
0x01:从机的地址 0x06:修改功能,修改从机寄存器的数据 0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0000-0x0001的存储内容 0x00 0x17: 要修改的数据值为0017 0x98 0x04: 循环冗余校验 CRC
从机回复报文格式如下:
| 从站地址 | 功能码 | 数据地址(高) | 数据地址(低) | 数据(高) | 数据(低) | 校验 |
|---|---|---|---|---|---|---|
| 0x01 | 0x06 | 0x00 | 0x01 | 0x00 | 0x17 | 0x98 0x04 |
0x01:从机的地址 0x06:修改功能,修改从机寄存器的数据 0x00 0x01: 代表修改的起始寄存器地址.说明是0x0000 0x00 0x17:修改的值为0017 0x98 0x04: 循环冗余校验 CRC
从机的回复和主机的发送是一样的,如果不一样说明出现了错误
拓展
ModBus网络体系结构
当在Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
什么是RS-485 RS-232
数据在通信双方之间传输,本质是传输物理的电平 比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰,比方说你传输一个5V的电压,到了接收端可能就变成了4.8V,并且通信的双方高低电平的参考电压可能不同。 那么这个时候就需要一个电平标准,来判断多少V的电压是高电平 1,多少V的电压是低电平 0 这就诞生了 RS-485 RS-232 **RS232:**是电子工业协会(Electronic Industries Association,EIA) 制定的异步传输标准接口,同时对应着电平标准和通信协议(时序),其电平标准:+3V~+15V对应0,-3V~-15V对应1。
- 全双工
- 逻辑1:-15V–5V
- 逻辑0:+3V–+15V
RS485:RS485是一种串口接口标准,为了长距离传输采用差分方式传输,传输的是差分信号,抗干扰能力比RS232强很多。两线压差为-2~-6V表示0,两线压差为+2~+6V表示1
- 半双工
- 逻辑1:+2V~+6V
- 逻辑0: -2V~ -6V
总结
ModBus大多使用场景的都是使用ModBus-RTU这个通信格式,其他的我们了解一下就行,如果想深入可以在去参考链接里面去看看