1、分析的目的
据说这东西是一个奥地利的代码仙人写的东西,查了一下奥地利,是中欧南部的内陆国,它拥有着悠久的文化和人文遗产。奥地利拥有许多闻名于世的作曲家,比如莫扎特、贝多芬、海顿、施特劳斯家族都因高超的音乐作品而闻名于世。
这不,跟艺术有着很深的渊源的国度,写出来的东西多少有点优雅而又浪漫,优雅永不过时,作为一个自诩浪漫主义派的攻城狮,我的目的显得简单而又浪漫:
1、学习一下这位仙人的代码结构和风格,看看他的优雅和浪漫,正确超越。
2、深入理解才能更好的在他的基础上进行发挥,设计出更好的产品,造福广大用户。
2、你能从我这篇文章中学到什么
首先,不打包票,话说满了容易打脸,所以能学到什么,因人而异,更多是希望我们心有灵犀。
其次,我个人是在项目的实践中抽出时间来进行总结的,总结出来的东西可能不完美,但至少是极具参考价值的,如果你的项目中也用到了FreeModbus,那么恭喜你,你又多了我一个同路人,给我点个赞,一起加油努力哦。
总之,三人行必有我师,你我皆是探路者,有幸遇见,期待一起破局。
从这里开始,下面是非常正经的技术文案
!注意:
1、本文仅对 FreeModbus 中的 Modbus-RTU 协议进行分析
2、FreeModbus 协议栈源码仅支持 Modbus-Slave(从机),这对我们下文的状态机分析有用。
3、函数调用关系
这里要先理顺一下各个函数的调用关系,使用树状图把就,用WPS的思维导图倒腾了半个小时,基本理顺。有哪里不清楚的可以在评论区发言。
* 提示:
如果下图不足以让你看清,可以在本文的资源中下载高清原图。
4、状态机和帧事件分析
4.1、状态机从哪里开始
或者可以这么说,哪里是状态机开始运行的触发开关。
我们要弄清楚一个问题:Modbus从机是属于被动节点,即有主机请求,从机才会应答。所以,从这里我们可以Get到,一切的一切,都应该从接收到主机的请求数据开始,这里很关键。
4.2、状态机和帧事件转换图
下图是 FreeModbus 的 RTU部分 状态机和帧事件转换图,总共包含两个状态机和一个帧事件。
接收状态机负责接收数据,接收完成一帧数据后,更新帧事件,通知主程序处理当前接收到的帧数据;
发送状态机负责发送数据,当应答数据被打包完成,发送将被触发,直到当前应答帧被发送完成。
帧事件主要实现三个功能:
1、帧校验(EV_FRAME_RECEIVED):判断接收到的帧是否合法,比如帧长度、CRC校验码、设备地址等是否正确或匹配;
2、帧处理(EV_EXECUTE):如果帧校验通过,则根据功能码,运行相应的功能处理函数,这些函数都被注册到xFuncHandlers中,并由用户自己去实现相关的代码,比如读写寄存器、控制线圈等;
3、帧应答(EV_EXECUTE):帧处理后,根据异常码进行应答数据打包,并触发发送状态机状态切换,发送数据。
* 提示:
如果下图不足以让你看清,可以在本文的资源中下载高清原图。
5、程序流程图
* 提示:
如果下图不足以让你看清,可以在本文的资源中下载高清原图。