Modbus ASCII数据报文结构详解

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

Modbus ASCII数据报文结构详解缩略图
🌐 This page is not yet available in English. Showing the Chinese version. Back to Chinese page.
本文目录
  1. 1. 帧格式
  2. 2. ASCII帧的传输状态
  3. 3. ASCII帧的报文传输
  4. 4. function code
  5. 5. ASCII传输示例
  6. 6. 常用功能码操作
  7. 7. Function 01(01H)读线圈
  8. 8. Function 02(02H)read discrete inputs
  9. 9. Function 03(03H)read holding registers
  10. 10. Function 04(04H)read input registers
  11. 11. Function 05(05H)写单线圈
  12. 12. Function 06(06H)写单个保持寄存器
  13. 13. Function 15(0FH)write multiple coils
  14. 14. Function 16(10H)写多个保持寄存器
  15. 15. LRC verification

Modbus ASCII是Modbus的一种消息帧,相比RTU,ASCII的传输是按照字符传的,传输的数据量会比RTUMore,所以数据量大的时候一般使用的RTU,数据量小的时候才会用ASCII,然后ASCII协议帧里面添加了起始和结束,更换了校验算法,下面详细介绍ASCIIProtocol

帧格式

Modbus ASCII 模式下的通讯帧格式如下:

NameLength (byte)Description
Start1以冒号 : 开头,ASCII 十六进制值为 3A
Address2十六进制节点地址,字符表示
Function2十六进制功能码,字符表示
Datan x 2n 是数据字节数,它取决于功能码
LRC2LRC冗余检验码
End2CR / LF

注:address、Function、数据和 LRC 都是表示 8 位值 (0-255) 的大写十六进制可读字符对;即:在 Modbus ASCII 中,每个数据字节被分割成表示十六进制值中的两个 ASCII 字符的两个字节。

组件Description字符数ASCII表示
Start消息开始1 CHAR:
Address节点地址(十六进制表示)2 CHARS
Functionfunction code(十六进制表示)2 CHARS
Datadata(根据功能码变化,十六进制表示)n CHARS
LRC CHECK纵向冗余检验码(LRC)2 CHARS
END消息结束,回车换行2 CHARSCRLF

在 ASCII 模式下,Modbus 消息的每个部分都以特定的字符数和格式出现,如下所示:

:AA BB CC...DD EE<CRLF>
  • : – 消息的开始符号。
  • AA – 节点地址,十六进制表示。
  • BB – function code,十六进制表示。
  • CC...DD – 数据字段,根据功能码和需要传输的数据长度变化。
  • EE – LRC checksum,用于错误检测。
  • <CRLF> – 消息的结束符号,代表回车和换行(Carriage Return Line Feed)。
Modbus ASCII数据报文结构详解插图

ASCII帧的传输状态

Modbus ASCII数据报文结构详解插图1

上面状态图可以得到的信息:

1)“空闲” 态是没有发送和接收报文要处理的正常状态。

2)每次接收到 “:” 字符表示新的报文的开始。如果在一个报文的接收过程中收到该字符,则当前地报文被认为不完整并被丢弃。而一个新的接收缓冲区被重新分配。

3)检测到帧结束后,Complete LRC 计算和检验。然后,分析地址域以确定帧是否发往此设备,如果不是,则丢弃此帧。 为了减少接收处理时间,地址域可以在一接到就分析,而不需要等到整个帧结束。

ASCII帧的报文传输

由于ASCII报文帧与RTU报文帧有着很大的不同,ASCII报文帧是有起始和结束标识符的,而RTU帧没有这样的标识。所以ASCII报文帧的接收就简单方便多了,也不需要什么t3.5的帧间隔时间。

但是呢,为了保证接收的报文帧连续,还是可以约定字符间的传输时间的。一般认为,报文中的字符时间间隔可以达到一秒,如果超过了这个时间间隔,就认为发生了错误,要废弃掉这一帧报文数据,重新开始接收。

function code

ASCII 模式下最常用的功能代码与 RTU 模式下的功能代码定义相同。以下是一些基本的功能码及其描述:

访问地址映射地址DescriptionFunctionR/W
1 ~ 10000address-1Coils01/05/15R/W
10001 ~ 20000address-10001Discrete Inputs02R
30001 ~ 40000address-30001Input Registers04R
40001 ~ 50000address-40001Holding Registers03/06/16R/W

ASCII传输示例

例如,要读取地址 0x20C1 的两个寄存器,需要发送以下 ASCII 消息:

:010420C1000218<CRLF>

Request:

  • : – 消息开始 – 0x3A
  • 01 – slave address – 0x01
  • 04 – function code (Read input register) – 0x04
  • 20C1 – 要读取的寄存器地址 – 0x20C1
  • 0002 – 要读取的寄存器长度 (必须是 2) – 0x0002
  • 18 – LRC checksum
  • <CRLF> – 消息结束,回车换行 – 0x0D0A

