Modbus背景
Modbus 是一种串行通信协议,最初由Modicon(现为施耐德电气)于 1979 年出版,用于其可编程逻辑控制器( PLC )。 Modbus 已成为约定俗成的标准通信协议,现在已成为连接工业电子设备的常用方法。 在工业环境中使用 Modbus 的主要原因是:
在考虑工业应用的情况下开发,
公开发布,免版税,
易于部署和维护,
允许供应商无限制移动原始位或字。
Modbus 支持连接到同一网络的许多设备之间的通信,例如,测量温度和湿度的系统,并将结果传送给计算机。 Modbus 通常用于将监控计算机与远程终端单元( RTU )连接在监控和数据采集( SCADA )系统中。 许多数据类型都是从其在驱动继电器中的使用命名的:单比特物理输出称为线圈,单比特物理输入称为离散输入或接触。
自2004 年 4 月施耐德电气将权利转让给该组织以来,Modbus 协议的开发和更新已由 Modbus 组织管理。 Modbus 组织是 Modbus 兼容设备的用户和供应商协会,主张继续使用该技术。
缩略语
通讯和设备
使用Modbus 进行通信的每个设备都有一个唯一的地址。在串行和 MB + 网络中,只有指定为主节点的节点才能发起命令。在以太网上,任何设备都可以发送 Modbus 命令,尽管通常只有一个主设备会这样做。 Modbus 命令包含设备的 Modbus 地址(1到247)。只有预期的设备才会对该命令起作用,即使其他设备可能会收到它(例外情况是发送到节点 0 的特定可广播命令,它们被作用但未被确认)。所有 Modbus 命令都包含校验和信息,以允许接收方检测传输错误。基本 Modbus 命令可以指示 RTU 更改其中一个寄存器中的值,控制或读取 I / O 端口,并命令设备发回其寄存器中包含的一个或多个值。
有许多调制解调器和网关支持Modbus ,因为它是一个非常简单且经常被复制的协议。其中一些是专门为此协议设计的。不同的实现使用有线,无线通信,例如在 ISM 频带中,甚至是短消息服务( SMS )或通用分组无线服务( GPRS )。无线网络的一种常见设计利用网状网络。设计人员必须克服的典型问题包括高延迟和时序问题。
协议描述
Modbus是一个请求/应答协议,并且提供功能码规定的服务。Modbus功能码是Modbus请求/应答PDU 的元素。
Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU),特定总线或网络上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域。
启动Modbus事务处理的客户机(主)创建Modbus应用数据单元,功能码向服务器(从)指示将执行哪种操作,Modbus协议建立了客户机启动的请求格式。
用一个字节编码Modbus数据单元的功能码域,有效的码字范围是十进制1-255(128-255为异常响应保留),当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。
向一些功能码加入子功能码来定义多项操作, 从客户机向服务器设备发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散量和寄存器地址、处理的项目数量以及域中的实际数据字节数。
在某种请求中,数据域可以是不存在的(0长度),在此情况下服务器不需要任何附加信息,功能码仅说明操作果在一个正确接收的Modbus ADU中,不出现与请求Modbus功能有关的差错,那么服务器至客户机的响应数据域包括所请求的数据。如果出现与所请求Modbus功能有关的差错,那么该域包括一个异常码,服务器应用能够使用这个域确定下一个执行的操作。
三种PDU
Modbus最初在串行链路上的实现(最大RS485 ADU=256字节)限制了Modbus PDU的长度,因此对串行链路通信来说,Modbus PDU=256-服务器地址(1字节)-CRC(2字节)=253字节,从而,RS232/RS485 ADU=253字节+服务器地址+CRC=256字节。
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异常码
数据编码
按照最高位字节(包含最高位,即MSB,的 字节)至最低位字节(包含最低位,即LSB,的字节)的顺序,存放在连续的地址中。如:
Modbus数据模型
Modbus的数据模型是以一组具有不同特征的表为基础建立的:
输入与输出之间以及位寻址和字寻址的数据项之间的区别并不意味着应用特性的差别,如果所有4个表相互覆盖是对该目标机器最自然的解释,也是完全可接受的,而且很普遍。
对于每个基本表,协议都允许单个的选择65536个数据项,而且其读写操作被设计为可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。
很显然,必须将Modbus处理的所有数据(位,寄存器)放置在设备应用存储器中,但是存储器的物理地址不应该与寄存器编号混淆,仅要求将寄存器编号与物理地址链接。
Modbus功能码中使用的Modbus寄存器逻辑编号是以0开始的无符号整数索引。
举例:
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响应,响应功能码=请求功能码
一个异常的Modbus响应
a)用来为客户机提供处理过程中与所发现的差错相关的信息
b)异常功能码=请求功能码+0x80
c)提供一个异常码来指示差错原因
帧格式
Modbus帧由应用数据单元(ADU)组成,它包含协议数据单元(PDU):9
ADU =地址+ PDU +错误检查,
PDU =功能代码+数据。
Modbus RTU 帧格式(主要用于 EIA-485 等 8 位异步线路)
Modbus ASCII 帧格式(主要用于 7 位或 8 位异步串行线)
Modbus TCP帧格式(主要用于以太网)
RTU报文实例:
ASCII报文实例
功能码分类
公共功能码
a)被确切定义的功能码
b)保证是唯一的
c)由Modbus.org确认的
d)公开的文档
e)可进行一致性测试
f)在MB ITEF RDC中归档
g)包含已被定义的公共功能码和保留给未来使用的功能码
用户自定义功能码
a)有两个用户定义功能码的区域,即十进制的65-72和100-110
b)用户无需Modbus组织的任何批准就可以选择和实现一个功能码
c)不能保证被选功能码的使用是唯一的
d)如果用户希望将某种功能设置为一个公共功能码,那么用户必须启动RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码
保留功能码
a)某些公司在传统产品上现行使用的功能码,不作为公共使用
功能码描述(部分)
读线圈(0x01)
使用该功能码从一个远程设备中读1-2000个连续的线圈状态,请求PDU指定了起始地址,即指定了第一个线圈地址和线圈数目,地址从0开始。
响应报文中的线圈按数据域的每位一个线圈进行打包,状态被表示为1=ON和0=OFF,第一个数据的LSB包含询问中所寻址的输出,其他线圈以此类推,直到这个字节的高位端为止,并在后续字节中按照从低位到高位的顺序排列。
如果返回的输出数量不是8的倍数,将用0填充最后数据字节中的剩余位,字节数量域说明了数据的全部字节数。
读离散量输入(0x02)
使用该功能码从一个远程设备中读1-2000个连续的离散量输入状态,请求PDU指定了起始地址,即指定了第一个离散量输入地址和离散量输入数目,在PDU中从0开始寻址离散量输入,因此编号1-16的离散量输入寻址为0-15。
响应报文中的离散量输入按数据域的每位一个离散量输入进行打包,状态表示成1=ON和0=OFF,第一个数据字节的LSB包含询问中所寻址的输入,其他离散量输入以此类推,直到这个字节的高位端为止,并在后续的字节中按照从低位到高位的顺序排列。
如果返回的输入数量不是8的倍数,将用0填充最后数据字节中的剩余位,字节数量域说明了数据的全部字节数。