MODBUS规约详解

MODBUS是一种主从规约。它允许读或写一个或多个字(16位)操作,但任何情况下都不支持字节的读写。
信息交换是以主站采取主动实现的,即由主机启动交换。除广播命令外,所有的一个完整交换由下行和上行两个报文组成:
·下行报文:主站发出的一个请求
·上行报文:从站发回的一个回答
1.通信参数和传输特性
传输方式:异步串行通信方式
MODBUS规约模式:RTU模式
传输速率:2400bps,9600bps,19200bps
串行口通信数据格式:1个起始位,8个数据位,无校验位,一个停止位
最大传输距离:1200m
通信介质:推荐采用0.5mm的双绞线,不带屏蔽层。原因是如果使用屏蔽双绞线,但现场接地处理不好反而影响通信质量
网络连接主站数目:1个
网络连接从站数目:最多31个
应答时间:小于4.5个byte传输时间(帧间隔最小时间)+10ms[1]
2.通信连接方式
RS-485网络的匹配电阻选取,以现场通信正常为准,一般地1.2km时取120Ω,600m时取220Ω,300m时取330Ω,如果通信误码率较大,观察通信时的波形,匹配电阻做适当改变。
3.报文格式
每个MODBUS帧都包括地址域 功能域 数据域 错误检测域
(1)RTU方式
在这里插入图片描述

帧定界 :MODBUS RTU方式下,每两个字符之间发送或者接收的时间间隔不能超过1.5倍字符传输时间。如果两个字符时间间隔超过了3.5倍的字符传输时间,规约就认为一帧数据已经接受,新的一帧数据传输开始。
(2)ASCII方式
在这里插入图片描述
帧定界:“:”帧起始   “CR LF” 帧结束
ASCII方式用两个ASCII字符表示一个8位数据,比如16进制的3A用字符“3”和字符“A”表示。
4.RTU类数据帧
①从站号
从站号位1字节,取值范围为0-FFH,例外的如果此值为0,则作为主站的广播信文标识,因此,物理上使用的从站号只能在01H-FFH之间(即1-255之间)。
②功能码
功能码为1字节,它被用来选择一个命令(读、写或回答校验是否正确等),功能码范围为1-255之间。
③数据区
数据区为n字节,它包含与功能码相关的一串十六进制数据。
功能码概述
在这里插入图片描述
功能码与数据分类
在这里插入图片描述
ModBus是通过功能码来实现数据的交换通信的。读取“线圈状态”就是读出数字量输出的位是true还是false。
Modbus可以读写四种类型的数据。分别是 读取数字量输入位 读写数字量输出位 读取输入寄存器 读写输出寄存器。上位机想要读取下位机某个特定寄存器的内容,就向下位机发送“读取线圈状态”。实际上读取的是一个开关量。
5.数据帧格式
①MODBUS-RTU报文模型:
在这里插入图片描述
一个报文就是一帧数据,一个数据帧就一个报文: 指的是一串完整的指令数据,就像上面的一串数据。
②主机对从机写数据操作:
如果单片机接收到一个报文那么就对报文进行解析执行相应的处理
在这里插入图片描述
③主机对从机读数据操作:
在这里插入图片描述
④单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的。

从机对主机返回内容:
在这里插入图片描述
6.报文示例
举例:
Modbus协议中寄存器地址从1开始,而实际存储中地址从0开始。假如要读取寄存器编号为40005(4为块编号,5为modbus中寄存器地址)的寄存器的数据,则应把00
04放入报文的地址域。寄存器定义,又名码表或者信息点表,应由厂家提供的。
在这里插入图片描述
如要读A相电压,则应将0x00 0x00放入寄存器起始地址域中。

①读40005、40006两个寄存器,假设从机地址为1

下行报文:01 03 00 04 00 02 85 ca
在这里插入图片描述

上行报文:01 03 04 00 00 00 00 21 33
在这里插入图片描述
②向40005寄存器中写入0x12,0x34,假设从机地址为1

下行报文:01 06 00 04 00 01 12 34 4a b0
在这里插入图片描述
上行报文:01 06 00 04 00 01 12 34 4a b0
在这里插入图片描述
7.CRC简单函数如下:
unsugned short CRC16(puchMsg,usDataLen)
unsigned char *puchMsg;/要进行CRC校验的消息/
unsugned short usDataLen;/消息中字节数/
{
unsigned char uchCRCHi =0xFF;/高CRC字节初始化/
unsigned char uchCRCLo=0xFF;/低CRC字节初始化/
Unsigned uIndex;/CRC循环中的索引/
While (usDataLen–)/传输消息缓冲区/
{
uLndex=uchCRCHi ^ *puchMsgg++;/计算CRC/
uchCRCHi=uchCRCLo ^ auchCRCHi[uIndex];
uchCRCLo=auchCRCLo[uIndex];
}
Return(uchCRCHi<<8|uchCRCLo);
}

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Modbus是一种通信协议,用于在工业控制系统中传输数据。它最初由Modicon公司开发,现在已经成为广泛使用的标准。 Modbus协议分为两个不同的变种:Modbus RTU和Modbus ASCII。Modbus RTU使用二进制表示,每个数据位由一个高电平或低电平表示。Modbus ASCII将数据转换为可打印字符,每个字节由两个ASCII字符表示。 Modbus协议使用主从结构进行通信,主设备发送请求并接收响应,从设备响应请求并发送数据。通信是通过串口(RS232或RS485)进行的,主设备通过发送地址码和功能码来标识从设备和请求类型。 Modbus协议支持多种功能码,用于读取和写入数据。常见的功能码包括读取和写入保持寄存器、读取和写入输入寄存器、读取和写入线圈状态和读取和写入离散输入状态。 Modbus协议的帧结构包括:起始位、地址码、功能码、数据和校验。起始位是一个起始信号,标识帧的开始。地址码标识从设备的地址。功能码指示主设备请求的类型。数据是传输的实际数据。校验用于验证数据的完整性。 Modbus解析是指将收到的Modbus数据帧解析为可读的格式。解析过程包括从数据帧中提取地址码、功能码、数据等信息,并根据功能码的类型进行相应的处理。 要进行Modbus解析,我们需要了解Modbus协议的结构和各个字段的含义。然后,我们需要编写相应的解析程序,通过读取数据帧中的字段并进行适当的处理,将其转换为可读的格式。 总之,Modbus规约解析是将收到的Modbus数据帧转换为可读的格式的过程。它涉及到解析数据帧的结构和字段,并进行适当的处理和转换。这种解析是工业控制系统中常见的任务,可以帮助我们理解和处理Modbus通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值