打印
[MCU]

【得瑟】尝试状态机编写 Modbus

[复制链接]
8044|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
frlop|  楼主 | 2013-9-26 11:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 frlop 于 2014-8-13 11:18 编辑

这两天在写Modbus通信程序,觉得很乱,所以画了流程图辅助。
以前在台企实习的时候见过他们用状态的方式写很漂亮的程序,匠人手记里也有对状态机的讲解。
所以自己安装自己的理解尝试用状态机写这个Modbus的程序。
如图把Modbus通信分成5个状态,每个状态的跳转条件,和每个状态下需要进行的程序操作及操作所在程序段全部表现出来。


程序已经写完了,通信基本OK,但数据很多的时候还是会有明显的丢包现象。

现在疑惑几个问题:
1. 这个流程图完全是按照自己的理解画的,没有参考过别人的流程图是如何绘制的,所以也不知道表不标准,就是自己撮能合理解。
2.用exel做流程图 我承认有点奇葩,大家作流程图大多用什么软件。
3.状态机的编程方式自己写完以后还是感觉不是很理解,在不同状态下切换时是否需要把变量和程序也完全区分开来?
因为原来在台企看到他们的程序,从一个状态跳转另一个状态时,就算变量和代码的重复性非常高,他们也是全部重新写一次,把两个状态下的代码和变量全部区分开。但自己这么做觉得是不是太繁琐了。

PS:附上代码
Src.zip (23.21 KB)


相关帖子

沙发
frlop|  楼主 | 2013-9-26 16:07 | 只看该作者
这么冷清。。。
自己沙发。

使用特权

评论回复
板凳
dirtwillfly| | 2013-9-26 16:31 | 只看该作者
呵呵,你的帖子我刚才看了一遍了。做的不错

使用特权

评论回复
地板
airwill| | 2013-9-26 19:19 | 只看该作者
从一个状态跳转另一个状态时,就算变量和代码的重复性非常高,他们也是全部重新写一次,把两个状态下的代码和变量全部区分开。但自己这么做觉得是不是太繁琐了。
是比较繁琐, 但是这样不容易出错, 特别是复杂的状态机时, 是个避免 bug 的一个好办法. 尽管我也不喜欢这么做.

使用特权

评论回复
5
frlop|  楼主 | 2013-9-27 08:13 | 只看该作者
dirtwillfly 发表于 2013-9-26 16:31
呵呵,你的帖子我刚才看了一遍了。做的不错

:handshake

使用特权

评论回复
6
触觉的爱| | 2013-9-27 10:35 | 只看该作者
看得出花了不少心思,顶起

使用特权

评论回复
7
q3742829| | 2013-9-27 11:13 | 只看该作者

使用特权

评论回复
8
frlop|  楼主 | 2013-9-27 12:19 | 只看该作者
触觉的爱 发表于 2013-9-27 10:35
看得出花了不少心思,顶起

之前一直移植的别人的Modbus程序在用,丢包严重,而且中断里逻辑也很混乱,非常难受。但主体的程序不是通信,所以一直没大改。
这几天整好空,就决定自己从头写一次。花了三天时间一边画流程图一边写。

使用特权

评论回复
9
shizaigaole| | 2013-9-27 13:12 | 只看该作者
感觉还是很乱!!!
modbus协议里面,规定 3.5个字符接收间隔,可以作为一桢的标志。

那种把串口驱动,数据接收,协议解析,应用层代码编写,搞得一锅粥似的,
无疑是很愚蠢的做法

使用特权

评论回复
10
Leeone| | 2013-9-27 13:47 | 只看该作者
创新点在excel

使用特权

评论回复
11
frlop|  楼主 | 2013-9-27 14:44 | 只看该作者
shizaigaole 发表于 2013-9-27 13:12
感觉还是很乱!!!
modbus协议里面,规定 3.5个字符接收间隔,可以作为一桢的标志。

