Modbus RTU协议简单说明
MODBUS-RTU通讯协议简介

MODBUS-RTU通讯协议简介2008-10-10 17:271.1 Modbus协议简述ACRXXXE系列仪表使用的是Modbus-RTU通讯协议,MODBUS协议详细定义了校验码、数据序列等,这些都是特定数据交换的必要内容。
MODBUS协议在一根通讯线上使用主从应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。
首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,终端设备发出的应答信号以相反的方向传输给主机。
Modbus协议只允许在主机(PC,PLC等)和终端设备之间通讯,而不允许独立的终端设备之间的数据交换,这样各终端设备不会在它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。
1.2 查询—回应周期1.2.1 查询查询消息中的功能代码告之被选中的从设备要执行何种功能。
数据段包含了从设备要执行功能的任何附加信息。
例如功能代码03是要求从设备读保持寄存器并返回它们的内容。
数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。
错误检测域为从设备提供了一种验证消息内容是否正确的方法。
1.2.2 回应如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。
数据段包括了从设备收集的数据:如寄存器值或状态。
如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。
错误检测域允许主设备确认消息内容是否可用。
1.3 传输方式传输方式是指一个数据帧内一系列独立的数据结构以及用于传输数据的有限规则,下面定义了与Modbus 协议– RTU方式相兼容的传输方式。
每个字节的位:· 1个起始位· 8个数据位,最小的有效位先发送·无奇偶校验位· 1个停止位错误检测(Error checking):CRC(循环冗余校验)1.4 协议当数据帧到达终端设备时,它通过一个简单的“端口”进入被寻址到的设备,该设备去掉数据帧的“信封”(数据头),读取数据,如果没有错误,就执行数据所请求的任务,然后,它将自己生成的数据加入到取得的“信封”中,把数据帧返回给发送者。
ModBusRTU通讯协议

ModBusRTU通讯协议协议名称:ModBusRTU通讯协议一、引言ModBusRTU通讯协议是一种用于串行通信的协议,主要用于工业自动化领域中的设备间通信。
本协议旨在规范ModBusRTU通讯协议的格式、数据结构和通信流程,以确保设备间的稳定、可靠的通信。
二、协议概述ModBusRTU通讯协议基于串行通信,使用二进制编码,采用主从结构进行通信。
主设备负责发起通信请求,从设备负责响应请求并返回数据。
通信数据以字节为单位进行传输,具有较高的传输效率和可靠性。
三、通信格式1. 物理层ModBusRTU通讯协议使用RS-485标准进行物理层通信,支持多主设备和多从设备的连接。
通信速率可根据实际需求设置,常见的速率包括9600bps、19200bps、38400bps等。
2. 帧格式ModBusRTU通讯协议的帧由起始符、地址字段、功能码、数据字段、校验码和结束符组成。
具体格式如下:- 起始符:占据一个字节,固定为0x3A。
- 地址字段:占据一个字节,表示从设备的地址。
- 功能码:占据一个字节,表示通信请求的功能类型。
- 数据字段:占据n个字节,根据功能码的不同而不同。
- 校验码:占据两个字节,用于校验帧的完整性。
- 结束符:占据一个字节,固定为0x0D。
四、功能码ModBusRTU通讯协议定义了一系列功能码,用于区分不同的通信请求。
以下列举了部分常用的功能码及其功能描述:1. 读取线圈状态(功能码:0x01):用于读取从设备的线圈状态,返回线圈的开关状态。
2. 读取输入状态(功能码:0x02):用于读取从设备的输入状态,返回输入信号的状态。
3. 读取保持寄存器(功能码:0x03):用于读取从设备的保持寄存器的值。
4. 读取输入寄存器(功能码:0x04):用于读取从设备的输入寄存器的值。
5. 写单个线圈(功能码:0x05):用于控制从设备的单个线圈的开关状态。
6. 写单个寄存器(功能码:0x06):用于向从设备的单个寄存器写入数据。
modbusrtu标准协议

