/// <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; RGV rgv = new RGV(dev); if (rgv.DeviceStatus() == RGV.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } byte[] order = RGV._StopTask(rgv.RGVNum()); 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 RGVDeviceModel(string devid, string area) { rgv = new RGV(devid); DeviceID = devid; Area = area; Update(); }
public void Init(RGV rgv) { this.lbName.Text = rgv.Name; this.lbInfo.Text = "闲置"; this.lbClampCode.Text = rgv.Clamp.Code; this.lbClampCode.BackColor = rgv.ClampStatus == ClampStatus.异常 ? Color.Red : Color.Transparent; }
public RGVTack(WCS_TASK_ITEM item, string deviceType, byte[] order) : base(item, deviceType, order) { _device = new RGV(ITEM.DEVICE); log = new Log("Task_RGV-" + ITEM.ID + "-"); // 记录生成指令LOG log.LOG(DataControl._mTaskTools.GetLogMessC(item, order)); }
/// <summary> /// 定位任务 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void LocateBtn_Click(object sender, RoutedEventArgs e) { string dev = ""; byte[] order = null; try { 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; RGV rgv = new RGV(dev); if (rgv.ActionStatus() == RGV.Run) { Notice.Show("指令发送失败:设备运行中!", "错误", 3, MessageBoxIcon.Error); return; } if (rgv.DeviceStatus() == RGV.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } if (!WindowCommon.ConfirmAction("是否进行[定位任务]!!")) { return; } int loc = Convert.ToInt32(location.Text.Trim()); order = RGV._Position(rgv.RGVNum(), DataControl._mStools.IntToBytes(loc)); 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("LocateBtn_Click()", "运输车-定位任务[RGV,指令]", 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("LocateBtn_Click()", "运输车-定位任务[RGV,指令]", dev, DataControl._mStools.BytetToString(order), ex.Message); } }
/// <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 LocateBtn_Click(object sender, RoutedEventArgs e) { try { if (CBdev.SelectedIndex == -1) { Notice.Show("请选择设备!", "提示", 3, MessageBoxIcon.Info); return; } if (string.IsNullOrEmpty(location.Text.Trim())) { Notice.Show("请填写目的坐标!", "提示", 3, MessageBoxIcon.Info); return; } string dev = CBdev.Text; RGV rgv = new RGV(dev); if (rgv.ActionStatus() == RGV.Run) { Notice.Show("指令发送失败:设备运行中!", "错误", 3, MessageBoxIcon.Error); return; } if (rgv.DeviceStatus() == RGV.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } int loc = Convert.ToInt32(location.Text.Trim()); byte[] order = RGV._Position(rgv.RGVNum(), DataControl._mStools.IntToBytes(loc)); 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); } }
/// <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; RGV rgv = new RGV(dev); if (rgv.DeviceStatus() == RGV.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } order = RGV._StopTask(rgv.RGVNum()); if (!DataControl._mSocket.SendToClient(dev, order, out string result)) { Notice.Show("指令发送失败:" + result.ToString(), "错误", 3, MessageBoxIcon.Error); // LOG DataControl._mTaskTools.RecordTaskErrLog("TerminateBtn_Click()", "运输车-终止任务[RGV,指令]", 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()", "运输车-终止任务[RGV,指令]", dev, DataControl._mStools.BytetToString(order), ex.Message); } }
public void Update(RGV rgv) { rgv.IsAlive = rgv.IsEnable && rgv.Plc.IsAlive; if (rgv.IsAlive || rgv.PreIsAlive) { switch (rgv.ClampStatus) { case ClampStatus.满夹具: this.panelRGV.BackColor = Color.LimeGreen; break; case ClampStatus.空夹具: this.panelRGV.BackColor = Color.Cyan; break; case ClampStatus.无夹具: this.panelRGV.BackColor = Color.White; break; default: this.panelRGV.BackColor = SystemColors.Control; break; } } else { this.panelRGV.BackColor = Color.LightGray; } rgv.PrePosition = rgv.Position; if (rgv.IsAlive || rgv.PreIsAlive) { if (rgv.IsPausing) { this.lbInfo.Text = "暂停中"; this.lbInfo.ForeColor = Color.Red; } else if (rgv.IsMoving && TengDa.WF.Current.IsTerminalInitFinished) { this.lbInfo.Text = Current.RGV.MovingDirection == MovingDirection.前进 ? string.Format("{0}移动", rgv.MovingDirSign) : string.Format("移动{0}", rgv.MovingDirSign); this.lbInfo.ForeColor = Color.Blue; } else if (Current.RGV.Status > 2) { this.lbInfo.Text = "未就绪"; this.lbInfo.ForeColor = Color.Red; } else if (rgv.Status == 1) { this.lbInfo.Text = Current.Task.Status == TaskStatus.正取 ? "取盘中" : "放盘中"; //this.lbInfo.Text = Current.Task.Status == TaskStatus.取完 || Current.Task.Status == TaskStatus.可取 || Current.Task.Status == TaskStatus.正取 ? "取盘中" : "放盘中"; this.lbInfo.ForeColor = Color.Blue; } else { this.lbInfo.Text = "闲置"; this.lbInfo.ForeColor = SystemColors.WindowText; } } else { this.lbInfo.Text = "未知"; this.lbInfo.ForeColor = SystemColors.WindowText; } this.lbClampCode.Text = rgv.Clamp.Code; if (!string.IsNullOrEmpty(rgv.AlarmStr) && (rgv.IsAlive || rgv.PreIsAlive)) { if (rgv.PreAlarmStr != rgv.AlarmStr) { this.lbName.Text = rgv.AlarmStr.TrimEnd(',') + "..."; } else { string alarmStr = this.lbName.Text; this.lbName.Text = alarmStr.Substring(1, alarmStr.Length - 1) + alarmStr.Substring(0, 1); } this.lbName.ForeColor = Color.White; this.lbName.BackColor = Color.Red; } else { this.lbName.Text = Current.RGV.Name; this.lbName.ForeColor = SystemColors.WindowText; this.lbName.BackColor = Color.Transparent; } rgv.PreIsAlive = rgv.IsAlive; rgv.PreAlarmStr = rgv.AlarmStr; }
/// <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; RGV rgv = new RGV(dev); if (rgv.ActionStatus() == RGV.Run) { Notice.Show("指令发送失败:设备运行中!", "错误", 3, MessageBoxIcon.Error); return; } if (rgv.DeviceStatus() == RGV.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } // 方式 byte site1 = RGV.RollerRun1; if (CBsite1.SelectedValue.ToString() == "启动2#辊台") { site1 = RGV.RollerRun2; } if (CBsite1.SelectedValue.ToString() == "启动全部辊台") { site1 = RGV.RollerRunAll; } // 方向 byte site2 = RGV.RunFront; if (CBsite2.SelectedValue.ToString() == "反向启动") { site2 = RGV.RunObverse; } // 类型 byte site3 = RGV.GoodsReceive; if (CBsite3.SelectedValue.ToString() == "送货") { site3 = RGV.GoodsDeliver; } // 数量 byte site4 = RGV.GoodsQty1; if (CBsite4.SelectedValue.ToString() == "货物数量2") { site4 = RGV.GoodsQty2; } byte[] order = RGV._RollerControl(rgv.RGVNum(), 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); } }
/// <summary> /// 运输车复位 /// </summary> /// <param name="dev"></param> /// <param name="mes"></param> public void ResetLoc_RGV(List <WCS_CONFIG_DEVICE> dev, out string mes) { try { // 运输车待命点1 int loc1 = Convert.ToInt32(DataControl._mStools.GetValueByKey("StandbyR1")); // 运输车待命点2 int loc2 = Convert.ToInt32(DataControl._mStools.GetValueByKey("StandbyR2")); // 获取当前摆渡车资讯 RGV a1 = new RGV(dev[0].DEVICE); RGV a2 = new RGV(dev[1].DEVICE); // 定位任务指令 byte[] order1; byte[] order2; // 任务明细 WCS_TASK_ITEM item1; WCS_TASK_ITEM item2; if (a1.GetCurrentSite() < a2.GetCurrentSite()) { // 定位任务指令 order1 = RGV._Position(a1.RGVNum(), DataControl._mStools.IntToBytes(loc1)); order2 = RGV._Position(a2.RGVNum(), DataControl._mStools.IntToBytes(loc2)); // 任务明细 item1 = new WCS_TASK_ITEM() { ITEM_ID = ItemId.运输车复位1, ID = 3, DEVICE = dev[0].DEVICE, LOC_TO = loc1.ToString() }; item2 = new WCS_TASK_ITEM() { ITEM_ID = ItemId.运输车复位2, ID = 4, DEVICE = dev[1].DEVICE, LOC_TO = loc2.ToString() }; } else { // 定位任务指令 order1 = RGV._Position(a1.RGVNum(), DataControl._mStools.IntToBytes(loc2)); order2 = RGV._Position(a2.RGVNum(), DataControl._mStools.IntToBytes(loc1)); // 任务明细 item1 = new WCS_TASK_ITEM() { ITEM_ID = ItemId.运输车复位2, ID = 3, DEVICE = dev[0].DEVICE, LOC_TO = loc2.ToString() }; item2 = new WCS_TASK_ITEM() { ITEM_ID = ItemId.运输车复位1, ID = 4, DEVICE = dev[1].DEVICE, LOC_TO = loc1.ToString() }; } // 加入任务作业链表 mes = null; if (dev[0].FLAG == DeviceFlag.空闲) { DataControl._mTaskControler.StartTask(new RGVTack(item1, DeviceType.运输车, order1)); } else { mes = dev[0].DEVICE + " 运输车目前无法操作复位任务; \r"; } if (dev[1].FLAG == DeviceFlag.空闲) { DataControl._mTaskControler.StartTask(new ARFTack(item2, DeviceType.运输车, order2)); } else { mes = mes + dev[1].DEVICE + " 运输车目前无法操作复位任务; \r"; } } catch (Exception ex) { throw ex; } }
public override void DoWork() { try { // 异常 if (_device.DeviceStatus() == RGV.DeviceError || _device.CommandStatus() == RGV.CommandError) { ISetTaskErr(); // LOG log.LOG(DataControl._mTaskTools.GetLogMessE(ITEM, Order, "设备故障或命令错误.")); return; } // 对接任务 if (ITEM.ITEM_ID.Substring(0, 2) == "11") { #region 调试 if (PublicParam.IsIgnoreRGV) //add调试判断 { if (_device.ActionStatus() == RGV.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.摆渡车: ARF _arf = new ARF(ITEM.LOC_TO); // 摆渡车辊台停止状态 if (_arf.CurrentStatus() == ARF.RollerStop) { // 摆渡车辊台上无货物 if (_arf.GoodsStatus() == ARF.GoodsNoAll) { return; } } else if (_device.GoodsStatus() == RGV.GoodsYesAll && _device.ActionStatus() == RGV.Stop && _arf.GoodsStatus() == ARF.GoodsYesAll && _arf.ActionStatus() == ARF.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() == RGV.GoodsYesAll && _device.ActionStatus() == RGV.Stop && _rgv.GoodsStatus() == RGV.GoodsYesAll && _rgv.ActionStatus() == RGV.Stop) { return; // 运输车与运输车都有货,不启动辊台 } break; default: break; } // 运输车无货物 if (_device.GoodsStatus() == RGV.GoodsNoAll) { // 完成任务 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.摆渡车: ARF _arf = new ARF(ITEM.LOC_FROM); // 摆渡车辊台上无货物,运输车辊台上有货物 if (_arf.GoodsStatus() == ARF.GoodsNoAll && _device.GoodsStatus() != RGV.GoodsNoAll && _device.ActionStatus() == RGV.Stop) { // 完成任务 ISetTaskSuc(); // LOG log.LOG(DataControl._mTaskTools.GetLogMessS(ITEM, Order)); return; } else if (_device.GoodsStatus() == RGV.GoodsYesAll && _device.ActionStatus() == RGV.Stop && _arf.GoodsStatus() == ARF.GoodsYesAll && _arf.ActionStatus() == ARF.Stop) { return; // 摆渡车与运输车都有货,不启动辊台 } break; case DeviceType.运输车: RGV _rgv = new RGV(ITEM.LOC_FROM); // 来源运输车辊台上无货物,运输车辊台上有货物 if (_rgv.GoodsStatus() == FRT.GoodsNoAll && _device.GoodsStatus() != ARF.GoodsNoAll && _device.ActionStatus() == RGV.Stop) { // 完成任务 ISetTaskSuc(); // LOG log.LOG(DataControl._mTaskTools.GetLogMessS(ITEM, Order)); return; } else if (_device.GoodsStatus() == RGV.GoodsYesAll && _device.ActionStatus() == RGV.Stop && _rgv.GoodsStatus() == RGV.GoodsYesAll && _rgv.ActionStatus() == RGV.Stop) { return; // 运输车与运输车都有货,不启动辊台 } break; default: break; } } // 发送指令 if (_device.ActionStatus() == RGV.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() == RGV.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.GetCurrentSite() == Convert.ToInt32(ITEM.LOC_TO) && _device.ActionStatus() == RGV.Stop) { // 等待对接 ISetTaskWait(); // LOG log.LOG(DataControl._mTaskTools.GetLogMessW(ITEM, Order)); return; } } } catch (Exception ex) { // LOG log.LOG(DataControl._mTaskTools.GetLogMessE(ITEM, Order, ex.ToString())); } }
/// <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; RGV rgv = new RGV(dev); if (rgv.ActionStatus() == RGV.Run) { Notice.Show("指令发送失败:设备运行中!", "错误", 3, MessageBoxIcon.Error); return; } if (rgv.DeviceStatus() == RGV.DeviceError) { Notice.Show("指令发送失败:设备故障!", "错误", 3, MessageBoxIcon.Error); return; } if (!WindowCommon.ConfirmAction("是否确定[启动滚筒任务]!!")) { return; } // 方式 byte site1 = RGV.RollerRun1; if (CBsite1.SelectedValue.ToString() == "启动2#辊台") { site1 = RGV.RollerRun2; } if (CBsite1.SelectedValue.ToString() == "启动全部辊台") { site1 = RGV.RollerRunAll; } // 方向 byte site2 = RGV.RunFront; if (CBsite2.SelectedValue.ToString() == "反向启动") { site2 = RGV.RunObverse; } // 类型 byte site3 = RGV.GoodsReceive; if (CBsite3.SelectedValue.ToString() == "送货") { site3 = RGV.GoodsDeliver; } // 数量 byte site4 = RGV.GoodsQty1; if (CBsite4.SelectedValue.ToString() == "货物数量2") { site4 = RGV.GoodsQty2; } order = RGV._RollerControl(rgv.RGVNum(), 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()", "运输车-启动辊台任务[RGV,指令]", 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()", "运输车-启动辊台任务[RGV,指令]", dev, DataControl._mStools.BytetToString(order), ex.Message); } }