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

무료무료 기술 자료

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

Modbus RTU数据报文结构详解

什么是Modbus RTU프로토콜?

Modbus RTU프로토콜是一种允许可编程逻辑제어기(PLC)和계산机之间进行데이터交换的통신방식。 电子设备可以使用Modbus프로토콜通过串行线路交换信息。

它已被广泛接受并广泛用于 建筑管理系统 的建设 (BMS) 和산업 자동화系统(IAS)。 它的易用性,可靠性以及它是오픈소스的,并且可以在任何设备或적용程序中무료使用。

该프로토콜由Modicon®于1979年개발和发布,用于其可编程逻辑제어기。 它使用主/从架构构建,并支持使用RS232 / RS485 / RS422프로토콜的串行设备。 Modbus通常用于多个仪器和控制设备将信号传输到中央제어기或系统以收集和分析데이터的情况。 산업 자동화和监督控制和데이터采集 (SCADA) 系统通常采用Modbus프로토콜。

Modbus RTU代表什么?

Modbus RTU(远程终端单元)是原始Modbus사양中定义的两种传输모드之一。 这两种모드是Modbus RTU和ASCII,它们都设计用于支持RS232,RS485和RS422프로토콜的串行设备。 Modbus RTU的一个显着特点是它使用2진수编码和强大的CRC错误检查。 Modbus RTU是Modbus프로토콜的实现,最常用于工业적용和自动化生产设施。

Modbus RTU如何工作?

Modbus프로토콜基本上是一个处理来自电子设备的请求和响应的系统。 主/从体系结构与主设备请求一起使用,这些请求由从设备响应。

什么是Modbus RTU마스터?

Modbus RTU마스터是从연결的슬레이브设备请求信息的中央设备。 自动化生产系统中的中央제어기可以扮演Modbus RTU마스터的角色。 Modbus实现有一个主服务器。 主设备从从设备获取信息,也可以쓰기从设备的레지스터。

什么是Modbus RTU슬레이브?

Modbus RTU슬레이브是响应主设备请求的设备。 它无法启动信息传输,并且在响应主服务器发出的请求之前处于保持모드。

Modbus프로토콜的核心是被称为的组件 프로토콜데이터单元 (PDU). PDU由功能代码和데이터组成,无论使用何种Modbus传输모드,都可以一致地构建。 功能代码指定마스터请求的데이터。

在Modbus RTU传输모드中,附加信息包裹在PDU周围以创建完整的적용데이터单元(ADU)。 在信号流中和功能代码之前,在Modbus RTU모드下,보내기1바이트的从ID以识别应满足请求的从设备。 附加到PDU的是2바이트CRC,确保보내기和수신正确数量的바이트。

Modbus设备支持四个데이터表,用于促进设备之间的통신。 它们是이산 입력,离散출력(코일),입력 레지스터和유지 레지스터。 레지스터执行不同的功能,并不是每个设备都包含在内。 在某些情况下,只有유지 레지스터用于I / O功能。

领域访问크기설명
이산 입력只读1位用作입력
코일출력读/写1位用于控制离散
입력 레지스터只读16位用于입력
持有레지스터读/写16位用于各种事物,包括입력,출력,설정데이터等。

功能代码指示主设备如何与从设备ID中指定的从设备进行交互。 根据보내기的功能代码,主设备可以읽기从机的一个레지스터,或쓰기它们。

当슬레이브수신到包含요청 내错误的데이터包时,它们会返回错误代码。 对于诸如非法功能请求,指定슬레이브无法访问的非法레지스터주소以及指示从设备忙或已经发生故障的消息等문제,将返回错误代码。

Modbus RTU要求您在启动통신时知道或定义통신 속도,문자형식(8位无奇짝수 패리티等)和슬레이브ID等매개변수。 任何这些매개변수不일치都会导致您的통신尝试失败。

下面让我们详细解释一下Modbus RTU데이터프레임:

帧结构

帧结构 = 주소 + 功能吗 + 데이터 + 체크섬

