前面讲了一些Android串口通信的一些数据校验和基本使用,下面说说串口通信中与硬件之接的协议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)上引入一些附加域。
Modbus协议是一种请求/应答方式的交互过程,主机主动发起通讯请求,从机响应主机的请求,从机在没有收到主机的请求时,不会主动发送数据,从机之间不会进行通讯。
MODBUS 以一系列具有不同特征表格上的数据模型为基础。四个基本表格为:
1979年,Modicon 首先推出了串行Modbus标准,后来由于网络的普及,需要更高的传输速度,1997年制定了基于TCP网络的Modbus标准。 所以总的可分为两个传输模式:基于串行链路的和基于以太网TCP/IP的。
公共功能码
用户定义功能码
保留功能码
主机对从机写数据操作
从站地址 | 功能码 | 数据地址(高) | 数据地址(低) | 数据(高) | 数据(低) | 校验 |
---|---|---|---|---|---|---|
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协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
数据在通信双方之间传输,本质是传输物理的电平 比方说传输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
ModBus大多使用场景的都是使用ModBus-RTU这个通信格式,其他的我们了解一下就行,如果想深入可以在去参考链接里面去看看
一文看懂Modbus协议