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协议。
仿真图例如以下所看到的:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmVuZ3llaHVkaWU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
说明:U1使用1602进行接收数据的显示。
数据帧採用RTU模式,可是为了方便1602进行显示。传输的数据帧消息採用了0X3x(0,1,2,3...等数的ASCII表示形式,这样能够直接送入1602进行显示。从而方便模拟)。图片中间的三个按键是U2的三个中断。
按下之后U2单片机会发送一帧数据。数据内容是0X30, 0X31,0X33,0X01。0X34。0X37。
依照Modbus协议0X30,0X31是表示的从机地址,0X33是表示命令字符。0X01表示数据域长度,0X34表示数据域。0X37是进行的LRC校验。我们採用这样的方式进行简化是为了方便1602进行显示,当中0x01是ASCII码中的空格’‘也可以在1602中进行显示。
单片机U1的PB口和PE口状态分别显示了LRC校验字节和数据域首字节。
当按下button1的时候U2发送数据帧,U1进行接收而且对接收数据继续校验,假设校验无误。那么进行显示。
按下button1结果例如以下
中间的01因为是空格的ASCII码值所以1602显示空格。因为数据域我是採用数组存放数据方式。LCD显示代码以C语言中的’\0’结束显示。所以校验字节没有显示出来。我将它投影到portB上,portB的状态是0X37。这样也就验证了这个简单的Modbus协议的正常传输。
按动U2的button2能够主动产生一个LRC校验错误。(我在代码校验的时候也没有採用标准的LRC校验。仅仅是进行了累加校验)。U2在对数据帧填充完成的时候刻意更改校验值。将更改后的数据帧发送给U1,U1接收后进行校验则产生校验错误提示。按下button2结果如图
从虚拟终端中我们能够看出。我们手动更改了校验值,由0x37更改成0XFF,那么U1接收到的数据进行校验那么就会产生校验错误提示。。
。实际校验结果还是0X37,可是我们在发送前将校验改成了0XFF。导致接收方校验0x37
!=0xff,从而产生错误。。
。
按下button3回产生数据帧错误。按下button3,U2刻意发送一个不完整的数据帧。假设数据帧不完整,U1不可能进行无限时间的等待。所以U1使用定时器0进行超时推断,假设超过10ms,数据帧依旧不完整那么推断此数据帧为错误帧。
。
结果例如以下。
在事件3中我们能够让U2不发送校验码,导致该帧数据不完整。U1等待10ms后判定该数据帧是帧错误。。
该仿真的仿真程序和仿真project存放到网盘地址 shareid=368414814&uk=840368654&third=0">http://yun.baidu.com/share/link? shareid=368414814&uk=840368654&third=0
里边包括了U1 和U2的project代码分别在各自的MAIN目录的。仿真文件ISIS目录的。
我希望对你有所帮助。
88
版权声明:本文博主原创文章。博客,未经同意不得转载。