声明:文章摘自http://m.pcpop.com/article_4546662.html

 

常用功能码01和02

功能码01的作用是读取线圈状态。在数字量输出(Digital Output,DO)中,一个DO接点就能够控制一个线圈的通电和断电,所以读取线圈状态就是读取数字量输出点的状态,是1 bit的信息。例如,对于S7-200 PLC,Q0.0就是一个DO接点。对于单片机,若预置P0.0口用于DO,则P0.0就是一个DO接点,读取线圈状态就是读取P0.0端口的状态。

按Modbus协议,功能码01是读取输出点的状态,但在PLC、单片机方面可以对它有扩展性的解释。例如,在单片机程序设计时,可以把该功能码处理为读取一般意义的位,并不限于DO。

功能码02的作用是读取输入状态,也就是读取一个数字量输如(Digital Input,DI)接点的状态。例如,对于单片机,若预置P1.0口用于DI,则P1.0就是一个DI接点,读取输入状态就是读取P1.0端口的状态。同功能码01一样,功能码02在具体实现时,也可以扩展为读取一般意义的位,并不限于DI。

RTU模式下,主机发送功能码01、02命令的帧格式如下:

地址功能码读取线圈起始地址高字节读取线圈起始地址低字节读取线圈个数高字节读取线圈个数低字节CRC校验
1字节01或021字节1字节1字节1字节2字节

从机应答主机命令的帧格式如下:

地址功能码返回数据字节个数返回数据字节1返回数据字节2......返回数据字节nCRC校验
1字节01或021字节1字节1字节.......1字节2字节

下面对主机发送命令信息和从机应答信息进行实例解析。

主机发送:03 01 00 00 00 08 3C CC

命令解析:Modbus协议RTU模式的信息都以16进制数表示。03为从机地址:01为功能码01;00 00为线圈的起始地址;00 08为要读取的线圈数,共读取8个线圈;3C为CRC校验低字节,CC为CRC校验高字节。

从机应答:03 01 01 00 50 30

命令解析:03为从机地址;第一个01为功能码01;第二个01为返回数据字节个数;00为数据字节1,其最低位是起始地址线圈的状态;50为CRC校验低字节,30为CRC校验高字节。

03和04

功能码03的作用是读取保持寄存器的值。保持寄存器,就是其值不被外部输入信号改变的寄存器。例如,保存模拟量输出接点(Analog Output,AO)的数字量(即D/A转换的数字量)的寄存器,就是保持寄存器。功能码03也可以被扩展为读取控制器内部多种16位寄存器的值。

功能码04的作用是读取输入寄存器的值。输人寄存器,就是保存外部输入信号数字量的寄存器。例如,保存模拟量输入接点(Analog Iutput,AI)的数字量(即A/D转换的数字量)的寄存器,就是输入寄存器。功能码04也可以被扩展为读取控制器内部多种16位寄存器的值。

RTU模式下,主机发送功能码03、04命令的帧格式如下:

地址功能码读取线圈起始地址高字节读取线圈起始地址低字节读取线圈个数高字节读取线圈个数低字节CRC校验
1字节03或041字节1字节1字节1字节2字节

从机应答主机命令的帧格式如下:

地址功能码返回数据字节个数返回第一个寄存器数据高字节返回第一个寄存器数据低字节......CRC校验
1字节03或041字节1字节1字节.......2字节

下面对主机发送命令信息和从机应答信息进行实例解析。

主机发送:01 03 00 00 00 08 44 0C

命令解析:01为从机地址;03为功能码03;00 00为寄存器的起始地址;00 08为要读取的寄存器数,共读取8个寄存器;44为CRC校验低字节,OC为CRC校验高字节。

从机应答:01 03 10 BD AB 15 A5 8C D4 3E B8 8B CF 86 E1 5E 8F 67 83 26 1B

