已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于modbus通信协议的智能开关一、引言:本方案设计的是基于modbus通信协议的智能开关,基于modbus通信协议实现PC机和单片机之间的通信,达到用PC向单片机发送指令,单片机响应指令去控制开关的状态,并向PC机返回消息的目的。利用RS232串行通信方式和Modbus通信协议,实现对开关的智能控制。本设计采用异步串行半双工通信方式,通信波特率设置为9600b/s,Modbus消息帧采用RTU模式。RS-232C标准是目前最常用的串行接口标准,PC机里的COM1、COM2接口和单片机的RXD、TXD脚都属于RS-232C接口。RS-232C规定了连接器针脚、接线、信号电平、波特率、奇偶校验等信息。最大数据传输速率为20kb/s,最大传输距离是15m,所以只能近程通信。其逻辑电平对地是对称的,与TTL、MOS逻辑电平完全不同,逻辑0电平规定是+3-+15v之间,逻辑1电平是-3- -15v之间。所以,RS-232C驱动器与TTL电平连接必须经过电平转换电路。一般微处理器和单片机的信号电平都是TTL电平,与RS-232C规定的逻辑电平不一致,pc串口输入/输入的是232电平,所以要对两者进行电平转换,这种转换是通过专用的电平转换芯片来实现的。二、系统框图:系统框图三、系统硬件设计3.1、串行接口标准RS-232C标准是目前最常用的串行接口标准,PC机里的COM1、COM2接口和单片机的RXD、TXD脚都属于RS-232C接口。RS-232C规定了连接器针脚、接线、信号电平、波特率、奇偶校验等信息。最大数据传输速率为20kb/s,最大传输距离是15m,所以只能近程通信。3.2 、电平转换芯片MAX232 RS-232C标准的逻辑电平对地是对称的,与TTL、MOS逻辑电平完全不同,逻辑0电平规定是+3-+15v之间,逻辑1电平是-3- -15v之间,一般微处理器和单片机的信号电平都是TTL电平,与RS-232C规定的逻辑电平不一致,pc串口输入/输出的是232电平,所以要对两者进行电平转换。MAX232芯片能够实现电平转换功能,它包含两路接收器和驱动器的IC芯片,其内部包含一个电压变换器,可以把输入的+5v电源转换成为RS-232C输出电平所需的。MAX232如下图所示:MAX232硬件连接图3.3、系统硬件电路连接图:系统硬件电路连接图四、软件设计异步通信以帧的形式发送字符数据,每一帧的信息由起始位、数据位、奇偶校验位和停止位构成。异步通信中每传送一个字节就要使用起始位和停止位,所以传输速度慢,但是传输距离远。串行口通常使用缓冲区SBUF。发送数据时,先将数据放入发送串行寄存器SBUF,串口准备好之后,就将其发送出去;传来数据时,迅速申请中断,接收并放入接收串行寄存器SBUF,以供读取。在单片机系统中发送数据时,比较常用的方法就是直接调用“串口发送单个字节数据的函数”,这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即出现在通信线路上,能够立即被接收端接收到。另外一种发送的方法就是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小。对于51系列的单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,中断向量即中断服务程序入口地址。中断向量表设置在RAM最底端的1024单元内。中断类型码共有256种。每个中断向量占用4个字节,其中底位2个字节为中断服务程序入口地址的偏移量,高位2个字节位中断服务程序的段基址。中断类型码乘以4,即可得到中断服务程序人口地址第一个字节的地址,而且对比直接发送来说也没有太多的优点。本文采用直接发送的方式。下面是51系列单片机中发送单个字节的函数(非中断):Void SendByte(unsigned char ch) SBUF=ch ; While(TI=0) ;TI=0 ;发送数据较易实现,而接收处理的方式主要有查询和中断方式。采用查询方式时,CPU要不断地测试串口是否有数据,以防止接收数据时出现错误、遗漏,查询方式的效率低;而采用中断方式则无需测试串口,一旦有数据传至,CPU将终止当前任务,由中断服务程序完成操作。所以中断方式具有效率高、接收准确、编程简单等优点。本文采用的是中断接收方式。单片机和通用微机进行通信时,要求使用的波特率、传输的位数等相同。要想进行数据传送,也必须首先测试双方是否可以可靠通信。可在微机和单片机上各编制非常短小的程序,具体可分为微机串行口发送/接收程序,单片机串行口发送程序和单片机串行口发送/接收程序。这3个程序能够运行通过,即可证明串口工作正常。4.1 通信协议Modbus 协议4.1.1、Modbus通信协议简介 Modbus通信协议一种用于电子控制器进行控制和通讯的通讯协议。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以进行通信。它的开放性、可扩充性和标准化使它成为一个通用工业标准。有了它,不同厂商生产的控制设备可以简单可靠地连成工业网络,进行系统的集中监控,从而使它成为最流行的协议之一。Modbus消息帧可分为两种传输模式:ASCII模式和RTU模式。Modbus协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如何回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。Modbus消息帧可分为两种传输模式:ASCII模式和RTU模式,在此主要介绍RUT模式,其特点是:在命令报文(包含地址码、功能码、数据等)之前添加起始位(帧头),之后添加结束符(帧尾),这样就封装了完整的RTU帧,其中,帧头和帧尾为4个字符延时时间的等待。RTU消息帧使用RTU模式,当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。RTU模式中每个字节是11位的,其格式是:编码系统: 8位二进制,十六进制数0.9,A.F 消息中的每个8位域都是一个两个十六进制字符组成每个字节的位(11位): 1个起始位 8个数据位,最小的有效位先发送 1个奇偶校验位,无校验则无 1个停止位(有校验时),2个Bit(无校验时)如何串行的传送字符:发送每个字符或字节的顺序是从左到右:最低有效位,最高有效位。RTU模式中一个字符的消息格式为:起始12345678校验(停止)停止一个字符的消息格式一个RTU消息帧是由很多个上面的字符消息组成的。4.1.2 RTU模式的消息帧格式:起始位设备地址功能代码数据CRC校验结束符T1-T2-T3-T48Bit8BitN个8Bit16BitT1-T2-T3-T4 RTU模式的消息帧该模式下消息发送至少要以3.5个字符时间的停顿间隔开始。传输过程中,网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,相应的设备就对接下来的传输字符进行解码,一旦有至少3.5个字符时间的停顿就表示该消息的结束。在RTU模式中整个消息帧必须作为一连续的流传输,如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。如果在传输过程中有以上两种情况发生的话,必然会导致CRC校验产生一个错误消息,反馈给发送方设备。4.1.3各个代码的含义(1)地址码地址码是信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。(2)功能码通讯传送的第二个字节。主机发送的功能码告诉从机执行什么任务。ModBus通讯规约定义功能号为1到127。具体每个功能码对应的具体含义见书:从Modbus到透明就绪这本书。(机械工业出版社)。作为主机请求发送,通过功能码告诉从机执行什么动作;作为从机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。如果从机发送的功能码的最高位为(比如功能码大与此同时127),则表明从机没有响应操作或发送出错。(3)数据区数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。(4) 错误校验码主机或从机可用校验码进行判别接收信息是否出错。CRC法的原理:传统的差错检验法有:奇偶校验法,校验和法,行列冗余校验法等。这些方法都是在数据后面加一定数量的冗余位同时发送出去,例如在单片机的通讯方式2和3中,TB8就可以作为奇偶校验位同数据一起发送出去,在数据的接收端通过对数据信息进行比较、判别或简单的求和运算,然后将所得和接收到的冗余位进行比较,若相等就认为数据接收正确,否则就认为数据传送过程中出现错误。但是冗余位只能反映数据行或列的奇偶情况,所以这类检验方法对数据行或列的偶数个错误不敏感,漏判的概率很高。因此,此种方法的可靠性就差。循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC。它是利用除法及余数的原理来作错误侦测(Error Detecting)的。只有每个字符中的8位数据位参与生成CRC的计算,起始位、停止位和校验位不参与CRC的计算。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误。由于这种方法取得校验码的方式具有很强的信息覆盖能力,所以它是一种效率极高的错误校验法。错误的概率几乎为零。根据应用环境与习惯的不同,CRC又可分为以下几种标准: CRC12码; CRC16码; CRCCCITT码; CRC32码。4.1.4 CRC生成流程图本方案采用最常用的CRC16码。CRC产生过程:(1)预置16位寄存器位十六进制数FFFF(即全为1)。称此寄存器为CRC寄存器。 (2)把第一个字符的8位数据与16位寄存器的低位相异或,将结果放于CRC寄存器中; (3)把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位; (4)如果最低位(这里的最低位是指移位前的最低位,即被移出的那一位!)为0,重复第三步(再次移位);如果最低位为1,CRC寄存器与多项式码A001H进行异或;(5)重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;(6) 进行下一个字符的8位数据的处理,重复步骤2到5; (7)最后得到的寄存器的里的值即为CRC。图1 CRC生成流程图4.1.5 CRC生成子程序/* CRC计算子程序*/uint crc16(uchar *str, uint num) /CRC计算子程序, uint i,crc,j,c; crc=0xffff; /CRC寄存器全部置1 for (i=0; inum ;i+ ) crc=stri0x00ff; /CRC寄存器的地位与第一个字符相异或 for(j=0; j=1; /右移一位 else crc=1; /是0,再右移一位(重复) return(crc); 五、主从机的通信通信程序必须处理好数据包开始的标志,因为主机向某一从机发送数据时,其他的从机也会接收到,只有地址相同的从机才能响应,因此地址的判别至关重要。(1)01号功能码:读(可读写)数字量寄存器(线圈状态)。 使用中主机,从机数据格式分别如表1,表2所示.主机发送数据帧格式主机发送意思从机地址功能码寄存器首址寄存器数CRC 1字节 01 1字节 01 2字节 8000 2字节 0001 2字节 D40A与01号从机通信读数字量寄存器P0口寄存器字节地址80H,00位地址代表p0.0读一个寄存器的内容前六个字节的CRC校验码表1 主机发送数据帧格式 从机回送数据帧格式从机回送 意思从机地址功能码数据字节数数据CRC校验1字节 011字节 011字节 011字节 FF(00)2字节 11C8(5188)与01号从机通信读数字量寄存器1个寄存器占1个字节若灯灭,即开关断开(若灯亮,即开关闭合)前4个字节的CRC校验码表2 从机回送数据帧格式(2)05号功能码:写(可读写)数字量寄存器(线圈状态)。使用中主机,从机数据格式分别如表3,表4所示.主机发送数据帧格式主机发送意思从机地址功能码寄存器首址寄存器数CRC 1字节 01 1字节 05 2字节 8000 2字节 FF00(或0000) 2字节 A5FA(或E40A)与01号从机通信写数字量寄存器P0口寄存器字节地址80H,00位地址代表p0.0若为FF则是将开关断开,反之,闭合前六个字节的CRC校验码表3 主机发送数据帧格式从机回送数据帧格式从机回送意思从机地址功能码寄存器首址寄存器数CRC 1字节 01 1字节 05 2字节 8000 2字节 FF00(或0000) 2字节 A5FA(或E40A)与01号从机通信写数字量寄存器P0口寄存器字节地址80H,00位地址代表p0.0若为FF则是将开关断开,反之,闭合前六个字节的CRC校验码表4 从机回送数据帧格式六、通信过程描述整个通信过程可分为信息的接收、处理、回送三大部分。接收采用中断接收的方式,好处上面已经赘述;处理消息的过程采用在定时中断服务程序中完成;回送采用的是直接发送的方式。本设计涉及的通信是主从通信模式,开始处理器进入空闲状态,当有数据传来时,迅速申请中断,在中断服务程序中完成数据的接收,把接收到数据放入接收SBUF。同时开启定时器,每接收一个字节就要判断是不是一个消息中的最后一个字节,本文用到定时器T0,定时T3.5,此定时器是用来判断一帧消息是否传成。定时时间一到就会进入定时中断服务程序。而消息帧的处理就是在此服务程序中完成的。下位机要回送信息时,需定义一个回送标志位flag, 当启动flag时,表明可以回送信息了,在此采用的是调用发送函数直接发送数据的方式进行回送的。一帧消息和一帧消息之间的间隔不能少于3.5个字符的时间,即帧头和帧尾不能少于3.5个字符的时间。本文取4个字符的空闲时间间隔将报文帧之间分开。发送报文必须是以连续的字符流发送整个报文帧。所以要能够正确判断什么时候发送完一个消息,什么时候开始发送下一帧的消息。这个帧头和帧尾很重要,没有这个T3.5,就可能会出现消息混乱的现象,达不到通信的目的。本文用定时器0来设定这个T3.5,所以在实际发送消息的时候,每当发送一个字节就要启动一次定时器0来判断一帧消息是否传送完毕,如果在3.5个字符时间内没有再次接收到字符,那么说明上一帧消息已经传送完毕,否则就判定不是消息帧的结尾。七、下面是各个部分的程序流程图7.1主程序流程图:7.2下位机接收数据中断服务程序流程图:7.3定时中断数据处理程序流程图:7.4下位机数据发送程序流程图八、程序代码:#include #include #include #define uchar unsigned char /简化定义#define uint unsigned int sbit k=P00; /P0.0控制智能开关的开关,K=0时开关闭和小灯亮,K=1时开关开启,小灯 sbit flag=P07; /定义发送标志位,flag=1时,下位机开始发送,flag=0时,不可发送int H_0=(65536-3334)/256; /声明T0的高8位int L_0=(65536-3334)%256; /声明T0的低8位 uchar data rxbuf8; /定义接收数组uchar data txbuf8; uint data crc,crc1,crc2;uchar data i;uchar data m;/*CRC子程序*/uint crc16(uchar *str, uint num) /CRC计算子程序 uint i,crc,j,c; crc=0xffff; /CRC寄存器全部置1 for (i=0; inum ;i+) c=stri&0x00ff; crc=c; /CRC寄存器的低位与第一个字符相异或 for(j=0; j=1; /右移一位 crc=0xa001; /最低位是1,则CRC的值与AOO1H相异或,结果放入CRC中。 else crc=1; /是0,再右移一位(重复) return(crc);/*/ void init() /初始化接收数组 rxbuf0=0x00; rxbuf1=0x00; rxbuf2=0x00; rxbuf3=0x00; rxbuf4=0x00; rxbuf5=0x00; rxbuf6=0x00; rxbuf7=0x00; /*函数名称:UART_Init功能:串口初始化*/void UART_Init() SCON =0x70; /8位异步收发方式 TH1 =0xfd; TL1 =0xfd; /11.0592mhz, SMOD=0; 9600bit TR1 =1; TMOD =0x21; /设置定时器1的工作方式为八位自动重装方式,定时器0的工作方式 ES =1; /启用串行口中断 EA =1; /中断总开关开启,允许中断 flag =0; /开始为接收状态,不可发送 k =1; /初始化智能开关为关的状态/*函数名:sendbyte功能:向串口发送一个字节字符入口参数:unsigned char sendbyte 一个字节字符(8bit)备注:非中断方式*/void sendbyte(unsigned char sendbyte)ES=0; /禁止串口中断EA=0; /禁止中断SBUF=sendbyte; /把要发送的数据放入缓冲区while(TI=0); /等待发送完毕TI=0; /清发送中断标志ES=1; /允许串口中断EA=1; /开中断/*函数名:UART_Interrupt功能:串口接收中断函数,中断接收方式出口参数:Byte*/void UART_Interrupt(void) interrupt 4 using 0 /串口中断处理程序 ES=0; /关中断 rxbuf0=rxbuf1; rxbuf1=rxbuf2; rxbuf2=rxbuf3; rxbuf3=rxbuf4; rxbuf4=rxbuf5; rxbuf5=rxbuf6; rxbuf6=rxbuf7; rxbuf7 = SBUF; RI=0; TH0=H_0; /定时器0装入高8位,装入计数初值 TL0=L_0; /装入低8位 ET0=1; /允许定时器0中断 TR0=1; /启动定时器T0,判断是不是所有数据全部发送完毕 ES=1; /开中断/*函数名:T0_Interrupt功能:判断一帧消息是否接收完毕,处理发来的指令*/void T0_Interrupt(void)interrupt 1 ES=0; /关串口中断 if(rxbuf0= 0x01) /设单片机的地址为 01,并且验证正确 crc1 = rxbuf7; /进行CRC校验 crc1 = crc18; crc2 = rxbuf6; crc1 = crc1|crc2; crc16( rxbuf,0x06); /调用CRC子程序计算前6个字节的crc crc = crc crc1; if(crc=0) /得到CRC校验正确 switch(rxbuf1) case 0x01: txbuf0=rxbuf0; /txbuf0代表是单片机的地址 txbuf1=rxbuf1; /txbuf1代表是返回功能码 txbuf2=0x01; /txbuf2代表是返回数据的长度 if(k=0) txbuf3=0x00; /灯亮则返回00 else txbuf3=0xFF; /灯灭则返回FF crc=crc16(txbuf,0x04); /计算前4个字节的CRC txbuf4=crc%256; /CRC效验低位 txbuf5=crc/256; /CRC效验高位 m=6; flag=1; /置发送标志,下位机向上位机发送数据 break; case 0x03: txbuf0=rxbuf0; txbuf1=rxbuf1; txbuf2=rxbufrxbuf51; if(k=0) txbuf3=0x00; txbuf4=0x00; else txbuf3=0xff; txbuf4=0x00; crc=crc16(txbuf,0x05); txbuf5=crc%256; /CRC效验低位 txbuf6=crc/256; /CRC效验高位 m=7; flag=1; /置发送标志,下位机向上位机发送数据 break; case 0x05: /写数字量寄存器 txbuf0=rxbuf0; /从机原样返回原来的指令 txbuf1=rxbuf1; txbuf2=rxbuf2; txbuf3=rxbuf3; txbuf4=rxbuf4; txbuf5=rxbuf5; txbuf6=rxbuf6; txbuf7=rxbuf7; if(rxbuf4=0xFF) k=1; else if (rxbuf4=0x00) /若上位机给的信息中是00则要 k=0 ; m=8; flag=1; /置发送标志,下位机向上位机发送数据 break; default: break; /switch结束 /if(crc=0)结束 /if(rxbuf0= 0x01) 结束 ES=1;/重启串口中断/*主函数*/main() init(); SP=0x60; UART_Init(); /初始化 while(1) if(flag) /可以发送数据 for(i=0;im;i+) sendbyte(txbufi);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 烘干厂承包协议合同书
- 滑雪用具采购合同范本
- 邮寄公司加盟合同范本
- 迁移绿化苗木合同范本
- 2025年新能源企业数据治理与绿色供应链管理报告
- 2024~2025学年河南省南阳市新野县八年级下学期期中物理试卷
- 2025年井下动火作业试题及答案
- 2025年徐州一模化学试卷及答案
- 物业维修地板合同范本
- 租大巴车协议合同模板
- 非自然人低压分布式光伏并网调度协议
- 助播劳务合同协议书
- n1护士考试试题及答案2025
- 青海城市介绍旅游宣传
- 2025年中级政工师考前通关必练题库
- 青青河畔草-古诗十九首其二-赏析-汉
- 数据魔方Fine BI考试FCBA考试题
- 统编版四年级语文上册第三单元主题阅读(含答案)
- 周一清晨的领导课(原版)
- 《休闲农业项目策划与组织》课件-动物类体验活动典型案例分析与实践
- 《过渡金属配合物》课件
评论
0/150
提交评论