/// <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;
        }
Exemple #6
0
        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();
            }
        }
Exemple #7
0
        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());
        }
Exemple #8
0
        /// <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);
        }
Exemple #10
0
        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);
        }
Exemple #13
0
        /// <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);
        }
Exemple #16
0
        /// <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
                }
            }
        }