주소: 占用一个바이트,范围0-255,其中有效范围是1-247,其他有特殊用途,比如255是广播주소(广播주소就是应答所有주소,正常的需要两个设备的주소一样才能进行查询和回复)。

기능 코드:占用一个바이트,기능 코드的意义就是,知道这个指令是干啥的,比如你可以查询从机的데이터,也可以修改데이터,所以不同기능 코드对应不同功能。

데이터:根据기능 코드不同,有不同结构,在后续的实例中有설명。

체크섬:为了保证데이터不错误,추가这个,然后再把前面的데이터进行계산看데이터是否一致,如果一致,就설명这帧데이터是正确的,我再回复;如果不一样,설명你这个데이터在传输的时候出了문제,데이터不对的,所以就抛弃了。

下面通过기능 코드03和06解释详细解释一下:

기능 코드0x03(读)

主机보내기: 01 03 00 00 00 01 84 0A
从机回复: 01 03 02 19 98 B2 7E


那么这一组데이터是什么意思呢?

从上面的结构图中,可以看出,主机보내기的데이터大致是 주소+기능 코드+데이터+체크섬;

所以분석如下:

보내기데이터분석

Modbus RTU数据报文结构详解插图
01 - 주소,也就是你센서的주소
03 - 기능 코드,03代表查询功能,查询센서的데이터
00 00 - 代表查询的시작레지스터주소.설명从0x0000조회 시작。这里需要설명以下,Modbus把데이터存放在레지스터中,通过查询레지스터来得到不同변수的值,一个레지스터주소对应2바이트데이터
00 01 - 代表查询了一个레지스터.结合前面的00 00,意思就是查询从0开始的1个레지스터 값
84 0A - 循环冗余체크섬,是modbus的체크섬公式,从首个바이트开始到84前面为止;

回复데이터분석

Modbus RTU数据报文结构详解插图1
01 - 주소,也就是你센서的주소
03 - 功기능 코드,03代表查询功能,查询센서的데이터。这里要注意的是注意发给从机的기능 코드是啥,从机就要回复同样的기능 코드,如果不一样설명这一帧데이터有错误
02 - 代表后面데이터的바이트数,因为上面说到,一个레지스터有2个바이트,所以后面的바이트数肯定是2*查询的레지스터个数;
19 98 - 레지스터的值是19 98,结合보내기的데이터看出,01这个레지스터的值为19 98
B2 7E - 循环冗余체크섬

基本流程:

보내기:从机的주소+我要干嘛的기능 코드+我要查的레지스터的주소+我要查的레지스터주소的个数+체크섬

回复:从机的주소+主机发我的기능 코드+要보내기给主机데이터的바이트数+데이터+체크섬

기능 코드0x06(写)

如果我要修改从机的데이터呢?那么这个프로토콜有吗,答案是Yes!

主机보내기: 01 06 00 00 00 01 48 0A
从机回复: 01 06 00 00 00 01 48 0A

보내기데이터분석

Modbus RTU数据报文结构详解插图2
01-主机要查询的从机주소
06-기능 코드,06代表修改单个레지스터功能,修改有些不同,有修改一个레지스터和修改多个레지스터;
00 00-代表修改的시작레지스터주소.설명从0x0000开始.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号레지스터 값为00 01;
48 0A-循环冗余체크섬,是modbus的체크섬公式,从首个바이트开始到48前面为止;

回复데이터분석

Modbus RTU数据报文结构详解插图3
01-从机返回给主机自己的주소,설명这就是主机查的从机
06-기능 코드,代表修改单个레지스터功能,主机发啥기능 코드,从机就必须回什么기능 코드;
00 00-代表修改的시작레지스터주소.설명是0x0000.
00 01-代表修改的值为00 01.结合前面的00 00,意思就是修改0号레지스터 값为00 01;
48 0A-循环冗余체크섬,是modbus的체크섬公式,从首个바이트开始到48前面为止;

常用기능 코드详解

常用기능 코드表格

