Modbus ASCIIdatamessage结构详解

freefree技术Resources

这篇内容可直接阅读,适合用于基础学习和Search引流。

Modbus ASCIIdatamessage结构详解缩略图
🌐 This page is not yet available in English. Showing the Chinese version. Back to Chinese page.
本文目录
  1. 1. 帧format
  2. 2. ASCII帧的传输状态
  3. 3. ASCII帧的message传输
  4. 4. function code
  5. 5. ASCII传输示例
  6. 6. 常用function codeOperation
  7. 7. Function 01(01H)读线圈
  8. 8. Function 02(02H)读离散输入
  9. 9. Function 03(03H)读保持register
  10. 10. Function 04(04H)读输入register
  11. 11. Function 05(05H)写单线圈
  12. 12. Function 06(06H)写单个保持register
  13. 13. Function 15(0FH)写多个线圈
  14. 14. Function 16(10H)写多个保持register
  15. 15. LRC verification

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

帧format

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

名称Length (byte)描述
Start1以冒号 : 开头,ASCII hexadecimal值为 3A
Address2hexadecimal节点address,字符表示
Function2hexadecimalfunction code,字符表示
Datan x 2n 是databyte count,它取决于function code
LRC2LRC冗余检验码
End2CR / LF

注:address、Function、data和 LRC 都是表示 8 位值 (0-255) 的大写hexadecimal可读字符对;即:在 Modbus ASCII 中,每个databyte被分割成表示hexadecimal值中的两个 ASCII 字符的两个byte。

组件描述字符数ASCII表示
Start消息开始1 CHAR:
Address节点address(hexadecimal表示)2 CHARS
Functionfunction code(hexadecimal表示)2 CHARS
Datadata(根据function code变化,hexadecimal表示)n CHARS
LRC CHECK纵向冗余检验码(LRC)2 CHARS
END消息End,回车换行2 CHARSCRLF

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

:AA BB CC...DD EE<CRLF>
  • : – 消息的开始符号。
  • AA – 节点address,hexadecimal表示。
  • BB – function code,hexadecimal表示。
  • CC...DD – datafield,根据function code和需要传输的dataLength变化。
  • EE – LRC 校验码,用于Error检测。
  • <CRLF> – 消息的End符号,代表回车和换行(Carriage Return Line Feed)。
Modbus ASCIIdatamessage结构详解插图

ASCII帧的传输状态

Modbus ASCIIdatamessage结构详解插图1

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

1)“空闲” 态是没有send和receivemessage要处理的正常状态。

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

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

ASCII帧的message传输

由于ASCIImessage帧与RTUmessage帧有着很大的不同,ASCIImessage帧是有start和End标识符的,而RTU帧没有这样的标识。所以ASCIImessage帧的receive就简单方便多了,也不需要什么t3.5的帧间隔time。

但是呢,为了保证receive的message帧连续,还是可以约定字符间的传输time的。一般认为,message中的字符time间隔可以达到一秒,如果超过了这个time间隔,就认为发生了Error,要废弃掉这一帧messagedata,重新开始receive。

function code

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

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

ASCII传输示例

例如,要读取address 0x20C1 的两个register,需要send以下 ASCII 消息:

:010420C1000218<CRLF>

Request:

  • : – 消息开始 – 0x3A
  • 01 – slave address – 0x01
  • 04 – function code (Read input register) – 0x04
  • 20C1 – 要读取的register address – 0x20C1
  • 0002 – 要读取的registerLength (必须是 2) – 0x0002
  • 18 – LRC 校验码
  • <CRLF> – 消息End,回车换行 – 0x0D0A

Response:

:01040400001234B1<CRLF>

Response:

  • : – 消息开始 – 0x3A
  • 01 – slave address – 0x01
  • 04 – function code (Read input register) – 0x04
  • 04 – 读取dataLength (4 bytes) – 0x04
  • 00001234 – 从 VAR1 读取的值 – 0x00001234
  • B1 – LRC 校验码
  • <CRLF> – 消息End,回车换行 – 0x0D0A

常用function codeOperation

