FreeModbus-笔记_第1页
FreeModbus-笔记_第2页
FreeModbus-笔记_第3页
FreeModbus-笔记_第4页
FreeModbus-笔记_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、FreeModbus-笔记FreeModbus 笔记Modbus-RTU是基于485总线基础上一个主从协 议,主站主动发起通信,从站接收主站的消息并 响应主站的指令。这里主要探讨FreeModbus中的RTU从站协议的 实现。从站的串口每次接收一个字节数据,并产生串口 中断(中断打开),那么串口中传过来的一个个 字节如何组成一个Modbus的数据帧呢?这是通过一个重要的参数T3. 5来进行判断的。T3. 5就是串口传递3. 5个字符的时间,这个 时间和波特率相关,不同波特率下,T3. 5时间 不等。3.5个字符时间区分不同的帧,即接收到的两个字符之间时间间隔小于35 个字符时间时认为是同一个帧

2、的,如果间隔大于3.5个字符时间则认为是不同帧 的,在一般的串口逋信中,发送1个字符需要:1位起始位,8位数据位,1位 校验松可允,1位停止位,总共1+8+1+1 = 11位,3.5个字符时间就是3.5* 11 = 38.5位,假如波特率是9600,那么传输1位的时间是100W9600 = 00416667(ms), 这样,3.5个字符时间就大约是4 ms,即定时器需要的中断时间串行口数据帧T>T3.51个字节口1个字节Ri个字节)T 11个字节, t>T3.5 -> 心(T<T3.5Modbus数据帧也就是串口在静默了 T3. 5秒以后收到的第一个字节作为一个Modb

3、us数据帧的首字节,然后收 到的字符间隔只要不超出T3. 5的时间间隔,都 作为这一帧数据来处理。当串口在T3. 5没有 收到数据时,则认为当前主站Modbus发送完了 一个数据帧。可以进行后面的Modbus数据帧处 理了。再收到的数据回作为下一个Modbus数据 帧的首字节。接收一个字节,是由串口中断来进行完成的,判 断是否超时是由定时器中断来完成的。因此以上 看是很清楚的一个协议流程需要串口和定时器 配合共同完成。所以在看RTU实现协议时一定要 记住这点。从站主要是接收,被动响应,所以先分析接收机 的状态:状态机接收状态包含以下几种:STATE_RX_INIT, 初始态*/STATE RX

4、 IDLE, 空闲态*/STATE_RX_RCV, 帧数据*/STATE_RX_ERROR 帧*/接收/*!接收机在/*!接收机在/*!接收到一/*!错误数据状态机转换图:设置初态I> 心动T3S定时串口收到一个字节重启T3.5开始卜一个T3.5延迟cMB Enabled)eMBRTUStartO状态机的转换不是由一个函数来确定的,是由多 个函数共同作用的结果。主要要T3. 5的定时中 断和串口的接收中断。所以在程序一开始要对串口和定时器进行正确 的设置。当初始化完毕后,接收状态机初始态是 STATE_RX_INIT,同时T3.5定时器启动。如果在 T3.5定时到来之前,串口收到了一个字

5、节,则 认为是还没准备好的情况下,总线发起的一次 Modbus传输,此时这帧数据是不处理的,所以, 要等到这一帧数据传送完(T3.5超时)。当发生T3. 5超时事件时,说明总线上的数据帧 已经传完,处于空闲状态,为发起下一帧数据传 输做好了准备。所以接收状态机转换为STATE_RX_IDLE,同时发送一个 EV_READY 事件, 告诉Modbus以及准备好接收数据了。同时关闭 T3.5定时。在STATE_RX_IDLE状态下,只会接收串口数据来 触发状态转换(定时被关闭)。当接收到一个字 节时,认为总线开始了一个新的数据帧的传输, 把这个字节保存在Modbus数据缓冲区,并将缓 冲区指针加1

6、,并将接收状态机转换为STATE_RX_RCV。在STATE_RX_RCV状态下,接收到一个新字节, 将该字节保存在缓冲区,并将缓冲区指针加L 判断接收的字节总长是否最大帧长,如果不大 于,继续保持STATE_RX_RCV状态,等待接收下 一个字节或超时(接收完成)。当大于最大帧长, 说明接收到了错误帧。状态转到 STATE_RX_ERRORo在STATE_RX_RCV状态下,产生了一个T3.5超时, 此时认为总线已经发送完成一个Modbus数据 帧,将状态转换到STATE_RX_IDLE,等待下一个 数据帧到来。同时触发EV_FRAME_RECEIVED事 件,告诉ModbusPoll已经成

7、功接收一帧数据,可以解析并处理了。在STATE_RX_ERROR状态下,接收到再多的字节 都认为是错误的,所以一直停留在错误态,直到来了一个T3. 5超时事件,此时认为总线上错误 的数据帧发送完毕,总线静默,为下一个数据帧 准备好!接收状态机转换为STATE_RX_IDLE。Modbus的初始化流程:ModBus初始化:1、设置从机号2、设置eMode (RTU)3、设置波特率4、设置T35定时器eQueuedEvent 为空 eMBState = STATE_DISABLEDModBus 使能:eMBState =1、置端口为接收状态STATE.ENABLED2、开端口定时功能eRcvSta

8、te =此时串口中断开,定时中断开STATE_RXNIT:以下是FreeModbus的各个功能函数解析:1、/初始化 Modbus 协议eMBInit(MB_RTU, Slave_Adress, 0, 115200, MB_PAR_NONE);返回状态码eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBParity eParity )根据超时时间初始化定时器3.5个字符时间区分不同的顿,即 接收到的两个字符之间时间间隔 小于3.5个字符时间时认为是同一 个帧的,如果间隔大于3.5个字符 时间则认为是不同帧的

9、,在一般 的串口通信中发送1个字符需 要:1位起始位.8位数据位 1位 校验位(可无).1位停止位,总共 1+8+1 + 1 = 11位.3.5个字符时间 就是3.5'11 =38.5位,假如波特 率是9600 .那么传输1位的时间是 KXXV9600 = 0.10416667(ms) .这 样.3.5个字符时间就大约是4 ms.即定时器需要的中断时间xMBPortTimersInitO否初始化是否成功状态码=MB EPORTERR返回状态码至此,Modbus的初始化工作完成。串口中断被打开,超时定时器配置好。eMBEnable ()置端口为接收状态开端口定时功能在端口使能函数中设置485的收发状态vMBPortSerialEnable( TRUE. FALSE );,vMBPortTimersEnable();返回当串口接收到数据时发生中断,由串口中断程序 处理 USARTl_IRQHandler ()在RTU模式.

温馨提示

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

评论

0/150

提交评论