工控协议之ModbusTCP报文功能码

电子说

1.2w人已加入

描述

  • 1、01X 读取一组逻辑线圈的当前状态(ON/OFF)
  • 2、0x02 读取一组开关输入的当前状态(ON/OFF)
  • 3、0x03 读取一个或多个保持寄存器的数值
  • 5、0x05 强置一个逻辑线圈的通断状态
  • ** 6、0x06 写单个保持寄存器**
  • ** 7、0x0f 强置多个逻辑线圈的通断状态**
  • 8、0x10 写多个保持寄存器
  • 9、0x2b 读取设备ID

1、01X 读取一组逻辑线圈的当前状态(ON/OFF)

请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)

响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)

发送包

TCP

byte[0] byte[1] 00 02 为消息号,随便指定,服务器返回的数据的前两个字和这个一样

byte[2] byte[3] 00 00 为modbus标识,强制为0即可

byte[4] byte[5] 00 06 值在06 之后所有字节的个数,大家也可以数一数哈

byte[6] 01 为站号、随便指定。

byte[7] 01 为功能码(这个是决定了要干什么事)

byte[8] byte[9] 00 00为起始地址,比如我们我们想读地址0的数据就为00,读1000地址为03 E8

byte[10] byte[11] 00 80为指定读取数据的长度,跟地址规则一样

回包

TCP

注:bit是一直到127的 因为图片太大无法截到

byte[0] byte[1] 消息号,我们之前写发送指令的时候,是多少,这里就是多少。

byte[2] byte[3] 同上

byte[4] byte[5] 指后面的字节数

byte[6] 站号

byte[7] 功能码

byte[8] 指示在byte[8]后面的字节数量 在byte[8]后面就是真实数据

byte[9] 到结尾都是我们读取到的数据 因为字节是8位所以是16(0-127所占了128个bit 128/8 得出16)

列子:

读5个线圈状态

发送:00 00 00 00 00 06 01 01 00 00 00 05

接收:00 00 00 00 00 04 01 01 01 1F

回到顶部

2、0x02 读取一组开关输入的当前状态(ON/OFF)

请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)

响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))

发送包

TCP

其实大家自己看与0x01是基本一样的。只是多了个Bit Count这一个

Bit Count所代表的意思就是 读取十个数据。

回包

TCP

跟0x01的回包也是一样的,可能大家伙会有些迷茫,我发包的时候是读取十个数据回包的时候Byte Count怎么会给我回复了个2呢?

细心的朋友可能也发现了、这两个单词是不一样的~一个是Bit Count 一个是Byte Count,哈哈哈哈小小的幽默 。

那这个Byte Count代表的是什么意思呢。还是字节有关。

一个字节是8位、但是10个位超过了1个字节但是不满2个字节所以占用2个字节。还有很多跟这个情况相同。

列子:

读5个输入状态

发送:00 00 00 00 00 06 01 02 00 00 00 05

接收:00 00 00 00 00 04 01 02 01 15

回到顶部

3、0x03 读取一个或多个保持寄存器的数值

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)

发包

TCP

这边Modbus/TCP我就不再展开了、都是一样的。

这个发包也很好去理解、根据Reference这一栏还有Word Count这一栏说明是起始位置是400读取6个保持寄存器数值。

一通百通、Modbus在功能报文上基本都是一致的。

回包

TCP

大家伙可能有迷茫了 怎么会是12呢 这个可怎么计算呢

我把这个Register这一栏专门的点开了,大家也都能看出来了吧。

TCP

这样就跟明了了吧,Register是占了两个位所以呢 读寄存器的个数6乘2 那不就是12了吗

列子:

读取连续三个保持寄存器的数值

发送:00 00 00 00 00 06 01 03 00 00 00 03

接收:00 00 00 00 00 09 01 03 06 03 E8 13 88 02 8A

4、0x04 读取一个或多个输入寄存器的数值

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

