/// <summary> /// AGV 装货中 /// </summary> /// <param name="id"></param> /// <param name="agv"></param> public void SubmitAgvLoading(int id, string agv) { try { // 获取对应AGV任务资讯 String sql = String.Format(@"select * from wcs_agv_info where MAGIC = '{0}' and ID = '{1}' and AGV = '{2}'", AGVMagic.到达装货点, id.ToString(), agv); DataTable dt = DataControl._mMySql.SelectAll(sql); if (DataControl._mStools.IsNoData(dt)) { // LOG DataControl._mTaskTools.RecordTaskErrLog("SubmitNDCPlcLoading()", "AGV装货中[AGV任务ID,AGV设备号]", id.ToString(), agv, "找不到对应AGV任务资讯!"); return; } WCS_AGV_INFO info = dt.ToDataEntity <WCS_AGV_INFO>(); // 生成包装线固定辊台指令 FRT frt = new FRT(info.PICKSTATION); // 获取指令-- 反向送货 byte[] order = FRT._RollerControl(frt.FRTNum(), FRT.RollerRunAll, FRT.RunObverse, FRT.GoodsDeliver, FRT.GoodsQty1); // 加入任务作业链表 WCS_TASK_ITEM item = new WCS_TASK_ITEM() { ITEM_ID = "包装线送货", WCS_NO = info.TASK_UID, ID = info.ID, DEVICE = info.PICKSTATION, LOC_TO = info.AGV }; DataControl._mTaskControler.StartTask(new AGVFRTTack(item, DeviceType.固定辊台, order)); } catch (Exception ex) { // LOG DataControl._mTaskTools.RecordTaskErrLog("SubmitNDCPlcLoading()", "AGV装货中[AGV任务ID,AGV设备号]", id.ToString(), agv, ex.ToString()); } }
public FRTDeviceModel(string devid, string area) { frt = new FRT(devid); DeviceID = devid; Area = area; Update(); }
/// <summary> /// 终止任务 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TerminateBtn_Click(object sender, RoutedEventArgs e) { try { if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } string dev = CBdev.Text; FRT frt = new FRT(dev); if (frt.DeviceStatus() == FRT.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } byte[] order = FRT._StopTask(frt.FRTNum()); if (!DataControl._mSocket.SendToClient(dev, order, out string result)) { Notice.Show("指令发送失败:" + result.ToString(), "错误", 3, MessageBoxIcon.Error); return; } Notice.Show("终止任务 指令发送成功!", "成功", 3, MessageBoxIcon.Success); DataControl._mSocket.SwithRefresh(dev, true); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.ToString(), "错误", 3, MessageBoxIcon.Error); } }
public FRTTack(WCS_TASK_ITEM item, string deviceType, byte[] order) : base(item, deviceType, order) { _device = new FRT(ITEM.DEVICE); log = new Log("Task_FRT-" + ITEM.ID + "-"); // 记录生成指令LOG log.LOG(DataControl._mTaskTools.GetLogMessC(item, order)); }
public AGVFRTTack(WCS_TASK_ITEM item, string deviceType, byte[] order) : base(item, deviceType, order) { _device = new FRT(ITEM.DEVICE); log = new Log("AGV_FRT-" + ITEM.ID + "-"); // 记录生成指令LOG log.LOG(String.Format(@"【CreatOrder】{0}:WMS任务ID[ {1} ],AGV任务ID[ {2} ],设备号[ {3} ], 指令[ {4} ].", item.ITEM_ID, item.WCS_NO, item.ID, item.DEVICE, DataControl._mStools.BytetToString(order))); }
/// <summary> /// 连接网络设备 /// </summary> public void LinkDevicesClient() { try { // 清空设备 DataControl._mSocket.Close(); // 获取设备设定档资讯 String sql = "select * from wcs_config_device where FLAG <> 'N' order by CREATION_TIME"; DataTable dt = DataControl._mMySql.SelectAll(sql); if (DataControl._mStools.IsNoData(dt)) { return; } List <WCS_CONFIG_DEVICE> devList = dt.ToDataList <WCS_CONFIG_DEVICE>(); // 遍历加入网络设备 foreach (WCS_CONFIG_DEVICE dev in devList) { byte[] refreshB = null; switch (dev.TYPE) { case DeviceType.固定辊台: refreshB = FRT._GetData(); break; case DeviceType.摆渡车: refreshB = ARF._GetData(); break; case DeviceType.行车: refreshB = ABC._GetData(); break; case DeviceType.运输车: refreshB = RGV._GetData(); break; default: continue; } if (!DataControl._mSocket.AddClient(dev.DEVICE, dev.IP, dev.PORT, refreshB, out string result)) { throw new Exception(result); } } } catch (Exception ex) { // 记录LOG RecordTaskErrLog("LinkDevicesClient()", "连接网络设备", null, null, ex.ToString()); MessageBox.Show("连接网络设备发生异常:" + ex.ToString(), "Error"); System.Environment.Exit(0); } }
/// <summary> /// 终止任务 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void TerminateBtn_Click(object sender, RoutedEventArgs e) { string dev = ""; byte[] order = null; try { if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } dev = CBdev.Text; FRT frt = new FRT(dev); if (frt.DeviceStatus() == FRT.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } order = FRT._StopTask(frt.FRTNum()); if (!DataControl._mSocket.SendToClient(dev, order, out string result)) { Notice.Show("指令发送失败:" + result.ToString(), "错误", 3, MessageBoxIcon.Error); // LOG DataControl._mTaskTools.RecordTaskErrLog("TerminateBtn_Click()", "固定辊台-终止任务[FRT,指令]", dev, DataControl._mStools.BytetToString(order), result.ToString()); return; } Notice.Show("终止任务 指令发送成功!", "成功", 3, MessageBoxIcon.Success); DataControl._mSocket.SwithRefresh(dev, true); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.Message, "错误", 3, MessageBoxIcon.Error); // LOG DataControl._mTaskTools.RecordTaskErrLog("TerminateBtn_Click()", "固定辊台-终止任务[FRT,指令]", dev, DataControl._mStools.BytetToString(order), ex.Message); } }
/// <summary> /// 启动辊台 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BTNrun_Click(object sender, EventArgs e) { string dev = ""; byte[] order = null; try { if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } dev = CBdev.Text; FRT frt = new FRT(dev); if (frt.ActionStatus() == FRT.Run) { Notice.Show("指令发送失败:设备运行中!", "错误", 3, MessageBoxIcon.Error); return; } if (frt.DeviceStatus() == FRT.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } if (!WindowCommon.ConfirmAction("是否进行[滚筒启动任务]!!")) { return; } // 方式 byte site1 = FRT.RollerRun1; if (CBsite1.SelectedValue.ToString() == "启动2#辊台") { site1 = FRT.RollerRun2; } if (CBsite1.SelectedValue.ToString() == "启动全部辊台") { site1 = FRT.RollerRunAll; } // 方向 byte site2 = FRT.RunFront; if (CBsite2.SelectedValue.ToString() == "反向启动") { site2 = FRT.RunObverse; } // 类型 byte site3 = FRT.GoodsReceive; if (CBsite3.SelectedValue.ToString() == "送货") { site3 = FRT.GoodsDeliver; } // 数量 byte site4 = FRT.GoodsQty1; if (CBsite4.SelectedValue.ToString() == "货物数量2") { site4 = FRT.GoodsQty2; } order = FRT._RollerControl(frt.FRTNum(), site1, site2, site3, site4); DataControl._mSocket.SwithRefresh(dev, false); if (!DataControl._mSocket.SendToClient(dev, order, out string result)) { DataControl._mSocket.SwithRefresh(dev, true); Notice.Show("指令发送失败:" + result.ToString(), "错误", 3, MessageBoxIcon.Error); // LOG DataControl._mTaskTools.RecordTaskErrLog("BTNrun_Click()", "固定辊台-启动辊台任务[FRT,指令]", dev, DataControl._mStools.BytetToString(order), result.ToString()); return; } Notice.Show("启动辊台 指令发送成功!", "成功", 3, MessageBoxIcon.Success); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.Message, "错误", 3, MessageBoxIcon.Error); // LOG DataControl._mTaskTools.RecordTaskErrLog("BTNrun_Click()", "固定辊台-启动辊台任务[FRT,指令]", dev, DataControl._mStools.BytetToString(order), ex.Message); } }
/// <summary> /// 生成对应辊台任务指令 /// </summary> /// <param name="agv"></param> public void CreatOrderTask(WCS_AGV_INFO agv) { try { // 按任务当前状态处理 switch (Convert.ToInt32(agv.MAGIC)) { case AGVMagic.到达装货点: // 获取对应包装线固定辊台资讯 FRT frt = new FRT(agv.PICKSTATION); // 是否作业中 if (frt.CurrentStatus() != FRT.RollerStop) { return; } // 是否存在货物 //if (frt.GoodsStatus() == FRT.GoodsYesAll) if (frt.GoodsStatus() == FRT.GoodsYesAll || PublicParam.IsIgnoreFRT) //add调试判断 { // 分配 WMS TASK if (String.IsNullOrEmpty(agv.TASK_UID.Trim())) { // 获取WMS TASK ID String sql = String.Format(@"select TASK_UID from wcs_task_info where TASK_TYPE = '{0}' and W_S_LOC = '{1}' and TASK_UID not in (select DISTINCT TASK_UID from wcs_agv_info where TASK_UID is not null)", TaskType.AGV搬运, DataControl._mTaskTools.GetArea(agv.PICKSTATION)); DataTable dt = DataControl._mMySql.SelectAll(sql); if (DataControl._mStools.IsNoData(dt)) { // LOG DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", "无对应 WMS Task!"); return; } // 更新AGV任务资讯-- WMS TASK ID agv.TASK_UID = dt.Rows[0]["TASK_UID"].ToString(); sql = String.Format(@"update wcs_agv_info set TASK_UID = '{1}' where ID = '{0}'", agv.ID, agv.TASK_UID); DataControl._mMySql.ExcuteSql(sql); } // 分配卸货点 if (agv.UPDATE_TIME == null) { // 获取 WMS 任务目标点 String sqlloc = String.Format(@"select distinct DEVICE from wcs_config_device where FLAG in('{1}','{2}') and TYPE = '{3}' and AREA in (select W_D_LOC from wcs_task_info where TASK_UID = '{0}') and DEVICE in (select distinct DROPSTATION From wcs_agv_info where MAGIC <> {4} group by DROPSTATION HAVING count(DROPSTATION) < {5}) order by FLAG,CREATION_TIME", agv.TASK_UID, DeviceFlag.占用, DeviceFlag.空闲, DeviceType.固定辊台, AGVMagic.任务完成, 3);//最多三辆车 DataTable dtloc = DataControl._mMySql.SelectAll(sqlloc); if (DataControl._mStools.IsNoData(dtloc)) { // LOG DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", "无对应 WMS Task 目标位置!"); return; } // 更新AGV任务资讯-- 卸货点 agv.DROPSTATION = dtloc.Rows[0]["DEVICE"].ToString(); sqlloc = String.Format(@"update wcs_agv_info set UPDATE_TIME = NOW(), DROPSTATION = '{1}' where ID = '{0}'; update wcs_config_device set FLAG = '{2}' where DEVICE = '{1}'", agv.ID, agv.DROPSTATION, DeviceFlag.占用); DataControl._mMySql.ExcuteSql(sqlloc); // 发送 NDC 更新点位 UpdateAGVStation(agv.ID, agv.DROPSTATION); } // 发指令请求AGV启动辊台装货 if (!DataControl._mNDCControl.DoLoad(agv.ID, Convert.ToInt32(agv.AGV), out string result)) { // LOG DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", result.ToString()); return; } } break; case AGVMagic.到达卸货点: // 获取对应包装线固定辊台资讯 FRT frtdrop = new FRT(agv.DROPSTATION); // 是否作业中 if (frtdrop.CurrentStatus() != FRT.RollerStop) { // 当已启动辊台 if (frtdrop.CurrentTask() == FRT.TaskTake && (frtdrop.CurrentStatus() == FRT.RollerRun1 || frtdrop.CurrentStatus() == FRT.RollerRunAll)) { // 发指令请求AGV启动辊台装货 if (!DataControl._mNDCControl.DoUnLoad(agv.ID, Convert.ToInt32(agv.AGV), out string result)) { // LOG DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", result.ToString()); return; } } return; } else // 未启动辊台 { byte[] order = null; // 当辊台都无货 //if (frtdrop.GoodsStatus() == FRT.GoodsNoAll) if (frtdrop.GoodsStatus() == FRT.GoodsNoAll || PublicParam.IsIgnoreFRT) //add调试判断 { // 获取指令-- 启动所有辊台 正向接货 order = FRT._RollerControl(frtdrop.FRTNum(), FRT.RollerRunAll, FRT.RunFront, FRT.GoodsReceive, FRT.GoodsQty1); } // 当仅2#辊台有货 else if (frtdrop.GoodsStatus() == FRT.GoodsYes2) { // 获取指令-- 只启动1#辊台 正向接货 order = FRT._RollerControl(frtdrop.FRTNum(), FRT.RollerRun1, FRT.RunFront, FRT.GoodsReceive, FRT.GoodsQty1); } // 加入任务作业链表 WCS_TASK_ITEM item = new WCS_TASK_ITEM() { ITEM_ID = "库区接货", WCS_NO = agv.TASK_UID, ID = agv.ID, DEVICE = agv.DROPSTATION, LOC_FROM = agv.AGV }; DataControl._mTaskControler.StartTask(new AGVFRTTack(item, DeviceType.固定辊台, order)); } break; default: return; } } catch (Exception ex) { // LOG DataControl._mTaskTools.RecordTaskErrLog("CreatOrderTask()", "AGV辊台任务[AGV任务ID]", agv.ID.ToString(), "", ex.ToString()); } }
/// <summary> /// 启动辊台 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BTNrun_Click(object sender, EventArgs e) { try { if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } string dev = CBdev.Text; FRT frt = new FRT(dev); if (frt.ActionStatus() == FRT.Run) { Notice.Show("指令发送失败:设备运行中!", "错误", 3, MessageBoxIcon.Error); return; } if (frt.DeviceStatus() == FRT.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } // 方式 byte site1 = FRT.RollerRun1; if (CBsite1.SelectedValue.ToString() == "启动2#辊台") { site1 = FRT.RollerRun2; } if (CBsite1.SelectedValue.ToString() == "启动全部辊台") { site1 = FRT.RollerRunAll; } // 方向 byte site2 = FRT.RunFront; if (CBsite2.SelectedValue.ToString() == "反向启动") { site2 = FRT.RunObverse; } // 类型 byte site3 = FRT.GoodsReceive; if (CBsite3.SelectedValue.ToString() == "送货") { site3 = FRT.GoodsDeliver; } // 数量 byte site4 = FRT.GoodsQty1; if (CBsite4.SelectedValue.ToString() == "货物数量2") { site4 = FRT.GoodsQty2; } byte[] order = FRT._RollerControl(frt.FRTNum(), site1, site2, site3, site4); if (!DataControl._mSocket.SendToClient(dev, order, out string result)) { Notice.Show("指令发送失败:" + result.ToString(), "错误", 3, MessageBoxIcon.Error); return; } Notice.Show("启动辊台 指令发送成功!", "成功", 3, MessageBoxIcon.Success); DataControl._mSocket.SwithRefresh(dev, false); } catch (Exception ex) { Notice.Show("指令发送失败:" + ex.ToString(), "错误", 3, MessageBoxIcon.Error); } }
public override void DoWork() { try { // 异常 if (_device.DeviceStatus() == ARF.DeviceError || _device.CommandStatus() == ARF.CommandError) { ISetTaskErr(); // LOG log.LOG(DataControl._mTaskTools.GetLogMessE(ITEM, Order, "设备故障或命令错误.")); return; } // 对接任务 if (ITEM.ITEM_ID.Substring(0, 2) == "11") { #region 调试 if (PublicParam.IsIgnoreARF) //add调试判断 { if (_device.ActionStatus() == ARF.Stop) { // 发送指令 if (!DataControl._mSocket.SendToClient(ITEM.DEVICE, Order, out string result)) { throw new Exception(result); } DataControl._mSocket.SwithRefresh(ITEM.DEVICE, false); // LOG log.LOG(DataControl._mTaskTools.GetLogMess(ITEM, Order)); } else { Thread.Sleep(5000); // 完成任务 ISetTaskSuc(); // 解锁设备数据状态 DataControl._mTaskTools.DeviceUnLock(ITEM.DEVICE); // LOG log.LOG(DataControl._mTaskTools.GetLogMessS(ITEM, Order)); } return; } #endregion if (!string.IsNullOrEmpty(ITEM.LOC_TO.Trim())) // 目标不为空即最终无货 { // 获取目标设备类型 String typeTo = DataControl._mTaskTools.GetDeviceType(ITEM.LOC_TO); // 摆渡车对接 固定辊台/运输车 switch (typeTo) { case DeviceType.固定辊台: FRT _frt = new FRT(ITEM.LOC_TO); // 固定辊台停止状态 if (_frt.CurrentStatus() == FRT.RollerStop) { // 固定辊台上无货物 if (_frt.GoodsStatus() == FRT.GoodsNoAll) { return; } } else if (_device.GoodsStatus() == ARF.GoodsYesAll && _device.ActionStatus() == ARF.Stop && _frt.GoodsStatus() == FRT.GoodsYesAll && _frt.ActionStatus() == FRT.Stop) { return; // 摆渡车与摆渡车都有货,不启动辊台 } break; case DeviceType.运输车: RGV _rgv = new RGV(ITEM.LOC_TO); // 运输车辊台停止状态 if (_rgv.CurrentStatus() == RGV.RollerStop) { // 运输车辊台上无货物 if (_rgv.GoodsStatus() == RGV.GoodsNoAll) { return; } } else if (_device.GoodsStatus() == ARF.GoodsYesAll && _device.ActionStatus() == ARF.Stop && _rgv.GoodsStatus() == RGV.GoodsYesAll && _rgv.ActionStatus() == RGV.Stop) { return; // 摆渡车与运输车都有货,不启动辊台 } break; default: break; } // 摆渡车无货物 if (_device.GoodsStatus() == ARF.GoodsNoAll && _device.ActionStatus() == ARF.Stop) { // 完成任务 ISetTaskSuc(); // 解锁设备数据状态 DataControl._mTaskTools.DeviceUnLock(ITEM.DEVICE); // LOG log.LOG(DataControl._mTaskTools.GetLogMessS(ITEM, Order)); return; } } else { // 获取目标设备类型 String typeFrom = DataControl._mTaskTools.GetDeviceType(ITEM.LOC_FROM); // 摆渡车对接 固定辊台/运输车 switch (typeFrom) { case DeviceType.固定辊台: FRT _frt = new FRT(ITEM.LOC_FROM); // 固定辊台上无货物,摆渡车辊台上有货物 if (_frt.GoodsStatus() == FRT.GoodsNoAll && _device.GoodsStatus() != ARF.GoodsNoAll && _device.ActionStatus() == ARF.Stop) { // 完成任务 ISetTaskSuc(); // LOG log.LOG(DataControl._mTaskTools.GetLogMessS(ITEM, Order)); return; } else if (_device.GoodsStatus() == ARF.GoodsYesAll && _device.ActionStatus() == ARF.Stop && _frt.GoodsStatus() == FRT.GoodsYesAll && _frt.ActionStatus() == FRT.Stop) { return; // 摆渡车与摆渡车都有货,不启动辊台 } break; case DeviceType.运输车: RGV _rgv = new RGV(ITEM.LOC_FROM); // 运输车辊台上无货物,摆渡车辊台上有货物 if (_rgv.GoodsStatus() == FRT.GoodsNoAll && _device.GoodsStatus() != ARF.GoodsNoAll) { // 完成任务 ISetTaskSuc(); // LOG log.LOG(DataControl._mTaskTools.GetLogMessS(ITEM, Order)); return; } else if (_device.GoodsStatus() == ARF.GoodsYesAll && _device.ActionStatus() == ARF.Stop && _rgv.GoodsStatus() == RGV.GoodsYesAll && _rgv.ActionStatus() == RGV.Stop) { return; // 摆渡车与运输车都有货,不启动辊台 } break; default: break; } } // 发送指令 if (_device.ActionStatus() == ARF.Stop) { if (!DataControl._mSocket.SendToClient(ITEM.DEVICE, Order, out string result)) { throw new Exception(result); } DataControl._mSocket.SwithRefresh(ITEM.DEVICE, false); // LOG log.LOG(DataControl._mTaskTools.GetLogMess(ITEM, Order)); } } // 定位任务 else { // 发送指令 if (_device.ActionStatus() == ARF.Stop) { if (!DataControl._mSocket.SendToClient(ITEM.DEVICE, Order, out string result)) { throw new Exception(result); } DataControl._mSocket.SwithRefresh(ITEM.DEVICE, false); // LOG log.LOG(DataControl._mTaskTools.GetLogMess(ITEM, Order)); } // 当前位置与目的位置一致 视为任务完成 if (_device.CurrentSite() == Convert.ToInt32(ITEM.LOC_TO) && _device.ActionStatus() == ARF.Stop) { // 等待对接 ISetTaskWait(); // LOG log.LOG(DataControl._mTaskTools.GetLogMessW(ITEM, Order)); return; } } } catch (Exception ex) { // LOG log.LOG(DataControl._mTaskTools.GetLogMessE(ITEM, Order, ex.ToString())); } }