/// <summary> /// 将指令写入指令表 /// </summary> /// <param name="si"></param> /// <param name="taskid"></param> public static bool D_SSJCommandAllotNotask(TransportStr si, string taskid) { try { string tptm1 = ""; string tptm2 = ""; if (si.TRAYCODE.Length > 4) { tptm1 = si.TRAYCODE.Substring(0, 4); tptm2 = si.TRAYCODE.Substring(4, si.TRAYCODE.Length - 4); } string alleyid = si.ALLEYID; if (alleyid.Length > 3) { alleyid = Convert.ToInt32(alleyid.Substring(si.ALLEYID.Length - 3, 3)).ToString(); } string orastr = "begin "; //orastr += " insert into tbtaskno(taskno) values ('" + si.ZXRWH + "');"; orastr += " update SCHEDULE_TASK set TASKNO='" + si.ZXRWH + "' where TASKID='" + taskid + "';"; orastr += " update rico_device_ssj set ZXRWH='" + si.ZXRWH + "' where SSJID='" + si.SSJID + "';"; orastr += @" INSERT INTO RICO_DEVICE_SSJ_COMMAND( SSJID,BTID,DTYPE,RWH,TUNNELID, TPTM1,TPTM2,DOFLAG,CREATETIME,TPTM) VALUES ('" + si.SSJID + "','" + si.BTID + "','" + si.DTYPE + "','" + si.ZXRWH + "','" + alleyid + "','" + tptm1 + "','" + tptm2 + "','N','" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") + "','" + si.TRAYCODE + "');"; orastr += " end;"; int n = OracleHelper.ExecuteNonQuery(CommandType.Text, orastr, null); return(true); } catch (Exception ex) { LogInfo.WriteLog("输送机" + si.SSJID + "下发指令" + si.ZXRWH + "异常,异常信息为" + ex.Message); return(false); } }
public static void D_UpDevicesSSJ(TransportStr si) { //更新输送机设备表中任务号,托盘条码,到位信号,空闲信号 string orastr = $"update rico_devices_ssj set ZXRWH='{si.ZXRWH}',TRAYCODE='{si.TRAYCODE}',DWXH='{si.DWXH}',KXBZ='{si.KXBZ}' where ssjid='{si.SSJID}'"; OracleHelper.ExecuteNonQuery(CommandType.Text, orastr, null); }
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); }
public bool HsWriteToSSJ(TransportStr ts) { try { int start = int.Parse(ts.VAR3); byte[] buffer = new byte[18]; int[] info = new int[18]; #region 将任务号转为16进制,然后存入2字节 #endregion byte[] taskno = new byte[2]; taskno[0] = (byte)Convert.ToInt32(Convert.ToInt32(ts.ZXRWH) / 256); taskno[1] = (byte)Convert.ToInt32(Convert.ToInt32(ts.ZXRWH) % 256); byte[] barcode = new byte[4]; ts.TRAYCODE = string.IsNullOrEmpty(ts.TRAYCODE) ? "0" : ts.TRAYCODE; barcode[0] = (byte)Convert.ToInt32(Convert.ToInt32(ts.TRAYCODE) / (256 * 256 * 256)); barcode[1] = (byte)Convert.ToInt32(Convert.ToInt32(ts.TRAYCODE) / (256 * 256)); barcode[2] = (byte)Convert.ToInt32(Convert.ToInt32(ts.TRAYCODE) / 256); barcode[3] = (byte)Convert.ToInt32(Convert.ToInt32(ts.TRAYCODE) - barcode[0] * 256 * 256 * 256 - barcode[1] * 256 * 256 - barcode[2] * 256); for (int i = 0; i < 18; i++) { info[i] = 0; } for (int i = 0; i < taskno.Length; i++) { info[i] = int.Parse(taskno[i].ToString()); } for (int i = 0; i < barcode.Length; i++) { info[i + 2] = int.Parse(barcode[i].ToString()); } for (int i = 0; i < info.Length; i++) { buffer[i] = (byte)info[i]; } bool flag = false; if (HsPLCList.ContainsKey(ts.VAR1)) { flag = HsPLCList[ts.VAR1].HsWrite($"DB{dbnumber}.{start}", buffer); } else { HsPLCList.Add(ts.VAR1, new HsControlServer(ConfigurationManager.AppSettings[ts.VAR1])); } return(flag); } catch (Exception ex) { logWrite.WriteLog($"输送机{ts.SSJID}条码{ts.TRAYCODE}异常,异常信息为{ex.Message}"); return(false); } }
/// <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); }
/// <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> /// 下发任务 /// </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> /// 给堆垛机下达任务 /// </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 } } }
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); }
/// <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); } }