기능 코드名称데이터유형作用
0x01读코일레지스터位取得一组逻辑코일的当前状态(ON/OFF)
0x02读离散입력 레지스터位取得一组开关입력的当前状态(ON/OFF)
0x03读유지 레지스터整型、浮点型、문자型在一个或多个유지 레지스터中取得当前的2진수值
0x04读입력 레지스터整型、浮点型在一个或多个입력 레지스터中取得当前的2진수值
0x05写单个코일레지스터位强置一个逻辑코일的通断状态
0x06写单个유지 레지스터整型、浮点型、문자型把具体2진수值装入一个유지 레지스터
0x0F写多个코일레지스터位强置一串连续逻辑코일的通断
0x10写多个유지 레지스터整型、浮点型、문자型把具体的2진수值装入一串连续的유지 레지스터

01H-读코일 상태

1)설명:读从机코일레지스터,位操作,可读单个或者多个;
2)보내기指令:
假设从机주소位0x01,레지스터开始주소0x0023,레지스터종료抵制0x0038,总共읽기21个코일。프로토콜图如下:

Modbus RTU数据报文结构详解插图4

3)响应:
返回데이터的每一位对应코일 상태,1-ON,0-OFF,如下图;

Modbus RTU数据报文结构详解插图5

上表中데이터1表示0x0023-0x002a的코일 상태,데이터1的最低位代表最低주소的코일 상태,可以理解为小端모드;

데이터2表示주소0x002b-0x0033的코일 상태,如下表:

Modbus RTU数据报文结构详解插图6

데이터3表示주소0x0034-0x0038的코일 상태,不够8位,바이트高位填充为0,如下表:

Modbus RTU数据报文结构详解插图7

02H-读이산 입력状态

1):读离散입력 레지스터,位操作,可读单个或多个,프로토콜类似기능 코드0X01프로토콜,此处省;

03H-读유지 레지스터

1)설명:读유지 레지스터,바이트指令操作,可读单个或者多个;
2)보내기指令:
从机주소0x01,유지 레지스터시작주소0x0032,读2个유지 레지스터

Modbus RTU数据报文结构详解插图8

3)响应:

Modbus RTU数据报文结构详解插图9

데이터存储顺序

Modbus RTU数据报文结构详解插图10

04H-读입력 레지스터

1)설명:读입력 레지스터,바이트指令操作,可读单个或者多个;
2)보내기指令:同03H;
3)响应:同03H;

05H-写单个코일

1)설명:写单个코일,位操作,只能写一个,写0xff00表示设置코일 상태为ON,写0x0000表示设置코일 상태为OFF
2)보내기指令:
设置0x0032코일为ON;

Modbus RTU数据报文结构详解插图11

3)响应:
同보내기指令;

06H-写单个유지 레지스터

1)설명:写单个유지 레지스터,바이트指令操作,只能写一个;
2)보내기指令:
写0x0032유지 레지스터为0x1232;

Modbus RTU数据报文结构详解插图12

3)响应:同보내기指令;

0F-写多个코일

1)설명:写多个코일레지스터。若데이터区的某位值为“1”表示被请求的相应코일 상태为ON,若某位值为“0”,则为状态为OFF。
2)보내기指令:
코일주소为0x04a5,写12个코일,

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

上图中데이터1为0x0c,表示:

Modbus RTU数据报文结构详解插图14

데이터2为0x02,不够8位,바이트高位填充0:

Modbus RTU数据报文结构详解插图15

3)响应:

Modbus RTU数据报文结构详解插图16

10H-写多个유지 레지스터

1)설명:写多个유지 레지스터,바이트指令操作,可写多个;
2)보내기指令:
유지 레지스터시작주소为0x0034,写2个레지스터4个바이트的데이터;

Modbus RTU数据报文结构详解插图17

3)响应:

Modbus RTU数据报文结构详解插图18
실제 프로젝트에 이 자료를 활용하시겠습니까?

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

엔지니어 회원

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

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

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

답글 작성

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