最新FreeModbus笔记.docx
《最新FreeModbus笔记.docx》由会员分享,可在线阅读,更多相关《最新FreeModbus笔记.docx(10页珍藏版)》请在冰点文库上搜索。
![最新FreeModbus笔记.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/bae776f1-f359-4dd7-af20-e5d92d181b97/bae776f1-f359-4dd7-af20-e5d92d181b971.gif)
最新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=0.10416667(ms),这样,3.5个字符时间就大约是4ms,即定时器需要的中断时间
也就是串口在静默了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);
标题:
上海发出通知为大学生就业—鼓励自主创业,灵活就业2004年3月17日
eMBRTUInit(UCHARucSlaveAddress,UCHARucPort,ULONGulBaudRate,eMBParityeParity)
众上所述,我们认为:
我们的创意小屋计划或许虽然会有很多的挑战和困难,但我们会吸取和借鉴“漂亮女生”和“碧芝”的成功经验,在产品的质量和创意上多下工夫,使自己的产品能领导潮流,领导时尚。
在它们还没有打入学校这个市场时,我们要巩固我们的学生市场,制作一些吸引学生,又有使学生能接受的价格,勇敢的面对它们的挑战,使自己立于不败之地。
至此,Modbus的初始化工作完成。
串口中断被打开,超时定时器配置好。
据统计,上海国民经济持续快速增长。
03全年就实现国内生产总值(GDP)6250.81亿元,按可比价格计算,比上年增长11.8%。
第三产业的增速受非典影响而有所减缓,全年实现增加值3027.11亿元,增长8%,增幅比上年下降2个百分点。
eMBEnable()
但这些困难并非能够否定我们创业项目的可行性。
盖茨是由一个普通退学学生变成了世界首富,李嘉诚是由一个穷人变成了华人富豪第一人,他们的成功表述一个简单的道理:
如果你有能力,你可以从身无分文变成超级富豪;如果你无能,你也可以从超级富豪变成穷光蛋。
当串口接收到数据时发生中断,由串口中断程序处理USART1_IRQHandler()
功能性手工艺品。
不同的玉石具有不同的功效,比如石榴石可以促进血液循环,改善风湿和关节炎;白水晶则可以增强记忆力;茶晶能够帮助镇定情绪,缓解失眠、头昏等症状。
顾客可以根据自己的需要和喜好自行搭配,每一件都独一无二、与众不同。
随科技的迅速发展,人们的生活日益趋向便捷、快速,方便,对于我国传统的手工艺制作,也很少有人问津,因此,我组想借此创业机会,在校园内开个DIY创意小屋。
它包括编织、刺绣、串珠等,让我们传统的手工制作也能走进大学,丰富我们的生活。
(1)位置的优越性
2、价格“适中化”
400-500元1326%
Beadwrks公司还组织各国的“芝自制饰品店”定期进行作品交流,体现东方女性聪慧的作品曾在其他国家大受欢迎;同样,自各国作品也曾无数次启发过中国姑娘们的灵感,这里更是创作的源泉。
Modbus的主查询函数eMBPoll()