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

1. 上升沿

1
2
3
4
5
6
//pulse generate

IF #my_singal AND NOT #pulse_bool THEN
;
END_IF;
#pulse_bool := #my_singal;

2. 数值记忆,记录当数值变化时事件

1
2
3
4
5
6
 //memory,my_order由外部主动触发

IF #my_order <> #memory_order THEN
;
END_IF;
#memory_order := #my_order;

3. 清数据之前先转存

1
2
3
4
5
6
7
//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;

4. 手动做一个GRAPH顺控管理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//初始化
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;

使用顺控器方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Call Graph_Manager;//如上代码,填好接口
CASE #currentstep OF

10:
;
#nextstep:=20;

20:
;
#nextstep:=30;

30:
...
#nextstep:=0;

END_CASE;

5. 利用定时器做一个脉冲发生器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//此处周期为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

利用PLC扫描周期实现一些小技巧
http://example.com/2024/07/21/利用PLC扫描周期实现一些小技巧/
作者
xiao cuncun
发布于
2024年7月21日
许可协议