- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
FreeModbus 笔记
FreeModbus 笔记Modbus-RTU是基于485总线基础上一个主从协议,主站主动发起通信,从站接收主站的消息并响应主站的指令。这里主要探讨FreeModbus中的RTU从站协议的实现。从站的串口每次接收一个字节数据,并产生串口中断(中断打开),那么串口中传过来的一个个字节如何组成一个Modbus的数据帧呢?这是通过一个重要的参数T3.5来进行判断的。T3.5就是串口传递3.5个字符的时间,这个时间和波特率相关,不同波特率下,T3.5时间不等。3.5个字符时间区分不同的帧,即接收到的两个字符之间时间间隔小于3.5个字符时间时认为是同一个帧的,如果间隔大于3.5个字符时间则认为是不同帧的,在一般的串口通信中,发送1个字符需要:1位起始位,8位数据位,1位校验位(可无),1位停止位,总共 1+8+1+1 = 11位,3.5个字符时间就是 3.5 * 11 = 38.5位,假如波特率是9600,那么传输1位的时间是1000/9600 = 0ms) ,这样,3.5个字符时间就大约是 4 ms ,即定时器需要的中断时间也就是串口在静默了T3.5秒以后收到的第一个字节作为一个Modbus数据帧的首字节,然后收到的字符间隔只要不超出T3.5的时间间隔,都作为这一帧数据来处理。当串口在>T3.5没有收到数据时,则认为当前主站Modbus发送完了一个数据帧。可以进行后面的Modbus数据帧处理了。再收到的数据回作为下一个Modbus数据帧的首字节。接收一个字节,是由串口中断来进行完成的,判断是否超时是由定时器中断来完成的。因此以上看是很清楚的一个协议流程需要串口和定时器配合共同完成。所以在看RTU实现协议时一定要记住这点。从站主要是接收,被动响应,所以先分析接收机的状态: 接收状态机接收状态包含以下几种:STATE_RX_INIT, /*! 接收机在初始态 */STATE_RX_IDLE, /*!接收机在空闲态 */STATE_RX_RCV, /*! 接收到一帧数据 */STATE_RX_ERROR /*! 错误数据帧 */状态机转换图:状态机的转换不是由一个函数来确定的,是由多个函数共同作用的结果。主要要T3.5的定时中断和串口的接收中断。所以在程序一开始要对串口和定时器进行正确的设置。当初始化完毕后,接收状态机初始态是STATE_RX_INIT,同时T3.5定时器启动。如果在T3.5定时到来之前,串口收到了一个字节,则认为是还没准备好的情况下,总线发起的一次Modbus传输,此时这帧数据是不处理的,所以,要等到这一帧数据传送完(T3.5超时)。当发生T3.5超时事件时,说明总线上的数据帧已经传完,处于空闲状态,为发起下一帧数据传输做好了准备。所以接收状态机转换为STATE_RX_IDLE,同时发送一个EV_READY事件,告诉Modbus以及准备好接收数据了。同时关闭T3.5定时。在STATE_RX_IDLE状态下,只会接收串口数据来触发状态转换(定时被关闭)。当接收到一个字节时,认为总线开始了一个新的数据帧的传输,把这个字节保存在Modbus数据缓冲区,并将缓冲区指针加1,并将接收状态机转换为STATE_RX_RCV。在STATE_RX_RCV状态下,接收到一个新字节,将该字节保存在缓冲区,并将缓冲区指针加1,判断接收的字节总长是否>最大帧长,如果不大于,继续保持STATE_RX_RCV状态,等待接收下一个字节或超时(接收完成)。当大于最大帧长,说明接收到了错误帧。状态转到STATE_RX_ERROR。在STATE_RX_RCV状态下,产生了一个T3.5超时,此时认为总线已经发送完成一个Modbus数据帧,将状态转换到STATE_RX_IDLE,等待下一个数据帧到来。同时触发EV_FRAME_RECEIVED事件,告诉ModbusPoll已经成功接收一帧数据,可以解析并处理了。在STATE_RX_ERROR状态下,接收到再多的字节都认为是错误的,所以一直停留在错误态,直到来了一个T3.5超时事件,此时认为总线上错误的数据帧发送完毕,总线静默,为下一个数据帧准备好!接收状态机转换为STATE_RX_IDLE。Modbus的初始化流程:以下是FreeModbus的各个功能函数解析:1、//-----初始化Modbus协议------------------------eMBInit(MB_RTU, Slave_Adress, 0, 115200, MB_PAR_NONE);eMBRTUInit( UCHAR ucSlaveAddress, UCHAR ucPort, ULONG ulBaudRate, eMBP
您可能关注的文档
最近下载
- 《篮球训练》教学大纲.pdf VIP
- 广西桂林理工大学南宁分校招聘笔试真题2024.docx VIP
- 新大陆物联网平台操作流程.docx VIP
- Fronius伏能士 TPS 270i C Pulse MIG.MAG电源操作手册.pdf VIP
- 电焊安全技术交底.doc VIP
- 城市轨道交通运营管理毕业论文-关于铁路客运服务质量的调查与探讨.docx VIP
- 2025福建莆田市城市建设投资开发集团有限公司招聘30人考试备考题库及答案解析.docx VIP
- 物联网全栈智能应用实训系统设备接线图V2.0.pdf VIP
- 柔性触摸屏及全贴合生产项目投资计划书.pptx VIP
- 《食品安全与营养健康》课件.ppt VIP
文档评论(0)