利用PLC扫描周期实现一些小技巧

  1. 上升沿
//pulse generate

IF #my_singal AND NOT #pulse_bool THEN
    ;
END_IF;
#pulse_bool := #my_singal;
  1. 数值记忆,记录当数值变化时事件
 //memory,my_order由外部主动触发

IF #my_order <> #memory_order THEN
    ;
END_IF;
#memory_order := #my_order;
  1. 清数据之前先转存
//transfer data before clear
IF #my_singal AND NOT #pulse_bool THEN
    #Tmp_data_set := #my_data_set;
    #my_data_set := #null_data_set;
END_IF;
#pulse_bool := #my_singal;

  1. 手动做一个GRAPH顺控管理器
//初始化
IF #H_Collection.Button_StepMode THEN
    #H_Collection.Button_ContinuousMode := FALSE;
END_IF;
IF NOT #In_home THEN
    #H_Collection.StationByPass := FALSE;
END_IF;

//连续模式
IF #H_Collection.Button_ContinuousMode AND (NOT #H_Collection.Button_StepMode) AND
    (NOT #H_Collection.StationByPass) THEN
    
    IF #In_Mode.AutoMode AND #In_home AND 0 = #InOut_NextStep THEN
        #InOut_NextStep := 10;
    END_IF;
    
    IF (NOT #In_Mode.AlarmMode) AND (NOT #In_Mode.StopMode) AND #In_Mode.AutoMode THEN
        #InOut_CurrentStep := #InOut_NextStep;
    ELSE
        #InOut_CurrentStep := #InOut_CurrentStep;
    END_IF;
    
    IF #In_Mode.ManualMode THEN
        #InOut_CurrentStep := 0;
        #InOut_NextStep := 0;
    END_IF;
    
END_IF;

//单步模式
IF #H_Collection.Button_StepMode AND (NOT #H_Collection.StationByPass) THEN
    
    IF #In_Mode.AutoMode AND #In_home AND 0 = #InOut_NextStep THEN
        #InOut_NextStep := 10;
    END_IF;
    
    IF (NOT #In_Mode.AlarmMode) AND (NOT #In_Mode.StopMode) AND #In_Mode.AutoMode AND NOT #st_Pluse[0] AND #H_Collection.Button_NextStep THEN
        #InOut_CurrentStep := #InOut_NextStep;
    ELSIF #In_Mode.AlarmMode OR  #In_Mode.StopMode THEN
        #InOut_CurrentStep := #InOut_CurrentStep;
    END_IF;
    #st_Pluse[0] := #H_Collection.Button_NextStep;
    
    IF #In_Mode.ManualMode THEN
        #InOut_CurrentStep := 0;
        #InOut_NextStep := 0;
    END_IF;
    
END_IF;

//工位屏蔽
IF #H_Collection.StationByPass AND #In_home THEN
    #InOut_CurrentStep := 0;
    #InOut_NextStep := 0;
END_IF;

使用顺控器方法:

Call Graph_Manager;//如上代码,填好接口
CASE #currentstep OF

10:
;
#nextstep:=20;

20:
;
#nextstep:=30;

30:
...
#nextstep:=0;

END_CASE;
  1. 利用定时器做一个脉冲发生器(这个和扫描周期特性没啥关系)
//此处周期为2S,可以用time变量把定时器时间接口化
REGION 脉冲发生器
    IF (NOT #statVoh) AND (NOT #statVol) THEN
        #statVoh := true;
    END_IF;
    #on_time(IN := #statVoh,
             PT := t#1s);
    IF #on_time.Q THEN
        #statVoh := false;
        #statVol := true;
    END_IF;
    #off_time(IN := #statVol,
              PT := t#1s);
    IF #off_time.Q THEN
        #statVoh := true;
        #statVol := FALSE;
    END_IF;
END_REGION
posted @ 2024-04-30 22:30  不愿透露姓名的小村村  阅读(6)  评论(0编辑  收藏  举报