Codesys代码代写,程序开发,软件定制,bug修改,问题咨询:个人主页
1 测试
在initing状态中测试(entry)进入动作,(exit)出去动作,内部动作,外部动作 四种类型的执行做了如图所示的测试;
获得结论:
1:即使initing的跳转条件一直是true,也会执行initing的入口动作,内部动作,外部动作;
2:第一次扫描得知initing的跳转条件为true,第二次扫描的时候只会执行外部动作,出去动作;
3:initing的动作执行顺序是,先执行内部动作,后执行外部动作;
4: 如果在initing 内部动作中在嵌套子状态sfc,父状态转移会执行父的exit动作,子状态如果是因为父状态转移而不执行,子状态的exit动作不会执行,类似history历史状态,下次进入子状态会继续紧接着执行;
2 隐式的变量
在创建sfc中的步和动作(内部动作,不是关联动作)的时候,隐式的创建如下类型,在对应的库中可以查看类型;
常用的是 ._x:强制下一个周期的激活状态(测试发现是改变当前周期的激活状态)。用来定义历史状态和初始状态;
隐式变量声明的语法:
:SFCStepType;
_:SFCActionType;
3 模拟
用codesys 模拟 sfc的入口 出口 内部动作,并行选择分支,用sfc也是为了满足状态机的设计需求;理解了为什么UML让选择,信号同步等叫做虚拟状态;
考虑到并行的情况:有时同时处于多个状态,所有用字的每一个表示一个状态。在跳出状态的时候,要把当前状态位置为0;
(*状态的枚举类型*)
TYPE StetaMachine :
(
eMainStateInit:= 16#00000001,
eMainState1 := 16#00000001,
eMainState2 := 16#00000002
);
END_TYPE
(*变量定义*)
iMainState : StetaMachine := eMainState1 ;
iMainStateFollow : StetaMachine := eMainStateInit;
bMainStateExit : BOOL:= FALSE;
{
一、状态名称}
IF (iMainState OR eMainState1) <</