收藏官网首页
查看: 4621|回复: 0

[问答] modbus协议详解

69

主题

69

帖子

1478

积分

金牌会员

Rank: 6Rank: 6

积分
1478
跳转到指定楼层
楼主
 楼主| 发表于 2022-9-29 12:02:05 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
免费使用STM32、APP自动代码生成工具
本帖最后由 康康2020 于 2022-9-29 12:08 编辑

1.Modbus简介        Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气 Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。--摘自百度百科

        Modbus是一种一主一从的一对一通信方式(主机发一帧,从机回一帧的形式),当然也一主多从,但实际也是一对一通信,同一时刻只能有一个从机进行响应。如果需要和多个从机同时通信,这里也支持使用广播,即主机发送指令,所有从机接收指令并执行,但不进行应答。可以参考国标标准(以下简称国标),GBT 19582-2。

        当进行一主多从通信时,主机通过从机ID号来区分要通信的从机设备。从机ID范围为1~247,0为广播地址,248~255为用户自定义地址。

通信形式
        目前总共有4种通信形式,RTU、ASCII、TCP、Plus。

2.报文类型及格式
2.1协议描述
Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU)。特定总线或网络上的 Modbus协议映射能够在应用数据单元(ADU)上引入一些附加域,启动Modbus事务处理的客户机创建Modbus 应用数据单元。如图1所示。Modbus-RTU方式的通讯数据帧格式如图2所示。


2.2通讯信息传输过程
当命令由主机发送至从机时,符合相应地址码的从机处理命令,根据功能码作相应任务。如果CRC校验无误,则执行相应的任务,然后把数据返送给主机。如果CRC校验出错就不返回任何信息,主机应当有相应的超时处理。如果接收正确,但不能处理,返回异常报文。对字型数据发送顺序为先高字节后低字节;对浮点数按照正常的顺序发送;信文总长度(包括地址码和CRC校验码)不超过256字节。

2.3 应用数据单元
应用数据单元(ADU)由地址码、功能码、数据区、错误校验码构成。

地址码:
地址码是通讯信息帧的第一字节,从0到255。每个从机有唯一的地址码,并且只有符合地址码的从机才能响应回送信息。0xFF为广播地址。

功能码:
功能码向服务器指示将执行哪种操作。Modbus协议建立了客户机启动的请求格式,用一个字节编码 Modbus数据单元的功能码域,当从客户机向服务器设备发送报文时,功能码域通知服务器执行哪种操作。

数据区:
数据区可以是数据(如:开关量输入/输出、模拟量输入/输出、寄存器等等)、参考地址等。均为二进制数。各种数据参考地址在综合控制装置中均从1开始,在通讯过程中则从0开始,所以读写地址N时使用的地址数据为N-1。

错误校验码(CRC校验):
由于电子噪声或一些其它干扰,信息在传输过程中有时会发生错误,CRC校验可以检验主机或从机在通讯数据传送过程中的信息是否有误,错误的数据可以放弃(无论是发送还是接收),这样增加了系统的安全和效率。
Modbus通讯协议的CRC(冗余循环码)包含2个字节,即16位二进制数。CRC码由发送设备(主机)计算,放置于发送信息帧的尾部。接收信息的设备(从机)再重新计算接收到信息的CRC,比较计算得到的CRC是否与接收到的相符,如果两者不相符,则表明出错。在进行CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。



3.主要功能码说明
(1)读取内部线圈(接点)
功能码:0x01
描述:读从机多个内部线圈数据。不支持广播命令。(地址0XXXX)
查询
查询信息指定要读取的线圈开始地址和线圈数量。线圈地址从0开始。
以读取地址为17的从机中第7~15号内部线圈的值为例:



响应
响应报文格式:


计算机发送命令:[设备地址] [功能码01] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]
设备响应:[设备地址] [功能码01] [返回的字节个数][数据1][数据2]…[数据n][CRC校验的低8位] [CRC校验的高8位]

(2)读取开关量输入
功能码:0x02
描述:读从机多个开入。不支持广播命令。(地址1XXXX,只读)
查询和响应同0x01功能码

(3)写数字量(线圈状态)
功能码:0x05
例:[11][05][00][AC][FF][00][CRC低][CRC高]
1.功能码:写数字量的命令号固定为05。
2.需下置的寄存器地址高8位,低8位:表明了需要下置的开关的地址。
3.下置的数据高8位,低8位:表明需要下置的开关量的状态。例子中为把该开关闭合。注意,此处只可以是[FF][00]表示闭合[00][00]表示断开,其他数值非法。
4.此命令一条只能下置一个开关量的状态。
计算机发送命令:[设备地址] [功能码05] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]
设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

(4)取多个保持寄存器(数据寄存器)
功能码:0x03
描述:读从机多个保持寄存器二进制数据。不支持广播命令。(地址4XXXX)
查询
查询信息指定要读取的寄存器开始地址和寄存器数量。寄存器地址从0开始。
以读取地址为17的从机中第108~第110号寄存器为例:
查询报文格式

响应
响应报文格式:

计算机发送命令:[设备地址] [功能码03] [起始寄存器地址高8位] [低8位] [读取的寄存器数高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]
设备响应:[设备地址] [功能码03] [返回的字节个数][数据1][数据2]…[数据n][CRC校验的低8位] [CRC校验的高8位]

(5)读取多个输入寄存器(模拟输入寄存器)
功能码:0x04
描述:读从机多个模拟输入寄存器二进制数据。不支持广播命令。(地址3XXXX,只读)
同0x03功能码

(6)写单个寄存器
功能码:0x06
描述:写从机单个寄存器。(地址4XXXX)
命令: 命令指定要写的寄存器地址和写入的值。地址从900开始。
以将数据1写入地址为1的从机中第900号寄存器为例:
命令报文格式:

响应
响应报文格式:与命令格式相同。
计算机发送命令:[设备地址] [功能码06] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]

(7)写多个保持寄存器
功能码:0x10
描述:写从机多个保持寄存器。(地址4XXXX)
命令: 命令指定要写的寄存器地址和写入的值。地址从900开始。
以将数据1写入地址为1的从机中第900、901号寄存器为例:
命令报文格式:

响应
响应报文格式:


计算机发送命令:[设备地址] [功能码10] [需下置的寄存器起始地址高8位] [低8位] [要写的寄存器数量的高字节] [低字节] [要写的字节数(等于寄存器数目*2)] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位]
设备响应:如果成功则响应:设备地址,功能码[0x10],寄存器起始地址高字节,低字节,要写的寄存器数量的高字节,低字节,CRC校验低字节,高字节




您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

加入Q群 返回顶部

版权与免责声明 © 2006-2024 Gizwits IoT Technology Co., Ltd. ( 粤ICP备11090211号 )

快速回复 返回顶部 返回列表