Modbus ASCII데이터프레임 구조 상세 해설

무료무료 기술 자료

이 글은 바로 읽을 수 있으며 기초 학습과 검색 유입에 적합합니다.

Modbus ASCII数据报文结构详解

Modbus ASCII是Modbus的一种消息帧,相比RTU,ASCII的传输是按照문자传的,传输的데이터量会比RTU更多,所以데이터量大的时候一般使用的RTU,데이터量小的时候才会用ASCII,然后ASCII프로토콜帧里面추가了시작和종료,更换了체크섬算法,下面详细介绍ASCII프로토콜

帧형식

Modbus ASCII 모드下的通讯帧형식如下:

名称길이 (바이트)설명
Start1以콜론 : 开头,ASCII 16진수值为 3A
주소216진수节点주소,문자表示
기능216진수기능 코드,문자表示
데이터n x 2n 是데이터바이트数,它取决于기능 코드
LRC2LRC冗余检验码
End2CR / LF

注:주소、功能、데이터和 LRC 都是表示 8 位值 (0-255) 的大写16진수可读문자对;即:在 Modbus ASCII 中,每个데이터바이트被分割成表示16진수值中的两个 ASCII 문자的两个바이트。

组件설명문자数ASCII表示
Start消息开始1 CHAR:
주소节点주소(16진수表示)2 CHARS
기능기능 코드(16진수表示)2 CHARS
데이터데이터(根据기능 코드变化,16진수表示)n CHARS
LRC CHECK纵向冗余检验码(LRC)2 CHARS
END消息종료,줄바꿈(CRLF)2 CHARSCRLF

在 ASCII 모드下,Modbus 消息的每个部分都以特定的문자数和형식出现,如下所示:

:AA BB CC...DD EE<CRLF>
  • : - 消息的开始符号。
  • AA - 节点주소,16진수表示。
  • BB - 기능 코드,16진수表示。
  • CC...DD - 데이터필드,根据기능 코드和需要传输的데이터길이变化。
  • EE - LRC 체크섬,用于错误检测。
  • <CRLF> - 消息的종료符号,代表回车和换行(Carriage Return Line Feed)。
Modbus ASCII数据报文结构详解插图

ASCII帧的传输状态

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

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

1)“空闲” 态是没有보내기和수신프레임要处理的正常状态。

2)每次수신到 ":" 문자表示新的프레임的开始。如果在一个프레임的수신过程中收到该문자,则当前地프레임被认为不完整并被丢弃。而一个新的수신缓冲区被重新分配。

3)检测到帧종료后,完成 LRC 계산和检验。然后,分析주소域以确定帧是否发往此设备,如果不是,则丢弃此帧。 为了减少수신处理时间,주소域可以在一接到就分析,而不需要等到整个帧종료。

ASCII帧的프레임传输

由于ASCII프레임帧与RTU프레임帧有着很大的不同,ASCII프레임帧是有시작和종료标识符的,而RTU帧没有这样的标识。所以ASCII프레임帧的수신就简单方便多了,也不需要什么t3.5的帧间隔时间。

但是呢,为了保证수신的프레임帧连续,还是可以约定문자间的传输时间的。一般认为,프레임中的문자时间间隔可以达到一秒,如果超过了这个时间间隔,就认为发生了错误,要废弃掉这一帧프레임데이터,重新开始수신。

기능 코드

ASCII 모드下最常用的功能代码与 RTU 모드下的功能代码定义相同。以下是一些基本的기능 코드及其설명:

访问주소映射주소설명功能R/W
1 ~ 10000주소-1Coils01/05/15R/W
10001 ~ 20000주소-10001Discrete Inputs02R
30001 ~ 40000주소-30001Input 회원가입s04R
40001 ~ 50000주소-40001Holding 회원가입s03/06/16R/W

ASCII传输예제

例如,要읽기주소 0x20C1 的两个레지스터,需要보내기以下 ASCII 消息:

:010420C1000218<CRLF>

请求:

  • : - 消息开始 - 0x3A
  • 01 - 슬레이브 주소 - 0x01
  • 04 - 기능 코드 (입력 레지스터 읽기 (FC04)) - 0x04
  • 20C1 - 要읽기的레지스터주소 - 0x20C1
  • 0002 - 要읽기的레지스터길이 (必须是 2) - 0x0002
  • 18 - LRC 체크섬
  • <CRLF> - 消息종료,줄바꿈(CRLF) - 0x0D0A

