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,以便将改变引入公共分类中,并且指配一个新的公共功能码。

Ⅲ 保留功能码

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

















































猜你喜欢

转载自blog.csdn.net/qq_21815001/article/details/80505109