计算机集散控制modbus课程报告_第1页
计算机集散控制modbus课程报告_第2页
计算机集散控制modbus课程报告_第3页
计算机集散控制modbus课程报告_第4页
计算机集散控制modbus课程报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、基于单片机的MODBUS协议实现 学 生 姓 名: 陈一鸣 学 生 学 号: 指导教师: 刘大铭 专业名称: 电子与通信工程 所在学院: 物理电气信息学院 论 文 完 成 日 期: 2016年3月 目 录第1章 目的和要求1第2章 总体设计12.1 MODBUS协议概述12.2 MODBUS数据单元22.3 MODBUS通信原理22.4 ASCII模式32.5 ASCII帧32.6 地址域与数据域42.7 字符的连续传输42.8 错误检测方法52.8.1 奇偶校验52.8.2 LRC检测52.8.3 CRC检测6第3章 硬件设计及测试结果7第4章 MODBUS协议的软件实现94.1 系统程序流

2、程软件设计94.2 源代码9结论与心得18第1章 目的和要求现场总线(Fieldbus)是近年来迅速发展起来的一种工业数据总线,它主要解决工业现场的智能化仪器仪表、控制器、执行机构等现场设备间的数字通信以及这些现场控制设备和高级控制系统之间的信息传递问题。现场总线具有简单、可靠、经济实用等一系列突出的优点,因而受到了许多标准团体和计算机厂商的高度重视。 课题要求是利用单片来实现MODBUS协议,主要以三个4851单片机作为接受方,即slave.c。用keil软件实现代码,形成HEX文件,导入protues仿真图中。用protus实现布线。然后用串口助手,调试串口编号,设置相应的波特率,通过串口

3、助手与protus相连,在串口助手上输入相应指令,接收的单片机在仿真图上有相应的接收到的指令显示。仿真应用的异步串口RS232,RS232与串口助手相连。第2章 总体设计2.1 MODBUS协议概述MODBUS协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。当在一MODBUS网络上通信时,此协

4、议决定了每个控制器需要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用MODBUS协议发出。在其它网络上,包含了MODBUS协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。MODBUS协议包括ASCII、RTU、TCP等协议,标准的MODBUS采集器使用RS232实现串行通讯。MODBUS的ASCII、RTU协议规定了消息、命令和应答的方式,数据通讯采用Master/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请

5、求,Master端也可以直接发信息修改Slave端的数据,实现双向读写。MODBUS协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式主要采用LRC校验,RTU模式主要采用16位CRC校验。MODBUS是OSI模型第7层上的应用层报文传输协议,它在连接不同类型网络的设备之间提供数据的通信,如图2-1所示。图2-1 MODBUS通信线路目前,可以通过下列三种方式实现MODBUS通信。 (1)以太网上的TCP/IP。(2)各种介质上的异步串行传输。(3)MODBUS PLUS,一种高速令牌传递网络。2.2 MODBUS数据单元MODBUS协议定义了一个与基础层无关的简单协议数据单元(

6、Protocol Data Unit, PDU),特定总线或网络上的MODBUS协议映射能够在应用数据单元(Additional Data Unit, ADU)上引入一些附加域,通用MODBUS帧如图2-2所示。启动MODBUS事务处理的客户机创建MODBUS PDU,其中的功能码向服务器指示将执行哪种操作,功能码后面是含有请求和响应参数的数据域。图2-2 通用MODBUS帧 2.3 MODBUS通信原理MODBUS是一种简单的仿“客户机/服务器”型应用协议,其实质就是主/从模式,不过主机是客户机,从机是服务器。其通信遵循以下的过程: (1)客户端准备请求并向服务器发送请求;(2)服务器分析并

7、处理客服端的请求,然后向客户端发送结果;(3)如果出现任何差错,服务器将返回一个异常功能码。在无差错和异常响应下的通信过程分别如图2-3和2-4所示。图2-3 MODBUS事务处理(无差错)图2-4 MODBUS事务处理(异常响应)2.4 ASCII模式当控制器设为在MODBUS网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为一个ASCII码(两个十六进制字符)发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。代码系统采取十六进制,ASCII字符09,AF,消息中的每个ASCII字符都是一个十六进制字符组成每个字节的,1个起始位,7个数据位

