modbus功能码定义和样例

modbus完整支持很多功能码,但是实际在应用的时候常用的也就那么几个。具体如下:

  • 0x01: 读线圈寄存器(DO)

  • 0x02: 读离散输入寄存器(DI)

  • 0x03: 读保持寄存器(AI)

  • 0x04: 读输入寄存器(AO)

  • 0x05: 写单个线圈寄存器

  • 0x06: 写单个保持寄存器

  • 0x0f: 写多个线圈寄存器

  • 0x10: 写多个保持寄存器

如上所示一共8种功能码。这其中有涉及到线圈、离散输入、保持、输入四种寄存器。下面分别解释一下:

线圈寄存器:实际上就可以类比为开关量,每个bit都对应一个信号的开关状态。所以一个byte就可以同时控制8路的信号。比如控制外部8路io的高低。 线圈寄存器支持读也支持写,写在功能码里面又分为写单个线圈寄存器和写多个线圈寄存器。对应上面的功能码也就是:0x01 0x05 0x0f

离散输入寄存器:如果线圈寄存器理解了这个自然也明白了。离散输入寄存器就相当于线圈寄存器的只读模式,他也是每个bit表示一个开关量,而他的开关量只能读取输入的开关信号,是不能够写的。比如我读取外部按键的按下还是松开。所以功能码也简单就一个读的 0x02

保持寄存器:这个寄存器的单位不再是bit而是两个byte,也就是可以存放具体的数据量的,并且是可读写的。比如我我设置时间年月日,不但可以写也可以读出来现在的时间。写也分为单个写和多个写,所以功能码有对应的三个:0x03 0x06 0x10

输入寄存器:只剩下这最后一个了,这个和保持寄存器类似,但是也是只支持读而不能写。一个寄存器也是占据两个byte的空间。类比我我通过读取输入寄存器获取现在的AD采集值。对应的功能码也就一个 0x04

对应的错误返回:
在对应功能码基础上加上0x80
1、“01”读取线圈状态发送

	0x01(01): 读线圈寄存器
		发→◇ 03 01 00 00 00 00 3D E8
		收←◆ 03 01 01 00 50 30

2、“02”读取输入状态

	0x02(02): 读离散输入寄存器
		发→◇ 03 02 00 00 00 40 78 18	
		收←◆ 03 02 08 01 00 30 00 0C C0 00 00 08 FA 
		去掉地址码(03)、功能码(02)、寄存器长度(08)、CRC(08 FA ),01 00 30 00 0C C0 00 00 转二进制	存在高低位

3、“03”保持型寄存器读取

Rx:1603-03 03 02 00 01 00 44        03(地址码) 03(功能码) 00 F0(起始地址) 00 01(输入数量) 85 DB(CRC)
Tx:1604-03 03 00 F0 00 01 85 DB

4、“05”写单个线圈寄存器

	0x05(05): 写单个线圈寄存器
		发→◇ 03 05 00 00 FF 008D D8						03(地址) 05(功能码) 00 00(寄存器地址) FF 00(写入的值) 8D D8(CRC)		
		收←◆ 03 05 00 00 FF 00 8D D8
		
		发→◇ 03 05 00 00 00 00 CC 28
		收←◆ 03 05 00 00 00 00 CC 28 

5、“06”写单个保持寄存器

Tx:1605-03 06 00 F0 00 01 49 DB        03(从站地址) 06(功能码) 00 F0(起始地址) 00 01(寄存器值) 49 DB(CRC)
Rx:1606-03 06 00 F0 00 01 49 DB

6、“15”: 写多个线圈寄存器    

	0x0f(15): 写多个线圈寄存器	
		发→◇ 03 0F 00 12 00 15 01 FF 17 09				03(地址) 0F(功能码) 00 12(起始地址) 00 15(写入线圈个数) 01(写入字节数) FF(写入值) 17 09(CRC)	
		收←◆ 03(地址) 0F(功能码) 00 12(起始地址) 00 15(写入线圈个数) 35 E3(CRC)
			出错时:功能码 0X8F		错误代码:01/02/03/04
		
		发→◇ 03 0F 00 12 00 15 01 00 57 49
		收←◆ 03 0F 00 12 00 15 35 E3 
		
		22U
		发→◇ 03 0F 00 00 00 08 01 FF 3F 0C
		收←◆ 03 0F 00 00 00 08 55 EF 
		发→◇ 03 0F 00 00 00 08 01 00 7F 4C
		收←◆ 03 0F 00 00 00 08 55 EF

7、0x10(16): 写多个保持寄存器

90.6
Tx:1378-03 10 00 00 00 02 04 42 B5 33 33 A9 6C            03(地址) 10(功能码) 00 00(起始地址) 00 02(寄存器数量 N) 04(字节数 2*N) 42 B5 33 33(寄存器值) A9 6C(CRC)
Rx:1379-03 10 00 00 00 02 40 2A        03(地址) 10(功能码) 00 00(起始地址) 00 02(寄存器数量 N) 40 2A(CRC)

0.0
Tx:1408-03 10 00 00 00 02 04 00 00 00 00 F8 17        
Rx:1409-03 10 00 00 00 02 40 2A

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值