Modbus通讯协议
- 格式:pdf
- 大小:250.42 KB
- 文档页数:12
Modbus通讯协议详解一、引言Modbus通讯协议是一种常用的串行通信协议,广泛应用于工业自动化领域。
本文将详细解析Modbus通讯协议的基本原理、数据格式、通信流程以及常见问题。
二、基本原理1. Modbus通讯协议采用主从结构,主要包括一个主站和多个从站。
主站负责发起通信请求,从站负责响应请求并返回数据。
2. Modbus通讯协议基于传统的串行通信方式,支持RS-232、RS-485等物理层接口。
3. Modbus通讯协议采用简单的请求/响应模式,主站发送请求帧,从站响应并返回数据帧。
三、数据格式1. Modbus通讯协议的数据单元被称为“寄存器”,分为输入寄存器(Input Register)、保持寄存器(Holding Register)、线圈(Coil)和离散输入(Discrete Input)四种类型。
2. 输入寄存器用于从站向主站传输只读数据,保持寄存器用于双向传输读写数据,线圈用于从站向主站传输开关量数据,离散输入用于主站向从站传输只读开关量数据。
3. Modbus通讯协议采用16位的数据单元标识符,用于标识寄存器的类型和地址。
4. 数据帧包括起始符、设备地址、功能码、数据区、错误校验等字段。
四、通信流程1. 主站向从站发送请求帧,请求帧包括设备地址、功能码、数据区等字段。
2. 从站接收到请求帧后,根据功能码执行相应的操作,并将结果存储在数据区中。
3. 从站发送响应帧,响应帧包括设备地址、功能码、数据区等字段。
4. 主站接收到响应帧后,解析数据区中的结果,并进行相应的处理。
五、常见问题1. Modbus通讯协议的数据传输是基于字节的,因此在不同字节序的系统中需要进行字节序转换。
2. Modbus通讯协议的速率、数据位、停止位和校验位等参数需要保持一致,否则通信将无法建立。
3. Modbus通讯协议的设备地址是唯一的,主站通过设备地址来区分不同的从站。
4. Modbus通讯协议的功能码定义了不同的操作类型,主站通过功能码来指定所需的操作。
Modbus通讯协议详解一、概述Modbus通讯协议是一种用于工业自动化领域的通讯协议,它允许不同的设备之间进行数据交换。
本文将详细介绍Modbus通讯协议的基本原理、通讯方式、数据帧格式以及常用功能码等内容。
二、基本原理Modbus通讯协议采用主从结构,其中主机负责发起通讯请求,从机负责响应请求并返回数据。
通讯过程中,主机通过发送请求帧来读取或写入从机的数据。
从机收到请求后进行相应的处理,并将结果返回给主机。
三、通讯方式Modbus通讯协议支持串行通讯和以太网通讯两种方式。
1. 串行通讯串行通讯采用RS-232或RS-485等物理层接口,通讯速率可根据实际需求进行设置。
在串行通讯中,主机通过发送特定的数据帧来与从机进行通讯。
2. 以太网通讯以太网通讯采用TCP/IP协议栈,通讯速率较高。
主机通过发送TCP报文与从机进行通讯,其中Modbus协议位于应用层。
四、数据帧格式Modbus通讯协议中的数据帧由起始符、地址、功能码、数据、校验等字段组成。
1. 起始符起始符用于标识数据帧的开始,通常为一个字节的0xFF。
2. 地址地址字段用于指定从机的地址,主机通过地址来选择与哪个从机进行通讯。
地址长度为一个字节,取值范围为1-247。
3. 功能码功能码用于指定通讯请求的类型,不同的功能码对应不同的操作。
常用的功能码包括读取线圈状态、读取输入状态、读取保持寄存器、写单个寄存器等。
4. 数据数据字段用于存储通讯请求或响应的数据。
数据的长度和格式取决于具体的功能码和操作类型。
5. 校验校验字段用于检测数据的完整性,常用的校验算法包括CRC校验和LRC校验。
五、常用功能码Modbus通讯协议定义了一系列功能码,用于实现不同的通讯操作。
1. 读取线圈状态(功能码:0x01)该功能码用于读取从机中的线圈状态,线圈状态为开(1)或闭(0)。
2. 读取输入状态(功能码:0x02)该功能码用于读取从机中的输入状态,输入状态为开(1)或闭(0)。
Modbus通讯协议详解一、引言Modbus通讯协议是一种常用于工业控制系统中的通信协议,它基于主从结构,用于实现不同设备之间的数据交换。
本文将详细介绍Modbus通讯协议的基本原理、通信方式、数据格式以及常见应用场景。
二、协议原理Modbus通讯协议是基于串行通信的协议,它使用简单的请求/响应模式进行数据交换。
协议包括两种通信方式:Modbus ASCII和Modbus RTU。
Modbus ASCII使用ASCII码表示数据,而Modbus RTU使用二进制码表示数据。
协议规定了数据的传输格式、通信命令、错误检测等。
三、通信方式1. Modbus ASCII通信方式Modbus ASCII通信方式使用ASCII码表示数据,每个字节使用两个ASCII字符表示,其中包括一个校验和。
通信过程中,主站发送请求命令,从站接收并处理请求,然后从站发送响应。
请求和响应之间使用回车换行符进行分隔。
2. Modbus RTU通信方式Modbus RTU通信方式使用二进制码表示数据,每个字节使用8位二进制表示。
通信过程中,主站发送请求命令,从站接收并处理请求,然后从站发送响应。
请求和响应之间使用帧间隔进行分隔。
四、数据格式1. Modbus ASCII数据格式Modbus ASCII数据格式由起始字符、从站地址、功能码、数据区、校验和和结束字符组成。
起始字符是冒号,结束字符是回车换行符。
校验和是通过对除起始字符和校验和本身外的所有字符进行异或运算得到的。
2. Modbus RTU数据格式Modbus RTU数据格式由从站地址、功能码、数据区、CRC校验和组成。
CRC校验和是通过对从站地址、功能码和数据区的所有字节进行CRC校验运算得到的。
五、常见应用场景Modbus通讯协议广泛应用于工业自动化领域,常见的应用场景包括:1. 监控系统:通过Modbus通讯协议,可以实现对各种传感器、仪表的数据采集和监控。
2. 控制系统:Modbus通讯协议可用于实现对各种执行器、控制器的控制和调节。
modbus通讯协议协议名称:Modbus通讯协议1. 介绍Modbus通讯协议是一种用于工业自动化领域的通信协议,旨在实现不同设备之间的数据交换。
该协议简单、易于实现,并且被广泛应用于监控、控制和数据采集系统中。
2. 目标本协议的目标是定义一种标准的通信方式,使得不同厂商的设备能够互相通信,并实现数据的读取和写入功能。
通过该协议,用户可以轻松地访问和控制各种设备,提高生产效率和系统可靠性。
3. 协议规范3.1 物理层Modbus通讯协议可以在串行通信和以太网通信两种物理层上实现。
串行通信使用RS-232或RS-485接口,以太网通信使用TCP/IP协议。
3.2 数据传输Modbus协议使用请求/响应模式进行数据传输。
请求消息由主站发送给从站,从站接收请求并返回响应消息。
每个消息由功能码、数据字段和错误检测字段组成。
3.3 功能码Modbus协议定义了一系列功能码,用于标识不同的操作类型。
常用的功能码包括读取线圈状态、读取输入状态、读取保持寄存器、读取输入寄存器、写单个线圈、写单个寄存器等。
3.4 寄存器地址Modbus协议使用地址来标识不同的寄存器。
线圈和离散输入的地址范围为0~65535,保持寄存器和输入寄存器的地址范围为0~65535。
3.5 数据格式Modbus协议支持多种数据格式,包括二进制、十进制、十六进制等。
具体的数据格式由设备厂商自行定义。
4. 协议流程4.1 建立连接在使用Modbus协议进行通信之前,主站需要先与从站建立连接。
建立连接的方式取决于物理层的选择,可以是串行通信或以太网通信。
4.2 发送请求主站发送请求消息给从站,请求消息包括功能码、数据字段和错误检测字段。
从站接收请求消息并进行处理。
4.3 响应消息从站接收到请求消息后,根据功能码进行相应的操作,并生成响应消息。
响应消息包括功能码、数据字段和错误检测字段,从站将响应消息发送给主站。
4.4 数据解析主站接收到从站发送的响应消息后,对响应消息进行解析,提取所需的数据。
Modbus通讯协议一、什么是Modbus?Modbus是一种常用的通信协议,用于与PLC、仪表等工业设备进行数据通信。
它最初由Modicon(现在是施耐德电气的一部分)于1979年开发,用于连接PLC和其他可编程逻辑控制器。
该协议基于简单的客户机/服务器架构,可用于Ethernet、RS-232以及其他通信介质。
Modbus协议具有简单、灵活、开放且易于实现的特点。
它广泛应用于各种设备之间的通信,包括控制器、传感器、计量仪表、数据采集器等。
Modbus还被广泛应用于智能家居、自动化控制系统以及工业自动化领域,成为设备之间通信的标准。
二、Modbus通信协议的架构Modbus协议的通信架构大致可以分为三层:物理层、数据链路层和应用层。
1、物理层:控制不同设备之间的数据传输,包括物理连接方式、传输率、编码格式等参数。
2、数据链路层:主要负责数据的完整性检查,包括错误校验等。
3、应用层:最上层的协议层,也是最为重要的部分。
其中包含了各种不同的命令,用于设备之间的通信。
Modbus协议支持不同的物理连接方式和通信协议,包括RS-232、RS-485、以太网等。
此外,Modbus还支持多种数据格式,包括二进制、ASCII和RTU等。
三、Modbus通信协议的主从模式在Modbus协议中,设备可以分为两种类型:主设备(Master)和从设备(Slave)。
主设备负责发起请求并接收响应,而从设备则负责响应请求并返回数据。
在主从模式下,每个从设备都会分配一个唯一的地址。
主设备使用从设备的地址进行通信。
主从模式通讯过程如下:1、主设备发送一条特定的Modbus帧,包含了要读取或写入的寄存器地址,及操作码等信息。
2、从设备收到Modbus帧后,根据地址和操作码进行相应的操作,并生成响应帧。
3、响应帧包含了读取或写入操作的结果,主设备接收响应帧并解析其中的数据。
4、系统将以前获取的数据发送给主设备。
四、Modbus协议的寄存器类型Modbus协议有许多不同类型的寄存器,包括输入寄存器(Input Register)、保持寄存器(Holding Register)、线圈寄存器(Coil Register)和离散输入寄存器(Discrete Input Register)等。
Modbus通讯协议详解一、介绍Modbus通讯协议是一种常用的工业通讯协议,用于在自动化系统中实现设备之间的数据传输和通信。
本文将详细介绍Modbus通讯协议的基本原理、通信方式、数据格式及其应用场景。
二、基本原理Modbus通讯协议基于主从结构,由一个主站和多个从站组成。
主站负责发起通信请求,而从站则负责响应请求并提供所需的数据。
通信过程中,主站通过读写寄存器的方式与从站进行数据交换。
三、通信方式Modbus通讯协议支持两种常用的通信方式:串行通信和以太网通信。
1. 串行通信串行通信使用RS-232或RS-485等物理层接口,通过串口进行数据传输。
串行通信具有成本低、传输距离短、抗干扰性强等特点,适用于小规模的通信系统。
2. 以太网通信以太网通信使用TCP/IP协议栈,通过以太网进行数据传输。
以太网通信具有传输速度快、传输距离远、支持大规模网络等优点,适用于大规模的工业自动化系统。
四、数据格式Modbus通讯协议定义了几种常用的数据格式,包括离散输入寄存器、线圈、输入寄存器和保持寄存器。
1. 离散输入寄存器(Discrete Inputs)离散输入寄存器用于存储只读的离散输入信号,例如开关状态、传感器信号等。
2. 线圈(Coils)线圈用于存储读写的开关量信号,例如控制继电器、电机等的状态。
3. 输入寄存器(Input Registers)输入寄存器用于存储只读的模拟量信号,例如温度、压力等传感器的数据。
4. 保持寄存器(Holding Registers)保持寄存器用于存储读写的模拟量信号,例如设定温度、设定速度等参数。
五、应用场景Modbus通讯协议广泛应用于工业自动化领域,常见的应用场景包括:1. 监控系统Modbus通讯协议可用于监控系统中,实现对各种设备的数据采集和监控。
例如,通过读取温度传感器的数据,实时监测温度变化。
2. 控制系统Modbus通讯协议可用于控制系统中,实现对各种设备的控制和调节。
modbus协议通讯协议协议名称:Modbus协议通讯协议1. 引言Modbus协议是一种通信协议,广泛应用于工业自动化领域。
本协议旨在定义Modbus通信的规范和标准,以确保各个设备之间能够有效地进行数据交换和通信。
2. 范围本协议适用于使用Modbus通信协议进行数据交换的设备和系统。
涵盖了Modbus通信协议的基本原则、数据格式、通信方式、错误处理等方面的规范。
3. 术语和定义3.1 Modbus主站:指发起通信请求的设备或系统。
3.2 Modbus从站:指接收并响应主站通信请求的设备或系统。
3.3 寄存器:指Modbus设备中存储数据的单元。
3.4 线圈:指Modbus设备中用于控制的开关量数据。
4. 通信方式4.1 物理层Modbus协议支持多种物理层通信方式,包括串口通信、以太网通信等。
具体的物理层通信方式需要根据实际情况进行选择和配置。
4.2 数据链路层Modbus协议使用帧格式进行数据传输。
每个帧包括起始符、设备地址、功能码、数据域、校验码等字段。
4.3 功能码Modbus协议定义了一系列功能码,用于标识不同的通信功能和操作。
常用的功能码包括读取寄存器、写入寄存器、读取线圈状态等。
5. 数据格式5.1 寄存器数据格式Modbus协议支持多种寄存器数据格式,包括16位无符号整数、16位有符号整数、32位无符号整数、32位有符号整数、浮点数等。
5.2 线圈数据格式Modbus协议使用位来表示线圈的状态,0表示关闭,1表示打开。
6. 通信流程6.1 主站发起通信请求主站通过发送帧的方式向从站发送通信请求。
帧中包括设备地址、功能码、数据域等字段,用于描述具体的通信操作。
6.2 从站响应通信请求从站接收到主站的通信请求后,根据请求的功能码进行相应的操作,并将结果封装在帧中发送给主站。
6.3 错误处理在通信过程中,可能会出现各种错误,如通信超时、校验错误等。
主站和从站需要根据具体的错误类型进行相应的错误处理和恢复机制。
modbus通讯协议协议名称:Modbus通讯协议1. 引言Modbus通讯协议是一种用于工业自动化领域的通信协议,常用于连接不同厂商的设备,实现设备之间的数据交换和控制操作。
本协议旨在规范Modbus通信的数据格式、传输方式和通信规则,以确保设备之间的互操作性和数据的准确传输。
2. 范围本协议适用于Modbus通信协议的各个版本,包括Modbus RTU、Modbus ASCII和Modbus TCP/IP等。
同时,本协议还适用于Modbus通信协议的各种设备类型,包括主站(Master)和从站(Slave)。
3. 术语和定义在本协议中,以下术语和定义适用:- 主站(Master):发起Modbus通信请求的设备。
- 从站(Slave):响应主站请求的设备。
- 寄存器(Register):存储设备中的数据的内存单元。
- 线圈(Coil):控制设备中的开关状态的内存单元。
- 功能码(Function Code):用于标识Modbus通信请求的操作类型。
4. 数据格式4.1 Modbus RTUModbus RTU使用二进制编码,数据帧包括起始位、设备地址、功能码、数据域、校验位和停止位。
具体格式如下:- 起始位:一个起始位,用于标识数据帧的开始。
- 设备地址:一个字节,用于标识主站要发送请求的从站地址。
- 功能码:一个字节,用于标识主站请求的操作类型。
- 数据域:根据功能码的不同,数据域的长度可变。
- 校验位:两个字节,用于校验数据域的正确性。
- 停止位:一个停止位,用于标识数据帧的结束。
4.2 Modbus ASCIIModbus ASCII使用ASCII编码,数据帧包括起始符、设备地址、功能码、数据域、LRC校验和和结束符。
具体格式如下:- 起始符:一个冒号(:),用于标识数据帧的开始。
- 设备地址:两个ASCII字符,用于标识主站要发送请求的从站地址。
- 功能码:两个ASCII字符,用于标识主站请求的操作类型。
modbus协议通讯协议协议名称:Modbus协议通讯协议一、引言Modbus协议是一种通讯协议,用于在不同设备之间进行数据交换。
本协议旨在规范Modbus通讯协议的使用,确保设备之间的数据传输准确、可靠。
二、范围本协议适合于使用Modbus协议进行通讯的设备,包括但不限于工业自动化、楼宇自控、能源监控等领域。
三、术语定义1. Modbus协议:一种开放的通信协议,用于在不同设备之间进行数据交换。
2. 主站:通过Modbus协议主动发起通讯请求的设备。
3. 从站:响应主站请求的设备。
4. 寄存器:用于存储数据的内存单元。
四、通讯方式1. 物理层:Modbus协议支持多种物理层接口,包括串行通讯(如RS-232、RS-485)和以太网通讯。
2. 数据链路层:Modbus协议使用简单的二进制传输格式,包括起始位、数据位、校验位和住手位等。
3. 传输方式:Modbus协议支持两种传输方式,即RTU(Remote Terminal Unit)和ASCII(American Standard Code for Information Interchange)。
五、功能码Modbus协议定义了一系列功能码,用于不同类型的通讯请求和响应。
以下是常用的功能码:1. 读取保持寄存器(Read Holding Registers):用于从从站读取保持寄存器中的数据。
2. 写入单个保持寄存器(Write Single Holding Register):用于向从站写入单个保持寄存器的数据。
3. 写入多个保持寄存器(Write Multiple Holding Registers):用于向从站写入多个连续保持寄存器的数据。
4. 读取输入寄存器(Read Input Registers):用于从从站读取输入寄存器中的数据。
5. 诊断(Diagnostics):用于执行诊断操作,如清除通讯错误计数器等。
六、通讯流程1. 主站发起请求:主站向从站发送通讯请求,包括功能码和相关参数。
Modbus通讯协议详解Modbus通讯协议是一种用于工业自动化领域的通信协议,广泛应用于监控、控制和数据采集等领域。
本文将详细介绍Modbus通讯协议的基本原理、通信方式、数据结构和应用场景。
一、Modbus通讯协议的基本原理Modbus通讯协议是基于主从结构的通信协议,其中主机负责发送请求并接收响应,从机负责接收请求并发送响应。
通信使用串行通信或以太网通信方式,支持不同的物理层接口。
Modbus通讯协议采用简单、轻量级的数据传输格式,以字节为基本单位进行数据传输。
通信过程中,主机通过发送请求帧来获取从机的数据或控制从机的操作。
从机接收到请求后,根据请求的功能码进行相应的操作,并将结果通过响应帧返回给主机。
二、Modbus通讯协议的通信方式Modbus通讯协议支持两种主要的通信方式:串行通信和以太网通信。
1. 串行通信串行通信是Modbus通讯协议最早采用的通信方式,适用于较短距离的通信。
常用的串行通信接口有RS-232、RS-485等。
在串行通信中,数据通过串行线路以二进制形式传输。
2. 以太网通信以太网通信是现代工业自动化领域中常用的通信方式,适用于长距离通信和大规模系统。
以太网通信使用TCP/IP协议栈,数据通过以太网以数据包的形式传输。
三、Modbus通讯协议的数据结构Modbus通讯协议的数据结构包括功能码、数据地址、数据长度和数据内容。
1. 功能码功能码用于定义请求或响应的类型,常用的功能码有读取线圈状态、读取输入状态、读取保持寄存器、读取输入寄存器、写单个线圈、写单个寄存器等。
不同的功能码对应不同的操作。
2. 数据地址数据地址用于指定要读取或写入的数据的位置。
对于线圈和输入状态,数据地址从0开始计数;对于保持寄存器和输入寄存器,数据地址从1开始计数。
3. 数据长度数据长度用于指定要读取或写入的数据的长度。
对于线圈和输入状态,数据长度表示连续的位数;对于保持寄存器和输入寄存器,数据长度表示连续的字节个数。
Modbus通信协议->工业控制已从单机控制走向集中监控集散控制如今已进入网络时代工业控制器连网也为网络管理提供了方便Modbus就是工业控制器的网络协议中的一种一M odbus 协议简介Modbus 协议是应用于电子控制器上的一种通用语言通过此协议控制器相互之间控制器经由网络例如以太网和其它设备之间可以通信它已经成为一通用工业标准有了它不同厂商生产的控制设备可以连成工业网络进行集中监控此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的它描述了一控制器请求访问其它设备的过程如果回应来自其它设备的请求以及怎样侦测错误并记录它制定了消息域格局和内容的公共格式当在一Modbus网络上通信时此协议决定了每个控制器须要知道它们的设备地址识别按地址发来的消息决定要产生何种行动如果需要回应控制器将生成反馈信息并用Modbus协议发出在其它网络上包含了Modbus协议的消息转换为在此网络上使用的帧或包结构这种转换也扩展了根据具体的网络解决节地址路由路径及错误检测的方法1在Modbus网络上转输标准的Modbus口是使用一RS-232C兼容串行接口它定义了连接口的针脚电缆信号位传输波特率奇偶校验控制器能直接或经由Modem组网控制器通信使用主从技术即仅一设备主设备能初始化传输查询其它设备从设备根据主设备查询提供的数据作出相应反应典型的主设备主机和可编程仪表典型的从设备可编程控制器主设备可单独和从设备通信也能以广播方式和所有从设备通信如果单独通信从设备返回一消息作为回应如果是以广播方式查询的则不作任何回应Modbus协议建立了主设备查询的格式设备或广播地址功能代码所有要发送的数据一错误检测域从设备回应消息也由Modbus协议构成包括确认要行动的域任何要返回的数据和一错误检测域如果在消息接收过程中发生一错误或从设备不能执行其命令从设备将建立一错误消息并把它作为回应发送出去2在其它类型网络上转输在其它网络上控制器使用对等技术通信故任何控制都能初始和其它控制器的通信这样在单独的通信过程中控制器既可作为主设备也可作为从设备提供的多个内部通道可允许同时发生的传输进程在消息位Modbus协议仍提供了主从原则尽管网络通信方法是对等如果一控制器发送一消息它只是作为主设备并期望从从设备得到回应同样当控制器接收到一消息它将建立一从设备回应格式并返回给发送的控制器3查询回应周期1查询查询消息中的功能代码告之被选中的从设备要执行何种功能数据段包含了从设备要执行功能的任何附加信息例如功能代码03是要求从设备读保持寄存器并返回它们的内容数据段必须包含要告之从设备的信息从何寄存器开始读及要读的寄存器数量错误检测域为从设备提供了一种验证消息内容是否正确的方法2回应如果从设备产生一正常的回应在回应消息中的功能代码是在查询消息中的功能代码的回应数据段包括了从设备收集的数据象寄存器值或状态如果有错误发生功能代码将被修改以用于指出回应消息是错误的同时数据段包含了描述此错误信息的代码错误检测域允许主设备确认消息内容是否可用图1 主-从查询-回应周期表二两种传输方式控制器能设置为两种传输模式ASCII或RTU中的任何一种在标准的Modbus网络通信用户选择想要的模式包括串口通信参数波特率校验方式等在配置每个控制器的时候在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数ASCII模式RTU模式所选的ASCII或RTU方式仅适用于标准的Modbus网络它定义了在这些网络上连续传输的消息段的每一位以及决定怎样将信息打包成消息域和如何解码在其它网络上象MAP和Modbus Plus Modbus消息被转成与串行传输无关的帧1ASCII模式当控制器设为在Modbus网络上以ASCII美国标准信息交换代码模式通信在消息中的每个8Bit字节都作为两个ASCII字符发送这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误代码系统十六进制ASCII字符0...9 A...F消息中的每个ASCII字符都是一个十六进制字符组成每个字节的位1个起始位7个数据位最小的有效位先发送1个奇偶校验位无校验则无1个停止位有校验时2个Bit无校验时错误检测域LRC(纵向冗长检测)2RTU模式当控制器设为在Modbus网络上以RTU远程终端单元模式通信在消息中的每个8Bit字节包含两个4Bit的十六进制字符这种方式的主要优点是在同样的波特率下可比ASCII方式传送更多的数据代码系统8位二进制十六进制数0...9 A...F消息中的每个8位域都是一个两个十六进制字符组成每个字节的位1个起始位8个数据位最小的有效位先发送1个奇偶校验位无校验则无1个停止位有校验时2个Bit无校验时错误检测域CRC(循环冗长检测)三Modbus消息帧两种传输模式中ASCII或RTU传输设备以将Modbus消息转为有起点和终点的帧这就允许接收的设备在消息起始处开始工作读地址分配信息判断哪一个设备被选中广播方式则传给所有设备判知何时信息已完成部分的消息也能侦测到并且错误能设置为返回结果1ASCII帧使用ASCII模式消息以冒号:字符ASCII码 3AH开始以回车换行符结束ASCII码0DH,0AH其它域可以使用的传输字符是十六进制的0...9,A...F网络上的设备不断侦测:”字符当有一个冒号接收到时每个设备都解码下个域地址域来判断是否发给自己的消息中字符间发送的时间间隔最长不能超过1秒否则接收的设备将认为传输错误一个典型消息帧如下所示图2 ASCII消息帧2RTU帧使用RTU模式消息发送至少要以3.5个字符时间的停顿间隔开始在网络波特率下多样的字符时间这是最容易实现的(如下图的T1-T2-T3-T4所示)传输的第一个域是设备地址可以使用的传输字符是十六进制的0...9,A...F网络设备不断侦测网络总线包括停顿间隔时间内当第一个域地址域接收到每个设备都进行解码以判断是否发往自己的在最后一个传输字符之后一个至少3.5个字符时间的停顿标定了消息的结束一个新的消息可在此停顿后开始整个消息帧必须作为一连续的流转输如果在帧完成之前有超过 1.5个字符时间的停顿时间接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域同样地如果一个新消息在小于 3.5个字符时间内接着前个消息开始接收的设备将认为它是前一消息的延续这将导致一个错误因为在最后的CRC域的值不可能是正确的一典型的消息帧如下所示图3 RTU消息帧3地址域消息帧的地址域包含两个字符ASCII或8Bit RTU可能的从设备地址是0...247 (十进制)单个设备的地址范围是 1...247主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备当从设备发送回应消息时它把自己的地址放入回应的地址域中以便主设备知道是哪一个设备作出回应地址0是用作广播地址以使所有的从设备都能认识当Modbus协议用于更高水准的网络广播可能不允许或以其它方式代替4如何处理功能域消息帧中的功能代码域包含了两个字符ASCII或8Bits RTU可能的代码范围是十进制的1...255当然有些代码是适用于所有控制器有此是应用于某种控制器还有些保留以备后用当消息从主设备发往从设备时功能代码域将告之从设备需要执行哪些行为例如去读取输入的开关状态读一组寄存器的数据内容读从设备的诊断状态允许调入记录校验在从设备中的程序等当从设备回应时它使用功能代码域来指示是正常回应(无误)还是有某种错误发生称作异议回应对正常回应从设备仅回应相应的功能代码对异议回应从设备返回一等同于正常代码的代码但最重要的位置为逻辑1例如一从主设备发往从设备的消息要求读一组保持寄存器将产生如下功能代码0 0 0 0 0 0 1 1 十六进制03H对正常回应从设备仅回应同样的功能代码对异议回应它返回1 0 0 0 0 0 1 1 十六进制83H除功能代码因异议错误作了修改外从设备将一独特的代码放到回应消息的数据域中这能告诉主设备发生了什么错误主设备应用程序得到异议的回应后典型的处理过程是重发消息或者诊断发给从设备的消息并报告给操作员5数据域数据域是由两个十六进制数集合构成的范围00...FF根据网络传输模式这可以是由一对ASCII 字符组成或由一RTU字符组成从主设备发给从设备消息的数据域包含附加的信息从设备必须用于进行执行由功能代码所定义的所为这包括了象不连续的寄存器地址要处理项的数目域中实际数据字节数例如如果主设备需要从设备读取一组保持寄存器功能代码03数据域指定了起始寄存器以及要读的寄存器数量如果主设备写一组从设备的寄存器功能代码10十六进制数据域则指明了要写的起始寄存器以及要写的寄存器数量数据域的数据字节数要写入寄存器的数据如果没有错误发生从从设备返回的数据域包含请求的数据如果有错误发生此域包含一异议代码主设备应用程序可以用来判断采取下一步行动在某种消息中数据域可以是不存在的0长度例如主设备要求从设备回应通信事件记录功能代码0B十六进制从设备不需任何附加的信息6错误检测域标准的Modbus网络有两种错误检测方法错误检测域的内容视所选的检测方法而定ASCII当选用ASCII模式作字符帧错误检测域包含两个ASCII字符这是使用LRC纵向冗长检测方法对消息内容计算得出的不包括开始的冒号符及回车换行符LRC字符附加在回车换行符前面RTU当选用RTU模式作字符帧错误检测域包含一16Bits值(用两个8位的字符来实现)错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的CRC域附加在消息的最后添加时先是低字节然后是高字节故CRC的高位字节是发送消息的最后一个字节7字符的连续传输当消息在标准的Modbus系列网络传输时每个字符或字节以如下方式发送从左到右最低有效位...最高有效位使用ASCII字符帧时位的序列是使用RTU字符帧时位的序列是四错误检测方法标准的Modbus串行网络采用两种错误检测方法奇偶校验对每个字符都可用帧检测LRC或CRC应用于整个消息它们都是在消息发送前由主设备产生的从设备在接收过程中检测每个字符和整个消息帧用户要给主设备配置一预先定义的超时时间间隔这个时间间隔要足够长以使任何从设备都能作为正常反应如果从设备测到一传输错误消息将不会接收也不会向主设备作出回应这样超时事件将触发主设备来处理错误发往不存在的从设备的地址也会产生超时1奇偶校验用户可以配置控制器是奇或偶校验或无校验这将决定了每个字符中的奇偶校验位是如何设置的如果指定了奇或偶校验1”的位数将算到每个字符的位数中ASCII模式7个数据位RTU中8个数据位例如RTU字符帧中包含以下8个数据位1 1 0 0 0 1 0 1整个1”的数目是4个如果便用了偶校验帧的奇偶校验位将是0便得整个1”的个数仍是4个如果便用了奇校验帧的奇偶校验位将是1便得整个1”的个数是5个如果没有指定奇偶校验位传输时就没有校验位也不进行校验检测代替一附加的停止位填充至要传输的字符帧中2LRC检测使用ASCII模式消息包括了一基于LRC方法的错误检测域LRC域检测了消息域中除开始的冒号及结束的回车换行号外的内容LRC域是一个包含一个8位二进制值的字节LRC值由传输设备来计算并放到消息帧中接收设备在接收消息的过程中计算LRC并将它和接收到消息中LRC域中的值比较如果两值不等说明有错误LRC方法是将消息中的8Bit的字节连续累加丢弃了进位LRC简单函数如下static unsigned char LRC(auchMsg,usDataLen)unsigned char *auchMsg ; /* 要进行计算的消息 */unsigned short usDataLen ; /* LRC 要处理的字节的数量*/{ unsigned char uchLRC = 0 ; /* LRC 字节初始化 */while (usDataLen--) /* 传送消息 */uchLRC += *auchMsg++ ; /* 累加*/return ((unsigned char)(-((char_uchLRC))) ;}3CRC检测使用RTU模式消息包括了一基于CRC方法的错误检测域CRC域检测了整个消息的内容CRC域是两个字节包含一16位的二进制值它由传输设备计算后加入到消息中接收设备重新计算收到消息的CRC并与接收到的CRC域中的值比较如果两值不同则有误CRC是先调入一值是全1”的16位寄存器然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理仅每个字符中的8Bit数据对CRC有效起始位和停止位以及奇偶校验位均无效CRC产生过程中每个8位字符都单独和寄存器内容相或OR结果向最低有效位方向移动最高有效位以0填充LSB被提取出来检测如果LSB为1寄存器单独和预置的值或一下如果LSB为0则不进行整个过程要重复8次在最后一位第8位完成后下一个8位字节又单独和寄存器的当前值相或最终寄存器中的值是消息中所有的字节都执行之后的CRC值CRC添加到消息中时低字节先加入然后高字节CRC简单函数如下unsigned short CRC16(puchMsg, usDataLen)unsigned char *puchMsg ; /* 要进行CRC校验的消息 */ unsigned short usDataLen ; /* 消息中字节数 */{unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */ unsigned uIndex ; /* CRC循环中的索引 */while (usDataLen--) /* 传输消息缓冲区 */{uIndex = uchCRCHi ^ *puchMsgg++ ; /* 计算CRC */ uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ; uchCRCLo = auchCRCLo[uIndex] ;}return (uchCRCHi << 8 | uchCRCLo) ;}/* CRC 高位字节值表 */static unsigned char auchCRCHi[] =0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;/* CRC低位字节值表*/static char auchCRCLo[] =0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;ModBus网络是一个工业通信系统由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成其系统结构既包括硬件亦包括软件它可应用于各种数据采集和过程监控下表1是ModBus的功能码定义表1 ModBus功能码01 READ COIL STATUS02 READ INPUT STATUS03 READ HOLDING REGISTER04 READ INPUT REGISTER05 WRITE SINGLE COIL06 WRITE SINGLE REGISTER15 WRITE MULTIPLE COIL16 WRITE MULTIPLE REGISTERModBus网络只是一个主机所有通信都由他发出网络可支持247个之多的远程从属控制器但实际所支持的从机数要由所用通信设备决定采用这个系统各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务表2是ModBus各功能码对应的数据类型表2 Modbus功能与数据类型对应表1ModBus的传输方式在ModBus系统中有2种传输模式可选择这2种传输模式与从机PC通信的能力是同等的选择时应视所用ModBus主机而定每个ModBus系统只能使用一种模式不允许2种模式混用一种模式是ASCII美国信息交换码另一种模式是RTU远程终端设备这两种模式的定义见表3表3 ASCII和RTU传输模式的特性ASCII可打印字符便于故障检测而且对于用高级语言如Fortan编程的主计算机及主PC很适宜RTU则适用于机器语言编程的计算机和PC主机用RTU模式传输的数据是8位二进制字符如欲转换为ASCII模式则每个RTU字符首先应分为高位和低位两部分这两部分各含4位然后转换成十六进制等量值用以构成报文的ASCII 字符都是十六进制字符ASCII模式使用的字符虽是RTU模式的两倍但ASCII数据的译玛和处理更为容易一些此外用RTU模式时报文字符必须以连续数据流的形式传送用ASCII模式字符之间可产生长达1s的间隔以适应速度较快的机器2ModBus的数据校验方式CRC-16循环冗余错误校验CRC-16错误校验程序如下报文此处只涉及数据位不指起始位停止位和任选的奇偶校验位被看作是一个连续的二进制其最高有效位MSB首选发送报文先与X16相乘左移16位然后看X16+X15+X2+1除X16+X15+X2+1可以表示为二进制数11000000000000101整数商位忽略不记16位余数加入该报文MSB先发送成为2个CRC 校验字节余数中的1全部初始化以免所有的零成为一条报文被接收经上述处理而含有CRC 字节的报文若无错误到接收设备后再被同一多项式X16+X15+X2+1除会得到一个零余数接收设备核验这个CRC字节并将其与被传送的CRC比较全部运算以2为模无进位习惯于成串发送数据的设备会首选送出字符的最右位LSB-最低有效位而在生成CRC情况下发送首位应是被除数的最高有效位MSB由于在运算中不用进位为便于操作起见计算CRC时设MSB在最右位生成多项式的位序也必须反过来以保持一致多项式的MSB略去不记因其只对商有影响而不影响余数生成CRC-16校验字节的步骤如下装如一个16位寄存器所有数位均为1该16位寄存器的高位字节与开始8位字节进行异或运算运算结果放入这个16位寄存器把这个16寄存器向右移一位若向右标记位移出的数位是1则生成多项式1010000000000001和这个寄存器进行异或运算若向右移出的数位是0则返回重复和直至移出8位另外8位与该十六位寄存器进行异或运算重复~直至该报文所有字节均与16位寄存器进行异或运算并移位8次这个16位寄存器的内容即2字节CRC错误校验被加到报文的最高有效位另外在某些非ModBus通信协议中也经常使用CRC16作为校验手段而且产生了一些CRC16的变种他们是使用CRC16多项式X16+X15+X2+1单首次装入的16位寄存器为0000使用CRC16的反序X16+X14+X1+1首次装入寄存器值为0000或FFFFHLRC纵向冗余错误校验LRC错误校验用于ASCII模式这个错误校验是一个8位二进制数可作为2个ASCII十六进制字节传送把十六进制字符转换成二进制加上无循环进位的二进制字符和二进制补码结果生成LRC错误校验参见图这个LRC在接收设备进行核验并与被传送的LRC进行比较冒号回车符号CR换行字符LF和置入的其他任何非ASCII十六进制字符在运算时忽略不计--------------------------------------------------------------------------------版权所有(C) 1999 [珠海裕泉水务公司]保留所有权利修订日期 2003年05月12日。