8、,最小的有效位先发送,1个奇偶校验位,无校验则无停止位(有校验时),2个Bit(无校验时)错误检测域,LRC(纵向冗长检测)。2.5 ASCII帧使用ASCII模式,消息以冒号(:)字符(ASCII码3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。其它域可以使用的传输字符是十六进制的0.9,A.F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。其优点是:传输的都是可见的ASCII字符,进行调试时比较直观,LRC校验也比较容易,一个典型ASCII消

9、息帧如表2-1所示。表2-1 ASCII消息帧起始位设备地址功能代码 数据LRC校验结束符 1字符 2字符 2字符 n字符 2字符 2字符2.6 地址域与数据域消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。可能的从设备地址是0247 (十进制)。单个设备的地址范围是1247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。地址0是用作广播地址,以使所有的从设备都能认识。当MODBUS协议用于更高水准的网络,广播可能不允许或以其它方式代替。数据域是由两个十六进制数集合构成

10、的,范围00FF。根据网络传输模式,这可以是由一对ASCII字符组成或由一RTU字符组成。从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的所为。这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。如果主设备写一组从设备的寄存器(功能代码10十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。如果没有错误发生,从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。2.7 字符的连续传输当消息在标准的MODBUS系列网络传输时,每个字符或

11、字节以如下方式发送(从左到右):最低有效位最高有效位。1.使用ASCII字符帧时,位的序列是:(1)有奇偶校验位:起始位 1 2 3 4 5 6 7 奇偶位 停止位(2)无奇偶校验位:起始位 1 2 3 4 5 6 7 停止位 停止位2. 使用RTU字符帧时,位的序列是:(1)有奇偶校验位:起始位 1 2 3 4 5 6 7 8 奇偶位 停止位(2)无奇偶校验位:起始位 1 2 3 4 5 6 7 8 停止位 停止位2.8 错误检测方法标准的MODBUS串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测(LRC或CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接

12、收过程中检测每个字符和整个消息帧。用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任何从设备都能作出正常反应。如果从设备测到一传输错误,消息将不会接收,也不会向主设备作出回应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生超时。2.8.1 奇偶校验用户可以配置控制器是奇或偶校验,或无校验。这将决定了每个字符中的奇偶校验位是如何设置的。如果指定了奇或偶校验,“1”的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位:1 1 0 0 0 1 0 1 整个“1”的数目是4个。如果用了偶校验,帧的

13、奇偶校验位将是0,便得整个“1”的个数仍是4个。如果用了奇校验,帧的奇偶校验位将是1,便得整个“1”的个数是5个。如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加的停止位填充至要传输的字符帧中。2.8.2 LRC检测使用ASCII模式,消息包括了一基于LRC方法的错误检测域。LRC域检测了消息域中除开始的冒号及结束的回车换行号外的内容。LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。2.8.3 CRC检测使用RTU模式,消息包括了一基

14、于CRC方法的错误检测域。CRC域检测了整个消息的内容。CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进

15、行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。第3章 硬件设计及测试结果标准的MODBUS协议的物理层采用的是RS-232标准,MODBUS协议实现的硬件仿真电路图如图3-1,2,3,4所示。图3-1 MODBUS协议实现的硬件仿真电路图图3-2 MODBUS协议实现的硬件仿真电路图图3-3 MODBUS协议实现的硬件仿真电路图 图3-4 MODBUS协议实现的异步串口助手第4章 MODBUS协议的软件实现4.1 系统程序流程软件设计主机要对从机实施控制,首先要实现两者之间的通讯,按照MODBUS协议的约定,在通讯中的信息数据中设置特定的代码,在

16、通讯成功后,对信息数据进行解析和提取,然后启动相应的中断程序进行处理。本文在MODBUS协议的基础上通过串行端口实现单片机和单片机的通讯,根据MODBUS协议,它有两种数据传输的方式:ASCII和RTU方式,由于RTU方式传输效率高,采用CRC校验方法,数据传输准确,所以本文采用了RTU方式,其特点是:在命令报文(包含地址码、功能码、数据等)之前添加起始位(帧头),之后添加结束符(帧尾),这样就封装了完整的RTU帧。其中,帧头和帧尾为4个字符延时等待,在串行端口无电平信号。4.2 源代码#include #include #define Uint16 unsigned int#define U

17、int32 unsigned long#define uchar unsigned charsbit nodesel0=P32;sbit nodesel1=P33;sbit reving=P16;sbit rw=P34;sbit SCL2=P11;/SCL2定义为P1口的第3位脚,连接ADC0831SCL脚sbit SDA2=P12;/SDA2定义为P1口的第4位脚,连接ADC0831SDA脚sbit CS2=P10;/CS2定义为P1口的第4位脚,连接ADC0831CS脚void InitUART(void);void SendOneByte(unsigned);void mdproc(uc

18、har);unsigned char ad0831read(void);/定义该函数为读取ADC0831的数据Uint16 Crc16(Uint16 *puchMsg, Uint16 usDataLen); uchar node;uchar mtx11,mrx10;uchar send1019=0x00,0x04,0x06,0x00,0x00,0x00,0x00,0x00,0x00;uchar timercnt;uchar byterev;bit nodeok;uchar revptr;bit crcok;uchar datalen;bit procok;Uint16 delaycnt;/*

19、CRC 高位字节值表 */ const Uint16 code auchCRCHi = 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81

20、, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00

21、, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80

22、, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00

23、, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81

24、, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 ; /* CRC低位字节值表*/ const Uint16 code auchCRCLo = 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9,

25、0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34,

26、0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0,

27、0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75,

28、0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B,

29、0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 ;void main(void)unsigned char temp8;Uint16 temp16; int i;reving=0;crcok=0;nodeok=0;timercnt=0x00;datalen=0;for(i=0;i10;i+)mrxi=0x00;for(i=0

30、;i11;i+)mtxi=0x00;node=!nodesel1;node=1;node|=!nodesel0; /SLAVE node is determine by the jumper setsend1010=node; /reply the node nummerInitUART();procok=0; / preset the PROCCESS OK FLAG is 1,from the RX to PROCCESS OK the bit is 0.rw=0; /accroding to the MAX485 IC, /RE=1 means transfering ,and /RE=

31、0 means receiving ,after INIT ,default state is receiving for SLAVEwhile(1)if(crcok=1) /plugin the time delay in the communication for monitoring easily in proteusreving=1;send1013=ad0831read(); /get the ADC datafor(i=0;i8)&0x00ff;mtx10=temp16&0x00ff;delaycnt=0x3fff;while(delaycnt-)rw=1;delaycnt=0x3

32、ff;while(delaycnt-)for(i=0;i11;i+)temp8=mtxi;SendOneByte(temp8);crcok=0;delaycnt=0x3ff;while(delaycnt-)rw=0;reving=0; / blink the led when received a currect frame and repliedUint16 Crc16(uchar *puchMsg, Uint16 usDataLen) Uint16 uchCRCHi = 0xFF ; /* 高CRC字节初始化 */ Uint16 uchCRCLo = 0xFF ; /* 低CRC 字节初始

33、化 */ Uint16 temp16;Uint32 uIndex ; /* CRC循环中的索引 */ while (usDataLen-) /* 传输消息缓冲区 */ temp16=*puchMsg+;uIndex = uchCRCHi temp16 ; /* 计算CRC */ uchCRCHi = uchCRCLo auchCRCHiuIndex ; uchCRCLo = auchCRCLouIndex ; return (uchCRCHi 8 | uchCRCLo) ; void Timer0Interrupt(void) interrupt 1 TH0 = 0x3C; TL0 = 0x0

34、B0;if(+timercnt=50)/procok=1;timercnt=0;void UARTInterrupt(void) interrupt 4if(RI) RI = 0; byterev=SBUF;mdproc(byterev); else TI = 0;void mdproc(uchar b) /the simply MODBUS 04 command processing ,if node is right , then receive the whole frame and cheak the CRC , if CRC is OK ,then reply data to the HOSTUint16 temp16_1,temp16_2;if(nodeok=0)if(b=node)nodeok=1;datalen=7;mrx0=b;revptr=1;elsemrxrevptr+=b;if(revptr=8)nodeok=0;temp16_1=Crc16(mrx,6);temp16_2=mrx6;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论