modbusrtu标准协议
Modbus RTU是一种常用的串行通信协议,用于在工业领域中
的设备之间进行通信和数据交换。
该协议定义了通信帧的结构和数据格式,使设备能够以字节为单位进行通信。
Modbus RTU的通信帧由一系列连续的字节组成,包括以下几
个部分:
1. 起始标志:一个字节的值,表示帧的开始,通常为0x55。
2. 地址字段:一个字节的值,表示接收方设备的地址。
3. 功能码:一个字节的值,表示请求的功能或响应的状态。
4. 数据字段:包含用于传输数据的字节数。
数据字段的长度可以根据具体的应用需求而变化。
5. CRC校验:一个两字节的循环冗余校验码,用于验证帧的
完整性。
在Modbus RTU协议中,主设备负责发送请求命令,从设备负责响应命令并返回数据。
请求命令和响应命令的帧结构类似,只是功能码不同。
Modbus RTU支持多种功能码,包括读取寄存器、写入寄存器、读取输入寄存器、写入多个寄存器等。
这些功能码能够满足不同设备之间的数据读写需求。
总体而言,Modbus RTU是一种简单而又灵活的串行通信协议,被广泛应用于工业自动化和控制系统中。
它的结构清晰、易于实现,并且能够在不同的设备之间实现互操作性。
ModBusRTU通讯协议

ModBusRTU通讯协议协议名称:ModBusRTU通讯协议一、引言ModBusRTU通讯协议是一种基于串行通信的通讯协议,用于在工业自动化领域中实现设备之间的数据交互。
本协议旨在规范ModBusRTU通讯协议的格式、数据传输方式、命令与响应规则等,以确保通讯的稳定性和可靠性。
二、协议结构ModBusRTU通讯协议采用了一种简单的主从结构,其中包括一个主站和多个从站。
主站负责发送命令并接收从站的响应,而从站则负责接收命令并向主站发送响应。
三、数据格式1. 帧格式ModBusRTU通讯协议的数据帧由以下几个部分组成:- 起始位:一个起始位,用于标识数据帧的开始。
- 地址位:一个地址位,用于标识从站的地址。
- 功能码:一个功能码,用于标识命令的类型。
- 数据位:一个或多个数据位,用于传输命令或响应的数据。
- 校验位:一个校验位,用于验证数据的完整性。
- 结束位:一个结束位,用于标识数据帧的结束。
2. 数据类型ModBusRTU通讯协议支持多种数据类型,包括位(Coil)、输入位(Input Coil)、寄存器(Holding Register)和输入寄存器(Input Register)。
每种数据类型都有对应的读取和写入命令。
四、命令与响应规则1. 读取命令主站可以发送读取命令来获取从站的数据。
读取命令的格式如下:- 从站地址:一个字节,用于指定要读取数据的从站地址。
- 功能码:一个字节,用于指定读取命令的功能码。
- 起始地址:两个字节,用于指定要读取数据的起始地址。
- 数据长度:两个字节,用于指定要读取的数据长度。
- 校验码:两个字节,用于验证命令的有效性。
2. 写入命令主站可以发送写入命令来向从站写入数据。
写入命令的格式如下:- 从站地址:一个字节,用于指定要写入数据的从站地址。
- 功能码:一个字节,用于指定写入命令的功能码。
- 起始地址:两个字节,用于指定要写入数据的起始地址。
- 数据长度:两个字节,用于指定要写入的数据长度。
ModbusRTU协议文档(中文)

