/// <summary> /// 接收小车动作完成操作 /// </summary> static void AgvDoTask(AgvMsg agvMsg, SocketOpt socketOpt) { Agv agv = socketOpt.agv; STask sTask = agv.sTaskList.FirstOrDefault(a => a.sID == agvMsg.SID); if (sTask == null) { throw new Exception("无法找到子任务!"); } PathPoint pPoint = sTask.pathList.FirstOrDefault(a => a.point.barCode == agvMsg.Barcode); switch (agvMsg.sTaskType) { case STaskType.D1: case STaskType.D20: case STaskType.D21: case STaskType.D24: List <Motion> listMotion = GetNextListMotion(sTask, pPoint, agv); if (listMotion.Count == 0) { throw new Exception("找到0条路径"); } else if (listMotion.Count == 1) { socketOpt.Data = SendData.GetRepeatData(agv.agvNo); } else { socketOpt.Data = SendData.GetNewActionData(agvMsg, listMotion); } //除发送给AGV的点外,其它点全部解锁方向 NoLock(agv, listMotion); break; case STaskType.D2: case STaskType.D3: case STaskType.D6: case STaskType.D15: case STaskType.D18: case STaskType.D22: case STaskType.D23: Task.FinishTask(agv, sTask); socketOpt.Data = SendData.GetFinishData(agv.agvNo); break; case STaskType.D25: //if (beginPoint.barCode != endPoint.barCode) throw new Exception("原地旋转,起点和终点必须一致!"); break; default: throw new Exception("未找到此任务类型"); } ManageTcp.Send(socketOpt); }
/// <summary> /// Tcp指令发送 /// </summary> /// <param name="ClientSocket">自定义Socket对象</param> /// <returns>发送结果</returns> public static void Send(SocketOpt ClientSocket) { Socket s = ClientSocket.Sct; //try //{ s.Send(ClientSocket.Data, ClientSocket.Data.Length, 0); //} //catch (Exception Ex) //{ // throw Ex; //} //finally //{ // s.Close(); //} }
/// <summary> /// 线程-收发报文处理业务的开始 /// </summary> /// <param name="ClientSocket">客户端对象</param> public static void MultiSocket(Object ClientSocket) { Socket cSocket = ClientSocket as Socket; //try //{ byte[] ReceiveData = new byte[1024]; cSocket.ReceiveTimeout = 3000; if (cSocket.Poll(3000000, SelectMode.SelectRead)) { int DataLength = cSocket.Receive(ReceiveData); if (DataLength > 0) { SocketOpt SRece = new SocketOpt(cSocket, ReceiveData); if (SRece != null) { TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks); MsgManage.DataTranslate(SRece); TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks); TimeSpan ts3 = ts2.Subtract(ts1).Duration(); //App.ExFile.MessageLog("处理Agv指令时间", "1|" + ts2.Milliseconds + "-" + ts1.Milliseconds + "=" + ts3.Milliseconds); } } Thread.Sleep(20); } //} //catch (Exception Ex) //{ // App.ExFile.MessageError("TranMultiSocket", Ex.ToString()); //} //finally //{ // cSocket.Close(); //} }
/// <summary> /// 更新数据 /// </summary> static void SendTask(AgvMsg agvMsg, SocketOpt socketOpt) { Agv agv = socketOpt.agv; if (agv.state != AgvState.D11 && agv.state != AgvState.D12) { return; } if (agv.errorMsg != 0 && agv.errorMsg != 19 && agv.errorMsg != 1900 && agv.errorMsg != 190000) { return; } if (agv.sTaskList.Count == 0) { return; } STask sTask = agv.sTaskList[0]; if (sTask.state != TaskState.HavePath) { return; } byte SOri, EOri; if (sTask.dialDirection == 1) { SOri = 1; } else { SOri = 0; } EOri = (byte)sTask.dialDirection; socketOpt.Data = SendData.GetNewTaskData(agvMsg.AgvNo, sTask.sID, SOri, EOri); ManageTcp.Send(socketOpt); Task.DoingTask(sTask); }
/// <summary> /// 指令解析 /// </summary> /// <param name="socketOpt">自定义Socket对象</param> public static void DataTranslate(SocketOpt socketOpt) { byte[] DataRecv = socketOpt.Data; string AgvNo = Encoding.ASCII.GetString(DataRecv, 3, 10).Replace("\0", ""); //try //{ AgvMsg agvMsg = new AgvMsg(); int DataLength = DataRecv[2]; agvMsg.AgvNo = Encoding.ASCII.GetString(DataRecv, 3, 10).Replace("\0", ""); socketOpt.agv = App.AgvList.FirstOrDefault(a => a.agvNo == agvMsg.AgvNo); if (socketOpt.agv == null) { throw new Exception("更新状态失败:找不到小车号。"); } agvMsg.Barcode = BitConverter.ToUInt32(DataRecv, 13).ToString(); agvMsg.Voltage = BitConverter.ToInt16(DataRecv, 17) / 100; agvMsg.State = DataRecv[19]; agvMsg.Height = (HeightEnum)DataRecv[20]; agvMsg.ErrCode1 = DataRecv[21]; agvMsg.ErrCode2 = DataRecv[22]; agvMsg.ErrCode3 = DataRecv[23]; string sid = Encoding.ASCII.GetString(DataRecv, 26, 20).Replace("\0", ""); if (string.IsNullOrEmpty(sid)) { agvMsg.SID = 0; } else { agvMsg.SID = int.Parse(sid); } agvMsg.sTaskType = (STaskType)DataRecv[46]; int CrcR = DataRecv[47]; int CrcC = Commond.CRC(DataRecv, DataLength + 14); if (CrcC == CrcR) { Agv agv = socketOpt.agv; UpdateAgvShelfPoint(agvMsg, agv); if (agvMsg.SID == 0) { SendTask(agvMsg, socketOpt); } else { UpdataPointOri(agvMsg, agv); AgvDoTask(agvMsg, socketOpt); } } //} //catch (Exception ex) //{ // App.ExFile.MessageLog("DataTranslate", ex.Message + "\r" // + Encoding.Default.GetString(DataRecv)); //} socketOpt.Data = SendData.GetRepeatData(AgvNo); ManageTcp.Send(socketOpt); }