• 基于AVR128单纯Modbus协议实施


    Modbus通信协议Modicon公司1979在发展中,适用于工业现场总线协议控制。Modbus通信系统包含芯片的节点,并与组合物可编程控制的公共传输线,它的目的是收集和监视多个节点的数据。Modbus协议采用主从模式,通信系统具有多个节点的从一台主机机监视器。最多支持从节点247个。每一个从机均有自己独立的从机地址。并且改地址可以被主机识别。

    可以支持Modbus协议的通讯系统有RS-232。RS-422,RS-485等。同一时候Modbus协议具有标准、开放、免费、帧格式简单等特点而被广大project师所採用。

    Modbus协议中传输数据採用ASCII和RTU两种模式。当中ASCII传输方式表示的数据通俗易懂。便于和PC机直接通信识别,但其缺点是採用单字节表示一个数据,传输同样的数据须要很多其它的帧数和时间。RTU模式採用压缩的十六进制表示方式。一个字节能够压缩装载两个数据,这样同样的帧数下RTU模式能够传输很多其它的数据。

    Modbus数据帧校验分两种方式:CRC循环冗余校验和LRC纵向冗余校验。

    以下使用Proteus仿真atmega128.两片128之间进行串口通讯,串口通讯上跑的是简单的Modbus协议。

    仿真图例如以下所看到的:


    说明:U1使用1602进行接收数据的显示。

    数据帧採用RTU模式,可是为了方便1602进行显示。传输的数据帧消息採用了0X3x(0,1,2,3...等数的ASCII表示形式,这样能够直接送入1602进行显示。从而方便模拟)。图片中间的三个按键是U2的三个中断。



    按下之后U2单片机会发送一帧数据。数据内容是0X30, 0X31,0X33,0X01。0X34。0X37。

    依照Modbus协议0X300X31是表示的从机地址,0X33是表示命令字符。0X01表示数据域长度,0X34表示数据域。0X37是进行的LRC校验。我们採用这样的方式进行简化是为了方便1602进行显示,当中0x01ASCII码中的空格’‘也可以在1602中进行显示。

    单片机U1PB口和PE口状态分别显示了LRC校验字节和数据域首字节。


    当按下button1的时候U2发送数据帧,U1进行接收而且对接收数据继续校验,假设校验无误。那么进行显示。

    按下button1结果例如以下


    中间的01因为是空格的ASCII码值所以1602显示空格。因为数据域我是採用数组存放数据方式。LCD显示代码以C语言中的’’结束显示。所以校验字节没有显示出来。我将它投影到portB上,portB的状态是0X37。这样也就验证了这个简单的Modbus协议的正常传输。

     

    按动U2button2能够主动产生一个LRC校验错误。(我在代码校验的时候也没有採用标准的LRC校验。仅仅是进行了累加校验)。U2在对数据帧填充完成的时候刻意更改校验值。将更改后的数据帧发送给U1U1接收后进行校验则产生校验错误提示。按下button2结果如图



    从虚拟终端中我们能够看出。我们手动更改了校验值,由0x37更改成0XFF,那么U1接收到的数据进行校验那么就会产生校验错误提示。。

    。实际校验结果还是0X37,可是我们在发送前将校验改成了0XFF。导致接收方校验0x37 !=0xff,从而产生错误。。

    按下button3回产生数据帧错误。按下button3U2刻意发送一个不完整的数据帧。假设数据帧不完整,U1不可能进行无限时间的等待。所以U1使用定时器0进行超时推断,假设超过10ms,数据帧依旧不完整那么推断此数据帧为错误帧。

    结果例如以下。


    在事件3中我们能够让U2不发送校验码,导致该帧数据不完整。U1等待10ms后判定该数据帧是帧错误。。

     

    该仿真的仿真程序和仿真project存放到网盘地址http://yun.baidu.com/share/link?

    shareid=368414814&uk=840368654&third=0

    里边包括了U1 和U2的project代码分别在各自的MAIN目录的。仿真文件ISIS目录的。

    我希望对你有所帮助。

    88

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    异常
    动态链接库与静态链接库的区别
    OpenBLAS 安装与使用
    Eigen 优化技巧
    C++读取保存为二进制的 numpy 数组
    Sublime Text Windows版使用Conda环境
    Repeater 时间格式化
    C#与js的各种交互
    js 实现精确加减乘除
    常用正则表达式
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4828643.html
Copyright © 2020-2023  润新知