命令解析:01为从机地址;03为功能码03;10为返回数据字节个数,共16个(16进制的10等于16);BD AB……67 83为读得的各寄存器的数值,其中BDAB为第一个寄存器的值:26为CRC校验低字节,1B为CRC校验高字节。

05和15

功能码05的作用是强置单线圈,也就是置某一DO接点为ON或OFF。例如,若预置单片机的P2.0为一个DO,则单片机在接收到主机强置该DO为ON的命令后。应执行使P2.0输出ON的程序代码。功能码05也可以扩展到强置控制器中其他有输出功能的位。

功能码05主机发送和从机接收的信息帧格式相同:

地址功能码写入线圈起始地址高字节写入线圈起始地址低字节写入值高字节写入值低字节CRC校验
1字节051字节1字节1字节1字节2字节

写入值为FF00时为ON,写入值为0000时为OFF。

功能码15的作用是强置多个线圈。

RTU模式下,主机发送功能码15命令的帧格式如下:

地址功能码写入线圈起始地址高字节写入线圈起个数低字节写入线圈个数高字节写入线圈个数低字节写入值字节数写入值字节1......CRC校验
1字节OF1字节1字节1字节1字节1字节1字节......2字节

从机应答主机命令的帧格式如下:

地址功能码写入线圈起始地址高字节写入线圈起始地址低字节已写入线圈个数高字节写入线圈个数低字节CRC校验
1字节OF1字节1字节1字节1字节2字节

下面对主机发送命令信息和从机应答信息进行实例解析。

主机发送:01 05 00 00 FF 00 8C 3A

从机应答:01 05 00 00 FF 00 8C 3A

命令解析:01为从机地址;05为功能码;00 00为写入线圈起始地址;FF00为写入值,即ON;8C为CRC校验低字节,3A为CRC校验高字节。

 

举例:15号命令请求格式(从设备地址为1、Modbus功能码15、Modbus寄存器开始地址0、写位变量个数16,即2个字节)
01 0F 00 00 00 10 02 01 00 E3 B0
字节0为从设备ID、字节1为功能码(十六进制)、字节2-3为Modbus寄存器开始地址、字节4-5为Modbus寄存器格式、字节6为发送字节个数、字节7-8为发送数据(2个字节即16个位)、字节9-10为CRC校验

 

06和16

功能码06的作用是预置单寄存器,也就是向一个保持寄存器写入数值。寄存器为16位,数值范围是0000~FFFF。

功能码06主机发送和从机接收的信息帧格式相同:

地址功能码写入寄存器地址高字节写入寄存器地址低字节写入值高字节写入值低字节CRC校验
1字节061字节1字节1字节1字节2字节

功能码16的作用是预置多寄存器。

RTU模式下,主机发送功能码16命令的帧格式如下:

地址功能码写入寄存器起始地址高字节写入寄存器起始地址低字节写入寄存器个数高字节写入寄存器个数低字节写入值字节数写入值字节1......CRC校验
1字节101字节1字节1字节1字节1字节1字节......2字节

从机应答主机命令的帧格式如下:

地址功能码写入寄存器起始地址高字节写入寄存器起始地址低字节已 写入寄存器个数高字节已写入寄存器个数低字节CRC校验
1字节101字节1字节1字节1字节2字节

下面对主机发送命令信息和从机应答信息进行实例解析。

主机发送:01 06 00 00 00 7D 49 EB

从机应答:01 06 00 00 00 7D 49 EB

命令解析:01为从机地址;06为功能码;00 00为写入寄存器起始地址;007D为写入值,即十进制125;49为CRC校验低字节,EB为CRC校验高字节。

主机发送:01 10 00 05 00 02 04 52 2B 44 9A E0 4B

从机应答:01 10 00 05 00 02 51 C9

命令解析:01为从机地址;10为功能码16;0005为写入寄存器起始地址:0002为写入寄存器个数;04为写入值字节数;522B、449A为写入值;E0为CRC校验低字节.4B为CRC校验高字节。从机应答中,0002为已写入寄存器个数。1

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