产品描述
西门子长沙PLC模块总代理
Modbus功能码详解
Modbus功能码是Modbus消息帧(报文)的重要组成部分,是Modubs协议中通信事务处理的基础,代表消息将要执行的动作。
功能码概要
简而言之,Modbus功能码占用一个字节,取值范围是1127,之所以127以上不能使用,是因为Modbus规定出现异常时,功能码+0x80(十进制128)代替异常状态,因此129(1+128)255(127+128)的取值代表异常码。
Modbus标准协议中规定了由3类Modbus功能码,分别是:
公共功能码
被明确定义的功能码
保证一性
由Modbus协会确认,并提供公开的文档;
可进行一致性测试
包括协议定义的功能码和保留将来使用的功能码
用户自定义功能码
有两个用户自定义功能码区域,分别是6572和100110;
用户自定义,不保证一性。
保留功能码
保留功能码是因为历史遗留原因,某些公司的传统产品上现行使用的功能码不作为公共使用。
Modbus部分功能码如下:
代码 | 名称 | 寄存器PLC地址 | 位/字操作 | 操作数量 |
---|---|---|---|---|
01 | 读线圈状态 | 00001~09999 | 位操作 | 单个或多个 |
02 | 读离散输入状态 | 10001~19999 | 位操作 | 单个或多个 |
03 | 读保持寄存器 | 40001~49999 | 字操作 | 单个或多个 |
04 | 读输入寄存器 | 30001~39999 | 字操作 | 单个或多个 |
05 | 写单个线圈 | 00001~09999 | 位操作 | 单个 |
06 | 写单个保持寄存器 | 40001~49999 | 字操作 | 单个 |
15 | 写多个线圈 | 00001~09999 | 位操作 | 多个 |
16 | 写多个保持寄存器 | 40001~49999 | 字操作 | 多个 |
功能码可分为位操作和字操作两类。位操作的较小单位为一位(bit),字操作的较小单位为两个字节。
位操作指令:读线圈状态功能码01,读(离散)输入状态功能码02,写单个线圈功能码06和写多个线圈功能码15.
字操作指令:读保持寄存器功能码03,读输入寄存器功能码04,写单个保持寄存器功能码06,写多个保持寄存器功能码16.
01(0x01)读取线圈/离散量输出状态
功能说明读取从设备的线圈或离散量输出的状态,即各DO的ON/OFF状态。消息帧中*了需读取的线圈起始地址和线圈数目。需要注意的一点是,在Modbus协议规定的PDU中,规定所有线圈或寄存器地址从0开始计算。
查询报文查询帧的消息里,定义了从设备地址为3,并读取从设备的Modbus地址0001900055(线圈地址0002000056)共计37个状态值。起始线圈地址为0x13(即十进制00019),因为线圈地址从0开始计数。
Modbus协议规定,起始地址由2个字节构成,取值范围为0x00000xFFFF;线圈数量由2个字节构成,取值范围为0x00010x07D0(即十进制1~2000).
ASCII模式中直接按每4个位拆分为对应的字符表示。
响应报文响应报文的数据字段中,每一个线圈占用1个位(bit),状态被表示为1=ON和0=OFF两种类型。*1个数据字节的LSB(较低有效位)标识查询报文中的起始地址线圈的状态值,其他线圈依次类推,一直到这个字节的MSB(较高有效位)位置,并在后续字节中按照同样的方式(由低到高)排列。
一个字节可以表示8个线圈的状态,如果最后的数据字节中不能填满8个线圈的状态,则由0填充。对应于查询报文中需要读取37个线圈的状态,则共需要5个字节保存状态值。
02(0x02)读取离散量输入值
功能说明该功能码用于读取从设备的离散输入即DI的ON/OFF状态。消息帧中制定了需读取的离散输入寄存器起始地址和数目,可读取1~2000个连续的离散量输入状态。如果从设备接受主设备的请求则回复功能码02,并返回离散量输入各离散量的当前状态。如果返回的离散输入数量的个数不是8的整数倍,将用0填充最后数据字节的剩余位。
03(0x03)读取保持寄存器值
功能说明用于读取从设备保持寄存器的内容,不支持广播模式。消息帧中*了需读取的保持寄存器的起始地址和数目。而保持寄存器中各地址的具体内容和意义,则由设备开发者自行规定。
查询报文在查询报文中,必须*保持寄存器的开始地址和需读取的寄存器数量。起始位置由2个字节构成,取值范围为0x00000xFFFF;寄存器数量由2个字节构成,取值范围为0x00010x007D(即十进制1~255),即较多可以连续读取125个寄存器。
有一点特别需要注意,Modbus的保持寄存器和输入寄存器是以字(Word)为基本单位的(1Word=2byte),所以,如果读取保持寄存器地址为40001开始的一个16位(bit)的无符号数,那么返回2个字节(byte),并可以从40002开始读取下一个16位的无符号数。如果需读取寄存器地址40001开始的是一个32位浮点数,则需要返回4个字节,即必须连续读取40001和40002的内容,而且下一个32位浮点数必须从40003开始读取。对于浮点数(或者32位的整数)而言,连续读取的两个寄存器之间存在字节序和大小端的问题,这一点在开发时必须引起注意。
04(0x04)读取输入寄存器值
功能说明同功能码03类似,该功能码用于读取从设备输入寄存器的内容,不支持广播模式。消息帧中*了需读取的输入寄存器的起始地址和数目。而输入寄存器中各地址的具体内容和意义,则由设备开发者自行规定。
查询报文在查询报文中,必须*输入寄存器的起始地址和需读取的寄存器数量。
本功能码中,起始地址由2个字节构成,取值范围为0x00000xFFFF;寄存器数量由2个字节构成,取值范围为0x00010x007D(即十进制1~125),即较多可以连续读取125个寄存器。
同样有一点需要注意,Modbus的保持寄存器和输入寄存器是以字为基本单位的。所以对于浮点数(或32为的整数)而言,连续读取的两个寄存器之间存在字节序和大小端的问题。
05(0x05)写单个线圈或单个离散输出
功能说明用于将单个线圈寄存器(或离散输入)设置为ON或OFF,该功能码支持广播模式,在广播模式下,所有从站设备的同一地址的值将被统一修改,查询报文中的ON或OFF状态由报文数据字段的常熟*,0xFF00表示ON状态,0x0000表示OFF状态。其他所有值均是非法的,并且对寄存器不起作用,将会返回异常相应。
查询报文本功能码中,起始地址由2个字节构成,取值范围为0x0000~0xFFFF;变更目标数据由2个字节构成,取值只能为0xFF00或0x0000.
响应报文对于从设备,在线圈或离散输出寄存器正常变更的情况下,则返回于查询报文一样的响应报文。如果修改失败,则返回一个异常响应。
06(0x06)写单个保持寄存器
用于更新从设备的单个保存寄存器的值。该功能吗支持广播模式,在广播模式下,所有设备的同一地址的值将被统一修改。
查询报文查询报文中需要*从设备地址以及需要变更的保持寄存器地址和设定的值。同样需要注意的是,查询报文中,寄存器地址从地址0开始技术。
本功能码中,起始地址由2个字符构成,取值范围为0x00000xFFFF;变更目标数据由2个字节构成,取值范围为0x00000xFFFF。
响应报文对于从设备,在保持寄存器正常变更的情况下,则返回于查询报文一样的响应报文。如果修改失败,则返回一个异常返回。
08(0x08)诊断功能
功能说明该功能码仅用于串行链路,主要用于检测主设备和从设备之间的通信故障,或检测从设备的各种内部故障,该功能码不支持广播。为了区别各诊断类型,查询报文中提供了2各字节的子功能码字段。
通常在正常的响应报文中,从设备将回复功能码和子功能码。
查询报文查询报文中需要*从设备地址、功能码以及子功能码。
例如,表4-15中表示了子功能码“原样返回查询数据”的诊断功能,其中子功能码为0(0x0000)。在子功能码0x0000的情况下,数据字段可以为任意值。
本功能码中,子功能码由2个字节构成,取值则根据意义不同;数据字段由2个字节构成,其取值由子功能码确定。
响应报文对于从设备,在保持寄存器正常变更的情况下,则返回与查询报文一样的响应报文。如果修改失败,则返回一个异常响应。
产品推荐