图 2 – 3 读 DO1~DO6 状态的响应数据帧
2.2 读数字输入状态(功能码 02)
查询数据帧
此功能允许用户获得 DI 的状态 ON / OFF(1 = ON , 0 = OFF),除了从机地址和功能 域,数据帧还需要在数据域中包含将被读取 DI 的初始地址和要读取的 DI 数量。SRTU510 中 DI 的地址从 0000H 开始(DI1=0000H,DI2=0001H 依此类推)。具体地址请查看第三章。
以便通过协议正确地建立与它们通讯的特定应用程序。
本章所述协议将尽可能的使用如图 2 – 1 所示的格式,(数字为 16 进制)。
Addr 06H
Fun
Data
Data Data #of Data #of CRC16
CRC16
start
start regs hi regs lo
Hi
Lo
reg hi reg lo
行为 获得数字(继电器)输出的当前状态(ON/OFF) 获得数字输入的当前状态(ON/OFF) 获得一个或多个寄存器的当前二进制值 控制数字(继电器)输出状态(ON/OFF) 设定二进制值到一系列多寄存器中
1.2.4 数据(Data)域
数据域包含了终端执行特定功能所需要的数据或者终端响应查询时采集到的数据。这 些数据的内容可能是数值、参考地址或者设置值。例如:功能域码告诉终端读取一个寄存器, 数据域则需要指明从哪个寄存器开始及读取多少个数据,内嵌的地址和数据依照类型和从机 之间的不同内容而有所不同。
图 2 – 4 的例子是从地址为 17 的从机读取 DI1 到 DI16 的状态。 (例如:SRTU510 有 16 个 DI,DI 的数量为 1~16)
Addr 11H
图文详解Modbus-RTU协议

图文详解Modbus-RTU协议前世今生照例简单说下这个协议的历时,Modicon公司于1979年制定了Modbus协议标准,并用在其PLC产品上。
后来Modicon公司被施耐德收购。
已成为一种事实标准协议,同时也被IEC-61158工业通信总线规范收录于type 15子集。
所谓一流的企业做标准,二流的企业做品牌,三流的企业做产品。
这些标准国人都基本是使用者,而非缔造者,所以使用一下,产品上印个标志,做做相关的测试认证都要给老外交钱。
这里只是顺带牢骚几句,与本文想说的无关。
打住!Modbus的应用除了常见的过程控制系统,在其他很多领域都有其身影,比如一些楼宇控制,消防控制等等都有大量的产品采用Modbus协议,因为这个协议实现简单,工作可靠,还是标准化的协议!Modbus分很多实现版本,总的来说是一种应用层协议。
从OSI七层模型来看,位于第七层应用层。
它定义了在不同类型的总线或网络上连接的设备之间提供”客户端/服务器“通信。
对于使用串口的版本,也定义了layer 1 和 layer 2,实现在主站和一个或多个从站之间交换MODBUS 报文。
具体有哪些版本呢?其实主要分两种:Modbus RTU(Remote Terminal Unit 远程终端单元):这种方式常采用RS-485做为物理层,一般利用芯片的串口实现数据报文的收发,报文数据采用二进制数据进行通信。
Modbus ASCII :报文使用 ASCII 字符。
ASCII 格式使用纵向冗余校验和。
Modbus ASCII 报文由冒号 (":")开始和换行符 (CR/LF)结尾构成。
当然其他还根据所使用的物理层不一样,有这么些做法:Modbus TCP/IP 或 Modbus TCP :这是一种 Modbus 变体版本,使用 TCP/IP 网络进行通信,通过 502 端口进行连接。
报文不需要校验和计算,因为以太网底层已经实现了CRC32 数据完整性校验。
modbus rtu协议实例

modbus rtu协议实例Modbus RTU协议实例Modbus RTU协议是一种串行通信协议,用于在工业自动化领域中传输数据。
它是由Modicon公司于1979年开发的,现在已经成为一种国际标准,被广泛应用于工业控制系统中。
本文将介绍Modbus RTU协议的基本原理和实现方法,并提供一个详细的实例来说明如何使用该协议进行数据通信。
1. Modbus RTU协议基本原理1.1 帧结构Modbus RTU协议采用了一种简单的帧结构,包括以下几个部分:起始位:一个高电平信号,表示一个新的帧的开始。
地址位:标识从站或主站。
功能码:指示该帧的目的和内容。
数据:包含传输的数据。
CRC校验码:用于检测传输过程中是否发生了错误。
停止位:一个低电平信号,表示帧结束。
1.2 通信方式Modbus RTU协议支持两种不同的通信方式:点对点通信:只有主站与从站之间进行通信。
多点通信:多个从站可以同时与主站进行通信。
1.3 数据类型Modbus RTU协议支持以下几种不同类型的数据:线圈状态(Coil Status):表示开关状态,只能读取和写入。
输入状态(Input Status):表示输入状态,只能读取。
保持寄存器(Holding Register):表示可读可写的数据。
输入寄存器(Input Register):表示只读的数据。
2. Modbus RTU协议实现方法2.1 硬件要求Modbus RTU协议需要支持串口通信的硬件设备,例如串口转USB 适配器或者RS485接口等。
此外,还需要使用支持Modbus RTU协议的设备,例如PLC、传感器等。
2.2 软件要求为了实现Modbus RTU协议通信,需要使用相应的软件工具。
以下是一些常用的软件工具:ModScan32:一款免费的Modbus调试工具,可以用于模拟主站或从站设备,并且可以监测数据传输过程中是否发生错误。
QModMaster:一款开源的Modbus主站模拟器,支持Windows、Linux和MacOS等多个平台,并且提供了友好的用户界面和丰富的功能选项。
modbus rtu协议

