데이터帧형식 - RTU帧 & ASCII帧的区别-Modbus통신 프로토콜要点第4部分

무료무료 기술 자료

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

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分

Modbus既然是一种통신 프로토콜,那它就应该有规定的통신형식用于在设备之间的指令수신与识别。

本文就着重讲讲Modbus프로토콜的RTU帧和ASCII帧。

Modbus帧在串行链路上的형식如下:

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图

在上图的형식中:

1)주소域:指代的是子节点주소。合法的子节点주소为 0 – 247。 每个子设备被赋予 1 – 247 范围中的주소。主节点通过将子节点的주소放到프레임的주소域对子节点寻址。当子节点返回应答时, 它将自己的주소放到应答프레임的주소域以让主节点知道哪个子节点在回答。

2)기능 코드:指明服务器要执行的动作。

3)데이터域:기능 코드后面的有表示含有请求和响应매개변수的데이터。

4)错误检验:是对프레임콘텐츠执行 "冗余체크섬" 的계산 결과。根据不同的传输모드 (RTU or ASCII)使用两种不同的계산方法。

上面설명了Modbus的帧형식,是一种规定的데이터打包的规约。

Modbus中有两种串行传输모드: RTU 모드 和 ASCII 모드。它定义了프레임域的콘텐츠在线路上串行的传送。它确定了信息如何打包为프레임和解码。

所有设备必须实现 RTU 모드,ASCII 모드是备选项。

1、Modbus RTU帧모드

RTU帧指的是什么呢?简单而言就是프레임中的每个바이트都是用16진수表示的。

RTU帧中的每个바이트데이터的형식定义如下:

每个바이트为8bit
프레임中每个 8 位바이트含有两个 4 位16진수문자(0–9, A–F)

Bits per Byte: 
1 시작位
8 데이터 비트,首先보내기最低有效位
1 位作为奇짝수 패리티
1 정지 비트

注 : 使用패리티 없음要求 2 个정지 비트。

每个바이트为8bit프레임中每个 8 位바이트含有两个 4 位16진수문자(0–9, A–F)
Bits per Byte: 1 시작位8 데이터 비트,首先보내기最低有效位1 位作为奇짝수 패리티1 정지 비트
注 : 使用패리티 없음要求 2 个정지 비트。

문자的传送流是LSB先보내기,最后才是MSB,如下:

有奇짝수 패리티的:

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图1无奇짝수 패리티的:

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图2

重点来了,RTU的프레임帧형식:     数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图3

Modbus RTU帧的最大길이为256个바이트。

2、Modbus ASCII帧모드

Modbus ASCII帧中规定프레임的每个바이트데이터以两个ASCII문자进行보내기。

怎么理解呢?

 例 : 有一个데이터바이트为 0X5B,它会被编码为两个문자 : 0x35 和 0x42 (ASCII 编码 0x35 ="5", 0x42 ="B" )。

ASCII 모드节每个바이트 (10 位 )  为的형식为 : 

프레임中每个 ASCII 문자含有 1 个16진수문자
Bits per Byte: 
1 시작位
7 데이터 비트, 首先보내기最低有效位
1 位作为奇짝수 패리티
1 정지 비트

注 : 使用패리티 없음要求 2 个정지 비트。

프레임中每个 ASCII 문자含有 1 个16진수문자Bits per Byte: 1 시작位7 데이터 비트, 首先보내기最低有效位1 位作为奇짝수 패리티1 정지 비트
注 : 使用패리티 없음要求 2 个정지 비트。

문자是如何串行传送的: 

有奇짝수 패리티的:

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图1无奇짝수 패리티的:

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图2

Modbus ASCII的프레임帧형식:

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图4

ASCII프레임帧与RTU프레임帧有很大的不同,ASCII프레임帧中是带有开头和종료标识符的,这对设备수신프레임帧很方便。设备可以很方便的知道一个新프레임帧的开头,并且知道프레임什么时候종료了。

RTU프레임帧中并没有这样的标识符,所以在수신프레임帧的时候就需要做些处理,方能判断프레임是否完成了一帧데이터的수신。

