Modbus协议的工作原理与应用场景

免费免费技术资料

这篇内容可直接阅读,适合用于基础学习和검색引流。

Modbus协议的工作原理与应用场景

什么是通讯协议?

在了解什么是Modbus之前,让我们先来看看什么是通信协议。 通讯协议(Communication Protocol)是一种规则或约定,用于在计算机系统、网络设备或不同系统之间进行데이터交换和通信。这些协议定义了通信的标准和规范,确保发送者和接收者之间能够正确理解和解释传输的데이터。 通讯协议包括物理层协议、데이터链路层协议、网络层协议、传输层协议、应用层协议等多个层次,每个层次负责不同的任务。以下是通讯协议的一些关键方面:
  1. 데이터格式: 通讯协议规定了데이터的格式,包括데이터的编码方式、바이트顺序、데이터帧的结构等。这确保了데이터在传输过程中可以被正确地解析和重建。
  2. 通信方式: 协议定义了通信的方式,包括单工通信(单方向传输)、半双工通信(双方交替传输)和全双工通信(同时双向传输)等。
  3. 错误检测和纠错: 通讯协议通常包括一些机制,用于检测和纠正在传输过程中可能发生的错误,以确保데이터的完整性和准确性。
  4. 流量控制: 通讯协议可以定义如何控制데이터的流量,以避免데이터过载或拥塞,从而提高通信的效率。
  5. 주소和标识: 协议可以包括设备或节点的주소和标识,以确保데이터被正确地发送到目标设备。
  6. 会话管理: 在某些协议中,会话管理用于建立、维护和终止通信会话,确保通信的有序性和可控性。
我们常见的通信协议包括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:
  1. 单端口通信: RS-232 是一种单端口通信标准,即데이터信号只通过一个传输线进行传输,其中包括一个发送线(TX)和一个接收线(RX)。
  2. 电压电平: RS-232 使用电压电平来表示데이터位。典型的RS-232电平为正负12V,其中正电压表示逻辑0,负电压表示逻辑1。
  3. 通信距离: RS-232通信通常适用于较短的距离,通信距离通常不超过50英尺(约15米),并且通信速率受到距离的限制。
  4. 点对点通信: RS-232通信是点对点的,每个连接只支持两台设备之间的通信,一个发送方和一个接收方。
  5. 用途: RS-232常用于连接计算机和外部设备,如串行打印机、调制解调器、串行鼠标等。它也可以用于短距离的点对点通信。
RS-485:
  1. 差分信号: RS-485 使用差分信号传输데이터,它包括两个传输线,一个为正(A或非反相线),一个为负(B或反相线)。这种差分信号可以提高抗干扰性能。
  2. 电压电平: RS-485通常使用低电平差分信号,其中正线的电压大致等于负线的电压,这有助于减少传输线上的干扰。
  3. 通信距离: RS-485通信适用于较长距离,通常可覆盖几千英尺(数百米)的距离,这取决于通信速率和线缆质量。
  4. 多点通信: RS-485支持多点通信,多个设备可以连接到同一传输线上,并且可以同时进行通信。这使得RS-485非常适合用于工业控制和仪表等应用,其中需要多个设备之间的데이터交换。
  5. 用途: RS-485通常用于산업 자동화、远程监控、建筑自动化以及其他需要长距离和多设备通信的应用。它在这些领域中被广泛使用,因为它的差分信号设计使其更耐干扰,适应更长的通信距离,并支持多点通信。
Modbus协议的工作原理与应用场景插图 如果您想进一步了解,请继续阅读:

USB转串口 TTL RS-232 RS-485 COM口 UART区别

USB转串口(USB to Serial)是一种将USB인터페이스连接到串行通信인터페이스的设备,通常用于将计算机连接到需要串行通信的外部设备。这些串口可以是TTL串口、RS-232串口或RS-485串口,具体区别如下:
  1. TTL串口: TTL(Transistor-Transistor Logic)串口使用低电平(通常是0V表示逻辑0,3.3V或5V表示逻辑1)进行通信。它通常用于嵌入式系统和微控制器之间的通信。USB转TTL串口适用于连接计算机与TTL串口设备,例如Arduino等。
  2. RS-232串口: RS-232是一种常见的串行通信标准,通常使用正负12V的电压电平表示逻辑0和逻辑1。USB转RS-232串口适用于连接计算机与老式串行设备,如串行打印机、调制解调器等。
  3. RS-485串口: RS-485是一种差分信号串口标准,使用两个传输线(A和B)传输데이터,其中一个线路是正相位,另一个线路是反相位。它具有抗干扰性和支持多点通信的能力,通常用于工业控制和长距离通信。USB转RS-485串口适用于连接计算机与RS-485串口设备,如산업 자동화设备。
  4. COM口(串口): COM口是计算机上用于串行通信的物理인터페이스,通常使用RS-232或RS-485标准。COM口通常用于连接外部设备,如串行打印机、GPS接收器、데이터采集器等。USB转COM口适用于计算机没有内置串行인터페이스的情况,允许用户通过USB인터페이스模拟COM口。
  5. UART(通用异步收发传输器): UART是一种通信芯片或模块,用于将并行데이터转换为串行데이터以进行串行通信。UART可以与TTL、RS-232或RS-485等不同类型的串口配合使用。USB转UART通常是一个通用的串口适配器,可以用于连接不同类型的串口设备。
Modbus协议的工作原理与应用场景插图1

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协议,主机可以与从机进行通信,读取和写入데이터,以实现自动化和控制系统。
把这篇资料用于真实项目?

进入工具中心进行报文解析、CRC 검증和设备调试,或提交需求获取选型与接入建议。

工程师会员

把这篇文章变成可执行的调试资料

开通后可使用高级报文解析、资料包下载、代码示例、工程案例和优先技术支持,适合真实项目交付。

高级工具不限次
资料包与代码包
完整工程案例库
优先技术支持入口

发表回复

您的邮箱주소不会被公开。 必填项已用 * 标注