1PROGRAM ConveyorSequencing
2
3VAR
4
5SystemMode : INT := 0;
6
7
8Conveyor1_Run : BOOL := FALSE;
9Conveyor2_Run : BOOL := FALSE;
10Conveyor3_Run : BOOL := FALSE;
11
12
13Gate1_Open : BOOL := FALSE;
14Gate2_Open : BOOL := FALSE;
15
16
17Sensor_Entry : BOOL := FALSE;
18Sensor_Conveyor1_Mid : BOOL := FALSE;
19Sensor_Conveyor1_Exit : BOOL := FALSE;
20Sensor_Conveyor2_Entry : BOOL := FALSE;
21Sensor_Conveyor2_Exit : BOOL := FALSE;
22Sensor_Gate1_Position : BOOL := FALSE;
23Sensor_Gate2_Position : BOOL := FALSE;
24Sensor_Exit_Chute : BOOL := FALSE;
25
26
27Manual_StartConveyor1 : BOOL;
28Manual_StartConveyor2;
29Manual_StartConveyor3;
30Manual_StopConveyors;
31Manual_OpenGate1;
32Manual_CloseGate1;
33Manual_OpenGate2;
34Manual_CloseGate2;
35
36
37productDetectedAtEntry : BOOL := FALSE;
38productAtConveyor1Mid : BOOL := FALSE;
39productAtConveyor1Exit : BOOL := FALSE;
40productAtConveyor2Entry : BOOL := FALSE;
41productAtConveyor2Exit : BOOL := FALSE;
42productInExitChute : BOOL := FALSE;
43gate1FullyOpen : BOOL := FALSE;
44gate2FullyOpen : BOOL := FALSE;
45
46
47Timer_Conveyor1_StartDelay : TON;
48Timer_Gate1_OpenDelay : TON;
49Timer_Gate2_OpenDelay : TON;
50Timer_Product_Presence : TON;
51DebounceTimer : TON;
52DebounceTime : TIME := T#50MS;
53
54
55AutoState : INT := 0;
56
57
58SystemError : BOOL := FALSE;
59ErrorMessage : STRING := '';
60
61END_VAR
62
63
64
65
66
67
68
69
70
71
72
73IF SystemMode = 0 THEN
74
75IF Manual_StartConveyor1 THEN Conveyor1_Run := TRUE; END_IF;
76IF Manual_StartConveyor2 THEN Conveyor2_Run := TRUE; END_IF;
77IF Manual_StartConveyor3 THEN Conveyor3_Run := TRUE; END_IF;
78IF Manual_StopConveyors THEN
79Conveyor1_Run := FALSE;
80Conveyor2_Run := FALSE;
81Conveyor3_Run := FALSE;
82END_IF;
83
84
85IF Manual_OpenGate1 THEN Gate1_Open := TRUE; END_IF;
86IF Manual_CloseGate1 THEN Gate1_Open := FALSE; END_IF;
87IF Manual_OpenGate2 THEN Gate2_Open := TRUE; END_IF;
88IF Manual_CloseGate2 THEN Gate2_Open := FALSE; END_IF;
89
90
91IF NOT Manual_StartConveyor1 AND NOT Manual_StartConveyor2 AND NOT Manual_StartConveyor3 AND NOT Manual_StopConveyors AND NOT Manual_OpenGate1 AND NOT Manual_CloseGate1 AND NOT Manual_OpenGate2 AND NOT Manual_CloseGate2 THEN
92
93END_IF;
94
95ELSIF SystemMode = 1 THEN
96
97
98productDetectedAtEntry := Sensor_Entry;
99productAtConveyor1Mid := Sensor_Conveyor1_Mid;
100productAtConveyor1Exit := Sensor_Conveyor1_Exit;
101productAtConveyor2Entry := Sensor_Conveyor2_Entry;
102productAtConveyor2Exit := Sensor_Conveyor2_Exit;
103gate1FullyOpen := Sensor_Gate1_Position;
104gate2FullyOpen := Sensor_Gate2_Position;
105productInExitChute := Sensor_Exit_Chute;
106
107
108CASE AutoState OF
1090:
110Conveyor1_Run := FALSE;
111Conveyor2_Run := FALSE;
112Conveyor3_Run := FALSE;
113Gate1_Open := FALSE;
114Gate2_Open := FALSE;
115IF productDetectedAtEntry THEN
116AutoState := 1;
117END_IF;
118
1191:
120Conveyor1_Run := TRUE;
121IF productAtConveyor1Mid THEN
122AutoState := 2;
123END_IF;
124IF productInExitChute THEN
125SystemError := TRUE;
126ErrorMessage := 'Exit Chute Blocked';
127AutoState := 9;
128END_IF;
129
1302:
131Conveyor1_Run := TRUE;
132IF productAtConveyor1Exit THEN
133AutoState := 3;
134END_IF;
135IF productInExitChute THEN
136SystemError := TRUE;
137ErrorMessage := 'Exit Chute Blocked';
138AutoState := 9;
139END_IF;
140
1413:
142Conveyor1_Run := FALSE;
143Gate1_Open := TRUE;
144IF gate1FullyOpen THEN
145AutoState := 4;
146END_IF;
147
148Timer_Gate1_OpenDelay(IN := Gate1_Open, PT := T#5S);
149IF Timer_Gate1_OpenDelay.Q THEN
150SystemError := TRUE;
151ErrorMessage := 'Gate 1 Failed to Open';
152AutoState := 9;
153END_IF;
154
1554:
156Conveyor1_Run := FALSE;
157Gate1_Open := TRUE;
158IF NOT productAtConveyor1Exit THEN
159Gate1_Open := FALSE;
160Timer_Gate1_OpenDelay(IN := FALSE);
161AutoState := 5;
162END_IF;
163IF productInExitChute THEN
164SystemError := TRUE;
165ErrorMessage := 'Exit Chute Blocked';
166AutoState := 9;
167END_IF;
168
1695:
170Conveyor2_Run := TRUE;
171IF productAtConveyor2Entry THEN
172AutoState := 6;
173END_IF;
174IF productInExitChute THEN
175SystemError := TRUE;
176ErrorMessage := 'Exit Chute Blocked';
177AutoState := 9;
178END_IF;
179
1806:
181Conveyor2_Run := FALSE;
182Gate2_Open := TRUE;
183IF gate2FullyOpen THEN
184AutoState := 7;
185END_IF;
186
187Timer_Gate2_OpenDelay(IN := Gate2_Open, PT := T#5S);
188IF Timer_Gate2_OpenDelay.Q THEN
189SystemError := TRUE;
190ErrorMessage := 'Gate 2 Failed to Open';
191AutoState := 9;
192END_IF;
193
1947:
195Conveyor2_Run := FALSE;
196Gate2_Open := TRUE;
197IF NOT productAtConveyor2Exit THEN
198Gate2_Open := FALSE;
199Timer_Gate2_OpenDelay(IN := FALSE);
200Conveyor3_Run := TRUE;
201AutoState := 0;
202END_IF;
203IF productInExitChute THEN
204SystemError := TRUE;
205ErrorMessage := 'Exit Chute Blocked';
206AutoState := 9;
207END_IF;
208
2098:
210
211
2129:
213Conveyor1_Run := FALSE;
214Conveyor2_Run := FALSE;
215Conveyor3_Run := FALSE;
216Gate1_Open := FALSE;
217Gate2_Open := FALSE;
218
219
220
221END_CASE;
222
223
224IF NOT SystemError THEN
225IF Timer_Product_Presence(IN := productDetectedAtEntry, PT := T#30S).Q THEN
226SystemError := TRUE;
227ErrorMessage := 'Product Stuck at Entry';
228AutoState := 9;
229END_IF;
230END_IF;
231
232
233
234
235END_IF;
236
237END_PROGRAM