ASCII프레임帧中用콜론(:)(ASCII的16진수为0x3A)作为시작,用줄바꿈(CRLF)(CR LF)(ASCII的16진수为0x0D 0x0A)作为종료。

由于ASCII모드下每个문자바이트需要用两个문자编码,所以为了确保 ASCII 모드 和 RTU 모드在 Modbus 적용级兼容,ASCII데이터域最大데이터길이为 (2x252) 是 RTU 데이터域 (252) 的两倍。因此,ModbusASCII 帧的最大크기为 513 个문자。

3、RTU帧与ASCII帧的传输区别

前面已经分析了RTU프레임帧和ASCII프레임帧的区别,RTU프레임帧是不带开始和종료标识符的,而ASCII프레임帧中带有开始和종료标识符。所以在设备수신RTU帧和ASCII帧的时候处理방식就会有所不同。

(1)RTU帧的프레임传输

现在思考一个문제:RTU帧中因为没有开始和종료的标识符,设备要怎么知道已经수신完成了一帧프레임了呢?

为了能够确认프레임被完整수신,不至于수신到不完整的프레임就进行프레임분석和处理,所以必须要想办法去确认一帧프레임已经完成수신,然后再去处理。

在RTU모드中,为了标识不同的프레임帧,在프레임帧之间插入一个空闲时间间隔,在两帧프레임之间用至少3.5个문자的空闲时间来区分不同的帧,同时标识一帧是否已经完成수신。这个时间也称为t3.5时间间隔。

这样的操作방식看下图进行理解:

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图5

如果前面开始了一次프레임帧的传输,수신设备从空闲状态中被唤起,就需要多수신进行一个超时计时机制,用以确认프레임帧是否已经수신完成。就如上图中的帧1和帧2之间如果间隔的时间等于或者超过了t3.5所设定的空闲대기时间,就可以认为前面的帧1已经수신完成,后面再过来的데이터就属于帧2的데이터。

在RTU帧中还有一个讲究的地方:因为프레임帧本质是用문자流进行보내기的,所谓为了区分不同的프레임帧就需要用到t3.5的문자间隔。但是프레임帧中的每个문자要怎么确认是连续的呢?

所以为了确认문자流的보내기连续,就要使用到t1.5문자时间。看下图: 数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图6

从上图中可以清晰看到:如果两个문자之间的空闲间隔大于 1.5 个문자时间,则프레임帧被认为不完整应该被수신节点丢弃。小于或者等于1.5个문자的时间则认为正常。

上面说的t1.5和t3.5这两个时间,其实并不是一定적용的。为什么呢?

因为时间项目적용中,很多时候多프레임帧的수신都会涉及到中断,特别是在통신速率很高的情况下,会频繁的快速中断,对cpu的负担是很重的,这个时候这t1.5和t3.5的时间就会变得很短暂,并不是很好处理。

所以,t1.5和t3.5这两个时间一般是在통신速率在19200Bps或以下的时候才需要去严格约定。

(2)ASCII帧的프레임传输

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

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

4、RTU帧和ASCII帧的传输状态分析

(1)RTU帧的传输状态:

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图7

上面状态图可以获取的信息:

1)从 "初始" 态到 “空闲” 态转换需要 t 3.5 定时超时,用以保证帧间지연。

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

3)在 RTU 모드, 当没有活动的传输的时间间隔达 3.5 个문자长时,통신链路被认为在 “空闲”态。

4)当链路空闲时, 在链路上检测到的任何传输的문자被识别为 帧시작。 链路变为 "活动" 状态。然后, 当链路上没有문자传输的时间间个达到 t3.5 后,被识别为 帧종료。

5)检测到帧종료后,完成 CRC 계산和检验。然后,分析주소域以确定帧是否发往此设备,如果不是,则丢弃此帧。 为了减少수신处理时间,주소域可以在一接到就分析,而不需要等到整个帧종료。这样,CRC 계산只需要在帧寻址到该节点 (包括广播帧) 时进行。

(2)ASCII帧的传输状态

数据帧格式 - RTU帧 & ASCII帧的区别-Modbus通讯协议要点第4部分插图8

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

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

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

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

실제 프로젝트에 이 자료를 활용하시겠습니까?

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

엔지니어 회원

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

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

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

답글 작성

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