本帖最后由 史上最强 于 2012-8-12 21:24 编辑
下面我对Stateflow做一个简要介绍。Stateflow是基于有限状态机,对于事件的建模工具。说多了大家也不爱听,我就讲一会儿用的上几个要点,一个时刻必须停留在某个状态中(图中的长方形)。
下面我讲一下Simulink框图的意思,左边的阶跃函数相当于超声波传感器,0s到10s为50,也就是传感器离物体比较远。20s到30s的时候为10,也就是传感器离物体比较近。30s到80s的时候为50,也就是距离变远了。然后经过一个Chart模块,输出两个电机的转速,分别给示波器看波形。我想这个流程大家也看懂了。其中Step函数的参数以及波形如图3, 图4, 图5所示。
然后就是今天的重头戏Chart模块了,其中图1的Chart就是Stateflow,点开后如图2所示。首先数据从左上角的箭头进到Straight_line状态中并停留在状态中,进入状态的时候并修改输出变量MotorL与MotorR为50,也就是转速为50。当传感器数值小于20的时候,进行状态转移,移动到Turn_right状态中,并修改输出变量MotorL与MotorR进行转弯。延时59s后(这个我是为了测试方便,实际自己变成可以改成0.5s,或者经过测试),也就是第60s的时候转移到Straight_line状态中。其中输出变量就是MotorL和MotorR。输入变量是Sensor。大家可以从图1中看到。
测试80s后输出的数据如图6,图7所示。
状态机不仅仅可以这样串行工作,也可以进行并行工作。没有人提问相关问题,我也就不再建模解决了。 现在可以验证说明我的模型的正确性后,把输入输出模块去掉,连接NXT硬件模块,如图8所示,然后Crit+B就可以生成代码了
结语:Stateflow这种状态机的建模,比C语言要简练许多,我可以生成标准C文件让大家看看生成代码的简练程度。Simulink建模的好处就是建立模型简单,底层驱动不用自己编写,有现成的模块。下面附上状态机的代码,会发现MATLAB生成的代码规范性很强,而且效率很高。(代码看着长的原因有数据初始化,还有就是都是注释) |