Codesys代码代写,程序开发,软件定制,bug修改,问题咨询:个人主页

1 测试

在initing状态中测试(entry)进入动作,(exit)出去动作,内部动作,外部动作 四种类型的执行做了如图所示的测试;
获得结论:

1:即使initing的跳转条件一直是true,也会执行initing的入口动作,内部动作,外部动作;
2:第一次扫描得知initing的跳转条件为true,第二次扫描的时候只会执行外部动作,出去动作;
3:initing的动作执行顺序是,先执行内部动作,后执行外部动作;
4: 如果在initing 内部动作中在嵌套子状态sfc,父状态转移会执行父的exit动作,子状态如果是因为父状态转移而不执行,子状态的exit动作不会执行,类似history历史状态,下次进入子状态会继续紧接着执行;

Codesys中关键字 codesys教程_状态机

2 隐式的变量

在创建sfc中的步和动作(内部动作,不是关联动作)的时候,隐式的创建如下类型,在对应的库中可以查看类型;
常用的是 ._x:强制下一个周期的激活状态(测试发现是改变当前周期的激活状态)。用来定义历史状态和初始状态;

隐式变量声明的语法:
:SFCStepType;
_:SFCActionType;

Codesys中关键字 codesys教程_开发语言_02


Codesys中关键字 codesys教程_Codesys中关键字_03

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) <> 0 THEN
   {1 entry 入口函数---------------------------------------}
   IF (iMainStateFollow AND  eMainState1)   = 0 THEN
       (*do 1*)
       (*do 2*)
       (*do 3*)
       iMainStateFollow := (iMainStateFollow OR eMainState1);
       bMainStateExit := FALSE;
   END_IF
   {2 内部处理动作-----------------------------------------}
   IF bMainStateExit = FALSE THEN

       (*do 1 :处理动作   : *)

       (*do 2 :并发子状态1: *)

       (*do 3 :并发子状态2: *)

   END_IF
   {3 exit  出口函数-----------------------------------------}
   IF bMainStateExit = TRUE THEN
       bMainStateExit := FALSE;
       (*do 1*)
       (*do 2*)
       (*do 3*)
       (* jump to state2: *)
        {IF condition1 = TRUE THEN
            iMainState := ((iMainState XOR eMainState1) OR eMainState2);
            iMainStateFollow := (iMainStateFollow XOR eMainState1);        
            RETURN;
         END_IF}
       (* jump to state3: *)
        {IF condition2 = TRUE THEN
            iMainState := ((iMainState XOR eMainState1) OR eMainState3);
            iMainStateFollow := (iMainStateFollow XOR eMainState1);        
            RETURN;
        END_IF}
   END_IF
   
   {4 跳转条件判断-------------------------------------------}
    (*条件选择分支1: judge_jump_to_state1 : *)
     {IF condition1 = TRUE THEN
         bMainStateExit := TRUE;
         RETURN;
      END_IF}
     (*条件选择分支2: judge_jump_to_state2 : *)
      {IF condition2 = TRUE THEN
          bMainStateExit := TRUE;
          RETURN;
      END_IF}
END_IF



{选择分支,选择是一个虚拟状态,是一个瞬间状态}
IF iMainState = 2 THEN

   (*IF condition THEN
        jump to state3
        iMainState := ((iMainState XOR eMainState2) OR eMainState3);       
     ELSE       
        jump to state4
        iMainState := ((iMainState XOR eMainState2) OR eMainState4);    
     END_IF*)
END_IF

{3.1 并行开始,并行是一个虚拟状态,是一个瞬间状态}

IF iMainState = 3 THEN
   {JUMP TO STATE4}
   {JUMP TO STATE5}
   iMainState := ((iMainState XOR eMainState3) OR eMainState4 OR eMainState5 );
END_IF


{3.2 并行开始,并行是一个虚拟状态,是一个瞬间状态}
IF iMainState = 4 THEN
(*IF condition1 AND condition2 AND condition3 AND conditionN THEN
     {jump to state5}
     iMainState := ((iMainState XOR eMainState4) OR eMainState5 
 END_IF*)
END_IF

Codesys中关键字 codesys教程_历史状态_04


Codesys中关键字 codesys教程_状态机_05

4 计划:理解关联动作并用代码模拟

Codesys中关键字 codesys教程_状态机_06

5 计划:理解SFC的标志

Codesys中关键字 codesys教程_Codesys中关键字_07

6 计划:完善codesys状态机模板代码