Modbus通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。因其公开发表并且无版权要求、易于部署和维护,在自控设备的通讯中应用很广泛。
协议描述
Modbus是一项应用层报文传输协议,它通过主从式的请求/应答模式提供功能码规定的服务。Modbus协议定义了一个与基础通讯层无关的简单协议数据单元(PDU),特定总线或网络上的Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域(如MODBUS TCP中的IP地址域)。
Modbus协议用一个字节编码Modbus数据单元的功能码域,以此说明操作类型。
Modbus通用帧格式:
主机向从机发送的报文数据域包括附加信息,从机使用这些信息执行功能码定义的操作。数据域包括离散项目和寄存器地址、处理项目的数量以及域中实际数据字节数。
当从机对主机响应时,它使用功能码域来指示正常响应或者出现某种差错即异常响应。
对于正常响应,从机仅对原始功能码响应;对于异常响应,服务器返回一个与原始功能码等同的码,并置该原始功能码的最高有效位为逻辑1。
简单协议数据单元(PDU)
对于串行链路通信来说,Modbus PDU最大长度=256-从机地址(1字节)-CRC(2字节)=253字节。
Modbus协议定义了三种PDU,它们是:
Modbus请求PDU,mb_req_pdu
Modbus响应PDU,mb_rsp_pdu
Modbus异常响应PDU,mb_excep_rsp_pdu
定义mb_req_pdu为:
mb_req_pdu={function_code,resquest_data}
其中function_code:[1字节] Modbus功能码。
resquest_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异常码列表。
数据编码及数据模型
Modbus以“Big-Endian”(大端对齐)表示地址和数据项。这意味着当发送多个字节时,首先发送最高的字节数据。
对于单个比特量,仍按字节进行传输。传输比特量时,第一个数据字节的LSB(最低有效位)对应第一个比特量,依次类推,一直到这个字节的MSB(最高有效位)为止,再从第二个字节开始。如果数量不是八的倍数,则用零填充数据字节中剩余的位,一直到字节的MSB。
Modbus以一系列具有不同特征的表格上的数据模型为基础。四个基本表格为:
理论上,对于基本表格中的任何一项,协议都允许单个地选择65536个数据项,而且设计这些项的读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。
很显然,必须将通过Modbus处理的所有数据放置在设备应用存储器中,但是,存储器中的物理地址不应该与数据参考混淆,要求仅仅是数据参考与物理地址的对应链接。
功能码的分类
Modbus功能码可分为三类:公共功能码、用户功能码和保留功能码。
公共功能码是较好地被定义的功能码,具有可用的一致性测试。
用户功能码定义范围为65至72和100至110,用户没有Modbus组织的任何批准就可以选择和实现一个功能码。保留功能码是一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。
公共功能码定义:
Modbus协议在串行链路上的实现
通常使用RS-485串行网络实现Modbus协议通讯,具体描述如下:
物理层:“两线”RS-485接口,应用于一主多从的点对多点系统
链路层:采用RTU传输模式或ASCII模式
在同一时刻,只有一个主节点(master)连接于总线,且通讯总是由主节点发起,子节点(slave)在没有收到来自主节点的请求时,从不会发送数据,主节点在同一时刻只会发起一个Modbus事务处理,子节点之间不能互相通讯。
Modbus主节点没有地址,只有子节点有串行总线上唯一的地址(1到247)。
主节点以单播模式或广播模式对子节点发出Modbus请求。在单播模式中,主节点以特定地址访问某个子节点,子节点接收并处理完后请求后向主节点返回应答报文。
在广播模式中,地址0专门用于表示广播数据的。
希望以上内容对大家学习此协议有帮助。
说明
什么是“大端、小端对齐”?可阅读以前推送的文章:《PLC中的大端小端》
若觉得文章有帮助,随手点在看、分享转发,也是一份支持。
扫描下面二维码、关注后,在底部菜单中可查看更多内容!
长按识别图中二维码关注