AgvProcess.cs
10.1 KB
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OnlineStore.DeviceLibrary
{
partial class PackageLine
{
/// <summary>
/// AGV进入A3点
/// </summary>
public enum AGV_ENTER_A3_STEP
{
NONE,
/// <summary>
/// 开始进入
/// </summary>
START_ENTER,
/// <summary>
/// 等待进入
/// </summary>
WAIT_ENTER_FINISH,
/// <summary>
/// 进入完成
/// </summary>
FINISH_ENTER
}
/// <summary>
/// AGV离开A4
/// </summary>
public enum AGV_LEAVE_A4_STEP
{
NONE,
/// <summary>
/// 等待料架到达出料口
/// </summary>
WAIT_TO_EXIT,
/// <summary>
/// 开始送出
/// </summary>
START_LEAVE,
/// <summary>
/// 等待送出完成
/// </summary>
WAIT_LEAVE_FINISH,
/// <summary>
/// 送出完成
/// </summary>
FINISH_LEAVE
}
public StepInfo<AGV_ENTER_A3_STEP> agvA3Step = new StepInfo<AGV_ENTER_A3_STEP>(AGV_ENTER_A3_STEP.NONE);
public StepInfo<AGV_LEAVE_A4_STEP> agvA4Step = new StepInfo<AGV_LEAVE_A4_STEP>(AGV_LEAVE_A4_STEP.NONE);
/// <summary>
/// A4料架情况
/// </summary>
public bool A4_Shelf_Exist = true;
/// <summary>
/// AGV进入处理
/// </summary>
private void ProcessA3Agv()
{
if (agvA3Step.IsStep(AGV_ENTER_A3_STEP.NONE))
{
//检测左侧入口IO,是否可继续进入料架
if (IOValue(IO_Type.Pkg_Stop_Check1).Equals(IO_VALUE.LOW))
{
agvA3Step.Msg = "料架未满,可以进入";
agvClient.SetStatus("A3", "", "", Asa.ClientAction.NeedEnter);
}
else
{
//已经满了
agvA3Step.Msg = "料架已满,不允许进入";
agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.NONE);
agvClient.SetStatus("A3", "", "", Asa.ClientAction.None);
}
}
else if (agvA3Step.IsStep(AGV_ENTER_A3_STEP.START_ENTER))
{
if (IOValue(IO_Type.Pkg_Stop_Check1).Equals(IO_VALUE.LOW))
{
agvA3Step.Msg = "收到 Agv 到达包装线A3点, 线体未满,开启链条1和2 ";
IOMove(IO_Type.Pkg_Line1_Forward, IO_VALUE.HIGH);
IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.HIGH);
agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.WAIT_ENTER_FINISH);
}
}
else if (agvA3Step.IsStep(AGV_ENTER_A3_STEP.WAIT_ENTER_FINISH))
{
bool enterFinished = IOValue(IO_Type.Pkg_In_Check).Equals(IO_VALUE.HIGH);
if (enterFinished)
{
agvA3Step.Msg = "Agv 料架进入包装线A3点完成, 3秒后允许继续进入 ";
agvClient.SetStatus("A3", "", "", Asa.ClientAction.FinishEnter);
agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.FINISH_ENTER);
agvA3Step.AddTimeWait(3000);
}
else
{
bool timeOut = agvA3Step.IsTimeOut(20000);
if (timeOut)
{
agvA3Step.Msg = "Agv 料架进入包装线A3点20秒内未检测到入口信号,超时结束 ";
agvClient.SetStatus("A3", "", "", Asa.ClientAction.FinishEnter);
agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.FINISH_ENTER);
agvA3Step.AddTimeWait(3000);
}
}
}
else if (agvA3Step.IsStep(AGV_ENTER_A3_STEP.FINISH_ENTER))
{
if (agvA3Step.IsFinished())
{
agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.NONE);
}
}
}
/// <summary>
/// AGV送出处理
/// </summary>
private void ProcessA4Agv()
{
if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.NONE))
{
//检测右侧IO,是否有料架要出/入(需要保留2个料架)
bool hasEmptyShelf = IOValue(IO_Type.Pkg_Out_Stop_Check).Equals(IO_VALUE.HIGH);
bool has3EmptyShelf = IOValue(IO_Type.Pkg_Empty_Shelf_Check).Equals(IO_VALUE.HIGH);
bool hasMoreThan3Shelf = IOValue(IO_Type.Pkg_Rotot_Forbidden_Check).Equals(IO_VALUE.HIGH);
if (hasEmptyShelf)
{
A4_Shelf_Exist = true;
if (has3EmptyShelf && hasMoreThan3Shelf)
{
//出口已经满了,影响机器人工作了,优先级变高
agvA4Step.Msg = "包装线出口料架大于等于3个,必须尽快拉走一个";
agvClient.SetStatus("A4", "", "00", Asa.ClientAction.NeedLeave, Asa.ClientLevel.High);
}else if (has3EmptyShelf)
{
agvA4Step.Msg = "包装线出口料架大于2个,需要拉走一个";
agvClient.SetStatus("A4", "", "00", Asa.ClientAction.NeedLeave, Asa.ClientLevel.Middle);
}
else
{
agvA4Step.Msg = "包装线出口料架小于2个,低优先级";
agvClient.SetStatus("A4", "", "00", Asa.ClientAction.NeedLeave, Asa.ClientLevel.Low);
}
}
else
{
if (has3EmptyShelf || hasMoreThan3Shelf)
{
agvA4Step.Msg = "包装线出口料架信号未检测到,但已有2料架信号,转动链条2, 3";
IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.HIGH);
IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.HIGH);
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.WAIT_TO_EXIT);
agvA4Step.AddIoWait(IO_Type.Pkg_Rotot_Forbidden_Check, IO_VALUE.LOW);
agvA4Step.AddIoWait(IO_Type.Pkg_Out_Stop_Check, IO_VALUE.HIGH);
}
else
{
//已经没料架了
agvA4Step.Msg = "包装线出口无料架,需要尽快补充";
A4_Shelf_Exist = false;
agvClient.SetStatus("A4", "", "00", Asa.ClientAction.None, Asa.ClientLevel.Low);
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.NONE);
}
}
}else if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.WAIT_TO_EXIT))
{
if (agvA4Step.IsFinished())
{
agvA4Step.Msg = "料架已到包装线出口,停止链条3";
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.NONE);
IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.LOW);
IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.LOW);
}
else if (agvA4Step.IsTimeOut(20000))
{
agvA4Step.Msg = "料架到包装线出口超时,停止链条3";
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.NONE);
IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.LOW);
IOMove(IO_Type.Pkg_Line2_Forward, IO_VALUE.LOW);
}
else
{
KeepLineRun(IO_Type.Pkg_Line3_Forward);
KeepLineRun(IO_Type.Pkg_Line2_Forward);
}
}
else if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.START_LEAVE))
{
agvA4Step.Msg = "收到 Agv 到达包装线A4点, 开启链条,准备送出料架 ";
IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.HIGH);
IOMove(IO_Type.Pkg_Out_Stop_Down, IO_VALUE.HIGH, 2000);
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.WAIT_LEAVE_FINISH);
agvA4Step.AddTimeWait(30000);
}
else if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.WAIT_LEAVE_FINISH))
{
if (agvA4Step.IsFinished())
{
agvA4Step.Msg = "Agv 料架离开包装线A4点超时完成, 停止链条 ";
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.FINISH_LEAVE);
agvA4Step.AddTimeWait(5000);
}
}
else if (agvA4Step.IsStep(AGV_LEAVE_A4_STEP.FINISH_LEAVE))
{
if (agvA4Step.IsFinished())
{
agvClient.SetStatus("A4", "", "00", Asa.ClientAction.FinishLeave);
IOMove(IO_Type.Pkg_Line3_Forward, IO_VALUE.LOW);
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.NONE);
}
}
}
private void AgvClient_Ready(string name, string content)
{
LogUtil.info("收到 AgvClient_Ready [" + name + "] ");
if (name.Equals("A3"))
{
agvA3Step.ToNextStep(AGV_ENTER_A3_STEP.START_ENTER);
}else if (name.Equals("A4"))
{
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.START_LEAVE);
}
}
private void AgvClient_CloseDoor(string name, string rfid)
{
if (name.Equals("A4"))
{
agvA4Step.Msg = "Agv 料架离开包装线A4点,收到AGV反馈完成, 停止链条 ";
agvA4Step.ToNextStep(AGV_LEAVE_A4_STEP.FINISH_LEAVE);
}
}
private void AgvClient_Log(string s)
{
LogUtil.debug("AGV: " + s);
}
}
}