/// <summary> /// 取货完成给堆垛机指令表下发指令数据 /// </summary> /// <param name="cs"></param> /// <returns></returns> private bool QHWCDDJCommand(ref CraneStr cs) { bool flag = false; string taskno = cs.Zxrwh.ToString(); DataSet ds = DataTrans.D_GetSchByTaskno(taskno); if (ds != null && ds.Tables[0].Rows.Count > 0) { DataTable dt = ds.Tables[0]; cs.Dqph = dt.Rows[0]["SPLATOON"].ToString(); cs.Dqlh = dt.Rows[0]["SCOLUMN"].ToString(); cs.Dqch = dt.Rows[0]["SFLOOR"].ToString(); cs.Mbph = dt.Rows[0]["TPLATOON"].ToString(); cs.Mbch = dt.Rows[0]["TFLOOR"].ToString(); cs.Mblh = dt.Rows[0]["TCOLUMN"].ToString(); cs.Var1 = dt.Rows[0]["TASKID"].ToString(); if (dt.Rows[0]["TASKTYPE"].ToString() == "2" && dt.Rows[0]["FLOOR"].ToString() == "1") { AlleyIdRelation.GetCKOneDesSpace(cs.Btid, ref cs); } else if (dt.Rows[0]["TASKTYPE"].ToString() == "2" && dt.Rows[0]["FLOOR"].ToString() == "2") { AlleyIdRelation.GetCKTwoDesSpace(cs.Btid, ref cs); } flag = true; } else { LogWrite.WriteLog($"堆垛机{cs.Btid}取货完成后,所提取的任务号为找到任务"); NotifyShowEvent?.Invoke("R", $"堆垛机{cs.Btid}取货完成后,所提取的任务号为找到任务"); flag = false; } return(flag); }
public int AllotSpaceId(string taskid, TransportStr si) { int n = 0; #region 向中间表插入数据,向WMS发起请求 //发起前先判断中间表是否已存在该条申请,状态1=下发 2=已处理状态 DataSet dsisexist = DataTrans.D_GetIDX_ASRS_SEND(taskid, "15", "1','2"); if (dsisexist != null && dsisexist.Tables[0].Rows.Count == 0) { DataSet ds = DataTrans.D_GetAlleyIdBytaskid(si.Taskid); if (ds == null) { return(0); } string alleyid = ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString(); //15=货位申请 1=下方 int k = DataTrans.D_InsertIDX_ASRS_SEND("15", "1", taskid, si.TRAYCODE, "", alleyid); if (k > 0) { logWrite.WriteLog($"输送机{si.SSJID}调度指令{taskid}入库已向WMS申请货位托盘条码为{si.TRAYCODE}"); NotifyEvent?.Invoke($"输送机{si.SSJID}调度指令{taskid}入库已向WMS申请货位托盘条码为{si.TRAYCODE}"); } else { logWrite.WriteLog($"输送机{si.SSJID}调度指令{taskid}入库向WMS未申请到货位"); NotifyEvent?.Invoke($"输送机{si.SSJID}调度指令{taskid}入库向WMS未申请到货位"); } } #endregion //获取WMS重新分配的货位,2代表WMS已下发 DataSet dsidx = DataTrans.D_GetIDX_ASRS_SEND(taskid, "15", "2"); //若是查询到数据说明获取到货位 if (dsidx != null && dsidx.Tables[0].Rows.Count > 0) { logWrite.WriteLog($"输送机{si.SSJID}调度指令{taskid}申请的货位WMS已处理"); NotifyEvent?.Invoke($"输送机{si.SSJID}调度指令{taskid}申请的货位WMS已处理"); //临时库位字段 string spaceid = dsidx.Tables[0].Rows[0]["LOCATION"].ToString(); //根据货位id获取货位信息 DataSet ds = DataTrans.P_getSpaceInfo(spaceid); if (ds != null && ds.Tables[0].Rows.Count > 0) { //货位名称 string spacename = ds.Tables[0].Rows[0]["CARGO_SPACE_NAME"].ToString(); //货位排 string tCSPLATOON = ds.Tables[0].Rows[0]["CSPLATOON"].ToString(); //货位列 string tCSCOLUMN = ds.Tables[0].Rows[0]["CSCOLUMN"].ToString(); //货位层 string tCSFLOOR = ds.Tables[0].Rows[0]["CSFLOOR"].ToString(); n = DataTrans.P_UpSchSpaceInfo(spaceid, spacename, tCSPLATOON, tCSCOLUMN, tCSFLOOR, si.Taskid); } } return(n); }
/// <summary> /// 初始化输送机对应参数 /// </summary> /// <returns></returns> public bool TransDeviceInit() { DataSet ds = DataTrans.D_GetDeviceSSJ(); if (ds != null && ds.Tables[0].Rows.Count > 0) { for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { //获取设备编号第一个字母,用于与绑定IP地址 _SSJDhead = ds.Tables[0].Rows[i]["VAR1"].ToString().Substring(0, 1); string _ip = ConfigurationManager.AppSettings[_SSJDhead].ToString(); //需要改进,将端口,DB块,端口等也进行构造函数初始化l if (!PLCList.ContainsKey(_SSJDhead)) { PLCList.Add(_SSJDhead, new RWLOPCServerl(_ip)); PLCFlag.Add(_SSJDhead, false); PLCList[_SSJDhead].Connect(); } if (!HsPLCList.ContainsKey(_SSJDhead)) { HsPLCList.Add(_SSJDhead, new HsControlServer(_ip)); bool flag = HsPLCList[_SSJDhead].HsServerConnect(); string res = flag ? "成功" : "失败"; NotifyEvent?.Invoke($"PLC{_ip}连接{res}"); } TransportStr tp = new TransportStr(); tp.SSJID = ds.Tables[0].Rows[i]["SSJID"].ToString(); tp.BTID = ds.Tables[0].Rows[i]["BTID"].ToString(); tp.DTYPE = ds.Tables[0].Rows[i]["DTYPE"].ToString(); tp.ZXRWH = ds.Tables[0].Rows[i]["ZXRWH"].ToString(); tp.DWXH = ds.Tables[0].Rows[i]["DWXH"].ToString(); tp.KXBZ = ds.Tables[0].Rows[i]["KXBZ"].ToString(); tp.TRAYCODE = ds.Tables[0].Rows[i]["TRAYCODE"].ToString(); tp.JYM = ds.Tables[0].Rows[i]["JYM"].ToString(); tp.BFLAG = ds.Tables[0].Rows[i]["BFLAG"].ToString(); tp.ALLEYID = ds.Tables[0].Rows[i]["ALLEYID"].ToString(); //tp.ALLEYID = ""; tp.VAR1 = ds.Tables[0].Rows[i]["VAR1"].ToString(); tp.VAR2 = ds.Tables[0].Rows[i]["VAR2"].ToString(); tp.VAR3 = ds.Tables[0].Rows[i]["VAR3"].ToString(); tp.VAR4 = ds.Tables[0].Rows[i]["VAR4"].ToString(); tp.VAR5 = ds.Tables[0].Rows[i]["VAR5"].ToString(); tp.SSRWLX = ds.Tables[0].Rows[i]["SSRWLX"].ToString(); tp.SSJIDhead = _SSJDhead; lsTransport.Add(tp); } return(true); } return(false); }
public SendToAgvResult CallBackResult(ReciveAgeCallBack agvCallBack) { DataSet ds = new DataSet(); ds = DataTrans.D_GetAgvCallBack(agvCallBack.ReqCode, out string msg); SendToAgvResult result = new SendToAgvResult(); if (ds != null) { if (ds.Tables[0].Rows.Count > 0) { result.Code = "1"; result.Message = "请求编号已存在"; result.Data = ""; result.ReqCode = agvCallBack.ReqCode; } else { string msgInfo = bll.HandleCallBackData(agvCallBack); if (msgInfo == "OK") { int n = DataTrans.D_InsertCallBack(agvCallBack, "2", out msg); if (n > 0) { result.Code = "0"; result.Message = "成功"; result.Data = string.Empty; result.ReqCode = agvCallBack.ReqCode; } } else { result.Code = "1"; result.Message = "失败"; result.Data = string.Empty; result.ReqCode = agvCallBack.ReqCode; } } } else { result.Code = "1"; result.Message = "数据处理异常"; result.Data = string.Empty; result.ReqCode = agvCallBack.ReqCode; } return(result); }
/* private /*string*//* void PrepareList(List<DataRep> elems, Folder tree, bool keepStruct, string mediatype) * { * HeTrace.WriteLine($"[{nameof(PrepareList)}] for {mediatype}", this); * * string destLocation = tree.Children[$"{mediatype}s"].Path; * * PlatformFolder folder = null; * if (keepStruct && !string.IsNullOrEmpty(mediatype)) * { * // On récupère le dossier concerné par le média * folder = _ZePlatform.PlatformFolders.FirstOrDefault( * (x) => x.MediaType.Equals(mediatype, StringComparison.OrdinalIgnoreCase)); * } * * //string futurLink, tail, gpAssign; * //gpAssign = string.Empty; * foreach (DataRep fichier in elems) * { * * PrepareFile(fichier, destLocation, keepStruct, folder); * // --- Renvoie pour le GP. * /* if (fichier.IsSelected) * gpAssign = DxPath.To_Relative(destLocation, futurLink);*/ /* } * * //return gpAssign; * }*/ #endregion private void PrepareFile(DataTrans fichier, string destLocation, bool keepStruct, string foldertoReplace /*PlatformFolder folder*/) { string futurLink = string.Empty; //tail = string.Empty; if (keepStruct && !string.IsNullOrEmpty(foldertoReplace) /*!= null && fichier.CurrentPath.Contains(folder.FolderPath)*/) { string tail = fichier.CurrentPath.Replace(foldertoReplace /*folder.FolderPath*/, string.Empty).TrimStart('\\'); futurLink = Path.Combine(destLocation, tail); } else { futurLink = Path.Combine(destLocation, Path.GetFileName(fichier.CurrentPath)); } fichier.DestPath = futurLink; }
public void UpdateDataSet(string SQLQuery, ref DataSet DataSetSource, string RecordSource) { SqlConnection DataConn = new SqlConnection(ConnectionString); DataConn.Open(); SqlTransaction DataTrans; DataTrans = DataConn.BeginTransaction(); SqlCommand DataCmd = new SqlCommand(SQLQuery, DataConn); DataCmd.CommandType = CommandType.Text; DataCmd.Transaction = DataTrans; DataCmd.CommandTimeout = 0; try { SqlDataAdapter DataAdapterResult; DataAdapterResult = new SqlDataAdapter(DataCmd); SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(DataAdapterResult); DataAdapterResult.Update(DataSetSource, RecordSource); DataTrans.Commit(); DataAdapterResult = null; } catch (Exception e) { DataTrans.Rollback(); throw e; } finally { DataTrans.Dispose(); DataConn.Close(); DataCmd.Dispose(); DataConn.Close(); } }
public JsonResult Login(string chainNo, string account, string password) { var user = new LoginApp().Login(account, password); if (user == null || string.IsNullOrWhiteSpace(user.Account)) { return(Json(base.ErrResult("用户名或密码错误"))); } if (!new RepMenuApp().IsHaveMenuResponse(account)) { return(Json(base.ErrResult("无权限"))); } string timeStamp = DataTrans.GetTimeStamp(); WriteSession(user, timeStamp); SysLog(user.Account, timeStamp); WebHelper.UserToApplication(user.Account); return(SuccessReturn()); }
/// <summary> /// Récupération des fichiers (vérification si le dossier source existe à chaque fois) /// </summary> /// <returns></returns> private IEnumerable <DataTrans> GetFiles() { List <DataTrans> datas = new List <DataTrans>(); foreach (var platFolder in VisPlatform) { if (!Directory.Exists(platFolder.HardPath)) { HeTrace.WriteLine($"Folder doesn't exist '{platFolder.HardPath}'", 5); continue; } foreach (string f in Directory.EnumerateFiles(platFolder.HardPath, "*.*", SearchOption.AllDirectories)) { // Cas particulier du theme video if (platFolder.Type.Equals("Video", StringComparison.OrdinalIgnoreCase) && f.Contains("Theme") ) { continue; } DataTrans dt = new DataTrans() { Name = Path.GetFileName(f), CurrentPath = f, DestPath = f.Replace(platFolder.HardPath, platFolder.NewHardPath), }; HeTrace.WriteLine($"Copy from: {dt.CurrentPath}", 10); HeTrace.WriteLine($"To: {dt.DestPath}", 10); datas.Add(dt); } } return(datas); }
private bool Copy2(string srcFolder, string subFolder, string message, Collection <DataRep> collec) { srcFolder = Path.GetFullPath(srcFolder, Config.HLaunchBoxPath); DataRep dr = null; TreeChoose tc = new TreeChoose() { Model = new M_ChooseRaw() { Info = message, Mode = ChooseMode.File, ShowFiles = true, StartingFolder = srcFolder } }; if (tc.ShowDialog() == true) { string folderDest = Path.Combine(_Root, subFolder); dr = DataTrans.MakeSrcnDest <DataRep>(tc.LinkResult, subFolder); dr.Name = dr.DestPath.Replace(subFolder, "."); DateTime oldLW = new DateTime(); DataRep oldDr = collec.FirstOrDefault(x => x.DestPath.Equals(dr.DestPath)); if (oldDr != null) { oldLW = File.GetLastWriteTimeUtc(oldDr.DestPath); } // EphemProgress ephem = new EphemProgress(); HashCopy copyZat = new HashCopy(); copyZat.AskToUser += PackMe_IHM.Ask4_FileConflict2; bool copyres = false; TaskLauncher launcher = new TaskLauncher() { AutoCloseWindow = true, ProgressIHM = new DxProgressB1(ephem), MethodToRun = () => copyres = copyZat.CopyOneNVerif(dr), }; launcher.Launch(copyZat); // if (!copyres) { return(false); } DateTime newLW = File.GetLastWriteTimeUtc(dr.DestPath); if (oldLW == newLW) { return(false); } if (oldDr != null) { collec.Remove(oldDr); } collec.Add(dr); return(true); //return Copy(tc.LinkResult, Path.Combine(Root, subFolder)); } return(false); }
public string HandleCallBackData(ReciveAgeCallBack agvCallBack) { string msg = string.Empty; //外形检测出到达 if (agvCallBack.Method == Arrive) { DataSet ds = DataTrans.D_GetSchByTaskIdArrive(agvCallBack.TaskCode); if (ds != null && ds.Tables[0].Rows.Count > 0) { #region 读取外形检测是否报警 bool flag = false; string ssjid = ds.Tables[0].Rows[0]["SNUMBER"].ToString(); TransportStr ts = lsTransport.Find(si => si.SSJID == ssjid); if (ts == null) { return(string.Empty); } int btid = Convert.ToInt32(ts.BTID); byte[] bty = new byte[2]; BitArray arr = new BitArray(bty); if (!HsWcsReadalarm(out arr)) { return(""); } else { for (int i = 0; i < 3; i++) { int start = (btid - 1) * 3; flag = arr[start + i]; if (flag == true) { break; } } } #endregion string desaddress = string.Empty; //如果报警返回 if (flag == true) { desaddress = ts.VAR5; } else { TransportStr rkssj = lsTransport.Find(t => t.ALLEYID == ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString()); if (rkssj == null) { return(string.Empty); } desaddress = rkssj.VAR5; } ContinueToAgvInfo req = ContinueToModel(ds, desaddress); SendToAgvResult result = ContinueTask(req); if (result.Message == "成功" && flag) { NotifyEvent?.Invoke("R", $"外形检测不合格,给AGV发送返回起始点成功,任务id为:{agvCallBack.TaskCode}目的地{desaddress}"); log.WriteLog($"外形检测不合格,给AGV发送返回起始点成功,任务id为:{agvCallBack.TaskCode}目的地{desaddress}"); DataTrans.P_UpdatePhase(agvCallBack.TaskCode, "1", "5", string.Empty); } else if (result.Message == "成功" && !flag) { DataTrans.P_UpdatePhase(agvCallBack.TaskCode, "3", "3", string.Empty); NotifyEvent?.Invoke("R", $"外形检测合格,给AGV发送目标巷道成功,任务Id为{agvCallBack.TaskCode}目的地{desaddress}"); log.WriteLog($"外形检测合格,给AGV发送目标巷道成功,任务Id为{agvCallBack.TaskCode}目的地{desaddress}"); msg = "OK"; } else { NotifyEvent?.Invoke("R", $"给AGV发送目标巷道失败,任务id为:{agvCallBack.TaskCode}"); log.WriteLog($"给AGV发送目标巷道失败,任务id为:{agvCallBack.TaskCode}"); msg = "Lost"; } } } //放货完成 else if (agvCallBack.Method == Finish) { DataSet ds = DataTrans.D_GetSchByTaskId(agvCallBack.TaskCode); if (ds != null && ds.Tables[0].Rows.Count > 0) { TransportStr ts; if (ds.Tables[0].Rows[0]["TASKTYPE"].ToString() == "1") { ts = lsTransport.Find(si => si.ALLEYID == ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString()); } else { ts = lsTransport.Find(si => si.SSJID == ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString()); } if (ts == null) { return(string.Empty); } ts.TRAYCODE = ds.Tables[0].Rows[0]["TRAYCODE"].ToString(); ts.ZXRWH = ds.Tables[0].Rows[0]["TASKNO"].ToString(); if (crl.HsWriteToSSJ(ts)) { NotifyEvent?.Invoke("S", $"根据AGV反馈任务与id{agvCallBack.TaskCode}放货完成,给输送机{ts.SSJID}下发任务成功"); log.WriteLog($"根据AGV反馈任务id{agvCallBack.TaskCode}放货完成,给输送机{ts.SSJID}下发任务成功"); if (ds.Tables[0].Rows[0]["TASKTYPE"].ToString() == "1") { DataTrans.P_UpdatePhase(agvCallBack.TaskCode, "1", "3", string.Empty); } else if (ds.Tables[0].Rows[0]["TASKTYPE"].ToString() == "2") { DataTrans.P_UpdatePhase(agvCallBack.TaskCode, "1", "4", string.Empty); } msg = "OK"; } else { NotifyEvent?.Invoke("S", $"根据AGV反馈任务id{agvCallBack.TaskCode}放货完成,给输送机{ts.SSJID}下发任务失败"); log.WriteLog($"根据AGV反馈任务id{agvCallBack.TaskCode}放货完成,给输送机{ts.SSJID}下发任务失败"); msg = "Lost"; } } } return(msg); }
private void LedSendStr(string ssjid, string strmsg, int nAlignment) { DataSet ds = new DataSet(); ds = DataTrans.D_GetLEDInfo(ssjid); if (ds != null) { if (ds.Tables[0].Rows.Count > 0) { //定义通讯参数结构体变量用于设定的LED通讯 Leddll.COMMUNICATIONINFO communicationInfo = new Leddll.COMMUNICATIONINFO { SendType = 0, //设定为固定IP通讯模式,即TCP通讯 IpStr = ds.Tables[0].Rows[0]["IPADRESS"].ToString().Trim(), //给IpStr复制LED控制卡的IP LedNumber = 1, //LED屏号为1,请注意socket通讯和232通讯不识别屏号,默认复赋值1,485必需根据屏的实际屏号进行赋值 }; //节日句柄 //根据传的参数创建节日句柄 //64是屏宽点数,32是屏高点数,2是屏的颜色,注意此处屏宽高及颜色必须与设置屏参屏宽高及颜色一致,否则报错 int hProgram = Leddll.CreateProgram(256, 96, 1); //添加一个节目 int nResult = Leddll.AddProgram(hProgram, 1, 0, 1); //错误 if (nResult != 0) { string ErrStr = Leddll.LS_GetError(nResult); NotifyEvent?.Invoke($"{ssjid}对应的LED发送出现错误:{ErrStr}"); logWrite.WriteLog($"{ssjid}对应的LED发送出现错误:{ErrStr}"); return; } //区域坐标属性结构体变量 Leddll.AREARECT areaRect = new Leddll.AREARECT { left = 0, top = 0, width = 256, height = 96 }; Leddll.AddImageTextArea(hProgram, 1, 1, ref areaRect, 0); Leddll.FONTPROP fontProp = new Leddll.FONTPROP { FontName = "宋体", FontSize = Convert.ToInt32(ds.Tables[0].Rows[0]["FONTSIZE"].ToString()), FontColor = Leddll.COLOR_RED, FontBold = 0 }; Leddll.PLAYPROP playProp = new Leddll.PLAYPROP { InStyle = 0, DelayTime = 3, Speed = 4 }; string str = string.IsNullOrEmpty(strmsg) ? ds.Tables[0].Rows[0]["DEFAULTTEXT"].ToString().Trim().Replace("\\r", "\r") : strmsg; //通过字符串添加一个多行文本到图文区 Leddll.AddStaticTextToImageTextArea(hProgram, 1, 1, Leddll.ADDTYPE_STRING, str, ref fontProp, 1, nAlignment, 1); //发送 nResult = Leddll.Send(ref communicationInfo, hProgram); //删除节目内存对象 Leddll.DeleteProgram(hProgram); //失败 if (nResult != 0) { string errStr = Leddll.LS_GetError(nResult); NotifyEvent?.Invoke($"{ssjid}对应的LED发送出现错误:{errStr}"); logWrite.WriteLog($"{ssjid}对应的LED发送出现错误:{errStr}"); } else { NotifyEvent?.Invoke($"给输送机{ssjid}对应的LED发送成功"); logWrite.WriteLog($"给输送机{ssjid}对应的LED发送成功"); SaveSSJLedStr(ssjid, strmsg); } } } }
/// <summary> /// 读取输送机信息 /// </summary> /// <param name="si"></param> /// <returns></returns> public bool HsWcsReadSSJ(ref TransportStr si) { bool flag = false; try { //当前输送机对应电机对应开始字节,读取电机信息(主要到位空闲信息)DB54 int djstart = Convert.ToInt32(si.VAR4); byte[] djbty = new byte[12]; if (HsPLCList[si.VAR1].HsRead($"DB{djdbnumber}.{djstart}", 12, ref djbty)) { #region 读取DB54信息 //将电机对应输送机id的第一个字节存储到buffer中,并获取bit int djint = djbty[8]; byte[] buffer = BitConverter.GetBytes(djint); BitArray arr = new BitArray(buffer); si.DWXH = Convert.ToInt32(arr[0]).ToString(); //到位信号 si.KXBZ = Convert.ToInt32(arr[1]).ToString(); //空闲信息 #endregion #region 读取DB55信息 //读取当前输送机条码信息等DB55 si.TRAYCODE = string.Empty; int start = Convert.ToInt32(si.VAR3); byte[] bty = new byte[20]; if (HsPLCList[si.VAR1].HsRead($"DB{dbnumber}.{start}", 18, ref bty)) { //将读取到的信息更新到实体类 string rwh = BitConverter.ToString(bty, 0, 2).Replace("-", string.Empty).ToLower(); //任务号 si.ZXRWH = int.Parse(rwh, System.Globalization.NumberStyles.HexNumber).ToString(); //条码 si.TRAYCODE = (bty[2] * 256 * 256 * 256 + bty[3] * 256 * 256 + bty[4] * 256 + bty[5]).ToString(); if (Convert.ToInt32(si.TRAYCODE) == 0) { si.TRAYCODE = ""; } else if (si.TRAYCODE.Length != 8) { logWrite.WriteLog($"输送机{si.SSJID}条码{si.TRAYCODE}长度非8位"); NotifyEvent?.Invoke($"输送机{si.SSJID}条码{si.TRAYCODE}长度非8位"); return(false); } byte[] tmp = new byte[1]; tmp[0] = bty[12]; //获取12字节的位数 si.Arr = new BitArray(tmp); //计算重量 byte[] btyweight = new byte[4]; for (int i = 0; i < 4; i++) { btyweight[i] = bty[i + 14]; } btyweight = btyweight.Reverse().ToArray(); si.Weight = Math.Round(BitConverter.ToSingle(btyweight, 0), 2); //更新数据库中的输送机 DataTrans.D_UpDevicesSSJ(si); flag = true; } else { flag = false; } #endregion } else { flag = false; } } catch (Exception ex) { flag = false; logWrite.WriteLog($"输送线{si.SSJID}读取DB块异常,状态为:{ex.Message}"); } return(flag); }
/// <summary> /// 出库口待执行任务发送给AGV /// </summary> private void CKSendToAgvMsg() { while (true) { for (int i = 1; i <= 7; i++) { //查询出库口输送机是否有到位信号 var outts = lsTransport.Find(s => s.DTYPE == "103" && s.BTID == i.ToString() && s.DWXH == "1"); if (outts == null) { continue; } DataSet ds = DataTrans.D_GetSchByTaskno(outts.ZXRWH); if (ds != null) { //查询目标巷道输送机是否空闲 List <TransportStr> ls = lsTransport.FindAll(s => s.DTYPE == "103" && s.BTID == i.ToString() && s.DWXH == "1"); if (ls == null) { continue; } if (ds.Tables[0].Rows.Count == 1) { string desAddress = string.Empty; string ssj = string.Empty; foreach (var item in ls) { var ts = item; crl.HsWcsReadSSJ(ref ts); if (ts.KXBZ != "1") { continue; } int onjobnum = DataTrans.D_GetOnJobByDes(item.SSJID); if (onjobnum == 0) { desAddress = item.VAR5; ssj = item.SSJID; break; } } //如果没有目的地就说明在途已经占满了出库口,终止循坏 if (string.IsNullOrEmpty(desAddress)) { continue; } string msg = string.Empty; SendToAgvInfo req = CKToModel(ds, OutTaskType, outts.VAR5, desAddress); SendToAgvResult result = SendTask(req); if (result.Message == "成功") { string zxrwh = string.Empty; if (string.IsNullOrEmpty(ds.Tables[0].Rows[0]["TASKNO"].ToString())) { zxrwh = ds.Tables[0].Rows[0]["TASKNO"].ToString(); } else { zxrwh = DataTrans.D_AllotTaskno().ToString(); } int m = DataTrans.D_UpdateRkSendToAgv(ds.Tables[0], zxrwh, ds.Tables[0].Rows[0]["SCARGO_ALLEY_ID"].ToString(), ssj, out msg); if (m > 0) { NotifyEvent?.Invoke("S", $"调度指令{ds.Tables[0].Rows[0]["Taskid"]}更新成功"); log.WriteLog($"调度指令{ds.Tables[0].Rows[0]["Taskid"]}更新成功"); } else { string res = string.IsNullOrEmpty(msg) ? "更新失败" : $"更新出现异常!异常信息为{msg}"; NotifyEvent?.Invoke("S", $"调度指令{ds.Tables[0].Rows[0]["Taskid"]}{res}"); log.WriteLog($"调度指令{ds.Tables[0].Rows[0]["Taskid"]}{res}"); } } } } } Thread.Sleep(500); } }
/// <summary> /// 下发任务 /// </summary> private void IssusedTask() { try { #region 入库口输送机 for (int i = 1; i <= 4; i++) { TransportStr devicessj = lsTransport.Find(s => s.BTID == i.ToString() && s.DTYPE == "101"); if (devicessj != null) { if (!dcsaveledstr.ContainsKey(devicessj.SSJID)) { dcsaveledstr.Add(devicessj.SSJID, "TMP"); } if (!dcoldweight.ContainsKey(devicessj.SSJID)) { dcoldweight.Add(devicessj.SSJID, 0); } } #region 外形检测报警 bool flag = false; int btid = Convert.ToInt32(devicessj.BTID); byte[] bty = new byte[2]; BitArray arr = new BitArray(bty); if (!HsWcsReadalarm(out arr)) { return; } else { string str = string.Empty; for (int j = 0; j < 3; j++) { int start = (btid - 1) * 3; flag = arr[start + j]; if (flag) { if (string.IsNullOrEmpty(str)) { str += "外形检测不合格\r"; } switch (j) { case 0: str += "超高\r"; break; case 1: str += "左超\r"; break; case 2: str += "右超\r"; break; } } } if (str.Length > 0) { if (dcsaveledstr[devicessj.SSJID] != str) { LedSendStr(devicessj.SSJID, str, 0); } continue; } } #endregion if (SSJInWareCommand(ref devicessj)) { logWrite.WriteLog($"输送机{devicessj.SSJID}对应托盘条码{devicessj.TRAYCODE}重量为:{devicessj.Weight}"); NotifyEvent?.Invoke($"输送机{devicessj.SSJID}对应托盘条码{devicessj.TRAYCODE}重量为:{devicessj.Weight}"); } } #endregion #region 巷道入库口外 for (int i = 1; i <= 7; i++) { TransportStr devicessj = lsTransport.Find(s => s.BTID == i.ToString() && s.DTYPE == "105"); if (!HsWcsReadSSJ(ref devicessj)) { continue; } } #endregion #region 巷道入库口内 for (int i = 1; i <= 7; i++) { TransportStr devicessj = lsTransport.Find(s => s.BTID == i.ToString() && s.DTYPE == "102"); if (!HsWcsReadSSJ(ref devicessj)) { continue; } if (devicessj.TRAYCODE.Length > 0) { //一楼其他输送机都是正在调度任务执行阶段 DataSet ds = DataTrans.D_GetTaskInfoByStatus("3", devicessj.TRAYCODE); if (ds != null && ds.Tables[0].Rows.Count > 0) { devicessj.Taskid = ds.Tables[0].Rows[0]["TASKID"].ToString(); //申请货位 if (ds.Tables[0].Rows[0]["TPLATOON"].ToString() == string.Empty) { AllotSpaceId(devicessj.Taskid, devicessj); } } } } #endregion #region 出库口输送机到位空闲更新 for (int i = 1; i <= 4; i++) { TransportStr devicessj = lsTransport.Find(s => s.BTID == i.ToString() && s.DTYPE == "104"); if (devicessj != null) { HsWcsReadSSJ(ref devicessj); if (!dcsaveledstr.ContainsKey(devicessj.SSJID)) { dcsaveledstr.Add(devicessj.SSJID, "TMP"); } if (devicessj.KXBZ == "0" && devicessj.TRAYCODE != string.Empty) { DataSet ds = DataTrans.D_GetJobInfoToLed(devicessj.TRAYCODE); if (ds != null && ds.Tables[0].Rows.Count > 0) { string str = $"托盘条码{ds.Tables[0].Rows[0]["TRAYCODE"].ToString().Trim()}\r物料编码:{ds.Tables[0].Rows[0]["productcode"].ToString().Trim()}\r物料名称:{ds.Tables[0].Rows[0]["productname"].ToString().Trim()}\r物料批次:{ds.Tables[0].Rows[0]["lotinfo"].ToString().Trim()}\r出库重量/总重量:{ds.Tables[0].Rows[0]["ASSIGNNUM"].ToString().Trim()}/{ds.Tables[0].Rows[0]["JOBNUM"].ToString().Trim()}"; if (dcsaveledstr[devicessj.SSJID] != str) { LedSendStr(devicessj.SSJID, str, 0); } } } else { string str = string.Empty; if (dcsaveledstr[devicessj.SSJID] != str) { LedSendStr(devicessj.SSJID, str, 2); } } } else { string str = string.Empty; if (dcsaveledstr[devicessj.SSJID] != str) { LedSendStr(devicessj.SSJID, str, 2); } } } #endregion #region 巷道出库口输送机到位空闲更新 for (int i = 1; i <= 7; i++) { TransportStr devicessj = lsTransport.Find(s => s.BTID == i.ToString() && s.DTYPE == "103"); HsWcsReadSSJ(ref devicessj); } #endregion } catch (Exception ex) { NotifyEvent?.Invoke($"输送机异常报警,异常信息为:{ex.Message}"); } }
private bool SSJInWareCommand(ref TransportStr si) { bool flag = false; if (!HsWcsReadSSJ(ref si)) { flag = false; return(false); } si.TRAYCODE = string.Empty; if (si.Weight > 700) { NotifyEvent?.Invoke($"货物超重,请注意!重量为{si.Weight}"); logWrite.WriteLog($"货物超重,请注意!重量为{si.Weight}"); string str = $"称重重量:{Math.Floor(si.Weight)}\r货物超重,请注意!"; if (dcsaveledstr[si.SSJID] != str) { LedSendStr(si.SSJID, str, 2); } return(false); } if (si.Weight > 1) { flag = true; DataSet ds = new DataSet(); DataTrans.D_GetInwareTask(si.SSJID); if (ds != null && ds.Tables[0].Rows.Count > 0) { if (ds.Tables[0].Rows[0]["RESERVE3"]?.ToString() != "1") { DataTrans.P_UpActWeight(ds.Tables[0].Rows[0]["TASKID"].ToString().Trim(), si.Weight.ToString()); } si.TRAYCODE = ds.Tables[0].Rows[0]["TRAYCODE"].ToString().Trim(); string str = $"托盘条码{ds.Tables[0].Rows[0]["TRAYCODE"].ToString().Trim()}\r物料编码{ds.Tables[0].Rows[0]["productcode"].ToString().Trim()}\r物料名称:{ds.Tables[0].Rows[0]["productname"].ToString().Trim()}\r物料批次:{ds.Tables[0].Rows[0]["lotinfo"].ToString().Trim()}\r重量/称重重量:{ds.Tables[0].Rows[0]["assignnum"].ToString().Trim()}/{Math.Floor(si.Weight)}"; if (dcsaveledstr[si.SSJID] != str) { LedSendStr(si.SSJID, str, 0); } else { flag = false; } } else { string str = $"称重重量:{Math.Floor(si.Weight).ToString()}\r"; if (dcsaveledstr[si.SSJID] != str) { LedSendStr(si.SSJID, str, 2); } else { flag = false; } logWrite.WriteLog($"请确定输送机{si.SSJID}是否有创建任务!"); } } else { string str = string.Empty; if (dcsaveledstr[si.SSJID] != str) { LedSendStr(si.SSJID, str, 2); } } return(flag); }
/// <summary> /// 入库口待执行任务发送给AGV /// </summary> private void SendToAgvMsg() { while (true) { if (log.DataFileName != $"{DateTime.Now:yyyyMMdd}业务逻辑.txt") { log = new Log("业务逻辑", @".\RGV日志\"); } for (int i = 1; i <= 5; i++) { if (i == 5) { //查询入口载货台 TransportStr rkssj = lsTransport.Find(s => s.DTYPE == "106" && s.BTID == "1"); if (rkssj == null) { continue; } DataSet ds = DataTrans.D_GetInwareTask(rkssj.SSJID); if (ds != null && ds.Tables[0].Rows.Count > 0) { //查询目标巷道输送机是否空闲 TransportStr ts = lsTransport.Find(si => si.DTYPE == "105" && si.ALLEYID == ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString() && si.KXBZ == "1"); if (ts == null) { continue; } if (ds.Tables[0].Rows.Count == 1) { //查入库在途,在途存在,则不发目的地 int n = DataTrans.D_GetRkOnJobByDes(ds.Tables[0].Rows[0]["TCAGRO_ALLEY_ID"].ToString()); if (n > 0) { continue; } var dessj = lsTransport.Find(t => t.ALLEYID == ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString()); if (dessj == null) { continue; } string desaddress = rkssj.VAR5; string msg = string.Empty; SendToAgvInfo req = ToModel(ds, PallentsInTaskType, rkssj.VAR5, dessj.VAR5); SendToAgvResult result = SendTask(req); if (result.Message == "成功") { string zxrwh = string.Empty; if (string.IsNullOrEmpty(ds.Tables[0].Rows[0]["TASKID"].ToString())) { zxrwh = ds.Tables[0].Rows[0]["TASKNO"].ToString(); } else { zxrwh = DataTrans.D_AllotTaskno().ToString(); } int m = DataTrans.D_UpdateRkSendToAgv(ds.Tables[0], zxrwh, rkssj.SSJID, ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString(), out msg); if (m > 0) { NotifyEvent?.Invoke("S", $"调度指令{ds.Tables[0].Rows[0]["Taskid"]}更新成功"); log.WriteLog($"调度指令{ds.Tables[0].Rows[0]["Taskid"]}更新成功"); } else { string res = string.IsNullOrEmpty(msg) ? "更新失败" : $"更新出现异常!异常信息为{msg}"; NotifyEvent?.Invoke("S", $"调度指令{ds.Tables[0].Rows[0]["Taskid"]}{res}"); log.WriteLog($"调度指令{ds.Tables[0].Rows[0]["Taskid"]}{res}"); } } } } } else { //查询入口载货台 var rkssj = lsTransport.Find(si => si.DTYPE == "101" && si.BTID == i.ToString()); var wxssj = lsTransport.Find(si => si.DTYPE == "107" && si.BTID == i.ToString()); if (rkssj == null || wxssj == null) { continue; } DataSet ds = DataTrans.D_GetInwareTask(rkssj.SSJID); if (ds != null && ds.Tables[0].Rows.Count > 0) { //如果称重实际重量未更新不能给AGV下发指令 if (string.IsNullOrEmpty(ds.Tables[0].Rows[0]["actweight"].ToString())) { continue; } //查询目标巷道输送机是否空闲 var ts = lsTransport.Find(si => si.DTYPE == "105" && si.ALLEYID == ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString() && si.KXBZ == "1"); if (ts == null) { continue; } if (ds.Tables[0].Rows.Count == 1) { //查入库在途,在途存在,则不发目的地 int n = DataTrans.D_GetRkOnJobByDes(ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString()); if (n > 0) { continue; } string msg = string.Empty; SendToAgvInfo req = ToModel(ds, InTaskType, rkssj.VAR5, wxssj.VAR5); SendToAgvResult result = SendTask(req); if (result.Message == "成功") { string zxrwh = string.Empty; if (string.IsNullOrEmpty(ds.Tables[0].Rows[0]["TASKNO"].ToString())) { zxrwh = ds.Tables[0].Rows[0]["TASKNO"].ToString(); } else { zxrwh = DataTrans.D_AllotTaskno().ToString(); } int m = DataTrans.D_UpdateRkSendToAgv(ds.Tables[0], zxrwh, rkssj.SSJID, ds.Tables[0].Rows[0]["TCARGO_ALLEY_ID"].ToString(), out msg); if (m > 0) { NotifyEvent?.Invoke("S", $"调度指令{ds.Tables[0].Rows[0]["Taskid"]}更新成功"); log.WriteLog($"调度指令{ds.Tables[0].Rows[0]["Taskid"]}更新成功"); } else { string res = string.IsNullOrEmpty(msg) ? "更新失败" : $"更新出现异常!异常信息为{msg}"; NotifyEvent?.Invoke("S", $"调度指令{ds.Tables[0].Rows[0]["Taskid"]}{res}"); } } } } else if (ds.Tables[0].Rows.Count > 1) { string[] arr = Array.ConvertAll(ds.Tables[0].Rows.Cast <DataRow>().ToArray(), r => r["TASKID"].ToString()); string taskstr = string.Join(",", arr, 0, arr.Length); NotifyEvent?.Invoke("S", $"入库口{i}存在多个待执行任务,请检查并进行处理!待执行任务id{taskstr}"); log.WriteLog($"入库口{i}存在多个待执行任务,请检查并进行处理!待执行任务id{taskstr}"); } } } Thread.Sleep(500); } }
/// <summary> /// 给堆垛机指令表中插入指令数据 /// </summary> /// <param name="cs"></param> /// <param name="dt"></param> /// <returns></returns> private bool DDJCommand(ref CraneStr cs, DataTable dt) { bool flag = false; //用于存储指令表中的任务 int cranetaskno = 0; cs.Zxrwh = dt.Rows[0]["taskno"].ToInt(); if (dt.Rows[0]["TPLATOON"].ToInt().ToString().Equals("0")) { cs.Mbph = "0"; } else { int remainder = Convert.ToInt32(dt.Rows[0]["TPLATOON"]) % 2; if (remainder == 0) { cs.Mbph = "2"; } else { cs.Mbph = "1"; } } cs.Mblh = dt.Rows[0]["TCOLUMN"].ToString(); cs.Mbch = dt.Rows[0]["TFLOOR"].ToString(); if (dt.Rows[0]["SPLATOON"].ToInt().ToString().Equals("0")) { cs.Dqph = "0"; } else { int remainder = Convert.ToInt32(dt.Rows[0]["SPLATOON"]) % 2; if (remainder == 0) { cs.Dqph = "2"; } else { cs.Dqph = "1"; } } cs.Dqlh = dt.Rows[0]["SCOLUMN"].ToString(); cs.Dqch = dt.Rows[0]["SFLOOR"].ToString(); //查询指令表中是否存在指令未执行 DataSet dscommand = DataTrans.D_GetCraneCommand(cs.Btid); if (dscommand.Tables[0].Rows.Count > 0) { cranetaskno = dscommand.Tables[0].Rows[0]["RWH"].ToInt(); } if (cranetaskno > 0) { if (cranetaskno == Convert.ToInt32(dt.Rows[0]["TASKNO"])) { LogWrite.WriteLog($"堆垛机{cs.Btid}对应任务号{cranetaskno}还未给设备下发,无法向堆垛机指令表中再次写入!"); NotifyShowEvent?.Invoke("R", $"堆垛机{cs.Btid}对应任务号{cranetaskno}还未给设备下发,无法向堆垛机指令表中再次写入!"); flag = true; } else { LogWrite.WriteLog($"堆垛机{cs.Btid}对应任务号{cranetaskno}还未给设备下发,新任务{dt.Rows[0]["TASKNO"]},无法向堆垛机指令表中再次写入!"); NotifyShowEvent?.Invoke("R", $"堆垛机{cs.Btid}对应任务号{cranetaskno}还未给设备下发,新任务{dt.Rows[0]["TASKNO"]},无法向堆垛机指令表中再次写入!"); flag = false; DataTrans.D_CraneCommanddel(cs.Btid); } } else { DataTrans.D_InsertCraneCommand(cs, dt); flag = true; } return(flag); }
/// <summary> /// 给堆垛机下达任务 /// </summary> /// <param name="craneid"></param> /// <param name="buffer"></param> public void IssuedCraneTask(string craneid, byte[] buffer) { CraneStr cs = CRLBase.CraneStrList.Find(c => c.Btid == craneid); //任务结束,删除指令,放货完成 if (cs.Jdbz == "4") { cs.Zyfs = "4"; LogWrite.WriteLog($"放货完成开始删除堆垛机{cs.Btid}任务{cs.Zxrwh}"); NotifyShowEvent?.Invoke("R", $"防火完成开始删除堆垛机{cs.Btid}任务{cs.Zxrwh}"); if (WriteToCrane(cs)) { DataSet dssch = DataTrans.D_GetSchByTaskno(cs.Zxrwh.ToString()); if (dssch == null) { return; } if (dssch.Tables[0].Rows.Count > 0) { //入库或者移库 if (dssch.Tables[0].Rows[0]["TASKTYPE"].ToString() == "1" || dssch.Tables[0].Rows[0]["TASKTYPE"].ToString() == "3") { DataTrans.D_CraneCommandTrans(cs.Btid, dssch.Tables[0].Rows[0]["TASKID"].ToString(), "4", "4", "4"); LogWrite.WriteLog($"放货完成删除堆垛机{cs.Btid}任务{cs.Zxrwh}完成 托盘条码:{dssch.Tables[0].Rows[0]["traycode"]}"); NotifyShowEvent?.Invoke("R", $"放货完成删除堆垛机{cs.Btid}任务{cs.Zxrwh}完成 托盘条码:{dssch.Tables[0].Rows[0]["traycode"]}"); } //出库 else if (dssch.Tables[0].Rows[0]["TASKTYPE"].ToString() == "2") { DataTrans.D_CraneCommandTrans(cs.Btid, dssch.Tables[0].Rows[0]["TASKID"].ToString(), "3", "1", "3"); LogWrite.WriteLog($"放货完成删除堆垛机{cs.Btid}任务{cs.Zxrwh}完成 托盘条码:{dssch.Tables[0].Rows[0]["traycode"]}"); NotifyShowEvent?.Invoke("R", $"放货完成删除堆垛机{cs.Btid}任务{cs.Zxrwh}完成 托盘条码:{dssch.Tables[0].Rows[0]["traycode"]}"); } } } //入库目标有货 else if (cs.Rkyh == "1" && cs.Alarm != "0") { //根据任务号获取调度指令 DataSet dsoldsh = DataTrans.D_GetSchByTaskno(cs.Zxrwh.ToString()); //判断是否入库或者移库 if ((dsoldsh != null && dsoldsh.Tables[0].Rows.Count > 0 && (dsoldsh.Tables[0].Rows[0]["tasktype"].ToString() == "1")) || dsoldsh.Tables[0].Rows[0]["tasktype"].ToString() == "3") { #region 向中间表插入数据,向WMS发起请求 //发起前先判断中间表是否已存在该条申请,状态为 1=已下发,2=已处理 DataSet dsisexist = DataTrans.D_GetIDX_ASRS_SEND(dsoldsh.Tables[0].Rows[0]["TASKID"].ToString(), "10", $"1','2"); if (dsisexist != null && dsisexist.Tables[0].Rows.Count == 0) { LogWrite.WriteLog($"堆垛机{cs.Btid}调度指令{dsoldsh.Tables[0].Rows[0]["taskid"]}入库货位有货,开始向WMS申请新货位..."); NotifyShowEvent?.Invoke("R", $"堆垛机{cs.Btid}调度指令{dsoldsh.Tables[0].Rows[0]["taskid"]}入库货位有货,开始向WMS申请新货位..."); string alleyid = AlleyIdRelation.GetAlleyId(cs.Btid); //10代表存货占位,1代表下发 int n = DataTrans.D_InsertIDX_ASRS_SEND("10", "1", dsoldsh.Tables[0].Rows[0]["taskid"].ToString(), dsoldsh.Tables[0].Rows[0]["TRAYCODE"].ToString(), dsoldsh.Tables[0].Rows[0]["TCARGO_SPACE_ID"].ToString(), alleyid); string res = n > 0 ? "成功" : "失败"; LogWrite.WriteLog($"堆垛机{cs.Btid}调度指令{dsoldsh.Tables[0].Rows[0]["taskid"]}入库货位有货,向WMS申请新货位{res}"); NotifyShowEvent?.Invoke("R", $"堆垛机{cs.Btid}调度指令{dsoldsh.Tables[0].Rows[0]["taskid"]}入库货位有货,向WMS申请新货位{res}"); //等待wms处理2s Thread.Sleep(2000); } #endregion //获取WMS重新分配的货位 DataSet dsidx = DataTrans.D_GetIDX_ASRS_SEND(dsoldsh.Tables[0].Rows[0]["TASKID"].ToString(), "10", "2"); //查询到数据说明获取到货位 if (dsidx != null && dsidx.Tables[0].Rows.Count > 0) { LogWrite.WriteLog($"堆垛机{cs.Btid}货位有货重新分配货位"); NotifyShowEvent?.Invoke("R", $"堆垛机{cs.Btid}货位有货重新分配货位"); string taskid = dsoldsh.Tables[0].Rows[0]["TASKID"].ToString(); string sendid = dsidx.Tables[0].Rows[0]["SENDID"].ToString(); //重分的货位号 string spaceid = dsidx.Tables[0].Rows[0]["LOCATION"].ToString(); //根据货位号获取货位信息 DataSet dsspace = DataTrans.P_getSpaceInfo(spaceid); if (dsspace == null) { return; } //目标排号 string desrow = dsspace.Tables[0].Rows[0]["CSPLATOON"].ToString(); //目标列号 string descolnum = dsspace.Tables[0].Rows[0]["CSCOLUMN"].ToString(); //目标层号 string desfloor = dsspace.Tables[0].Rows[0]["CSFLOOR"].ToString(); //目标名称 string spacename = dsspace.Tables[0].Rows[0]["CARGO_SPACE_NAME"].ToString(); int remainder = Convert.ToInt32(desrow) % 2; cs.Mbph = remainder == 0 ? "2" : "1"; cs.Mblh = descolnum; cs.Mbch = desfloor; AlleyIdRelation.GetRKDesSpace(cs.Btid, ref cs); cs.Zyfs = "5"; if (WriteToCrane(cs)) { LogWrite.WriteLog($"{cs.Btid}满入解警成功"); NotifyShowEvent?.Invoke("R", $"{cs.Btid}满入解警成功"); //更新相关表货位信息 DataTrans.D_GetSpaceUpInfo(taskid, cs.Btid, "3", sendid, spaceid, desrow, descolnum, desfloor, spacename); cs.Zyfs = "1"; string res = WriteToCrane(cs) ? "成功" : "失败"; LogWrite.WriteLog($"给堆垛机{cs.Btid}重新分货位{spaceid}{res}"); NotifyShowEvent?.Invoke("R", $"给堆垛机{cs.Btid}重新分货位{spaceid}{res}"); } else { LogWrite.WriteLog($"{cs.Btid}满入解警失败"); NotifyShowEvent?.Invoke("R", $"{cs.Btid}满入解警失败"); } } } } //出库无货 else if (cs.Ckwh == "1" && cs.Alarm != "0") { //根据任务号获取调度指令 DataSet dsoldsch = DataTrans.D_GetSchByTaskno(cs.Zxrwh.ToString()); //判断是否出库 //出库将旧指令删除即可,调度指令作废 if (dsoldsch != null && dsoldsch.Tables[0].Rows.Count > 0 && dsoldsch.Tables[0].Rows[0]["tasktype"].ToString() == "2") { #region 向中间表插入数据,向WMS发起请求 //发起前先判断中间表是否已存在该条申请 //状态 1=下发,2=已处理状态 DataSet dsisexist = DataTrans.D_GetIDX_ASRS_SEND(dsoldsch.Tables[0].Rows[0]["TASKID"].ToString(), "11", $"1','3',4','2"); if (dsisexist.Tables[0].Rows.Count == 0) { //判断出库目标无货无申请,则插入一条申请 string alleyid = AlleyIdRelation.GetAlleyId(cs.Btid); //11=出库目标无货 1=下发 int n = DataTrans.D_InsertIDX_ASRS_SEND("11", "1", dsoldsch.Tables[0].Rows[0]["taskid"].ToString(), dsoldsch.Tables[0].Rows[0]["TRAYCODE"].ToString(), dsoldsch.Tables[0].Rows[0]["TCAGRO_SPACE_ID"].ToString(), alleyid); if (n > 0) { //插入成功,将调度指令更新为作废,将中间表更新为已完成 int k = DataTrans.D_RKYHDel(cs.Btid, dsoldsch.Tables[0].Rows[0]["taskid"].ToString()); if (k > 0) { string res = WriteToCrane(cs) ? "成功" : "失败"; LogWrite.WriteLog($"{cs.Btid}空出解警成功"); NotifyShowEvent?.Invoke("R", $"{cs.Btid}空出解警成功"); } } } #endregion } else { cs.Zyfs = "5"; string res = WriteToCrane(cs) ? "成功" : "失败"; LogWrite.WriteLog($"{cs.Btid}空出解警{res}"); NotifyShowEvent?.Invoke("R", $"{cs.Btid}空出解警{res}"); } } //待机 else if (cs.Jdbz == "0") { #region 一楼出库 //一楼出库 if (runorder == 1 && n == 0) { DataTable dt = new DataTable(); //查询一楼出库口输送机信息,设备类型为103 string dttype = "103"; TransportStr ts = lsTransport.Find(t => t.DTYPE == dttype && t.BTID == cs.Btid && t.KXBZ == "1"); if (ts == null) { return; } crl.HsWcsReadSSJ(ref ts); if (ts.KXBZ != "1") { return; } //查询调度任务, //任务类型2(TASKTYPE出库),任务类型描述(DESCRIPTION),状态为2(STATUS待执行) string alleyid = AlleyIdRelation.GetAlleyId(cs.Btid); //查询出库调度任务 //任务类型为2(TASKTYPE出库),层号(FLOOR)为1,状态为2(STATUS待执行) DataSet dstask = DataTrans.D_GetOutSchTaskByCrane("2", "1", "2", alleyid, string.Empty, cs); if (dstask != null && dstask.Tables[0].Rows.Count > 0) { dt = dstask.Tables[0].Clone(); dt.ImportRow(dstask.Tables[0].Rows[0]); bool flag1 = true; //调度指令表中任务号不存在,分配新的任务号 if (dt.Rows[0]["task"].ToString() == "0" || string.IsNullOrEmpty(dt.Rows[0]["taskno"].ToString())) { //任务号分配 string taskno = DataTrans.D_AllotTaskno().ToString(); if (!string.IsNullOrEmpty(taskno) && taskno != "0") { dt.Rows[0]["taskno"] = taskno; flag1 = DataTrans.D_UpSchTask(taskno, dt.Rows[0]["taskid"].ToString()); } else { flag1 = false; } } if (flag1) { LogWrite.WriteLog($"巷道{cs.Btid}开始一楼出库任务,任务号为{dt.Rows[0]["taskno"]}托盘条码:{dt.Rows[0]["traycode"]}"); NotifyShowEvent?.Invoke("R", $"巷道{cs.Btid}开始一楼出库任务,任务号为{dt.Rows[0]["taskno"]}托盘条码:{dt.Rows[0]["traycode"]}"); bool flag = DDJCommand(ref cs, dt); if (flag) { //根据巷道获取出库目标 AlleyIdRelation.GetCKOneDesSpace(cs.Btid, ref cs); //出库 cs.Zyfs = "2"; if (WriteToCrane(cs)) { LogWrite.WriteLog($"给堆垛机{cs.Btid}下发出库任务{dt.Rows[0]["taskno"]}成功,托盘条码:{dt.Rows[0]["traycode"]},目标地址:{cs.Mbph}排{cs.Mblh}列{cs.Mbch}层"); NotifyShowEvent?.Invoke("R", $"给堆垛机{cs.Btid}下发出库任务{dt.Rows[0]["taskno"]}成功,托盘条码:{dt.Rows[0]["traycode"]},目标地址:{cs.Mbph}排{cs.Mblh}列{cs.Mbch}层"); DataTrans.D_CraneCommandTrans(cs.Btid, dt.Rows[0]["TASKID"].ToString(), "2", "2", "3"); Thread.Sleep(1000); } else { LogWrite.WriteLog($"给堆垛机{cs.Btid}下发出库任务{dt.Rows[0]["taskno"]}失败"); NotifyShowEvent?.Invoke("R", $"给堆垛机{cs.Btid}下发出库任务{dt.Rows[0]["taskno"]}失败"); } } } } } #endregion #region 一楼入库 else if (runorder == 2) { DataTable dt = new DataTable(); //查询二楼入库口输送机信息,设备类型为207 string dttype = "102"; TransportStr ts = lsTransport.Find(s => s.DTYPE == dttype && s.BTID == cs.Btid && s.DWXH == "1"); if (ts == null) { return; } else { crl.HsWcsReadSSJ(ref ts); if (ts.DWXH != "1") { return; } //根据输送机任务号获取调度信息 DataSet dstask = DataTrans.D_GetSchByTaskno(ts.ZXRWH); DataRow[] drs = dstask.Tables[0].Select("TCARGO_SPACE_ID is not null", ""); if (drs.Length > 0) { dt = dstask.Tables[0].Clone(); dt.ImportRow(drs[0]); LogWrite.WriteLog($"开始入库任务,任务号为:{dt.Rows[0]["taskno"]},托盘条码:{dt.Rows[0]["traycode"]}"); NotifyShowEvent?.Invoke("R", $"开始入库任务,任务号为:{dt.Rows[0]["taskno"]},托盘条码:{dt.Rows[0]["traycode"]}"); bool flag = DDJCommand(ref cs, dt); if (flag) { //如果入库,目标地址为巷道 AlleyIdRelation.GetRKDesSpace(cs.Btid, ref cs); cs.Zyfs = "1"; //如果插入指令表成功,将指令写入到堆垛机中 if (WriteToCrane(cs)) { LogWrite.WriteLog($"给堆垛机{cs.Btid}下发任务{dt.Rows[0]["taskno"]}成功,托盘条码:{dt.Rows[0]["traycode"]},目标地址{cs.Mbph}排-{cs.Mblh}列-{cs.Mbch}层"); NotifyShowEvent?.Invoke("R", $"给堆垛机{cs.Btid}下发任务{dt.Rows[0]["taskno"]}成功,托盘条码:{dt.Rows[0]["traycode"]},目标地址{cs.Mbph}排-{cs.Mblh}列-{cs.Mbch}层"); DataTrans.D_CraneCommandTrans(cs.Btid, dt.Rows[0]["TASKID"].ToString(), "3", "3", "3"); Thread.Sleep(1000); } else { LogWrite.WriteLog($"给堆垛机{cs.Btid}下发入库任务{dt.Rows[0]["taskno"]}失败"); NotifyShowEvent?.Invoke("R", $"给堆垛机{cs.Btid}下发入库任务{dt.Rows[0]["taskno"]}失败"); } } return; } } } #endregion } } }