chencc8 发表于 2016-12-9 11:17:47

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

本帖最后由 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也是这样的结果,有兴趣的可以修改下。

WM_CH 发表于 2016-12-9 11:33:51

沙了个发                     

dreambox 发表于 2016-12-9 11:47:13

能给几个QM实际项目的例子吗,想了解一下

chencc8 发表于 2016-12-9 12:25:11

本帖最后由 chencc8 于 2016-12-9 12:26 编辑

dreambox 发表于 2016-12-9 11:47
能给几个QM实际项目的例子吗,想了解一下

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

编辑:
修改错字

liyang121316 发表于 2016-12-9 13:25:43

44 + 58*61- 2 = 46这是什么道理?

chencc8 发表于 2016-12-9 13:57:22

liyang121316 发表于 2016-12-9 13:25
44 + 58*61- 2 = 46这是什么道理?

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

end2000 发表于 2016-12-9 21:43:37

学习QP,谢谢分享

qtechzdh 发表于 2016-12-9 22:11:54

还是继续用旧版本吧,挺爽的用着

qtechzdh 发表于 2016-12-9 22:14:06

如果QM能通过jlink dump内存数据,反馈到状态图中,同步CPU的运行状态,那可玩性就翻倍再翻倍了

talkingbeast 发表于 2016-12-9 22:59:11

谢谢分享。

hyf88 发表于 2016-12-27 17:16:12

之前看了看 qp c++

stevenh 发表于 2016-12-27 17:21:24

谢谢分享!!!

chencc8 发表于 2017-2-16 11:33:19

QPC-EVAL-161130.qlc的license虽然现在已经过期了,但试用了下QM 4.0.0没发现会对什么功能造成影响,仍然能正常的生成代码。不用怕因为新版的QP没发布,没有新的评估license,而用不了QM了。
大家放心的更新QM和QP吧!

3444542 发表于 2017-5-30 09:55:57

子状态的功能太实用了,可以不用把一个QM画的状态图弄成一大张

3444542 发表于 2017-5-30 09:57:44

新版的QP带了单元测试功能,期待楼主新作

meirenai 发表于 2017-6-6 14:03:27

有什么入门书推荐一下?

chencc8 发表于 2017-6-6 20:48:58

meirenai 发表于 2017-6-6 14:03
有什么入门书推荐一下?

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

TANK99 发表于 2017-6-6 21:35:52

这个可视化程度高,码农要搬砖去了。

bbglx 发表于 2018-2-5 18:21:13

楼主,许可证还可以用不,能否上传啊,5.8.0不能下载了

eliterxzgxu 发表于 2018-2-5 19:49:28

感谢楼主分享

chencc8 发表于 2018-2-6 08:36:56

bbglx 发表于 2018-2-5 18:21
楼主,许可证还可以用不,能否上传啊,5.8.0不能下载了

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

bbglx 发表于 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.

chencc8 发表于 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
页: [1]
查看完整版本: 尝鲜QM 4.0.0 -- 安装、注册、试用子机功能