Modbus协议与现场总线

上传人:飞****9 文档编号:143101691 上传时间:2020-08-26 格式:PPT 页数:34 大小:1.06MB
返回 下载 相关 举报
Modbus协议与现场总线_第1页
第1页 / 共34页
Modbus协议与现场总线_第2页
第2页 / 共34页
Modbus协议与现场总线_第3页
第3页 / 共34页
Modbus协议与现场总线_第4页
第4页 / 共34页
Modbus协议与现场总线_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《Modbus协议与现场总线》由会员分享,可在线阅读,更多相关《Modbus协议与现场总线(34页珍藏版)》请在金锄头文库上搜索。

1、,3.1 Modbus 协议 Modbus是MODICON1979年开发的一种通讯协议。它是一种在工业领域被广为应用的真正开放、标准的网络通讯协议,已经成为一种电子控制器的通用语言,通过此协议控制器之间可以通讯,已成为一种工业标准。 不同厂商生产的控制设备通过Modbus协议可以连成通讯网络,在PLC、变频器、电器设备及自动化仪表 等领域都广泛应用Modbus协议。 Modbus是链路层的主/,采用请求响-.主站发出带有从站地址的请求报文,具有该地址的从站收到该报文后发出响应报文。,第三章 Modbus 协议与现场总线,Modbus 在OSI 模型中所使用的层,3.1.1 Modbus 协议的

2、物理层 1.网络结构 总线式主从结构 主设备:PC机,PLC 从设备:PLC,智能仪表 一个主站可有1253个从站, 从站之间不能相互通讯。 2.通讯方式 (a)一对一:主设备可以和从设备通讯,从设备响应。 (b)一对N(广播):主设备对N个从设备,从设备无响应。 0地址表示广播地址。 3.物理层 支持RS-485、RS-232C。,CRLF 0D0A,COLON 3A,3.1.2 Modbus协议的帧格式,Modbus有两种格式: ASCII格式; RTU格式,1.ASCII码帧格式(用ASCII 表示数据),(1).字节格式,(2).数据表示方法 地址:21 表示ASCII码 32H,31

3、H,(:),(2)说明: a.地址域:从设备地址0-253,地址0为广播地址。 b.功能域:代码范围1-255,命令从设备执行哪些功能(如读测量值,读开关量状态) c.数据域:(两部分内容) 主设备到从设备:变量起始地址、变量个数。 从设备到主设备 : 字节数n、数据n。 d.检错:CRC-16, 生成多项式 Y=X16+X15+X2+1。,2. RTU格式(用二进制数表示数据),(1) RTU帧格式,3.1.3 ModBus功能码,1. Modbus功能码,2.功能码3:读取在一个或多个保持寄存器中取得当前的二进制值,该功能码主要用于读取设备参数,例:主机命令:读6BH开始的3个寄存器内容,

4、从机响应:回传6个字节数据,说明 (1)应用层: 寄存器中存储的内容用户定义。 (2)寄存器地址与寄存器:寄存器号减1为寄存器地址,3.功能码4:读取一个或多个输入寄存器值,主要用于读取设备测量数据,从寄存器8开始读一个寄存器值,4. 功能6:写单个寄存器,例:从寄存器地址1开始,写一个寄存器值03,寄存器地址:0001H 寄存器: 0002H,5. 功能码16:写多个寄存器,主机从01H地址开始写2个寄存器,从机响应主机,3.1.4应用举例 题: 有某地址为1的从设备,其变量定义如下: 例1:主设备用3号命令寻址地址为1的从设备,读取寄存器地址为0000H 的量程. 主设备命令帧 从设备响应

5、帧,变量定义,主机请求,从机响应,量程(参数),寄存器地址,0000H,测量值,0002H,字节数,2byte,2 byte,主,从,地址,功能码,变量地址高,变量数高,CRC校验,01H,03H,00H,00H,变量数低,地址,功能码,01H,03H,字节数,02H,数据1,03H,CRC校验,*,流量 = 3E8H =1000,变量地址低,00H,01H,*,数据2,E8H,例2:主设备用4号命令寻址地为1的从设备, 读取地址为0002H 的测量值,01H,04H,0002H,0001H,#,地址,功能码,变量地址,变量数,CRC校验,地址,功能码,字节数,数据1,数据2,CRC,CRC,

6、01H,04H,02H,03H,20H,*,*,从设备响应,主设备命令帧,测量值 = 320H =800,问题:测量值有小数和正负怎么办?,3.1.5 CRC-16校验,1.说明: (1) CRC校验 = 地址码 + 功能码 +数据 (2) 生成多项式 G(x)=X16+X15+X2+1 (1 1000 0000 0000 0101) (3) 生成多项式最高位总是 1,所以实际中的 生成多项式为 1000 0000 0000 0101 (4) Modbus 采用逆序生成多项式 1010 0000 0000 0001 (5) CRC本质:移位异,是1与生成多项式或和,2:CRC方法,02,1,1

