modbus通讯协议.docx

上传人:rrsccc 文档编号:11077268 上传时间:2021-06-27 格式:DOCX 页数:34 大小:206.73KB
返回 下载 相关 举报
modbus通讯协议.docx_第1页
第1页 / 共34页
modbus通讯协议.docx_第2页
第2页 / 共34页
modbus通讯协议.docx_第3页
第3页 / 共34页
modbus通讯协议.docx_第4页
第4页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《modbus通讯协议.docx》由会员分享,可在线阅读,更多相关《modbus通讯协议.docx(34页珍藏版)》请在三一文库上搜索。

1、Modbus通讯协议图片:图片:图片:可编辑修改,如有帮助,请下载,多谢!Modbus协议最初由Modicon 公司开发出来,在1979 年末该公司成为施耐德自动化(Schneider Automation) 部门的一部分,现在 Modbus已经是工业领域全球最流行的协议。此协议支持传统的 RS-232、RS-422、RS-485 和以太网设备。许多工业设备,包括 PLC, DCS,智能仪表等都在使用 Modbus协议作为他们之间的通讯标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。当在网络上通信时, Modbus协议决定了每个控制器须要知道它们的设备地址, 识别按地址发来

2、的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用 Modbus协议发送给询问方。Modbus协议包括 ASCII 、 RTU、 TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon 控制器使用RS232C实现串行的Modbus。 Modbus的 ASCII 、RTU协议规定了消息、数据的结构、 命令和就答的方式, 数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave 端接收到正确消息后就可以发送数据到Master 端以响应请求; Master 端也可以直接发消息修改Slav

3、e 端的数据,实现双向读写。可编辑修改,如有帮助,请下载,多谢!Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII 模式采用LRC校验, RTU模式采用 16 位 CRC校验,但 TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。 另外, Modbus采用主从方式定时收发数据, 在实际使用中如果某 Slave 站点断开后(如故障或关机), Master 端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。下面我来简单的给大家介绍一下,对于Modbus的 ASCII 、RTU和 TCP协议来说,其中 TCP和 RTU协议非

4、常类似, 我们只要把 RTU协议的两个字节的校验码去掉, 然后在 RTU协议的开始加上 5 个 0 和一个 6 并通过 TCP/IP 网络协议发送出去即可。所以在这里我仅介绍一下 Modbus的 ASCII 和 RTU协议。下表是 ASCII 协议和 RTU协议进行的比较:通过比较可以看到,ASCII 协议和 RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII 字符,所以进行调试时就更加的直观,另外它的 LRC校验也比较容易。但是因为它传输的都是可见的ASCII字符, RTU传输的数据每一个字节ASCII 都要用两个字节来传输,比如RTU传输一

5、个十六进制数0xF9,ASCII 就需要传输 F 9的 ASCII 码 0x39 和 0x46 两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII 协议,如果所需传输的数据量比较大,最好能使用RTU协议。可编辑修改,如有帮助,请下载,多谢!下面对两种协议的校验进行一下介绍。1、LRC校验LRC域是一个包含一个8 位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。LRC校验比较简单, 它在 ASCII 协议中使用, 检测了消息域中除开始

6、的冒号及结束的回车换行号外的内容。它仅仅是把每一个需要传输的数据按字节叠加后取反加 1 即可。下面是它的VC代码:BYTE GetCheckCode(const char * pSendBuf, int nEnd)/获得校验码BYTE byLrc = 0;char pBuf4;int nData = 0;for(i=1; iend; i+=2) /i初始为 1,避开“开始标记”冒号可编辑修改,如有帮助,请下载,多谢!/ 每两个需要发送的 ASCII 码转化为一个十六进制数pBuf 0 = pSendBuf ;pBuf 1 = pSendBuf i+1;pBuf 2 = 0;sscanf(pBu

7、f,%x,& nData);byLrc += nData;byLrc = byLrc;byLrc +;return byLrc;可编辑修改,如有帮助,请下载,多谢!2、 CRC校验CRC域是两个字节,包含一16 位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。CRC是先调入一值是全 “ 1”的 16 位寄存器, 然后调用一过程将消息中连续的8 位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit 数据对 CRC有效,起始位和停止位以及奇偶校验位均无效。CRC产生过程中,每个8 位字符都单独和寄存器内容相或

