• 浅谈modbus协议


    先来讲些直白的东西:

    1. modbus是一个通信协议簇,包括modbus-RTU,modbus-ASCII,modbus-TCP

    2. modbus是一个主/从通信协议,即主机发送请求后,从机响应相应数据;modbus网络上只能有一个主机存在,主机在网络上没有地址,而从机的设备地址从0-247,其中0为广播地址,即从机的设备地址范围为1-247

    3. modbus协议可以以多种方式传播,如RS232,RS485,无线电,光纤等

    4. modbus协议的不足之处,在于它的主从结构。为了解决这个问题,其它现场总线系统采取令牌传递的措施,谁拿到令牌,谁就可以作为主站,继而可以主动发送信息。

    5. modbus协议曾经是莫迪康公司的协议,它的特点是公开透明,并且不收费,很快就为全世界所接受,后来莫迪康公司经营不善被施耐德公司收购,但施耐德继承了莫迪康公司的初衷,对于modbus-RTU依然不收费

    什么是通信协议

    通信协议包含两层意思:

    1. 数据双方交换的接口(如DB9)、数据交换线路(如485)、字节格式消息帧格式

    2. 数据点表,即数据在存储区中的保存格式和定义(如)

    modbus-RTU的字节格式

    每个字节由2个十六进制组成(即8位二进制),格式如下:

    1个起始位

    8个数据位,最小的有效位先发送

    1个校验位,如不需要校验时取消

    1个停止位(有校验时),2个停止位(无校验时)

    即,对于每个8bit的数据位前后进行了封装

    modbus-RTU的消息帧格式

    START

    ADDRESS

    (设备地址)

    FUNCTION

    功能码

    DATA CRC END
    至少3.5个字符间隔的时间 8bits 8bits N_8bits 16bits 至少3.5个字符间隔的时间

    消息帧格式中的每个模块中,每8bits都被上面的字节格式所封装,例如传输ADDRESS时,在8bits前面加起始位,后面加校验位、停止位;传输DATA时,每8bits数据进行同样的封装;

    3.5个字符间隔的时间如何计算?

    以波特率=9600来计算,3.5*11/9600=4ms,即接收方以4ms的时间停顿来区分每一组消息帧,之所以是11,是因为1位起始位,8位数据位,1位校验位,1位停止位

     

    modbus-ASCII的消息帧格式

    START ADDRESS(设备地址 FUNCTION(功能码 DATA CRC END
    : 8bits 8bits N_8bits 8bits?/16bit? chr(10)+chr(13)

     

    备注:

    chr(13)表示回车,即 ,光标回到当前行的开头却不下移一行

    chr(10)表示换行,即 ,光标垂直下移一行,却不会移到该行开头

    chr(10) + chr(13),即 ,相当于Enter键的作用

     

    modbus的设备地址

    设备地址范围1 - 247,其中0表示广播地址,所有设备都能接收

     

    modbus的功能码

    功能码表示执行什么操作

    功能码  作用 备注
    01(0x01) 读线圈状态 读1bit变量
    02(0x02) 读离散输入 读1bit变量
    03(0x03) 读保持寄存器 读16bit变量
    04(0x04) 读输入寄存器 读16bit变量
    05(0x05) 写单个线圈 写单个1bit变量
    06(0x06) 写单个寄存器 写单个16bit变量
    15(0x0F) 写多个线圈 写多个1bit变量
    16(0x10) 写多个寄存器 写多个16bit变量
    22-64 保留作扩展用  
    65-72 用户功能扩展  
    128-255 保留用作异常应答  

     

     这里需要提一下modbus标准中定义的4个数据块,基于数据块的长度,可以将4种数据块分为两类:位(BIT)数据和寄存器(REG)数据

     

    在使用过程中需要用户配置的参数(物理层的设备参数)

    1. 串口通信参数(通信接口、波特率、校验方式、数据位【通常为8位】、停止位【通常为1-2位】等)

    2. 传输模式(RTU、ASCII、TCP)

    通信参数的作用是规范收发双方传输格式,如果双方传输格式不一样,接收方就不可能正确判断发送方发来的数据是什么

     

    举例

    1. 某modbus控制器,以ASCII的方式发送了一串数据:“: 01031000000FDD”+ Chr(13)+Chr(10)

     报文分析:

    01:从机地址(设备地址);

    03:功能码,表示读保持寄存器

    1000:DATA,表示要读取的起始寄存器的地址

    000F:DATA,表示要读取的寄存器的个数

    DD:CRC校验和

    Chr(13)+Chr(10):结束符

    该报文含义:从地址是01的从机的地址为0x1000的寄存器开始,连续读取15个寄存器的数据

     

    2. 某modbus控制器,以RTU的方式发送了一串数据:“01  06  00 01  00 17  98 04”

    01:从机地址(设备地址);

    06:功能码,表示写单个寄存器

    0001:DATA,表示要写入的起始寄存器的地址

    0017:DATA,表示要写入寄存器的数据

    9804:CRC校验和

    该报文含义:向地址是01的从机的地址为0x0001的寄存器开始,写入数据0x0017

     

     最后,可以搭配 MThings软件,实战学习

     

    参考博客:

    https://blog.csdn.net/liboxiu/article/details/79030776

    https://blog.csdn.net/zhoutanliang/article/details/108791796

    https://blog.csdn.net/weixin_33759269/article/details/93344453

    https://www.zhihu.com/question/334573419/answer/752045857

  • 相关阅读:
    论自己电脑如何搭建服务器
    nodejs + express + art-template + mongodb简单项目
    npm和yarn使用
    Linux内核编译
    Linux 网络编程
    Linux进程管理
    LeetCode1576. 替换所有的问号
    LeetCode392. 判断子序列
    LeetCode674. 最长连续递增序列
    剑指 Offer 48. 最长不含重复字符的子字符串
  • 原文地址:https://www.cnblogs.com/shuaishuaidefeizhu/p/14424477.html
Copyright © 2020-2023  润新知