这幅图只是数据接收,协议解析两个部分的程序,驱动层和应用层肯定是要分开的。
那么你觉得乱的地方就是我把数据接收和协议解析同步搞在了一起。
一开始我也是觉得3.5个字符做为一帧数据结束的唯一标识,但实际情况的在接收中有大量的情况是可以在接收中就判断错误直接放弃的。如第一个数据地址码就错了,直接放弃这一帧数据会比把数据全部接收过来在等待协议解析要效率高很多吧。
而且数据接和协议解析搞在一起的地方自己也很清楚,所以特别用不同的颜色标记出来,就是图中粉红色地方。

使用特权

评论回复
评论
shizaigaole 2013-9-27 16:10 回复TA
串口,是一种慢速设备,这种高效,大部分情况下,是没有必要的。 就是说,它的影响很小,也低效不到那里去, 
12
frlop|  楼主 | 2013-9-27 15:00 | 只看该作者
Leeone 发表于 2013-9-27 13:47
创新点在excel

因为在台企的时候看过他们用exel做的通信分析的流程图。已经n个月前的事了,凭**感觉模仿一下。

使用特权

评论回复
13
dqyubsh1| | 2013-9-27 15:09 | 只看该作者
记得freemodbus用状态机实现的,没研究,直接好用。

使用特权

评论回复
14
xlsbz| | 2013-9-27 22:23 | 只看该作者
可以写成三层

驱动  协议 和应用

驱动  对于接受来说 就是后台(中断服务程序),就是说中断服务程序不要出现与协议相关的东东
协议  就是modbus的实现,在while下(前台)写就可以
应用  就是具体的接收的数据干啥用了

使用特权

评论回复
15
xlsbz| | 2013-9-27 22:26 | 只看该作者
frlop 发表于 2013-9-27 14:44
这幅图只是数据接收,协议解析两个部分的程序,驱动层和应用层肯定是要分开的。
那么你觉得乱的地方就是 ...

3。5标示可以在中断里面做。

考虑效率,可以换成CAN 通信  以太网通信。通用性 可读性 比效率要重要的多。效率也不能当饭吃。

使用特权

评论回复
16
frlop|  楼主 | 2013-9-27 22:55 | 只看该作者
xlsbz 发表于 2013-9-27 22:26
3。5标示可以在中断里面做。

考虑效率,可以换成CAN 通信  以太网通信。通用性 可读性 比效率要重要的多 ...

确实如此,受教了,看来还需要花点时间再修改修改。

使用特权

评论回复
17
frlop|  楼主 | 2013-9-27 22:59 | 只看该作者
shizaigaole 发表于 2013-9-27 13:12
感觉还是很乱!!!
modbus协议里面,规定 3.5个字符接收间隔,可以作为一桢的标志。

受教了,其实自己也觉得这样做有点乱。既然用了状态机去做就应该把每个状态入口做的简介干净。求中断里的那一点点效率确实有点和自己一开始的为了简化思路做流程图的目的本末倒置了。回去再改过。

使用特权

评论回复
18
frlop|  楼主 | 2013-9-29 12:46 | 只看该作者
本帖最后由 frlop 于 2013-10-9 16:15 编辑

重新修改了程序和流程图,把数据接收和协议分析分开处理。


程序:
ModBus.zip (336.03 KB)

使用特权

评论回复
19
coody| | 2013-9-29 16:15 | 只看该作者
MODBUS是有种简单串口控制协议,直线型执行就可以了。

使用特权

评论回复
20
frlop|  楼主 | 2013-10-9 16:13 | 只看该作者
dwh000 发表于 2013-10-9 16:02
你的MODBUS设备用什么东西做的测试啊?
是MODSCAN32吗?

是的,是MODSCAN32,如图中所示,我T3.5的判断是>3也就是T4,所以不算严格。
我之前代码里(也就是帖子附件里的),定时器的时间是定的T1.5,所以判断>3也就是T6,也能来的。
后来我修改了定时器的时间为T1,目前通信也没有任何问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Stay foolish,stay hungry.

16

主题

835

帖子

3

粉丝