Modbus协议、事务处理、常用功能码、异常码的简明概述

码文不易,如有转载请表明本文链接:https://blog.csdn.net/weixin_46304253/article/details/107960184

文章有错误也可以联系本人

Modbus协议

Modbus 是OSI 模型第七层应用层上的报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。

  • Modbus 按照国家标准《基于 Modbus 协议的工业自动化网络规范》分为三个部分: 第1部分: Modbus 应用协议(GB/T 19582.1-2008)Modbus是一个请求/应答协议,这部分描述了 Modbus 事物处理框架内使用的功能码。
  • 第2部分: Modbus 协议在串行链路上的实现指南(GB/T 19582.2-2008) 这部分描述了串行链路上的 Modbus 协议。
  • 第3部分: Modbus 协议在 TCP/IP 上的实现指南(GB/T 19582.3-2008) 这部分描述了 TCP/IP上
    的Modbus 协议。

在这里插入图片描述

事务处理

  • 请求:向服务机发出事务请求(功能码+数据请求)。
  • 正常响应:操作码+数据响应(操作码=请求功能码)。
  • 异常响应:差错码+异常码(差错码=请求功能码+0x80;异常码用于指示差错原因)。
    在这里插入图片描述

功能码

  • 1-64:公共功能码。
  • 65-72:用户定义功能码。
  • 73-99:公共功能码。
  • 100-110:用户定义功能码。
  • 111-127:公共功能码。
  • 127-255:异常响应保留码。
功能码 对应功能 寄存器地址 位/字操作 操作数量
01(0x01) 读线圈状态 00001-09999 位操作 单个或多个
02(0x02) 读离散量输入 10001-19999 位操作 单个或多个
03(0x03) 读保持寄存器 40001-49999 字操作 单个或多个
04(0x04) 读输入寄存器 30001-39999 字操作 单个或多个
05(0x05) 写单个线圈 00001-09999 位操作 单个
06(0x06) 写单个保持寄存器 40001-49999 字操作 单个
15(0x0F) 写多个线圈 00001-09999 位操作 多个
16(0x10) 写多个保持寄存器 40001-49999 字操作 多个

功能码具体操作:

(1)01(0x01) 读线圈:

  • 请求PDU(01 00 13 00 13):
功能码 1个字节 0x01
起始地址 2个字节 0x0000-0xFFFF
线圈数量 2个字节 0x0001-0x07D0
  • 响应PDU(01 03 CD 6B 05):
功能码 1个字节 0x01
字节数 1个字节 N=线圈数量/8,余数不为0则加1
线圈状态 N个字节
  • 异常响应(81 01):
功能码 1个字节 0x81
异常码 1个字节 01,02,03,04

(2)02(0x02) 读离散量输入:

  • 请求PDU(02 00 C4 00 16):
功能码 1个字节 0x02
起始地址 2个字节 0x0000-0xFFFF
输入数量 2个字节 0x0001-0x07D0
  • 响应PDU(02 03 AC DB 35):
功能码 1个字节 0x02
字节数 1个字节 N=线圈数量/8,余数不为0则加1
输入状态 N个字节
  • 异常响应(82 01):
功能码 1个字节 0x82
异常码 1个字节 01,02,03,04

(3)03(0x03) 读保持寄存器:

  • 请求PDU(03 00 6B 00 03):
功能码 1个字节 0x03
起始地址 2个字节 0x0000-0xFFFF
寄存器数量 2个字节 0x0001-0x07D0
  • 响应PDU(03 06 02 2B 00 00 00 64):
功能码 1个字节 0x03
字节数 1个字节 N=寄存器数量*2
寄存器值 N个字节
  • 异常响应(83 01):
功能码 1个字节 0x83
异常码 1个字节 01,02,03,04

(4)04(0x04) 读输入寄存器:

  • 请求PDU(04 00 08 00 01):
功能码 1个字节 0x04
起始地址 2个字节 0x0000-0xFFFF
寄存器数量 2个字节 0x0001-0x07D0
  • 响应PDU(04 02 00 0A):
功能码 1个字节 0x04
字节数 1个字节 N=寄存器数量*2
寄存器值 N个字节
  • 异常响应(84 01):
功能码 1个字节 0x84
异常码 1个字节 01,02,03,04

(5)05(0x05) 写单个线圈:

  • 请求PDU(05 00 AC FF 00):
功能码 1个字节 0x05
输出地址 2个字节 0x0000-0xFFFF
输出值 2个字节 0x0000或者0xFF00
  • 响应PDU(05 00 AC FF 00):
功能码 1个字节 0x05
输出地址 2个字节 0x0000-0xFFFF
输出值 2个字节 0x0000或者0xFF00
  • 异常响应(85 01):
功能码 1个字节 0x85
异常码 1个字节 01,02,03,04

(6)06(0x06) 写单个线圈:

  • 请求PDU(06 00 01 00 03):
功能码 1个字节 0x06
寄存器地址 2个字节 0x0000-0xFFFF
寄存器值 2个字节 0x0000-0xFFFF
  • 响应PDU(06 00 01 00 03):
功能码 1个字节 0x06
输出地址 2个字节 0x0000-0xFFFF
输出值 2个字节 0x0000-0xFFFF
  • 异常响应(86 01):
功能码 1个字节 0x86
异常码 1个字节 01,02,03,04

(7)15(0x0F) 写多个线圈:

  • 请求PDU(0F 00 13 00 0A 02 CD 01):
功能码 1个字节 0x0F
起始地址 2个字节 0x0000-0xFFFF
输出数量 2个字节 0x0001-0x07B0
字节数 1个字节 N=线圈数量/8,余数不为0则加1
输出值 N个字节
  • 响应PDU(0F 00 13 00 0A):
功能码 1个字节 0x0F
输出地址 2个字节 0x0000-0xFFFF
输出值 2个字节 0x0001-0x07B0
  • 异常响应(8F 01):
功能码 1个字节 0x8F
异常码 1个字节 01,02,03,04

(8)16(0x10) 写多个寄存器:

  • 请求PDU(10 00 01 00 02 04 00 0A 01 02):
功能码 1个字节 0x10
起始地址 2个字节 0x0000-0xFFFF
寄存器数量 2个字节 0x0001-0x007B
字节数 1个字节 N=寄存器数量*2
寄存器值 N个字节
  • 响应PDU(10 00 01 00 02):
功能码 1个字节 0x0F
输出地址 2个字节 0x0000-0xFFFF
寄存器数量 2个字节 0x0001-0x007B
  • 异常响应(90 01):
功能码 1个字节 0x90
异常码 1个字节 01,02,03,04

异常码

代码 名称 含义
0x01 非法功能 接受到的功能码是不允许的操作
0x02 非法数据地址 接受到的数据地址是不允许的地址
0x03 非法数据值 接受到的数据值是不允许的值
0x04 从站设备故障 执行请求的操作时,产生不可重新获得的差错
0x05 确认 从站已经接受请求并且正在处理,但是需要较长的处理时间,返回这个响应防止主站发生超时错误
0x06 从站设备忙 从站正在处理长持续时间的请求
0x08 存储奇偶性差错 读取记录文件时发现奇偶校验错误
0x0A 不可用网关路径 网关不能为处理请求分配输入端口至输出端口的内部通信路径,通常意味着网关配置错误或过载
0x0B 网关目标设备响应失败 没有从目标设备中获取响应,通常意味着设备未在网络中

码文不易,如有转载请表明本文链接:https://blog.csdn.net/weixin_46304253/article/details/107960184

文章有错误也可以联系本人

猜你喜欢

转载自blog.csdn.net/weixin_46304253/article/details/107960184