modbus rtu协议Modbus RTU协议。
Modbus RTU协议是一种串行通信协议,广泛应用于工业自动化领域。
它是一种简单、可靠的通信协议,适用于各种工业设备之间的通信。
本文将介绍Modbus RTU协议的基本原理、通信格式、应用范围以及常见问题解决方法。
Modbus RTU协议的基本原理。
Modbus RTU协议是一种基于串行通信的主从式通信协议,它采用了简单的二进制编码方式来进行数据传输。
在Modbus RTU通信中,通信的发起方为主站,而被动响应的设备为从站。
主站通过发送请求帧来获取从站的数据,从站在接收到请求后进行响应,并将数据发送回主站。
这种通信方式使得Modbus RTU协议在工业控制领域得到了广泛的应用。
Modbus RTU协议的通信格式。
Modbus RTU协议的通信格式非常简洁明了,它采用了一种固定长度的数据帧格式来进行通信。
数据帧由地址字段、功能码字段、数据字段和校验字段组成。
其中地址字段用于标识从站设备的地址,功能码字段用于指示主站要执行的操作,数据字段用于传输实际的数据信息,校验字段用于对数据帧进行校验,以确保数据的完整性和准确性。
Modbus RTU协议的应用范围。
Modbus RTU协议广泛应用于各种工业领域,包括工业自动化、能源管理、楼宇自动化等。
在工业自动化领域,Modbus RTU协议常用于PLC、传感器、执行器等设备之间的通信。
在能源管理领域,Modbus RTU协议常用于电能仪表、变频器等设备之间的通信。
在楼宇自动化领域,Modbus RTU协议常用于空调控制、照明控制等设备之间的通信。
由于Modbus RTU协议的简单可靠,它能够满足各种工业设备之间的通信需求。
常见问题解决方法。
在实际应用中,Modbus RTU协议可能会遇到一些常见问题,如通信超时、数据错误、地址冲突等。
针对这些问题,我们可以采取一些常见的解决方法来解决。
例如,对于通信超时问题,可以调整通信超时时间或者优化通信线路来解决;对于数据错误问题,可以增加数据校验机制或者重新设计数据传输方案来解决;对于地址冲突问题,可以重新分配设备地址或者采取其他地址冲突解决方案来解决。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
etBeans使用教程入门篇
一.创建项目
下面打开NetBeans,然后点击菜单“文件”->“新建项目”,打开“新建项目”对话框:
请在“类别”中选择“常规”,再从“项目”中选择“Java应用程序”,然后点击“下一
步”,进入“新建Java应用程序”对话框:
在这个对话框中需要设置项目的名称以及项目所在目录,我为自己的项目起名为JUnitTest,“项目位置”为G:\YPJCCK\JUnit\NetBeans,此外,请将“创建主类”前的对号去掉。
项目创建好后,已经自带了JUnit 3.8.1。
二.编写用于测试的JavaBean
用于测试的JavaBean很简单,名为Book,只有id和name两个属性,这两个属性将分别用于两个用例当中。
下面开始编写该JavaBean。
请点击“文件”->“新建文件”,打开“新建文件”对话框:
确保“项目”选择的是JUnitTest,然后在“类别”中选中Java类,在“文件类型”中选中Java类,点击“下一个”,进入下一窗口:
设置类名为Book,包为net.zheng.junit.test,设置完成后点击“完成”,修改代码如下:
至此,用于测试的JavaBean编写完成。
三.编写测试用例
这里只用了一个类进行测试,名为BookTest,该类继承自junit.framework.TestCase类。
BookTest类包含两个用例,分别对应该类的testId和testName方法,即每个方法实现了一个测试用例。
注意,在JUnit 中,junit.framework.TestCase的子类中每个用来实现测试用例的方法都必须以testXXX的格式来命名,这些方法在运行时会被执行。
此外,BookTest 还包括setUp和tearDown这两个方法,前者在每个测试方法开始之前执行,多用来做初始化;后者在每个测试方法完成之后执行,多用来清理资源。
下面开始编写BookTest。
请点击“文件”->“新建文件”,打开“新建文件”对话框:
选择要测试的类,点击“完成”,修改代码如下:
这里setUp和tearDown方法没什么好说的,就是执行了对book对象的初始化和清理,不过testId和testName需要说明一下。
前者是在对book的id属性进行测试,首先赋值为”001”,然后使用Assert的assertEquals方法查看id属性中存放的值是否是期待的值,由于我的期待值也是”001”,所以执行后这个用例应该是成功的;后者则是对book的name属性进行测试,也是首先赋值为”ASP”,然后使用 Assert的assertEquals方法查看其值是否是期待的,由于我特意将期待值设定为根本不可能的”JSP”,因此这个用例执行后会出现一个错误。
但请注意,由于我是特意要让测试出现错误,所以将期待值设定成了不可能的值,如果你是测试人员,请千万不要这么做,否则如果别的地方导致了错误,很容易给自己造成不必要的麻烦。
下面简单介绍一下上边用到的静态类junit.framework.Assert。
该类主要包含8个方法:1.assertEquals()方法,用来查看对象中存的值是否是期待的值,与字符串比较中使用的equals()方法类似;
2.assertFalse()和assertTrue()方法,用来查看变量是是否为false或true,如果assertFalse()查看的变量的值是false则测试成功,如果是true则失败,assertTrue()与之相反;
3.assertSame()和assertNotSame()方法,用来比较两个对象的引用是否相等和不相等,类似于通过“==”和“!=”比较两个对象;
4.assertNull()和assertNotNull()方法,用来查看对象是否为空和不为空;
5.fail ()方法,意为失败,用来抛出错误。
我个人认为有两个用途:首先是在测试驱动开发中,由于测试用例都是在被测试的类之前编写,而写成时又不清楚其正确与否,此时就可以使用fail方法抛出错误进行模拟;其次是抛出意外的错误,比如要测试的内容是从数据库中读取的数据是否正确,而导致错误的原因却是数据库连接失败。
四.运行BookTest
编写好BookTest后,就可以运行了。
请在“项目”栏中选中BookTest,点击鼠标右键,选择“运行文件”,测试信息会从“输出”窗口输出:
五.测试套件
当有多个测试类需要一次性进行测试时,可以使用测试套件来完成这项工作。
在NetBeans中,点击“文件”->“新建文件”,打开“新建文件”对话框:
确保“项目”选择的是JUnitTest,然后在“类别”中选中JUnit类,在“文件类型”中选中测试套件,点击“下一个”,进入下一窗口:
其中TestSuite是用来组织测试类的,通过其addTestSuite()方法将测试类添加到ts对象中,凡是添加到ts中的测试类都将在运行文件时被执行。
此外,您也可以在定义ts对象时利用其构造函数将测试类添加给ts对象,例如:
TestSuite ts = new TestSuite(BookTest.class);
这并不会影响到后续使用addTestSuite()方法。
测试套件的运行方法与之前一样。
此外,JUnit自身也提供了运行测试的环境,但需要在NetBeans中做一些改动,所以就不
六.小结
其实JUnit上手很容易,远比想象的要简单的多,但我觉得如何编写测试类是很需要经验的,因为许多时候,测试一个用例,但涉及到可能不止一个类;而有些时候,一个类可能是做为工具使用,里边涉及很多内容,那么测试时是否还是只编写一个测试类呢?关于这个话题,我想应该是仁者见仁、智者见智的,其实这才是测试的难题所在。