首页 > 技术文章 > modbus rtu协议

caiya 2020-09-23 10:46 原文

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 功能号。根据功能号做出响应,而具体的操作根据功能号在各自的函数中执行,相当于解析接收到的数据。

 

 

 

推荐阅读