Modbus协议解析(2)——协议总括

1.协议描述

通用Modbus消息帧可以分为两部分:

①Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU);

②特定总线或网络,如串行链路、TCP/IP网络,引入了一些附加字段。

这两部分共同组成了应用数据单元(ADU),即Modbus消息帧。

通用Modbus帧

 

Modbus的ADU由启动Modbus事务处理的客户机(主设备)创建,Modbus应用协议规定了客户机启动的请求PDU内容定义:

①功能码字段:向服务器指示将执行哪种操作。用一个字节编码Modbus数据单元的功能码,有效的范围是1~255,其中128~255保留用于异常响应,“0”为无效码。另外,可以向一些功能码加入子功能码来定义多项操作。

②数据字段:包含功能码的附加信息,服务器(从设备)使用附加信息执行功能码定义的操作。这个字段还包括离散量和寄存器地址、处理的项目数量、字段中的实际数据字节数。特殊情况下,数据字段可以不存在。

对于服务器响应的PDU内容定义:

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

②功能码字段:服务器响应时,使用功能码字段指示正常或异常状态。若正常响应,则功能码仅复制原始功能码;若异常响应,服务器将原始功能码的最高有效位置1。

另外,Modbus中还有超时管理,以避免无限期等待。

PDU的具体实现:

Modbus最初在串行链路上运行,由于RS485的最大ADU为256字节,所以

PDU的最大字节数=256-1字节(服务器地址)-2字节(CRC)=253字节

TCP上运行的Modbus,ADU的字节数为(253+7(MBAP字节数))=260字节。

Modbus协议定义了三种PDU:

①请求PDU——mb_req_pdu

mb_req_pdu={function_code,request_data},其中:

  1. function_code=[1字节],功能码;
  2. request_data=[n字节],数据字段,与功能码相关,包括变量引用、变量技术、数据偏移量、子功能码等信息。

②响应PDU——mb_rsp_pdu

mb_rsp_pdu={function_code,response_data},其中:

  1. function_code=[1字节],原始的请求功能码;
  2. request_data=[n字节],数据字段,响应客户机请求的数据量。

③异常响应PDU——mb_excep_rsp_pdu

 mb_excep_rsp_pdu={exception-function_code, exception_code},其中:

  1. exception-function_code=[1字节],原始功能码+0x80;
  2. exception_code=[1字节],异常码,在“Modbus异常码”表中定义。

2.Modbus数据模型

Modbus将工业控制用的各种信号、数据,根据其特点,抽象成四大类模型:

①离散输入量——I/O设备输入的高、低电平,占一个位,只能读;

②线圈——设备输出量,控制线圈开通、关断,占一个位,可读写;

③输入寄存器——设备输入的采样信号、指令信号等,模拟性质的输入量,占16位,只读;

④保持寄存器——设备应用程序产生的中间变量(数字量),占16位,可读写。

组织成表格形式:

主要模型

对象类型(大小)

访问类型

说明

离散输入量

单个位

只读

I/O系统可提供该类型数据

线圈

单个位

读写

设备应用程序可改变该类型数据

输入寄存器

16位字

只读

I/O系统可提供该类型数据

保持寄存器

16位字

读写

设备应用程序可改变该类型数据

四种模型中的输入或输出特性、位寻址或字寻址数据项,并不对应任何特定的应用操作。每个数据模型,协议允许选择65536个数据项,可读写多个连续数据项,最多可读写功能码限制的数据大小。

所有Modbus处理的数据(位、寄存器)都存储在从设备内存中。数据在内存中的物理地址不要和数据读取时的引用编号混淆。我们只需将数据引用与物理地址对应起来即可。Modbus功能中使用的数据逻辑引用编号是从零开始的无符号整数。

Modbus模型实例:

例1:有4个独立数据块的设备

下图表示了含有数字量和模拟量、输入量和输出量的设备的数据组织结构。不同数据块内的数据不相关,所以各块之间是分隔独立的,不同的Modbus功能可以访问相应的块。

含有独立块的Modbus数据模型

注意,每一次Modbus访问,只能请求一种功能码,执行一种功能操作。对于这4个独立块,至少需要4次Modbus访问。

         例2:只有一个块的设备

         同一个数据,无论是16位还是单个位,都可以由多个Modbus功能访问。

只含有1个块的Modbus数据模型

3.数据编码

Modbus对地址和数据采用大端模式表示,当发送多个字节时,首先发送高位。

寄存器大小

说明

16位

0x1234

首先发送寄存器中的高位字节:0x12,接着发送低位字节:0x34

注意,这里的寄存器指的是modbus数据模型中的寄存器,而不是设备内存中的物理寄存器。

4. Modbus寻址模型

Modbus应用协议精确定义了PDU寻址规则:

①在PDU中,每个数据从0到65536进行编址。

②由4个块组成的数据模型,每个块包含了几个编号从1到n的元素。

③数据模型一定要结合设备的应用。Modbus数据模型和设备应用之间的映射,完全与特定的设备供应商相关。

Modbus寻址模型

5.Modbus事务处理

下述状态图描述了在服务器(从设备)端,Modbus事务的一般处理过程:

Modbus事务处理的状态图

 

服务器一旦把请求处理完毕,就会利用适当的Modbus服务器事务建立一个响应。

基于事务处理结果,可以创建两种类型的响应:

  1. 正常Modbus响应:响应功能码 = 请求功能码
  2. 异常Modbus响应:向客户机提供—
  • ①在处理过程中检测到的错误的相关信息;
  • ②异常功能码 = 请求功能码 + 0x80;
  • ③指示错误原因的异常码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值