Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59935
  • 博文数量: 169
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1631
  • 用 户 组: 普通用户
  • 注册时间: 2022-03-31 13:14
文章分类

全部博文(169)

文章存档

2024年(37)

2023年(74)

2022年(58)

我的朋友

分类: 网络与安全

2022-08-08 16:35:20

Modbus通讯协议详解

Modbus RTU通讯协议在数据通讯上采用主从应答的方式进行。只能由主机(PCHMI等)通过唯一从机地址发起请求,从机(终端设备)根据主机请求进行响应,即半双工通讯。该协议只允许主机发起请求,从机进行被动响应,因此从机不会主动占用通讯线路造成数据冲突。

类似Modbus RTU协议的主从应答协议还有PPI、电表常用的DL/T645-2007等协议。

一、modbus协议格式

信息传输为异步方式,使用16进制进行通讯,信息帧格式:


地址码

功能码

数据区

CRC校验码

1字节

1字节

N字节

2字节


地址码

地址码是每个通讯信息帧的第一个字节,一般支持1247,部分设备也支持0地址,用于接收主机的广播数据,每个从机在总线上地址必须唯一,只有与主机发送的地址码相符的从机才能响应返回数据。

功能码

功能码是每个通讯信息帧的第二个字节。主机发送,通过功能码告知从机设备应当执行何种操作。

常见的八种功能码:

功能码

定义

操作

01H

读取线圈

读取一个或多个连续线圈状态

05H

写单个线圈

操作指定位置的线圈状态

0FH

写多个线圈

操作多个连续线圈状态

02H

读取离散量输入

读取一个或多个连续离散输入状态

04H

读取输入寄存器

读取一个或多个连续输入寄存器数据

03H

读保持寄存器

读取一个或多个保持寄存器数据

06H

写单个保持寄存器

把两个十六进制数据写入对应位置

10H

写多个保持寄存器

4*N个十六进制数据写入N个连续保持寄存器

数据区

数据区随功能码以及数据方向的不同而不同,这些数据可以是“寄存器首地址+读取寄存器数量”、“寄存器地址+操作数据”、“寄存器首地址+操作寄存数量+数据长度+数据”等不同的组合,在“功能码分析”详解不同功能码的数据区。

Modbus CRC校验

Modbus RTU协议常用与工业现场对数据传输的稳定性和正确性有较高的要求,因此通过CRC校验保证数据传输的正确性和完整性。

二、错误反馈

地址与CRC校验错误并不会收到从机的数据反馈,其他错误将向主机返回错误码。数据帧的第二位加上0X80表示请求发生错误(非法功能码、非法数据值等),错误数据帧如下:

地址码

功能码

错误码

CRC校验码

1字节

1字节

1字节

2字节

常见错误码如下:

名称

说明

01H

非法的功能码

不支持该功能码操作寄存器

02H

非法的寄存器地址

访问设备禁止访问的寄存器

03H

非法的数据值

写入不支持的参数值

04H

从机故障

设备工作异常

三、通讯信息传输过程

通讯命令由主机发送从机时,与主机发送的地址码相符的从机接收通讯命令,如果CRC校验无误,则执行相应的操作,然后把执行结果(数据)返回给主机。返回信息中包含地址码、功能码、执行后的数据以及CRC校验码。如果地址不匹配或者CRC校验出错就不返回任何信息。

四、功能码分析

功能码01H:读线圈

例如:主机要读取从机地址为01H,起始线圈地址为00H1个线圈状态,主机发送:

主机发送

发送数据(HEX

地址码

01

功能码

01

起始线圈地址

高字节

00

低字节

00

线圈数量

高字节

00

低字节


阅读(527) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~