Response:

:01040400001234B1<CRLF>

Response:

  • : – 消息开始 – 0x3A
  • 01 – slave address – 0x01
  • 04 – function code (Read input register) – 0x04
  • 04 – 读取数据长度 (4 bytes) – 0x04
  • 00001234 – 从 VAR1 读取的值 – 0x00001234
  • B1 – LRC checksum
  • <CRLF> – 消息结束,回车换行 – 0x0D0A

常用功能码操作

以下是 Modbus 的常用功能码及其请求和响应示例:

Function 01(01H)读线圈

  • Request:读取从机中线圈的 ON/OFF status。
Modbus ASCII数据报文结构详解插图2
  • Response:线圈状态响应消息被打包为数据字段的每比特表示一个线圈。
Modbus ASCII数据报文结构详解插图3

Function 02(02H)read discrete inputs

  • Request:读取从机中离散输入的 ON/OFF status。
Modbus ASCII数据报文结构详解插图4
  • Response:离散输入状态响应消息的构造与线圈状态相同。
Modbus ASCII数据报文结构详解插图5

Function 03(03H)read holding registers

  • Request:读取从机中保持寄存器的二进制内容。
Modbus ASCII数据报文结构详解插图6
  • Response:保持寄存器数据在每个寄存器中打包为两个字节。
Modbus ASCII数据报文结构详解插图7

Function 04(04H)read input registers

  • Request:读取从机中输入寄存器的二进制内容。
Modbus ASCII数据报文结构详解插图8
  • Response:读输入寄存器数据的响应消息的构造与读取保持寄存器相同。
Modbus ASCII数据报文结构详解插图9

Function 05(05H)写单线圈

  • Request:将单个线圈写入 ON 或 OFF。
Modbus ASCII数据报文结构详解插图10
  • Response:正常的响应是请求的回显。
Modbus ASCII数据报文结构详解插图11

Function 06(06H)写单个保持寄存器

  • 请求将一个值写入单个保持寄存器中。当广播时,该函数在所有附加的从机上设置相同的寄存器引用。请求消息指定要写入的寄存器引用(指定地址和数值)。
Modbus ASCII数据报文结构详解插图12
  • Response

    正常的响应是请求的回显,在写入保持寄存器内容之后返回。

Modbus ASCII数据报文结构详解插图13

Function 15(0FH)write multiple coils

  • Request:将一个线圈序列中的每个线圈写入 ON 或 OFF。
Modbus ASCII数据报文结构详解插图14
  • Response:正常响应返回从地址、功能代码、起始地址和写入的线圈数量。
Modbus ASCII数据报文结构详解插图15

Function 16(10H)写多个保持寄存器

  • Request:将值写入到一个保持寄存器序列中。
Modbus ASCII数据报文结构详解插图16
  • Response:正常响应返回从地址、功能代码、起始地址和写入的寄存器数量。
Modbus ASCII数据报文结构详解插图17

LRC verification

LRC 校验码的计算方法如下:

unsigned char ucMBLRC( unsigned char * pucFrame, unsigned short usLen )
{
    unsigned char ucLRC = 0;  /* LRC char initialized */

    while( usLen-- )
    {
        ucLRC += *pucFrame++;   /* Add buffer byte without carry */
    }

    /* Return twos complement */
    ucLRC = ( UCHAR ) ( -( ( CHAR ) ucLRC ) );
    return ucLRC;
}
技术术语(共 5 个)—— Click to Expand
Modbus ASCII使用ASCII字符传输的ModbusProtocol,以冒号开头、CR/LF结尾
function codeModbus功能码指定读/写操作类型,如01读线圈、03读保持寄存器
registerModbus 寄存器存储数据单元,分线圈/离散输入/保持/输入寄存器四类
线圈Modbus位可读写数据,地址从00001开始
保持寄存器Modbus 16位可读写数据,地址从40001开始
来源/工具信息 —— Click to Expand
来源 Modbus Chinese Network(modbus.cn) —— China leadingModbuscommunication protocol technical community Category Modbus protocol standard 字数 2583 字 · 阅读约 7 分钟 更新 2026-06-30 永久链接 https://www.modbus.cn/27886.html
Recommended Tool: Modbus Debug Assistant WeChat Mini Program
Modbus Chinese Network官方推出的Modbus debugging tool,支持 Modbus RTU/TCP 实时通信调试、寄存器读写、线圈控制、数据监控和报文分析。 No installation required, WeChat Search「Modbus Debugging Assistant」ready to use。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support

Leave a Reply

Your email address will not be published. Required fields are marked *.