什么是通讯协议?
在了解什么是Modbus之前,让我们先来看看什么是通信协议。
通讯协议(Communication Protocol)是一种规则或约定,用于在计算机系统、网络设备或不同系统之间进行数据交换和通信。这些协议定义了通信的标准和规范,确保发送者和接收者之间能够正确理解和解释传输的数据。
通讯协议包括物理层协议、数据链路层协议、网络层协议、传输层协议、应用层协议等多个层次,每个层次负责不同的任务。以下是通讯协议的一些关键方面:
数据格式: 通讯协议规定了数据的格式,包括数据的编码方式、字节顺序、数据帧的结构等。这确保了数据在传输过程中可以被正确地解析和重建。
通信方式: 协议定义了通信的方式,包括单工通信(单方向传输)、半双工通信(双方交替传输)和全双工通信(同时双向传输)等。
错误检测和纠错: 通讯协议通常包括一些机制,用于检测和纠正在传输过程中可能发生的错误,以确保数据的完整性和准确性。
流量控制: 通讯协议可以定义如何控制数据的流量,以避免数据过载或拥塞,从而提高通信的效率。
地址和标识: 协议可以包括设备或节点的地址和标识,以确保数据被正确地发送到目标设备。
会话管理: 在某些协议中,会话管理用于建立、维护和终止通信会话,确保通信的有序性和可控性。
我们常见的通信协议包括I2C、SPI、UART等,而Modbus则是一种串行通信协议。
什么是RS-485和RS-232?
在讨论Modbus时,经常会遇到RS-485和RS-232,那么它们究竟是什么呢?
RS-485(Recommended Standard 485)和 RS-232(Recommended Standard 232)是两种常用的串行通信标准,用于在计算机和外部设备之间传输数据。它们在物理层和电气特性上有一些重要的区别:
RS-232:
单端口通信: RS-232 是一种单端口通信标准,即数据信号只通过一个传输线进行传输,其中包括一个发送线(TX)和一个接收线(RX)。
电压电平: RS-232 使用电压电平来表示数据位。典型的RS-232电平为正负12V,其中正电压表示逻辑0,负电压表示逻辑1。
通信距离: RS-232通信通常适用于较短的距离,通信距离通常不超过50英尺(约15米),并且通信速率受到距离的限制。
点对点通信: RS-232通信是点对点的,每个连接只支持两台设备之间的通信,一个发送方和一个接收方。
用途: RS-232常用于连接计算机和外部设备,如串行打印机、调制解调器、串行鼠标等。它也可以用于短距离的点对点通信。
RS-485:
差分信号: RS-485 使用差分信号传输数据,它包括两个传输线,一个为正(A或非反相线),一个为负(B或反相线)。这种差分信号可以提高抗干扰性能。
电压电平: RS-485通常使用低电平差分信号,其中正线的电压大致等于负线的电压,这有助于减少传输线上的干扰。
通信距离: RS-485通信适用于较长距离,通常可覆盖几千英尺(数百米)的距离,这取决于通信速率和线缆质量。
多点通信: RS-485支持多点通信,多个设备可以连接到同一传输线上,并且可以同时进行通信。这使得RS-485非常适合用于工业控制和仪表等应用,其中需要多个设备之间的数据交换。
用途: RS-485通常用于工业自动化、远程监控、建筑自动化以及其他需要长距离和多设备通信的应用。它在这些领域中被广泛使用,因为它的差分信号设计使其更耐干扰,适应更长的通信距离,并支持多点通信。
如果您想进一步了解,请继续阅读:
USB转串口 TTL RS-232 RS-485 COM口 UART区别
USB转串口(USB to Serial)是一种将USB接口连接到串行通信接口的设备,通常用于将计算机连接到需要串行通信的外部设备。这些串口可以是TTL串口、RS-232串口或RS-485串口,具体区别如下:
TTL串口: TTL(Transistor-Transistor Logic)串口使用低电平(通常是0V表示逻辑0,3.3V或5V表示逻辑1)进行通信。它通常用于嵌入式系统和微控制器之间的通信。USB转TTL串口适用于连接计算机与TTL串口设备,例如Arduino等。
RS-232串口: RS-232是一种常见的串行通信标准,通常使用正负12V的电压电平表示逻辑0和逻辑1。USB转RS-232串口适用于连接计算机与老式串行设备,如串行打印机、调制解调器等。
RS-485串口: RS-485是一种差分信号串口标准,使用两个传输线(A和B)传输数据,其中一个线路是正相位,另一个线路是反相位。它具有抗干扰性和支持多点通信的能力,通常用于工业控制和长距离通信。USB转RS-485串口适用于连接计算机与RS-485串口设备,如工业自动化设备。
COM口(串口): COM口是计算机上用于串行通信的物理接口,通常使用RS-232或RS-485标准。COM口通常用于连接外部设备,如串行打印机、GPS接收器、数据采集器等。USB转COM口适用于计算机没有内置串行接口的情况,允许用户通过USB接口模拟COM口。
UART(通用异步收发传输器): UART是一种通信芯片或模块,用于将并行数据转换为串行数据以进行串行通信。UART可以与TTL、RS-232或RS-485等不同类型的串口配合使用。USB转UART通常是一个通用的串口适配器,可以用于连接不同类型的串口设备。
Modbus协议说明
Modbus诞生于1979年,最初由莫迪康公司(Modicon)开发,后来被施耐德电气公司收购。Modbus为设备和设备之间的通信提供了通用语言。它已成为工业领域通信协议的行业标准,并且是工业电子设备之间常用的连接方式之一。Modbus作为目前工业领域应用最广泛的协议之一,有着以下优点:
– Modbus协议是开放、公开发表且无版权要求的,可以广泛应用。
– Modbus协议支持多种电气接口,包括RS232、RS485、TCP/IP等,还可以在各种介质上传输,如双绞线、光纤、红外线、无线等。
– Modbus协议的消息帧格式简单、紧凑且易于理解。用户容易理解和使用,制造商容易开发和集成,方便形成工业控制网络。
Modbus协议的应用
最简单地说,Modbus是一种总线通信协议,类似于I2C和SPI,但不依赖于特定的硬件总线。Modbus之所以广泛使用,是因为它具有许多优点。
Modbus通信过程
需要注意的是,Modbus是一种一主多从的通信协议。在Modbus通信中,只有一个设备可以发送请求,其他从设备接收主机发送的请求数据并进行响应。从设备可以是各种外围设备,如I/O传感器、阀门、网络驱动器或其他类型的
测量设备。从站处理信息并使用Modbus将其数据发送给主站。换句话说,不能在同一时间内进行Modbus同步通信。主机一次只能向一个从机发送请求,总线上每次只有一个数据进行传输,即主机发送请求,从机响应。如果主机没有发送请求,总线上就没有数据通信。
需要特别注意的是,Modbus通信没有忙机制判断。例如,如果主机发送命令给从机,但从机没有收到或正在处理其他任务,那么从机将无法及时响应,因为Modbus总线只负责传输数据,没有其他仲裁机制。因此,必须通过软件的方式来判断是否成功接收到数据。
Modbus存储区
既然从机存储数据,必须有一种方式来进行文件操作。我们都知道,文件可以分为只读(Read-Only,-R)和读写(Read-Write,-RW)两种类型,而Modbus也有相应的存储区。
在Modbus协议中,存储的数据类型可以分为两种主要类型:布尔量和16位寄存器。
– 布尔量:这些数据可以表示诸如IO口电平高低、灯的开关状态等。
– 16位寄存器:这些数据通常用于表示传感器的温度数据、存储密码等信息。
Modbus协议将存储区分为4个区域,分别是0、1、3和4区。其中,1区和4区是可读可写的,而0区和3区是只读的。
此外,Modbus还为每个存储区分配了地址范围。主机在向从机请求数据时,只需告诉从机数据的起始地址和要获取的字节数,从机就可以发送数据给主机。
Modbus协议类型
在Modbus协议中,数据传输可以采用不同的介质和模式,主要有三种报文类型,包括ASCII、RTU(远程终端控制系统)和TCP。
对于串行端口,Modbus协议有多个版本,但最常见的包括以下四种:
– **Modbus-RTU**:采用紧凑的16进制表示数据的方式。Modbus-RTU在数据帧中附加了循环冗余校验(CRC),用于检测数据是否正确。一个典型的Modbus-RTU报文包含从机地址、功能码、数据和CRC校验。
– **Modbus-ASCII**:采用ASCII码表示数据,每个8位字节都被转换为两个ASCII字符发送。Modbus-ASCII也包含循环冗余校验,但使用了不同的校验方法。
– **Modbus-TCP**:Modbus-TCP不需要从机地址,而是需要MBAP(Modbus Application Protocol over TCP)报文头。由于TCP本身具有校验和差错检测能力,因此Modbus-TCP不需要额外的差错校验。
– **Modbus Plus**:这是另一种Modbus协议版本,用于特定的工业应用。
在这些版本中,Modbus-RTU最为常见,而Modbus-ASCII较少使用。下面我们将详细讨论Modbus-RTU协议。
Modbus-RTU协议
Modbus报文帧结构
Modbus报文是指主机发送给从机的一帧数据,其中包含了从机的地址、主机要执行的操作、数据以及校验码等信息。在串行链路上,Modbus报文的格式如下:
– **从机地址**:每个从机都有唯一的地址,占用一个字节,有效范围通常是1-247,其中255是广播地址,表示向所有从机发送请求。
– **功能码**:占用一个字节,它表示主机发送的请求是何种操作,不同的功能码对应不同的操作。
– **数据**:根据功能码的不同,包含不同的信息。例如,如果功能码是查询从机的数据,数据部分包括起始寄存器地址和要读取的寄存器数量。
– **校验码**:在数据传输过程中
,数据可能会受到干扰或损坏,CRC检验用于检测接收到的数据是否正确。
Modbus功能码
Modbus协议规定了多个功能码,每个功能码对应一种操作。虽然Modbus定义了多达20多种功能码,但实际应用中常用的只有其中的8种,用于对存储区的读写。以下是常用的Modbus功能码:
– **03**:读取多个寄存器的值。
– **06**:设置单个寄存器的值。
– **16**:设置多个寄存器的值。
– **01**:读取多个开关量输入。
– **02**:读取多个开关量输出。
– **05**:设置单个开关量输出。
– **15**:设置多个开关量输出。
– **23**:读取多个寄存器的值(扩展功能码)。
需要注意的是,不同的功能码对应不同的操作,因此主机在发送请求时需要指定功能码,以告知从机要执行的操作。
CRC校验
CRC(循环冗余校验)用于检测数据传输过程中的错误。在Modbus协议中,CRC校验占用两个字节,包含一个16位的二进制值。CRC值由发送设备计算并附加到数据帧上,在接收设备接收数据时重新计算CRC值,并与接收到的CRC校验值进行比较。如果这两个值不相等,就表示数据传输存在错误。
CRC校验的计算流程如下:
1. 预置一个16位寄存器为0xFFFF(全1),称之为CRC寄存器。
2. 把数据帧中的第一个字节的8位与CRC寄存器中的低字节进行异或运算,结果存回CRC寄存器。
3. 将CRC寄存器向右移动一位,最高位填充0,最低位被移出并进行检测。
4. 如果最低位为0,则重复第3步(继续下一次移位);如果最低位为1,则将CRC寄存器与预设的固定值(0xA001)进行异或运算。
5. 重复第3步和第4步,直到进行8次移位,处理完一个完整的8位。
6. 重复第2步到第5步来处理下一个8位,直到所有字节处理完成。
7. 最终CRC寄存器中的值就是CRC校验值。
此外,还有一种使用预先计算的表格来计算CRC的方法,它具有更快的计算速度,但需要较大的存储空间。这种方法在此不做详细说明。
发送和接收数据示例
下面我们将详细介绍Modbus-RTU协议的发送和接收数据示例。
1. 主机对从机读数据操作
主机发送报文格式如下:
01 03 00 01 00 01 D5 CA
解释:
– `0x01`:从机的地址。
– `0x03`:查询功能,读取从机寄存器的数据。
– `0x00 0x01`:表示读取的起始寄存器地址,从0x0001开始读取。
– `0x00 0x01`:表示查询的寄存器数量为1个。Modbus将数据存储在寄存器中,通过查询寄存器来获取不同变量的值。一个寄存器地址对应2字节数据,寄存器地址对应从机的实际存储地址。
– `0xD5 0xCA`:循环冗余校验 (CRC)。
从机回复报文格式如下:
01 03 02 00 17 F8 4A
解释:
– `0x01`:从机的地址。
– `0x03`:查询功能,读取从机寄存器的数据。
– `0x02`:返回字节数为2个,一个寄存器对应2个字节。
– `0x00 0x17`:寄存器的值是0x0017。
– `0xF8 0x4A`:循环冗余校验 (CRC)。
2. 主机对从机写数据操作
主机发送报文格式如下:
01 06 00 01 00 17 98 04
解释:
– `0x01`:从机的地址。
– `0x06`:修改功能,修改从机寄存器的数据。
– `0x00 0x01`:表示修改的起始寄存器地址,说明要修改0x0001-0x0003的存储内容。
– `0x00 0x17`:要修改的数据值为0x0017。
– `0x98 0x04`:循环冗余校验 (CRC)。
从机回复报文格式如下:
01 06 00 01 00 17 98 04
解释:
从机的回复与主机的发送相同。如果不同,说明发生了错误。
这是一个Modbus-RTU协议的简单示例,演示了主机如何向从机发送读取和写入数据的请求,并从从机接收响应。每个Modbus报文都包含从机地址、功能码、数据以及CRC校验,以确保可靠的数据传输。
Modbus-ASCII协议
Modbus-ASCII协议与Modbus-RTU协议相似,但在消息中的每个字节都作为两个ASCII字符发送。十六进制的0到F分别对应ASCII字符的0到9和A到F。
以下是Modbus-ASCII协议的特点:
– 每个字节都以ASCII字符表示,例如0x30~0x3A表示0到9,0x41~0
x46表示A到F。
– 字节之间使用空格分隔。
– 每个消息以回车符(CR,0x0D)和换行符(LF,0x0A)结束。
Modbus-ASCII的CRC校验与Modbus-RTU相同,但在ASCII格式下表示为ASCII字符。
Modbus-TCP协议
Modbus-TCP协议是基于TCP/IP协议的Modbus协议变种,用于在TCP/IP网络上进行通信。与Modbus-RTU和Modbus-ASCII协议不同,Modbus-TCP协议不使用物理串行链路,而是使用以太网或Wi-Fi等TCP/IP网络。
以下是Modbus-TCP协议的特点:
– Modbus-TCP使用标准的TCP/IP套接字连接,无需物理串行通信线路。
– Modbus-TCP消息与Modbus-RTU协议消息的结构相似,但不包括CRC校验。
– 在Modbus-TCP中,数据以二进制格式传输,而不是ASCII字符。
– Modbus-TCP消息通过TCP连接的套接字发送和接收。
– Modbus-TCP使用TCP端口502。
因此,与Modbus-RTU和Modbus-ASCII协议相比,Modbus-TCP协议更适合基于以太网的通信,通常用于现代工业自动化系统和设备。
总结
Modbus是一种用于工业领域通信的通用协议,具有多个版本,包括Modbus-RTU、Modbus-ASCII和Modbus-TCP。不同版本适用于不同的通信介质和场景。 Modbus-RTU通常用于串行通信,而Modbus-TCP用于以太网通信。 Modbus协议包括功能码、CRC校验等元素,用于发送和接收数据。使用Modbus协议,主机可以与从机进行通信,读取和写入数据,以实现自动化和控制系统。