zoukankan      html  css  js  c++  java
  • modbus rtu协议

    1、Modbus 协议简介

    Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议。通过此协议,控制器相互之间、或控制器经由网络(如以太网)可以和其它设备之间进行通信。Modbus协议使用的是主从通讯技术,即由主设备主动查询和操作从设备。一般将主控设备方所使用的协议称为Modbus Master,从设备方使用的协议称为Modbus Slave。典型的主设备包括工控机和工业控制器等;典型的从设备如PLC可编程控制器等。

    Modbus通讯物理接口可以选用串口(包括RS232、RS485和RS422),也可以选择以太网口。其通信遵循以下的过程:

    • 主设备向从设备发送请求
    • 从设备分析并处理主设备的请求,然后向主设备发送结果
    • 如果出现任何差错,从设备将返回一个异常功能码 

    此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。 

        当在Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。

    Modbus的工作方式是请求/应答,每次通讯都是主站先发送指令,可以是广播,或是向特定从站的单播;从站响应指令,并按要求应答,或者报告异常。当主站不发送请求时,从站不会自己发出数据,从站和从站之间不能直接通讯。

      Modbus协议是应用层(协议层)报文传输协议,它定义了一个与物理层无关的协议数据单元(PDU),即PDU=功能码+数据域,功能码1byte,数据域不确定。

      Modbus协议能够应用在不同类型的总线或网络。对应不同的总线或网络,Modbus协议引入一些附加域映射成应用数据单元(ADU),即ADU=附加域+PDU,例如modbus tcp/ip------ ADU=MBAP+ADU。

    2、Modbus 通讯方式 

      2.1、Modbus三种通讯方式

        Modbus有下列三种通信方式:

        (1)、以太网:对应的通信模式是Modbus TCP/IP

        (2)、异步串行传输(各种介质如有线RS-232-/422/485/;光纤、无线等):对应的通信模式是Modbus RTUModbus  ASCII

        (3)、高速令牌传递网络:对应的通信模式是Modbus PLUS

        Modbus RTU和Modbus ASCII协议应用于串口链接(RS232、RS485、RS422),Modbus tcp/ip协议应用于以太网链接。

    2.2、在Modbus网络上传输

           标准的Modbus口是使用RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。 

           控制器通信使用主/从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。

             典型的主设备:主机和可编程仪表。

             典型的从设备:可编程控制器。 

          主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。

        Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。 

          从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

    2.3、在其它类型网络上转输

          在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。 

          在消息位,Modbus协议仍提供了主/从原则,尽管网络通信方法是“对等”。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。

    2.4、查询---回应

     (1)、查询

        查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。

    (2)、回应

         如果从设备产生正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。

    MODBUS RTU 详细解释

     Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus 协议包括 RTU、ASCII、TCP。其中 MODBUS-RTU最常用,比较简单,在单片机上很容易实现。虽然 RTU 比较简单,但是看协议资料、手册说得太专业了,
    起初很多内容都很难理解。
    所谓的协议是什么?就是互相之间的约定嘛,如果不让别人知道那就是暗号。现在就来定义一个新的最简单协议。例如,
    协议: “A” --“LED 灭”
    “B” --“报警”
    “C” --“LED 亮”
    单片机接收到“A”控制一个 LED 灭,单片机接收到“B”控制报警,单片机接收到“A”控制一个 LED 亮。
    那么当收到对应的信息就执行相应的动作,这就是协议,很简单吧。

     先来简单分析一条 MODBUS-RTU 报文,例如:01 06 00 01 00 17 98 04

    01               06        00 01       00 17               98 04
    从机地址 功能号 数据地址      数据             CRC 校验

     这一串数据的意思是:把数据 0x0017(十进制 23) 写入 1 号从机地址 0x0001 数据地址。
    先弄明白下面的东西。

    1、报文
    一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。

    2、CRC 校验
    意义:例如上面的 98 04 是它前面的数据(01 06 00 01 00 17)通过一算法(见附录 2,很简单的)计算出来的结果,其实就像是计算累加和那样。(累加和:就是 010600010017 加起来的值,然后它的算法就是加法)。
    作用:在数据传输过程中可能数据会发生错误,CRC 检验检测接收的数据是否正确。比如主机发出 01 06 00 01 00 17 98 04,那么从机接收到后要根据 01 06 00 01 00 17 再计算 CRC 校验值,从机判断自己计算出来的 CRC 校验是否与接收的 CRC 校验(98 04 主机计算的)相等,如果不相等那么说明数据传输有错误这些数据不能要。

    3、功能号
    意义:modbus 定义。 作用:指示具体的操作。
    最常用功能码:
    下面“线圈”“寄存器”其实分别直的就是“位变量”“16 位变量”
    01 (0x01) 读线圈
    02 (0x02) 读离散量输入
    03 (0x03) 读保持寄存器
    04(0x04) 读输入寄存器
    05 (0x05) 写单个线圈
    06 (0x06) 写单个寄存器
    15 (0x0F) 写多个线圈
    16 (0x10) 写多个寄存器
    ODBUS-RTU
    一、一个报文分析
    先声明下我们的目的,我们是要两个设备通讯,用的是 MODBUS 协议。上面简单介绍了:“报文”“CRC 校验”“功能号”。
    在单片机中拿出一部分内存(RAM)进行两个设备通讯,例如:

     数组后面的注释,说明
    OX[20] 代表是输出线圈,用功能码 0x010x050x0F 访问, 开头地址是 0 (这个后续说明)
    IX[20] 代表是输入线圈,用功能码 0x02 访问, 开头地址是 1 (这个后续说明)
    另外两个一样的道理。
    注意:所谓的“线圈”“寄存器”就是“位变量”“16 位变量”,不要被迷惑。之所以称“线圈”我觉得
    应该是对于应用的设备,MODBUS 协议是专门针对 485 总线设备(例 PLC)开发的。

    1、主机对从机写数据操作
    如果单片机接收到一个报文那么就对报文进行解析执行相应的处理,如上面报文:
    01              06       00 01      00 17       98 04
    从机地址 功能号 数据地址      数据     CRC 校验

    假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算 CRC 校验判断数据是否正确,如果判断数
    据无误,则结果是:

    HoldDataReg[1] = 0x0017;
    MODBUS 主机就完成了一次对从机数据的写操作,实现了通讯。

    2、主机对从机读数据操作
    主机进行读 HoldDataReg[1] 操作,则报文是:
    01              03       00 01        00 01        D5 CA
    从机地址 功能号 数据地址 读取数据个数 CRC 校验

    那么单片机接收到这串数据根据数据计算 CRC 校验判断数据是否正确,如果判断数据无误,则结果是:
    返回信息给主机,返回的信息也是有格式的:
    返回内容

    01               03          02               00 17          F8 4A
    从机地址 功能号 数据字节个数 两个字节数据 CRC 校验

    MODBUS 主机就完成了一次对从机数据的读操作,实现了通讯。

     

     二、MODBUS 报文模型

    以上了解到了 MODBUS 的一帧报文是如何通讯的,其实每个报文的格式都基本一样的。

     这里两个缩略词以前不知道,但是现在要明白指的是什么,“ADU”“PDU
    ADU: 应用数据单元
    PDU: 协议数据单元

     三、MODBUS 数据模型
    四、MODBUS 事务处理
    下列状态图描述了在服务器侧 MODBUS 事务处理的一般处理过程。

     五、MODBUS 请求与响应
    MODBUS 协议手册,中文第 10 页开始,英文第 24 页开始。手册非常详细举例说明了 MODBUS协议各个功能号的请求与响应。

    modbus 协议在单片机上实现过程
    MODBUS 任务处理函数

     函数中,RcvBuf 为串口接收缓冲区,如果接收了一个报文则,RcvBuf[0] 为从机地址,RcvBuf[0] MODBUS 功能号。根据功能号做出响应,而具体的操作根据功能号在各自的函数中执行,相当于解析接收到的数据。

     
  • 相关阅读:
    蓝桥杯_基础_杨辉三角
    蓝桥杯_基础_数组特征
    蓝桥杯_基础_美丽的图形
    脉象
    词根汇总
    蓝桥杯 入门训练 Fibonacci数列 解析
    制作tomcat重启.bat文件
    day23(023-递归练习)
    day27(027-反射&JDK新特性)
    day25(025-多线程(下)&GUI)
  • 原文地址:https://www.cnblogs.com/caiya/p/13716847.html
Copyright © 2011-2022 走看看