/// <summary> /// 终止任务 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TerminateBtn_Click(object sender, RoutedEventArgs e) { string dev = ""; try { if (PublicParam.IsDoTask) { Notice.Show("请先关闭顶部[设备运作]!", "提示", 3, MessageBoxIcon.Info); return; } if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } dev = CBdev.Text; if (!ADS.mSocket.IsConnected(dev)) { Notice.Show(dev + "已离线,无法操作!", "提示", 3, MessageBoxIcon.Info); return; } ADS.mArf.devices.Find(c => c.devName == dev).StopTask(); Notice.Show("终止任务 指令发送成功!", "成功", 3, MessageBoxIcon.Success); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.Message, "错误", 3, MessageBoxIcon.Error); // LOG CommonSQL.LogErr("TerminateBtn_Click()", "摆渡车界面终止[设备号]", ex.Message, dev); } }
/// <summary> /// 扫码数据处理 /// </summary> /// <param name="devName"></param> /// <param name="code"></param> public void GetCode(string devName, string code) { try { if (!code.StartsWith("@") || code.Split('@').Length != 2) { return; } if (devices.Exists(c => c.devName == devName)) { DevInfoFRT f = devices.Find(c => c.devName == devName); //if (f._.ActionStatus == ActionEnum.运行中 || f._.RollerStatus != RollerStatusEnum.辊台停止) //{ // throw new Exception(string.Format("辊台未停止,不处理扫码.", code)); //} //是否满足任务 if (CommonSQL.GetInTask(code, out string tid)) { if (!string.IsNullOrEmpty(tid)) { if (string.IsNullOrEmpty(f.lockID1)) { // 请求WMS分配 if (ADS.AssignInSite(f.area, tid)) { f.IsLockUnlockNew(f.isLock, tid, f.lockID2); } } else if (string.IsNullOrEmpty(f.lockID2)) { if (tid != f.lockID1) { // 请求WMS分配 if (ADS.AssignInSite(f.area, tid)) { f.IsLockUnlockNew(f.isLock, f.lockID1, tid); } } } } } else { throw new Exception(string.Format("读取二维码[{0}]异常.", code)); } } } catch (Exception ex) { // LOG CommonSQL.LogErr("FRT.DoTaskNew()", "固定辊台作业[设备]", (ex.Message + ex.Source), devName); } }
/// <summary> /// 定位任务 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void LocateBtn_Click(object sender, RoutedEventArgs e) { string dev = ""; try { if (PublicParam.IsDoTask) { Notice.Show("请先关闭顶部[设备运作]!", "提示", 3, MessageBoxIcon.Info); return; } if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } if (string.IsNullOrEmpty(location.Text.Trim())) { Notice.Show("请填写目的坐标!", "提示", 3, MessageBoxIcon.Info); return; } dev = CBdev.Text; if (!ADS.mSocket.IsConnected(dev)) { Notice.Show(dev + "已离线,无法操作!", "提示", 3, MessageBoxIcon.Info); return; } if (!WindowCommon.ConfirmAction("是否发送定位指令!!")) { return; } int loc = Convert.ToInt32(location.Text.Trim()); ADS.mArf.devices.Find(c => c.devName == dev).ToSite(loc); Notice.Show("定位任务 指令发送成功!", "成功", 3, MessageBoxIcon.Success); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.Message, "错误", 3, MessageBoxIcon.Error); // LOG CommonSQL.LogErr("LocateBtn_Click()", "摆渡车界面定位[设备号]", ex.Message, dev); } }
/// <summary> /// 启动辊台 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BTNrun_Click(object sender, EventArgs e) { string dev = ""; try { if (PublicParam.IsDoTask) { Notice.Show("请先关闭顶部[设备运作]!", "提示", 3, MessageBoxIcon.Info); return; } if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } dev = CBdev.Text; if (!ADS.mSocket.IsConnected(dev)) { Notice.Show(dev + "已离线,无法操作!", "提示", 3, MessageBoxIcon.Info); return; } if (!WindowCommon.ConfirmAction("是否发送滚筒启动指令!!")) { return; } ADS.mArf.devices.Find(c => c.devName == dev).ControlRoller( Convert.ToInt32(CBsite1.Text.Substring(0, 1)), Convert.ToInt32(CBsite2.Text.Substring(0, 1)), Convert.ToInt32(CBsite3.Text.Substring(0, 1)), Convert.ToInt32(CBsite4.Text.Substring(0, 1))); Notice.Show("启动辊台 指令发送成功!", "成功", 3, MessageBoxIcon.Success); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.Message, "错误", 3, MessageBoxIcon.Error); // LOG CommonSQL.LogErr("BTNrun_Click()", "摆渡车界面启动辊台[设备号]", ex.Message, dev); } }
/// <summary> /// 扫码数据处理 /// </summary> /// <param name="devName"></param> /// <param name="code"></param> public void GetCode(string devName, string code) { try { if (!code.StartsWith("@") || code.Split('@').Length != 2) { return; } if (devices.Exists(c => c.devName == devName)) { DevInfoPKL p = devices.Find(c => c.devName == devName); //if (p._.ActionStatus == ActionEnum.运行中) //{ // throw new Exception(string.Format("辊台未停止,不处理扫码.", code)); //} if (p.lockID2 != code) { //是否存在任务 if (!CommonSQL.IsExistsInTask(code)) { // 请求WMS分配 if (ADS.AssignInArea(p.area, code)) { p.IsLockUnlockNew(p.isLock, p.lockID1, code); } } else { throw new Exception(string.Format("读取二维码[{0}]异常.", code)); } } } } catch (Exception ex) { // LOG CommonSQL.LogErr("PKL.DoTaskNew()", "包装线作业[设备]", (ex.Message + ex.Source), devName); } }
private void BTNrun_Click(object sender, RoutedEventArgs e) { string dev = ""; try { if (PublicParam.IsDoTask) { Notice.Show("请先关闭顶部[设备运作]!", "提示", 3, MessageBoxIcon.Info); return; } if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } dev = CBdev.Text; if (!ADS.mSocket.IsConnected(dev)) { Notice.Show(dev + "已离线,无法操作!", "提示", 3, MessageBoxIcon.Info); return; } if (!WindowCommon.ConfirmAction("是否发送辊台指令!!")) { return; } ADS.mPkl.devices.Find(c => c.devName == dev).StartGiveRoll(); Notice.Show("启动辊台 指令发送成功!", "成功", 3, MessageBoxIcon.Success); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.Message, "错误", 3, MessageBoxIcon.Error); // LOG CommonSQL.LogErr("BTNrun_Click()", "包装线界面启动辊台[设备号]", ex.Message, dev); } }
/// <summary> /// 接货到扫码辊台 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BTNlinkAGV_Click(object sender, RoutedEventArgs e) { string dev = ""; try { if (PublicParam.IsDoTask) { Notice.Show("请先关闭顶部[设备运作]!", "提示", 3, MessageBoxIcon.Info); return; } if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } dev = CBdev.Text; if (!ADS.mSocket.IsConnected(dev)) { Notice.Show(dev + "已离线,无法操作!", "提示", 3, MessageBoxIcon.Info); return; } // 只启动辊台2扫码 ADS.mFrt.devices.Find(c => c.devName == dev).StartTakeRoll(TaskTypeEnum.入库, 1, true); Notice.Show("辊台任务 指令发送成功!", "成功", 3, MessageBoxIcon.Success); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.Message, "错误", 3, MessageBoxIcon.Error); // LOG CommonSQL.LogErr("BTNlinkAGV_Click()", "固定辊台界面接货扫码[设备号]", ex.Message, dev); } }
/// <summary> /// 检测任务状态 /// </summary> //public void DoTask() //{ // if (task == null || task.Count == 0) return; // foreach (TaskFRT t in task) // { // //if (!t.activie) continue; // if (t.taskstatus == TaskStatus.finish) continue; // if (string.IsNullOrEmpty(t.device.devName)) // { // DevInfoFRT device = FindFreeDevice(t.area, t.tasktype, t.frt); // if (device != null) // { // t.device = device; // t.device.IsLockUnlock(true, t.jobid); // t.UpdateDev(); // // AGV搬运 同辊台第2托货按收2货运行 // if (t.fromdev == DevType.AGV && // t.device._.GoodsStatus != GoodsEnum.辊台满货 && t.device._.GoodsStatus != GoodsEnum.辊台无货) // { // t.goodsnum = 2; // } // } // } // else // { // // 故障&异常 // if (t.device._.CommandStatus == CommandEnum.命令错误 || t.device._.DeviceStatus == DeviceEnum.设备故障) // { // continue; // } // switch (t.taskstatus) // { // case TaskStatus.init: // t.UpdateStatus(TaskStatus.totakesite); // break; // case TaskStatus.totakesite: // // 无来源设备 直接前往送货点 // if (t.fromdev == DevType.空设备) // { // t.UpdateStatus(TaskStatus.togivesite); // } // else // { // t.UpdateStatus(TaskStatus.ontakesite); // } // break; // case TaskStatus.ontakesite: // // 判断是否启动辊台接货 // if (t.takeready) // { // if (t.device._.GoodsStatus != GoodsEnum.辊台满货 && t.device._.ActionStatus == ActionEnum.停止) // { // t.device.StartTakeRoll(t.tasktype, t.goodsnum); // } // if (t.device._.RollerStatus != RollerStatusEnum.辊台停止 && t.device._.CurrentTask == TaskEnum.辊台任务) // { // t.UpdateStatus(TaskStatus.taking); // } // } // else // { // // ? JOB 更新请求 // t.takeready = ADS.JobPartFRT_Take(t.jobid, t.fromdev); // } // break; // case TaskStatus.taking: // bool isNext = false; // switch (t.fromdev) // { // case DevType.摆渡车: // if ((t.goodsnum == 1 && t.device._.GoodsStatus != GoodsEnum.辊台无货 && t.device._.GoodsStatus != GoodsEnum.辊台满货) || // (t.goodsnum == 2 && t.device._.GoodsStatus == GoodsEnum.辊台满货)) // { // isNext = true; // } // break; // case DevType.AGV: // if ((t.goodsnum == 1 && t.device._.GoodsStatus != GoodsEnum.辊台无货) || // (t.goodsnum == 2 && t.device._.GoodsStatus == GoodsEnum.辊台满货)) // { // isNext = true; // } // break; // default: // break; // } // if (isNext) // { // if (t.device._.ActionStatus == ActionEnum.停止) // { // t.UpdateStatus(TaskStatus.taked); // } // } // else // { // t.device.StartTakeRoll(t.tasktype, t.goodsnum); // } // break; // case TaskStatus.taked: // // AGV搬运 直接完成 // if (t.tasktype == TaskTypeEnum.无) // { // t.UpdateStatus(TaskStatus.gived); // } // else // { // t.UpdateStatus(TaskStatus.togivesite); // } // break; // case TaskStatus.togivesite: // // 无目的设备 直接送货中(出库暂无后续流程) // if (t.todev == DevType.空设备) // { // t.UpdateStatus(TaskStatus.giving); // } // else // { // t.UpdateStatus(TaskStatus.ongivesite); // } // break; // case TaskStatus.ongivesite: // // 判断是否启动辊台送货 // if (t.giveready) // { // if (t.device._.GoodsStatus != GoodsEnum.辊台无货 && t.device._.ActionStatus == ActionEnum.停止) // { // t.device.StartGiveRoll(t.tasktype); // } // if (t.device._.RollerStatus != RollerStatusEnum.辊台停止 && t.device._.CurrentTask == TaskEnum.辊台任务) // { // t.UpdateStatus(TaskStatus.giving); // } // } // else // { // // ? JOB 更新请求 // t.giveready = ADS.JobPartFRT_Give(t.jobid); // } // break; // case TaskStatus.giving: // if (t.device._.GoodsStatus == GoodsEnum.辊台无货) // { // if (t.device._.ActionStatus == ActionEnum.停止) // { // t.UpdateStatus(TaskStatus.gived); // } // } // else // { // t.device.StartGiveRoll(t.tasktype); // } // break; // case TaskStatus.gived: // // 解锁设备、完成任务 // t.device.IsLockUnlock(false); // t.device = new DevInfoFRT(); // t.UpdateStatus(TaskStatus.finish); // break; // default: // break; // } // } // } //} public void DoTaskNew() { if (devices == null || devices.Count == 0) { return; } foreach (DevInfoFRT d in devices) { try { if (!d.isUseful || !ADS.mSocket.IsConnected(d.devName) || d._.CommandStatus == CommandEnum.命令错误 || d._.DeviceStatus == DeviceEnum.设备故障) { continue; } if (d._.CurrentTask == TaskEnum.辊台任务 && d._.FinishTask == TaskEnum.辊台任务) { d.StopRoller(); } switch (d.taskType) { case TaskTypeEnum.入库: InTask: if (d.isLock) { if (d._.GoodsStatus == GoodsEnum.辊台无货) { // 锁定摆渡车 if (ADS.mArf.LockARF(d.area, d.taskType)) { // 解锁 d.IsLockUnlockNew(false); d.StopRoller(); } } else { // 判断当前运输车任务 if (ADS.mRgv.GetNowTaskType(d.area) != TaskTypeEnum.出库) { // 空闲摆渡车 if (ADS.mArf.IsFreeARF(d.area, d.taskType)) { int site = CommonSQL.GetArfByFrt(d.devName); if (site == 0) { throw new Exception("无对应固定辊台-摆渡车对接点!"); } // 摆渡车来接货 if (ADS.mArf.MovingButtSite(d.area, d.taskType, site)) { // 启动摆渡车接货 if (ADS.mArf.IsTaking(d.area, d.taskType)) { // 送货 d.StartGiveRoll(d.taskType); } } } } } } else { // agv任务 int aid = ADS.mNDCControl.IsExistUnLoad(d.devName); if (d._.ActionStatus == ActionEnum.停止) { switch (d._.GoodsStatus) { case GoodsEnum.辊台无货: if (aid != 0) { // 只启动辊台2扫码 d.StartTakeRoll(d.taskType, 1, true); d.isAGV = true; } else { if (!string.IsNullOrEmpty(d.lockID1)) { d.IsLockUnlockNew(false); } } break; case GoodsEnum.辊台中间有货: case GoodsEnum.辊台2有货: if (string.IsNullOrEmpty(d.lockID1)) { //MessageBox.Show(d.devName + "辊台没扫到码!"); throw new Exception(d.devName + "辊台没扫到码!"); } else { if (aid != 0) { // 接货到辊台2 d.StartTakeRoll(d.taskType, 2); d.isAGV = true; } else { // 接货到辊台1 d.StartTakeRoll(d.taskType, 1); d.isAGV = false; } } break; case GoodsEnum.辊台1有货: if (aid != 0) { // 接货到辊台2 d.StartTakeRoll(d.taskType, 2); d.isAGV = true; } else { if (!PublicParam.IsDoJobIn) { break; } // 每次只能做一个辊台 if (IsLockInFRT(d.area)) { break; } // 是否满足任务 if (!string.IsNullOrEmpty(d.lockID1)) { // 是否有超时任务 if (CommonSQL.IsTimeOut(d.lockID1)) { // 锁定 d.IsLockUnlockNew(true, d.lockID1); goto InTask; } } } break; case GoodsEnum.辊台满货: if (!PublicParam.IsDoJobIn) { break; } // 每次只能做一个辊台 if (IsLockInFRT(d.area)) { break; } // 是否满足任务 if (!string.IsNullOrEmpty(d.lockID1) && !string.IsNullOrEmpty(d.lockID2)) { // 锁定 d.IsLockUnlockNew(true, d.lockID1, d.lockID2); goto InTask; } break; default: break; } } else { if (aid != 0) { if (d.isAGV) { // NDC 请求 AGV 启动辊台卸货 if (!ADS.mNDCControl.DoUnLoad(aid, out string result)) { // LOG CommonSQL.LogErr("FRT.DoTaskNew()", "AGV辊台卸货[ID]", result, aid.ToString()); } } } } } break; case TaskTypeEnum.出库: int p = CommonSQL.GetArfByFrt(d.devName); if (p == 0) { throw new Exception("无对应固定辊台-摆渡车对接点!"); } if (d.isLock) { if (d._.ActionStatus == ActionEnum.停止 && d._.GoodsStatus == GoodsEnum.辊台无货) { // 解锁 d.IsLockUnlock(false); } // 是否有锁定摆渡车 if (ADS.mArf.IsLockARF(d.area, d.taskType, out int goods)) { // 摆渡车过来待命 if (ADS.mArf.MovingButtSite(d.area, d.taskType, p)) { // 都只有1货,接过去 //if (goods == 1 && d._.GoodsStatus == GoodsEnum.辊台2有货) //{ // // 接货 // d.StartTakeRoll(d.taskType, 2); // if (d._.ActionStatus == ActionEnum.运行中) // { // // 摆渡车送货 // ADS.mArf.IsGiving(d.area, d.taskType); // } //} } } } else { // 空闲摆渡车 if (ADS.mArf.IsFreeARF(d.area, d.taskType)) { if ((d._.GoodsStatus == GoodsEnum.辊台满货 && d._.RollerStatus == RollerStatusEnum.辊台停止) || (d._.GoodsStatus == GoodsEnum.辊台2有货 && d._.RollerStatus != RollerStatusEnum.辊台2启动 && d._.RollerStatus != RollerStatusEnum.辊台全启动)) { d.StopRoller(); // 锁定 d.IsLockUnlock(true); } else { if (d._.GoodsStatus != GoodsEnum.辊台无货) { // 接货 d.StartTakeRoll(d.taskType, 1); } } } else { // 是否有锁定摆渡车 if (ADS.mArf.IsLockARF(d.area, d.taskType, out int goods)) { // 摆渡车来送货 if (ADS.mArf.MovingButtSite(d.area, d.taskType, p)) { // 试探接货,防止光电干扰 d.StartTakeRoll(d.taskType, 2); if (d._.GoodsStatus != GoodsEnum.辊台满货 || goods != 0) { // 接货 d.StartTakeRoll(d.taskType, 2); if (d._.ActionStatus == ActionEnum.运行中) { // 摆渡车送货 ADS.mArf.IsGiving(d.area, d.taskType); } } else { if ((d._.GoodsStatus == GoodsEnum.辊台满货 && d._.RollerStatus == RollerStatusEnum.辊台停止) || (d._.GoodsStatus == GoodsEnum.辊台2有货 && d._.RollerStatus != RollerStatusEnum.辊台2启动 && d._.RollerStatus != RollerStatusEnum.辊台全启动)) { d.StopRoller(); // 锁定 d.IsLockUnlock(true); } else { if (d._.GoodsStatus != GoodsEnum.辊台无货) { // 接货 d.StartTakeRoll(d.taskType, 1); if (d._.RollerStatus != RollerStatusEnum.辊台停止 && goods == 1) { // 摆渡车送货 ADS.mArf.IsGiving(d.area, d.taskType); } } } } } } } } break; default: break; } } catch (Exception ex) { // LOG CommonSQL.LogErr("FRT.DoTaskNew()", "固定辊台作业[设备]", (ex.Message + ex.Source), d.devName); continue; } } }
/// <summary> /// 检测任务状态 /// </summary> //public void DoTask() //{ // if (task == null || task.Count == 0) return; // foreach (TaskAWC t in task) // { // //if (!t.activie) continue; // if (t.taskstatus == TaskStatus.finish) continue; // if (string.IsNullOrEmpty(t.device.devName)) // { // DevInfoAWC device = FindFreeDevice(t.area, t.flag); // if (device != null) // { // t.device = device; // t.device.IsLockUnlock(true, t.jobid); // t.UpdateDev(); // // 更新接送点 // t.takesiteX = t.takesiteX + t.device.gapX; // t.takesiteY = t.takesiteY + t.device.gapY; // t.takesiteZ = t.takesiteZ + t.device.gapZ; // t.givesiteX = t.givesiteX + t.device.gapX; // t.givesiteY = t.givesiteY + t.device.gapY; // t.givesiteZ = t.givesiteZ + t.device.gapZ; // t.UpdateSite(); // } // } // else // { // // 故障&异常 // if (t.device._.CommandStatus == CommandEnum.命令错误 || t.device._.DeviceStatus == DeviceEnum.设备故障) // { // continue; // } // switch (t.taskstatus) // { // case TaskStatus.init: // t.UpdateStatus(TaskStatus.totakesite); // break; // case TaskStatus.totakesite: // // |接货点 - 当前坐标| <= 允许范围 // if (Math.Abs(t.takesiteX - t.device._.CurrentSiteX) <= t.device.limitX && // Math.Abs(t.takesiteY - t.device._.CurrentSiteY) <= t.device.limitY) // { // if (t.device._.ActionStatus == ActionEnum.停止) // { // t.UpdateStatus(TaskStatus.ontakesite); // } // } // else // { // t.device.ToSite(t.takesiteX, t.takesiteY); // } // break; // case TaskStatus.ontakesite: // if (t.takeready) // { // if (t.device._.ActionStatus == ActionEnum.停止 && t.device._.GoodsStatus == AwcGoodsEnum.无货) // { // t.device.StartTake(t.takesiteZ); // } // if (t.device._.ActionStatus == ActionEnum.运行中 && t.device._.CurrentTask == AwcTaskEnum.取货任务) // { // t.UpdateStatus(TaskStatus.taking); // } // } // else // { // // 出库接货(取库存货位)直接执行; 入库接货(取运输车辊台)需判断执行 // if (t.tasktype == TaskTypeEnum.出库) // { // t.takeready = true; // } // else // { // // ? JOB 更新请求 // t.takeready = ADS.JobPartAWC_Take(t.taskid); // } // } // break; // case TaskStatus.taking: // if (t.device._.GoodsStatus == AwcGoodsEnum.有货) // { // if (t.device._.ActionStatus == ActionEnum.停止) // { // t.UpdateStatus(TaskStatus.taked); // } // } // else // { // t.device.StartTake(t.takesiteZ); // } // break; // case TaskStatus.taked: // t.UpdateStatus(TaskStatus.togivesite); // break; // case TaskStatus.togivesite: // // |送货点 - 当前坐标| <= 允许范围 // if (Math.Abs(t.givesiteX - t.device._.CurrentSiteX) <= t.device.limitX && // Math.Abs(t.givesiteY - t.device._.CurrentSiteY) <= t.device.limitY) // { // if (t.device._.ActionStatus == ActionEnum.停止) // { // t.UpdateStatus(TaskStatus.ongivesite); // } // } // else // { // t.device.ToSite(t.givesiteX, t.givesiteY); // } // break; // case TaskStatus.ongivesite: // if (t.giveready) // { // if (t.device._.GoodsStatus == AwcGoodsEnum.有货 && t.device._.ActionStatus == ActionEnum.停止) // { // t.device.StartGive(t.givesiteZ); // } // if (t.device._.ActionStatus == ActionEnum.运行中 && t.device._.CurrentTask == AwcTaskEnum.放货任务) // { // t.UpdateStatus(TaskStatus.giving); // } // } // else // { // // 入库送货(放库存货位)直接执行; 出库送货(放运输车辊台)需判断执行 // if (t.tasktype == TaskTypeEnum.入库) // { // t.giveready = true; // } // else // { // // ? JOB 更新请求 // t.giveready = ADS.JobPartAWC_Give(t.taskid); // } // } // break; // case TaskStatus.giving: // if (t.device._.GoodsStatus == AwcGoodsEnum.无货) // { // if (t.device._.ActionStatus == ActionEnum.停止) // { // t.UpdateStatus(TaskStatus.gived); // } // } // else // { // t.device.StartGive(t.givesiteZ); // } // break; // case TaskStatus.gived: // if (t.tasktype == TaskTypeEnum.入库) // { // // ? JOB 更新请求 // ADS.JobPartAWC_FinishIn(t.taskid); // } // // 解锁设备、完成任务 // t.device.IsLockUnlock(false); // t.device = new DevInfoAWC(); // t.UpdateStatus(TaskStatus.finish); // break; // default: // break; // } // } // } //} public void DoTaskNew() { if (devices == null || devices.Count == 0) { return; } foreach (DevInfoAWC d in devices) { try { if (!d.isUseful || !ADS.mSocket.IsConnected(d.devName) || d._.CommandStatus == CommandEnum.命令错误 || d._.DeviceStatus == DeviceEnum.设备故障) { continue; } if (!string.IsNullOrEmpty(d.lockID)) { switch (d.taskType) { case TaskTypeEnum.入库: InTask: if (d.IsOkLoc(false)) { if (d.isLock) { if (d._.ActionStatus == ActionEnum.停止) { if (d._.GoodsStatus == AwcGoodsEnum.无货 && (d._.FinishTask == AwcTaskEnum.放货任务 || d._.FinishTask == AwcTaskEnum.位任务)) { // 通知WMS完成 if (ADS.mHttp.DoStockInFinishTask(d.lockLocWMS, d.lockID).Contains("OK")) { // 解锁 if (d.IsOkLoc(true)) { CommonSQL.UpdateWms(d.lockID, (int)WmsTaskStatus.完成); d.IsLockUnlockNew(TaskTypeEnum.无, false); } } } else { // |送货点 - 当前坐标| <= 允许范围 if (Math.Abs(d.GiveSiteX - d._.CurrentSiteX) <= d.limitX && Math.Abs(d.GiveSiteY - d._.CurrentSiteY) <= d.limitY) { // 放货 d.StartGive(d.GiveSiteZ); } else { if (IsSafeDis(d.area, d.flag, d._.CurrentSiteX - d.gapX, d.GiveSiteX - d.gapX)) { // 定位 d.ToSite(d.GiveSiteX, d.GiveSiteY); } } } } } else { bool isOkRgv = false; // 是否对应运输车 if (ADS.mRgv.IsLockRGV(d.lockID, out int num)) { if (ADS.mRgv.MovingButtSite(d.lockID, num == 1 ? d.lockLocRGV1 : d.lockLocRGV2)) { isOkRgv = true; } } else { if (d._.GoodsStatus == AwcGoodsEnum.无货 && d._.ActionStatus == ActionEnum.停止) { // 解任务 d.IsLockUnlock(false); break; } } if (d._.ActionStatus == ActionEnum.停止) { if (d._.GoodsStatus == AwcGoodsEnum.货 && (d._.FinishTask == AwcTaskEnum.取货任务 || d._.FinishTask == AwcTaskEnum.位任务)) { if (ADS.mRgv.IsUnlock(d.lockID)) { // 锁定 d.IsLockUnlock(true, d.lockID); goto InTask; } } else { // |接货点 - 当前坐标| <= 允许范围 if (Math.Abs(d.TakeSiteX - d._.CurrentSiteX) <= d.limitX && Math.Abs(d.TakeSiteY - d._.CurrentSiteY) <= d.limitY) { if (isOkRgv) { // 取货 d.StartTake(d.TakeSiteZ); } } else { if (IsSafeDis(d.area, d.flag, d._.CurrentSiteX - d.gapX, d.TakeSiteX - d.gapX)) { // 定位 d.ToSite(d.TakeSiteX, d.TakeSiteY); } } } } else { if (d._.CurrentTask == AwcTaskEnum.取货任务 && d._.GoodsStatus == AwcGoodsEnum.货) { // 安全取货距离 int s = ADS.mDis.GetAwcTakeRgvDis(d.area); if (s == 0) { throw new Exception("无对应行车安全取完货距离!"); } // 解锁任务运输车 if (d._.CurrentSiteZ >= s) { if (ADS.mRgv.IsUnlock(d.lockID)) { // 锁定 //d.IsLockUnlock(true, d.lockID); } } } } } } break; case TaskTypeEnum.出库: OutTask: if (d.IsOkLoc(false)) { if (d.isLock) { bool isOkRgv = false; // 是否对应运输车 if (ADS.mRgv.IsLockRGV(d.lockID, out int num)) { if (ADS.mRgv.MovingButtSite(d.lockID, num == 1 ? d.lockLocRGV1 : d.lockLocRGV2)) { isOkRgv = true; } } if (d._.ActionStatus == ActionEnum.停止) { if (d._.GoodsStatus == AwcGoodsEnum.无货 && (d._.FinishTask == AwcTaskEnum.放货任务 || d._.FinishTask == AwcTaskEnum.位任务)) { // 通知WMS完成 if (ADS.mHttp.DoStockOutFinishTask(d.lockLocWMS, d.lockID).Contains("OK")) { if (ADS.mRgv.IsUnlock(d.lockID)) { // 解锁 if (d.IsOkLoc(true)) { CommonSQL.UpdateWms(d.lockID, (int)WmsTaskStatus.完成); d.IsLockUnlockNew(TaskTypeEnum.无, false); } } } } else { // |放货点 - 当前坐标| <= 允许范围 if (Math.Abs(d.GiveSiteX - d._.CurrentSiteX) <= d.limitX && Math.Abs(d.GiveSiteY - d._.CurrentSiteY) <= d.limitY) { if (isOkRgv) { // 送货 d.StartGive(d.GiveSiteZ); } } else { if (IsSafeDis(d.area, d.flag, d._.CurrentSiteX - d.gapX, d.GiveSiteX - d.gapX)) { // 定位 d.ToSite(d.GiveSiteX, d.GiveSiteY); } } } } else { if (d._.CurrentTask == AwcTaskEnum.放货任务 && d._.GoodsStatus == AwcGoodsEnum.无货) { // 安全放货距离 int s = ADS.mDis.GetAwcGiveRgvDis(d.area); if (s == 0) { throw new Exception("无对应行车安全放完货距离!"); } // 解锁任务运输车 if (d._.CurrentSiteZ >= s) { //ADS.mRgv.IsUnlock(d.lockID); } } } } else { if (d._.ActionStatus == ActionEnum.停止) { if (d._.GoodsStatus == AwcGoodsEnum.货 && (d._.CurrentTask == AwcTaskEnum.取货任务 || d._.CurrentTask == AwcTaskEnum.位任务)) { // 锁定 d.IsLockUnlock(true, d.lockID); goto OutTask; } else { // 是否对应运输车 if (ADS.mRgv.IsLockRGV(d.lockID, out int num)) { ADS.mRgv.MovingButtSite(d.lockID, num == 1 ? d.lockLocRGV1 : d.lockLocRGV2); } else { if (d._.GoodsStatus == AwcGoodsEnum.无货) { // 解任务 d.IsLockUnlock(false); break; } } // |取货点 - 当前坐标| <= 允许范围 if (Math.Abs(d.TakeSiteX - d._.CurrentSiteX) <= d.limitX && Math.Abs(d.TakeSiteY - d._.CurrentSiteY) <= d.limitY) { // 取货 d.StartTake(d.TakeSiteZ); } else { if (IsSafeDis(d.area, d.flag, d._.CurrentSiteX - d.gapX, d.TakeSiteX - d.gapX)) { // 定位 d.ToSite(d.TakeSiteX, d.TakeSiteY); } } } } } } break; default: break; } } } catch (Exception ex) { // LOG CommonSQL.LogErr("AWC.DoTaskNew()", "行车作业[设备]", (ex.Message + ex.Source), d.devName); continue; } } }
/// <summary> /// 检测任务状态 /// </summary> //public void DoTask() //{ // if (task == null || task.Count == 0) return; // foreach (TaskPKL t in task) // { // //if (!t.activie) continue; // if (t.taskstatus == TaskStatus.finish) continue; // if (string.IsNullOrEmpty(t.device.devName)) // { // DevInfoPKL device = FindFreeDevice(t.area); // if (device != null) // { // t.device = device; // t.device.IsLockUnlock(true, t.jobid); // t.UpdateDev(); // } // } // else // { // // 故障&异常 // if (t.device._.CommandStatus == CommandEnum.命令错误 || t.device._.DeviceStatus == DeviceEnum.设备故障) // { // continue; // } // switch (t.taskstatus) // { // case TaskStatus.init: // t.UpdateStatus(TaskStatus.ongivesite); // break; // case TaskStatus.totakesite: // break; // case TaskStatus.ontakesite: // break; // case TaskStatus.taking: // break; // case TaskStatus.taked: // break; // case TaskStatus.togivesite: // break; // case TaskStatus.ongivesite: // // 判断是否启动辊台送货 // if (t.giveready) // { // if (t.device._.GoodsStatus != GoodsEnum.辊台无货 && t.device._.ActionStatus == ActionEnum.停止) // { // t.device.StartGiveRoll(); // } // if (t.device._.CurrentTask == TaskEnum.辊台任务) // { // t.UpdateStatus(TaskStatus.giving); // } // } // else // { // // ? JOB 更新请求 // t.giveready = ADS.JobPartPKL_Give(t.jobid); // } // break; // case TaskStatus.giving: // if (t.device._.GoodsStatus == GoodsEnum.辊台无货) // { // if (t.device._.ActionStatus == ActionEnum.停止) // { // t.UpdateStatus(TaskStatus.gived); // } // else // { // t.device.StopTask(); // } // } // else // { // t.device.StartGiveRoll(); // } // break; // case TaskStatus.gived: // // 解锁设备、完成任务 // t.device.IsLockUnlock(false); // t.device = new DevInfoPKL(); // t.UpdateStatus(TaskStatus.finish); // break; // default: // break; // } // } // } //} public void DoTaskNew() { if (devices == null || devices.Count == 0) { return; } foreach (DevInfoPKL d in devices) { try { bool isCanWork = true; if (!d.isUseful || !ADS.mSocket.IsConnected(d.devName) || d._.CommandStatus == CommandEnum.命令错误 || d._.DeviceStatus == DeviceEnum.设备故障 || string.IsNullOrEmpty(d.lockID2)) { isCanWork = false; //continue; } int aid = 0; if (!d.isLock) { if (!PublicParam.IsDoJobAGV || !isCanWork) { continue; } if (d._.ActionStatus == ActionEnum.停止 && d._.GoodsStatus == GoodsEnum.辊台1有货) { if (string.IsNullOrEmpty(d.lockID1)) { aid = ADS.mNDCControl.IsExistLoad(d.devName); if (aid == 0) { // 没锁定就派车锁定 aid = CommonSQL.GetAGVid(); // NDC 任务是否存在 if (!ADS.mNDCControl.IsExist(aid)) { // ? NDC 生成 AGV 搬运任务 if (!ADS.mNDCControl.AddNDCTask(aid, d.devName, PublicParam.AgvUnLoadArea, out string result)) { // LOG CommonSQL.LogErr("PKL.DoTaskNew()", "AGV生成任务[ID,包装线辊台]", result, aid.ToString(), d.devName); continue; } } } if (aid != 0) { d.IsLockUnlockNew(true, aid.ToString(), d.lockID2); } } else { d.IsLockUnlockNew(true, d.lockID1, d.lockID2); } } } else { if (string.IsNullOrEmpty(d.lockID1)) { if (!isCanWork) { continue; } // 解锁 d.IsLockUnlockNew(false); continue; } else { aid = Convert.ToInt32(d.lockID1); // NDC 任务是否存在 if (!ADS.mNDCControl.IsExist(aid)) { if (!isCanWork) { continue; } // 解锁 d.IsLockUnlockNew(false); continue; } // NDC 任务状态 switch (ADS.mNDCControl.GetStatus(aid)) { case NDCPlcStatus.LoadUnReady: case NDCPlcStatus.LoadReady: if (!isCanWork) { break; } if (d._.ActionStatus == ActionEnum.停止 && d._.GoodsStatus == GoodsEnum.辊台1有货) { // NDC 请求 AGV 启动辊台装货 if (!ADS.mNDCControl.DoLoad(aid, out string result)) { // LOG if (!string.IsNullOrEmpty(result)) { CommonSQL.LogErr("PKL.DoTaskNew()", "AGV辊台装货[ID]", result, aid.ToString()); } } } break; case NDCPlcStatus.Loading: if (!isCanWork) { break; } if (d._.ActionStatus == ActionEnum.停止 && d._.GoodsStatus == GoodsEnum.辊台1有货) { d.StartGiveRoll(); } break; case NDCPlcStatus.Loaded: case NDCPlcStatus.UnloadUnReady: // NDC 任务是否需要重定向 if (!ADS.mNDCControl.IsRedirected(aid) && !string.IsNullOrEmpty(d.lockID2)) { // 获取WMS任务目的区域 string area = ADS.GetInAreaWMS(d.area, d.lockID2, out string tid); string frt = ADS.mFrt.GetRightFRT(area, TaskTypeEnum.入库); if (string.IsNullOrEmpty(area) || string.IsNullOrEmpty(frt)) { break; } // NDC 更新 AGV搬运卸货点 if (!ADS.mNDCControl.DoReDerect(aid, frt, out string result)) { // LOG CommonSQL.LogErr("PKL.DoTaskNew()", "AGV更新卸货点[ID]", result, aid.ToString()); break; } // 更新 CommonSQL.UpdateWms(tid, (int)WmsTaskStatus.待分配); } else { // 解锁 d.IsLockUnlockNew(false); } break; default: if (!isCanWork) { break; } // 解锁 d.IsLockUnlockNew(false); break; } } } } catch (Exception ex) { //if (ex.ToString().Contains("重复")) //{ // MessageBox.Show(d.devName + ex.ToString()); //} // LOG CommonSQL.LogErr("PKL.DoTaskNew()", "包装线作业[设备]", (ex.Message + ex.Source), d.devName); continue; } } }