using System; using System.Collections.Generic; using System.Text; using System.Data; using DBFactory; using CommonClassLib; using Microsoft.VisualBasic; using System.Threading; using CommonLib; using CommLayerFactory; using ICommLayer; using Model; namespace WcfControlMonitorLib { /// /// Creator:Richard.liu /// 任务拆分类 /// 选取调度任务时以保障设备利用率最大化为原则:1、每个路径端头的入库站台要有一个任务; /// 2、每个堆垛机要有一个任务(以优先方式决定先执行哪种任务); /// 3、组合优先方式时,在调度任务完成时调整已拆分任务优先级为最高级9,进行优先执行。 /// /// 把调度任务分解成多个监控搬运任务 /// 分解原则:把一个调度任务按照出入库路径的设备索引排出多个步骤的设备指令 /// //20091107增加对五个调度策略SelectTask_ManPRI();SelectTask_OnlyIn();SelectTask_InSubjoinOut(); //SelectTask_OnlyOut();SelectTask_OutSubjoinIn();的优先级相同时根据下达时间的升序执行order by FTASKLEVEL desc,FBEGTIME asc public static class CDisassembleTask { public static event CDataSourceChangeEventHandler DataChange; public static void OnDataChange(object sender, CDataChangeEventArgs e) { if (DataChange != null) { DataChange(sender, e); } } public static event RefreshMonitorEventHandler RefreshMonitor; public static void OnRefreshMonitor(RefreshMonitorEventArgs e) { if (RefreshMonitor != null) { RefreshMonitor(e); } } static StringBuilder DisassembleUnallow = new StringBuilder();//20200129 static string stackUcode = "35000,35001,35002,35003,45001"; static StringBuilder sql = new StringBuilder(); static Thread mythread; static bool exitThread = false;//20091107 private static void BeginListen() {//20091107 while (!exitThread ) { try { MyTaskIntoSteps(); } catch (Exception ex) { DisassembleTaskError =ex.StackTrace+ ex.Message; } } } public static void EndListen() {//20091107 exitThread = true; if (mythread != null) { dbo.Close(); mythread.Abort(); mythread = null; } } public static void StartListen() { exitThread = false; mythread = new Thread(new ThreadStart(BeginListen)); mythread.IsBackground = true; mythread.Start(); } static string _DisassembleTaskError=""; public static string DisassembleTaskError { get { return _DisassembleTaskError; } set { _DisassembleTaskError = value; RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", DisassembleTaskError); OnRefreshMonitor(rme); } } static DBOperator dbo =new DBOperator();//20130926 static DBOperator dboM = CStaticClass.dboM; //20130510 static CCommonFunction ccf = new CCommonFunction(); static Model.MDevice devinfo; /// /// 拆分调度任务,不包括手工任务(直接生成存入调度T_Monitor_Task表) /// public static void MyTaskIntoSteps() { //GOTO 拆分调度任务 try { int Pri = ccf.SelectTaskPriPrecept(); //ChangeEndDeviceToEmergencyExit(); switch (Pri) { case 0://按照调度任务优先级 SelectTask_ManPRI(); break; case 1://单纯入库优先 SelectTask_OnlyIn(); break; case 12://入库优先携带附带运行条件的出库任务 SelectTask_InSubjoinOut(); break; case 2://单纯出库优先 SelectTask_OnlyOut(); break; case 21://出库优先携带附带运行条件的入库任务 SelectTask_OutSubjoinIn(); break; default: break; } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.MyTaskIntoSteps时发生错误:" +ex.StackTrace+ ex.Message; } } /// /// 按照调度任务优先级拆分任务 /// static void SelectTask_ManPRI() { DataView dvM = new DataView(); DataView dv = new DataView(); DataView dv1 = new DataView(); try { //20101124 sql.Remove(0, sql.Length); sql.Append("select * from T_Manage_Task where ").Append( " FIntoStepOK='0' order by FTASKLEVEL desc,F_ManageTaskKindIndex asc,FBEGTIME asc, FID asc "); dvM = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //dv = new DataView();//20091107 //dv1 = new DataView();//20091107 Model.MDevice deviceInfo; for (int i = 0; i < dvM.Count; i++) { if (dvM[i]["FCONTROLTASKTYPE"].ToString() == "1") //如果是入库任务:判断起点设备是否有调度命令在执行或者被锁定 { //sql = "SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status FROM T_Monitor_Task" + // " where F_ManageTASKKINDINDEX=" + dvM[i]["F_ManageTASKKINDINDEX"] + " and F_DeviceIndex=" + dvM[i]["FSTARTDEVICE"] + " and F_Status>=1"; //dv = dbo.ExceSQL(sql).Tables[0].DefaultView; //if (dv.Count > 0) //{ // continue; //} //被锁定 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(dvM[i]["FSTARTDEVICE"]).Append(" and F_LockedState>0"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20091107 if (dv1.Count > 0) { continue; } } if (dvM[i]["FCONTROLTASKTYPE"].ToString() == "2") //如果是出库任务:判断堆垛机是否有调度命令在执行或者被锁定 { //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status FROM T_Monitor_Task").Append( " where F_ManageTASKKINDINDEX=").Append(dvM[i]["F_ManageTASKKINDINDEX"]).Append( " and F_DeviceIndex=").Append(dvM[i]["FSTACK"]).Append(" and F_Status>0 "); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { continue; } //被锁定20091009 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(dvM[i]["FSTACK"]).Append(" and (F_LockedState>0 or F_ManTaskReserve>0)"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20091107 if (dv1.Count > 0) { continue; } //20091128 //判断将要被拆分的出库任务是否在已拆分的队列中有终点相同的出库任务,没有就找一个拆分 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDDEVICE=").Append(dvM[i]["FENDDEVICE"]).Append(") and (FSTACK = ").Append( dvM[i]["FSTACK"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc,FBEGTIME asc"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { continue; } //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvM[i]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { GetOutDoubleForkTask(dvM[i]); } } } //选择最短调度路径并且判断此路径上是否有设备发生故障 int routeid = MinRouteID(Convert.ToInt32(dvM[i]["FSTARTDEVICE"]), Convert.ToInt32(dvM[i]["FENDDEVICE"]), dvM[i]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") {//20091107 GetUsableDestination(dvM[i]); } continue; } if (CreateMonitor(Convert.ToInt32(dvM[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvM[i]["FID"]), routeid, dvM[i], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dvM[i]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dvM[i]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); //20100323 //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvM[i]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dvM[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvM[i]["FID"])); } } } } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.SelectTask_ManPRI时发生错误:" +ex.StackTrace+ ex.Message; } finally { dvM.Dispose() ; dv.Dispose(); dv1.Dispose(); } } /// /// 单纯拆分入库任务,没有入库任务时再拆分出库任务 /// static void SelectTask_OnlyIn() { DataView dvM = new DataView(); DataView dv = new DataView(); DataView dv1 = new DataView(); try { Model.MDevice deviceInfo; //20101124 sql.Remove(0, sql.Length); sql.Append("select * from T_Manage_Task where ").Append( " FIntoStepOK='0' order by FCONTROLTASKTYPE asc, F_ManageTaskKindIndex asc,FBEGTIME asc, FID asc "); dvM = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int i = 0; i < dvM.Count; i++) { #region 入库任务:判断起点设备是否有调度命令在执行或者被锁定 if (dvM[i]["FCONTROLTASKTYPE"].ToString() == "1") //如果是入库任务:判断起点设备是否有调度命令在执行或者被锁定 { //sql = "SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status FROM T_Monitor_Task" + // " where F_ManageTASKKINDINDEX=" + dvM[i]["F_ManageTASKKINDINDEX"] + " and F_DeviceIndex=" + dvM[i]["FSTARTDEVICE"] + " and F_Status>0"; //dv = dbo.ExceSQL(sql).Tables[0].DefaultView; //if (dv.Count > 0) //{ // continue; //} //被锁定 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(dvM[i]["FSTARTDEVICE"]).Append(" and F_LockedState>0"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { continue; } } #endregion #region 出库任务:判断堆垛机是否有调度命令在执行或者被锁定 if (dvM[i]["FCONTROLTASKTYPE"].ToString() == "2") //如果是出库任务:判断堆垛机是否有调度命令在执行或者被锁定 { //------------------------------------------------------//20200224 WXSS--------------------------------------------------------------- //20200224 WXSS 出库任务,判断 WCS和 WMS 中是否存在以库终点相同为入库起点的入库任务 //sql.Remove(0, sql.Length); //sql.Append("SELECT FID FROM T_Manage_Task WHERE (FSTARTDEVICE=").Append(dvM[i]["FENDDEVICE"]).Append(") and (FSTACK = ").Append( // dvM[i]["FSTACK"]).Append(") AND (FCONTROLTASKTYPE = 1) order by FTASKLEVEL desc,FBEGTIME asc"); //是否需要判断 FStatus=0 //dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //if (dv1.Count > 0) //{ // continue; //} //sql.Remove(0, sql.Length);//20101208 //sql.Append("select * from IO_CONTROL where (CONTROL_TASK_TYPE = 1)").Append(" and (START_DEVICE_CODE =").Append(dvM[i]["FENDDEVICE"]).Append(")"); //dv1 = dboM.ExceSQL(sql.ToString()).Tables[0].DefaultView; //if (dv1.Count > 0) //{ // continue; //} //------------------------------------------------------//20200224 WXSS--------------------------------------------------------------- //堆垛机有任务在运行 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status FROM T_Monitor_Task").Append( " where F_ManageTASKKINDINDEX=").Append(dvM[i]["F_ManageTASKKINDINDEX"]).Append( " and F_DeviceIndex=").Append(dvM[i]["FSTACK"]).Append(" and F_Status>0"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { continue; } //堆垛机被锁定20091009 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(dvM[i]["FSTACK"]).Append(" and (F_LockedState>0 or F_ManTaskReserve>0)"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { continue; } ////20091128 //判断将要被拆分的出库任务是否在已拆分的队列中有终点相同的出库任务(未执行),没有就找一个拆分 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDDEVICE=").Append(dvM[i]["FENDDEVICE"]).Append(") and (FSTACK = ").Append( dvM[i]["FSTACK"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc,FBEGTIME asc"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { continue; } //------------------------------------------------------//20200224 WXSS--------------------------------------------------------------- //判断将要被拆分的出库任务是否在已拆分的终点相同的出库任务(包括已执行和未执行的),没有就找一个拆分 //20200226 WXSS //sql.Remove(0, sql.Length); //sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDDEVICE=").Append(dvM[i]["FENDDEVICE"]).Append(") and (FSTACK = ").Append( // dvM[i]["FSTACK"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') order by FTASKLEVEL desc,FBEGTIME asc"); //dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //if (dv1.Count > 0) //{ // continue; //} //------------------------------------------------------//20200224 WXSS--------------------------------------------------------------- //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvM[i]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { GetOutDoubleForkTask(dvM[i]); } } } #endregion #region 最短路径上有设备发生故障 //选择最短调度路径并且判断此路径上是否有设备发生故障 int routeid = MinRouteID(Convert.ToInt32(dvM[i]["FSTARTDEVICE"]), Convert.ToInt32(dvM[i]["FENDDEVICE"]), dvM[i]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") {//20091107 GetUsableDestination(dvM[i]); } continue; } #endregion if (CreateMonitor(Convert.ToInt32(dvM[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvM[i]["FID"]), routeid, dvM[i], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dvM[i]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dvM[i]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); //20100323 //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvM[i]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dvM[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvM[i]["FID"])); } } //------------------------------------------------------//20200224 WXSS--------------------------------------------------------------- //分解完成,如果路径包括入库站台,入库灯灭 //20200226 WXSS //if (dvM[i]["FENDDEVICE"].ToString() == "1203" || dvM[i]["FSTARTDEVICE"].ToString() == "1203") //{ // //sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[5]); // int devidx = 1301; // sdo = CommModeCreate.CreateSendDeviceOrder(devidx); // sdo.SendDeviceOrder(1, 0, 8, devidx, 0); //} //------------------------------------------------------//20200224 WXSS--------------------------------------------------------------- } } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.SelectTask_OnlyIn时发生错误:" +ex.StackTrace+ ex.Message; } finally { dv.Dispose(); dv1.Dispose(); dvM.Dispose(); } } /// /// 入库优先附带符合运行条件的出库任务 /// 具体实现:判断T_Manage_Task表中是否有此堆垛机任务正在执行:如果没有,则挑选一个入库任务; /// 如果有堆垛机正在执行入库任务,并且队列中没有等待执行的堆垛机出库任务,挑选一个此堆垛机的出库任务优先级设为9; /// /// static void SelectTask_InSubjoinOut() { DataView dvM = new DataView(); DataView dv = new DataView();//20091107 DataView dv12 = new DataView(); DataView dvv = new DataView(); DataView dv0 = new DataView(); DataView dv1 = new DataView(); DataView dv00 = new DataView(); try { //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_StackIndex FROM T_Base_StackInfo"); dvM = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; Model.MDevice deviceInfo; int routeid = -1; for (int i = 0; i < dvM.Count; i++) { //首先选择此堆垛机所有入库任务,判断那个能执行 #region 首先选择此堆垛机所有入库任务,判断那个能执行 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE (FSTATUS = 0) AND (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 1) AND (FIntoStepOK = '0') order by FTASKLEVEL desc,FBEGTIME asc"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20091107 for (int j = 0; j < dv.Count; j++)//有这个堆垛机的入库任务等待拆分 { //选择最短调度路径并且判断此路径上是否有设备发生故障 routeid = MinRouteID(Convert.ToInt32(dv[j]["FSTARTDEVICE"]), Convert.ToInt32(dv[j]["FENDDEVICE"]), dv[j]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") {//20091107 GetUsableDestination(dv[j]); } continue; } if (CreateMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"]), routeid, dv[j], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dv[j]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dv[j]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); //20100323 //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[j]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"])); } } } } #endregion #region 然后给正在执行的入库堆垛机任务配上一个出库任务 //然后给正在执行的入库堆垛机任务配上一个出库任务 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT T_Monitor_Task.F_MonitorIndex FROM T_Monitor_Task ,T_Manage_Task WHERE ").Append( " (T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID AND ").Append( " T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex)").Append( " And (T_Monitor_Task.F_Status = 1 OR T_Monitor_Task.F_Status = 2) AND F_DeviceCommandIndex=5 and ").Append( "(T_Monitor_Task.F_DeviceIndex = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (T_Manage_Task.FCONTROLTASKTYPE = 1)"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0)//有这个堆垛机的入库任务在执行 { #region 有这个堆垛机的入库任务在执行准备携带出库任务 //20091013 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append( ") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc,FBEGTIME asc"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count <= 0)//没有此堆垛机的出库任务在排队 { #region 挑选此堆垛机的出库任务 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0') order by FTASKLEVEL desc,FBEGTIME asc"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0)//挑选此堆垛机的出库任务 { routeid = MinRouteID(Convert.ToInt32(dv[0]["FSTARTDEVICE"]), Convert.ToInt32(dv[0]["FENDDEVICE"]), dv[0]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") {//20091107 GetUsableDestination(dv[0]); } continue; } //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[0]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { GetOutDoubleForkTask(dv[0]); } } if (CreateMonitor(Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[0]["FID"]), routeid, dv[0], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 int level = Convert.ToInt32(dv[0]["FTASKLEVEL"]) == 100 ? 100 : 9; //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1',FTASKLEVEL=").Append(level).Append(" where FID=").Append(dv[0]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dv[0]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); //20101124 sql.Remove(0, sql.Length); sql.Append("update dbo.T_Monitor_Task set F_MonitorTaskLevel=9 where F_MonitorTaskLevel<>100 and F_ManageTASKKINDINDEX=").Append( dv[0]["F_ManageTaskKindIndex"]).Append(" and F_ManageTaskIndex=").Append(dv[0]["FID"]); dbo.ExceSQL(sql.ToString()); //20100323 //20101028增加出库关联 if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[0]["FID"])); } } } } #endregion } else {//20091014 //20101124 sql.Remove(0, sql.Length); //20130710sql.Append("SELECT * FROM T_Manage_Task WHERE (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append( // ") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0') order by FTASKLEVEL desc,FBEGTIME asc"); sql.Append("SELECT MIN(FID) AS FID,FTASKLEVEL,F_ManageTaskKindIndex, FENDDEVICE, FSTARTDEVICE, FSTACK, FUseAwayFork,FENDUCODE FROM T_Manage_Task WHERE (FSTACK = ") .Append(dvM[i]["F_StackIndex"]).Append(") AND (FSTATUS = 0) AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0') GROUP BY F_ManageTaskKindIndex,FENDDEVICE,FTASKLEVEL,FSTARTDEVICE,FSTACK, FUseAwayFork,FENDUCODE ORDER BY FTASKLEVEL DESC"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0)//挑选此堆垛机的出库任务 { //20091102 for (int j = 0; j < dv.Count; j++) { if (stackUcode.IndexOf(dvM[i]["F_StackIndex"].ToString()) >= 0) {//20120309 有此堆垛机的出库任务而且FENDUCODE终点相同在排队就不拆分了 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDUCODE=").Append(dv[j]["FENDUCODE"]).Append( ") and (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc"); } else {//20110110有此堆垛机的出库任务而且终点相同在排队就不拆分了 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDDEVICE=").Append(dv[j]["FENDDEVICE"]).Append( ") and (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc"); } dv12 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv12.Count > 0) { continue; } routeid = MinRouteID(Convert.ToInt32(dv[j]["FSTARTDEVICE"]), Convert.ToInt32(dv[j]["FENDDEVICE"]), dv[j]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") {//20091107 GetUsableDestination(dv[j]); } continue; } //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[j]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { GetOutDoubleForkTask(dv[j]); } } if (CreateMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"]), routeid, dv[j], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 int level = Convert.ToInt32(dv[j]["FTASKLEVEL"]) == 100 ? 100 : 9; //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1',FTASKLEVEL=").Append(level).Append(" where FID=").Append(dv[j]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dv[j]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_MonitorTaskLevel=9 where F_MonitorTaskLevel<>100 and F_ManageTASKKINDINDEX=").Append( dv[j]["F_ManageTaskKindIndex"]).Append(" and F_ManageTaskIndex=").Append(dv[j]["FID"]); dbo.ExceSQL(sql.ToString()); //20100323 //20101028增加出库关联 if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"])); } } } } } else { //20091107 //20101124 sql.Remove(0, sql.Length); sql.Append("select * from T_Manage_Task WHERE (FSTACK = ").Append( dvM[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0)"); dvv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int aa = 0; aa < dvv.Count; aa++) { //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FTASKLEVEL=9 WHERE (FTASKLEVEL<>100) and F_ManageTASKKINDINDEX=").Append( dvv[aa]["F_ManageTaskKindIndex"]).Append(" and FID=").Append(dvv[aa]["FID"]); dbo.ExceSQL(sql.ToString()); //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_MonitorTaskLevel=9 where F_MonitorTaskLevel<>100 and F_ManageTASKKINDINDEX=").Append( dvv[aa]["F_ManageTaskKindIndex"]).Append(" and F_ManageTaskIndex=").Append(dvv[aa]["FID"]); dbo.ExceSQL(sql.ToString()); } } } #endregion } else//没有此堆垛机任务 { #region 没有此堆垛机任务 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (FIntoStepOK = '0') order by FTASKLEVEL desc, FCONTROLTASKTYPE asc,FBEGTIME asc"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //20091102 for (int j = 0; j < dv.Count; j++) //if (dv.Count > 0)//随便挑选一个此堆垛机的任务 { if (dv[j]["FCONTROLTASKTYPE"].ToString() == "2") //如果是出库任务:判断堆垛机是否有调度命令在执行或者被锁定 { if (stackUcode.IndexOf(dvM[i]["F_StackIndex"].ToString()) >= 0) {//20120309 有此堆垛机的出库任务而且FENDUCODE终点相同在排队就不拆分了 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDUCODE=").Append(dv[j]["FENDUCODE"]).Append( ") and (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc"); } else {//20110110有此堆垛机的出库任务而且终点相同在排队就不拆分了 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDDEVICE=").Append(dv[j]["FENDDEVICE"]).Append( ") and (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc"); } dv12 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv12.Count > 0) { continue; } //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status FROM T_Monitor_Task").Append( " where F_DeviceIndex=").Append(dv[j]["FSTACK"]).Append(" and F_Status>0 "); dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20091107 if (dv0.Count > 0) { continue; } //被锁定20091009 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(dv[j]["FSTACK"]).Append(" and (F_LockedState>0 or F_ManTaskReserve>0)"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//220091007 if (dv1.Count > 0) { continue; } //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[j]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { GetOutDoubleForkTask(dv[j]); } } } routeid = MinRouteID(Convert.ToInt32(dv[j]["FSTARTDEVICE"]), Convert.ToInt32(dv[j]["FENDDEVICE"]), dv[j]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") {//20091107 GetUsableDestination(dv[j]); } continue; } if (CreateMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"]), routeid, dv[j], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dv[j]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dv[j]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); //20100323 //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[j]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"])); } } } } #endregion } #endregion } //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE ((FSTACK <= 0) or (FCONTROLTASKTYPE=3)) AND (FIntoStepOK = '0') order by FTASKLEVEL desc, FCONTROLTASKTYPE asc,FBEGTIME asc"); dvM = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int i = 0; i < dvM.Count; i++)//挑选没有堆垛机参与的任务 { //选择最短调度路径并且判断此路径上是否有设备发生故障 routeid = MinRouteID(Convert.ToInt32(dvM[i]["FSTARTDEVICE"]), Convert.ToInt32(dvM[i]["FENDDEVICE"]), dvM[i]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") {//20091107 GetUsableDestination(dvM[i]); } continue; } if (CreateMonitor(Convert.ToInt32(dvM[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvM[i]["FID"]), routeid, dvM[i], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dvM[i]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dvM[i]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); //20100323 //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvM[i]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dvM[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvM[i]["FID"])); } } } } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.SelectTask_InSubjoinOut时发生错误:" +ex.StackTrace+ ex.Message; } finally { //20091107 dvM.Dispose(); dv.Dispose(); dv12.Dispose(); dvv.Dispose(); dv0.Dispose(); dv1.Dispose(); dv00.Dispose(); } } /// /// 单纯拆分出库任务,没有出库任务时再拆分入库任务 /// static void SelectTask_OnlyOut() { DataView dvM = new DataView(); DataView dv = new DataView(); DataView dv1 = new DataView(); try { //20101124 sql.Remove(0, sql.Length); sql.Append("select * from T_Manage_Task where ").Append( " FIntoStepOK='0' order by FCONTROLTASKTYPE decs, F_ManageTaskKindIndex asc,FBEGTIME asc, FID asc "); dvM = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; Model.MDevice deviceInfo; for (int i = 0; i < dvM.Count; i++) { if (dvM[i]["FCONTROLTASKTYPE"].ToString() == "1") //如果是入库任务:判断起点设备是否有调度命令在执行或者被锁定 { //sql = "SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status FROM T_Monitor_Task" + // " where F_ManageTASKKINDINDEX=" + dvM[i]["F_ManageTASKKINDINDEX"] + " and F_DeviceIndex=" + dvM[i]["FSTARTDEVICE"] + " and F_Status>0"; //dv = dbo.ExceSQL(sql).Tables[0].DefaultView; //if (dv.Count > 0) //{ // continue; //} //被锁定 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(dvM[i]["FSTARTDEVICE"]).Append(" and F_LockedState>0"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { continue; } } if (dvM[i]["FCONTROLTASKTYPE"].ToString() == "2") //如果是出库任务:判断堆垛机是否有调度命令在执行或者被锁定 { //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status FROM T_Monitor_Task").Append( " where F_ManageTASKKINDINDEX=").Append(dvM[i]["F_ManageTASKKINDINDEX"] ).Append(" and F_DeviceIndex=").Append(dvM[i]["FSTACK"]).Append(" and F_Status>0 "); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { continue; } //被锁定20091009 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(dvM[i]["FSTACK"]).Append(" and (F_LockedState>0 or F_ManTaskReserve>0)"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { continue; } //20091128 //判断将要被拆分的出库任务是否在已拆分的队列中有终点相同的出库任务,没有就找一个拆分 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDDEVICE=").Append(dvM[i]["FENDDEVICE"]).Append(") and (FSTACK = ").Append( dvM[i]["FSTACK"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc,FBEGTIME asc"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { continue; } //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvM[i]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { GetOutDoubleForkTask(dvM[i]); } } } //选择最短调度路径并且判断此路径上是否有设备发生故障 int routeid = MinRouteID(Convert.ToInt32(dvM[i]["FSTARTDEVICE"]), Convert.ToInt32(dvM[i]["FENDDEVICE"]), dvM[i]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") {//20091107 GetUsableDestination(dvM[i]); } continue; } if (CreateMonitor(Convert.ToInt32(dvM[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvM[i]["FID"]), routeid, dvM[i], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dvM[i]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dvM[i]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); //20100323 //20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvM[i]["FSTACK"])); if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dvM[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvM[i]["FID"])); } } } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.SelectTask_OnlyOut时发生错误:" +ex.StackTrace+ ex.Message; } finally { dv.Dispose(); dv1.Dispose(); dvM.Dispose(); } } public static int GetLaneIndexFromLaneGate(int lanegate) {//20120820 DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT F_LaneIndex FROM T_Base_Lane_Gate WHERE (F_LaneGateDeviceIndex = {0}) ", lanegate)).Tables[0].DefaultView; if (dv.Count > 0) { int a = 0; if (int.TryParse(dv[0]["F_LaneIndex"].ToString(), out a) == false) { return 0; } else { return Convert.ToInt32(dv[0]["F_LaneIndex"]); } } else { return 0; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } static void ChangeEndDeviceToEmergencyExit() { DataView dv = new DataView(); DataView dv1 = new DataView(); try { string sql = string.Empty; sql = string.Format("select F_DeviceIndex,F_EmergencyExit from T_Base_TaskCount where F_EmergencyExit>0");//查找终点设备对应的出库任务获取数量和执行数量 dv = dbo.ExceSQL(sql).Tables[0].DefaultView; sql = string.Format("SELECT distinct FENDDEVICE FROM T_Manage_Task WHERE (FSTATUS = 0) AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0')");//查找未执行未拆分且终点是enddevice的任务 dv1 = dbo.ExceSQL(sql).Tables[0].DefaultView; for (int k = 0; k < dv1.Count;k++ ) { int taskenddevice = Convert.ToInt32(dv1[k]["FENDDEVICE"]);//任务终点 for (int i = 0; i < dv.Count; i++) { int enddevice = Convert.ToInt32(dv[i]["F_DeviceIndex"]); int newenddevice = Convert.ToInt32(dv[i]["F_EmergencyExit"]); //判读newenddevice 是否为固定站台,获取新的 enddevice 和endcell int lane = GetLaneIndexFromLaneGate(newenddevice);//巷道 string endcell = ""; if (lane!=0) { endcell =Convert.ToString( newenddevice); newenddevice = lane; } if (taskenddevice == enddevice)// { sql = string.Format("update T_Manage_Task set FENDDEVICE= {0},FENDCELL='{1}',FOLDENDDEVICE={2} WHERE (FENDDEVICE={3}) and (FSTATUS = 0) AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0')", newenddevice, endcell,enddevice, enddevice);//查找未执行未拆分且终点是enddevice的任务 dbo.ExceSQL(sql); } } } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.ChangeEndDeviceToEmergencyExit时发生错误:" + ex.StackTrace + ex.Message; } finally { dv.Dispose(); dv1.Dispose(); } } /// /// 出库优先附带符合运行条件的入库任务 /// 具体实现:在收到出库任务的完成时,挑选一个可以执行的入库任务把优先级设成最高9 /// static void SelectTask_OutSubjoinIn() { DataView dvStack = new DataView(); DataView dv = new DataView(); DataView dv112 = new DataView(); DataView dv0 = new DataView(); DataView dv1 = new DataView(); DataView dvv = new DataView(); try { Model.MDevice deviceInfo; sql.Remove(0, sql.Length); sql.Append("SELECT F_StackIndex FROM T_Base_StackInfo"); dvStack = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; int routeid = -1; for (int i = 0; i < dvStack.Count; i++) { #region (R)首先选择此堆垛机所有入库任务,判断那个能拆分 sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE (FSTATUS = 0) AND (FSTACK = ").Append(dvStack[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 1) AND (FIntoStepOK = '0') order by FTASKLEVEL desc,FBEGTIME asc"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int j = 0; j < dv.Count; j++)//有这个堆垛机的入库任务等待拆分 { #region 选择最短调度路径并且判断此路径上是否有设备发生故障 routeid = MinRouteID(Convert.ToInt32(dv[j]["FSTARTDEVICE"]), Convert.ToInt32(dv[j]["FENDDEVICE"]), dv[j]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") { GetUsableDestination(dv[j]); } DisassembleUnallow.Clear(); DisassembleUnallow.Append("路径不可用"); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dv[j]["fid"])); continue; } #endregion if (CreateMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"]), routeid, dv[j], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dv[j]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dv[j]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("CreateMonitor", "拆分标记成功(R-1)", "", dv[j]["FID"].ToString());//dvStack[i]["FID"] DisassembleUnallow.Clear(); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dv[j]["FID"])); #region 20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[j]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"])); } } #endregion } } #endregion #region (R-C)然后给正在执行 入库送货 的堆垛机,配上一个出库任务 sql.Remove(0, sql.Length); sql.Append("SELECT T_Monitor_Task.F_MonitorIndex FROM T_Monitor_Task ,T_Manage_Task WHERE ").Append( " (T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID AND ").Append( " T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex)").Append( " And (T_Monitor_Task.F_Status = 1 OR T_Monitor_Task.F_Status = 2) AND F_DeviceCommandIndex=5 and ").Append( "(T_Monitor_Task.F_DeviceIndex = ").Append(dvStack[i]["F_StackIndex"]).Append(") AND (T_Manage_Task.FCONTROLTASKTYPE = 1)"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0)//有这个堆垛机的入库送货任务在执行 { #region (R-C-2)没有此堆垛机出库任务已拆分,则只拆一个,并提高优先级 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FSTACK = ").Append(dvStack[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc,FBEGTIME asc"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count <= 0) { //没有此堆垛机的出库任务已拆分且未执行 //此处只是按照优先级和时间选择第一个,如果有复杂逻辑可在出库逻辑(C)中添加 sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE (FSTACK = ").Append(dvStack[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0') order by FTASKLEVEL desc,FBEGTIME asc"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int j = 0; j < dv.Count; j++) { #region 选择最短调度路径并且判断此路径上是否有设备发生故障 routeid = MinRouteID(Convert.ToInt32(dv[j]["FSTARTDEVICE"]), Convert.ToInt32(dv[j]["FENDDEVICE"]), dv[j]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") { GetUsableDestination(dv[j]); } DisassembleUnallow.Clear(); DisassembleUnallow.Append("路径不可用"); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dv[j]["fid"])); continue; } #endregion #region 20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[j]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { GetOutDoubleForkTask(dv[j]); } } #endregion if (CreateMonitor(Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[0]["FID"]), routeid, dv[0], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dv[0]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dv[0]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); #region 需要提高优先级 //int level = Convert.ToInt32(dv[j]["FTASKLEVEL"]) == 100 ? 100 : 9; //sql.Remove(0, sql.Length); //sql.Append("update T_Manage_Task set FIntoStepOK='1',FTASKLEVEL=").Append(level).Append(" where FID=").Append(dv[j]["FID"] //).Append(" and F_ManageTaskKindIndex=").Append(dv[j]["F_ManageTaskKindIndex"]); //dbo.ExceSQL(sql.ToString()); //20101124 int level = 9; sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_MonitorTaskLevel=").Append(level).Append(" where F_MonitorTaskLevel<>100 and F_ManageTASKKINDINDEX=").Append( dv[0]["F_ManageTaskKindIndex"]).Append(" and F_ManageTaskIndex=").Append(dv[0]["FID"]); dbo.ExceSQL(sql.ToString()); #endregion CommonClassLib.CCarryConvert.WriteDarkCasket("CreateMonitor", "拆分标记成功(R-C-2)", "", dvStack[i]["FID"].ToString()); DisassembleUnallow.Clear(); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dvStack[i]["FID"])); #region 20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[0]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[0]["FID"])); } } #endregion } break; //这一行break保证此处只拆一个出库任务, } } #endregion #region (R-C-3)有此堆垛机的出库任务已拆分(不需要拆分新的任务,只提高优先级即可,原代码删掉了 by zcy) else { sql.Remove(0, sql.Length); sql.Append("select * from T_Manage_Task WHERE (FSTACK = ").Append( dvStack[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0)"); dvv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int aa = 0; aa < dvv.Count; aa++) { //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FTASKLEVEL=9 WHERE (FTASKLEVEL<>100) and F_ManageTASKKINDINDEX=").Append( dvv[aa]["F_ManageTaskKindIndex"]).Append(" and FID=").Append(dvv[aa]["FID"]); dbo.ExceSQL(sql.ToString()); //20101124 sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_MonitorTaskLevel=9 where F_MonitorTaskLevel<>100 and F_ManageTASKKINDINDEX=").Append( dvv[aa]["F_ManageTaskKindIndex"]).Append(" and F_ManageTaskIndex=").Append(dvv[aa]["FID"]); dbo.ExceSQL(sql.ToString()); } } #endregion } #endregion #region (C)没有正在执行的入库送货任务,选所有可拆分的出库任务 else { #region 堆垛机是否具备执行新任务的条件 //堆垛机有任务执行中(Q报警会导致不拆分吗?) sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status FROM T_Monitor_Task").Append( " where F_DeviceIndex=").Append(dvStack[i]["F_StackIndex"]).Append(" and F_Status>0 "); dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count > 0) { continue; } //被锁定 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(dvStack[i]["F_StackIndex"]).Append(" and (F_LockedState>0 or F_ManTaskReserve>0)"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { continue; } #endregion sql.Remove(0, sql.Length); //20130710sql.Append("SELECT * FROM T_Manage_Task WHERE (FSTATUS = 0) AND (FSTACK = ").Append(dvM[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0') order by FTASKLEVEL desc,FBEGTIME asc"); //20181029 //sql.Append("SELECT MIN(FID) AS FID,FTASKLEVEL,F_ManageTaskKindIndex, FENDDEVICE, FSTARTDEVICE, FSTACK, FUseAwayFork,FENDUCODE,FLOGIC_AREA FROM T_Manage_Task WHERE (FSTACK = ") // .Append(dvM[i]["F_StackIndex"]).Append(") AND (FSTATUS = 0) AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0') GROUP BY F_ManageTaskKindIndex,FENDDEVICE,FTASKLEVEL,FSTARTDEVICE,FSTACK, FUseAwayFork,FENDUCODE,FLOGIC_AREA ORDER BY FTASKLEVEL DESC"); sql.Append("SELECT FPALLETBARCODE, FSTARTCELL,F_ManageTaskKindIndex,FENDDEVICE,FTASKLEVEL,FSTARTDEVICE,FSTACK, FUseAwayFork,FENDUCODE,FLOGIC_AREA ,FID FROM T_Manage_Task WHERE (FSTACK = ") .Append(dvStack[i]["F_StackIndex"]).Append(") AND (FSTATUS = 0) AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '0') GROUP BY F_ManageTaskKindIndex,FENDDEVICE,FTASKLEVEL,FSTARTDEVICE,FSTACK, FUseAwayFork,FENDUCODE,FLOGIC_AREA ,F_ManageTaskKindIndex,FENDDEVICE,FPALLETBARCODE, FSTARTCELL,FID ORDER BY FTASKLEVEL DESC , FID "); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int j = 0; j < dv.Count; j++)//有这个堆垛机的出库任务等待拆分 { #region 同一终点,同一堆垛机,有未已拆分未执行的出库任务,则不继续拆分 if (stackUcode.IndexOf(dvStack[i]["F_StackIndex"].ToString()) >= 0) { // 有此堆垛机的出库任务而且FENDUCODE终点相同在排队就不拆分了 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDUCODE=").Append(dv[j]["FENDUCODE"]).Append( ") and (FSTACK = ").Append(dvStack[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc"); } else { //20110110有此堆垛机的出库任务而且终点相同在排队就不拆分了 //20170923 FLOGIC_AREA 替换 FENDDEVICE 同意逻辑区域视为终点相同 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FLOGIC_AREA=").Append(dv[j]["FLOGIC_AREA"]).Append( ") and (FSTACK = ").Append(dvStack[i]["F_StackIndex"]).Append(") AND (FCONTROLTASKTYPE = 2) AND (FIntoStepOK = '1') AND (FStatus = 0) order by FTASKLEVEL desc"); } dv112 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv112.Count > 0) { continue; } #endregion #region 选择最短调度路径并且判断此路径上是否有设备发生故障 routeid = MinRouteID(Convert.ToInt32(dv[j]["FSTARTDEVICE"]), Convert.ToInt32(dv[j]["FENDDEVICE"]), dv[j]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") { GetUsableDestination(dv[j]); } DisassembleUnallow.Clear(); DisassembleUnallow.Append("路径不可用"); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dv[j]["fid"])); continue; } #endregion #region 20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[j]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { GetOutDoubleForkTask(dv[j]); } } #endregion if (CreateMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"]), routeid, dv[j], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dv[j]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dv[j]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); #region 需要提高优先级 //int level = Convert.ToInt32(dv[j]["FTASKLEVEL"]) == 100 ? 100 : 9; //sql.Remove(0, sql.Length); //sql.Append("update T_Manage_Task set FIntoStepOK='1',FTASKLEVEL=").Append(level).Append(" where FID=").Append(dv[j]["FID"] //).Append(" and F_ManageTaskKindIndex=").Append(dv[j]["F_ManageTaskKindIndex"]); //dbo.ExceSQL(sql.ToString()); ////20101124 //sql.Remove(0, sql.Length); //sql.Append("update T_Monitor_Task set F_MonitorTaskLevel=").Append(level).Append(" where F_MonitorTaskLevel<>100 and F_ManageTASKKINDINDEX=").Append( // dv[j]["F_ManageTaskKindIndex"]).Append(" and F_ManageTaskIndex=").Append(dv[j]["FID"]); //dbo.ExceSQL(sql.ToString()); #endregion CommonClassLib.CCarryConvert.WriteDarkCasket("CreateMonitor", "拆分标记成功(C-4)", "", dv[j]["FID"].ToString());// dvStack[i]["FID"] DisassembleUnallow.Clear(); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dv[j]["FID"]));// dvStack[i]["FID"] #region 20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[j]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dv[j]["F_ManageTaskKindIndex"]), Convert.ToInt32(dv[j]["FID"])); } } #endregion } } } #endregion } #region 挑选没有堆垛机参与的任务(Q移库任务包含在内吗?) sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE ((FSTACK <= 0) or (FCONTROLTASKTYPE>=3)) AND (FIntoStepOK = '0') order by FTASKLEVEL desc, FCONTROLTASKTYPE asc,FBEGTIME asc"); dvStack = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int i = 0; i < dvStack.Count; i++) { //选择最短调度路径并且判断此路径上是否有设备发生故障 routeid = MinRouteID(Convert.ToInt32(dvStack[i]["FSTARTDEVICE"]), Convert.ToInt32(dvStack[i]["FENDDEVICE"]), dvStack[i]["FUseAwayFork"]); if (routeid == -1) { if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") { GetUsableDestination(dvStack[i]); } DisassembleUnallow.Clear(); DisassembleUnallow.Append("路径不可用"); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dvStack[i]["fid"])); continue; } else { DisassembleUnallow.Clear(); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dvStack[i]["fid"])); } #region 每个巷道,移库任务只拆分一个 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FENDDEVICE=").Append(dvStack[i]["FENDDEVICE"]).Append(") AND (FCONTROLTASKTYPE =3) AND (FIntoStepOK = '1') order by FTASKLEVEL desc"); dv112 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv112.Count > 0) { continue; } #endregion if (CreateMonitor(Convert.ToInt32(dvStack[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvStack[i]["FID"]), routeid, dvStack[i], 0) > 0) { sql.Clear(); sql.Append("select * from T_Monitor_Task where f_managetaskindex = ").Append(dvStack[i]["FID"]); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dvStack[i]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dvStack[i]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("CreateMonitor", "拆分标记成功", "", dvStack[i]["FID"].ToString()); DisassembleUnallow.Clear(); UpdateDisassembleUnallow(DisassembleUnallow, Convert.ToInt32(dvStack[i]["FID"])); #region 20101028增加出库关联 deviceInfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvStack[i]["FSTACK"])); if (deviceInfo != null) { if (deviceInfo.IfCorrelDoubleFork == "1") { CreateRelativeMonitor(Convert.ToInt32(dvStack[i]["F_ManageTaskKindIndex"]), Convert.ToInt32(dvStack[i]["FID"])); } } #endregion } } } #endregion } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.SelectTask_OutSubjoinIn时发生错误:" + ex.StackTrace + ex.Message; } finally { dv.Dispose(); dv0.Dispose(); dv1.Dispose(); dv112.Dispose(); dvStack.Dispose(); dvv.Dispose(); } } /// /// 拆分任务不通过的错误提示 zcy /// /// 拆分不通过 /// 管理任务索引 /// public static void UpdateDisassembleUnallow(StringBuilder disassembleUnallow, int fid) { #region 20200129增加的信息提示 int rec = 0; if (disassembleUnallow.Length > 0) { rec = dbo.ExecuteSql(string.Format("UPDATE T_Manage_Task SET FERRORCODE ='{0}' WHERE fid ='{1}' ", disassembleUnallow.ToString(), fid)); } else { rec = dbo.ExecuteSql(string.Format("UPDATE T_Manage_Task SET FERRORCODE ='' WHERE fid ='{1}' ", disassembleUnallow.ToString(), fid)); } if (rec > 0) { CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null); OnDataChange("拆分任务时时,异常", cea); } #endregion } /// /// 根据调度任务的起点和终点设备索引查找路径最短的RouteIDSub /// /// 起点设备索引 /// 终点设备索引 /// public static int MinRouteID(int startdevice,int enddevice) { DataView dv = new DataView(); DataView dvd = new DataView(); DataView dv1 = new DataView(); DataView dv2 = new DataView(); List minroute=new List() ; try { int retrouteidsub =GetSameStartDeviceEnddeviceRouteID(startdevice, enddevice); if (retrouteidsub > 0) { return retrouteidsub; } //选择最短调度路径并且判断此路径上是否有设备发生故障 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT distinct(T_Base_Route_Device.F_RouteIDSub) FROM T_Base_Device,T_Base_Route_Device,").Append( "T_Base_Route where T_Base_Route_Device.F_RouteID = T_Base_Route.F_RouteID and ").Append( " T_Base_Route_Device.F_DeviceIndex = T_Base_Device.F_DeviceIndex and ").Append( " F_StartDevice=").Append(startdevice).Append(" and F_EndDevice=").Append(enddevice).Append(" and F_Status=1"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //0,routIDSub;1,路径最小值 if (dv.Count == 0) { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); OnRefreshMonitor(rme); return -1; } for (int i = 0; i < dv.Count; i++) { //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_RouteIDSub, F_LockedState,T_Base_Device.F_DeviceIndex FROM T_Base_Device,T_Base_Route_Device WHERE ").Append( " T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and (T_Base_Route_Device.F_RouteIDSub = ").Append( dv[i]["F_RouteIDSub"]).Append(") AND (T_Base_Device.F_LockedState = - 1 or T_Base_Device.F_ErrorCode>=30)");//20121203 dvd = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvd.Count > 0) { int dvin = Convert.ToInt32(dvd[0]["F_DeviceIndex"]); if ((dvin >= 35001 && dvin <= 35003) || (dvin == 45001)) {//20120207机器人地位无法取代,不判断是否被禁用 } else { continue; } } List route = new List();//0,routIDSub;1,步长;2,路径使用频率;3,路径设备任务数 //路径步长(设备总数)最短(权重0.3),路径使用频率最小(权重0.3)的路径,路径设备任务数(权重0.3) route.Add(Convert.ToDouble(dv[i]["F_RouteIDSub"]));//RouteIDSub //20101124 sql.Remove(0, sql.Length); sql.Append("select count(F_DeviceIndex) as steps from T_Base_Route_Device where F_RouteIDSub=" ).Append(dv[i]["F_RouteIDSub"]); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { route.Add(Convert.ToDouble(dv1[0]["steps"]));//步长 //route.Add(0); } else { continue; } //路径使用频率:路径执行调度任务的数量 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(DISTINCT F_ManageTaskIndex) AS ManCount FROM T_Monitor_Task GROUP BY F_RouteID HAVING (F_RouteID = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { int a = -1; if (int.TryParse(dv2[0]["ManCount"].ToString(), out a) == true) { route.Add(Convert.ToDouble(dv2[0]["ManCount"]));//路径使用频率 } else { route.Add(0);//路径使用频率 } } else { route.Add(0);//路径使用频率 } //路径设备任务数 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(T_Monitor_Task.F_MonitorIndex) AS mtask FROM T_Monitor_Task ,T_Base_Route_Device where (T_Monitor_Task.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex) and (T_Base_Route_Device.F_RouteIDSub = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { int a = -1; if (int.TryParse(dv2[0]["mtask"].ToString(), out a) == true) { route.Add(Convert.ToDouble(dv2[0]["mtask"]));//路径设备任务数 } else { route.Add(0);//路径设备任务数 } } else { route.Add(0);//路径设备任务数 } //求最短路径((路径步长*0.3+路径使用频率*0.3+设备占有数*0.3)的最小值) if (minroute.Count == 0) { minroute.Add(route[0]); minroute.Add(route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } else { if (minroute[1] > (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3)) { minroute[0] = route[0]; minroute[1] = (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } } } if (minroute.Count > 0) { return Convert.ToInt32(minroute[0]); } else { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); OnRefreshMonitor(rme); return -1; } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.MinRouteID时发生错误:" +ex.StackTrace+ ex.Message; return -1; } finally { dv.Dispose(); dv1.Dispose(); dv2.Dispose(); dvd.Dispose(); minroute = null; } } /// /// 20091005 /// 根据调度任务的起点和终点设备索引查找路径最短的RouteIDSub /// /// 起点设备索引 /// 终点设备索引 /// /// 当前设备索引 /// public static int MinRouteID(int startdevice, int enddevice,int nowdevice) { DataView dv = new DataView(); DataView dvd = new DataView(); DataView dv1 = new DataView(); DataView dv2 = new DataView(); List minroute = new List();//0,routIDSub;1,路径最小值 try { int retrouteidsub = GetSameStartDeviceEnddeviceRouteID(startdevice, enddevice); if (retrouteidsub > 0) { return retrouteidsub; } //选择最短调度路径并且判断此路径上是否有设备发生故障 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT distinct(T_Base_Route_Device.F_RouteIDSub) FROM T_Base_Device,T_Base_Route_Device,").Append( "T_Base_Route where T_Base_Route_Device.F_RouteID = T_Base_Route.F_RouteID and ").Append( " T_Base_Route_Device.F_DeviceIndex = T_Base_Device.F_DeviceIndex and ").Append( " F_StartDevice=").Append(startdevice).Append(" and F_EndDevice=").Append(enddevice).Append(" and F_Status=1 and T_Base_Device.F_DeviceIndex =").Append(nowdevice); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count == 0) { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); OnRefreshMonitor(rme); return -1; } for (int i = 0; i < dv.Count; i++) { //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_RouteIDSub, F_LockedState,T_Base_Device.F_DeviceIndex FROM T_Base_Device,T_Base_Route_Device WHERE ").Append( " T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and (T_Base_Route_Device.F_RouteIDSub = ").Append( dv[i]["F_RouteIDSub"]).Append(") AND (T_Base_Device.F_LockedState = - 1 or T_Base_Device.F_ErrorCode>=30)");//20121203 dvd = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvd.Count > 0) { int dvin = Convert.ToInt32(dvd[0]["F_DeviceIndex"]); if ((dvin >= 35001 && dvin <= 35003) || (dvin == 45001)) {//20120207机器人地位无法取代,不判断是否被禁用 } else { continue; } } List route = new List();//0,routIDSub;1,步长;2,路径使用频率;3,路径设备任务数 //路径步长(设备总数)最短(权重0.3),路径使用频率最小(权重0.3)的路径,路径设备任务数(权重0.3) route.Add(Convert.ToDouble(dv[i]["F_RouteIDSub"]));//RouteIDSub //20101124 sql.Remove(0, sql.Length); sql.Append("select count(F_DeviceIndex) as steps from T_Base_Route_Device where F_RouteIDSub=" ).Append(dv[i]["F_RouteIDSub"]); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { route.Add(Convert.ToDouble(dv1[0]["steps"]));//步长 //route.Add(0); } else { continue; } //路径使用频率:路径执行调度任务的数量 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(DISTINCT F_ManageTaskIndex) AS ManCount FROM T_Monitor_Task GROUP BY F_RouteID HAVING (F_RouteID = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { double a = 0; if (double.TryParse(dv2[0]["ManCount"].ToString(), out a) == true) { route.Add(Convert.ToDouble(dv2[0]["ManCount"]));//路径使用频率 } else { route.Add(0);//路径使用频率 } } else { route.Add(0);//路径使用频率 } //路径设备任务数 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(T_Monitor_Task.F_MonitorIndex) AS mtask FROM T_Monitor_Task ,T_Base_Route_Device where (T_Monitor_Task.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex) and (T_Base_Route_Device.F_RouteIDSub = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { double a = 0; if (double.TryParse(dv2[0]["mtask"].ToString(), out a) == true) { route.Add(Convert.ToDouble(dv2[0]["mtask"]));//路径设备任务数 } else { route.Add(0);//路径设备任务数 } } else { route.Add(0);//路径设备任务数 } //求最短路径((路径步长*0.3+路径使用频率*0.3+设备占有数*0.3)的最小值) if (minroute.Count == 0) { minroute.Add(route[0]); minroute.Add(route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } else { if (minroute[1] > (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3)) { minroute[0] = route[0]; minroute[1] = (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } } } if (minroute.Count > 0) { return Convert.ToInt32(minroute[0]); } else { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); OnRefreshMonitor(rme); return -1; } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.MinRouteID时发生错误:" +ex.StackTrace+ ex.Message; return -1; } finally { dv.Dispose(); dv1.Dispose(); dv2.Dispose(); dvd.Dispose(); } } /// /// 根据调度任务的起点和终点设备索引查找路径最短的RouteIDSub /// /// 起点设备索引 /// 终点设备索引 /// 不考虑路径状态:true和false都可以 /// public static int MinRouteID(int startdevice, int enddevice, bool AllStatus, object useAwayfork) { //20101124 DataView dv = new DataView(); DataView dv1 = new DataView(); DataView dv2 = new DataView(); StringBuilder dff =new StringBuilder(); if (useAwayfork.ToString() == "-") { dff .Append( "F_UseAwayFork<>'n'"); } else { dff .Append( "(F_UseAwayFork='" ).Append( useAwayfork ).Append( "' or F_UseAwayFork='-' )");//20101028 } //20101124 try { //选择最短调度路径并且判断此路径上是否有设备发生故障 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT distinct(T_Base_Route_Device.F_RouteIDSub) FROM T_Base_Device,T_Base_Route_Device,").Append( "T_Base_Route where T_Base_Route_Device.F_RouteID = T_Base_Route.F_RouteID and ").Append( " T_Base_Route_Device.F_DeviceIndex = T_Base_Device.F_DeviceIndex and ").Append( " F_StartDevice=").Append(startdevice).Append(" and F_EndDevice=").Append(enddevice).Append(" and ").Append(dff.ToString()); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; List minroute = new List();//0,routIDSub;1,路径最小值 if (dv.Count == 0) { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); OnRefreshMonitor(rme); return -1; } for (int i = 0; i < dv.Count; i++) { List route = new List();//0,routIDSub;1,步长;2,路径使用频率;3,路径设备任务数 //路径步长(设备总数)最短(权重0.3),路径使用频率最小(权重0.3)的路径,路径设备任务数(权重0.3) route.Add(Convert.ToDouble(dv[i]["F_RouteIDSub"]));//RouteIDSub //20101124 sql.Remove(0, sql.Length); sql.Append("select count(F_DeviceIndex) as steps from T_Base_Route_Device where F_RouteIDSub=" ).Append(dv[i]["F_RouteIDSub"]); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { route.Add(Convert.ToDouble(dv1[0]["steps"]));//步长 //route.Add(0); } else { continue; } //路径使用频率:路径执行调度任务的数量 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(DISTINCT F_ManageTaskIndex) AS ManCount FROM T_Monitor_Task GROUP BY F_RouteID HAVING (F_RouteID = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { double a = 0; if (double.TryParse(dv2[0]["ManCount"].ToString(), out a) == true) { route.Add(Convert.ToDouble(dv2[0]["ManCount"]));//路径使用频率 } else { route.Add(0);//路径使用频率 } } else { route.Add(0);//路径使用频率 } //路径设备任务数 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(T_Monitor_Task.F_MonitorIndex) AS mtask FROM T_Monitor_Task ,T_Base_Route_Device where (T_Monitor_Task.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex) and (T_Base_Route_Device.F_RouteIDSub = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { double a = 0; if (double.TryParse(dv2[0]["mtask"].ToString(), out a) == true) { route.Add(Convert.ToDouble(dv2[0]["mtask"]));//路径设备任务数 } else { route.Add(0);//路径设备任务数 } } else { route.Add(0);//路径设备任务数 } //求最短路径((路径步长*0.3+路径使用频率*0.3+设备占有数*0.3)的最小值) if (minroute.Count == 0) { minroute.Add(route[0]); minroute.Add(route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } else { if (minroute[1] > (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3)) { minroute[0] = route[0]; minroute[1] = (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } } } if (minroute.Count > 0) { return Convert.ToInt32(minroute[0]); } else { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); OnRefreshMonitor(rme); return -1; } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.MinRouteID时发生错误:" +ex.StackTrace+ ex.Message; return -1; } finally { dv.Dispose(); dv1.Dispose(); dv2.Dispose(); } } /// /// 20100702 /// 根据调度任务的起点和终点设备索引查找路径最短的RouteIDSub /// /// 起点设备索引 /// 终点设备索引 /// 是否使用远货叉 /// public static int MinRouteID(int startdevice, int enddevice, object useAwayfork) { //20101124 DataView dv = new DataView(); DataView dvd = new DataView(); DataView dv1 = new DataView(); DataView dv2 = new DataView(); StringBuilder dff = new StringBuilder(); if (useAwayfork.ToString() == "-") { dff.Append( "F_UseAwayFork<>'n'"); } else { dff .Append( "(F_UseAwayFork='" ).Append( useAwayfork).Append( "' or F_UseAwayFork='-' )");//20101028 } #region 工位堆垛机的路径优选20120207 //过桥输送机的选择是临近取货位优先 //35000双顶升机的选择是小列(1排6列;2排26列)选择顶升机32038 //if (startdevice == 35000 && (enddevice == 32025 || enddevice == 10100 || enddevice == 10200 || enddevice == 10300)) //{ // dff.Append(" and T_Base_Route_Device.F_DeviceIndex=32038"); //} //else //{ //} #endregion //20101124 try { int retrouteidsub = GetSameStartDeviceEnddeviceRouteID(startdevice, enddevice); if (retrouteidsub > 0) { return retrouteidsub; } //选择最短调度路径并且判断此路径上是否有设备发生故障 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT distinct(T_Base_Route_Device.F_RouteIDSub) FROM T_Base_Device,T_Base_Route_Device,").Append( "T_Base_Route where T_Base_Route_Device.F_RouteID = T_Base_Route.F_RouteID and ").Append( " T_Base_Route_Device.F_DeviceIndex = T_Base_Device.F_DeviceIndex and ").Append( " F_StartDevice=").Append(startdevice).Append(" and F_EndDevice=").Append(enddevice).Append(" and ").Append(dff.ToString()).Append(" and F_Status=1 "); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; List minroute = new List();//0,routIDSub;1,路径最小值 if (dv.Count == 0) { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); OnRefreshMonitor(rme); return -1; } for (int i = 0; i < dv.Count; i++) { //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_RouteIDSub,F_LockedState,T_Base_Device.F_DeviceIndex FROM T_Base_Device,T_Base_Route_Device WHERE ").Append( " T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and (T_Base_Route_Device.F_RouteIDSub = ").Append( dv[i]["F_RouteIDSub"]).Append(") AND (T_Base_Device.F_LockedState = - 1 or T_Base_Device.F_ErrorCode>=30) and F_DeviceOrder !=-1");//20180131 dvd = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvd.Count > 0) { int dvin = Convert.ToInt32(dvd[0]["F_DeviceIndex"]); //判读是否是checkforbiden设备,查看lanegate表 bool ifisforbiddendevice = GetChangeCheckForbiddenFromLaneGate(dvin); //if ((dvin >= 35001 && dvin <= 35003) || (dvin == 45001)) if (ifisforbiddendevice) {//20120207机器人地位无法取代,不判断是否被禁用 } else { continue; } } List route = new List();//0,routIDSub;1,步长;2,路径使用频率;3,路径设备任务数 //路径步长(设备总数)最短(权重0.3),路径使用频率最小(权重0.3)的路径,路径设备任务数(权重0.3) route.Add(Convert.ToDouble(dv[i]["F_RouteIDSub"]));//RouteIDSub //20101124 sql.Remove(0, sql.Length); sql.Append("select count(F_DeviceIndex) as steps from T_Base_Route_Device where F_RouteIDSub=" ).Append(dv[i]["F_RouteIDSub"]); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { route.Add(Convert.ToDouble(dv1[0]["steps"]));//步长 //route.Add(0); } else { continue; } //路径使用频率:路径执行调度任务的数量 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(DISTINCT F_ManageTaskIndex) AS ManCount FROM T_Monitor_Task GROUP BY F_RouteID HAVING (F_RouteID = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { double a = 0; if (double.TryParse(dv2[0]["ManCount"].ToString(), out a) == true) { route.Add(a);//路径使用频率 } else { route.Add(0);//路径使用频率 } } else { route.Add(0);//路径使用频率 } //路径设备任务数 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT COUNT(T_Monitor_Task.F_MonitorIndex) AS mtask FROM T_Monitor_Task ,T_Base_Route_Device where (T_Monitor_Task.F_deviceindex = T_Base_Route_Device.F_deviceindex) and (T_Monitor_Task.F_RouteID = T_Base_Route_Device.F_RouteIDSub) and (T_Base_Route_Device.F_RouteIDSub = ").Append(dv[i]["F_RouteIDSub"]).Append(")"); dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv2.Count > 0) { double a = 0; if (double.TryParse(dv2[0]["mtask"].ToString(), out a) == true) { route.Add(a);//路径设备任务数 } else { route.Add(0);//路径设备任务数 } } else { route.Add(0);//路径设备任务数 } //求最短路径((路径步长*0.3+路径使用频率*0.3+设备占有数*0.3)的最小值) if (minroute.Count == 0) { minroute.Add(route[0]); minroute.Add(route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } else { if (minroute[1] > (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3)) { minroute[0] = route[0]; minroute[1] = (route[1] * 0.3 + route[2] * 0.3 + route[3] * 0.3); } } } if (minroute.Count > 0) { return Convert.ToInt32(minroute[0]); } else { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "起点设备:" + startdevice + "和终点设备:" + enddevice + "之间路径不可用!"); OnRefreshMonitor(rme); return -1; } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.MinRouteID时发生错误:" +ex.StackTrace+ ex.Message; return -1; } finally { dv.Dispose(); dv1.Dispose(); dv2.Dispose(); dvd.Dispose(); } } /// /// 任务拆分 /// /// 调度任务类型索引 /// io_control索引 /// 调度路径的子路径编号 /// 调度任务行视图 /// public static int CreateMonitor(int Mankind,int ManFID, int routeIDSub,DataRowView drv,int status) { //关联设备属于需要同步执行的设备组 //穿梭车、堆垛机、AGV都属于关键设备需要单独调度, //所以此类设备是路径分段命令的分割点, //举例:【成品入库路径】 //1)输送机输送分段控制 //2)输送机出库(取关联); //3)RGV将取+RGV取货(取关联)+RGV将送+RGV送货(送关联); //4)输送机入库(送关联) //5)输送机输送分段控制 //6)堆垛机取送货(将取+取货或者将送+送货); //7)条码扫描仪 //12)虚拟关键设备 DataView dvRoute = new DataView(); DataView dvs = new DataView(); try { //drv = dbo.ExceSQL(string.Format("SELECT * FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex = {1})", ManFID, Mankind)).Tables[0].DefaultView[0];//20130620 #region 更新 T_Base_Monitor_Task_Index 中的设备命令指令索引 //20110104 if (ccf.GetMonitorIndex() >= 29000) { ccf.UpdateMonitorIndex(1); } #endregion //双伸货位,拆分不限制,在发送指令的提前检测中限制 zcy //查找该路径上所有设备的信息 sql.Remove(0, sql.Length); sql.Append("SELECT F_RouteIDSub,T_Base_Route_Device.F_DeviceIndex,F_DeviceOrder, T_Base_Route_Device.F_SerialNumber, ").Append( "T_Base_Device.F_DeviceKindIndex,F_UnControl FROM " ).Append( "T_Base_Device,T_Base_Route_Device where " ).Append( "T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and F_RouteIDSub=" ).Append( routeIDSub + " order by F_SerialNumber asc "); dvRoute = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvRoute.Count == 0) return 0; if (dvRoute[0]["F_RouteIDSub"].ToString()=="79"|| dvRoute[0]["F_RouteIDSub"].ToString()=="80") { sql.Remove(0, sql.Length); sql.Append("select * from T_Monitor_Task where F_NumParam1 ='32028' and (F_NumParam4='32025' or F_NumParam4='32033') "); var ss = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (ss.Count>0) { return 0; } } dbo.TransBegin(IsolationLevel.ReadCommitted); //事务开始 int CurSerialNumber = 0; List PriorDevice0 = new List(), PriorKeyDevice0 = new List(); StringBuilder AheadDetect =new StringBuilder();//20101124 StringBuilder RunningLock = new StringBuilder();//20101124 StringBuilder AheadTrigger = new StringBuilder();//20101124 string uncontrol = string.Empty; for (int i = 0; i < dvRoute.Count; i++) { AheadDetect.Remove(0,AheadDetect.Length); RunningLock.Remove(0,RunningLock.Length); AheadTrigger.Remove(0,AheadTrigger.Length); uncontrol= (dvRoute[i]["F_UnControl"] + "").ToString(); //0设备所引;1设备类型;2:路径序号;3:设备命令 List PriorDevice = new List(), NextDevice = new List(), CurDevice = new List(), NextKeyDevice = new List(); //防止输送机设备组重复查找关键设备 if (Convert.ToInt32(dvRoute[i]["F_SerialNumber"]) <= CurSerialNumber) continue; CurDevice.Add(Convert.ToInt32(dvRoute[i]["F_DeviceIndex"])); CurDevice.Add(Convert.ToInt32(dvRoute[i]["F_DeviceKindIndex"])); CurDevice.Add(Convert.ToInt32(dvRoute[i]["F_SerialNumber"])); CurDevice.Add(Convert.ToInt32(dvRoute[i]["F_DeviceOrder"])); NextKeyDevice = GetNextKeyDevice(routeIDSub, Convert.ToInt32(dvRoute[i]["F_SerialNumber"])); if (NextKeyDevice.Count > 0)//找到关键设备:0设备所引;1设备类型;2:路径序号;3:设备命令 { CurSerialNumber = NextKeyDevice[2]; NextDevice = GetNextDevice(routeIDSub, NextKeyDevice[2]); PriorDevice = GetPriorDevice(routeIDSub, NextKeyDevice[2]); int TriggerTaskNo = 0; int[] Coor = new int[6] { 0, 0, 0, 0, 0, 0 }; //20101118 string tw = string.Empty; int mainTask = 0; int Rgvorder = 0; int lifterUP = 0, snextq = 0, snexts = 0; int snextqtemp = 0, snextstemp = 0; switch (NextKeyDevice[1]) { case 1: #region 堆垛机 if (NextKeyDevice[3] == -1) continue; AheadDetect.Remove(0, AheadDetect.Length);//20101124 #region 堆垛机取货坐标: if (PriorDevice.Count > 0) { //如果PriorDevice是输送机则生成输送机命令【CurDevice-->PriorDevice目标设备,出库:2】, //收到输送机PriorDevice的PLC上报的运行状态则提前触发堆垛机将取命令,然后是取送货命令,获取堆垛机取坐标 #region 前一设备是输送机(入库输送线) if (uncontrol != "1") { if (PriorDevice[1] == 2) { int arrowdev; int nextdev; int command; List newcur = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newcur != null) { CurDevice = newcur; } if (CurDevice[0] == PriorDevice[0]) {//输送机的起点设备和终点设备相同时,目标设备索引置为零,下一个设备为零,命令为路径表中的命令 arrowdev = 0; nextdev = 0; command = CurDevice[3]; } else {//获取下一节输送线,路径中找不到下一节输送线,用终点代替,命令为6 arrowdev = PriorDevice[0]; CurDevice[3] = 6; command = 6; List nextConveyor = GetCurConveyorNextDevice(routeIDSub, CurDevice[2]); if (nextConveyor.Count > 0) { nextdev = nextConveyor[0]; } else { nextdev = arrowdev; } } AheadDetect.Append(GetAheadDetect(CurDevice[0], command, nextdev, arrowdev)); AheadTrigger.Remove(0, AheadTrigger.Length); AheadTrigger.Append(PriorDevice[0].ToString()); //+ "-" + (被触发的调度任务号);//此设备的运行状态(货物当前位置=PriorDevice[0])触发堆垛机的将取 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, CurDevice[0], command, 0, Coor) == false) { #region 运行时锁定设备组 //RunningLock.Append(PriorDevice[0].ToString()); #endregion #region 生成输送机命令 int mindex = ccf.GetMonitorIndex(); TriggerTaskNo = mindex; Model.Monitor_Task ob = new Model.Monitor_Task { _manfid = ManFID, _mankind = Mankind, _mindex = mindex, _level = drv["FTASKLEVEL"].ToString(), _device = CurDevice[0].ToString(), _command = CurDevice[3].ToString(), _routeid = routeIDSub.ToString(), _status = status.ToString(), _param1 = CurDevice[0].ToString(), _param4 = arrowdev.ToString(), _aheaddetect = AheadDetect.ToString(), _txtparam = drv["FPALLETBARCODE"].ToString(), _useAwayFork = drv["FUseAwayFork"].ToString() }; ccf.InsertWCS_T_Monitor_Task(ob); #endregion } } } #endregion #region 前一设备是条码扫描器等,不载物的关键设备 if ((PriorDevice[1] == 7) || (PriorDevice[1] == 12)) { int arrowdev; int nextdev; int command; List newcur = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newcur != null) { CurDevice = newcur; PriorDevice = PriorDevice0; //输送机的起点设备和终点设备相同时,目标设备索引置为零 devinfo = Model.CGetInfo.GetDeviceInfo(CurDevice[0]); if (devinfo.UnControl != "1") { arrowdev = 0; nextdev = 0; command = CurDevice[3]; AheadDetect.Append(GetAheadDetect(CurDevice[0], command, nextdev, arrowdev)); AheadTrigger.Remove(0, AheadTrigger.Length);//20101124 AheadTrigger.Append(PriorDevice[0].ToString()); //+ "-" + (被触发的调度任务号);//此设备的运行状态(货物当前位置=PriorDevice[0])触发堆垛机的将取 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, CurDevice[0], CurDevice[3], 0, Coor) == false) { #region 运行时锁定设备组 #endregion #region 生成输送机命令 int mindex = ccf.GetMonitorIndex(); TriggerTaskNo = mindex; Model.Monitor_Task ob = new Model.Monitor_Task { _manfid = ManFID, _mankind = Mankind, _mindex = mindex, _level = drv["FTASKLEVEL"].ToString(), _device = CurDevice[0].ToString(), _command = CurDevice[3].ToString(), _routeid = routeIDSub.ToString(), _status = status.ToString(), _param1 = CurDevice[0].ToString(), _param4 = arrowdev.ToString(), _aheaddetect = AheadDetect.ToString(), _txtparam = drv["FPALLETBARCODE"].ToString(), _useAwayFork = drv["FUseAwayFork"].ToString() }; ccf.InsertWCS_T_Monitor_Task(ob); #endregion } } } } #endregion //如果PriorDevice是固定站台不生成命令,堆垛机生成取送货命令,获取堆垛机取坐标 //如果PriorDevice是巷道,PriorDevice不拆分命令,获取堆垛机取坐标,拆分堆垛机命令取送货 #region 获得取货坐标 int[] Coor0_2 = new int[6] { 0, 0, 0, 0, 0, 0 }; while (true) { if (PriorDevice[1] == 1 || PriorDevice[1] == 44) { PriorDevice = GetPriorDevice(routeIDSub, PriorDevice[2]);//堆垛机的上一个设备 } if (PriorDevice.Count == 0 || (PriorDevice[1] != 1 && PriorDevice[1] != 4)) { break; } } //如果NextDevice是巷道,NextDevice不拆分命令,获取堆垛机送坐标,拆分堆垛机命令取送货 if ((PriorDevice[1] == 7) || (PriorDevice[1] == 12)) { PriorDevice = PriorDevice0; } if (PriorDevice[1] == 10) { int lanegate = 0; if (int.TryParse(Convert.ToString(drv["FSTARTCELL"]), out lanegate))//是lanegate { Coor0_2 = GetStackCoordinateFromLaneGate(NextKeyDevice[0], lanegate, true); } else { Coor0_2 = GetStackCoordinateFromManage(Mankind, ManFID, true); } } else if (PriorDevice[1] == 2 || PriorDevice[1] == 9) { //如果NextDevice是输送机则取送货命令,获取堆垛机送坐标 //如果NextDevice是固定站台则取送货命令,获取堆垛机送坐标 Coor0_2 = GetStackCoordinateFromLaneGate(NextKeyDevice[0], PriorDevice[0], true); } Coor[0] = Coor0_2[0]; Coor[1] = Coor0_2[1]; Coor[2] = Coor0_2[2]; #endregion } #region 堆垛机送货坐标 if (NextDevice.Count > 0) { int[] Coor3_5 = new int[6] { 0, 0, 0, 0, 0, 0 }; while (true) { if (NextDevice[1] == 1 || NextDevice[1] == 44) { NextDevice = GetNextDevice(routeIDSub, NextDevice[2]);//堆垛机的上一个设备 } if (NextDevice.Count == 0 || (NextDevice[1] != 1 && NextDevice[1] != 4)) { break; } } //如果NextDevice是巷道,NextDevice不拆分命令,获取堆垛机送坐标,拆分堆垛机命令取送货 if (NextDevice[1] == 10) { int lanegate = 0; if (Convert.ToInt32(drv["FENDUCODE"]) > 0) { } else if (int.TryParse(Convert.ToString(drv["FENDCELL"]), out lanegate))//是lanegate { Coor3_5 = GetStackCoordinateFromLaneGate(NextKeyDevice[0], lanegate, false); } else { Coor3_5 = GetStackCoordinateFromManage(Mankind, ManFID, false); } } else if (NextDevice[1] == 2 || NextDevice[1] == 9) { //如果NextDevice是输送机则取送货命令,获取堆垛机送坐标 //如果NextDevice是固定站台则取送货命令,获取堆垛机送坐标 Coor3_5 = GetStackCoordinateFromLaneGate(NextKeyDevice[0],NextDevice[0], false); } Coor[3] = Coor3_5[3]; Coor[4] = Coor3_5[4]; Coor[5] = Coor3_5[5]; } #endregion #region 生成堆垛机指令:取货+送货 #region 取货 RunningLock.Remove(0, RunningLock.Length); AheadDetect.Remove(0, AheadDetect.Length); AheadDetect.Append(CreateStackAheadDetect(NextKeyDevice, PriorDevice, NextDevice, routeIDSub, 4, out RunningLock)); int keydevice = NextKeyDevice[0]; if(CStaticClass.WorkStack!="0")//制定堆垛机 20180124 { keydevice =Convert.ToInt32( CStaticClass.WorkStack); } //生成取货指令 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, keydevice, 4, 0, Coor) == false) { lifterUP = ccf.GetMonitorIndex();//升降机顶升 snextq = ccf.GetMonitorIndex( );//用于后续追加的任务 snextqtemp = ccf.GetMonitorIndex();//用于后续二次追加的任务 snexts = ccf.GetMonitorIndex( ); snextstemp = ccf.GetMonitorIndex( );//用于后续二次追加的任务 int mindex = ccf.GetMonitorIndex( ); sql.Remove(0,sql.Length);//20101124 sql.Append( "INSERT INTO T_Monitor_Task " ).Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel," ).Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam2," ).Append( " F_NumParam3, F_NumParam4,F_NumParam5, F_NumParam6,F_AheadDetect,F_RunningLock,F_TxtParam,F_UseAwayFork,F_PriorMonitor,F_AgvTask,F_AGVNextTask)").Append( "VALUES (" ).Append( ManFID ).Append( "," ).Append( Mankind ).Append( "," ).Append( mindex ).Append( "," ).Append( drv["FTASKLEVEL"] ).Append(",").Append(keydevice).Append(",4,").Append(routeIDSub).Append(",").Append(status).Append(",").Append(Coor[0]).Append(",").Append(Coor[1] ).Append( "," ).Append( Coor[2] ).Append( "," ).Append( Coor[3] ).Append( "," ).Append( Coor[4] ).Append( "," ).Append( Coor[5] ) .Append( ",'" ).Append( AheadDetect.ToString()).Append( "','" ).Append( RunningLock.ToString() ).Append( "','" ).Append( drv["FPALLETBARCODE"] ) .Append("','").Append(drv["FUseAwayFork"]).Append("',").Append(lifterUP).Append(",").Append(snextq).Append(",").Append(snexts).Append(")"); dbo.ExceSQL(sql.ToString()); } #endregion #region 送货 RunningLock.Remove(0, RunningLock.Length); AheadDetect.Remove(0, AheadDetect.Length); AheadDetect.Append(CreateStackAheadDetect(NextKeyDevice, PriorDevice, NextDevice, routeIDSub, 5, out RunningLock)); //生成送货指令 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, keydevice, 5, 0, Coor) == false) { int mindex = ccf.GetMonitorIndex(); //mindex = ccf.GetMonitorIndex(ManFID, Mankind);//20110510 sql.Remove(0, sql.Length);//20101124 sql.Append( "INSERT INTO T_Monitor_Task " ).Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel," ).Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam2,").Append( " F_NumParam3, F_NumParam4,F_NumParam5, F_NumParam6,F_AheadDetect,F_RunningLock,F_TxtParam,F_UseAwayFork,F_PriorMonitor,F_AGVTask,F_AGVNextTask)").Append( "VALUES (" ).Append( ManFID ).Append( "," ).Append( Mankind ).Append( "," ).Append( mindex ).Append( "," ).Append( drv["FTASKLEVEL"] ).Append(",").Append(keydevice).Append(",5,").Append(routeIDSub).Append(",").Append(status).Append(",").Append(Coor[0]).Append(",").Append(Coor[1] ).Append( "," ).Append( Coor[2] ).Append( "," ).Append( Coor[3] ).Append( "," ).Append( Coor[4] ).Append( "," ) .Append( Coor[5] ).Append( ",'" ).Append( AheadDetect.ToString() ).Append( "','" ).Append( RunningLock.ToString() ).Append( "','" ) .Append(drv["FPALLETBARCODE"]).Append("','").Append(drv["FUseAwayFork"]).Append("',").Append(lifterUP).Append(",").Append(snextq).Append(",").Append(snexts).Append(")"); dbo.ExceSQL(sql.ToString()); //20101124 } #endregion #endregion //修改T_Manage_Task的FLANEWAY,FSTACK sql.Remove(0, sql.Length);//20101124 sql.Append("SELECT F_LaneDeviceIndex,F_StackIndex FROM T_Base_LaneInfo where F_StackIndex=" ).Append( NextKeyDevice[0]); dvs = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //20101124 int laneway = 0; if (dvs.Count > 0) { laneway = Convert.ToInt32(dvs[0]["F_LaneDeviceIndex"]); }//20101124 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FLANEWAY=" ).Append( laneway ).Append( ",FSTACK=" ).Append( NextKeyDevice[0] ).Append( " where (FLANEWAY=-1) and (FSTACK=-1) and (F_ManageTaskKindIndex=" ).Append( Mankind ).Append( ") and FID=" ).Append( ManFID); dbo.ExceSQL(sql.ToString()); //20101124 break; #endregion #endregion case 2://输送机(关键点:例如十字路口(有前一个和后一个设备)或者路径终点(没有后一个设备)) #region 输送机 if (NextDevice.Count == 0)//终点输送机 { #region 终点输送机 if (uncontrol != "1") {//20091107 List newcur = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newcur != null) { CurDevice = newcur; } int arrowdev; if (CurDevice[0] == NextKeyDevice[0]) {//输送机的起点设备和终点设备相同时,目标设备索引置为零 arrowdev = 0; #region 运行提前检测光电组 if ((CurDevice[3] == 1) || ((CurDevice[3] == 2))) { //CurDevice的F_BindingDevice里存的光电开关的设备所引。CurDevice有探物 AheadDetect.Remove(0, AheadDetect.Length);//20101124 tw = GetBindingDeviceIndex(CurDevice[0]); if (tw != "") { AheadDetect.Append("D-").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101124 } else { AheadDetect.Remove(0, AheadDetect.Length); } tw = GetBindingDeviceIndexOut(CurDevice[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101124 } } //else if (CurDevice[3] == 2) //{ // tw = GetBindingDeviceIndexOut(CurDevice[0]); // if (tw != "") // { // AheadDetect = "D-" + tw.ToString() + ";" + GetBeDetectedDevices(CurDevice[0]);//20101118 // } // else // { // AheadDetect.Remove(0, AheadDetect.Length); // } //} ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); #endregion } else { arrowdev = NextKeyDevice[0]; CurDevice[3] = 6; #region 运行提前检测光电组 //CurDevice的F_SendOutDetect里存的光电开关的设备所引。CurDevice有探物 AheadDetect.Remove(0, AheadDetect.Length);//20101124 string[] cdi = ccf.GetOwnCorrel_DeviceInfo(CurDevice[0]); if (null != cdi) {//20100406检测被堆垛机送货的顶升机构在顶升高位,空闲 if (cdi[1] != "") { AheadDetect.Append(";D-").Append(cdi[1]); } if (cdi[5] != "") { AheadDetect.Append(";D").Append(cdi[5]); } if (cdi[6] != "") { AheadDetect.Append(";D").Append(cdi[6]); } if (cdi[3] != "") { AheadDetect.Append(";D-").Append(cdi[3]);//检测是否有货 } AheadDetect.Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101118 } //20101011 else { tw = GetSendOutDetect(CurDevice[0]); if (tw != "") { AheadDetect.Append("D-").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101124 } else { AheadDetect.Remove(0, AheadDetect.Length); } //20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); //20161221 List nextConveyor = GetCurConveyorNextDevice(routeIDSub, CurDevice[2]); if (nextConveyor.Count > 0)//20110331 { AheadDetect.Append(";").Append(GetBeDetectedDevices(nextConveyor[0])); tw = GetBindingDeviceIndex(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101124 } tw = GetBindingDeviceIndexOut(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101124 } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + nextConveyor[0].ToString(); } } #endregion } if (DeviceAndOrderExitInMonitor(Mankind, ManFID, CurDevice[0], CurDevice[3], 0, Coor) == false) { #region 运行时锁定设备组 #endregion #region 生成输送机命令 int mindex = ccf.GetMonitorIndex(); sql.Remove(0, sql.Length); sql.Append("INSERT INTO T_Monitor_Task ").Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4,").Append( " F_AheadDetect,F_TxtParam)").Append( "VALUES (").Append(ManFID).Append(",").Append(Mankind).Append(",").Append(mindex).Append(",").Append(drv["FTASKLEVEL"] ).Append(",").Append(CurDevice[0]).Append(",").Append(CurDevice[3]).Append(",").Append(routeIDSub).Append(",").Append(status).Append(",").Append(CurDevice[0]).Append(",").Append(arrowdev ).Append(",'").Append(AheadDetect.ToString()).Append("','").Append(drv["FPALLETBARCODE"]).Append("')"); dbo.ExceSQL(sql.ToString()); #endregion } } #endregion 终点输送机 } else//20110104与AGV交互的顶升机或者路径十字路口 { #region 非终点输送机 int arrowdev; #region 前一设备是输送机 if (PriorDevice[1] == 2) { if (uncontrol != "1") {//20091107 List newcur = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newcur != null) { CurDevice = newcur; } if (CurDevice[0] == PriorDevice[0]) {//输送机的起点设备和终点设备相同时,目标设备索引置为零 arrowdev = 0; #region 运行提前检测光电组 //CurDevice的F_BindingDevice里存的光电开关的设备所引。CurDevice有探物 AheadDetect.Remove(0, AheadDetect.Length);//20101124 tw = GetBindingDeviceIndex(CurDevice[0]); if (tw != "") { AheadDetect.Append("D-").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101124 } else { AheadDetect.Remove(0, AheadDetect.Length); } tw = GetBindingDeviceIndexOut(CurDevice[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101124 } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); #endregion } else { arrowdev = PriorDevice[0]; CurDevice[3] = 6; #region 运行提前检测光电组 //CurDevice的F_SendOutDetect里存的光电开关的设备所引。CurDevice有探物 AheadDetect.Remove(0, AheadDetect.Length);//20101124 tw = GetSendOutDetect(CurDevice[0]); if (tw != "") { AheadDetect.Append("D-").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101124 } else { AheadDetect.Remove(0, AheadDetect.Length); } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); List nextConveyor = GetCurConveyorNextDevice(routeIDSub, CurDevice[2]); if (nextConveyor.Count > 0)//20110331 { AheadDetect.Append(";").Append(GetBeDetectedDevices(nextConveyor[0]));//20110331 tw = GetBindingDeviceIndex(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101124 } tw = GetBindingDeviceIndexOut(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101124 } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + nextConveyor[0].ToString(); } #endregion } AheadTrigger.Remove(0, AheadTrigger.Length); AheadTrigger.Append(PriorDevice[0].ToString()); //+ "-" + (被触发的调度任务号);//此设备的运行状态(货物当前位置=PriorDevice[0])触发堆垛机的将取 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, CurDevice[0], CurDevice[3], 0, Coor) == false) { #region 运行时锁定设备组 RunningLock.Clear();//20120420 #endregion #region 生成输送机命令 int mindex = ccf.GetMonitorIndex(); TriggerTaskNo = mindex; sql.Remove(0, sql.Length);//20101124 sql.Append("INSERT INTO T_Monitor_Task ").Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4,").Append( " F_AheadDetect,F_TxtParam,F_RunningLock)").Append( "VALUES (").Append(ManFID).Append(",").Append(Mankind).Append(",").Append(mindex).Append(",").Append(drv["FTASKLEVEL"] ).Append(",").Append(CurDevice[0]).Append(",").Append(CurDevice[3]).Append(",").Append(routeIDSub).Append(",").Append(status).Append(",").Append(CurDevice[0]).Append(",").Append(arrowdev ).Append(",'").Append(AheadDetect.ToString()).Append("','").Append(drv["FPALLETBARCODE"]).Append("','").Append(RunningLock).Append("')"); dbo.ExceSQL(sql.ToString()); #endregion } } } #endregion #region 顶升机前一输送机PriorDevice[0]空闲,有物:允许顶升机下降 //arrowdev = 0; //#region 运行提前检测光电组 ////CurDevice的F_BindingDevice里存的光电开关的设备所引。CurDevice有探物 //AheadDetect.Remove(0, AheadDetect.Length);//20101124 //tw = GetBindingDeviceIndexOut(PriorDevice[0]); //if (tw != "") //{ // AheadDetect.Append(";D-").Append(tw.ToString());//20101124 //} //AheadDetect.Append(";I").Append( PriorDevice[0].ToString()); //#endregion //AheadTrigger.Remove(0, AheadTrigger.Length); //if (DeviceAndOrderExitInMonitor(Mankind, ManFID, NextKeyDevice[0], NextKeyDevice[3], 0) == false) //{ // #region 运行时锁定设备组 // #endregion // #region 生成输送机命令 // int mindex = ccf.GetMonitorIndex(ManFID, Mankind); // TriggerTaskNo = mindex; // sql.Remove(0, sql.Length);//20101124 // sql.Append("INSERT INTO T_Monitor_Task ").Append( // "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append( // " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4,").Append( // " F_AheadDetect,F_TxtParam)").Append( // "VALUES (").Append(ManFID).Append(",").Append(Mankind).Append(",").Append(mindex).Append(",").Append(drv["FTASKLEVEL"] // ).Append(",").Append(NextKeyDevice[0]).Append(",").Append(NextKeyDevice[3]).Append(",").Append(routeIDSub).Append(",").Append(status).Append(",").Append(NextKeyDevice[0]).Append(",").Append(arrowdev // ).Append(",'").Append(AheadDetect.ToString()).Append("','").Append(drv["FPALLETBARCODE"]).Append("')"); // dbo.ExceSQL(sql.ToString()); // #endregion //} #endregion #endregion 非终点输送机 } #endregion 输送机 break; case 4: #region RGV string useAwayFork = "-"; { //RGV取货: if (PriorDevice.Count > 0) { //如果PriorDevice是输送机则生成输送机命令【CurDevice-->PriorDevice目标设备,出库:2】, //收到输送机PriorDevice的PLC上报的运行状态则提前触发RGV运行命令(7),然后是取送货命令,获取堆垛机取坐标 #region 前一设备是输送机 if (PriorDevice[1] == 2) { if ((CurDevice[1] == 2)) {//20091107 int arrowdev; int nextdev; int command; List newcur = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newcur != null) { CurDevice = newcur; } if (CurDevice[0] == PriorDevice[0]) {//输送机的起点设备和终点设备相同时,目标设备索引置为零 arrowdev = 0; nextdev = CurDevice[0]; command = CurDevice[3]; } else { arrowdev = PriorDevice[0]; CurDevice[3] = 6; command = 6; //获取下一节输送线,路径中找不到下一节输送线,用终点代替 List nextConveyor = GetCurConveyorNextDevice(routeIDSub, CurDevice[2]); if (nextConveyor.Count > 0)//20110331 { nextdev = nextConveyor[0]; } else { nextdev = arrowdev; } } AheadDetect.Append(ConveyorAheadDetect(CurDevice[0], nextdev, arrowdev, command)); #region 新提前检测 zcy if (true) { string newAhead = ccf.GetAheadDetect(CurDevice[0], arrowdev); if (newAhead != "") { AheadDetect.Clear(); AheadDetect.Append(newAhead); } } #endregion AheadTrigger.Remove(0, AheadTrigger.Length); AheadTrigger.Append(PriorDevice[0].ToString()); //+ "-" + (被触发的调度任务号);//此设备的运行状态(货物当前位置=PriorDevice[0])触发堆垛机的将取 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, CurDevice[0], CurDevice[3], 0, Coor) == false) { #region 生成输送机命令 int mindex = ccf.GetMonitorIndex(); TriggerTaskNo = mindex; Model.Monitor_Task ob = new Model.Monitor_Task { _manfid = ManFID, _mankind = Mankind, _mindex = mindex, _level = drv["FTASKLEVEL"].ToString(), _device = CurDevice[0].ToString(), _command = CurDevice[3].ToString(), _routeid = routeIDSub.ToString(), _status = status.ToString(), _param1 = CurDevice[0].ToString(), _param4 = arrowdev.ToString(), _aheaddetect = AheadDetect.ToString(), _runningLock = RunningLock.ToString(), _txtparam = drv["FPALLETBARCODE"].ToString() //_useAwayFork = drv["FUseAwayFork"].ToString() }; ccf.InsertWCS_T_Monitor_Task(ob); #endregion } } } else {//20111020 List newPrior = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newPrior != null) { PriorDevice = newPrior; } } #endregion #region 获得RGV运行的接货位的设备索引 Coor[0] = PriorDevice[0]; Coor[1] = 0; Coor[2] = 0; Coor[3] = 0; Coor[4] = 0; Coor[5] = 0; #endregion #region RGV的接货(被关联的任务) Rgvorder = 2; //GetRGVOrder(PriorDevice[0], true); #region 运行提前检测光电组 AheadDetect.Remove(0, AheadDetect.Length); int senddevice = 0; #region 目标输送机运行提前检测光电组 20210715 if (NextDevice.Count > 0) { senddevice = NextDevice[0]; { //AheadDetect.Append(GetBindingDeviceIndex(senddevice, CHECK_NO_GOODS));//目标输送机入口无探物 //AheadDetect.Append(GetBindingDeviceIndexOut(senddevice, CHECK_NO_GOODS));//目标输送机出口无探物 //AheadDetect.Append(GetBeDetectedDevices(senddevice));//目标输送机空闲 //AheadDetect.Append(";L").Append(senddevice);//目标设备未被锁定 } } #endregion #region 取货输送机运行提前检测光电组 20210715 //tw = GetBindingDeviceIndexOut(PriorDevice[0], CHECK_HAVE_GOODS); //if (tw != "") //{//取货输送机出口有探物 // AheadDetect.Append(tw.ToString()); //} //else //{//取货输送机入口有探物 // AheadDetect.Append(GetBindingDeviceIndex(PriorDevice[0], CHECK_HAVE_GOODS)); //} AheadDetect.Append(GetBeDetectedDevices(PriorDevice[0]));//取货输送机空闲 AheadDetect.Append(";R").Append(PriorDevice[0]); //取货输送机条码比对 #endregion //AheadDetect.Append(GetBindingDeviceIndex(NextKeyDevice[0], CHECK_NO_GOODS));//RGV无探物 AheadDetect.Append(GetBeDetectedDevices(NextKeyDevice[0]));//RGV能运行 #endregion #region 新提前检测 zcy if (true) { string newAhead = ccf.GetAheadDetect(NextKeyDevice[0], PriorDevice[0], senddevice); if (newAhead != "") { AheadDetect.Clear(); AheadDetect.Append(newAhead); } } #endregion if (DeviceAndOrderExitInMonitor(Mankind, ManFID, NextKeyDevice[0], Rgvorder, PriorDevice[0], Coor) == false) { #region 运行时锁定设备组 //RunningLock.Clear(); //RunningLock.Append(PriorDevice[0]); //RunningLock.Append(";").Append(senddevice); #endregion int mindex = ccf.GetMonitorIndex(); Model.Monitor_Task ob = new Model.Monitor_Task { _manfid = ManFID, _mankind = Mankind, _mindex = mindex, _level = drv["FTASKLEVEL"].ToString(), _device = NextKeyDevice[0].ToString(), _command = Rgvorder.ToString(), _routeid = routeIDSub.ToString(), _status = status.ToString(), _param1 = PriorDevice[0].ToString(), _param4 = PriorDevice[0].ToString(),//NextKeyDevice[1].ToString()=="4"?"": senddevice.ToString(), _aheaddetect = AheadDetect.ToString(), _runningLock = RunningLock.ToString(), _txtparam = drv["FPALLETBARCODE"].ToString(), _useAwayFork = useAwayFork }; ccf.InsertWCS_T_Monitor_Task(ob); } //20101124 #endregion #region RGV是条码绑定设备需要条码比对 //int barcodedev = GetBarcodeDeviceFromBindDevice(NextKeyDevice[0]); //if (barcodedev > 0) //{ // #region 生成条码比对命令 // if (DeviceAndOrderExitInMonitor(Mankind, ManFID, barcodedev, 1, 0) == false) // { // int mindex = ccf.GetMonitorIndex(ManFID, Mankind); // sql.Remove(0, sql.Length); // sql.Append("INSERT INTO T_Monitor_Task ").Append( // "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append( // " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4,").Append( // " F_AheadDetect,F_TxtParam)").Append( // "VALUES (").Append(ManFID).Append(",").Append(Mankind).Append(",").Append(mindex).Append(",").Append(drv["FTASKLEVEL"] // ).Append(",").Append(barcodedev).Append(",").Append(1).Append(",").Append(ccf.GetRouteIDsub(barcodedev)).Append(",").Append(status).Append(",0,0,'").Append("").Append("','").Append(drv["FPALLETBARCODE"]).Append("')"); // dbo.ExceSQL(sql.ToString()); // } // #endregion //} #endregion } //获得RGV运行的送货位的设备索引: if (NextDevice.Count > 0) { //环穿不受调度控制,没有送货指令 if (Model.CGetInfo.GetDeviceInfo(NextKeyDevice[0]).UnControl == "1") { break; } Coor[0] = NextDevice[0]; Coor[1] = 0; Coor[2] = 0; Coor[3] = 0; Coor[4] = 0; Coor[5] = 0; #region RGV的送货 Rgvorder = 3;// GetRGVOrder(NextDevice[0], false); #region 运行提前检测光电组 AheadDetect.Remove(0, AheadDetect.Length); { //AheadDetect.Append(GetBindingDeviceIndex(NextDevice[0], CHECK_NO_GOODS));//目标输送机入口无探物 //AheadDetect.Append(GetBindingDeviceIndexOut(NextDevice[0], CHECK_NO_GOODS));//目标输送机出口无探物 //AheadDetect.Append(GetBeDetectedDevices(NextDevice[0]));//目标输送机空闲 //AheadDetect.Append(";L").Append(NextDevice[0]); } //AheadDetect.Append(GetBindingDeviceIndex(NextKeyDevice[0], CHECK_HAVE_GOODS));//RGV有探物 AheadDetect.Append(GetBeDetectedDevices(NextKeyDevice[0]));//RGV能运行 #endregion #region 新提前检测 zcy if (true) { string newAhead = ccf.GetAheadDetect(NextKeyDevice[0], PriorDevice[0], NextDevice[0]); if (newAhead != "") { AheadDetect.Clear(); AheadDetect.Append(newAhead); } } #endregion if (DeviceAndOrderExitInMonitor(Mankind, ManFID, NextKeyDevice[0], Rgvorder, PriorDevice[0], Coor) == false) { #region 运行时锁定设备组 RunningLock.Clear(); //RunningLock.Append(NextDevice[0]); #endregion int mindex = ccf.GetMonitorIndex(); string ArrowDevice = NextDevice[0].ToString(); Model.Monitor_Task ob = new Model.Monitor_Task { _manfid = ManFID, _mankind = Mankind, _mindex = mindex, _level = drv["FTASKLEVEL"].ToString(), _device = NextKeyDevice[0].ToString(), _command = Rgvorder.ToString(), _routeid = routeIDSub.ToString(), _status = status.ToString(), _param1 = PriorDevice[0].ToString(), _param4 = ArrowDevice.ToString(), _aheaddetect = AheadDetect.ToString(), _runningLock = RunningLock.ToString(), _txtparam = drv["FPALLETBARCODE"].ToString(), _useAwayFork = useAwayFork }; ccf.InsertWCS_T_Monitor_Task(ob); } #endregion } } #endregion break; case 6: #region AGV #region 前一个设备是输送线,生成输送线送出指令,并获得取货坐标 if (PriorDevice.Count > 0) { #region 前一设备是输送机 AheadDetect.Remove(0, AheadDetect.Length); if (PriorDevice[1] == 2) { if (uncontrol != "1") { bool IfConveyor = false; if (PriorKeyDevice0.Count > 0) { if (PriorKeyDevice0[1] != 2)//20110104前一关键设备不是类输送机 { IfConveyor = false; } else { IfConveyor = true; } } else { IfConveyor = false; } if (IfConveyor == false)//20110104前一关键设备不是类输送机 { List newcur = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newcur != null) { CurDevice = newcur; } int arrowdev; if (CurDevice[0] == PriorDevice[0]) {//输送机的起点设备和终点设备相同时,目标设备索引置为零 arrowdev = 0; #region 运行提前检测光电组 //CurDevice的F_BindingDevice里存的光电开关的设备所引。CurDevice有探物 tw = GetSendOutDetect(CurDevice[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101118 } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); if (CStaticClass.AGVAllowSingleFork == "0")//20100710 { #region 隔壁输送机空闲无物 //奇数加一;偶数减一 if ((CurDevice[0] % 2) == 0) { AheadDetect.Append(";D").Append(GetBindingDeviceIndexOut(CurDevice[0] - 1).ToString());//20101118 } else { AheadDetect.Append(";D").Append(GetBindingDeviceIndexOut(CurDevice[0] + 1).ToString());//20101118 } #endregion } #endregion } else { arrowdev = PriorDevice[0]; CurDevice[3] = 6; #region 运行提前检测光电组 //CurDevice的F_SendOutDetect里存的光电开关的设备所引。CurDevice有探物 tw = GetSendOutDetect(CurDevice[0]); if (tw != "") { AheadDetect.Append(";D-").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101118 } else { AheadDetect.Remove(0, AheadDetect.Length); } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); List nextConveyor = GetCurConveyorNextDevice(routeIDSub, CurDevice[2]); if (nextConveyor.Count > 0)//20110331 { AheadDetect.Append(";").Append(GetBeDetectedDevices(nextConveyor[0])); tw = GetBindingDeviceIndex(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101118 } tw = GetBindingDeviceIndexOut(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101118 } //检测送出最后一节输送线是否逻辑有物 AheadDetect.Append(";").Append("N").Append(nextConveyor[0].ToString()); ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + nextConveyor[0].ToString(); } #endregion #region 新提前检测 zcy if (true) { string newAhead = ccf.GetAheadDetect(CurDevice[0], arrowdev); if (newAhead != "") { AheadDetect.Clear(); AheadDetect.Append(newAhead); } } #endregion } if (DeviceAndOrderExitInMonitor(Mankind, ManFID, CurDevice[0], CurDevice[3], 0, Coor) == false) { #region 运行时锁定设备组 #endregion #region 生成输送机命令 int mindex = ccf.GetMonitorIndex(); TriggerTaskNo = mindex; sql.Remove(0, sql.Length); sql.Append("INSERT INTO T_Monitor_Task ").Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4,").Append( " F_AheadDetect,F_TxtParam)").Append( "VALUES (").Append(ManFID).Append(",").Append(Mankind).Append(",").Append(mindex).Append(",").Append(drv["FTASKLEVEL"] ).Append(",").Append(CurDevice[0]).Append(",").Append(CurDevice[3]).Append(",").Append(routeIDSub).Append(",").Append(status).Append(",").Append(CurDevice[0]).Append(",").Append(arrowdev ).Append(",'").Append(AheadDetect.ToString()).Append("','").Append(drv["FPALLETBARCODE"]).Append("')"); dbo.ExceSQL(sql.ToString()); #endregion } } } } #endregion #region 取货坐标 int[] Coor0_2 = new int[6] { 0, 0, 0, 0, 0, 0 }; //如果PriorDevice是AGV通道,PriorDevice不拆分命令,获取送坐标,拆分AGV命令取、送货 if (PriorDevice[1] == 11) { Coor0_2 = GetAGVAddressFromManage(Mankind, ManFID, true); } else { //如果NextDevice是输送机则取送货命令,获取送坐标 //如果NextDevice是固定站台则取送货命令,获取送坐标 Coor0_2[1] = PriorDevice[0]; } Coor[0] = Coor0_2[0]; Coor[1] = Coor0_2[1];//站台设备索引 Coor[2] = Coor0_2[2]; #endregion } if (NextDevice.Count > 0) { int[] Coor3_5 = new int[6] { 0, 0, 0, 0, 0, 0 }; //如果NextDevice是AGV通道,NextDevice不拆分命令,获取送坐标,拆分AGV命令取、送货 if (NextDevice[1] == 11) { Coor3_5 = GetAGVAddressFromManage(Mankind, ManFID, false); //GetAGVCELLAddressFromManage(Mankind, ManFID, false); } else { //如果NextDevice是输送机则取送货命令,获取送坐标 //如果NextDevice是固定站台则取送货命令,获取送坐标 Coor3_5[4] = NextDevice[0]; } Coor[3] = Coor3_5[3]; Coor[4] = Coor3_5[4];//站台设备索引 Coor[5] = Coor3_5[5]; } #endregion #region 生成AGV指令:取送货//20110104 //转换调度任务类型和AGV任务类型 int agvorder = 0; int station; #region AGV取货 if (PriorDevice.Count > 0) { agvorder = 2;//AGV取货 RunningLock.Remove(0, RunningLock.Length); AheadDetect.Remove(0, AheadDetect.Length); station = Coor[1]; if (ccf.GetDeviceKindIdx(station) == 2) {//20100714 #region 运行时锁定设备组 RunningLock.Append(station.ToString()); //取货时锁定隔壁输送机 if (CStaticClass.AGVAllowSingleFork == "0") { if ((PriorDevice[0] % 2) == 0) { RunningLock.Append(";").Append((PriorDevice[0] - 1).ToString()); } else { RunningLock.Append(";").Append((PriorDevice[0] + 1).ToString()); } } #endregion } else //AGV的送出站台检测 if (PriorDevice[1] == 9)//20170710 { tw = GetSendOutDetect(PriorDevice[0]); if (tw != "") { AheadDetect.Append(";D-").Append(tw.ToString());//20101118 } } if (NextDevice.Count > 0) { station = Coor[4]; } if (NextDevice.Count<1) { continue; } if (NextDevice[3] == 4) { agvorder = 4; //取送货 } devinfo = Model.CGetInfo.GetDeviceInfo(NextKeyDevice[0]); if (devinfo.CommType == "SocketsTCPIP") { AheadDetect.Append(";C").Append(NextKeyDevice[0]);//20170710 判断AGV控制台是否连接 } #region 新提前检测 zcy if (true) { string newAhead = ccf.GetAheadDetect(NextKeyDevice[0], 0, Coor[4]); if (newAhead != "") { AheadDetect.Clear(); AheadDetect.Append(newAhead); } } #endregion #region 衢州华友,出库任务终点是某些站台,则不生产AGV指令 if (ccf.GetFCONTROLTASKTYPEFromManageTask(Mankind, ManFID) == 2) { if (Coor[4] == 22023 || Coor[4] == 22024 || Coor[4] == 22046 || Coor[4] == 22049) { //int tepend = Coor[4]; //int tepstart = Coor[1]; //Dbo.Updateable().SetColumns(it => it.F_NumParam4 == tepend) // .Where(it => it.F_ManageTaskIndex == ManFID && it.F_DeviceCommandIndex == 6 && it.F_NumParam4 == tepstart) // .ExecuteCommand(); break; } } #endregion #region AGV 拆分插入取货小任务 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, NextKeyDevice[0], agvorder, 0, Coor) == false)//出库搬运指令对申请出库无影响,暂不发送 20170914 { int mindex = ccf.GetMonitorIndex(); mindex = ccf.GetMonitorIndex();//20110104 mindex = ccf.GetMonitorIndex();//20110104 sql.Remove(0, sql.Length); sql.Append("INSERT INTO T_Monitor_Task ").Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam2,").Append( " F_NumParam3, F_NumParam4,F_NumParam5, F_NumParam6,F_AheadDetect,F_RunningLock,F_TxtParam,F_UseAwayFork)").Append( "VALUES (").Append(ManFID).Append(",").Append(Mankind).Append(",").Append(mindex).Append(",").Append(drv["FTASKLEVEL"] ).Append(",").Append(NextKeyDevice[0]).Append(",").Append(agvorder).Append(",").Append(routeIDSub).Append(",").Append(status).Append(",").Append(Coor[0]).Append(",").Append(Coor[1] ).Append(",").Append(Coor[2]).Append(",").Append(Coor[3]).Append(",").Append(Coor[4]).Append(",").Append(Coor[5]).Append(",'") .Append(AheadDetect.ToString()).Append("','").Append(RunningLock.ToString()).Append("','").Append(drv["FPALLETBARCODE"]).Append("','").Append(drv["FUseAwayFork"]).Append("')"); dbo.ExceSQL(sql.ToString()); } #endregion } #endregion #endregion #endregion break; case 7: #region 条码扫描仪(托盘条码比对1) if (PriorDevice.Count > 0) { //如果PriorDevice是输送机则生成输送机命令【CurDevice-->PriorDevice目标设备,出库:2】, //收到输送机PriorDevice的PLC上报的运行状态则提前触发RGV运行命令(7),然后是取送货命令,获取堆垛机取坐标 #region 前一设备是输送机 AheadDetect.Remove(0, AheadDetect.Length); if (PriorDevice[1] == 2) { if ((uncontrol != "1") && (CurDevice[1]==2)) {//20091107 List newcur = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newcur != null) { CurDevice = newcur; } int arrowdev; if (CurDevice[0] == PriorDevice[0]) {//输送机的起点设备和终点设备相同时,目标设备索引置为零 arrowdev = 0; #region 运行提前检测光电组 if (CurDevice[3] == 1) { //CurDevice的F_BindingDevice里存的光电开关的设备所引。CurDevice有探物 tw = GetBindingDeviceIndex(CurDevice[0]); if (tw != "") { AheadDetect .Append( "D-" ).Append( tw.ToString() ).Append( ";" ).Append( GetBeDetectedDevices(CurDevice[0]));//20101118 } else { AheadDetect.Remove(0, AheadDetect.Length); } tw = GetBindingDeviceIndexOut(CurDevice[0]); if (tw != "") { AheadDetect .Append( ";D" + tw.ToString());//20101118 } } else if (CurDevice[3] == 2) { tw = GetBindingDeviceIndexOut(CurDevice[0]); if (tw != "") { AheadDetect.Append("D-").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101118 } else { AheadDetect.Remove(0, AheadDetect.Length); } tw = GetBindingDeviceIndex(CurDevice[0]); if (tw != "") { AheadDetect.Append(";D" + tw.ToString());//20101118 } } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); #endregion } else { arrowdev = PriorDevice[0]; CurDevice[3] = 6; #region 运行提前检测光电组 //CurDevice的F_SendOutDetect里存的光电开关的设备所引。CurDevice有探物 string[] cdi = ccf.GetOwnCorrel_DeviceInfo(CurDevice[0] ); if (null != cdi) {//20100406检测被堆垛机送货的顶升机构在顶升高位,空闲 if (cdi[2] != "") { AheadDetect.Append(";D-").Append(cdi[2]); } if (cdi[3] != "") { AheadDetect.Append(";D-").Append(cdi[3]); } AheadDetect.Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101118 } //20101011 else { tw = GetSendOutDetect(CurDevice[0]); if (tw != "") { AheadDetect.Append("D-").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0])); } else { AheadDetect.Remove(0, AheadDetect.Length); } } List nextConveyor = GetCurConveyorNextDevice(routeIDSub, CurDevice[2]); if (nextConveyor.Count > 0)//20110331 { AheadDetect.Append(";").Append(GetBeDetectedDevices(nextConveyor[0])); tw = GetBindingDeviceIndex(nextConveyor[0]); if ((tw != "")&&(nextConveyor[0]!=12304)&&(nextConveyor[0]!=12310))//20130510 { AheadDetect.Append(";D").Append(tw.ToString());//20101118 } tw = GetBindingDeviceIndexOut(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101118 } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + nextConveyor[0].ToString(); } #endregion } AheadDetect.Append(";").Append(GetBeDetectedDevices(CurDevice[0])); AheadTrigger.Remove(0, AheadTrigger.Length); AheadTrigger .Append( PriorDevice[0].ToString()); //+ "-" + (被触发的调度任务号);//此设备的运行状态(货物当前位置=PriorDevice[0])触发堆垛机的将取 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, CurDevice[0], CurDevice[3], 0, Coor) == false) { #region 生成输送机命令 //int mindex = ccf.GetMonitorIndex(); //TriggerTaskNo = mindex; //sql.Remove(0, sql.Length); //sql .Append( "INSERT INTO T_Monitor_Task " ).Append( // "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel," ).Append( // " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4," ).Append( // " F_AheadDetect,F_TxtParam)" ).Append( //"VALUES (" ).Append( ManFID ).Append( "," ).Append( Mankind ).Append( "," ).Append( mindex ).Append( "," ).Append( drv["FTASKLEVEL"] // ).Append( "," ).Append( CurDevice[0] ).Append( "," ).Append( CurDevice[3] ).Append( "," ).Append( routeIDSub ).Append( "," ).Append( status ).Append( "," ).Append( CurDevice[0] ).Append( "," ).Append( arrowdev // ).Append( ",'" ).Append( AheadDetect.ToString() ).Append( "','" ).Append( drv["FPALLETBARCODE"] ).Append( "')"); //dbo.ExceSQL(sql.ToString()); #endregion } } } #endregion #region 运行提前检测光电组 AheadDetect.Remove(0, AheadDetect.Length); tw = GetBindingDeviceIndexOut(PriorDevice[0]); if (tw != "") { AheadDetect.Append("D-").Append(tw.ToString()); } else { AheadDetect.Remove(0, AheadDetect.Length); } #endregion } #region 生成条码比对命令 if (DeviceAndOrderExitInMonitor(Mankind, ManFID, NextKeyDevice[0], NextKeyDevice[3], 0, Coor) == false) { int mindex = ccf.GetMonitorIndex(); sql.Remove(0, sql.Length); sql .Append( "INSERT INTO T_Monitor_Task " ).Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel," ).Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4," ).Append( " F_AheadDetect,F_TxtParam)" ).Append( "VALUES (" ).Append( ManFID ).Append( "," ).Append( Mankind ).Append( "," ).Append( mindex ).Append( "," ).Append( drv["FTASKLEVEL"] ).Append( "," ).Append( NextKeyDevice[0] ).Append( "," ).Append( NextKeyDevice[3] ).Append( "," ).Append( routeIDSub ).Append( "," ).Append( status ).Append( ",0,0,'" ).Append( AheadDetect.ToString() ).Append( "','" ).Append( drv["FPALLETBARCODE"] ).Append( "')"); dbo.ExceSQL(sql.ToString()); } #endregion #endregion break; case 5: #region 拆叠盘机 { Rgvorder = NextKeyDevice[3]; //1:拆单盘,2:叠单盘,3:满跺放下,4:满跺抬起 #region 新提前检测 zcy if (true) { int endDev = Convert.ToInt32(ccf.GetEndDeviceFromManage(Mankind, ManFID)); string newAhead = ccf.GetAheadDetect(NextKeyDevice[0], 0, endDev); if (newAhead != "") { AheadDetect.Clear(); AheadDetect.Append(newAhead); } } #endregion if (DeviceAndOrderExitInMonitor(Mankind, ManFID, NextKeyDevice[0], Rgvorder, 0, Coor) == false) { int mindex = ccf.GetMonitorIndex(); TriggerTaskNo = mindex; sql.Remove(0, sql.Length); sql.Append("INSERT INTO T_Monitor_Task ").Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4,").Append( " F_AheadDetect,F_TxtParam)").Append( "VALUES (").Append(ManFID).Append(",").Append(Mankind).Append(",").Append(mindex).Append(",").Append(drv["FTASKLEVEL"] ).Append(",").Append(NextKeyDevice[0]).Append(",").Append(Rgvorder).Append(",").Append(routeIDSub).Append(",").Append(status).Append(",").Append(0).Append(",").Append(0 ).Append(",'").Append(AheadDetect.ToString()).Append("','").Append(drv["FPALLETBARCODE"]).Append("')"); dbo.ExceSQL(sql.ToString()); } } break; #endregion case 12: #region 虚拟关键设备(只作为路径分割点) if (PriorDevice.Count > 0) { //如果PriorDevice是输送机则生成输送机命令【CurDevice-->PriorDevice目标设备,出库:2】, //收到输送机PriorDevice的PLC上报的运行状态则提前触发RGV运行命令(7),然后是取送货命令,获取堆垛机取坐标 #region 前一设备是输送机 AheadDetect.Remove(0, AheadDetect.Length); if (PriorDevice[1] == 2) { if (uncontrol != "1") {//20091107 List newcur = NewCurDevice(PriorDevice0, PriorKeyDevice0); if (newcur != null) { CurDevice = newcur; } int arrowdev; if (CurDevice[0] == PriorDevice[0]) {//输送机的起点设备和终点设备相同时,目标设备索引置为零 //arrowdev = 0; arrowdev = CurDevice[0]; #region 运行提前检测光电组 //20101011 string[] cdi = ccf.GetOwnCorrel_DeviceInfo(CurDevice[0]); if (null != cdi && CurDevice[3] == 2) {//20100406检测被堆垛机送货的顶升机构在顶升高位,空闲 //if (cdi[1] != "") //{ // AheadDetect.Append(";D-").Append(cdi[1]); //} if (cdi[5] != "") { AheadDetect.Append(";D").Append(cdi[5]); } if (cdi[6] != "") { AheadDetect.Append(";D").Append(cdi[6]); } if (cdi[3] != "") { AheadDetect.Append(";D-").Append(cdi[3]);//检测是否有货 } AheadDetect.Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101118 } //20101011 非出库任务 else { if (CurDevice[3] == 1) { //CurDevice的F_BindingDevice里存的光电开关的设备所引。CurDevice有探物 tw = GetBindingDeviceIndex(CurDevice[0]); if (tw != "") { AheadDetect .Append( "D-" ).Append( tw.ToString() ).Append( ";" ).Append( GetBeDetectedDevices(CurDevice[0]));//20101118 } else { AheadDetect.Remove(0, AheadDetect.Length); } tw = GetBindingDeviceIndexOut(CurDevice[0]); if (tw != "") { AheadDetect .Append( ";D" ).Append( tw.ToString());//20101118 } } else if ((CurDevice[3] == 2) )//20110510反转 { //CurDevice的F_BindingDevice里存的光电开关的设备所引。CurDevice有探物 tw = GetBindingDeviceIndexOut(CurDevice[0]); if (tw != "") { AheadDetect .Append( "D-" ).Append( tw.ToString() ).Append( ";" ).Append( GetBeDetectedDevices(CurDevice[0]));//20101118 } tw = GetBindingDeviceIndex(CurDevice[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101118 } } } //else if (CurDevice[3] == 2) //{ // tw = GetBindingDeviceIndexOut(CurDevice[0]); // if (tw != "") // { // AheadDetect = "D-" + tw.ToString() + ";" + GetBeDetectedDevices(CurDevice[0]);//20101118 // } // else // { // AheadDetect.Remove(0, AheadDetect.Length); // } //} ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); #endregion } else { arrowdev = PriorDevice[0]; CurDevice[3] = 6; #region 运行提前检测光电组 string[] cdi = ccf.GetOwnCorrel_DeviceInfo(CurDevice[0]); if (null != cdi) {//20100406检测被堆垛机送货的顶升机构在顶升高位,空闲 if (cdi[2] != "") //检测堆垛机允许输送线动作 { AheadDetect.Append(";D-").Append(cdi[2]); } if (cdi[5] != "") { AheadDetect.Append(";D").Append(cdi[5]); } if (cdi[6] != "") { AheadDetect.Append(";D").Append(cdi[6]); } if (cdi[3] != "") { AheadDetect.Append(";D-").Append(cdi[3]);//检测是否有货 } AheadDetect.Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101118 } //20101011 else { //CurDevice的F_SendOutDetect里存的光电开关的设备所引。CurDevice有探物 tw = GetSendOutDetect(CurDevice[0]); if (tw != "") {//20091107 AheadDetect.Append("D-").Append(tw.ToString()).Append(";").Append(GetBeDetectedDevices(CurDevice[0]));//20101118 } else { AheadDetect.Remove(0, AheadDetect.Length); } } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + CurDevice[0].ToString(); List nextConveyor = GetCurConveyorNextDevice(routeIDSub, CurDevice[2]); if (nextConveyor.Count > 0)//20110331 { AheadDetect.Append(";").Append(GetBeDetectedDevices(nextConveyor[0])); tw = GetBindingDeviceIndex(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101118 } tw = GetBindingDeviceIndexOut(nextConveyor[0]); if (tw != "") { AheadDetect.Append(";D").Append(tw.ToString());//20101118 } ////20090803检测设备是否空闲idle //AheadDetect += ";" + "I" + nextConveyor[0].ToString(); } #endregion #region 新提前检测 zcy if (true) { string newAhead = ccf.GetAheadDetect(CurDevice[0], arrowdev); if (newAhead != "") { AheadDetect.Clear(); AheadDetect.Append(newAhead); } } #endregion } if (DeviceAndOrderExitInMonitor(Mankind, ManFID, CurDevice[0], CurDevice[3], 0, Coor) == false) { #region 运行时锁定设备组 #endregion #region 生成输送机命令 int mindex = ccf.GetMonitorIndex(); TriggerTaskNo = mindex; sql.Remove(0, sql.Length); sql .Append( "INSERT INTO T_Monitor_Task " ).Append( "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel," ).Append( " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4," ).Append( " F_AheadDetect,F_TxtParam)" ).Append( "VALUES (" ).Append( ManFID ).Append( "," ).Append( Mankind ).Append( "," ).Append( mindex ).Append( "," ).Append( drv["FTASKLEVEL"] ).Append( "," ).Append( CurDevice[0] ).Append( "," ).Append( CurDevice[3] ).Append( "," ).Append( routeIDSub ).Append( "," ).Append( status ).Append( "," ).Append( CurDevice[0] ).Append( "," ).Append( arrowdev ).Append( ",'" ).Append( AheadDetect.ToString() ).Append( "','" ).Append( drv["FPALLETBARCODE"] ).Append( "')"); dbo.ExceSQL(sql.ToString()); #endregion } } } #endregion } #endregion break; default: break; } } else { } PriorDevice0 = PriorDevice; PriorKeyDevice0 = NextKeyDevice; //20091107 PriorDevice = null; NextKeyDevice = null; CurDevice = null; NextKeyDevice = null; } //20120820 string dtime = DateTime.Now.ToString("u"); dtime = dtime.Substring(0, dtime.Length - 1); dbo.ExecuteSql(string.Format("update T_Monitor_Task set F_SplitTime= '{0}' where F_ManageTASKKINDINDEX={1} and F_ManageTASKINDEX={2}",dtime,Mankind,ManFID));//20120616 dbo.TransCommit(); sql.Clear(); sql.Append("select f_monitorIndex from t_monitor_task where F_ManageTaskIndex = ").Append(ManFID); dvs = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvs.Count > 0) { sql.Clear(); sql.Append("**条码:").Append(drv["FPALLETBARCODE"]).Append("**Manage:" + ManFID.ToString()).Append("**Monitor:" ); for (int i=0; i /// 生成堆垛机相关指令的提前检测条件 /// /// author:zcy /// /// /// 路径种类 /// Monitor 指令的提前检测条件 private static string CreateStackAheadDetect(List KeyDevice, List PriorDevice, List NextDevice, int RouteIdSub, int CommandType, out StringBuilder RunLock) { StringBuilder RunningLock = new StringBuilder(); StringBuilder AheadDetect = new StringBuilder(); RunningLock.Remove(0, RunningLock.Length);//20101124 AheadDetect.Remove(0, AheadDetect.Length);//20101124 string tw; if (NextDevice[1] == 2 && PriorDevice[1] == 10 && CommandType == 4) //出库取货 {//堆垛机取送货时,只检测站台有货(T_Base_lane_Gate),不检测输送线有货(T_Base_device) RunningLock.Append(NextDevice[0].ToString()); AheadDetect.Append(StackLaneGateDetect(KeyDevice[0], NextDevice[0], CHECK_NO_GOODS)); //tw = GetBindingDeviceIndex(NextDevice[0]); //AheadDetect.Append(";D").Append(tw.ToString()); #region HWHX 单侧货架出库逻辑 if (IsSingleLane(KeyDevice[0]) == true) { AheadDetect.Append(";").Append(GetSingleLaneDetect(KeyDevice[0], NextDevice[0])); } #endregion AheadDetect.Append(EndGateDetect(RouteIdSub)); } if (NextDevice[1] == 2 && PriorDevice[1] == 10 && CommandType == 5) //出库送货 {//堆垛机取送货时,只检测站台有货(T_Base_lane_Gate),不检测输送线有货(T_Base_device) RunningLock.Append(NextDevice[0].ToString()); AheadDetect.Append(StackLaneGateDetect(KeyDevice[0], NextDevice[0], CHECK_NO_GOODS)); //tw = GetBindingDeviceIndex(NextDevice[0]); //AheadDetect.Append(";D").Append(tw.ToString()); } if (NextDevice[1] == 10 && PriorDevice[1] == 2 && CommandType == 4) //入库取货 {//堆垛机取送货时,只检测站台有货(T_Base_lane_Gate),不检测输送线有货(T_Base_device) RunningLock.Append(PriorDevice[0].ToString()); AheadDetect.Append(StackLaneGateDetect(KeyDevice[0], PriorDevice[0], CHECK_HAVE_GOODS)); //tw = GetBindingDeviceIndex(PriorDevice[0]); //AheadDetect.Append(";D-").Append(tw.ToString()); AheadDetect.Append(";R").Append(PriorDevice[0].ToString()); //条码比对 } if (NextDevice[1] == 10 && PriorDevice[1] == 2 && CommandType == 5) //入库送货 { //nothing } if (NextDevice[1] == 2 && PriorDevice[1] == 2 && CommandType == 4) //站台移库取货 { RunningLock.Append(PriorDevice[0].ToString()); RunningLock.Append(NextDevice[0].ToString()); AheadDetect.Append(StackLaneGateDetect(KeyDevice[0], PriorDevice[0], CHECK_HAVE_GOODS)); AheadDetect.Append(StackLaneGateDetect(KeyDevice[0], NextDevice[0], CHECK_NO_GOODS)); tw = GetBindingDeviceIndex(PriorDevice[0]); AheadDetect.Append(";D-").Append(tw.ToString()); tw = GetBindingDeviceIndex(NextDevice[0]); AheadDetect.Append(";D").Append(tw.ToString()); AheadDetect.Append(";R").Append(PriorDevice[0].ToString()); AheadDetect.Append(EndGateDetect(RouteIdSub)); } if (NextDevice[1] == 2 && PriorDevice[1] == 2 && CommandType == 5) //站台移库送货 { RunningLock.Append(NextDevice[0].ToString()); AheadDetect.Append(StackLaneGateDetect(KeyDevice[0], PriorDevice[0], CHECK_NO_GOODS)); tw = GetBindingDeviceIndex(NextDevice[0]); AheadDetect.Append(";D-").Append(tw.ToString()); } if (NextDevice[1] == 10 && PriorDevice[1] == 10 && CommandType == 4) //倒库取货 { //waiting add } if (NextDevice[1] == 10 && PriorDevice[1] == 10 && CommandType == 5) //倒库送货 { //waiting add } //20200224 添加堆垛机的货物检测和空闲 AheadDetect.Append(";").Append(GetBeDetectedDevices(KeyDevice[0])); if (CommandType == 4) { AheadDetect.Append(";D").Append(GetBindingDeviceIndex(KeyDevice[0])); } else if (CommandType == 5) { AheadDetect.Append(";D-").Append(GetBindingDeviceIndex(KeyDevice[0])); } RunLock = RunningLock; return AheadDetect.ToString(); } private static string GetAheadDetect(int device, int command, int next, int proi) { return ""; DataView dv = new DataView(); try { sql.Clear(); sql.Append("select F_AheadDetect from T_Base_AheadDetect where F_DeviceIndex=").Append(device) .Append(" and F_NextDevice=").Append(next) .Append(" and F_ProDevice=").Append(proi) .Append(" and F_CommandIndex =").Append(command); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return dv[0]["F_AheadDetect"].ToString(); } else { return string.Empty; } } catch (Exception ex) { DisassembleTaskError = System.Reflection.MethodBase.GetCurrentMethod().Name + "方法发生错误:" + ex.StackTrace + ex.Message; RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", DisassembleTaskError); OnRefreshMonitor(rme); return null; } finally { dv.Dispose(); } } private static bool POSITIVE = true; private static bool NEGATIVE = false; private static string GetDetectNameFromDeviceBit(string devicebit,int value) { return ""; } /// /// 单巷道出库站台输送线检测 /// /// author:zcy /// 堆垛机 /// private static string GetSingleLaneDetect(int Stack, int Gate) { DataView dv = new DataView(); StringBuilder aheaddetect = new StringBuilder(); try { sql.Clear(); sql.Append("select F_OutputNextDevice from T_Base_Device where F_DeviceIndex = ").Append(Gate); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { int nextdev = Convert.ToInt32(dv[0]["F_OutputNextDevice"]); aheaddetect.Clear(); aheaddetect.Append(";D").Append(GetBindingDeviceIndex(nextdev)); aheaddetect.Append(";").Append(GetBeDetectedDevices(nextdev)); } return aheaddetect.ToString(); } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetSingleLaneDetect时发生错误:" + ex.StackTrace + ex.Message; RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", DisassembleTaskError); OnRefreshMonitor(rme); return null; } finally { dv.Dispose(); aheaddetect = null; } } /// /// 是否是单排货架堆垛机 /// /// author:zcy /// 堆垛机 /// private static bool IsSingleLane(int Stack) { DataView dv = new DataView(); try { sql.Clear(); sql.Append("select count (F_LaneGateDeviceIndex) as num from T_Base_Lane_Gate where f_laneindex = (select F_LaneNo from T_Base_StackInfo where f_stackindex = ").Append(Stack).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (Convert.ToInt32(dv[0]["num"]) == 2)//HWHX 巷道两侧出库,站台为偶数,2个是单侧货架, 4个是双侧货架 return true; else return false; } return false; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.IsSingleLane时发生错误:" + ex.StackTrace + ex.Message; RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", DisassembleTaskError); OnRefreshMonitor(rme); return false; } finally { dv.Dispose(); } } /// /// 堆垛机取放货站台的相关指令的提前检测条件 /// /// author:zcy /// 堆垛机 /// 取放货输送线 /// 输送线上是否有货 /// 输送线提前检测的字符串 private static string StackLaneGateDetect(int stack, int device, bool checkgoods) { StringBuilder AheadDetect = new StringBuilder(); string tw; string[] cdi = ccf.GetLanewayDeviceInfoFromStackDev(stack, device); if (cdi != null) { ////20201111检测被堆垛机送货的输送线光电位 //if (cdi[1] != "") //顶升高位——检测允许堆垛机动作 //{ // AheadDetect.Append(";D-").Append(cdi[1]); //} //if (cdi[2] != "") //顶升低位——检测允许输送线动作 //{ // AheadDetect.Append(";D-").Append(cdi[2]); //} if (cdi[3] != "") //检测有货、无货 { if (checkgoods == CHECK_NO_GOODS) { AheadDetect.Append(";D").Append(cdi[3]); } else if (checkgoods == CHECK_HAVE_GOODS) { AheadDetect.Append(";D-").Append(cdi[3]); } } if (cdi[4] != "") //运行检测——检测顶升移栽低位 { AheadDetect.Append(";D").Append(cdi[4]); } if (cdi[5] != "") //近巷道有物检测 { AheadDetect.Append(";D").Append(cdi[5]); } //if (cdi[6] != "") //远巷道有物检测 //{ // AheadDetect.Append(";D").Append(cdi[6]); //} if (cdi[7] != " ") //是否使用远货叉 { AheadDetect.Append(";D-").Append(cdi[7]); } //if (cdi[8] != "") //关联设备索引 //{ // AheadDetect.Append(";D").Append(cdi[8]); //} //if (cdi[9] != "") //货位编码 //{ // AheadDetect.Append(";D").Append(cdi[9]); //} if (cdi[10] != "") //交换站台 { AheadDetect.Append(";D-").Append(cdi[10]); } } else { tw = GetBindingDeviceIndexOut(device); if (tw != "") { if (checkgoods == CHECK_NO_GOODS) { AheadDetect.Append(";D").Append(tw.ToString()); } else if (checkgoods == CHECK_HAVE_GOODS) { AheadDetect.Append(";D-").Append(tw.ToString()); } } } //检测被堆垛机取送货的输送机空闲 AheadDetect.Append(";").Append(GetBeDetectedDevices(device)); if (checkgoods == CHECK_NO_GOODS) { //给堆垛机取送货的输送机增加是否逻辑无物的判断 //AheadDetect.Append(";").Append("N").Append(device.ToString()); } if (checkgoods == CHECK_HAVE_GOODS) { //给堆垛机取送货的输送机增加是否逻辑有物的判断 //AheadDetect.Append(";").Append("H").Append(device.ToString()); } //给堆垛机送货的输送机增加是否锁定的判断 //AheadDetect.Append(";").Append("L").Append(device.ToString()); return AheadDetect.ToString(); } private static string EndGateDetect(int RouteIdSub) { StringBuilder AheadDetect = new StringBuilder(); List endDevice = GetEndDevice(RouteIdSub); if ( endDevice[1] == 2) { int count = ccf.GetExeCountFromTaskCounts(endDevice[0]); if (count > 0) { AheadDetect.Append(";J").Append(endDevice[0]).Append(",").Append(count); } } return AheadDetect.ToString(); } /* /// /// 特殊任务需要控制任务数量,不进行拆分,返回值true就不拆分 /// /// /// public static bool ControlTaskAmountUnDisassemble(DataRowView drv) {//20121203 DataView dv = new DataView(); try { if (Convert.ToInt32(drv["FSTARTDEVICE"]) == 19001 && Convert.ToInt32(drv["FENDDEVICE"]) != 19001) {//化成A回库和去倒箔间的包含12068的任务分别不能超过六个(12076,12083,18001,18002...18005) sql.Clear(); sql.Append("SELECT count(distinct FID) as taskamount FROM T_Monitor_Task,T_Manage_Task WHERE T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex") .Append(" AND T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID and T_Monitor_Task.F_DeviceIndex = 12068 and FSTARTDEVICE=19001 "); if (Convert.ToInt32(drv["FENDDEVICE"]) == 12076 || Convert.ToInt32(drv["FENDDEVICE"]) == 12083) { sql.Append(" and (FENDDEVICE=12076 or FENDDEVICE=12083) "); } else { sql.Append(" and (FENDDEVICE<>12076 and FENDDEVICE<>12083 and FENDDEVICE<>19001) "); } object ob = dbo.GetSingle(sql.ToString()); if (ob != null) { if (Convert.ToInt32(ob) > 6) { return true; } } } else if (Convert.ToInt32(drv["FSTARTDEVICE"]) != 19002 && Convert.ToInt32(drv["FENDDEVICE"]) == 19002 ) {//化成B出库包含12019的不能超过4个; sql.Clear(); sql.Append("SELECT count(distinct FID) as taskamount FROM T_Monitor_Task,T_Manage_Task WHERE T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex") .Append(" AND T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID and T_Monitor_Task.F_DeviceIndex = 12019 "); sql.Append(" and (FENDDEVICE=19002 and FSTARTDEVICE<>19002) "); object ob = dbo.GetSingle(sql.ToString()); if (ob != null) { if (Convert.ToInt32(ob) > 4) { return true; } } } else if (Convert.ToInt32(drv["FSTARTDEVICE"]) == 19002 && Convert.ToInt32(drv["FENDDEVICE"]) != 19002 ) {//化成B去倒箔间和回库的任务包含12034等待执行的不能超过3个 sql.Clear(); sql.Append("SELECT count(distinct FID) as taskamount FROM T_Monitor_Task,T_Manage_Task WHERE T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex") .Append(" AND T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID and T_Monitor_Task.F_DeviceIndex = 12034 and f_status=0 and FSTARTDEVICE=19002 "); if (Convert.ToInt32(drv["FENDDEVICE"]) == 12042 || Convert.ToInt32(drv["FENDDEVICE"]) == 12051) { sql.Append(" and (FENDDEVICE=12042 or FENDDEVICE=12051) "); } else { sql.Append(" and (FENDDEVICE<>12042 and FENDDEVICE<>12051 and FENDDEVICE<>19002) "); } object ob = dbo.GetSingle(sql.ToString()); if (ob != null) { if (Convert.ToInt32(ob) > 3) { return true; } } } else if (Convert.ToInt32(drv["FSTARTDEVICE"]) >= 18001 && Convert.ToInt32(drv["FSTARTDEVICE"]) <= 18005 && (Convert.ToInt32(drv["FENDDEVICE"]) == 12042 || Convert.ToInt32(drv["FENDDEVICE"]) == 12051)) {//立库到化成B倒箔间任务每个巷道最多两个 sql.Clear(); sql.Append("SELECT count(distinct FID) as taskamount FROM T_Monitor_Task,T_Manage_Task WHERE T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex") .Append(" AND T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID and (FENDDEVICE=12042 or FENDDEVICE=12051) and FSTARTDEVICE=").Append(Convert.ToInt32(drv["FSTARTDEVICE"])); object ob = dbo.GetSingle(sql.ToString()); if (ob != null) { if (Convert.ToInt32(ob) >=2) { return true; } } } return false; } catch (Exception ex) { DisassembleTaskError = "拆分任务时,判断是否二楼检定任务是否超过最大缓存8垛:" + ex.Message; return false; } } */ /// /// 双伸货位,需要控制任务数量,不进行拆分,返回值true就不拆分 /// /// /// public static bool ControlTaskAmountUnDisassemble(DataRowView drv) {//20121203 DataView dv = new DataView(); try { string FSTARTDEVICE = Convert.ToString(drv["FSTARTDEVICE"]) ; string FSTARTCELL = Convert.ToString(drv["FSTARTCELL"]); int freach = 1; string sqlstr=string.Empty; dv = dbo.ExceSQL(string.Format("SELECT F_ForkAmount,F_Reach from T_Base_StackInfo where F_LaneNo like '%{0}%'", FSTARTDEVICE)).Tables[0].DefaultView; if (dv.Count > 0) { freach = Convert.ToInt32(dv[0]["F_Reach"]); } if (freach == 2) { string[] zxy = FSTARTCELL.Split('-');//获得任务坐标 if (zxy.Length > 2) { int getZ = Convert.ToInt32(zxy[0]);//取货的排坐标 int newZ; int tempZ = getZ; if (tempZ > 4) { tempZ = getZ % 4; } if (tempZ == 1 || tempZ == 4)//里位取货时,要判读是否有外位的取货任务 {//获取外位坐标 if (tempZ == 1) { newZ = getZ + 1; } else { newZ = getZ - 1; } string neighborzxy = string.Format("{0:D2}-{1:D2}-{2:D2}", newZ, zxy[1], zxy[2]);//获得外位坐标 sqlstr = string.Format("SELECT FID FROM T_Manage_Task WHERE (FSTATUS = 0) AND(FSTARTDEVICE = {0}) AND (FSTARTCELL = '{1}') ", FSTARTDEVICE, neighborzxy); dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dv.Count > 0)// { return true; } } } } return false; } catch (Exception ex) { DisassembleTaskError = "拆分任务时,ControlTaskAmountUnDisassemble:" + ex.Message; return false; } finally { dv.Dispose(); } } /// /// 查找路径运行方向的反方向的最近的设备,返回值:索引0:设备所引;索引1:设备类型;2:路径序号;3:设备命令 /// /// 路径ID /// 路径上的序号 /// public static List GetPriorDevice(int CurRouteIDSub, int CurSerialNumber) { List keyDevice = new List(); DataView dvRoute = new DataView(); try { //后续设备最近的设备 sql.Remove(0, sql.Length); sql.Append( "SELECT T_Base_Route_Device.F_DeviceIndex,F_DeviceOrder, T_Base_Route_Device.F_SerialNumber, " ).Append( "T_Base_Device_Command.F_DeviceCommandIndex,T_Base_Device.F_DeviceKindIndex FROM T_Base_Device_Command " ).Append( ",T_Base_Device,T_Base_Route_Device where T_Base_Device_Command.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex" ).Append( " and T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and F_RouteIDSub=" ).Append( CurRouteIDSub ).Append( " and F_SerialNumber < " ).Append( CurSerialNumber ).Append( " order by F_SerialNumber desc "); dvRoute = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvRoute.Count > 0) { keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceIndex"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceKindIndex"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_SerialNumber"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceOrder"])); } return keyDevice; } catch (Exception ex) { DisassembleTaskError = string.Format("ControlSystem.CDisassembleTask.GetPriorDevice:{0}" , ex.StackTrace+ex.Message ); return null; } finally { keyDevice=null; dvRoute.Dispose() ; } } /// /// 对于长串输送机组,需要判断当前设备的下一个设备是否具备发送状态 /// /// 当前调度的子路径 /// 输送机组的当前输送机对应的路径序号 /// static List GetCurConveyorNextDevice(int CurRouteIDSub, int CurSerialNumber) { List CurDeviceNextDev = new List();//20130510 return CurDeviceNextDev;//20120906嘉兴特殊 DataView dvRoute = new DataView(); try { //找到前一个设备CurDevice的下一个设备 sql.Remove(0, sql.Length ); sql.Append("SELECT T_Base_Route_Device.F_DeviceIndex,F_DeviceOrder, T_Base_Route_Device.F_SerialNumber, " ).Append( "T_Base_Device_Command.F_DeviceCommandIndex,T_Base_Device.F_DeviceKindIndex FROM T_Base_Device_Command " ).Append( ",T_Base_Device,T_Base_Route_Device where T_Base_Device_Command.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex" ).Append( " and T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and F_RouteIDSub=" ).Append( CurRouteIDSub ).Append( " and F_SerialNumber > " ).Append( CurSerialNumber ).Append( " and T_Base_Device.F_DeviceKindIndex=2 order by F_SerialNumber asc "); dvRoute = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvRoute.Count > 0) { CurDeviceNextDev.Add(Convert.ToInt32(dvRoute[0]["F_DeviceIndex"])); CurDeviceNextDev.Add(Convert.ToInt32(dvRoute[0]["F_DeviceKindIndex"])); CurDeviceNextDev.Add(Convert.ToInt32(dvRoute[0]["F_SerialNumber"])); CurDeviceNextDev.Add(Convert.ToInt32(dvRoute[0]["F_DeviceOrder"])); } return CurDeviceNextDev; } catch (Exception ex) { DisassembleTaskError = string.Format("ControlSystem.CDisassembleTask.GetCurConveyorNextDevice:{0}" ,ex.StackTrace+ex.Message ); return null; } finally { CurDeviceNextDev=null; dvRoute.Dispose(); } } /// /// 查找路径方向上最近的关键设备,返回值:索引0:设备所引;索引1:设备类型;2:路径序号;3:设备命令 /// /// 路径ID /// 路径上的序号 /// static List GetNextKeyDevice(int CurRouteIDSub, int CurSerialNumber) { List keyDevice = new List(); DataView dvRoute = new DataView(); DataView dv = new DataView(); try { //首先判断本设备是否为关键设备 sql.Remove(0, sql.Length); sql.Append("SELECT F_SerialNumber, T_Base_Device.F_DeviceIndex,F_DeviceOrder,F_DeviceKindIndex FROM T_Base_Device," ).Append( "T_Base_Route_Device where T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex " ).Append( " and F_RouteIDSub=" ).Append( CurRouteIDSub ).Append( " and F_SerialNumber=" ).Append( CurSerialNumber ).Append( " and F_KeyDevice = '1'"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { keyDevice.Add(Convert.ToInt32(dv[0]["F_DeviceIndex"])); keyDevice.Add(Convert.ToInt32(dv[0]["F_DeviceKindIndex"])); keyDevice.Add(Convert.ToInt32(dv[0]["F_SerialNumber"])); keyDevice.Add(Convert.ToInt32(dv[0]["F_DeviceOrder"])); return keyDevice; } //然后依次判断后续设备最近的关键设备 sql.Remove(0, sql.Length); sql .Append( "SELECT T_Base_Route_Device.F_DeviceIndex,F_DeviceOrder, T_Base_Route_Device.F_SerialNumber, " ).Append( "T_Base_Device_Command.F_DeviceCommandIndex,T_Base_Device.F_DeviceKindIndex FROM T_Base_Device_Command " ).Append( ",T_Base_Device,T_Base_Route_Device where T_Base_Device_Command.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex" ).Append( " and T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and F_RouteIDSub=" ).Append( CurRouteIDSub ).Append( " and F_SerialNumber > " ).Append( CurSerialNumber ).Append( " and T_Base_Device.F_KeyDevice = '1' order by F_SerialNumber asc "); dvRoute = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvRoute.Count > 0) { keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceIndex"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceKindIndex"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_SerialNumber"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceOrder"])); } return keyDevice; } catch (Exception ex) { DisassembleTaskError = string.Format("ControlSystem.CDisassembleTask.GetNextKeyDevice:{0}" ,ex.StackTrace+ex.Message ); return null; } finally { keyDevice=null; dvRoute.Dispose(); dv.Dispose(); } } /// /// 查找路径方向上下一个设备,返回值:索引0:设备所引;索引1:设备类型;2:路径序号;3:设备命令 /// /// 路径ID /// 路径上的序号 /// public static List GetNextDevice(int CurRouteIDSub, int CurSerialNumber) { List keyDevice = new List(); DataView dvRoute = new DataView(); try { //然后依次判断后续设备最近的设备 sql.Remove(0, sql.Length); sql .Append( "SELECT T_Base_Route_Device.F_DeviceIndex,F_DeviceOrder, T_Base_Route_Device.F_SerialNumber, " ).Append( "T_Base_Device_Command.F_DeviceCommandIndex,T_Base_Device.F_DeviceKindIndex FROM T_Base_Device_Command " ).Append( ",T_Base_Device,T_Base_Route_Device where T_Base_Device_Command.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex" ).Append( " and T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and F_RouteIDSub=" ).Append( CurRouteIDSub ).Append( " and F_SerialNumber > " ).Append( CurSerialNumber ).Append( " order by F_SerialNumber asc "); dvRoute = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvRoute.Count > 0) { keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceIndex"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceKindIndex"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_SerialNumber"])); keyDevice.Add(Convert.ToInt32(dvRoute[0]["F_DeviceOrder"])); } return keyDevice; } catch (Exception ex) { DisassembleTaskError = string.Format( "ControlSystem.CDisassembleTask.GetNextDevice:{0}" ,ex.StackTrace+ex.Message ); return null; } finally { keyDevice=null; dvRoute.Dispose(); } } public static List GetEndDevice(int CurRouteIDSub) { List device = new List(); DataView dvRoute = new DataView(); try { //返回路径上最后一个非虚拟设备 sql.Remove(0, sql.Length); sql.Append(" select T_Base_Route_Device.*, T_base_device.F_deviceKindIndex from T_Base_Route_Device,T_base_device ").Append( "where F_DeviceKindIndex <> 12 and T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex ").Append( "and F_RouteIDSub = ").Append(CurRouteIDSub).Append(" order by F_SerialNumber desc "); dvRoute = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvRoute.Count > 0) { device.Add(Convert.ToInt32(dvRoute[0]["F_DeviceIndex"])); device.Add(Convert.ToInt32(dvRoute[0]["F_DeviceKindIndex"])); device.Add(Convert.ToInt32(dvRoute[0]["F_SerialNumber"])); device.Add(Convert.ToInt32(dvRoute[0]["F_DeviceOrder"])); } return device; } catch (Exception ex) { DisassembleTaskError = string.Format("ControlSystem.CDisassembleTask.GetNextDevice:{0}", ex.StackTrace + ex.Message); return null; } finally { device = null; dvRoute.Dispose(); } } /// /// 获得AGV坐标 /// /// 调度任务类型 /// 调度任务索引 /// 搬运任务类型:1,入库(送坐标);2:出库(取坐标);3:移库(取和送坐标) /// static int[] GetAGVAddressFromManage(int Mankind, int ManFID, DataRowView drv) { int[] stackCoo = new int[6] { 0, 0, 0, 0, 0, 0 };//取排-列-层(Z-X-Y);送排-列-层(Z-X-Y) char[] cc = new char[1] { '-' }; string[] split = new string[3]; DataView dv = new DataView(); try { switch (Convert.ToInt32(drv["FCONTROLTASKTYPE"])) { case 1://入库,取坐标:机台站台;送坐标:路径下一个设备 sql.Remove(0, sql.Length); sql .Append( "SELECT FSTARTCELL,FSTARTDEVICE,FENDDEVICE FROM T_Manage_Task WHERE (FID = " ).Append( ManFID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( Mankind ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { stackCoo[0] = 0; stackCoo[1] =Convert.ToInt32(dv[0]["FSTARTCELL"]); stackCoo[2] = 0; stackCoo[3] = 0; stackCoo[4] = 0; stackCoo[5] = 0; } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得AGV坐标!"; return null; } break; case 2://出库:取坐标在路径上一个设备取;送坐标:机台站台 sql.Remove(0, sql.Length); sql .Append( "SELECT FENDCELL,FENDDEVICE FROM T_Manage_Task WHERE (FID = " ).Append( ManFID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( Mankind ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { stackCoo[0] = 0; stackCoo[1] = 0; stackCoo[2] = 0; stackCoo[3] = 0; stackCoo[4] = Convert.ToInt32(dv[0]["FENDCELL"]); stackCoo[5] = 0; } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得AGV坐标!"; return null; } break; default: break; case 3://移库,取坐标:机台站台;送坐标:路径下一个设备 sql.Remove(0, sql.Length); sql .Append( "SELECT FSTARTCELL,FSTARTDEVICE,FENDCELL,FENDDEVICE FROM T_Manage_Task WHERE (FID = " ).Append( ManFID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( Mankind ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { stackCoo[0] = 0; int a = 0; if (int.TryParse(dv[0]["FSTARTCELL"].ToString(),out a)==true) { stackCoo[1] = Convert.ToInt32(dv[0]["FSTARTCELL"]); } else { stackCoo[1] = 0; } stackCoo[2] = 0; stackCoo[3] = 0; if(int.TryParse (dv[0]["FENDCELL"].ToString(),out a)==true) { stackCoo[4] = Convert.ToInt32(dv[0]["FENDCELL"]); } else { stackCoo[4] = 0; } stackCoo[5] = 0; } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得AGV坐标!"; return null; } break; } return stackCoo; } catch (Exception ex) { DisassembleTaskError = string.Format( "ControlSystem.CDisassembleTask.GetAGVAddressFromManage:{0}" , ex.StackTrace+ex.Message ); return null; } finally { stackCoo = null; cc = null ; split =null ; dv.Dispose() ; } } /// /// 20101219根据是否是在AGV通道取货,判断坐标 /// /// /// /// /// static int[] GetAGVAddressFromManage(int Mankind, int ManFID,bool IfGetGoods) { int[] stackCoo = new int[6] { 0, 0, 0, 0, 0, 0 };//取排-列-层(Z-X-Y);送排-列-层(Z-X-Y) char[] cc = new char[1] { '-' }; string[] split = new string[3]; DataView dv = new DataView(); try { switch (IfGetGoods) { case true://在AGV通道取货,取坐标:机台站台;送坐标:路径下一个设备 sql.Remove(0, sql.Length); sql .Append( "SELECT FSTARTCELL,FSTARTDEVICE,FENDDEVICE FROM T_Manage_Task WHERE (FID = " ).Append( ManFID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( Mankind ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { stackCoo[0] = 0; stackCoo[1] =Convert.ToInt32(dv[0]["FSTARTCELL"]); stackCoo[2] = 0; stackCoo[3] = 0; stackCoo[4] = 0; stackCoo[5] = 0; } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得AGV坐标!"; return null; } break; case false://向AGV通道送货:取坐标在路径上一个设备取;送坐标:机台站台 sql.Remove(0, sql.Length); sql .Append( "SELECT FENDCELL,FENDDEVICE FROM T_Manage_Task WHERE (FID = " ).Append( ManFID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( Mankind ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { stackCoo[0] = 0; stackCoo[1] = 0; stackCoo[2] = 0; stackCoo[3] = 0; stackCoo[4] = Convert.ToInt32(dv[0]["FENDCELL"]); stackCoo[5] = 0; } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得AGV坐标!"; return null; } break; default: break; } return stackCoo; } catch (Exception ex) { DisassembleTaskError = string.Format( "ControlSystem.CDisassembleTask.GetAGVAddressFromManage:{0}" ,ex.StackTrace+ex.Message ); return null; } finally { stackCoo = null; cc = null ; split =null ; dv.Dispose(); } } /// /// 在表T_Base_AGV_Gate获得AGV地址 /// /// AGV地址对应的设备索引 /// static int GetAGVAddressFromAgvGate(int devindex) { DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("select F_Address from T_Base_AGV_Gate where F_AGVGateDeviceIndex=" ).Append( devindex); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_Address"]); } else { return -1; } } catch (Exception ex) { DisassembleTaskError = string.Format( "ControlSystem.CDisassembleTask.GetAGVAddressFromAgvGate:{0}" ,ex.StackTrace+ex.Message ); return -1; } finally { dv.Dispose(); } } /// /// 获得堆垛机坐标取排-列-层(Z-X-Y);送排-列-层(Z-X-Y) /// /// 调度任务类型 /// 调度任务索引 /// 搬运任务类型:1,入库(送坐标);2:出库(取坐标);3:移库(取和送坐标) /// static int[] GetStackCoordinateFromManage(int Mankind, int ManFID,DataRowView drv) { int[] stackCoo = new int[6] { 0, 0, 0, 0, 0, 0 };//取排-列-层(Z-X-Y);送排-列-层(Z-X-Y) char[] cc = new char[1] {'-' }; string[] split = new string[3]; DataView dv = new DataView(); try { sql.Remove(0, sql.Length); switch (Convert.ToInt32(drv["FCONTROLTASKTYPE"])) { case 1://入库,送坐标 sql .Append( "SELECT FENDCELL FROM T_Manage_Task WHERE (FID = " ).Append( ManFID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( Mankind ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { split = dv[0]["FENDCELL"].ToString().Split(cc); stackCoo[3] = Convert.ToInt32(split[0]); stackCoo[4] = Convert.ToInt32(split[1]); stackCoo[5] = Convert.ToInt32(split[2]); } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得堆垛机坐标!"; return null; } break; case 2://出库,取坐标 sql.Append( "SELECT FSTARTCELL FROM T_Manage_Task WHERE (FID = " ).Append( ManFID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( Mankind ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { split = dv[0]["FSTARTCELL"].ToString().Split(cc); stackCoo[0] = Convert.ToInt32(split[0]); stackCoo[1] = Convert.ToInt32(split[1]); stackCoo[2] = Convert.ToInt32(split[2]); } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得堆垛机坐标!"; return null; } break; case 3: sql .Append( "SELECT FSTARTCELL,FENDCELL FROM T_Manage_Task WHERE (FID = " ).Append( ManFID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( Mankind ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (dv[0]["FSTARTCELL"].ToString() != "-") { split = dv[0]["FSTARTCELL"].ToString().Split(cc); stackCoo[0] = Convert.ToInt32(split[0]); stackCoo[1] = Convert.ToInt32(split[1]); stackCoo[2] = Convert.ToInt32(split[2]); } if (dv[0]["FENDCELL"].ToString() != "-") { split = dv[0]["FENDCELL"].ToString().Split(cc); stackCoo[3] = Convert.ToInt32(split[0]); stackCoo[4] = Convert.ToInt32(split[1]); stackCoo[5] = Convert.ToInt32(split[2]); } } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得堆垛机坐标!"; return null; } break; default: break; } return stackCoo; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage调度任务的坐标有误!"+ex.StackTrace+ex.Message ; return null; } finally{ stackCoo = null; cc = null ; split=null ; dv.Dispose() ; } } /// /// 20101219根据是否在巷道取货,判断坐标 /// /// /// /// /// static int[] GetStackCoordinateFromManage(int Mankind, int ManFID,bool IfGetGoods) { int[] stackCoo = new int[6] { 0, 0, 0, 0, 0, 0 };//取排-列-层(Z-X-Y);送排-列-层(Z-X-Y) char[] cc = new char[1] { '-' }; string[] split = new string[3]; DataView dv = new DataView(); try { sql.Remove(0, sql.Length); switch (IfGetGoods) { case false://向巷道送货,送坐标 sql.Append("SELECT FENDCELL FROM T_Manage_Task WHERE (FID = ").Append(ManFID).Append(") AND (F_ManageTaskKindIndex = ").Append(Mankind).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { split = dv[0]["FENDCELL"].ToString().Split(cc); stackCoo[3] = Convert.ToInt32(split[0]); stackCoo[4] = Convert.ToInt32(split[1]); stackCoo[5] = Convert.ToInt32(split[2]); } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得堆垛机坐标!"; return null; } break; case true://在巷道取货,取坐标 sql.Append("SELECT FSTARTCELL FROM T_Manage_Task WHERE (FID = ").Append(ManFID).Append(") AND (F_ManageTaskKindIndex = ").Append(Mankind).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { split = dv[0]["FSTARTCELL"].ToString().Split(cc); stackCoo[0] = Convert.ToInt32(split[0]); stackCoo[1] = Convert.ToInt32(split[1]); stackCoo[2] = Convert.ToInt32(split[2]); } else { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage时没能从调度任务获得堆垛机坐标!"; return null; } break; default: break; } return stackCoo; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromManage调度任务的坐标有误!" +ex.StackTrace+ ex.Message; return null; } finally { stackCoo = null; cc = null; split = null; dv.Dispose(); } } /// /// 获得巷道的出入口处设备对应的堆垛机坐标取排-列-层(Z-X-Y);送排-列-层(Z-X-Y) /// /// 设备索引 /// 是否取货 /// static int[] GetStackCoordinateFromLaneGate(int stackIndex,int devIndex,bool ifGet) { char[] cc = new char[1] { '-' };//20100305 string[] split; int[] rt = new int[6] { 0,0,0,0,0,0}; DataView dv = new DataView(); int LaneWay = ccf.GetLaneWayFromLaneInfo(stackIndex); try { sql.Remove(0, sql.Length); //sql.Append("select * from T_Base_Lane_Gate where F_LaneGateDeviceIndex=" ).Append( devIndex ).Append( " and F_LaneIndex=").Append(LaneWay); #region HWHX 单巷道入库改动 //sql.Append("select * from T_Base_Lane_Gate where F_LaneGateDeviceIndex=").Append(devIndex);//需要更改因为不适用于弯道堆垛机 sql.Append("select * from T_Base_Lane_Gate where F_LaneGateDeviceIndex=").Append(devIndex).Append(" or F_CorrelDeviceIndex =").Append(devIndex); #endregion dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (ifGet == true)//取坐标 { //20100305 split = dv[0]["F_ZXY"].ToString().Split(cc); rt[0] = Convert.ToInt32(split[0]);//排Z rt[1] = Convert.ToInt32(split[1]);//列X rt[2] = Convert.ToInt32(split[2]);//层Y //20100305 } else//送坐标 { //20100305 split = dv[0]["F_ZXY"].ToString().Split(cc); rt[3] = Convert.ToInt32(split[0]);//排Z rt[4] = Convert.ToInt32(split[1]);//列X rt[5] = Convert.ToInt32(split[2]);//层Y //20100305 } } return rt; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetStackCoordinateFromLaneGate:" +ex.StackTrace+ ex.Message; return null; } finally { cc =null ; split=null ; rt =null ; dv.Dispose() ; } } /// /// 可变路径中的提升机,拆分任务时,不判断其是否被禁用或是故障 /// /// /// static bool GetChangeCheckForbiddenFromLaneGate( int devIndex ) { DataView dv = new DataView(); string sqlstr = string.Empty; try { sqlstr = string.Format("SELECT F_ChangeCheckForbidden FROM T_Base_Lane_Gate where F_ChangeCheckForbidden={0} ", devIndex);//在lanegate表中查找需要判断的lanegate dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dv.Count > 0) { return true; } sqlstr = string.Format("SELECT F_ChangeCheckForbidden FROM T_Base_RGV_Gate WHERE F_ChangeCheckForbidden={0}", devIndex);//在lanegate表中查找需要判断的lanegate dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dv.Count > 0) { return true; } return false; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetChangeCheckForbiddenFromLaneGate:" + ex.StackTrace + ex.Message; return false; } finally { dv.Dispose(); } } /// /// 获得设备的入库口探物光电的设备索引值 /// /// 设备索引 /// /// 20101118 static string GetBindingDeviceIndex(int devinx) { try { devinfo = Model.CGetInfo.GetDeviceInfo(devinx); if (devinfo.BindingDevice == null) return ""; return devinfo.BindingDevice; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetBindingDeviceIndex:" +ex.StackTrace+ ex.Message; return ""; } finally { devinfo = null; } } /// /// 获得输送机设备的出库口探物光电的设备索引值 /// /// 设备索引 /// /// 20101118 static string GetBindingDeviceIndexOut(int devinx) { try { devinfo = Model.CGetInfo.GetDeviceInfo(devinx); if (devinfo.BindingDeviceOut == null)return ""; return devinfo.BindingDeviceOut; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetBindingDeviceIndexOut:" +ex.StackTrace+ ex.Message; return ""; } finally { devinfo = null; } } /// ///被临近设备运行前检测的光电信号对应的设备索引组(故障,正转,反转,上升,下降等), /// 索引之间使用分号“;”隔开,索引前面加负号“-”表示需要检测值为“1”的信号 /// /// 设备索引 /// static string GetBeDetectedDevices(int devinx) { try { devinfo = Model.CGetInfo.GetDeviceInfo(devinx); return ";" + devinfo.BeDetected; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetBeDetectedDevices:" +ex.StackTrace+ ex.Message; return null ; } finally { devinfo = null; } } /// /// 获取输送机执行送出命令时,需要提前检测的光电开关设备索引 /// /// 设备索引 /// /// 20101118 static string GetSendOutDetect(int devinx) { try { devinfo = Model.CGetInfo.GetDeviceInfo(devinx); if (devinfo.SendOutDetect == null)return ""; return devinfo.SendOutDetect; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetSendOutDetect:" +ex.StackTrace+ ex.Message; return ""; } finally { devinfo = null; } } /// /// 获取设备是否逻辑有货 /// /// 设备索引 /// static string GetIfHaveGoods(int devinx) { DataView db = new DataView(); try { sql.Remove(0, sql.Length); sql .Append( "SELECT F_HaveGoods FROM T_Base_Device WHERE (F_DeviceIndex = " ).Append( devinx ).Append( ") and F_HaveGoods is not null"); db = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (db.Count > 0) { return db[0]["F_HaveGoods"].ToString(); } else return ""; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetIfHaveGoods:" +ex.StackTrace+ ex.Message; return ""; } finally { db.Dispose(); } } /// /// /// /// RGV地址的设备索引号 /// 是否是接货 /// static int GetRGVOrder(int devidx,bool IfGet) {//(2-左接货3-左送货)或者(4-右接货5-右送货) int order = 0; DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_IFChannelLeft, F_RGVGateDeviceIndex" ).Append( " FROM T_Base_RGV_Gate WHERE (F_RGVGateDeviceIndex = " ).Append( devidx ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (dv[0]["F_IFChannelLeft"].ToString() == "1") { if (IfGet == true) { order = 2; } else { order = 3; } } else { if (IfGet == true) { order = 4; } else { order = 5; } } } return order; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetRGVOrder:" +ex.StackTrace + ex.Message; return 0; } finally { dv.Dispose(); } } /// /// 获得AGV的前一个设备信息 /// 20090625 /// /// 路径子编号 /// AGV设备的路径序号 /// static List GetAGVPriorDevice(int CurRouteIDSub, int CurSerialNumber) { DataView dvRoute = new DataView(); List Device = new List(); try { sql.Remove(0, sql.Length); sql .Append( "SELECT T_Base_Route_Device.F_DeviceIndex,F_DeviceOrder, T_Base_Route_Device.F_SerialNumber, " ).Append( "T_Base_Device_Command.F_DeviceCommandIndex,T_Base_Device.F_DeviceKindIndex FROM T_Base_Device_Kind,T_Base_Device_Command " ).Append( ",T_Base_Device,T_Base_Route_Device where T_Base_Device_Command.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex" ).Append( " and T_Base_Device_Kind.F_DeviceKindIndex = T_Base_Device_Command.F_DeviceKindIndex and T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and F_RouteIDSub=" ).Append( CurRouteIDSub ).Append( " and F_SerialNumber < " ).Append( CurSerialNumber ).Append( " and F_GoodsMoveKindIndex=1 order by F_SerialNumber desc "); dvRoute = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvRoute.Count > 0) { Device.Add(Convert.ToInt32(dvRoute[0]["F_DeviceIndex"])); Device.Add(Convert.ToInt32(dvRoute[0]["F_DeviceKindIndex"])); Device.Add(Convert.ToInt32(dvRoute[0]["F_SerialNumber"])); Device.Add(Convert.ToInt32(dvRoute[0]["F_DeviceOrder"])); } return Device; } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.GetAGVPriorDevice:" +ex.StackTrace+ ex.Message; return null; } finally { Device=null ; dvRoute.Dispose(); } } /// /// 判断调度表T_Monitor_Task是否存在调度任务的设备和命令 /// /// 调度任务类型 /// 调度任务索引 /// 设备所引 /// 设备命令 /// public static bool DeviceAndOrderExitInMonitor(int Mankind, int ManFID, int DeviceIndex,int Order,int ArrowAddress,int [] coor) { DataView dv = new DataView(); string sqlstr = string.Empty; try { if (Order == -1) return true; sql.Remove(0, sql.Length); switch (ccf.GetDeviceKindIdx(DeviceIndex)) { case 1://堆垛机 sqlstr = string.Format(" AND F_NumParam1={0} AND F_NumParam2={1} AND F_NumParam3={2} AND F_NumParam4={3} AND F_NumParam5={4} AND F_NumParam6={5}", coor[0],coor[1],coor[2],coor[3],coor[4],coor[5]); sql .Append( "SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " ).Append( ManFID ).Append( ")" ).Append( " AND (F_ManageTASKKINDINDEX = " ).Append( Mankind ).Append( ") AND (F_DeviceIndex = " ).Append( DeviceIndex ).Append( ")" ).Append( " AND (F_DeviceCommandIndex = " ).Append( Order ).Append(sqlstr).Append( ")"); break; case 2://输送机 sql .Append( "SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " ).Append( ManFID ).Append( ")" ).Append( " AND (F_ManageTASKKINDINDEX = " ).Append( Mankind ).Append( ") AND (F_DeviceIndex = " ).Append( DeviceIndex ).Append( ")" ).Append( " AND (F_DeviceCommandIndex = " ).Append( Order ).Append( ")"); break; case 4://RGV sql .Append( "SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " ).Append( ManFID ).Append( ")" ).Append( " AND (F_ManageTASKKINDINDEX = " ).Append( Mankind ).Append( ") AND (F_DeviceIndex = " ).Append( DeviceIndex ).Append( ")" ).Append( " AND (F_DeviceCommandIndex = " ).Append( Order ).Append( ") and F_NumParam1=" ).Append( ArrowAddress ); break; case 6://AGV sql .Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " ).Append( ManFID ).Append( ")" ).Append( " AND (F_ManageTASKKINDINDEX = " ).Append( Mankind ).Append( ") AND (F_DeviceIndex = " ).Append( DeviceIndex ).Append( ")" ).Append( " AND (F_DeviceCommandIndex = " ).Append( Order ).Append( ")"); break; default: sql .Append( "SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " ).Append( ManFID ).Append( ")" ).Append( " AND (F_ManageTASKKINDINDEX = " ).Append( Mankind ).Append( ") AND (F_DeviceIndex = " ).Append( DeviceIndex ).Append( ")" ).Append( " AND (F_DeviceCommandIndex = " ).Append( Order ).Append( ")"); break; } dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.DeviceAndOrderExitInMonitor:" +ex.StackTrace+ ex.Message; return false; } finally { dv.Dispose(); } } /// /// 找到不能移动托盘的关键设备的前一个设备:例如,条码扫描器前一个位置(运动反方向)的输送机 /// /// 关键设备的前一个设备 /// 关键设备 /// static List NewCurDevice(List prirorDevice, List prirorKeydevice) {//0设备所引;1设备类型;2:路径序号;3:设备命令 DataView dv = new DataView(); try { if ((prirorKeydevice.Count > 0) && (prirorDevice.Count > 0)) { sql.Remove(0, sql.Length); sql.Append("SELECT F_GoodsMoveKindIndex, F_DeviceKindIndex FROM T_Base_Device_Kind WHERE " ).Append( "(F_DeviceKindIndex = " ).Append( prirorKeydevice[1] ).Append( ") and (F_GoodsMoveKindIndex=2)"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (Model.CGetInfo.GetDeviceInfo(prirorDevice[0]).UnControl != "1") { return prirorDevice; } else { return null; } } else { return null; } } else { return null; } } catch (Exception ex) { DisassembleTaskError = "ControlSystem.CDisassembleTask.NewCurDevice:" +ex.StackTrace+ ex.Message; return null; } finally { prirorDevice=null; prirorKeydevice=null; dv.Dispose(); } } /// /// 获取可用的目标位置:入库的巷道或者出库站台;同时修改调度任务为不可拆分状态 /// /// T_Manage_Task表的行记录 /// public static void GetUsableDestination(DataRowView dr) { DataView dvIO = new DataView(); DataTable dtd = new DataTable(); object ob; try { dr = dbo.ExceSQL(string.Format("SELECT * FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex = {1})", Convert.ToInt32(dr["FID"]), Convert.ToInt32(dr["F_ManageTaskKindIndex"]))).Tables[0].DefaultView[0];//20130620 //只修申请改调度任务的路径,不修改调度自动任务路径 if (dr["F_ManageTaskKindIndex"].ToString() != "1") return; string adviceDev = string.Empty; //20100610查找一个路径可用,任务数最少的终点设备 Dictionary advDev = new Dictionary(); //20091107 sql.Remove(0, sql.Length); sql.Append("select CONTROL_ID, CONTROL_STATUS from IO_Control where (CONTROL_ID = ").Append(Convert.ToInt32(dr["FID"])).Append(") AND ((CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKALTERROUTEAPPLY).Append(") or (CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKALTERROUTEREPLY).Append("))"); dvIO = dboM.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvIO.Count <= 0) { sql.Remove(0, sql.Length); sql.Append("SELECT F_TASKKIND, F_DESTINATION FROM T_Base_Destination WHERE (F_Warehouse='").Append(dr["FENDWAREHOUSE"]).Append("') and (F_TASKKIND = ").Append(dr["FCONTROLTASKTYPE"]).Append(") and (F_AbendStation=1) and (F_DESTINATION=").Append(dr["FENDDEVICE"]).Append(")"); dtd = dbo.ExceSQL(sql.ToString()).Tables[0]; if (dtd.Rows.Count > 0)//原来终点是应急站台那么还分配这个站台,不需要改变 { adviceDev = dtd.Rows[0]["F_DESTINATION"].ToString(); //20091005 return; } else { //查找可用目标位置 sql.Remove(0, sql.Length); sql.Append("SELECT F_TASKKIND, F_DESTINATION FROM T_Base_Destination WHERE (F_Warehouse='").Append(dr["FENDWAREHOUSE"]).Append("') and (F_TASKKIND = ").Append(dr["FCONTROLTASKTYPE"]).Append(") and (F_DESTINATION <>").Append(dr["FENDDEVICE"]).Append(") and (F_AbendStation=0)"); DataTable dt = dbo.ExceSQL(sql.ToString()).Tables[0]; if (dt.Rows.Count > 0) { for (int i = 0; i < dt.Rows.Count; i++) { if (CDisassembleTask.MinRouteID(Convert.ToInt32(dr["FSTARTDEVICE"]), Convert.ToInt32(dt.Rows[i]["F_DESTINATION"]), dr["FUseAwayFork"]) != -1) { //20100610统计到终点设备正在执行的任务数 sql.Remove(0, sql.Length); sql.Append("SELECT count(FENDDEVICE) as counts FROM T_Manage_Task where FENDDEVICE='").Append(dt.Rows[i]["F_DESTINATION"]).Append("' and fstatus>0"); ob = dbo.GetSingle(sql.ToString()); advDev.Add(Convert.ToInt32(dt.Rows[i]["F_DESTINATION"]), Convert.ToInt32(ob)); //20100610 adviceDev = dt.Rows[i]["F_DESTINATION"].ToString(); //break; } } if (advDev.Count == 0)//20100610 { return; } else {//20100610 int mincount = 9999; foreach (int aaa in advDev.Keys) { if (advDev[aaa] < mincount) { mincount = advDev[aaa]; adviceDev = aaa.ToString(); } } if (adviceDev == "") { return; } } } else { return; } } //DataView DV = dboM.ExceSQL("select IO_CONTROL_APPLY_SEQ.NEXTVAL FROM DUAL").Tables[0].DefaultView; //20101108int fid = dboM.GetManageTableIndex("IO_CONTROL_APPLY"); string dtime = DateTime.Now.ToString("u"); dtime = dtime.Substring(0, dtime.Length - 1); //20091128 dboM.TransBegin(); try { sql.Remove(0, sql.Length); sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKALTERROUTEAPPLY).Append(" where CONTROL_ID=").Append(dr["FID"]); dboM.ExceSQL(sql.ToString()); //向管理申请修改任务// int appid = dboM.GetManageTableIndex("IO_CONTROL_APPLY", true);//CONTROL_APPLY_ID sql.Remove(0, sql.Length); sql.Append("INSERT INTO IO_CONTROL_APPLY (CONTROL_APPLY_ID, CONTROL_ID,CONTROL_APPLY_TYPE,WAREHOUSE_CODE, STOCK_BARCODE, DEVICE_CODE, APPLY_TASK_STATUS, CREATE_TIME, ").Append( " CONTROL_APPLY_REMARK)").Append( "VALUES (").Append(appid).Append(",").Append(dr["FID"] + ",2,'" + dr["FENDWAREHOUSE"]).Append("','").Append(dr["FPALLETBARCODE"]).Append("','").Append(adviceDev).Append("',0,'").Append(dtime).Append("',null)"); dboM.ExceSQL(sql.ToString()); dboM.TransCommit(); //修改调度任务为不可拆分状态 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='-' where (FID = ").Append(Convert.ToInt32(dr["FID"])).Append(") AND (F_ManageTASKKINDINDEX =1)"); dbo.ExceSQL(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("CControl.GetUsableDestination", "拆分任务,向管理申请改道", "管理任务:" + dr["FID"].ToString(), "条码:" + dr["FPALLETBARCODE"].ToString().ToUpper()); } catch (Exception ex) { DisassembleTaskError = string.Format("拆分任务,向管理申请改道时:{0}", ex.StackTrace+ex.Message ); dboM.TransRollback(); } } } catch (Exception ex) { throw ex; } finally { dvIO.Dispose(); dtd.Dispose(); ob = null; } } public static void CreateRelativeMonitor(int manKind, int FID) {//20120906 //if (DoubleForkSingleCell(manKind, FID) == true) return; int relativeFID = -1; DataView dv=new DataView() ; DataView dvs=new DataView() ; try { sql.Remove(0, sql.Length); sql.Append("SELECT F_RELATIVECONTORLID FROM T_Manage_Task WHERE (FID = " ).Append( FID ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( manKind ).Append( ") and (F_RELATIVECONTORLID<>-1)"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { relativeFID = Convert.ToInt32(dv[0]["F_RELATIVECONTORLID"]); } else { return ; } //多叉关联调度任务在此拆分20100323 //获取多叉关联任务的路径和任务信息,递归调用CreateMonitor if (relativeFID != -1) { sql.Remove(0, sql.Length); sql.Append("SELECT T_Manage_Task.* FROM T_Manage_Task WHERE (F_RELATIVECONTORLID = ").Append(relativeFID).Append(") AND (F_ManageTaskKindIndex = ").Append(manKind).Append(") and (FIntoStepOK=0)"); dvs = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int j = 0; j < dvs.Count;j++ ) { int minrid = MinRouteID(Convert.ToInt32(dvs[j]["FSTARTDEVICE"]), Convert.ToInt32(dvs[j]["FENDDEVICE"]), dvs[j]["FUseAwayFork"]); if (minrid != -1) { if (CreateMonitor(manKind, Convert.ToInt32(dvs[j]["FID"]), minrid, dvs[j], 0) > 0) { //分解完成,修改T_Manage_Task表FIntoStepOK=1 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FIntoStepOK='1' where FID=").Append(dvs[j]["FID"] ).Append(" and F_ManageTaskKindIndex=").Append(dvs[0]["F_ManageTaskKindIndex"]); dbo.ExceSQL(sql.ToString()); CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null); OnDataChange("CreateRelativeMonitor", cea); } } } } } catch (Exception ex) { DisassembleTaskError = "CreateRelativeMonitor,"+ex.StackTrace+ex.Message ; } finally { dv.Dispose(); dvs.Dispose(); } } /// /// 找到一个双叉最合适货位,修改关联关系 /// /// public static void GetOutDoubleForkTask(DataRowView dr) {//sqlser的 SUBSTRING(express1,1开始,2);C#的.Substring(0开始, 2) DataView dv = new DataView(); try { //20170104 出库任务数量限制,不能关联出库任务 if (ccf.GetTaskCountsCanDisassembleToEndDevice(Convert.ToInt32(dr["FID"]), Convert.ToInt32(dr["FENDDEVICE"])) == false) return; dr = dbo.ExceSQL(string.Format("SELECT * FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex = {1})", Convert.ToInt32(dr["FID"]), Convert.ToInt32(dr["F_ManageTaskKindIndex"]))).Tables[0].DefaultView[0];//20130620 if (dr["F_RELATIVECONTORLID"].ToString() != "-1") return; int forwlimitX = 0, backlimitX = 0; sql.Remove(0, sql.Length); sql.Append("SELECT F_ForwardLimitX, F_BackLimitX FROM T_Base_LaneInfo WHERE (F_LaneDeviceIndex = ").Append(dr["FLANEWAY"]).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { forwlimitX = Convert.ToInt32(dv[0]["F_ForwardLimitX"]); backlimitX = Convert.ToInt32(dv[0]["F_BackLimitX"]); } else return; int forkamount = 1; sql.Clear(); sql.Append("SELECT F_ForkAmount FROM T_Base_StackInfo WHERE F_StackIndex = ").Append(Convert.ToInt32(dr["FSTACK"])); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { forkamount = Convert.ToInt32(dv[0]["F_ForkAmount"])-1; } else return; StringBuilder sqladd = new StringBuilder(" "); if (forwlimitX.ToString() == dr["FStartCol"].ToString()) { sqladd.Append(" and FStartCol <>").Append(forwlimitX).Append(" "); } else if (backlimitX.ToString() == dr["FStartCol"].ToString()) { sqladd.Append(" and FStartCol <>").Append(backlimitX).Append(" "); } else { sqladd.Append(" "); } //列的速度是层的速度的3倍,所以层的差值要乘以三(提升一层的时间相当于移动三列的时间) sql.Remove(0, sql.Length); if (CStaticClass.DBFactory == "OracleDBFactory") {//20151120调度系统oracle的特殊语句 sql.Append("SELECT ").Append(" F_ManageTaskKindIndex, FID, MIN(POWER(FStartCol - ").Append(dr["FStartCol"]).Append(", 2) + POWER((FStartLayer - ").Append( dr["FStartLayer"]).Append(") * 3, 2)) AS Expr1 FROM T_Manage_Task WHERE (FIntoStepOK = '0') AND rownum<=").Append(forkamount).Append( " and (FSTATUS = 0 and FUseAwayFork<>'3') AND (FCONTROLTASKTYPE = ").Append(dr["FCONTROLTASKTYPE"]).Append(") AND (FLOGIC_AREA = '").Append(dr["FLOGIC_AREA"]).Append( "') AND (FCONTORL_BATCH = '").Append(dr["FCONTORL_BATCH"]).Append("') AND (FLANEWAY = ").Append(dr["FLANEWAY"]).Append( ") AND (F_RELATIVECONTORLID = - 1) and F_ManageTaskKindIndex=").Append(dr["F_ManageTaskKindIndex"]).Append(" and FID<>").Append(dr["fid"]).Append( sqladd.ToString()).Append(" GROUP BY F_ManageTaskKindIndex, FID order by Expr1 asc"); } else {//20151120调度系统SQLServer的特殊语句 sql.Append("SELECT TOP ").Append(forkamount).Append(" F_ManageTaskKindIndex, FID, MIN(POWER(FStartCol - ").Append(dr["FStartCol"]).Append(", 2) + POWER((FStartLayer - ").Append( dr["FStartLayer"]).Append(") * 3, 2)) AS Expr1 FROM T_Manage_Task WHERE (FIntoStepOK = '0') AND ").Append( "(FSTATUS = 0 and FUseAwayFork<>'3') AND (FCONTROLTASKTYPE = ").Append(dr["FCONTROLTASKTYPE"]).Append(") AND (FLOGIC_AREA = '").Append(dr["FLOGIC_AREA"]).Append( "') AND (FCONTORL_BATCH = '").Append(dr["FCONTORL_BATCH"]).Append("') AND (FLANEWAY = ").Append(dr["FLANEWAY"]).Append( ") AND (F_RELATIVECONTORLID = - 1) and F_ManageTaskKindIndex=").Append(dr["F_ManageTaskKindIndex"]).Append(" and FID<>").Append(dr["fid"]).Append( sqladd.ToString()).Append(" GROUP BY F_ManageTaskKindIndex, FID order by Expr1 asc"); } dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(dr["fid"]).Append(" where FID=").Append(dv[i]["FID"]).Append(" and F_ManageTaskKindIndex=").Append(dr["F_ManageTaskKindIndex"]); dbo.ExecuteSql(sql.ToString()); } sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(dr["fid"]).Append(" where FID=").Append(dr["fid"]).Append(" and F_ManageTaskKindIndex=").Append(dr["F_ManageTaskKindIndex"]); dbo.ExecuteSql(sql.ToString()); } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 20110412是否存在不同的逻辑区域未通过条码分道 /// /// 逻辑区域 /// public static bool IfExitElseAreaTask(int mankind,int FID) { DataView dv = new DataView(); try { object ob = dbo.GetSingle(string.Format("select FLOGIC_AREA from T_Manage_Task where F_ManageTaskKindIndex={0} and FID={1} and FCONTROLTASKTYPE=2 and FLOGIC_AREA>'20000'", mankind, FID)); if (ob != null) { sql.Remove(0, sql.Length); sql.Append("SELECT F_NumParam4 FROM T_Manage_Task ,T_Monitor_Task where F_NumParam4=12030 and T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX AND T_Manage_Task.FID = T_Monitor_Task.F_ManageTaskIndex and FCONTROLTASKTYPE=2 and T_Monitor_Task.F_ManageTaskKindIndex=1 and FLOGIC_AREA>'20000' and FLOGIC_AREA <>'").Append(ob.ToString()).Append("'");//and FSTATUS>020110412 dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } else { return false; } } catch (Exception ex) { DisassembleTaskError = string.Format("拆分任务时,判断是否存在同一逻辑区域且不同批号的出库任务:{0}", ex.StackTrace+ex.Message ); return false; } finally { dv.Dispose(); } } static bool GetUAreaOutputDevice(int StackIndex,int UCode,out int OutputUdevice,out string OutputUZxy) { DataView dv = new DataView(); OutputUdevice = 0; OutputUZxy = "-"; try { dv = dbo.ExceSQL(string.Format("SELECT DISTINCT F_OutputUDevice, F_OutputUZxy FROM T_Base_UArea,ST_CELL where T_Base_UArea.F_UCODE = ST_CELL.FUCODE and (T_Base_UArea.F_UCODE = {0}) AND (ST_CELL.FStack = {1})", UCode, StackIndex)).Tables[0].DefaultView; if (dv.Count > 0) { OutputUdevice = Convert.ToInt32(dv[0]["F_OutputUDevice"]); OutputUZxy = dv[0]["F_OutputUZxy"].ToString(); } return true; } catch (Exception ex) { DisassembleTaskError = string.Format("CDisassembleTask.GetUAreaOutputDevice错误:{0}", ex.StackTrace+ex.Message ); return false; } finally { dv.Dispose(); } } static bool GetUAreaInputDevice(int StackIndex,int UCode, out int InputUdevice, out string InputUZxy) { DataView dv = new DataView(); InputUdevice = 0; InputUZxy = "-"; try { dv = dbo.ExceSQL(string.Format("SELECT DISTINCT F_InputUDevice, F_InputUZxy FROM T_Base_UArea,ST_CELL where T_Base_UArea.F_UCODE = ST_CELL.FUCODE and (T_Base_UArea.F_UCODE = {0}) AND (ST_CELL.FStack = {1})", UCode, StackIndex)).Tables[0].DefaultView; if (dv.Count > 0) { InputUdevice = Convert.ToInt32(dv[0]["F_InputUDevice"]); InputUZxy = dv[0]["F_InputUZxy"].ToString(); } return true; } catch (Exception ex) { DisassembleTaskError = string.Format("CDisassembleTask.GetUAreaOutputDevice错误:{0}", ex.StackTrace+ex.Message ); return false; } finally { dv.Dispose(); } } static bool DoubleForkSingleCell(int manKind,int FID) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT T_Manage_Task.FID FROM T_Manage_Task ,ST_CELL WHERE T_Manage_Task.FSTARTWAREHOUSE = ST_CELL.FWAREHOUSE AND T_Manage_Task.FSTARTCELL = ST_CELL.FCELLCODE and ST_CELL.FDoubleFork = '3' AND T_Manage_Task.FID = {1} AND T_Manage_Task.F_ManageTaskKindIndex = {0}", manKind, FID)).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { dv = dbo.ExceSQL(string.Format("SELECT T_Manage_Task.FID FROM T_Manage_Task ,ST_CELL WHERE T_Manage_Task.FENDWAREHOUSE = ST_CELL.FWAREHOUSE AND T_Manage_Task.FENDCELL = ST_CELL.FCELLCODE and ST_CELL.FDoubleFork = '3' AND T_Manage_Task.FID = {1} AND T_Manage_Task.F_ManageTaskKindIndex = {0}", manKind, FID)).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } static int GetBarcodeDeviceFromBindDevice(int barcodeBindDevice) { DataView ob = new DataView(); try { ob = dbo.ExceSQL(string.Format("SELECT F_DeviceIndex FROM T_Base_PLC_Ask WHERE (F_BindingDevice = {0})", barcodeBindDevice)).Tables[0].DefaultView; if (ob.Count > 0) { return Convert.ToInt32(ob[0][0]); } else { return 0; } } catch (Exception ex) { throw ex; } finally { ob.Dispose(); } } static int GetSameStartDeviceEnddeviceRouteID(int startdevice, int enddevice) { DataView dv=new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT distinct(T_Base_Route_Device.F_RouteIDSub) FROM T_Base_Device,T_Base_Route_Device,").Append( "T_Base_Route where T_Base_Route_Device.F_RouteID = T_Base_Route.F_RouteID and ").Append( " T_Base_Route_Device.F_DeviceIndex = T_Base_Device.F_DeviceIndex and ").Append( " F_StartDevice=").Append(startdevice).Append(" and F_EndDevice=").Append(enddevice).Append(" and F_StartDevice=F_EndDevice"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][0]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } #region zcy private static string ConveyorAheadDetect(int curDevice, int nextDevice, int arrowDevice, int command) { StringBuilder RunningLock = new StringBuilder(); StringBuilder AheadDetect = new StringBuilder(); StringBuilder Error = new StringBuilder(); RunningLock.Remove(0, RunningLock.Length); AheadDetect.Remove(0, AheadDetect.Length); string tw; AheadDetect.Append(GetBeDetectedDevices(curDevice));//CurDevice空闲 if (curDevice == arrowDevice || arrowDevice == 0) {//输送机的起点设备和终点设备相同时,目标设备索引置为零 if (command == 1)//正转/入库 { //AheadDetect.Append(GetBindingDeviceIndex(curDevice, CHECK_HAVE_GOODS)); //CurDevice货架远侧有探物 //tw = GetBindingDeviceIndexOut(curDevice, CHECK_NO_GOODS); //CurDevice货架近侧无探物 //if (tw != "") //{ // AheadDetect.Append(tw.ToString()); //} //else //{ // //AheadDetect.Remove(0, AheadDetect.Length); // Error.Append(curDevice).Append("BindingDevice提前检测不正确,请检查数据库配置"); //} } if (command == 2)//反转/出库 { //AheadDetect.Append(GetBindingDeviceIndex(curDevice, CHECK_NO_GOODS)); //CurDevice货架远侧无探物 //tw = GetBindingDeviceIndexOut(curDevice, CHECK_HAVE_GOODS); //CurDevice货架近侧有探物 //if (tw != "") //{ // AheadDetect.Append(tw.ToString()); //} //else //{ // //AheadDetect.Remove(0, AheadDetect.Length); // Error.Append(curDevice).Append("BindingDeviceOut提前检测不正确,请检查数据库配置"); //} } string[] cdi = ccf.GetOwnCorrel_DeviceInfo(curDevice); if (null != cdi /*&& command == 2*/) { if (cdi[2] != "") { AheadDetect.Append(";D-").Append(cdi[2]); } } //CurDevice空闲在前面 if 外面 } else {//输送机的起点设备和终点设备不同时 #region curDevice tw = GetSendOutDetect(curDevice); //送出只需要检测SendOut,不需要检测 BindingDevice 和 BindingDeviceOut if (tw != "") { AheadDetect.Append(tw.ToString()); } else { //AheadDetect.Remove(0, AheadDetect.Length); Error.Append(curDevice).Append("SendOut提前检测不正确,请检查数据库配置"); } //20201128检测输送线的顶升机构在顶升低位,堆垛机允许输送线动作 string[] cdi = ccf.GetOwnCorrel_DeviceInfo(curDevice); if (null != cdi) { if (cdi[2] != "") { AheadDetect.Append(";D-").Append(cdi[2]); } //if (cdi[4] != "") //{ // AheadDetect.Append(";D").Append(cdi[4]); //} if (cdi[1] != "") { AheadDetect.Append(";D-").Append(cdi[1]); } if (cdi[5] != "") { AheadDetect.Append(";D").Append(cdi[5]); } if (cdi[6] != "") { AheadDetect.Append(";D").Append(cdi[6]); } if (cdi[3] != "") { AheadDetect.Append(";D-").Append(cdi[3]);//检测是否有货 } } #endregion #region nextDevice //下节输送线远、近都检测无货,不需要判断是否为空 //AheadDetect.Append(GetBindingDeviceIndex(nextDevice, CHECK_NO_GOODS)); //nextDevice货架远侧无探物 //AheadDetect.Append(GetBindingDeviceIndexOut(nextDevice, CHECK_NO_GOODS));//nextDevice货架远侧无探物 AheadDetect.Append(GetBeDetectedDevices(nextDevice)); //nextDevice空闲idle //20201128检测输送线的顶升机构在顶升低位,堆垛机允许输送线动作 cdi = ccf.GetOwnCorrel_DeviceInfo(nextDevice); if (null != cdi) { if (cdi[2] != "") { AheadDetect.Append(";D-").Append(cdi[2]); } //if (cdi[4] != "") //{ // AheadDetect.Append(";D").Append(cdi[4]); //} } #endregion } return AheadDetect.ToString(); } #endregion } }