响应:

:01040400001234B1<CRLF>

响应:

  • : - 消息开始 - 0x3A
  • 01 - 슬레이브 주소 - 0x01
  • 04 - 기능 코드 (입력 레지스터 읽기 (FC04)) - 0x04
  • 04 - 읽기데이터길이 (4 바이트) - 0x04
  • 00001234 - 从 VAR1 읽기的值 - 0x00001234
  • B1 - LRC 체크섬
  • <CRLF> - 消息종료,줄바꿈(CRLF) - 0x0D0A

常用기능 코드操作

以下是 Modbus 的常用기능 코드及其请求和响应예제:

功能 01(01H)读코일

  • 请求:읽기从机中코일的 ON/OFF 状态。
Modbus ASCII数据报文结构详解插图2
  • 响应:코일 상태响应消息被打包为데이터필드的每比特表示一个코일。
Modbus ASCII数据报文结构详解插图3

功能 02(02H)读이산 입력

  • 请求:읽기从机中이산 입력的 ON/OFF 状态。
Modbus ASCII数据报文结构详解插图4
  • 响应:이산 입력状态响应消息的构造与코일 상태相同。
Modbus ASCII数据报文结构详解插图5

功能 03(03H)读유지 레지스터

  • 请求:읽기从机中유지 레지스터的2진수콘텐츠。
Modbus ASCII数据报文结构详解插图6
  • 响应:유지 레지스터데이터在每个레지스터中打包为两个바이트。
Modbus ASCII数据报文结构详解插图7

功能 04(04H)读입력 레지스터

  • 请求:읽기从机中입력 레지스터的2진수콘텐츠。
Modbus ASCII数据报文结构详解插图8
  • 响应:读입력 레지스터데이터的响应消息的构造与유지 레지스터 읽기 (FC03)相同。
Modbus ASCII数据报文结构详解插图9

功能 05(05H)写单코일

  • 请求:将单个코일쓰기 ON 或 OFF。
Modbus ASCII数据报文结构详解插图10
  • 响应:正常的响应是请求的回显。
Modbus ASCII数据报文结构详解插图11

功能 06(06H)写单个유지 레지스터

  • 请求将一个值쓰기单个유지 레지스터中。当广播时,该函数在所有附加的从机上设置相同的레지스터引用。请求消息指定要쓰기的레지스터引用(指定주소和数值)。
Modbus ASCII数据报文结构详解插图12
  • 响应

    正常的响应是请求的回显,在쓰기유지 레지스터콘텐츠之后返回。

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

功能 15(0FH)写多个코일

  • 请求:将一个코일시퀀스中的每个코일쓰기 ON 或 OFF。
Modbus ASCII数据报文结构详解插图14
  • 响应:正常响应返回从주소、功能代码、시작주소和쓰기的코일 수량。
Modbus ASCII数据报文结构详解插图15

功能 16(10H)写多个유지 레지스터

  • 请求:将值쓰기到一个유지 레지스터시퀀스中。
Modbus ASCII数据报文结构详解插图16
  • 响应:正常响应返回从주소、功能代码、시작주소和쓰기的레지스터 수량。
Modbus ASCII数据报文结构详解插图17

LRC체크섬

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;
}
실제 프로젝트에 이 자료를 활용하시겠습니까?

도구 센터에서 프레임 분석, CRC 검증, 장비 디버깅을 진행하거나 요청을 제출하여 선정 및 연동 제안을 받아보세요.

엔지니어 회원

이 글을 실행 가능한 디버깅 자료로 활용하세요

가입하면 고급 프레임 분석, 자료 패키지 다운로드, 코드 예제, 엔지니어링 사례, 우선 기술 지원을 이용할 수 있어 실제 프로젝트 납품에 적합합니다.

고급 도구 무제한 이용
자료 패키지와 코드 패키지
완전한 엔지니어링 사례 라이브러리
우선 기술 지원 채널

답글 작성

이메일 주소는 공개되지 않습니다. 必填项已用 * 标注