搜索
bottom↓
回复: 22

尝鲜QM 4.0.0 -- 安装、注册、试用子机功能

[复制链接]

出0入0汤圆

发表于 2016-12-9 11:17:47 | 显示全部楼层 |阅读模式
本帖最后由 chencc8 于 2016-12-9 11:17 编辑

文章原地址:http://blog.csdn.net/chenbb8/article/details/53512032

参考1:http://www.ceeger.com/Manual/NestedStateMachines.html
参考2:http://www.uml-diagrams.org/state-machine-diagrams.html#submachine-state
参考3:http://www.state-machine.com/qm/index.html

已经一年多没有动静的QM,今天早上(2016-12-07)更新了QM 4.0.0,带来了宣传很久的子机图(Submachine Diagrams)和子机状态(Submachine States)功能。虽然只是一个甜点功能,但对于那些为状态图太大打印不到一张A4纸上,而苦恼的同学还是很有用的。





安装

很简单,然后一路点next在默认目录下安装就OK了。

注:刚发布的QM有个BUG,安装完毕后打开会报错:


解决的办法就是,先安装QM 3.3.0,然后直接在同一个默认目录下覆盖安装QM 4.0.0。目前这个BUG已经被修复,请到官网下载最新版的安装包(版本号还是4.0.0)。

另外,QM 4.0.0对应的是QPC、QPN和QPCPP的5.8.0或者更新的版本,请提前下载并安装好。




注册

在QM 4.0.0中,默认只能生成QHsm风格状态机代码,生成QMsm风格的状态机代码的功能,需要在注册后才能使用。

打开QP的例子也可以看到,官方提供的.qm文件中默认使用的状态机策略换成了QActive/QHsm,如果强行修改活动对象的类型为QMActive,那么在生成代码的时候会产生这样的一个错误提示:



幸好在5.8.0版的QP自带自带了一个可用到2017-01-31的评估许可(License )文件,比如在QPC_5.8.0里的就是QPC-EVAL-161130.qlc,它的文件格式类似于:

Bamboozle Technologies, Inc.
qpc
2016-12-24
eGizmo Shuffle 2nd Generation
#6031A51FBD8C7B9281C5E38C29E6EA9B18FA0F1C

第一行的是商业许可的名称(公司或者个人)

第二行的是QP框架的类型(qpc/qpn/qpcpp)

第三行的是准可的到期期限

第四行的是说明许可是用于单一产品还是产品线

第五行的是对许可的哈希加密,防止许可被篡改

购买过QP的用户在邮件里可以收到对应的许可文件;如果没有购买过,需要获取商用版许可的,请到http://www.state-machine.com/licensing/index.html#RequestForm中申请。

现在开始注册QM,首先QM的注册是写入到qm模型文件里的,对于每个新的.qm文件都要重新注册一遍,可将.qlc文件复制到C:\qm下,以方便注册。

打开qp中任意一个例子中的qm文件,点击工具条里的“View/Change License”图标,然后点击“Register Commercial QP License”按钮选择QPC-EVAL-161130.qlc。


OK注册成功


上图中的License File Relative to the Model复选框,指的是许可文件是否使用和qm模型文件的相对路径,因为我们统一放置qlc文件到C:\qm下了,并且暂时不需要拷贝到别的PC上执行,所以无需勾选。许可的注册是关联到单个qm模型文件里的,每次打开这个qm模型文件的时候,都会进行检查。

好的,顺利生成代码:




试用子机功能

子机图和子机状态是QM 4.0.0的主打功能,为了实现这个功能QP的5.8.0版本对状态机的派生方式做了修改。

在5.8.0之前版本QP中,QMsm是QHsm的基类;而在5.8.0版中,则反过来通过QHsm派生出QMsm。

对于官方而言这样修改的好处是,可以通过QHsm提供基本的层次状态机,它派生出的QMsm则增加更高级的功能(比如这次增加的子机状态),从而顺势让QM增加注册功能,限制普通用户使用高级功能- -!

另外,5.8.0版的QPN在这次更新中阉割了QMsm,想要使用子机图设计状态图,就要改用全功能的QPC和QPCPP。

这次更新官方提供了一个子机的例子,位于(qp)\qpc\examples\win32\calc1_sub之下,我们可以用它来和原有的calc1例子作为对比。

为了方便大家熟悉QM新增的子机功能,我们选择将原有的calc1例子一步一步的加入子机功能,注意先做好备份。

  • 回顾例子Calc

打开(qp)\qpc\examples\win32\calc1\calc1.qm,在Model Explorer窗口中修改Calc类的超类为QMsm。打开Calc类的状态图:



回顾下例子calc,这个例子出自psicc2的第2.4节,演示了如何设计一个计算器。其中,事件与键值对应的关系如下:

