MainMachine _MiddleProcess.cs
16.9 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
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
using OnlineStore;
using CodeLibrary;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using OnlineStore.Common.util;
using Newtonsoft.Json;
namespace DeviceLibrary
{
partial class MainMachine
{
void MiddleProcess()
{
if (CheckWait(MiddleMoveInfo))
return;
switch (MiddleMoveInfo.MoveStep)
{
case MoveStep.M_Standby:
//如果右侧可取料那么那么移动轴到p2点,夹爪释放。获取右侧的标签信息,右侧标签信息复位,否则等待
if (RightMoveInfo.MoveStep == MoveStep.R10_WaitReelLeave)
{
PlwHight = 0;
MiddleMoveInfo.NextMoveStep(MoveStep.M02);
Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P2, Config.Take_Middle_P2_speed);
Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P2, Config.Take_UpDown_P2_speed);
clampTool.Release();
//复制右侧料盘信息
MiddleMoveInfo.MoveParam = RightMoveInfo.MoveParam.clone();
addParam(MiddleMoveInfo.MoveParam);
RightMoveInfo.MoveParam = new LabelParam() { PreUID = MiddleMoveInfo.MoveParam.UID};
MiddleMoveInfo.log($"右侧可以取料,旋转轴/上下轴转到P2点:{JsonConvert.SerializeObject(MiddleMoveInfo.MoveParam)}");
//MiddleMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.RightArm_Check, IO_VALUE.HIGH));
}
else if (MiddleMoveInfo.IsTimeOut(60))
{
MiddleMoveInfo.log("等待右侧可以取料");
}
break;
//z轴移动到p3点,抓取,返回p2点
case MoveStep.M02:
MiddleMoveInfo.NextMoveStep(MoveStep.M03);
Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P3, Config.Take_UpDown_P3_speed);
MiddleMoveInfo.log("右侧可以取料,上下轴转到P3点,开始取料");
break;
case MoveStep.M03:
if (clampTool.Clamp())
{
MiddleMoveInfo.NextMoveStep(MoveStep.M04);
MiddleMoveInfo.log("取料气缸夹紧");
}
break;
case MoveStep.M04:
MiddleMoveInfo.NextMoveStep(MoveStep.M05);
Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P2, Config.Take_UpDown_P2_speed);
MiddleMoveInfo.log("上下轴返回P2点");
break;
//如果抓取完成或者定位低电平,进入下一步,右侧进行下一盘;如果左侧空闲,存在NG或抓取失败人工处理,如果右侧进料确认右侧进入继续取料步骤,如果中间ng轴会p1点否则继续下一个流程
case MoveStep.M05:
if (clampTool.IsClamp() || IOValue(IO_Type.RightTop_Check).Equals(IO_VALUE.LOW))
{
bool isclamp = clampTool.IsClamp();
bool che = IOValue(IO_Type.RightTop_Check).Equals(IO_VALUE.LOW);
MiddleMoveInfo.log($"取起物料状态{isclamp};io状态{che}");
MiddleMoveInfo.NextMoveStep(MoveStep.M06);
RightMoveInfo.NextMoveStep(MoveStep.R11_NextReel);
MiddleMoveInfo.MoveParam.PlateW = GetTrayWidth();
MiddleMoveInfo.log($"通知右侧料串,料已取走,获取盘宽{MiddleMoveInfo.MoveParam.PlateW}");
//Task.Run(() => {
// CodeManager.NS100Service(MiddleMoveInfo, MiddleMoveInfo.MoveParam.BitmapBase64, MiddleMoveInfo.MoveParam.codeInfos, MiddleMoveInfo.MoveParam.PlateW);
//}).ContinueWith((t) => {
// MiddleMoveInfo.NextMoveStep(MoveStep.M06);
//});
}
else if (LeftMoveInfo.MoveStep == MoveStep.L10_WaitReelPut)
{
if (MiddleMoveInfo.MoveParam.IsNg)
{
Msg.add(crc.GetString("Res0096", "抓料失败请手动处理,请将料盘放入:NG箱,按右侧按钮继续"), MsgLevel.alarm);
MiddleMoveInfo.log("抓料失败请手动处理,请将料盘放入:NG箱,按右侧按钮继续");
}
else
{
Msg.add(crc.GetString("Res0097", "抓料失败请手动处理,请将料盘放入: 左侧料串,按右侧按钮继续"), MsgLevel.alarm);
MiddleMoveInfo.log("抓料失败请手动处理,请将料盘放入: 左侧料串,按右侧按钮继续");
}
if (IOValue(IO_Type.Right_BTN).Equals(IO_VALUE.HIGH))
{
RightMoveInfo.NextMoveStep(MoveStep.R11_NextReel);
if (MiddleMoveInfo.MoveParam.IsNg)
{
MiddleMoveInfo.NextMoveStep(MoveStep.M_ReturnToP1);
}
else
{
MiddleMoveInfo.NextMoveStep(MoveStep.M06);
}
}
}
else if (MiddleMoveInfo.IsTimeOut(60))
{
MiddleMoveInfo.log("抓料失败,等待左侧允许放料");
}
break;
//NG料进入NG流程,正常入正常流程
case MoveStep.M06_Wait:
break;
case MoveStep.M06:
if (MiddleMoveInfo.MoveParam.IsNg)
{
MiddleMoveInfo.NextMoveStep(MoveStep.M20_ToNgBox);
MiddleMoveInfo.log("判断为NG料");
}
//等待右侧料串计算盘高
//else if (RightMoveInfo.MoveStep >= MoveStep.R06_GettedReelHigh && RightMoveInfo.MoveStep <= MoveStep.R10_WaitReelLeave)
else //if (LastHeightPos > 0)
{
MiddleMoveInfo.NextMoveStep(MoveStep.M07);
MiddleMoveInfo.log($"开始往左侧料串移栽,{MiddleMoveInfo.MoveParam.ToStr()}");
}
//else if (MiddleMoveInfo.IsTimeOut(60))
//{
// MiddleMoveInfo.log("等待计算盘高");
//}
break;
case MoveStep.M07:
if (!Take_Middle_Axis.IsSafe(Config.Take_Middle_P3, out string msg))
{
Msg.add(msg, MsgLevel.info);
}
//左侧空闲,等待贴标流程为打印标签,复制信息给标签流程,进入下一步,移动旋转轴到p3
else if (LeftMoveInfo.MoveStep == MoveStep.L10_WaitReelPut)
{
if (clampTool.IsClamp())
{
if (!LabelMoveInfo.IsStep(MoveStep.Lbl_WaitPrintInfo))
{
MiddleMoveInfo.log("等待贴标流程空闲");
return;
}
MiddleMoveInfo.NextMoveStep(MoveStep.M08);
CurrentPrintInfo = MiddleMoveInfo.MoveParam.clone();
LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintLabel);
LabelMoveInfo.MoveParam = MiddleMoveInfo.MoveParam.clone();
Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P3, Config.Take_Middle_P3_speed);
MiddleMoveInfo.log($"左侧允许放料,旋转轴P3");
}
else
{
Msg.add(crc.GetString("Res0097", "抓料失败请手动处理,请将料盘放入: 左侧料串,按右侧按钮继续"), MsgLevel.alarm);
if (IOValue(IO_Type.Right_BTN).Equals(IO_VALUE.HIGH))
{
RightMoveInfo.NextMoveStep(MoveStep.R11_NextReel);
MiddleMoveInfo.NextMoveStep(MoveStep.M09);
CurrentPrintInfo = MiddleMoveInfo.MoveParam.clone();
LabelMoveInfo.NextMoveStep(MoveStep.Lbl_PrintLabel);
LabelMoveInfo.MoveParam = MiddleMoveInfo.MoveParam.clone();
MiddleMoveInfo.log("用户按下右侧Reset,继续贴标");
}
else
{
bool isclamp = clampTool.IsClamp();
bool che = IOValue(IO_Type.RightTop_Check).Equals(IO_VALUE.LOW);
MiddleMoveInfo.log($"物料掉落, 取起物料状态{isclamp};io状态{che}");
}
}
}
else if (MiddleMoveInfo.IsTimeOut(60))
{
MiddleMoveInfo.log("等待左侧允许放料");
Msg.add(crc.GetString("Res0098", "等待左侧允许放料"), MsgLevel.info);
}
break;
//z轴到p4
case MoveStep.M08:
MiddleMoveInfo.NextMoveStep(MoveStep.M08_01);
if (MiddleMoveInfo.MoveParam.PlateW > 7)
{
MiddleMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
MiddleMoveInfo.log($"尺寸:{MiddleMoveInfo.MoveParam.PlateW},停留1500ms");
}
else
{
MiddleMoveInfo.log($"尺寸:{MiddleMoveInfo.MoveParam.PlateW},不停留");
}
break;
case MoveStep.M08_01:
MiddleMoveInfo.NextMoveStep(MoveStep.M09);
Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P4, Config.Take_UpDown_P4_speed);
MiddleMoveInfo.log("左侧允许放料,上下轴到P4");
break;
//夹爪释放复制信息给左侧流程,左侧进入到收到料流程
case MoveStep.M09:
if (clampTool.Release())
{
MiddleMoveInfo.NextMoveStep(MoveStep.M10);
LeftMoveInfo.MoveParam = MiddleMoveInfo.MoveParam.clone();
LeftMoveInfo.NextMoveStep(MoveStep.L11_ReelPutted);
MiddleMoveInfo.log("取料夹爪放松,通知左侧料串已放入,左侧等待1秒");
LeftMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
}
else if (MiddleMoveInfo.IsTimeOut(10))
{
MiddleMoveInfo.NextMoveStep(MoveStep.M09);
MiddleMoveInfo.log("等待夹爪放松");
}
Msg.add(crc.GetString("Res0050", "等待夹爪放松"), MsgLevel.info);
break;
//待机流程
case MoveStep.M10:
MiddleMoveInfo.NextMoveStep(MoveStep.M_ReturnToP1);
Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P1, Config.Take_UpDown_P1_speed);
MiddleMoveInfo.log("放料完成,上下轴返回待机点");
break;
case MoveStep.M_ReturnToP1:
//检查是否在拍照,避免干涉 R06_GettedReelInfo
if (RightMoveInfo.IsStep(MoveStep.R06_GettedReelInfo))
{
MiddleMoveInfo.log("等待右侧拍照完成,避免干涉");
return;
}
MiddleMoveInfo.NextMoveStep(MoveStep.M_Standby);
Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P1, Config.Take_Middle_P1_speed);
MiddleMoveInfo.log("放料完成,旋转轴返回待机点");
break;
//NG流程
case MoveStep.M20_ToNgBox:
if (PlwHight > 65 * 1000)
{
Msg.add(crc.GetString("Res0166.2bf72810", "NG物料厚度超过72mm无法放入NG箱"), MsgLevel.alarm);
}
else if (PlwHight > 0)
{
MiddleMoveInfo.NextMoveStep(MoveStep.M20_1_ToNgBox);
Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P1, Config.Take_UpDown_P1_speed);
MiddleMoveInfo.log("NG时上下轴转到P1");
}
else
{
Msg.add(crc.GetString("Res0182.2def73c9", "NG物料, 等待测高"), MsgLevel.info);
MiddleMoveInfo.log("NG物料, 等待测高");
}
break;
case MoveStep.M20_ToNgBox_72HRelease:
if (IOValue(IO_Type.GratingSignal_Check).Equals(IO_VALUE.HIGH))
{
MiddleMoveInfo.NextMoveStep(MoveStep.M_ReturnToP1);
MiddleMoveInfo.log("光栅恢复,回待机点");
}
break;
case MoveStep.M20_1_ToNgBox:
MiddleMoveInfo.NextMoveStep(MoveStep.M21);
Take_Middle_Axis.AbsMove(MiddleMoveInfo, Config.Take_Middle_P5, Config.Take_Middle_P5_speed);
MiddleMoveInfo.log("旋转轴转到P5 NG位置");
break;
case MoveStep.M21:
MiddleMoveInfo.NextMoveStep(MoveStep.M22);
Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P5, Config.Take_UpDown_P5_speed);
MiddleMoveInfo.log("上下轴转到P5 NG位置");
break;
case MoveStep.M22:
if (clampTool.Release())
{
MiddleMoveInfo.NextMoveStep(MoveStep.M23);
clampTool.Release();
removeParam(MiddleMoveInfo.MoveParam.UID);
MiddleMoveInfo.log("取料夹爪放松,放料入NG位置.");
}
else if (MiddleMoveInfo.IsTimeOut(10))
{
MiddleMoveInfo.NextMoveStep(MoveStep.M22);
MiddleMoveInfo.log("等待夹爪放松");
}
Msg.add(crc.GetString("Res0050", "等待夹爪放松"), MsgLevel.info);
break;
case MoveStep.M23:
//检查是否在拍照,避免干涉 R06_GettedReelInfo
if (RightMoveInfo.IsStep(MoveStep.R06_GettedReelInfo))
{
MiddleMoveInfo.log("等待右侧拍照完成,避免干涉");
return;
}
MiddleMoveInfo.NextMoveStep(MoveStep.M_ReturnToP1);
Take_UpDown_Axis.AbsMove(MiddleMoveInfo, Config.Take_UpDown_P2, Config.Take_UpDown_P5_speed);
MiddleMoveInfo.log("上下轴转到P2 位置");
break;
default:
MiddleMoveInfo.log($"未找到对应步骤:{MiddleMoveInfo.MoveStep}");
break;
}
}
private int GetTrayWidth()
{
if (IOValue(IO_Type.TraySize_15).Equals(IO_VALUE.HIGH))
return 15;
else if (IOValue(IO_Type.TraySize_13).Equals(IO_VALUE.HIGH))
return 13;
//else if (IOValue(IO_Type.TraySize_7).Equals(IO_VALUE.HIGH))
// return 7;
else
return 7;
}
string MiddleState()
{
string state = "";
if (MiddleMoveInfo.MoveStep == MoveStep.M_Standby || MiddleMoveInfo.MoveStep == MoveStep.Wait)
state += crc.GetString("Res0074", "等待中");
else
state += crc.GetString("Res0045", "当前ReelID:") + MiddleMoveInfo.MoveParam.WareCode;
return state;
}
}
}