如何使用stateflow
一.打开simulink,新建一个model(保存为time.mdl),在simulink的左边找到stateflow并选中他,将右边的chart拖入新建的model中,双击这个chart,就出现了stateflow的编辑器,先介绍一下这里面能画的东东(在左边的工具栏上)
1.左边工具栏上第一个图标是方框似的东东,将它拖入编辑器中,就表示一个状态(state),双击它就可以在其中写一些命令,格式如下(%后面的是我自加的,方便解释):
name/ %此状态的名称
entry:entry action %刚转换到此状态时执行entry action
during:during action %在此状态之中时执行during action
exit:exit action %退出此状态时执行exit action
on event_namen event_name action %当某事件发生时执行on event_name action
2.左边工具栏上第二个图标是一个圆中有个H的东东,它的名字叫做历史节点(History Junction) ,可将他拖入一个状态框中(就是上面说的那个),一旦一个状态框中有这个历史节点,在退出这个状态时会将这个状态的一些信息保存下来,当下次再进入此状态时,此状态的初始状态就会是前面保存过的那些信息。
3.左边工具栏上第三个图标是一个一根线指向一个方框的东东,叫默认转换(default transition),把他拖到一个状态的旁边,它就会指向一个状态,表示系统启动后将首先进入这个状态。
4.左边工具栏上第四个图标(他的样子太复杂了,不描述了,反正是最后一个,呵呵)代表的东东,叫节点(Junction),它是方便画状态图的,当各个状态之间的转换很复杂时,可以设立中间节点,将一些相同的转换指向它,然后再由它指向各个状态(或另一个中间节点)
5.还得介绍一下画转换线(transition),将鼠标放在一个状态的旁边,当它变成+形状的时候,按下左键不动,就会拉出一条线来,当拉到另一个状态旁边时松开左键,这样就画出了一条由一个状态指向另一个状态的转换线,选中这条线,将鼠标停留在上面,鼠标会变成一个I的样子,这时按下鼠标,就可以在上面写语句,例:switch(switch事件使状态转换)或[output>maxtime](当此条件满足时进行状态的转变)。
二.再介绍一下stateflow是怎样跟simulink通讯的,在stateflow编辑器中点tool菜单下的explore,在左边支开time,选中chart,我们将在此添加一个事件和两个数据(计数器所需要的)。
1.点Add菜单下event,在右边就新产生了一行,将它的名字(name)改成switch,范围(scope)改成input from simulink,触发器形式(Trigger)改成Rising(其实这儿无所谓),此时你看看time.mdl,是不是chart模块上方多了一个上升的标志,此时在time.mdl添加一个pul generator(在simulink\sources里面),将他的输出接到chart的上方,就表示每当pul generator产生的信号上升时,switch事件发生。
2.再添加两个data,点Add菜单下data,在右边将他的名字改成output,scope改成output to simulink,此时time.mdl中chart就多出来一个输出端口,它就是要给simulink用的,在这里output就是计数器的输出(我们的目标),可以接上一个scope或display看输出结果(simulink/sinks下,怎么添加及连线就介绍了),再点add--data,将他的名字改成maxtime,scope改成constant,表示他是一个常量,将在matlab的workspace里设定,这里的含义就是计数器的最大值,当计数器的输出达到这个最大值时,输出将自动清零,表示重新开始计数。添加完成后,就可关闭explore了。
三.有了上述的准备,就可以在stateflow中画状态流图了,还是在stateflow编辑器里,从左边的工具栏上拉出一个状态来(上面介绍过方法了),双击它,在其中写上 ret/ %此状态的名称为ret
entryutput=0; %当进入此状态时,将output赋值为0,表示将计数器输出清零
再拉入一个默认转换(History transition,左边工具栏上第三个),拖到ret状态的旁边,使它指向ret状态,这样就表示ret状态将是系统启动后第一个进入的状态。再拉入一个状态,在其中写上 count/ %此状态的名称为count
entryutput++; %当进入此状态时,output加1,表明计数器记一次数此时再拖入一个节点(Junction,左边工具栏上第四个,其实可以不用,这儿是介绍一下他的用法),然后画两条转换线(transition,上面介绍怎么画了),一条由ret状态指向这个节点,一条由count状态指向这个节点,在这两条线都写上switch,表示一旦switch事件发生,不管当前是哪个状态,都将转换到此节点上来(跟simulink联系来讲,就是当time.mdl里的pul generator的信号上升时,就将产生状态的转变)。然后再画两条转换线,一条由这个节点指向ret状态,在线上写上[output>=maxtime],表示一旦output超过最大值时,将进入到ret状态(将计数器清零),另一条线由这个节点指向count状态,在线上写上[output
stateflow怎么删除输入口接口
看了下上面的答案,呵呵了
不多吐槽,点开model explorer 位置在这里
点开后如下图所示
选择你想改名或者删除的变量,键盘上按下Delete即可
如何使用stateflow的event触发
event触发有三种方式,分别local 状态图内部发挥作用,Input from simulink,从simulink框图输入到statflow中,也就是stateflow外部触发事件,最后一种是Output to simulink。是从stateflow框图输出到simulink中的,即利用stateflow定义的时间驱动或触发其他stateflow框图或子系统动作
stateflow调用c仿真不对
需求分析
在Simulink仿真开发中,我们经常会遇到需要调用已有的c代码或是出现仿真模型不易实现的c代码情形。此时,如果使用模块或是m语言开发,将会降低开发效率。
2 解决方案现状
基于以上情况,在的maltab2018b后版本中,推出的C Caller模块可以支持用户快捷实现外部c代码的调用。而在老的版本中,常用的有legacy code tool、s-function和stateflow等调用方法。
相比于legacy code tool、s-function的方式,stateflow的调用方法简单直观且不用编写m文件,底层的实现方式和C Caller是相似的,因此本文对stateflow调用C代码的方法进行阐述。
3 仿真案例
3.1 模型文件的路径结构
在simulink环境中以SVPWM调制信号的实现方式为例。首先在模型的文件夹路径下新建文件夹Custom_Code,将需要调用的c代码放在该文件夹下。
模型及c文件路径
3.2 文件内容示例
在顶层头文件中声明各个功能模块头文件,并在各功能模块头文件中声明应用层函数。
顶层头文件
功能模块头文件
3.3 模型参数配置
同时打开模型的设置界面,在simulation target选项卡下进行设置。对于Inrt custom C code in generated选项卡,该处的语句会在运行时添加进stateflow生成的代码中,最终嵌入到编译生成的动态链接库里面。对于Additional build information选项卡,需要填写头文件路径、.c文件、库文件和宏定义,表示除了自动生成的文件外还需要编译的文件和文件所在的路径。
将模块化c文件中顶层的头文件的声明添加在Inrt custom C code in generated->Header Flie中,若需要在模型初始化阶段和终止阶段执行相关指令可在Initialize function和Terminate function中进行添加。同时在Additional build information->Include directories中添加头文件的路径。将模块化c文件中的源文件添加在Additional build information->Source file中。
此处需要说明的是,在Code Generation的选项卡中,也存在类似的custom code选项卡,该处填写相关文件信息只会在代码生成的文件中体现,不会在仿真运行中调用。
头文件添加
源文件添加
3.4 stateflow相关设置
在stateflow中,将运行语言设置为c语言,采样时间和代码执行周期保持一致,在代码中有位运算时可以使能位运算。
stateflow配置
在stateflow的状态流中调用应用函数。
stateflow调用应用函数
3.5 仿真结果
运行仿真后,可以看到stateflow已经成功调用了c代码。
仿真结果
4 结论
本文展示了一种stateflow调用用户自定义c代码的方法,通过配置模型、代码文件的相关设置,实现了c代码在simulink仿真中的快速集成。该方法可以实现c文件的模块化调用,快速构建清晰的c文件及仿真模型架构,提升代码开发和算法调试的效率。
注:(1) 在代码修改后,有时会遇到stateflow不会重新编译的问题,需要删除上一次运行产生的动态链接库文件,或者通过对stateflow状态流进行修改,触发stateflow重新编译生成新的动态链接库。
(2) 该方法可以直接将c代码中常用的结构体、宏定义、联合体和枚举量嵌入,无需任何修改即可进行仿真。
(3) 该方法可以在simulink模型中,使用不同的chart对应用层函数同时调用,实现了代码模型的模块化开发。
怎样设置Stateflow编辑窗口的颜色
3、步骤:
①打开VisualStudio2010,单击”工具“,在下拉菜单中单击”选项“:
②在弹出的窗口,”环境“下找到”字体和颜色“单击,然后修改项背景色,然后确定即可完成代码窗口颜色的修改:
4、注意:修改方式并通用于所有的VisualStudio,例如vs6修改方式有所不同。