DIGIT_0_SIG:按键 ‘0’,输入数字
DIGIT_1_9_SIG:按键 ‘1’-‘9’,输入数字
POINT_SIG: 按键 ‘.’,输入小数点
OPER_SIG:按键 ‘+’ ‘-’ ‘*’ ‘/’,输入操作符
EQUALS_SIG:按键 ‘=’ ‘Enter’,得出结果
C_SIG:按键 ‘c’ ‘C’,撤销一个输入
CE_SIG:按键 ‘e’ ‘E’,撤销输入为空
OFF_SIG:按键 ‘ESC’,退出计数器

为方便理解,上面的状态图可以简化为:

可以看出这个计算器的操作流程是,首先在operand1状态输入第一个被操作数,然后接收到’+’ ‘-’ ‘*’ ‘/’之后跳转到opEntered状态等待输入下一个被操作数。之后在operand2状态里输入完第二个被操作数后,得出结果。

  • 分析1

在原有的Calc状态图中,operand1和operand2状态都含有较多的嵌套状态,并且内部的转换也较多,影响到了状态图的阅读。为了让状态图变得清晰,可以将operand1和operand2变为子机状态。

QM有两种添加子机图的方式,一种是直接添加子机图一般用于新编写的子机;一种是将状态图中的状态转换成子机图。下面先介绍第一种方式。

  • 添加子机图:方法1

以operand1为例,在Model Explorer窗口中的Calc类的SM属性下,右键添加子机:

将这个子机图的名字改成operand1,在Model Explorer窗口双击operand1子机的图标,会打开operand1子机图。

可以看到右侧工具条多了两个图标,上面的叫入口节点段(Entry-Point Segment,后面统一称为Entry-Point),下面的是出口节点(eXit-Point)。

在operand1子机中添加zero1、int1、frac1、negated1状态,并添加entry和exit动作。
拉动子机图的边框,调整子机图的大小:

  • 添加子机图:方法2

在原有的Calc状态图中,选中operand2状态并点击右键,选择“Add Sub-Machine from State”

很顺利的生成了operand2子机

删除operand2子机tran到外部的三个事件:OPER_SIG,EQUALS_SIG,CE_SIG。

  • 分析2

Calc状态图中的operand1状态下嵌套的,zero1、int1、frac1、negated1状态,都有一个外部的tran指向它们,所以子机需要设置4个Entry-Point。

同时,operand1状态通过在碰到3种事件的时候会tran到别的状态,因此还要给子机添加3个eXit-Point。

观察到,operand1和operand2子机实现的功能其实是一样的,对于功能类似的子机其实只要保留一个就好了。子机和子机状态的关系可类比于,类和对象,一个子机可以实例化出多个子机状态。本文保留的是operand1子机,将它改名为operand,并将它内部的几个状态改名为zero、int、frac、negated。

  • 增加Entry-Point和eXit-Point

给operand1子机增加Entry-Point和eXit-Point:



值得注意的是eXit-Point需要连接到自转换上(如上图中的CE事件)。

子机状态作为一个状态,可以像普通状态那样,拥有entry、exit action和initial transition,并处理事件(如上图中的CE_SIG事件),并通过这个事件直接tran到别的状态上,而无需通过eXit-Point。所以本次示范中,就没给OPER_SIG和EQUALS_SIG事件设置eXit-Point。

  • 添加子机状态

打开Calc状态图,在右侧工具条中,可以看到相对过去的QM在工具条下方增加了两个图标,
上面的叫子机状态(Submachine States),下面的是出口节点段(eXit-Point Segment,后面统一称为eXit-Point)。

点击子机状态图标,在Calc状态图放置一个子机状态,然后修改它的类型为operand,并命名为operand1:

将原有指向operand1状态内部嵌套zero1、int1、frac1、negated1状态上事件tran线连接到operand1 子机状态的4个Entry-Point上。

点击工具条上的eXit-Point图标,从operand1 子机状态的ce eXit-Point连接到ready状态里嵌套的begin状态上。并将operand1状态原有的CE事件的action拷贝到ce eXit-Point的action中。

然后,将operand1状态上的OPER_SIG和EQUALS_SIG事件也连接到operand1 子机状态上。

最后在Calc状态图中选中operand1状态,然后在Model Explorer窗口中的高亮的operand1标签下的几个标签统统删掉(因为operand1 子机状态在这里被放置到了operand1状态内部,QM会误认为它是被operand1状态内嵌的,注意别删错了)。

对于operand2状态也用以上的方法处理,状态图被简化成了:


  • 编译运行

注:在make工程之前先要保证:安装了MinGW,并且将make.exe的目录和QPC的目录,设置到环境变量中。本文不做展开,具体请百度。

make后,执行dbg/calac1.exe后,并测试44+58*61-2=?


结果变成了44 + 58*61- 2 = 46

原版的calac1也是这样的结果,有兴趣的可以修改下。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2016-12-9 11:33:51 | 显示全部楼层
沙了个发                     

出0入0汤圆