8、(OR),结果向最低有效位方向移动, 最高有效位以0 填充。LSB被提取出来检测, 如果 LSB为 1,寄存器单独和预置的值或一下,如果LSB为 0,则不进行。整个过程要重复8次。在最后一位(第8 位)完成后,下一个8 位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。CRC添加到消息中时,低字节先加入,然后高字节。下面是它的VC代码:WORD GetCheckCode(const char * pSendBuf, int nEnd)/获得校验码可编辑修改,如有帮助,请下载,多谢!WORD wCrc = WORD(0xFFFF);for(int i=0

9、; inEnd; i+)wCrc = WORD(BYTE(pSendBuf);for(int j=0; j= 1;wCrc = 0xA001;可编辑修改,如有帮助,请下载,多谢!elsewCrc = 1;return wCrc;对于一条 RTU协议的命令可以简单的通过以下的步骤转化为ASCII 协议的命令:1、 把命令的 CRC校验去掉,并且计算出LRC校验取代。可编辑修改,如有帮助,请下载,多谢!2、 把生成的命令串的每一个字节转化成对应的两个字节的ASCII 码,比如0x03 转化成 0x30,0x33 ( 0 的 ASCII 码和 3 的 ASCII 码)。3、 在命令的开头加上起始标记

10、“: ”,它的 ASCII 码为 0x3A。4、 在命令的尾部加上结束标记CR,LF(0xD,0xA ),此处的 CR,LF 表示回车和换行的 ASCII 码。所以以下我们仅介绍 RTU协议即可,对应的 ASCII 协议可以使用以上的步骤来生成。下表是 Modbus支持的功能码:在这些功能码中较长使用的是 1、2、3、4、5、6 号功能码,使用它们即可实现对下位机的数字量和模拟量的读写操作。1、读可读写数字量寄存器(线圈状态):计算机发送命令: 设备地址 命令号 01 起始寄存器地址高8 位 低 8位 读取的寄存器数高8 位 低 8 位 CRC 校验的低 8 位 CRC 校验的高8 位可编辑修

11、改,如有帮助,请下载,多谢!例: 110100130025CRC低 CRC 高 意义如下:设备地址:在一个485 总线上可以挂接多个设备,此处的设备地址表示想和哪一个设备通讯。 例子中为想和17 号 ( 十进制的 17 是十六进制的11) 通讯。命令号 01:读取数字量的命令号固定为01。起始地址高8 位、低 8 位:表示想读取的开关量的起始地址( 起始地址为0) 。比如例子中的起始地址为 19。寄存器数高 8 位、低 8 位:表示从起始地址开始读多少个开关量。例子中为 37 个开关量。CRC校验:是从开头一直校验到此之前。在此协议的最后再作介绍。此处需要注意, CRC校验在命令中的高低字节的

12、顺序和其他的相反。设备响应: 设备地址 命令号 01 返回的字节个数 数据 1 数据 2. 数据 nCRC 校验的低 8 位 CRC 校验的高 8 位 例: 110105CD6BB20E1BCRC低 CRC 高 可编辑修改,如有帮助,请下载,多谢!意义如下:设备地址和命令号和上面的相同。返回的字节个数:表示数据的字节个数,也就是数据1,2.n中的 n 的值。数据 1.n:由于每一个数据是一个8 位的数,所以每一个数据表示8 个开关量的值,每一位为0 表示对应的开关断开,为1 表示闭合。比如例子中,表示 20 号 ( 索引号为 19) 开关闭合, 21 号断开, 22 闭合, 23 闭合, 24

13、 断开,25 断开, 26 闭合, 27 闭合 .如果询问的开关量不是8 的整倍数,那么最后一个字节的高位部分无意义,置为0。CRC校验同上。2、读只可读数字量寄存器(输入状态):和读取线圈状态类似,只是第二个字节的命令号不再是1而是 2。3、写数字量(线圈状态):可编辑修改,如有帮助,请下载,多谢!计算机发送命令: 设备地址 命令号 05 需下置的寄存器地址高8 位 低8 位 下置的数据高8 位 低 8 位 CRC 校验的低 8 位 CRC 校验的高 8位 例: 110500ACFF00CRC低 CRC 高 意义如下:设备地址和上面的相同。命令号 : 写数字量的命令号固定为05。需下置的寄存

14、器地址高8 位,低 8 位:表明了需要下置的开关的地址。下置的数据高8 位,低 8 位:表明需要下置的开关量的状态。例子中为把该开关闭合。注意,此处只可以是FF00表示闭合 0000表示断开,其他数值非法。注意此命令一条只能下置一个开关量的状态。设备响应:如果成功把计算机发送的命令原样返回,否则不响应。可编辑修改,如有帮助,请下载,多谢!4、读可读写模拟量寄存器(保持寄存器):计算机发送命令: 设备地址 命令号 03 起始寄存器地址高8 位 低 8位 读取的寄存器数高8 位 低 8 位 CRC 校验的低 8 位 CRC 校验的高8 位例: 1103006B0003CRC低 CRC 高 意义如下

15、:设备地址和上面的相同。命令号 : 读模拟量的命令号固定为03。起始地址高8 位、低 8 位:表示想读取的模拟量的起始地址( 起始地址为0) 。比如例子中的起始地址为 107。寄存器数高 8 位、低 8 位:表示从起始地址开始读多少个模拟量。例子中为 3 个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。设备响应: 设备地址 命令号 03 返回的字节个数 数据 1 数据 2. 数据 nCRC 校验的低 8 位 CRC 校验的高 8 位 可编辑修改,如有帮助,请下载,多谢!例: 110306022B00000064CRC低 CRC 高 意义如下:设备地址和命令号和上面的相同。返回的字节个

16、数:表示数据的字节个数,也就是数据1,2.n中的 n 的值。例子中返回了3 个模拟量的数据, 因为一个模拟量需要2 个字节所以共6个字节。数据 1.n:其中 数据 1 数据 2 分别是第 1 个模拟量的高8 位和低 8位, 数据 3 数据 4 是第 2 个模拟量的高8 位和低 8 位,以此类推。例子中返回的值分别是555, 0, 100。CRC校验同上。5、读只可读模拟量寄存器(输入寄存器):和读取保存寄存器类似,只是第二个字节的命令号不再是2而是 4。6、写单个模拟量寄存器(保持寄存器):可编辑修改,如有帮助,请下载,多谢!计算机发送命令: 设备地址 命令号 06 需下置的寄存器地址高8 位

17、 低8 位 下置的数据高8 位 低 8 位 CRC 校验的低 8 位 CRC 校验的高 8位 例: 110600010003CRC低 CRC 高 意义如下:设备地址和上面的相同。命令号 : 写模拟量的命令号固定为06。需下置的寄存器地址高8 位,低 8 位:表明了需要下置的模拟量寄存器的地址。下置的数据高8 位,低 8 位:表明需要下置的模拟量数据。比如例子中就把 1 号寄存器的值设为3。注意此命令一条只能下置一个模拟量的状态。设备响应:如果成功把计算机发送的命令原样返回,否则不响应。可编辑修改,如有帮助,请下载,多谢!Modbus通讯协议mymMODBUS通讯协议简介工业控制已从单机控制走向

18、集中监控、集散控制, 如今已进入网级别 :总版主络时代,工业控制器连网也为网络管理提供了方便。Modbus就精华:41是工业控制器的网络协议中的一种。发帖 :3956威望 :9957 点一、概述金钱 : 9431 Gold贡献值 :601 点Modbus 协议是应用于电子控制器上的一种通用语言。通过此协朋友圈 :ifix技议,控制器相互之间、控制器经由网络(例如以太网)和其它设术群备之间可以通信。它已经成为一通用工业标准。有了它,不同厂在线时商生产的控制设备可以连成工业网络,进行集中监控。间:539( 小时 )注册时此协议定义了一个控制器能认识使用的消息结构, 而不管它们是间:2005-02-

19、02经过何种网络进行通信的。它描述了一控制器请求访问其它设备最后登的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录:2008-01-25录。它制定了消息域格局和内容的公共格式。可编辑修改,如有帮助,请下载,多谢!当在一 Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址, 识别按地址发来的消息, 决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用 Modbus协议发出。在其它网络上,包含了 Modbus协议的消息转换为在此网络上使用的帧或包结构。 这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。1、在 Modbus网络上转输标准的 Mo

20、dbus口是使用一 RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由 Modem组网。控制器通信使用主从技术, 即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。 典型的主设备: 主机和可编程仪表。典型的从设备:可编程控制器。主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。 Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。从设备回应消息也由 Modb

21、us协议构成,包括确认要行动的域、任何要返回的数据、 和一错误检测域。 如果在消息接收过程中发可编辑修改,如有帮助,请下载,多谢!生一错误, 或从设备不能执行其命令, 从设备将建立一错误消息并把它作为回应发送出去。2、在其它类型网络上转输在其它网络上, 控制器使用对等技术通信, 故任何控制都能初始和其它控制器的通信。 这样在单独的通信过程中, 控制器既可作为主设备也可作为从设备。 提供的多个内部通道可允许同时发生的传输进程。在消息位, Modbus协议仍提供了主从原则,尽管网络通信方法是“对等”。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将

22、建立一从设备回应格式并返回给发送的控制器。Modbus是 Modicon 公司为其 PLC与主机之间的通讯而发明的串行通讯协议。其物理层采用RS232、 485 等异步串行标准。由于其开放性而被大量的PLC及 RTU厂家采用。Modbus通讯方式采用主从方式的查询相应机制,只有主站发出查询时,从站才能给出响应,从站不能主动发送数据。主站可以向某一个从站发出查询,也可以向所有从站广播信息。从站只响应单独发给它的查询,而不响应广播消息。可编辑修改,如有帮助,请下载,多谢!Modbus的串行口的通讯参数(如波特率、奇偶校验)可由用户选择。二、 MODBUS协议传送方式MODBUS通讯协议有两种传送方

23、式:RTU 方式和 ASCII 方式 , 两种方式如下所示 :项目 RTU 方式 ASCII 方式字节长度 8 BITS 7 BITS奇偶校验 1 BIT OR 0 BIT 1 BIT OR 0 BIT字节中止 1 BIT OR 2 BITS 1 BIT OR 2 BITS开始标记不要 :( 冒号 )结束标记不要 CR,LF数据间隔 24 BIT 1S出错检验方式CRC-16 LRC控制器能设置为两种传输模式(ASCII 或 RTU)中的任何一种在标准的 Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个 Modbus网络上的所有设

24、备都必须选择相同的传输模式和串口可编辑修改,如有帮助,请下载,多谢!参数。三、 Modbus消息帧两种传输模式中( ASCII 或 RTU),传输设备以将 Modbus消息转为有起点和终点的帧, 这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能设置为返回结果。1、ASCII 帧使用 ASCII 模式,消息以冒号( : )字符( ASCII 码 3AH)开始,以回车换行符结束( ASCII 码 0DH,0AH)。其它域可以使用的传输字符是十六进制的 0.9,A.F 。网络上的设备不断侦测“

25、: ”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。消息中字符间发送的时间间隔最长不能超过1 秒,否则接收的设备将认为传输错误。可编辑修改,如有帮助,请下载,多谢!2、RTU帧使用 RTU模式,消息发送至少要以3.5 个字符时间的停顿间隔开始。在网络波特率下多样的字符时间,这是最容易实现的 ( 如下图的 T1-T2-T3-T4 所示 ) 。传输的第一个域是设备地址。可以使用的传输字符是十六进制的 0.9,A.F 。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。 在最后一个传输字符之后,一个至少

26、 3.5 个字符时间的停顿标定了消息的结束。 一个新的消息可在此停顿后开始。整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5 个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于 3.5 个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。 这将导致一个错误,因为在最后的CRC域的值不可能是正确的。3、地址域消息帧的地址域包含两个字符( ASCII )或 8Bit ( RTU)。可能的从设备地址是 0.247 ( 十进制 ) 。单个设备的地址范围是可编辑修改,如有帮助,请下载,多谢!1.247。主设备通过将

27、要联络的从设备的地址放入消息中的地址域来选通从设备。 当从设备发送回应消息时, 它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。地址 0 是用作广播地址, 以使所有的从设备都能认识。 当 Modbus 协议用于更高水准的网络,广播可能不允许或以其它方式代替。4、如何处理功能域消息帧中的功能代码域包含了两个字符 ( ASCII )或 8Bits( RTU)。可能的代码范围是十进制的 1.255 。当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。当消息从主设备发往从设备时, 功能代码域将告之从设备需要执行哪些行为。 例如去读取输入的开关状态, 读

28、一组寄存器的数据内容,读从设备的诊断状态,允许调入、记录、校验在从设备中的程序等。当从设备回应时,它使用功能代码域来指示是正常回应 ( 无误 ) 还是有某种错误发生(称作异议回应)。对正常回应,从设备仅回应相应的功能代码。 对异议回应, 从设备返回一等同于正常代码的代码,但最重要的位置为逻辑 1。可编辑修改,如有帮助,请下载,多谢!例如:一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码:00000011(十六进制03H)对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回:10000011(十六进制83H)除功能代码因异议错误作了修改外, 从设备将一独特的代码放到回应消

29、息的数据域中,这能告诉主设备发生了什么错误。主设备应用程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从设备的消息并报告给操作员。5、数据域数据域是由两个十六进制数集合构成的,范围00.FF 。根据网络传输模式, 这可以是由一对ASCII 字符组成或由一RTU字符组成。可编辑修改,如有帮助,请下载,多谢!从主设备发给从设备消息的数据域包含附加的信息: 从设备必须用于进行执行由功能代码所定义的所为。 这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。如果主设备写一

30、组从设备的寄存器(功能代码10 十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。如果没有错误发生, 从从设备返回的数据域包含请求的数据。 如果有错误发生, 此域包含一异议代码, 主设备应用程序可以用来判断采取下一步行动。在某种消息中数据域可以是不存在的(0 长度)。例如,主设备要求从设备回应通信事件记录(功能代码0B 十六进制),从设备不需任何附加的信息。6、错误检测域标准的 Modbus网络有两种错误检测方法。错误检测域的内容视可编辑修改,如有帮助,请下载,多谢!所选的检测方法而定。ASCII当选用 ASCII 模式作字符帧,错误检测域

31、包含两个ASCII 字符。这是使用 LRC(纵向冗长检测)方法对消息内容计算得出的,不包括开始的冒号符及回车换行符。LRC字符附加在回车换行符前面。RTU当选用 RTU模式作字符帧, 错误检测域包含一16Bits值 ( 用两个8 位的字符来实现 ) 。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。 CRC域附加在消息的最后,添加时先是低字节然后是高字节。 故 CRC的高位字节是发送消息的最后一个字节。7、字符的连续传输当消息在标准的Modbus系列网络传输时,每个字符或字节以如下方式发送(从左到右):最低有效位 .最高有效位可编辑修改,如有帮助,请下载,多谢!四、错误检测方法标准

32、的 Modbus串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测( LRC或 CRC)应用于整个消息。它们都是在消息发送前由主设备产生的, 从设备在接收过程中检测每个字符和整个消息帧。用户要给主设备配置一预先定义的超时时间间隔, 这个时间间隔要足够长, 以使任何从设备都能作为正常反应。 如果从设备测到一传输错误,消息将不会接收,也不会向主设备作出回应。这样超时事件将触发主设备来处理错误。 发往不存在的从设备的地址也会产生超时。1、奇偶校验用户可以配置控制器是奇或偶校验,或无校验。 这将决定了每个字符中的奇偶校验位是如何设置的。 如果指定了奇或偶校验,“1”的位数将算到每个字符的位

33、数中( ASCII 模式 7 个数据位,RTU中 8 个数据位)。例如 RTU字符帧中包含以下 8 个数据位:11000101可编辑修改,如有帮助,请下载,多谢!整个“ 1”的数目是 4 个。如果便用了偶校验,帧的奇偶校验位将是 0,便得整个“ 1”的个数仍是 4 个。如果便用了奇校验,帧的奇偶校验位将是 1,便得整个“ 1”的个数是 5 个。如果没有指定奇偶校验位, 传输时就没有校验位, 也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中。2、LRC检测使用 ASCII 模式,消息包括了一基于LRC方法的错误检测域。 LRC域检测了消息域中除开始的冒号及结束的回车换行号外的内容。LRC域是一个包含一个8 位二进制

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1