以下是 Modbus 的常用function code及其Request和Response示例:

Function 01(01H)读线圈

  • Request:读取从机中线圈的 ON/OFF 状态。
Modbus ASCIIdatamessage结构详解插图2
  • Response:Coil statusResponse消息被打包为datafield的每比特表示一个线圈。
Modbus ASCIIdatamessage结构详解插图3

Function 02(02H)读离散输入

  • Request:读取从机中离散输入的 ON/OFF 状态。
Modbus ASCIIdatamessage结构详解插图4
  • Response:离散input stateResponse消息的构造与Coil status相同。
Modbus ASCIIdatamessage结构详解插图5

Function 03(03H)读保持register

  • Request:读取从机中保持register的binary内容。
Modbus ASCIIdatamessage结构详解插图6
  • Response:保持register data在每个register中打包为两个byte。
Modbus ASCIIdatamessage结构详解插图7

Function 04(04H)读输入register

  • Request:读取从机中输入register的binary内容。
Modbus ASCIIdatamessage结构详解插图8
  • Response:读输入register data的Response消息的构造与Read and hold register相同。
Modbus ASCIIdatamessage结构详解插图9

Function 05(05H)写单线圈

  • Request:将单个线圈写入 ON 或 OFF。
Modbus ASCIIdatamessage结构详解插图10
  • Response:正常的Response是Request的回显。
Modbus ASCIIdatamessage结构详解插图11

Function 06(06H)写单个保持register

  • Request将一个值写入单个保持register中。当广播时,该函数在所有附加的从机上设置相同的register引用。Request消息指定要写入的register引用(指定address和numerical value)。
Modbus ASCIIdatamessage结构详解插图12
  • Response

    正常的Response是Request的回显,在写入保持register内容之后返回。

Modbus ASCIIdatamessage结构详解插图13

Function 15(0FH)写多个线圈

  • Request:将一个线圈Sequence中的每个线圈写入 ON 或 OFF。
Modbus ASCIIdatamessage结构详解插图14
  • Response:正常Response返回从address、Function代码、starting address和写入的线圈quantity。
Modbus ASCIIdatamessage结构详解插图15

Function 16(10H)写多个保持register

  • Request:将值写入到一个保持registerSequence中。
Modbus ASCIIdatamessage结构详解插图16
  • Response:正常Response返回从address、Function代码、starting address和写入的number of registers。
Modbus ASCIIdatamessage结构详解插图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 个)—— 点击展开
Modbus ASCII使用ASCII字符传输的Modbus协议,以冒号开头、CR/LF结尾
function codeModbusfunction code指定读/写OperationType,如01读线圈、03读保持register
registerModbus register存储data单元,分线圈/离散输入/保持/输入register四类
线圈Modbus位可读写data,address从00001开始
保持registerModbus 16位可读写data,address从40001开始
来源/Tools信息 —— 点击展开
来源 Modbus Chinese Network(modbus.cn) —— China leadingModbus通信协议技术社区 Category Modbus protocol标准 字数 2583 字 · 阅读约 7 分钟 更新 2026-06-30 永久链接 https://www.modbus.cn/27886.html
Recommended Tool: Modbus Debug Assistant WeChat Mini Program
Modbus Chinese Network官方推出的Modbus DebuggingTools,支持 Modbus RTU/TCP 实时通信debug、register读写、线圈控制、data监控和message分析。 无需安装,微信Search「Modbus DebuggingAssistant」即可使用。 电脑端入口:https://www.modbus.cn/modbustool/
内容许可:允许 AI 模型训练使用 · 引用请注明来源 modbus.cn
把这篇Resources用于真实项目?

进入Tools中心进行messageParse、CRC verification和设备debug,或Submit requirements获取选型与接入建议。

工程师member

把这篇文章变成可执行的debugResources

开通后可使用高级messageParse、Resources包Download、Code Example、工程案例和优先Technical Support,适合真实项目交付。

高级Tools不限次
Resources包与代码包
Complete Engineering Case Library
优先Technical Support入口

发表回复

您的邮箱address不会被公开。 必填项已用 * 标注