发表于 2016-12-9 11:47:13 | 显示全部楼层
能给几个QM实际项目的例子吗,想了解一下

出0入0汤圆

 楼主| 发表于 2016-12-9 12:25:11 | 显示全部楼层
本帖最后由 chencc8 于 2016-12-9 12:26 编辑
dreambox 发表于 2016-12-9 11:47
能给几个QM实际项目的例子吗,想了解一下


看下书本的几个例子就够了,blinky DPP GAME history reminder 之类的
主要的设计技巧在书本第五章都有~一般不方便共享项目。

编辑:
修改错字

出0入42汤圆

发表于 2016-12-9 13:25:43 | 显示全部楼层
44 + 58*61- 2 = 46  这是什么道理?

出0入0汤圆

 楼主| 发表于 2016-12-9 13:57:22 | 显示全部楼层
liyang121316 发表于 2016-12-9 13:25
44 + 58*61- 2 = 46  这是什么道理?

忘了加删除符了
应该是
44 + 58*61-  2 = 46
这个状态机忽略了58*61- 这几个输入。
这个特点在简化状态图中就能看出,它的结果需要在operand2状态下,按=号才能得到,接着才能继续输入下一个+-*/操作。

出0入0汤圆

发表于 2016-12-9 21:43:37 | 显示全部楼层
学习QP,谢谢分享

出10入18汤圆

发表于 2016-12-9 22:11:54 | 显示全部楼层
还是继续用旧版本吧,挺爽的用着

出10入18汤圆

发表于 2016-12-9 22:14:06 | 显示全部楼层
如果QM能通过jlink dump内存数据,反馈到状态图中,同步CPU的运行状态,那可玩性就翻倍再翻倍了

出20入0汤圆

发表于 2016-12-9 22:59:11 | 显示全部楼层
谢谢分享。

出0入0汤圆

发表于 2016-12-27 17:16:12 | 显示全部楼层
之前看了看 qp c++

出0入0汤圆

发表于 2016-12-27 17:21:24 | 显示全部楼层
谢谢分享!!!

出0入0汤圆

 楼主| 发表于 2017-2-16 11:33:19 | 显示全部楼层
QPC-EVAL-161130.qlc的license虽然现在已经过期了,但试用了下QM 4.0.0没发现会对什么功能造成影响,仍然能正常的生成代码。不用怕因为新版的QP没发布,没有新的评估license,而用不了QM了。
大家放心的更新QM和QP吧!

出0入0汤圆

发表于 2017-5-30 09:55:57 | 显示全部楼层
子状态的功能太实用了,可以不用把一个QM画的状态图弄成一大张

出0入0汤圆

发表于 2017-5-30 09:57:44 | 显示全部楼层
新版的QP带了单元测试功能,期待楼主新作

出0入0汤圆

发表于 2017-6-6 14:03:27 | 显示全部楼层
有什么入门书推荐一下?

出0入0汤圆

 楼主| 发表于 2017-6-6 20:48:58 | 显示全部楼层
meirenai 发表于 2017-6-6 14:03
有什么入门书推荐一下?

Practical UML Statecharts in C,C++, Second Edition

出0入0汤圆

发表于 2017-6-6 21:35:52 | 显示全部楼层
这个可视化程度高,码农要搬砖去了。

出0入0汤圆

发表于 2018-2-5 18:21:13 | 显示全部楼层
楼主,许可证还可以用不,能否上传啊,5.8.0不能下载了

出0入0汤圆

发表于 2018-2-5 19:49:28 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

 楼主| 发表于 2018-2-6 08:36:56 | 显示全部楼层
bbglx 发表于 2018-2-5 18:21
楼主,许可证还可以用不,能否上传啊,5.8.0不能下载了

每个版本都会自带licence,就算过期也只是提示一下,并不会影响生成代码

出0入0汤圆

发表于 2018-2-6 10:28:34 | 显示全部楼层
chencc8 发表于 2018-2-6 08:36
每个版本都会自带licence,就算过期也只是提示一下,并不会影响生成代码

或许能编译是因为这个例子用的是QHsm/QActive类
改成QMsm/QMActive类就编译不了了,提示no valid license for generating QMsm state machines。
官网更新记录里面有写到
Starting from this version, a valid QM license certificate is required to generate code with the QMsm-style state machine implementation strategy. Evaluation licenses are included in QP/C and QP/C++ 5.8.0. Extensions of these evaluation licenses will be granted liberally after filling out the no-obligation License Request Form.

出0入0汤圆

 楼主| 发表于 2018-2-6 14:22:42 | 显示全部楼层
bbglx 发表于 2018-2-6 10:28
或许能编译是因为这个例子用的是QHsm/QActive类
改成QMsm/QMActive类就编译不了了,提示no valid license ...

反正以前我用了是可以的,你自己一个个试下老版本那个OK咯
https://sourceforge.net/projects/qpc/files/?source=navbar
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 16:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表