modbus 协议_modbus协议 - CSDN
精华内容
参与话题
  • Modbus协议

    2018-05-30 14:26:36
    1.范围 MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。互联网组织能够使TCP/IP栈上保留系统端口502访问MODBUS。 Modbus是一个请求/应答协议,并且...

    1.范围

        MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。互联网组织能够使TCP/IP栈上保留系统端口502访问MODBUS。

        Modbus是一个请求/应答协议,并且提供功能码规定的服务。Modbus功能码是Modbus请求/应答PDU的元素。

    1.1规范性文件

        ① RFC791,互联网协议

        ② MODBUS协议参考指南

        目前,使用下列情况实现MODBUS:

            Ⅰ 以太网上的TCP/IP

            Ⅱ 各种媒体(有线:EIA/TIA-232-E、EIA-422、EIA/TIA-485-A;光纤、无线等等)上的异步串行传输。

        MODBUS PLUS,一种高速令牌传递网络。

                                    

    2. 缩略语

         ADU        应用数据单元

        HDLC        高级数据链路控制

        HMI        人机界面

        IETF        因特网工程工作组

        I/O        输入/输出设备

        IP            互联网协议

        MAC        介质访问控制

        MB            MODBUS协议

        MBAP        MODBUS协议

        PDU        协议数据单元

        PLC        可编程逻辑控制器

        TCP        传输控制协议

    3.概要

        MODBUS协议允许在各种网络体系结构内进行简单通信

                                    

        每种设备(PLC、HMI、控制面板、驱动程序、动作控制、输入/输出设备)都能使用MODBUS协议来启动远程操作。

        在基于串行链路和以太TCP/IP网络的MODBUS上可以进行相同通信。

        一些网关允许在几种使用MODBUS协议的总线或网络之间进行通信。

    4.描述

    ① 协议描述

        MODBUS协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的MODBUS协议映射能够在应用数据单元(ADU)上引入一些加域。

                            

        启动MODBUS事务处理的客户机创建MODBUS应用数据单元。功能码向服务器指示将执行那种操作。

        MODBUS协议建立了客户机启动的请求格式。

        用一个字节编码MODBUS数据单元的功能码域。有效的码字范围是十进制1-225(128-255为异常响应保留)。当从客户机向服务器设备发送报文时,功能码域通知服务器执行那种操作。

        向一些功能码加入子功能码来定义多项操作。

        从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理的项目数量以及域中的实际数据字节数。

        在某种请求中,数据域可以使不存在的(0长度),在此情况下服务器不需要任何附加信息。功能码仅说明操作。

        如果在一个正确接收的MODBUS ADU中,不出现与请求MODBUS功能有关的差错,那么服务器至客户机的响应数据域包括请求数据。     如果出现于请求MODBUS功能有关的差错,那么域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。

        当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应)。对于一个正常的响应来说,服务器仅对原始功能码响应。

        对于异常响应,服务器返回一个与原始功能码等同的码,设置该原始功能码的最高有效位为逻辑1。

    注释:需要管理超时,以便明确地等待可能不会出现的应答。

        串行链路上第一个MODBUS执行的长度约束限制了MODBUS PDU大小(最大 RS485ADU=256字节)

        因此,对串行链路通信来说,MODBUS PDU  = 256 - 服务器地址(1字节)- CRC(2字节) = 253字节

        从而:

                    RS232/RS485 ADU = 253字节 + 服务器地址(1 byte)+ CRC(2字节)= 256字节

                    TCP MODBUS ADU  = 249字节 + MBAP(7字节) = 256字节

    MODBUS协议定义了三种PDU:

            ① MODBUS请求PDU     mb_req_pdu

                    mb_req_pdu = { function_code, request_data }

                        function_code:一个字节 MODBUS功能码

                        request_data :n 个字节,这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。

            ② MODBUS响应PDU     mb_rsp_pdu

                        mb_rsp_pdu = { function_code , response_data }

                                function_code : 一个字节,MODBUS功能码

                                response_data:N个字节,这个域与功能码有关,并且通常包括诸如可变参考、变量、数据偏移量、子功能码等信息。 

            ③ MODBUS异常响应PDU  mb-excep_rsp_pdu

                        mb-excep_rsp_pdu = {function_code , request_data }

                                   function_code : 1个字节  MODBUS功能码 + 0x80

                                    request_data : 1个字节  MODBUS异常码

    ② 数据编码

        发射多个字节时,先发送最高有效位

    如果是16比特,0x1234   先发送0x12  再发送0x34

    ③MODBUS事务处理过程


            一旦服务器处理请求,使用合适的MODBUS服务器事务建立MODBUS响应

            根据处理结果,可以建立两种类型响应:

    一、 一个正MODBUS响应

                    响应功能码 = 请求功能码

    二、 一个MODBUS异常响应

                    用来客户机提供处理过程中与被发现的差错相关的信息

                    响应功能码  =  请求功能码 + 0x80

                    提供一个异常码来指示差错原因

    5.  功能码分类

            有三类MODBUS功能码

    Ⅰ 公共功能码

            是较好地被定义的功能码, 保证是唯一的,MODBUS组织可以改变的, 公开证明的,  具有可用的一致性测试, MB IETF RFC中证明的,包含已被定义的公共指配功能码和未来使用的未指配保留功能码

    Ⅱ 用户定义功能码

            有两个用户定义功能码的定义范围,即65至72和十进制100至110,用户没有MODBUS组织的任何批准就可以选择和实现一个功能码,不能保证被选功能码的使用是唯一的,如果用户要重新设置功能作为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。

    Ⅲ 保留功能码

            一些公司对传统产品通常使用的功能码,并且对公共使用时无效的功能码。

















































    展开全文
  • MODBUS协议最简单又是最直白的解释

    万次阅读 多人点赞 2018-01-11 10:00:36
    Modbus是一种单主站的主/从通信模式。... Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。 Modbus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的
    Modbus是一种单主站的主/从通信模式。Modbus网络上只能有一个主站存在,主站在 Modbus网络上没有地址,从站的地址范围为 0 - 247,其中 0 为广播地址,从站的实际地址范围为 1 - 247。 Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。 
    Modbus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。通信双方必须同时支持上述模式中的一种。
    
    上面说的是官话,下面是我说的大白话:
    
    modbus协议也只是通讯协议的一种,没什么神秘的,通讯协议包括两个方面:
    
    一、通讯格式,即: 波特率,检验方式,数据位,停止位
    
    波特率:一秒钟传送的位数,也就是通讯速率;比如波特率为9600,即,一秒种可以传送9600个位数,位的概念看下面的数据位介绍
    校验方式:奇校验或偶校验或无校验,目的是判断传输过程中是否有错误!它只是用于判断一个字符(比如八个位或是七个位组成一个字符)传输是否有错误。但是它并不能完全能够判断传输是否有错。比如偶校验,在检验送八个“11111111”时,如果到达接收方,由于干扰而变成了“10111101”,“1”的个数仍然是偶数,接收方就判断不出来传送的字符已经错误!
    数据位:传输一个字符由几个位组成,计算机的基本单位就是“位”,其值非“0”即“1”,又如传送A,定义通讯格式时,是定义的八位,其传送的数据可能就是:00001010;
    停止位:传输一个字符有几个停止位,用天判断某个字符是否传输结束,以便开始接收下一个字符。
    
    通讯格式的作用是规范发送方与接收方的传输格式,如果双方通讯格式不一样,接收方就不可能正确判断发送方发来的东西是什么。
    比如,接收方设置的波特率是10(一秒只接收十个位)位,而发送方的波特率是20(一秒发送二十个位),那么发送方一秒种发送的20个字符,接收方就不可能都收到,只能接收到10个,造成通讯出错。
    校验方式:双方校验方式不一样,就没有一个统一的标准认定传输是否有错误。
    数据位,接收方设定的七位,即它接收到七个位就认为是一个字符,而实际发送方设定的是八位,那么接收方认定的字符与发送方发送的字符就不一样了。
    
    ***参预通讯的双方设定的通讯格式必须一样的!!
    
    二、通讯规范(这个词是我自己定义的,不能引用,会被人笑话的)
    通讯格式只是保证接收方正确地接收到发送方传输过来的每一个字符(实际如上所述,检验方式并不能保证完全正确,还要靠通讯规范中的校验和计算来验证整体正确性,下面会继续说明),那么接收到的整串字符做什么用呢,就要靠通讯规范了
    MODBUS的通讯规范很简单!
    
    先说ASCII方式:
    ASCII方式发送时的规范定义如下:
    起始符 +  设备地址   +  功能代码   +   数据  +   校验   +  结束符
    
    
    1\起始符:    接收到一串字符,总要知道这串字符从哪个地方开始吧,这就是起始符的作用,接收方不管以前收到多少个字符。当接收到起始符时,以前的字符就不再理它了,从起始符开始分析以后的字符!  MODBUS的ASCII方式起始符是一个冒号  “:”
    2\设备地址:
    前面说过,MODBUS是单主站的主/从通信模式,一个主站下面可以接十多个从站。大家都挂在一条线,如果没有一个设备地址,就不知道是发给哪个从站的,大家都回应的话,这条线上的信号就乱七八糟了,主站也不知道接收到的是什么了。所以,设这么一个设备地址,告诉是给那个从站的。只要这个从站回答,其他的闭嘴!“二号,请您回答,其他人就不要吱声了。”
    

    广播地址(0)是命令式的,不要求从站回答的。“都听着,晚上全体到我家喝酒去,不去者死,散会!”
    设备地址是要求两个字符,比如发给2号站,则是“02”
    现在的组合是“:02”

    3\功能代码:
    

    告诉从站应该做什么,比如读数据的命令是“3”,从站接收到这个命令,再根据下面数据要求的具体地址,把具体地址的数据返回给主站。
    功能代码也是要求两个字符,比如读命令3,则是“03”
    现在的组合是“:0203“

    4\数据:
    1、告诉从站具体的元件通讯地址,写入到哪里,从哪里读。如读变频器的设定频率的通讯地址是00A0
    元件的通讯地址要求是四个字符,如果控制器的元件地址不足四个字符,则在前面补0,比如元件通讯地址是A0,则在前面补足两个0:“00A0”

    2、数据又有可能包括您要读取的字节数( 有的控制器是字数),比如连续读取PLC的两个十六位寄存器,其字节数为四个,则是“0004”。您看出来了吧,读取个数也是要求四个字符,不足四个,前面补零
    现在的组合是“:020300A00004“

    3、而当您要实现写入功能时,数据又可能包括写入的数据,比如写入一个十六位寄存器的值,则要包括是写入的数值,如“0D98”
    现在的组合是“:020600A00D98“ 06是单个寄存器的写入命令

    4、当连续写入多个寄存器时,这个数据包括的内容又不一样,它可能是:
    寄存器通讯地址(四个字符) +字数(四个字符)+字节数(两个字符)+ 要写入的数值

    您看乱了吗?没关系的,等您拿到具体控制器时,此控制器的通讯说明上会告诉您此数据都包括什么内容,以什么样的格式排列!您一定为我上面四点中的可能字样而生气,您认为讲解就应该讲解的具体,而不是可能什么又可能什么!
    这又要重复说明一下MODBUS的通讯规范,
    起始符 + 设备地址 + 功能代码 + 数据 + 校验 + 结束符
    MODBUS是一种标准通讯协议,这种标准定义了上面红色字符的通讯规范,除了数据项,其他的都是固定字符个数。
    数据呢,因为功能代码的不同,其包含的内容也不同!所以我只好说可能包含这个,可能包含那个。您无须担心此数据变来变去,造成接收方不知道如何分析。接收方在接收到功能代码时,就已经知道此数据包含多少个字符了!

    5\检验和:
    前面说过,通讯格式里的校验方式并不能保证每个字符都正确,所以这里就把所有字符的值加在一起,其和(检验值)传给接收方,接收再把接收到的字符的值加在一起,与发送方传送过来的检验值比较,如果相等,就算接收正确了。
    "这种方式极大地提高了传输的可靠性,保证了传输的顺利进行,为传输事业做出了巨大贡献"
    这样的描述让您想到了什么?假话呗,检验只是提高了校验的可靠性。并不能完全判断传输是否正确。想要最大限度的提高传输的可靠性,唯有最大限度地降低干扰!于是产生了232,485,422传输方式,他们的区别就在于传输的可靠性!
    

    1+2+3=6 3+2+1=6 这两个字符串的作用肯定是不一样的!但是其校验和是一样的,如果在传输过程中,由于干扰,1变3,3变1,根据校验和的计算,接收方并不知道由于干扰而造成传输错误,此时,或是出现通讯错误,或是出现通讯混乱。
    如,命令码03,由于干扰而变成了30,此时校验和是一样的,而MODBUS并没有30这个命令码,接收不认识,于是出现通讯错误。
    再如,读变频器的设定频率通讯地址是0001,由于干扰而变成了0010,此时校验和是一样的,但是通讯地址却变了,变频器就可能返回的是其他数据,造成通讯混乱!
    校验字符是要求两个字符,如果计算结果超过两个字符,则取后两位!
    **参加校验计算的字符是起始符与校验符之间的字符串(不含起始符与校验符)
    现在的组合是“:02030A000004FB“ (假设校验和为FB)
    02030A000004参加校验和计算

    6\结束符:
    

    接收到一串字符,总要知道在那个地方结束吧,这就是结束符的作用,接收方不管以后还会收到多少个字符。当接收到结束符时,以后再接收的字符就算是下一轮的东西了,从起始符到结束符之间的字符就是它要分析的字符! MODBUS的ASCII方式结束符是— Chr(13)+Chr(10)
    现在的组合是“:02030A000004FB“+ Chr(13)+Chr(10)
    至此,ASCII方式的发送就完成了,控制器接收到此串字符后,根据MODBUS协议定义的通讯规范分析此串字符的作用,然后返回相应的字符!

    注意:发送的字符都是以十六进制数表示!

    控制器返回的字符根据命令的不同而不同,此处不好讲解,在下面具体例子中会有说明!

    再说RTU方式:
    
    RTU方式发送时的规范定义如下:
    至少3.5个字符传输时间的停顿间隔时间标定消息的开始  设备地址  + 功能代码+   数据  +   校验  +  至少3.5个字符传输时间的停顿间隔时间标定了消息的结束  
    
    其他的就不用说了,与ASCII方式一样的作用,唯独这3.5个字符的时间搞晕了很多人,实际我也不敢太解释,大致说一下吧,您就当听着玩,比如通讯格式是9600,E,8,1
    波特率是做什么的?一秒传输多少个位(比如一秒传送9600个位),一个字符是多少个位呢?通讯格式已经标定了(7个位或是8个位),那3.5个字符的传送时间就好算了吧:
    

    3.5*11(或10)=39个位(35个位),传3.5个字符需要的时间是:39/9600=4毫秒。
    不是说八位嘛,怎么乘11,记住了,还有一个起始位,奇或偶的校验位(无奇偶校验,则没有此位),停止位(两个停止位就是2了。)
    如9600,N,8,2为11个位,
    9600,N,7,1.为9个位
    就是说,您得保证发送字符串的连续性,中间停顿时间超过4毫秒,接收方就认为您已经发送完了这组消息,开始处理了。这就是至少3.5个字符传输时间的停顿间隔时间标定了消息的结束的含义
    如果您发送的太连续,下一组消息与上一组消息之间的间隔时间没超过4毫秒,接收方就认为这些字符是一组消息,按一组消息去处理。所以,您发送结束一组命令后,必须间隔4毫秒才能发送下一组命令. 这就是至少3.5个字符传输时间的停顿间隔时间标定消息的开始的含义

    至此我的大白话结束,有什么错误,请您批评,多谢!

    通讯协议实际也就是这回事,任何一个协议都大同小异。通讯格式,通讯规范两种而已。
    您如果愿意,也可以自己定义一个通讯规范,用PLC或是VB语言按照您自己定义的这个规范处理,如果可靠性超过modbus,那您的通讯规范就是最流行的了!
    

    我经常问某些产品推广人员,“您设备的通讯协议是什么”,他回答:“232”或是“485”。今天您看了上面这些大白话,请您就不要再这样回答了。
    Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。
    “232”或是“485”只是一种线路传输方式,与协议是无关的!232传输抗干扰性差,485传输抗干扰相对强。

    MODBUS做为一种标准的协议,应用于各种PLC,控制器,仪表。这些仪表或是控制器应用中,元件的通讯地址肯定是不一样了;各个命令码的各部分组成的意义也许也会不同;
    但是,它一定会遵守MODBUS的协议规范。即,每个命令码的组成一定符合MODBUS的规范!一样不多,一样不少!

    下面针对某种支持MODBUS协议的控制器,说一下具体的读/写例子

    1\ 读某控制器的十五个寄存器值,发送的字符串是:(ASCII方式)

    “: 01031000000FDD”+ Chr(13)+Chr(10)
    起始符“:” + 站号(01) + 读命令(03)+ 起始寄存器通讯地址(1000)+ 字数(15;转换成十六进制000F)+ 校验和(DD)+ 结束符

    控制器返回的字符数是71个
    起始符“:” + 站号(01) + 读命令(03)+ 字数(0F)+ 60个数据字符(一个寄存器是4个,一共十五个) + 校验和(DD)+ 结束符(两个)

    2\ 分别向某控制器两个寄存器写入数值,发送的字符串是:(ASCII方式)

    “: 01101000000204”+ 写入的数值(8个字符)+ 校验和 + Chr(13)+Chr(10)
    起始符“:” + 站号(01) + 写命令(10)+ 起始寄存器通讯地址(1000)+ 字数(2;转换成十六进制0002)+ 字节数(04) + 校验和(因为写入数值是变化的,需要得经过计算得出校验和)+ 结束符

    控制器返回的字符数是17个
    起始符“:” + 站号(01) + 写命令(10)+ 起始寄存器通讯地址(1000)+ 字数(02)+ 错误码(2个) + 校验和(DD)+ 结束符(两个)

    *错误码,当通讯正确时是什么,通讯错误时是什么,具体控制器会有说明

    读其他仪表的某值时,参照上述读的规范,也就是更改一下起始寄存器通讯地址、字数、校验和(校验和是编制程序块自动计算的。)
    要读多个仪表的同一个检测值更简单,更改站号就可以了。

    展开全文
  • Modbus应用协议详解

    千次阅读 2019-03-18 18:38:23
    Modbus应用协议缩略语协议描述服务器正常响应服务器异常响应三种PDUmb_req_pdumb_rsp_pdumb_excep_rsp_pdu数据编码Modbus数据模型Modbus模型实现的实例 ...Modbus协议定义了一个与基础通信层无关的简单协议数据单...

    Modbus应用协议

    缩略语

    在这里插入图片描述

    协议描述

    Modbus是一个请求/应答协议,并且提供功能码规定的服务。Modbus功能码是Modbus请求/应答PDU 的元素。

    Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU),特定总线或网络上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域
    在这里插入图片描述

    启动Modbus事务处理的客户机(主)创建Modbus应用数据单元,功能码向服务器(从)指示将执行哪种操作,Modbus协议建立了客户机启动的请求格式。

    用一个字节编码Modbus数据单元的功能码域,有效的码字范围是十进制1-255(128-255为异常响应保留),当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。

    向一些功能码加入子功能码来定义多项操作

    从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散量和寄存器地址、处理的项目数量以及域中的实际数据字节数。

    在某种请求中,数据域可以是不存在的(0长度),在此情况下服务器不需要任何附加信息,功能码仅说明操作

    如果在一个正确接收的Modbus ADU中,不出现与请求Modbus功能有关的差错,那么服务器至客户机的响应数据域包括所请求的数据。如果出现与所请求Modbus功能有关的差错,那么该域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作

    服务器正常响应

    当服务器对客户机响应时,它使用功能码域来指示正常(无差错)响应或者出现某种差错(称为异常响应),对于一个正常响应来说,服务器仅复制原始功能码
    在这里插入图片描述

    服务器异常响应

    对于异常响应,服务器将原始功能码的最高有效位设置为逻辑1后返回
    在这里插入图片描述

    注:需要管理超时,以避免无限期的等待可能不会出现的应答
    

    三种PDU

    Modbus最初在串行链路上的实现(最大RS485 ADU=256字节)限制了Modbus PDU的长度,因此对串行链路通信来说,Modbus PDU=256-服务器地址(1字节)-CRC(2字节)=253字节,从而,RS232/RS485 ADU=253字节+服务器地址+CRC=256字节

    Modbus协议定义了三种PDU,他们是:
    1.	Modbus请求PDU,mb_req_pdu
    2.	Modbus响应PDU,mb_rsp_pdu
    3.	Modbus异常响应PDU,mb_excep_rsp_pdu
    

    mb_req_pdu

    mb_req_pdu={function_code,request_data}其中
    fuction_code:1字节,Modbus功能码
    request data:n字节,这个域与功能码有关,并且通常包括诸如参考变量、变量计数、数据偏移、子功能码等信息
    

    mb_rsp_pdu

    mb_rsp_pdu={function_code,response_data},其中
    function code:1字节,modbus功能码
    response data:n字节,这个域与功能码有关,并且通常包括诸如参考变量、变量计数、数据偏移、子功能码等信息
    

    mb_excep_rsp_pdu

    mb_excep_rsp_pdu={function_code,exception_code},其中
    function code:1字节,modbus功能码+0x80
    exception code:1字节,modbus异常码
    

    数据编码

    Modbus使用最高有效字节在低地址存储的方式表示地址和数据项,这意味着当发送多个字节时,首先发送最高有效字节,例如:

    0x1234,发送的第一个字节为0x12,然后是0x34
    

    Modbus数据模型

    Modbus的数据模型是以一组具有不同特征的表为基础建立的
    在这里插入图片描述

    输入与输出之间以及位寻址和字寻址的数据项之间的区别并不意味着应用特性的差别,如果所有4个表相互覆盖是对该目标机器最自然的解释,也是完全可接受的,而且很普遍

    对于每个基本表,协议都允许单个的选择65536个数据项,而且其读写操作被设计为可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关

    很显然,必须将Modbus处理的所有数据(位,寄存器)放置在设备应用存储器中,但是存储器的物理地址不应该与寄存器编号混淆,仅要求将寄存器编号与物理地址链接

    Modbus功能码中使用的Modbus寄存器逻辑编号是以0开始的无符号整数索引

    Modbus模型实现的实例

    下列实例表示了两种在设备中组织数据的方法,有多种数据组织的方法,在本部分中没有被全部描述,每个设备根据其应用都有它自己的组织数据的方法

    实例一:有四个独立块的设备

    下图表示了含有数字量、模拟量、输入量和输出量的设备中的数据组织,由于不同块中的数据不相关,每个块是相互独立的,可通过不同Modbus功能码访问每个块
    在这里插入图片描述

    实例二:仅有一个块的设备

    设备仅有一个数据块,通过几个Modbus功能码能够得到相同的数据,既可以通过16位访问也可以通过1位访问
    在这里插入图片描述

    Modbus寻址模型

    Modbus应用协议精确地定义了PDU寻址规则
    在Modbus PDU中,从0-65536寻址每个数据
    Modbus应用协议还明确的定义了由4个块构成的Modbus数据协议,每个块由编号为1-n的元素构成
    在Modbus数据模型中,从1-n为数据块中的每个元素编号
    然后必须将Modbus模型与设备应用结合
    Modbus数据模型和设备应用之间的映射完全与特定设备相关
    下图表示了用Modbus PDU的X-1寻址编号为X的Modbus数据
    在这里插入图片描述

    Modbus事务处理的定义

    下图描述了在服务器侧Modbus事务处理的一般处理过程
    在这里插入图片描述
    一旦服务处理请求,使用合适的Modbus服务器事务处理建立Modbus响应
    根据处理结果,可以建立两种类型响应:

    1. 一个正常的Modbus响应,响应功能码=请求功能码
    2. 一个异常的Modbus响应
      a) 用来为客户机提供处理过程中与所发现的差错相关的信息
      b) 异常功能码=请求功能码+0x80
      c) 提供一个异常码来指示差错原因

    功能码分类

    有三类Modbus功能码,它们是:

    1. 公共功能码
      a) 被确切定义的功能码
      b) 保证是唯一的
      c) 由Modbus.org确认的
      d) 公开的文档
      e) 可进行一致性测试
      f) 在MB ITEF RDC中归档
      g) 包含已被定义的公共功能码和保留给未来使用的功能码
    2. 用户自定义功能码
      a) 有两个用户定义功能码的区域,即十进制的65-72和100-110
      b) 用户无需Modbus组织的任何批准就可以选择和实现一个功能码
      c) 不能保证被选功能码的使用是唯一的
      d) 如果用户希望将某种功能设置为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码
    3. 保留功能码
      a) 某些公司在传统产品上现行使用的功能码,不作为公共使用
      在这里插入图片描述

    公共功能码定义

    在这里插入图片描述

    功能码描述

    (0x01)读线圈

    使用该功能码从一个远程设备中读1-2000个连续的线圈状态,请求PDU指定了起始地址,即指定了第一个线圈地址和线圈数目,地址从0开始

    响应报文中的线圈按数据域的每位一个线圈进行打包,状态被表示为1=ON和0=OFF,第一个数据的LSB包含询问中所寻址的输出,其他线圈以此类推,直到这个字节的高位端为止,并在后续字节中按照从低位到高位的顺序排列

    如果返回的输出数量不是8的倍数,将用0填充最后数据字节中的剩余位,字节数量域说明了数据的全部字节数

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求读离散量输出20-38的实例:
    在这里插入图片描述
    将输出27-20的状态表示为十六进制字节值0xCD或二进制11001101,输出27是这个字节的MSB,输出20是LSB

    第一个字节的输出从左到右为27-20,下一个字节的输出从左到右为35-28,当串行发送位时,从LSB向MSB传输:20…27…35…

    在最后的数据字节中,将输出38-36的状态表示为十六进制值0x05或二进制00000101,输出38是左侧第6个位置,输出36是这个字节LSB,用0填充高5位
    在这里插入图片描述

    (0x02)读离散量输入

    使用该功能码从一个远程设备中读1-2000个连续的离散量输入状态,请求PDU指定了起始地址,即指定了第一个离散量输入地址和离散量输入数目,在PDU中从0开始寻址离散量输入,因此编号1-16的离散量输入寻址为0-15

    响应报文中的离散量输入按数据域的每位一个离散量输入进行打包,状态表示成1=ON和0=OFF,第一个数据字节的LSB包含询问中所寻址的输入,其他离散量输入以此类推,直到这个字节的高位端为止,并在后续的字节中按照从低位到高位的顺序排列

    如果返回的输入数量不是8的倍数,将用0填充最后数据字节中的剩余位,字节数量域说明了数据的全部字节数

    mb_req_pdu/ mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求离散量输入197-218的实例:
    在这里插入图片描述
    将离散量输入204-197的状态表示为十六进制值0xAC或二进制10101100,输入204是这个字节的MSB,输入197是这个字节的LSB

    将离散量输入218-213的状态表示为十六进制值0x35或二进制00110101,离散量输入218位于左侧第三位,离散量输入213是这个字节的LSB,用0填充高2位
    在这里插入图片描述

    (0x03)读保持寄存器

    使用该功能码从远程设备中读保持寄存器连续块的内容,请求PDU说明了起始寄存器地址和寄存器数量,在PDU中,从0开始寻址寄存器,因此编号1-16的寄存器寻址为0-15

    将响应报文中的寄存器数据打包成每个寄存器有两字节

    对于每个寄存器,第一个字节为高位字节,第二个字节为低位字节

    mb_req_pdu/ mb_rsp_pdu/ mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求读寄存器108-110的实例:
    在这里插入图片描述
    将寄存器108的内容表示为两个十六进制字节值0x022B,将寄存器109-110的内容分别表示为十六进制0x000和0x0064
    在这里插入图片描述

    (0x04)读输入寄存器

    使用该功能码从一个远程设备中读1-125个连续输入寄存器,请求PDU说明了起始地址和寄存器数量,在PDU中从0开始寻址寄存器,因此编号为1-16的寄存器寻址为0-15

    将响应报文中的寄存器数据打包成每个寄存器两个字节

    对于每个寄存器,第一个字节为高位字节,第二个字节为低位字节

    mb_req_pdu/ mb_rsp_pdu/ mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求读输入寄存器9的实例:
    在这里插入图片描述
    将输入寄存器9的内容表示为两个十六进制值0x000A
    在这里插入图片描述

    (0x05)写单个线圈

    使用该功能码将一个远程设备中的一个输出写为ON/OFF

    请求数据域中的常数指定所请求的ON/OFF状态,十六进制0xFF00请求输出为ON,十六进制0x0000请求输出为OFF,其他所有值均是非法的,并且对输出不起作用

    请求PDU说明了被强制的线圈地址,从0开始寻址线圈,因此编号为1的线圈寻址为0

    正常的响应是请求的复制,在写入线圈状态之后被返回

    mb_req_pdu/ mb_rsp_pdu/ mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求写线圈173为ON的实例:
    在这里插入图片描述
    在这里插入图片描述

    (0x06)写单个寄存器

    使用该功能码在一个远程设备中写一个保持寄存器

    请求PDU指定了被写入的寄存器地址,从0开始寻址寄存器,因此编号为1的寄存器被寻址为0

    正常的响应是请求的复制,在写入寄存器内容之后被返回

    mb_req_pdu/ mb_rsp_pdu/ mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求将十六进制0x0003写入寄存器2的实例:
    在这里插入图片描述
    在这里插入图片描述

    (0x07)读异常状态(仅用于串行链路)

    使用这个功能码从一个远程设备中读8个异常状态输出的内容

    因为异常码输出参量是已知的(在这个功能中不需要输出参量),该功能提供一种简单的访问这种信息的方法

    正常的响应包括8个异常状态输出的内容,将这些输出打包成一个字节,每个输出一个位,在该字节的LSB中包含最低位输出参量的状态

    mb_req_pdu/ mb_rsp_pdu/ mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求读异常状态的实例:
    在这里插入图片描述
    在这个实例中,输出数据是十六进制0x6D(01101101),从左到右,输出为OFF-ON-ON-OFF-ON-ON-OFF-ON,从最高到最低寻址输出的方式显示状态
    在这里插入图片描述

    (0x08)诊断(仅用于串行链路)

    Modbus功能码提供一系列测试,用于检测客户机(主站)与服务器(从站)之间的通信系统,或服务器中的各种内部差错状态

    这个功能使用询问中的2个字节的子功能码域来定义所执行的测试类型,服务器在正常的响应中复制功能码和子功能码,一些诊断会导致远程设备通过正常响应的数据域返回相应数据

    通常,向远程设备发送诊断功能,不影响远程设备中的用户程序运行,诊断不能访问用户逻辑,某些功能可以任意的复位远程设备中的差错计数器

    但是,可以强制服务器进入“只听”模式,在这种模式中服务器监视通信系统中的报文而不对报文进行响应,如果应用程序与远程设备的进一步数据交换有关,就可能影响应用程序的结果,一般情况下,这种模式被强制用来从通信系统中去除有故障的远程设备

    下列诊断功能专门用于串行链路设备

    对返回询问数据请求的正常响应是回送相同的数据,同时还复制功能码和子功能码

    mb_req_pdu/ mb_rsp_pdu/ mb_excep_rsp_pdu

    在这里插入图片描述

    串行链路设备支持的子功能码

    下图是串行链路设备所支持的子功能码列表,所列出的每个子功能码均附带用于诊断的数据域内容的实例
    在这里插入图片描述

    (0000)返回询问数据

    在响应中返回请求数据域中传递的数据,响应报文应该与请求报文全部一致
    在这里插入图片描述

    (0001)重新启动通信选项

    必须初始化和重新启动远程设备串行链路端口,并且清除所有通信事件计数器。如果端口正在只听模式下,不返回响应,它是唯一的能将端口带出只听模式的功能,如果端口不是处于只听模式,返回正常的响应,在进行重新启动之前,会出现这种状况

    当远程设备接收到请求时,它设法进行重新启动,并进行加电确认测试,成功的完成测试将端口带入联机状态

    请求数据域内容是十六进制0xFF00时,能够清除端口通信事件记录,内容是0x0000时,保持记录与重新启动之前相同
    在这里插入图片描述

    (0002)返回诊断寄存器

    在响应中返回远程设备的16位诊断寄存器内容
    在这里插入图片描述

    (0003)改变ASCII输入分隔符

    请求数据域中传递的字符“CHAR”作为报文结束分隔符(替代默认的LF字符),为以后报文使用,在ASCII报文结束不要求换行的情况下,使用这种功能
    在这里插入图片描述

    (0004)强制只听模式

    强制被寻址的远程设备进入Modbus通信的只听模式,这就使远程设备与网络中的其他设备断开,允许网络中其他未被强制只听的设备继续通信,没有返回响应

    当远程设备进入只听模式时,关闭所有激活的通信控制,允许就绪看门狗定时器超时,锁定控制关断,当设备在这种模式下,监视对设备寻址的报文和广播,但不进行任何操作,不发送任何响应

    进入这种模式后处理的唯一功能是重新启动通信选项
    在这里插入图片描述

    (000A)清除计数器和诊断寄存器

    目的是清除所有计数器和诊断寄存器,上电时也会清除计数器
    在这里插入图片描述

    (000B)返回总线报文计数

    响应数据域返回上一次重启动、清除计数器操作或加电之后远程设备在通信系统中检测到的报文数量
    在这里插入图片描述

    (000C)返回总线通信错误计数

    响应数据域返回上一次重新启动、清除计数器操作或加电之后远程设备遇到的CRC错误数量
    在这里插入图片描述

    (000D)返回总线异常错误计数

    响应数据域返回上一次重新启动、清除计数器操作或加电之后远程设备Modbus异常响应数量
    在这里插入图片描述

    (000E)返回从站报文计数

    响应数据域返回上一次重新启动、清除计数器操作或加电之后对远程设备寻址的报文数量或远程设备处理的广播报文数量
    在这里插入图片描述

    (000F)返回从站无响应计数

    响应数据域返回上一次重启动、清除计数器或加电之后对没有返回响应(既没有正常响应又没有异常响应)的远程设备寻址的报文数量
    在这里插入图片描述

    (0011)返回从站忙计数

    返回数据域返回上一次重启动、清除计数器操作或加电之后对返回从站设备忙异常响应的远程设备寻址的报文数量
    在这里插入图片描述

    (0012)返回总线字符超限计数

    响应数据域返回上一次重启动、清除计数器操作或加电之后,对由于字符超限状况而无法处理的远程设备寻址的报文数量,字符抵达端口的速度高于存储字符的速度,或者由于硬件故障而丢失字符均产生字符超限
    在这里插入图片描述

    (0014)清除超限计数器和标志

    清除超限错误计数器,并复位错误标志
    在这里插入图片描述

    实例与状态图

    下图是一个请求远程设备返回询问数据的实例,它使用子功能码0x000,用两字节数据域0xA537发送返回的数据
    在这里插入图片描述
    在这里插入图片描述

    (0x0B)获得通信事件计数器(仅用于串行链路)

    使用这个功能码从远程设备通信事件计数器中获取状态字和事件计数,通过在一系列报文之前和之后获取的当前计数,客户机可以确定远程设备是否正确的处理报文

    每次成功的完成报文传输就将远程事件计数器加1,异常响应、轮询命令或读事件计数器命令不增加计数器

    利用重新启动通信选项的子功能码(0001),或者清除计数器和诊断寄存器(000A),复位事件计数器

    正常响应包括两字节状态字和两字节事件计数,如果远程设备一直在处理前面发出的程序命令(存在忙状态),那么状态字将全为1(FFFF),否则状态字全为0

    mb_req_pdu/ mb_rsp_pdu/ mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求获得远程设备中通信事件计数器的实例
    在这里插入图片描述
    在这里插入图片描述

    (0x0C)获得通信事件记录(仅用于串行链路)

    使用这个功能码从远程设备中获得状态字、事件计数、报文计数以及一个事件字节域

    该状态字和事件计数与获得通信事件计数器(0x0B)返回的信息一致

    报文计数器包含上一次重启动、清除计数器操作或加电之后远程设备处理的报文数量,报文计数与诊断功能(0x08)子功能总线报文计数(0x0B)返回的报文一致

    事件字节域包含0-64个字节,每个字节与远程设备的一个Modbus发送或接收操作状态对应,远程设备按时间顺序将事件放入域中,字节0是最新事件,新字节替代域中的旧字节

    正常响应包括2字节状态字、2字节事件计数、2字节报文计数、一个含有0-64个事件字节的域和1个字节计数域,包括这四个域的总数据长度

    mb_req_pdu/mb_rsp_pdu/mb_excep_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求获得远程设备中通信事件记录的实例
    在这里插入图片描述
    在这个实例中,状态字是十六进制0x00,表示远程设备没有正在处理程序功能,事件计数表示了远程设备已经计数0x0108个事件,报文计数表示了已经处理了0x0121个报文

    用事件0字节表示最新通信事件,最新通信事件的内容0x20表示远程设备最近进入了只听模式
    用事件1字节表示前一个事件,前一个事件的内容0x00表示远程设备接收一个通信重启动

    下面说明响应事件字节的格式
    由获得通信事件记录功能返回的事件字节可以是以下四种类型中的任何一种,每个字节中的BIT7定义了这种类型,还可以由BIT6进一步定义:

    1. 远程设备Modbus接收事件
      当远程设备收到询问报文时,存储这种类型的事件字节,在远程设备处理报文之前存储,通过将BIT7设置为逻辑1定义这种事件,其他位在相应状态为真时被设置为逻辑1
      在这里插入图片描述
    2. 远程设备Modbus发送事件
      当远程设备处理完请求报文时,存储这种类型的事件字节,远程设备返回正常响应、异常响应或者没有响应后存储,通过将BIT7 置为逻辑0,BIT6置为逻辑1定义这种事件,其他位在相应状态为真时设置为逻辑1
      在这里插入图片描述
    3. 远程设备进入只听模式
      当远程设备进入只听模式时,存储种类型的事件字节,内容十六进制0x04定义了这个时间
    4. 远程设备开始重启通信
      当远程设备重新启动通信端口时,存储这种类型的事件字节,通过附带子功能重新启动通信选项的诊断功能可以重新启动远程设备
      该功能还能将远程设备置于“错误状态下继续”或“错误状态下停止”模式,如果将设备置于“错误状态下继续”模式,则将事件字节加入现存事件记录汇总,如果将设备置于“错误状态下停止”模式,则将事件字节加入事件记录中,并将其与记录清0
      内容0定义了该事件
      在这里插入图片描述

    (0x0F)写多个线圈

    该功能码将一个远程设备中的一个线圈序列的每个线圈强制为ON/OFF,请求PDU指定了被强制的线圈编号,从0开始寻址线圈

    请求数据域的内容指定了被请求的ON/OFF状态,逻辑1=ON,逻辑0=OFF

    正常的响应返回功能码、起始地址和被强制的线圈数量

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求从线圈20开始写入10个线圈的实例
    在这里插入图片描述
    传输的第一个字节0xCD对应线圈为27-20,LSB对应20
    在这里插入图片描述

    (0x10)写多个寄存器

    使用该功能码在一个远程设备中写连续寄存器块(1-123) 寄存器

    在请求数据域中指定了请求写入的值,将数据打包成每寄存器2字节

    正常的响应返回功能码、起始地址和被写入寄存器的数量

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求将0x000A和0x0102写入以2开始的两个寄存器的实例
    在这里插入图片描述
    在这里插入图片描述

    (0x11)报告从站ID(仅用于串行链路)

    使用这个功能码读远程设备特定的类型描述、当前状态以及其他信息

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求报告ID和状态的实例
    在这里插入图片描述

    (0x14/0x06)读文件记录

    使用该功能码读文件记录,根据字节数量提供所有请求数据长度,并且根据寄存器提供所有记录长度

    文件是记录的结构,每个文件包括10000个记录,寻址这些记录为0-9999,记录12的寻址为12(非从0计数)

    该功能可以读多个参量组,这些组可以是分散的,但每组中的参量必须是连续的

    用含有7个字节的单独的“子请求”域定义每个组:
    -参量类型:1个字节,必须指定为6
    -文件号:2个字节
    -文件中的起始记录号:2个字节
    -所读记录的长度:2个字节

    被读取的的寄存器数量加上预期响应中的所有其他域不能超过Modbus报文PDU允许的长度:253字节

    正常的响应是一系列“子响应”与“子请求”一一对应,字节计数域是所有“子响应”中的全部字节数,另外每个“子响应”都包括一个表示自身字节计数的域

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求从远程设备读两个参量组的实例:
    组1包括文件4中的2个寄存器,以寄存器1开始(地址0001)
    组2包括文件3中的2个寄存器,以寄存器9开始(地址0009)
    在这里插入图片描述
    在这里插入图片描述

    (0x15/0x06)写文件记录

    使用该功能码进行文件记录写入

    文件是记录的结构,每个文件包括10000个记录,寻址这些记录为0-9999

    该功能可以写多个参量组,这些组可以是分散的即不连续的,但每组内的参量必须是连续的

    用含有7个字节的“子请求”域定义每个组:
    参量类型:1字节,必须指定为6
    文件号:2字节
    文件中起始记录号:2字节
    被写入的数据:每个寄存器为2字节

    被写入的寄存器数量加上询问中的所有其他域不能超过Modbus报文PDU允许的长度:253字节
    正常的响应是请求的复制

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述
    在这里插入图片描述

    实例与状态图

    下图是一个请求将一个参考组写入远程设备的实例:
    组包括文件4中的3个寄存器,以寄存器7开始
    在这里插入图片描述‘’

    屏蔽写寄存器

    该功能码用于通过利用“AND”屏蔽、“OR”屏蔽以及当前寄存器内容的组合来修改保持寄存器的内容,使用这个功能设置或清除寄存器中不同的位

    请求指定了被写入的保持寄存器,被用于“AND”屏蔽的数据和被用于“OR”屏蔽的数据

    从0开始寻址寄存器,因此寄存器编号为1-16的寻址为0-15
    在这里插入图片描述

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个利用屏蔽值在远程设备中对寄存器5的屏蔽写入的实例:
    在这里插入图片描述
    在这里插入图片描述

    (0x17)读/写多个寄存器

    这个功能码实现了在一个单独的Modbus事务中一个读操作和一个写操作的组合,在读之前进行写操作

    从0开始寻址保持寄存器,因此寄存器编号为1-16的寻址为0-15

    请求指定了被读取的保持寄存器的起始地址和数目,以及被写入的保持寄存器的起始地址和数目,在写数据域中,字节计数指定随后的字节数目

    正常的响应包括所读寄存器组中的数据,在读数据域中,字节计数指定了随后的自己数目

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个请求从寄存器4开始读6个寄存器并且从寄存器15开始写3个寄存器的实例:
    在这里插入图片描述
    在这里插入图片描述

    (0x18)读FIFO队列

    这个功能码允许读远程设备中的FIFO寄存器队列内容,这个功能码返回队列中寄存器的计数,随后为队列的数据,最大可以读32个寄存器:计数+31个寄存器,首先返回队列计数寄存器然后是队列数据寄存器

    这个功能码读取队列内容,但是不能清除队列内容

    在正常的响应中,字节计数标识了随后的字节数量,包括队列计数字节和数值寄存器字节(不包括差错校验)

    队列计数是队列中数据寄存器的数量,不包括计数寄存器

    如果队列计数大于31,返回一个含有差错码03的异常响应

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    实例与状态图

    下图是一个对远程设备读FIFO队列请求的实例,请求读寄存器0x04DE开始的队列
    在这里插入图片描述
    在这个实例中,FIFO指针寄存器返回的队列计数器值0x02,队列计数后面是两个数据寄存器0x01B8和0x1284
    在这里插入图片描述

    (0x2B)封装接口传输

    Modbus封装接口(MEI)传输是一个在Modbus PDU内部将服务请求、方法调用和相关返回隧道化机制

    MEI传输的主要特征是封装作为已定义接口的一部分方法调用或服务请求,以及方法调用返回和服务响应
    在这里插入图片描述
    网络接口可以是用于发送Modbus PDU的任何通信栈,诸如:TCP/IP或穿行链路

    MEI类型是Modbus指配的编号,因此它是唯一的,值1-127是公共的,值128-255是用户定义的

    MEI传输实现使用MEI类型来分派对所指定的方法调用

    由于MEI传输服务是接口未知的,因此接口所需的任何特性或策略需由该接口提供,例如MEI事务处理和MEI接口差错处理等

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    (0x2B/0x0E)读设备标识

    这个功能码允许读取与远程设备物理和功能描述相关的标识和附加信息

    读设备标识接口由一组可寻址的数据元素组成的地址空间构成,数据元素被称作对象,由对象ID标识他们

    接口由3类对象组成:

    1. 基本设备标识:所有此种对象都是必备的:厂商名称、产品代码和修订版本号
    2. 常规设备标识:除基本数据对象外,设备提供了附加的可选择的标识以及数据对象描述
    3. 扩展设备标识:除常规数据对象外,设备提供了附加的可选择的标识以及专用数据描述

    在这里插入图片描述

    mb_req_pdu/mb_rsp_pdu/mb_excep_rsp_pdu

    在这里插入图片描述

    请求参数描述

    功能码:0x2B

    MEI类型:Modbus指配的编号

    ReadDevId码:允许定义四种访问类型:
    01:请求获得基本设备标识(流访问)
    02:请求获得常规设备标识(流访问)
    03:请求获得扩展设备标识(流访问)
    04:请求获得特定标识对象(单个访问)

    如果ReadDevId是无效的,在响应中返回异常码03

    在设备标识不适用单独响应的情况下,需要进行多个事务处理,对象ID字节给出了要获得的第一个对象标识,对于一个事物处理来说,客户机必须设置对象ID为0,以便获得设备标识数据的起始信息,对于随后事务处理来说,客户机必须设置对象ID为服务器在此前响应中的返回值

    如果流访问中对象ID不匹配任何已知对象,那么服务器的响应如同指向对象0

    在单个访问的情况下:ReadDevId代码04,请求中的对象ID给出了要获取的对象标识

    如果在单个访问中对象ID不匹配任何已知对象,那么服务器返回一个异常码02(非法数据地址)的异常响应

    如果服务器设备被要求高于其一致性的描述,服务器必须根据其对应的实际等级响应

    响应参数描述

    功能码:0x2B

    ReadDevId码:与请求的ReadDevID码相同:01、02、03或04

    一致性等级:设备的标识一致性等级和支持访问的类型
    0x01:基本标识(仅流访问)
    0x02:常规标识(仅流访问)
    0x03:扩展标识(仅流访问)
    0x81:基本标识(流访问和单个访问)
    0x82:常规标识(流访问和单个访问)
    0x83:扩展标识(流访问和单个访问)

    接续标识:在ReadDevId码01、02或03(流访问)的情况下,在标识数据不适用单独响应的情况下,需要进行多个事物处理
    0x00:没有后续对象
    0xFF:有后续对象,并且需要更多Modbus事务处理
    在ReadDevId码04(单个访问)情况下,必须设置这个域为0

    下一个对象ID:如果“接续标识=0xFF”,那么该值就是请求下一个对象的标识码
    如果“接续标识=0x00”,那么必须设置为0

    对象数目:在响应中返回的对象标识数目(对于单个访问,对象数目=1)

    对象0.Id:PDU中返回的第一个对象识标识(流访问)或请求对象的标识(单个访问)
    对象0.长度:第一个对象的字节长度
    对象0.值:第一个对象的值

    对象N.id:在响应中最后对象的标识
    对象N.长度:最后对象的字节长度
    对象N.值:最后对象的值

    实例与状态图

    下图是一个读基本设备标识的实例,一个响应PDU中发送的所有报文
    在这里插入图片描述
    如果一个设备需要多个事务处理发送响应,那么启动随后事务处理
    第一个事务处理
    在这里插入图片描述
    在这里插入图片描述
    第二个事务处理
    在这里插入图片描述
    在这里插入图片描述

    Modbus异常响应

    当客户机设备想服务器设备发送请求时,客户机希望得到一个正常的响应,主站的询问可能导致下列四种事件之一:

    1. 如果服务器设备接收无通信错误的请求,并且可以正常的处理询问,那么服务器将返回一个正常响应
    2. 如果由于通信错误,服务器没有收到请求,那么不能返回响应,客户机程序将视为超时
    3. 如果服务器收到请求,但是检测到一个通信错误(奇偶校验、LRC、CRC…)那么不能返回响应,客户机视为超时
    4. 如果服务器收到无通信错误的请求,但不能处理这个请求(例如请求读一个不存在输出或保持寄存器),服务器将返回一个异常响应,通知客户机错误的实际情况

    异常响应有2个与正常响应不同的域:

    1. 功能码域:在正常的响应中,服务器响应的功能码复制请求功能码,所有功能码的MSB都为0,在异常响应中,服务器设置功能码的MSB为1
    2. 数据域:在正常的响应中,服务器可以在数据域返回数据或统计信息,在异常响应中服务器在数据域返回异常码

    异常码表

    在这里插入图片描述

    展开全文
  • Modbus协议(翻自wiki)

    千次阅读 2018-10-31 13:49:34
    Modbus 是一种串行通信协议,最初由Modicon(现为施耐德电气)于 1979 年出版,用于其可编程逻辑控制器( PLC )。 Modbus 已成为约定俗成的标准通信协议,现在已成为连接工业电子设备的常用方法。[^1] 在工业环境中...

    原文

    Modbus

    译文

    Modbus


    来自维基百科,自由的百科全书

    Modbus 是一种串行通信协议,最初由Modicon(现为施耐德电气)于 1979 年出版,用于其可编程逻辑控制器( PLC )。 Modbus 已成为约定俗成的标准通信协议,现在已成为连接工业电子设备的常用方法。 1 在工业环境中使用 Modbus 的主要原因是:

    • 在考虑工业应用的情况下开发,
    • 公开发布,免版税,
    • 易于部署和维护,
    • 允许供应商无限制移动原始位或字。

    Modbus 支持连接到同一网络的许多设备之间的通信,例如,测量温度和湿度的系统,并将结果传送给计算机。 Modbus 通常用于将监控计算机与远程终端单元( RTU )连接在监控和数据采集( SCADA )系统中。 许多数据类型都是从其在驱动继电器中的使用命名的:单比特物理输出称为线圈,单比特物理输入称为离散输入或接触。

    自 2004 年 4 月施耐德电气将权利转让给该组织以来,Modbus 协议的开发和更新已由 Modbus 组织 2 管理。3 Modbus 组织是 Modbus 兼容设备的用户和供应商协会,主张继续使用该技术。4

    Modbus对象类型


    以下是 Modbus 从站设备向 Modbus 主站设备提供的对象类型表

    对象类型 权限 大小
    线圈 读写 1 bit
    离散输入 只读 1 bit
    输入寄存器 只读 16 bits
    保持寄存器 读写 16 bits

    协议版本


    对于串行端口以及支持 Internet 协议套件的以太网和其他协议,存在 Modbus 协议的版本。 Modbus 协议有很多种变体:

    • Modbus RTU - 用于串行通信,并使用紧凑的二进制数据表示协议通信。 RTU 格式遵循命令/数据,循环冗余校验和校验和作为错误检查机制,以确保数据的可靠性。 Modbus RTU 是 Modbus 最常用的实现方式。必须连续传输 Modbus RTU 消息,而不会出现字符间的犹豫。 Modbus 消息由空闲(静默)时段构成(分离)。
    • Modbus ASCII - 用于串行通信,并使用 ASCII 字符进行协议通信。 ASCII 格式使用纵向冗余校验校验和。 Modbus ASCII 消息由前导冒号(“:”)和尾随换行符(CR / LF)构成。
    • Modbus TCP / IP或Modbus TCP - 这是一种 Modbus 变体,用于通过 TCP / IP 网络进行通信,通过端口 502 连接。5它不需要校验和计算,因为较低层已经提供校验和保护。
    • TCP / IP上的Modbus或TCP上的Modbus或Modbus RTU / IP - 这是一种 Modbus 变体,与 Modbus TCP 的不同之处在于,与 Modbus RTU 一样,有效载荷中包含校验和。
    • 基于UDP的Modbus - 一些人尝试在IP网络上使用 Modbus over UDP ,这消除了 TCP 所需的开销。6
    • Modbus Plus(Modbus +,MB +或MBP) - Modbus Plus 是施耐德电气专有的,与其他变体不同,它支持多个主站之间的点对点通信。7它需要一个专用的协处理器来处理类似 HDLC 的快速令牌轮换。它使用 1 Mbit / s 的双绞线,并在每个节点处包含变压器隔离,这使其转换/边沿触发而不是电压/电平触发。将 Modbus Plus 连接到计算机(通常是用于 ISA , PCI 或 PCMCIA 总线的卡)需要特殊硬件。
    • Pemex Modbus - 这是标准 Modbus 的扩展,支持历史和流量数据。它专为 Pemex 石油和天然气公司设计,用于过程控制,从未得到广泛采用。
    • Enron Modbus - 这是 Enron 公司开发的标准 Modbus 的另一个扩展,支持 32 位整数和浮点变量以及历史和流量数据。使用标准地址映射数据类型。8历史数据符合美国石油协会( API )行业标准,用于存储数据。[需要引证]

    对于前4种协议变量,数据模型和函数调用是相同的; 只有封装是不同的。 但是,变体不可互操作,帧格式也不可互操作。

    通讯和设备


    准备使用 Modbus 进行通信的每个设备都有一个唯一的地址。在串行和 MB + 网络中,只有指定为主节点的节点才能发起命令。在以太网上,任何设备都可以发送 Modbus 命令,尽管通常只有一个主设备会这样做。 Modbus 命令包含设备的 Modbus 地址(1到247)。只有预期的设备才会对该命令起作用,即使其他设备可能会收到它(例外情况是发送到节点 0 的特定可广播命令,它们被作用但未被确认)。所有 Modbus 命令都包含校验和信息,以允许接收方检测传输错误。基本 Modbus 命令可以指示 RTU 更改其中一个寄存器中的值,控制或读取 I / O 端口,并命令设备发回其寄存器中包含的一个或多个值。

    有许多调制解调器和网关支持 Modbus ,因为它是一个非常简单且经常被复制的协议。其中一些是专门为此协议设计的。不同的实现使用有线,无线通信,例如在 ISM 频带中,甚至是短消息服务( SMS )或通用分组无线服务( GPRS )。无线网络的一种常见设计利用网状网络。设计人员必须克服的典型问题包括高延迟和时序问题。

    帧格式


    Modbus帧由应用数据单元(ADU)组成,它包含协议数据单元(PDU):9

    • ADU =地址+ PDU +错误检查,
    • PDU =功能代码+数据。

    所有Modbus变体都选择以下帧格式之一。1

    Modbus RTU 帧格式(主要用于 EIA-485 等 8 位异步线路)

    名称 长度(bits) 功能
    开始 28 至少3又1/2 个字符的沉默时间(标记条件)
    地址 8 站地址
    功能 8 功能码; 例如,读取线圈/保持寄存器
    数据 n * 8 数据+长度将根据消息类型填充
    CRC 16 循环冗余校验
    停止 28 帧之间至少有3又1/2个字符的静音时间

    关于CRC的说明:

    • 多项式:x16 + x15 + x2+ 1(CRC-16-ANSI 也称为 CRC-16-IBM ,正常十六进制代数多项式为 8005 ,反转 A001 )。
      初始值:65,535。
    • 以十六进制表示的帧示例:01 04 02 FF FF B8 80(从01到FF的 CRC-16-ANSI 计算给出 80B8 ,它首先发送最低有效字节)。

    Modbus ASCII 帧格式(主要用于 7 位或 8 位异步串行线)

    名称 长度(bytes) 功能
    开始 1 以冒号开头:(ASCII十六进制值为3A)
    地址 2 站地址
    功能 2 功能码; 例如,读取线圈/保持寄存器
    数据 n * 2 数据+长度将根据消息类型填充
    LRC 2 校验和(纵向冗余校验)
    停止 2 回车 - 换行(CR / LF)对(ASCII值为0D,0A)

    地址,函数,数据和LRC都是表示 8 位值(0-255)的大写十六进制可读字符对。 例如,122(7×16 + 10)将表示为 7A 。

    LRC计算为 8 位值之和,取反(二进制补码)并编码为 8 位值。 示例:如果地址,函数和数据编码为 247,3,19,137,0 和 10 ,则它们的和为 416 。转化为8位的二进制补码(-416)为 96(例如256×2 - 416), 它将以十六进制表示为 60 。 因此,以下框架:: F7031389000A60 <CR> <LF>。

    Modbus TCP帧格式(主要用于以太网)

    名称 长度(bytes) 功能
    传输标识符 2 用于服务器和客户端的消息之间的同步
    协议标识符 2 0表示 Modbus / TCP协议
    长度字段 2 此帧中的剩余字节数
    单元标识符 1 从站地址(如果不使用则为255)
    功能码 1 功能码与其他变体一样
    数据 n 数据作为响应或命令

    单元标识符与 Modbus / TCP 设备一起使用,这些设备是几个 Modbus 设备的组合,例如, 在 Modbus / TCP 到 Modbus RTU 网关上。 在这种情况下,单元标识符告知网关后面的设备的从属地址。 本机 Modbus / TCP 功能设备通常忽略单元标识符。

    Modbus 数据帧中值的字节顺序是 big-endian(MSB,首先接收的值的最高有效字节)。

    支持的功能代码


    各种读,写和其他操作分类如下。10 最原始的读取和写入以粗体显示。 许多来源使用替代术语,例如 Force Single Coil ,其中标准使用Write Single Coil11
    Modbus 中的突出实体是:

    • 线圈:可读写,1位(关/开)
    • 离散输入:可读,1位(关/开)
    • 输入寄存器:可读,16位(0到65,535),基本上是测量和状态
    • 保持寄存器:可读写,16位(0到65,535),基本上是配置值

    主要功能代码的请求和响应数据格式


    请求和响应遵循上述帧格式。 本节详细介绍了大多数使用过的功能代码的数据格式。

    功能代码 1(读取线圈)和功能代码 2(读取离散输入)

    请求

    • 读取的第一个线圈/离散输入的地址( 16 位)
    • 读取的线圈/离散输入数量( 16 位)

    正常响应

    • 要跟随的线圈/离散输入值的字节数( 8 位)
    • 线圈/离散输入值(每个字节 8 个线圈/离散输入)

    每个线圈/离散输入的值是二进制的( 0 表示关闭,1 表示打开)。 首先请求的线圈/离散输入被存储为作为答复的第一字节的最低有效位。
    如果线圈/离散输入的数量不是 8 的倍数,则最后一个字节的最高有效位将填充零。
    例如,如果请求 11 个线圈,则需要两个字节的值。 假设这些连续线圈的状态为开,关,开,关,开,开,开,关,开,开,则响应将为十六进制的 02 E5 06 。

    由于应答消息中返回的字节数仅为 8 位宽,协议开销为 5 字节,因此最多可以同时读取 2000(250 x 8)个离散输入或线圈。

    功能码 5(强制/写入单线圈)

    请求

    • 线圈地址( 16 位)
    • 强制/写入的值:0 表示关闭,65,280(FF00表示十六进制)表示打开

    正常响应:与请求相同。

    功能码 15(强制/写入多个线圈)

    请求

    • 强制/写入的第一个线圈的地址( 16 位)
    • 强制/写入的线圈数( 16 位)
    • 要遵循的线圈值的字节数( 8 位)
    • 线圈值(每个字节 8 个线圈值)

    每个线圈的值是二进制的(0 表示关闭,1 表示打开)。 首先请求的线圈被存储为请求中的第一字节的最低有效位。
    如果线圈数不是 8 的倍数,则最后一个字节的最高有效位应填充零。 请参阅功能代码 1 和 2 的示例。

    正常响应

    • 第一个线圈的地址( 16 位)
    • 线圈数( 16 位)

    功能代码 4(读取输入寄存器)和功能代码 3(读取保持寄存器)

    请求

    • 第一个读取寄存器的地址( 16 位)
    • 要读取的寄存器数( 16 位)

    正常响应
    要遵循的寄存器值的字节数( 8 位)
    寄存器值(每个寄存器 16 位)
    由于寄存器值的字节数为 8 位宽,因此一次只能读取 125 个寄存器。12

    功能码 6(预置/写入单个保持寄存器)

    请求

    • 保持寄存器预置/写入的地址( 16 位)
    • 保持寄存器的新值( 16 位)

    正常响应:与请求相同。

    功能码 16(预置/写入多个保持寄存器)

    请求

    • 第一个保持寄存器的地址预置/写入( 16 位)
    • 预置/写入的保持寄存器数( 16 位)
    • 要遵循的寄存器值的字节数( 8 位)
    • 保持寄存器的新值(每个寄存器 16 位)

    由于寄存器值为 2 字节宽,并且只能发送 127 个字节的值,因此一次只能预置/写入 63 个保持寄存器。

    正常响应

    • 第一个预置/写入保持寄存器的地址( 16 位)
    • 预置/写入保持寄存器的数量( 16 位)

    异常响应:

    对于正常响应,从站重复功能代码。 如果从站想报告错误,它将回复所请求的功能代码加上 128(十六进制 0x80 )( 3 变为 131 =十六进制 0x83 ),并且只包含一个字节的数据,称为异常代码。

    主要的Modbus异常代码

    异常代码 长度(bytes) 功能
    1 非法功能 从设备无法识别或允许在查询中接收的功能代码
    2 非法数据地址 从设备中不允许或不存在部分或全部所需实体的数据地址
    3 非法数据值 从设备不接受该数据
    4 从设备故障 从设备尝试执行请求的操作时发生不可恢复的错误)
    5 确认 从设备已接受请求并正在处理它,但需要很长的时间。 返回此响应以防止在主设备中发生超时错误。 主设备可以接下来发出一个 Poll Program Complete 消息来确定处理是否完成
    6 从设备忙 从设备参与处理长时间命令。 主设备应该稍后再试)
    7 否认 从设备无法执行编程功能。 主设备应从从设备请求诊断或错误信息
    8 内存奇偶校验错误 从设备检测到内存中的奇偶校验错误。 主设备可以重试请求,但可能需要在从设备上提供服务
    10 网关路径不可用 专门用于 Modbus 网关。 表示配置错误的网关
                        11         网关目标设备无法响应 专门用于 Modbus 网关。 从站无法响应时发送

    线圈,离散输入,输入寄存器,保持寄存器编号和地址


    一些约定控制如何引用对 Modbus 实体(线圈,离散输入,输入寄存器,保持寄存器)的访问。

    在实体编号和实体地址之间进行区分非常重要:

    • 实体编号在其描述表中组合实体类型和实体位置。
    • 实体地址是起始地址,是 Modbus 帧数据部分中的 16 位值。 因此它的范围从 0 到 65,535 。

    在传统标准中,这些实体的数字以数字开头,后跟 1-9,999 范围内的 4 位数字:

    • 线圈编号从 0 开始,跨度从 00001 到 09999 ,
    • 离散输入数字从 1 开始,跨度从 10001 到 19999 ,
    • 输入寄存器编号从 3 开始,跨度从 30001 到 39999 ,
    • 保持寄存器号从 4 开始,跨度从 40001 到 49999 。

    这转换为数据帧中 0 到 9,998 之间的地址。 例如,为了从数字 40001 开始读取保持寄存器,数据帧中的相应地址将为 0 ,功能代码为 3(如上所示)。 对于保持从编号 40100 开始的寄存器,地址将为 99 等等。

    这将每个实体的地址数限制为 9,999 。 事实上的引用将其扩展到最大值 65,536 。13 它只是在前一个列表中添加一个数字:

    • 线圈编号从 000001 到 065536 ,
    • 离散输入数字从 100001 到 165536 ,
    • 输入寄存器编号范围从 300001 到 365536 ,
    • 保持寄存器号码范围从 400001 到 465536 。

    使用扩展引用时,所有数字引用必须正好有 6 位数。 这避免了线圈和其他实体之间的混淆。 例如,要知道保持寄存器#40001 和线圈 #40001 之间的区别,如果线圈 #40001 是目标,则它必须显示为 #040001 。

    JBUS映射
    与 Modbus 密切相关的另一个事实协议出现在它之后,由 PLC 品牌 April Automates 定义,这是法国公司 Renault Automation 和 Merlin Gerin et Cie 于 1985 年合作努力的成果: JBUS 。 当时 Modbus 和 JBUS 之间的差异(实体数量,从站数量)现在无关紧要,因为该协议几乎与 AEG 施耐德自动化于 1994 年购买的四月 PLC 系列一起消失,然后使它们过时。 然而,JBUS 的名称在某种程度上存活了下来。

    JBUS支持功能代码 1,2,3,4,5,6,15 和 16 ,因此支持上述所有实体。 但是 JBUS 的编号不同:

    • 数字和地址重合:实体 #x 在数据帧中具有地址 x。
    • 因此,实体编号不包括实体类型。 例如,在 Modbus 中保存寄存器 #40010 将保持寄存器# 9 ,位于 JBUS 的地址 9 。
    • 不支持数字 0(因此地址 0)。 从设备不应该在此数字和地址处实现任何实际数据,并且它可以返回空值或在请求时抛出错误。

    实现


    几乎所有的实现都有官方标准的变化。 不同品种可能无法在不同供应商的设备之间正确沟通。 一些最常见的变体是:

    数据类型

    • IEEE浮点数-
    • 32 位整数
    • 8 位数据
    • 混合数据类型
    • 整数中的位字段
    • 用于将数据更改为整数的乘数。 10,100,1000,256 …

    协议扩展

    • 16 位从机地址
    • 32 位数据大小( 1 个地址=返回的 32 位数据)
    • 换字数据

    限制


    • 由于Modbus是在 20 世纪 70 年代后期设计的,用于与可编程逻辑控制器通信,因此数据类型的数量仅限于 PLC 当时所理解的数据类型。不支持大型二进制对象。
    • 节点没有标准方法来查找数据对象的描述,例如,确定寄存器值是否表示 30 到 175 度之间的温度。
    • 由于 Modbus 是主/从协议,因此现场设备无法“异常报告”(以太网 TCP / IP 除外,称为 open-mbus ) - 主节点必须定期轮询每个现场设备并查找更改在数据中。这在带宽可能昂贵的应用中消耗带宽和网络时间,例如通过低比特率无线电链路。
    • Modbus 仅限于在一条数据链路上寻址 254 个设备,这限制了可能连接到主站的现场设备的数量(再次,以太网 TCP / IP 是一个例外)。
    • Modbus 传输必须是连续的,这将远程通信设备的类型限制为可以缓冲数据以避免传输中的间隙的设备。
    • Modbus协议本身不能防止未经授权的命令或数据拦截。14

    贸易集团


    Modbus Organization,Inc。是一个促进和发展 Modbus 协议的行业协会。2

    Modbus Plus


    尽管有这个名字,Modbus Plus 15并不是 Modbus 的变种。 它是一种不同的协议,涉及令牌传递。

    它是施耐德电气的专有规格,虽然它未发表而不是专利。 它通常使用仅适用于 Schneider 合作伙伴的定制芯片组实现。

    参考


    1. Drury, Bill (2009). Control Techniques Drives and Controls Handbook (PDF) (2nd ed.).Institution of Engineering and Technology . pp. 508–. (Subscription required (help)). ↩︎ ↩︎

    2. “Modbus home page” Modbus. Modbus Organization, Inc. Retrieved 2 August 2013. ↩︎ ↩︎

    3. “Modbus FAQ” Modbus. Modbus Organization, Inc. Retrieved 1 November 2012. ↩︎

    4. “About Modbus Organization”. Modbus. Modbus Organization, Inc. Retrieved 8 November 2012. ↩︎

    5. Modbus Messaging on TCP/IP Implementation Guide V1.0b (PDF), Modbus Organization, Inc., October 24, 2006, retrieved 2017-01-07 ↩︎

    6. “Java Modbus Library - About”. 2010. Retrieved 2017-02-07. ↩︎

    7. “What is the difference between Modbus and Modbus Plus?”. Schneider Electric. Retrieved 2017-02-07. ↩︎

    8. “Simply Modbus - About Enron Modbus”. Simply Modbus. Retrieved 2017-02-07. ↩︎

    9. “Modbus Messaging On TCP/IP Implementation Guide” (PDF). Modbus Organization. Modbus-IDA. ↩︎

    10. “Modbus Application Protocol V1.1b3”(PDF). Modbus. Modbus Organization, Inc. Retrieved 2 August 2013. ↩︎

    11. Clarke, Gordon; Reynders, Deon (2004). Practical Modern Scada Protocols: Dnp3, 60870.5 and Related Systems. Newnes. pp. 47–51. ISBN 0-7506-5799-5. ↩︎

    12. http://modbus.org/docs/PI_MBUS_300.pdf ↩︎

    13. “Modbus 101 – Introduction to Modbus”. Control Solutions, Inc. ↩︎

    14. Palmer; Shenoi, Sujeet, eds. (23–25 March 2009). Critical Infrastructure Protection III. Third IFIP WG 11. 10 International Conference. Hanover, New Hampshire: Springer. p. 87. ISBN 3-642-04797-1. ↩︎

    15. “Modbus Plus - Modbus Plus Network - Products overview - Schneider Electric United States”. Schneider-electric.com. Retrieved 2014-01-03. ↩︎

    展开全文
  • Modbus通信协议详解

    万次阅读 多人点赞 2015-09-22 10:43:21
    一、Modbus 协议简介    Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商...
  • MODBUS通讯协议及编程

    万次阅读 2018-05-27 19:39:56
    一、Modbus 协议简介 Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制...
  • 简单粗暴的理解 MODBUS通信协议

    万次阅读 2018-07-06 13:20:02
    amp;wfr=spider&amp;for=pcMODBUS通讯协议,是1979年由美国Modicon 公司提出的,就是被...MODBUS是世界上第一个用于工业现场的总线协议,可以说,它的出现标志着工业现场从模拟量时代向通讯时代迈进。PLC之父 迪...
  • ModbusTCP协议学习笔记

    万次阅读 多人点赞 2018-11-20 12:00:10
    1996年施耐德公司推出基于以太网TCP/IP的modbus协议:modbusTCP。 Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型。 标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网接口...
  • Modbus TCP和Modbus Rtu协议的区别

    万次阅读 2013-06-26 13:20:28
    Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MODBUS寄存器地址来交换数据;但所用的硬件接口不一样,Modbus RTU一般采用串口RS232C或RS485/422,而Modbus TCP一般采用以太网口。现在市场上有很多...
  • 转载粘贴其他人的分析:
  • MODBUS协议整理——汇总

    万次阅读 多人点赞 2016-10-01 21:32:13
    Modbus是一种串行通信协议,是Modicon于1979年,为使用可编程逻辑控制器(PLC)而发表的。MODBUS是工业领域通信协议的业界标准,并且现在是工业电子设备之间相当常用的连接方式。Modbus比其他通信协议使用的更广泛的...
  • MODBUS协议是一种软件协议,而RS232,RS485是一种电平标准,关系是在一种电平关系下应用一种MODBUS协议MODBUS协议是一种人为约定的协议,他和SPI,IIC,CAN总线协议还是有些不同的,SPI,IIC,CAN总线这些协议必须...
  • Modbus Tcp协议详解

    万次阅读 2017-08-02 17:36:01
    /1、Modbus rtu和Modbus tcp两个协议的本质都是MODBUS协议,都是靠MODBUS寄存器地址来交换数据; /2、但所用的硬件接口不一样,Modbus RTU一般采用串口RS232C或RS485/422,而Modbus TCP一般采用以太网口。 /3、现在...
  • Modbus TCP协议解析

    千次阅读 2019-07-07 17:13:54
    在之前的文章中,我们介绍了Modbus RTU协议的内容和...文章目录一、Modbus TCP协议解析Modbus TCP和Modbus RTU的区别Modbus TCP协议的构成Modbus TCP的报文头Modbus TCP的功能码Modbus TCP的数据码二、持续更新:Mo...
  • freemodbus modbus TCP 学习笔记

    万次阅读 多人点赞 2016-10-01 22:00:30
    使用modbus有些时间了,期间使用过modbus RTU也使用过modbus TCP,通过博文和大家分享一些MODBUS TCP的东西。在嵌入式中实现TCP就需要借助一个以太网协议栈,在这里我选择最简单的uIP协议栈。uIP协议栈简单易用方便...
  • Modbus RTU协议和TCP/UDP协议的区别

    千次阅读 2018-08-31 11:31:41
    1、Modbus协议属于应用层(OSI模型第7层)协议,TCP/UDP协议属于传输层(OSI模型第4层)协议,两者层级不是并列关系。 打个比喻,Modbus协议就像公司里的总经理,TCP/UDP协议就像公司里的轿车、商务车。某天总经理要...
  • Modbus通讯协议详解及与Modbus TCP通讯协议之间的区别

    万次阅读 多人点赞 2018-05-09 09:37:52
    由于其免费公开发行,使用该协议的厂家无需缴纳任何费用,Modbus通信协议采用的是主从通信模式(即Master/Slave通信模式),其在分散控制方面应用极其广泛,从而使得Modbus协议在全球得到了广泛的应用。Modbus通信...
  • Modbus RTU/TCP协议解析

    万次阅读 多人点赞 2017-06-26 11:51:04
    由于其免费公开发行,使用该协议的厂家无需缴纳任何费用,Modbus通信协议采用的是主从通信模式(即Master/Slave通信模式),其在分散控制方面应用极其广泛,从而使得Modbus协议在全球得到了广泛的应用。 Modbus通信...
  • Modbus通信协议(tcp/ip)简述

    千次阅读 2019-01-07 11:43:48
    Modbus协议是一种单主/多从的通信协议,其特点是在同一时间,总线上只能有一个主设备,但可以有一个或者多个(最多247个 ip地址1-247)从设备。每一个从设备一个ip地址 在请求的报文中请求的地址为0则为广播模式,...
  • modbus tcp数据报文结构详解

    万次阅读 2014-04-20 11:48:51
    modbus tcp数据报文结构 ...00 00表示协议标识符,00 00为modbus协议;00 06为数据长度,用来指示接下来数据的长度,单位字节;03为设备地址,用以标识连接在串行线或者网络上的远程服务端的地址
1 2 3 4 5 ... 20
收藏数 8,340
精华内容 3,336
关键字:

modbus 协议