ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:560.25KB ,
资源ID:20747191      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/20747191.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(手把手教你学51单片机之十八 RS485通信与Modbus协议详情Word文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

手把手教你学51单片机之十八 RS485通信与Modbus协议详情Word文档格式.docx

1、为了提高RS485的抗干扰性能,需要在靠近MAX485的A和B引脚之间并接一个电阻,这个电阻阻值从100欧到1K都可以。在这里我们还要介绍一下如何使用KST-51单片机开发板进展外围扩展实验。我们的开发板只能把根本的功能给同学们做出来提供实验练习,但是同学们学习的脚步不应该停留在这个实验板上。如果想进展更多的实验,就可以通过单片机开发板的扩展接口进展扩展实验。大家可以看到蓝绿色的单片机座周围有32个插针,这32个插针就是把单片机的32个IO引脚全部都引出来了。在原理图上表现出来的就是我们的J4、J5、J6、J7这4个器件,如图18-2所示。图18-2单片机扩展接口这32个IO口不是所有的IO口

2、都可以用来对外扩展,其中既作为数据输出,又可以作为数据输入的引脚是不可以用的,比如、引脚,这三个引脚是不可用的。比如这个引脚,如果我们用来扩展,发送的信号如果和DS18B20的时序吻合,会导致DS18B20拉低引脚,影响通信。除这3个IO口以外的其他29个IO口,都可以使用杜邦线接上插针,扩展出来使用。当然了,如果把当前的IO口应用于扩展功能了,板子上的相应的功能就实现不了了,也就是说需要扩展功能和板载功能二选一。在进展RS485实验中,我们通信用的引脚必须是和,此外还有一个方向控制引脚,我们使用杜邦线将其连接到上去。RS485的另外一端,大家可以使用一个USB转485模块,用双绞线把开发板和

3、模块上的A和B分别对应连起来,USB那头插入电脑,然后就可以进展通信了。学习了第13章的实用串口通信的方法和程序后,做这种串口通信的方法就很简单了,根本是一致的。我们使用实用串口通信的思路,做了一个简单的程序,通过串口调试助手下发任意个字符,单片机接收到后在末尾添加“回车+换行符后再送回,在调试助手上重新显示出来,先把程序贴出来。程序中需要注意的一点是:因为平常都是将485设置为接收状态,只有在发送数据的时候才将485改为发送状态,所以在UartWrite()函数开头将485方向引脚拉高,函数退出前再拉低。但是这里有一个细节,就是单片机的发送和接收中断产生的时刻都是在停止位的一半上,也就是说每

4、当停止位传送了一半的时候,RI或TI就已经置位并且马上进入中断如果中断使能的话函数了,接收的时候自然不会存在问题,但发送的时候就不一样了:当紧接这向SBUF写入一个字节数据时,UART硬件会在完成上一个停止位的发送后,再开始新字节的发送,但如果此时不是继续发送下一个字节,而是已经发送完毕了,要停止发送并将485方向引脚拉低以使485重新处于接收状态时就有问题了,因为这时候最后的这个停止位实际只发送了一半,还没有完全完成,所以就有了UartWrite()函数内DelayX10us(5)这个操作,这是人为的增加了延时50us,这50us的时间正好让剩下的一半停止位完成,那么这个时间自然就是由通信波

5、特率决定的了,为波特率周期的一半。文件程序源代码*/#include intrins.hsbit RS485_DIR = P17;/RS485方向选择引脚bit flagOnceTxd = 0;/单次发送完成标志,即发送完一个字节bit cmdArrived = 0; /命令到达标志,即接收到上位机下发的命令unsigned char tRxd = 0;unsigned char pdata bufRxd40; /串口接收缓冲区void ConfigUART(unsigned int baud)/串口配置函数,baud为波特率 RS485_DIR = 0; /RS485设置为接收方向 SCON

6、 = 0x50;/配置串口为模式1 TMOD &= 0x0F;/清零T1的控制位 TMOD |= 0x20;/配置T1为模式2 TH1 = 256 - (11059200/12/32) / baud;/计算T1重载值 TL1 = TH1;/初值等于重载值 ET1 = 0; /禁止T1中断 ES= 1; /使能串口中断 TR1 = 1; /启动T1unsigned char UartRead(unsigned char *buf, unsigned char len) /串口数据读取函数,数据接收指针buf,读取数据长度len,返回值为实际读取到的数据长度 unsigned char i; if

7、 (len tRxd) /读取长度大于接收到的数据长度时, len = tRxd; /读取长度设置为实际接收到的数据长度 for (i=0; i 0)/接收计数器大于零时,监控总线空闲时间if (tbkp != tRxd)/接收计数器改变,即刚接收到数据时,清零空闲计时tbkp = tRxd;idletmr = 0;elseif (idletmr = 30)/空闲时间超过30ms即认为一帧命令接收完毕cmdArrived = 1; /设置命令到达标志 elsetbkp = 0;void InterruptUART() interrupt 4/UART中断服务函数 if (RI)/接收到字节RI

8、 = 0;/手动清零接收中断标志位if (tRxd 8);/定时器重载值拆分为上下字节 T0RL = (unsigned char)tmp;= 0xF0;/清零T0的控制位 TMOD |= 0x01;/配置T0为模式1 TH0 = T0RH;/加载T0重载值 TL0 = T0RL; ET0 = 1;/使能T0中断 TR0 = 1;/启动T0void InterruptTimer0() interrupt 1/T0中断服务函数/定时器重新加载重载值 UartRxMonitor(1);/串口接收监控 现在看这种串口程序,是不是感觉很简单了呢?串口通信程序我们反反复复的使用,加上随着我们学习的模块越

9、来越多,实践的越来越多,原先感觉很复杂的东西,现在就会感到简单了。我们的下载程序模块用的是4,而USB转485虚拟的是5,通信的时候我们用的是5口,如图18-3所示。图18-3 RS485串行通信18.2Modbus通信协议介绍我们前边学习UART、I2C、SPI这些通信协议,都是最底层的协议,是“位级别的协议。而我们在学习13章实用串口通信程序的时候,我们通过串口发给单片机三条指令,让单片机做了三件不同的事情,分别是buzz on、buzz off、和showstr。随着我们系统复杂性的增加,我们希望可以实现更多的指令。而指令越来越多,带来的后果就是非常杂乱无章,尤其是这个人喜欢写成,而另外

10、一个人喜欢写成on buzzoff buzz导致不同开发人员写出来的代码指令不兼容,不同厂家的产品不能挂到一条总线上通信。随着这种矛盾的日益严重,就会有聪明人提出更合理的解决方案,提出一些标准来,今后我们的编程必须按照这个标准来,这种标准也是一种通信协议,但是和UART、I2C、SPI通信协议不同的是,这种通信协议是字节级别的,叫做应用层通信协议。在1979年由Modicon(现为施耐德电气公司的一个品牌)提出了全球第一个真正用于工业现场总线的协议,就是Modbus协议。18.2.1Modbus协议特点Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网

11、络(例如以太网)和其他设备之间可以通信,已经成为一种工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进展集中监控。这种协议定义了一种控制器能够认识使用的数据结构,而不管它们是经过何种网络进展通信的。它描述了控制器请求访问其他设备的过程,如何回应来自其他设备的请求,以与怎样侦测错误记录,它制定了通信数据的格局和内容的公共格式。在进展多机通信的时候,Modbus协议规定每个控制器必须要知道他们的设备地址,识别按照地址发送过来的数据,决定是否要产生动作,产生何种动作,如果要回应,控制器将生成的反应信息用Modbus协议发出。Modbus协议允许在各种网络体系结构内进展简单通信,每种设备(P

12、LC、人机界面、控制面板、驱动程序、输入输出设备)都能使用Modbus协议来启动远程操作,一些网关允许在几种使用Modbus协议的总线或网络之间的通信,如图18-4所示。图18-4 Modbus网络体系结构实例Modbus协议的整体架构和格式比拟复杂和庞大,在我们的课程里,我们重点介绍数据帧结构和数据通信控制方式,作为一个入门级别的了解。如果大家要详细了解,或者使用Modbus开发相关设备,可以查阅相关的国标文件再进展深入学习。1.2.2RTU协议帧数据Modbus有两种通信传输方式,一种是ASCII模式,一种是RTU模式。由于ASCII模式的数据字节是7bit数据位,51单片机无法实现,而且

13、应用也相对较少,所以这里我们只用RTU模式。两种模式相似,会用一种另外一种也就会了。一条典型的RTU数据帧如图18-5所示。图18-5 RTU数据帧和我们实用串口通信程序类似,我们一次发送的数据帧必须是作为一个连续的数据流进展传输。我们在实用串口通信程序中采用的方法是定义30ms,如果接收到的数据超过了30ms还没有接收到下一个字节,我们就认为这次的数据完毕。而Modbus的RTU模式规定不同数据帧之间的间隔是个字节通信时间以上。如果在一帧数据完成之前有超过个字节时间的停顿,接收设备将刷新当前的消息并假定下一个字节是一个新的数据帧的开始。同样的,如果一个新消息在小于个字节时间内接着前边一个数据

14、开始的,接收的设备将会认为它是前一帧数据的延续。这将会导致一个错误,因此大家看RTU数据帧最后还有16bit的CRC校验。起始位和完毕符:图18-5上代表的是一个数据帧,前后都至少有个字节的时间间隔,起始位和完毕符实际上没有任何数据,T1-T2-T3-T4代表的是时间间隔个字节以上的时间,而真正有意义的第一个字节是设备地址。设备地址:很多同学不理解,在多机通信的时候,数据那么多,我们依靠什么判断这个数据帧是哪个设备的呢?没错,就是依靠这个设备地址字节。每个设备都有一个自己的地址,当设备接收到一帧数据后,程序首先对设备地址字节进展判断比拟,如果与自己的地址不同,如此对这帧数据直接不予理会,如果如

15、果与自己的地址一样,就要对这帧数据进展解析,按照之后的功能码执行相应的功能。如果地址是0x00,如此认为是一个广播命令,就是所有的从机设备都要执行的指令。功能代码:在第二个字节功能代码字节中,Modbus规定了局部功能代码,此外也保存了一局部功能代码作为备用或者用户自定义,这些功能码大家不需要去记忆,甚至都不用去看,直到你有用到的那天再过来查这个表格即可,如表18-1所示。表18-1 Modbus功能码功能码名称作用01读取线圈状态取得一组逻辑线圈的当前状态(ON/OFF)02读取输入状态取得一组开关输入的当前状态(ON/OFF)03读取保持存放器在一个或多个保持存放器中取得当前的二进制值04

16、读取输入存放器在一个或多个输入存放器中取得当前的二进制值05强置单线圈强置一个逻辑线圈的通断状态06预置单存放器把具体二进值装入一个保持存放器07读取异常状态取得8个内部线圈的通断状态,这8个线圈的地址由控制器决定,用户逻辑可以将这些线圈定义,以说明从机状态,短报文适宜于迅速读取状态08回送诊断校验把诊断校验报文送从机,以对通信处理进展评鉴09编程(只用于484)使主机模拟编程器作用,修改PC从机逻辑10控询(只用于484)可使主机与一台正在执行长程序任务从机通信,探询该从机是否已完成其操作任务,仅在含有功能码9的报文发送后,本功能码才发送11读取事件计数可使主机发出单询问,并随即判定操作是否成功,尤其是该命令或其他应答产生通信错误时12读取通信事件记录可是主机检索每台从机的ModBus事务处理通信事件记录。如果某项事务处理完成,记录会给出有关错误13编程(184/384 484 584 )可使主机模拟编程器功能修改PC从机逻辑14探询(184/384 484 584)可使主机与正在执行任务的从机通信,定期控询该从机是否已完成其程序操作,仅在含有功能13的报文发送后,本功能码才得发送15强置多线圈强置一串连续逻辑线圈的通断16预置多存放器把具体的二进制值装入一串连续的保持存放器17报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1