我们上期重点介绍了常用的几种功能码:
Modbus协议这些功能码(01,02,03,04,05,15,16等等)你都用过吗?
当然完整的可以查看Modbus官方的文档的第6章节:
我们这里针对其中几种详细的展开说明。
01(0x01) Read Coils
功能码01 (01十六进制) 读取线圈
功能:读取从机中离散线圈的开/关状态。
请求(Request)
请求消息指定要读取的起始线圈和线圈数量。
示例:从从站设备地址4读取地址10...22(线圈11到23)的13个线圈的请求:
响应(Response)
线圈状态响应消息以数据字段的每个位表示一个线圈的状态。状态表示为:1表示开(ON),0表示关(OFF)。第一个数据字节的最低位包含请求中指定地址的线圈状态。其他线圈按顺序向该字节的高字节端排列,并且在后续字节中从低字节到高字节排列。如果返回的线圈数量不是8的倍数,则最终数据字节中的剩余位将用零填充(向字节的高字节端)。字节计数字段指定了完整数据字节的数量。
以下是对请求的响应示例:
注意:LRC代表纵向冗余校验(Longitudinal Redundancy Check),是一种错误检测方法。CR LF代表回车换行,是结束字符。
状态转移图
下图是读线圈这类事务状态转移图:
关于mb_req_pdu的说明,可参考:聊聊三种不同的Modbus协议PDU(Modbus协议帧结构)
03(0x03) Read Hoding Register
功能码03 (03十六进制) 读取保持寄存器
功能:读取从机中保持寄存器的二进制内容。
请求(Request)
请求消息指定要读取的起始寄存器和寄存器数量。
示例:从从站设备1读取0...1(寄存器40001到40002)的请求:
响应(Response)
响应消息中的寄存器数据,每个寄存器由两字节组成,每个字节内的二进制内容右对齐。对于每个寄存器,第一个字节包含高字节位,第二个字节包含低字节位。
以下是对请求的响应示例:
注意:LRC代表纵向冗余校验(Longitudinal Redundancy Check),是一种错误检测方法。CR LF代表回车换行,是结束字符。
状态转移图
下图是读保持寄存器这类事务状态转移图:
05(0x05)Write Singal Coil
功能码05 (05十六进制) 写入单个线圈
功能:将单个线圈写入开(ON)或关(OFF)状态。
请求(Request)
请求消息指定要写入的线圈引用。线圈的地址从0开始,线圈1的地址为0。
请求的开/关状态由请求数据字段中的常数指定。十六进制的FF 00值请求将线圈设置为开(ON)。十六进制的00 00值请求将其设置为关(OFF)。所有其他值都是非法的,不会影响线圈。
以下是写入从站设备17中线圈173(地址172(0xAC))为开状态的请求示例:
响应(Response)
正常响应是请求的回声,在写入线圈状态后返回。以下是对请求的响应示例:
状态转移图
下图是写单个线圈这类事务状态转移图:
16(0x10)Write Multiple Registers
功能码16 (10十六进制) 写入多个寄存器
将一系列值写入到一系列保持寄存器中。
请求(Request)
请求消息指定要写入的寄存器引用。寄存器的地址从0开始,寄存器1的地址为0。
请求写入的值在请求数据字段中指定。数据按每寄存器两字节组成。
以下是写入从站设备17的40002开始的两个寄存器(4个字节),写入十六进制值00 0A和01 02的请求示例:
响应(Response)
正常响应返回从机地址、功能码、起始地址和已写入的寄存器数量。以下是对上述请求的响应示例:
状态转移图
下图是写多个寄存器这类事务状态转移图:
好了,关于最常用的几种功能码的功能介绍、请求及响应方式、还有状态转移逻辑图归纳完毕,如果还需要查看其他功能码,请看参考链接的内容。
参考链接:
--------END--------
喜欢本文请在下方分享及“点赞”和“在看”