响应:MBAP 功能码 数据长度 寄存器数据(长度:9+寄存器数量×2)

发送

TCP

这个意思也就是 从0的位置读取10个输入寄存器的数值。

一通百通、有时候这些协议的原理我们没必要去搞明白,我们只要是知道这一块代表什么有什么用处我该如何去利用这一块这样就足够。

没必要去研究它如何工作如何交互(其实说白了 万变不离其宗 大部分的协议交互还是 挥手 握手)

看每个人的需求吧,可能有些工作是必须要吃透协议那只能硬着头皮去看了。

扯远了。

回包

TCP

这个也很好看明白了,还是跟0x03一样。没有变化。

列子:

读5个输入寄存器的数值

发送:00 00 00 00 00 06 01 04 00 00 00 05

接收:00 00 00 00 00 0D 01 04 0A 00 00 00 01 00 02 00 03 00 04

回到顶部

5、0x05 强置一个逻辑线圈的通断状态

请求:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)

响应:MBAP 功能码 输出地址H 输出地址L 输出值H 输出值L(共12字节)

发包

TCP

05 是功能码, 00 00是我们指定的地址,如果我们想写地址1000,那么就为 03 E8,后四位是规定线圈的通断状态。

那么上面发包的意思就是 在00 00这个位置 指定线圈通断状态为 断开。

举个例子:

写入地址100为通: 00 00 00 00 00 06 FF 05 00 64 FF 00

写入地址1000为断:00 00 00 00 00 06 FF 05 03 E8 00 00

回包

TCP

各位也发现了,回包和发包是一样的,因为在你写入的操作中,是不带读取数据的,所以服务器会直接复制一遍你的指令并返回。

例子:强置一个逻辑线圈的通断状态

发送:00 00 00 00 00 06 01 05 00 00 FF 00

接收:00 00 00 00 00 06 01 05 00 00 FF 00

回到顶部

6、0x06 写单个保持寄存器

请求:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)

响应:MBAP 功能码 寄存器地址H 寄存器地址L 寄存器值H 寄存器值L(共12字节)

发包

TCP

这个也不用过多的介绍了吧。在00 00位置 写入 00 00

回包

TCP

也是一样的,服务器会直接复制一遍你的指令并返回。

回到顶部

7、**0x0f **强置多个逻辑线圈的通断状态

请求:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L 字节长度 输出值H 输出值L

响应:MBAP 功能码 起始地址H 起始地址L 输出数量H 输出数量L

发送

TCP

Bit Count 10是要写的个数

** 回包**

TCP

都一样,直接说例子吧。

例子:强置一串连续逻辑线圈的通断

发送:00 00 00 00 00 0B 01 0F 00 00 00 02 04 FF 00 00 00

发送:00 00 00 00 00 06 01 0F 00 00 00 02

回到顶部

8、**0x10 **写多个保持寄存器

请求:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L 字节长度 寄存器值(13+寄存器数量×2)

响应:MBAP 功能码 起始地址H 起始地址L 寄存器数量H 寄存器数量L(共12字节)

发送

TCP

Word count为 要写的个数

Byte count 为 要写入的数目 1个word等于2个bytes

后面 00 00 每组为写入的数值

回包

TCP

也是一样的,写了十个那么就返回十。

列子:

向起始地址为0x0000,数量为0x0001的寄存器写入数据,数据长度为0x02,数据为0x000F

发送 00 01 00 00 00 09 01 10 00 00 00 01 02 00 0F

接收 00 01 00 00 00 06 01 10 00 00 00 01

回到顶部

9、0x2b 读取设备ID

发送

TCP

byte[0]byte[1] 消息号 随便指定

byte[2]byte[3] modbus的标识

byte[4]byte[5] 在此之后的长度

byte[6] 站号

byte[7] 功能码

byte[8] 功能类型 这里是读取设备ID

byte[9] 读什么 这里是读设备标识

byte[10] 设备名称.

回包

TCP

跟发包一样。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分