7、,07,3.CRC计算程序(标准程序),数据指针,数据长度,CRC低位表,CRC高位表,auchCRCHi0 xFD,auchCRCHi0 x39,auchCRCLo0 xFD,auchCRCLo0 x39,CRCLo 1 1 1 1 1 1 1 1 1 ST 0 0 0 0 0 0 1 0 XOR uIndex 1 1 1 1 1 1 0 1 auchCRCHi0 xFD = 0 xC1 uchCRCHi 1 1 1 1 1 1 1 1 XOR 1 1 0 0 0 0 0 1 uchCRCLo 0 0 1 1 1 1 1 0 uchCRCHi = auchCRCLo0 xFD 1 0 0 0

8、 0 0 0 1 2 ST 0 0 0 0 0 1 1 1 uchCRCLo 0 0 1 1 1 1 1 0 XOR uIndex 0 0 1 1 1 0 0 1 auchCRCH0 x39 =0 xC0 uchCRCHi 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 XOR uchCRCLo 0 1 0 0 0 0 0 0 1,uchCRCHi =auchCRCLo0 x39 = 0 x12 结果 0 x1241,例: x2=0 x02,0 x07; CRC_n= CRC16( x, 2);,压,3.2 Modbus协议通讯从站软件设计,(1).主站使用Modbus

9、 04号命令采集从站测量数据 (2).寄存器应用层定义,3.2.1 从站软件设计要求,寄存器内容,压力,温度,液位,流量,2000H,Modbus寄存器,实际设计考虑问题 (1). Modbus命令帧结束判定方法, (2).帧间隔控制方法 (3)如何解决通讯数据串位及数据残 缺等异常情况对通讯的影响.,3.2.2 从站软件设计内容,2004H,2008H,200CH,寄存器地址,1.接收数据 (1) 串口接收数据 (2) 根据主站MODUBS命令读寄存器。 (2)发送数据 将所读寄存器发送出去,主站一次可能读一个寄存器,也可能读多个寄存器。,3.2.3 从站接收命令帧方法,(1).设置一个定时

10、器,定时3.5 char时间 (2).每接收一个数据,启动定时器定时. (3).定时时间到,说明在3.5 char时间里没有通讯数据,表明帧结束, 在定时中断服务程序中处理Modbus 命令.,定时中断帧结束,读命令回答数据,启动定时器,3.5 char,地址,功能码,变量地址,变量数,CRC校验,主站发给从站读寄存器命令8byte,从站3.5char后回答数据,如何确定MODBUS帧结束?,帧间隔3.5char定时方法,ICR1(触发寄存器),计数器,PWM输出,3.2.4 从站程序设计(AVR MEGA64 CPU),void main(void) unsigned char i=0; u

11、nsigned long num=0; OutSet1480; /* R485 接收方向 */ Set1480Rxd; Delays(100); _CLI(); /* 关中断 UartInit(); /* UART初始化 TimeDelay=OscF*10/BaudRate0; /* 根据波特率设置定时时间 */ TCCR1B=(1=1000) /* 若没有通讯,则定时初始化串口 */ num=0; /*防止通讯死机*/ CloseINT0(); /*关通讯中断 */ UartInit(); /* 初始化串口 */ OutSet1480; /* 设置I/O口为输出方向 */ Set1480Rx

12、d; /* 设置RS485接收方向控制 */ OpenINT0(); /* 开通讯中断 */ ,(1).主程序,void UartInit(void) /* 设置通讯波特率 */ UBRR0L = (OscF/16/(BaudRate0+1)%256; UBRR0H = (OscF/16/(BaudRate0+1)/256; /* Uart0 发送和接收引脚使能 */ UCSR0B = (1RXEN0)|(1TXEN0); /* 设置帧格式: 8 个数据位, 1 个停止位 */ UCSR0C = (1URSEL0)|(1UCSZ01)|(1UCSZ00); UCSR0A = (1RXC0)|(

13、1TXC0)|(1UDRE0)|(1FE0); ,#pragma interrupt_handler usart0:iv_USART0_RXC void usart0(void) unsigned char combuf; combuf =UDR0; /* 读通讯数据 */ TIM16_WriteTCNT1(0 x0000); /* 清定时时间常数 */ TIM16_WriteICR1(TimeDelay); /* 设置定时3.5 char时间常数 */ TIFR|=(1ICF1); /* 定时记数器加,上限捕捉 */ TIMSK|=(1TICIE1); /* 启动定时中断 */ Recive

14、Buff_485ReceiveNum_485+=combuf; /* 存储通讯数据 */ ,(2).串口初始化,(3).UART0中断接收(只接收一个字节数据),#pragma interrupt_handler timedelay:iv_TIMER1_CAPT void timedelay(void) unsigned int i,x; unsigned int len; unsigned int start; unsigned int CheckSum; unsigned int buff2; if(ReceiveNum_485=8) TIMSK /* BYTE地址 */,(D). 定时3

15、.5char 中断服务,帧结束,union IntToChar U8 OTT2; U16 TTO; ;,SendBuff_4850=Address; SendBuff_4851=0 x04; SendBuff_4852=len*2; /* 字节数 */ for(i=0;i(len*2);i+) x=start+i; SendBuff_4853+i=LMAG_Cachex; /* 取数据 */ CheckSum = CRC16(SendBuff_485,(len*2)+3); /* 计算CRC */ CRC16Value.TTO=CheckSum; SendBuff_485(len*2)+3=CRC16Value.OTT1; SendBuff_485(len*2)+4=CRC16Value.OTT0; SendLen_485=(len*2)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号