using System; using System.Collections.Generic; using System.Text; using System.Data; using DBFactory; namespace Model { public static class CGeneralFunction { static StringBuilder sql = new StringBuilder(); static DBOperator dbo = CGetInfo.dbo; static DBOperator dboM = CGetInfo.dboM; static Model.MDevice devinfo; /// /// 20120616多叉关联任务是否能和monitorIndex同步运行;返回多叉关联任务的设备指令索引数组(多个任务号,包括自己),如果只返回自己(数组只有自己一个任务号)代表关联任务还没有拆分完毕,等待 /// /// 设备指令索引 /// 多叉关联任务的设备指令索引数组,如果返回自己代表关联任务还没有拆分完毕,等待 public static int[] MutiForkIfSync(int monitorIndex, int devIndex, int devKind) {//查找关联的调度任务(主任务或者辅助任务);输送机与堆垛机区别对待 //如果只能找到关联任务未被拆分,那么认为能同步运行20100323 int mankind = GetManageTaskKindIndexFromMonitor(monitorIndex); int FID = GetManageTaskIndexfromMonitor(monitorIndex); int devOrder = GetDeviceOrderFromMonitor(monitorIndex); Dictionary mutiTaskZxyForkNo = GetMutiForkTaskZxyForkNo(mankind,FID,devIndex,devOrder); if (mutiTaskZxyForkNo == null) return null; int[] monitortask; List mt = new List(); if (GetMutiForkUnIntoStep(monitorIndex) == true) {//此项只在提前检测时使用 monitortask = new int[1] { monitorIndex }; return monitortask; } int[] zxy,zxy1; switch (devKind) { case 1: //堆垛机的同排,同层,临列可以同步并且ST_CELL的FDoubleFork值匹配 zxy = mutiTaskZxyForkNo[monitorIndex]; foreach (int mtask1 in mutiTaskZxyForkNo.Keys) { zxy1 = mutiTaskZxyForkNo[mtask1]; if (monitorIndex != mtask1) { if ((zxy[0] == zxy1[0]) && (zxy[2] == zxy1[2]) && ((zxy[1] - zxy1[1]) == (zxy[3] - zxy1[3]))) {//同排、层,货叉序号差值==列差值,同步出叉 //判读紧接着的后续输送指令对应的目标位置,是否出现交叉 //判读堆垛机送货指令之后的输送机送出目标是否相同 if (5==devOrder)//20180915 { int lanegate=0,lanegate1=0; string cell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[0], zxy[1], zxy[2]);//lanegate 坐标 string arrowdevice = GetArrowDeviceIndexFromLaneGate(cell, out lanegate);//lanegate同侧目标输送机 string taskarrow = GetArrowDeviceIndexFromT_Monitor_Task(FID, mankind, lanegate, 6);//lanegate在任务中的目标输送机 //查找lanegate 的送出目标 string cell1 = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy1[0], zxy1[1], zxy1[2]); string arrowdevice1 = GetArrowDeviceIndexFromLaneGate(cell1, out lanegate1); int FID1 = GetManageTaskIndexfromMonitor(mtask1); string taskarrow1 = GetArrowDeviceIndexFromT_Monitor_Task(FID1, mankind, lanegate1, 6); if (arrowdevice != arrowdevice1)//lanegate同侧目标输送机 不同 { if (taskarrow==arrowdevice1&&taskarrow1==arrowdevice)//出现交叉,不能同步 { continue; } } // 送货指令要是第一指令 ,20190424 bool iffirst = GetIfFirstMonitorTask(FID1, mankind,mtask1); if(!iffirst) { continue; } //获取输送任务的终点 //获取送货站台对应arrowdevice } if (mt.Contains(monitorIndex) == false) { mt.Add(monitorIndex); } if (mt.Contains(mtask1) == false) { mt.Add(mtask1); } } } } if (mt.Count > 0) { monitortask = mt.ToArray(); return monitortask; } else { return null; } case 2: //输送机同步 foreach (int mtask in mutiTaskZxyForkNo.Keys) { if (mt.Contains(mtask) == false) { mt.Add(mtask); } } if (mt.Count >= 1) { monitortask = mt.ToArray(); return monitortask; } else { return null; } case 6: if (devOrder==6)//搬运出库20170713 { foreach (int mtask in mutiTaskZxyForkNo.Keys) { if (mt.Contains(mtask) == false) { mt.Add(mtask); } } if (mt.Count >= 1) { monitortask = mt.ToArray(); return monitortask; } else { return null; } } else { if (EqualAGVGateDoubleFork(mankind, FID, devIndex, devOrder) == true) { return null; } else { return null; } } default: return null; } } public static string GetArrowDeviceIndexFromLaneGate(string cell, out int LaneGateDeviceIndex) { DataView dv = new DataView(); try { LaneGateDeviceIndex = 0; dv = dbo.ExceSQL(string.Format("SELECT F_LaneGateDeviceIndex,F_ArrowDevice FROM T_Base_Lane_Gate where F_ZXY='{0}' ", cell)).Tables[0].DefaultView; if (dv.Count > 0) { LaneGateDeviceIndex = Convert.ToInt32(dv[0]["F_LaneGateDeviceIndex"]); return Convert.ToString(dv[0]["F_ArrowDevice"]); } else { LaneGateDeviceIndex = 0; return "";//别返回-1,这个- liKe货位里面的- } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } public static bool GetIfFirstMonitorTask(int taskindex,int fid,int taskkind)//20190424 { DataView dv = new DataView(); try { string sqlin =string.Format( "SELECT F_MonitorIndex FROM T_Monitor_Task where F_ManageTaskIndex ={0} and F_ManageTASKKINDINDEX={1} and F_MonitorIndex <{2} ",fid,taskkind,taskindex); dv = dbo.ExceSQL(sqlin).Tables[0].DefaultView; if (dv.Count > 0) { return false ;//不是第一指令 } else { return true;// } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } public static string GetArrowDeviceIndexFromT_Monitor_Task(int FID , int mankind,int DeviceIndex ,int order) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT F_NumParam4 FROM T_Monitor_Task where F_ManageTaskIndex={0} and F_ManageTASKKINDINDEX={1} and F_DeviceIndex={2} and F_DeviceCommandIndex={3} ", FID, mankind, DeviceIndex, order)).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToString(dv[0]["F_NumParam4"]); } else { return "";// } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 获得双叉控制的堆垛机的送货任务(已经分配远货叉或者近货叉的任务)的值 /// /// 设备指令索引 /// public static string GetUseAwayFork(int monitorIndex) { sql.Remove(0, sql.Length); sql.Append("SELECT F_UseAwayFork FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(monitorIndex ).Append(")"); DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return dv[0][0].ToString(); } else { return "-"; } } /// /// 获取双叉控制的堆垛机的取货任务(尚未指定应该使用哪个货叉)是否使用远货叉(主货叉):0,近货叉;1远货叉 /// /// 排 /// 列 /// 层 /// 库房索引 /// 任务类型 /// 调度任务索引 /// 设备索引 /// 指令 /// public static int GetUseAwayFork(int monitorIndex,int devIndex, int devOrder) { int z = GetZCoorFromMonitor(monitorIndex, devIndex, devOrder); int x = GetXCoorFromMonitor(monitorIndex, devIndex, devOrder); int y = GetYCoorFromMonitor(monitorIndex, devIndex, devOrder); string FWAREHOUSE=GetWAREHOUSEFromSTCELL(devIndex); int Mankind=GetManageTaskKindIndexFromMonitor(monitorIndex); int ManFID=GetManageTaskIndexfromMonitor(monitorIndex); DataView dv = new DataView(); int UseAwayFork = 1; try { sql.Remove(0, sql.Length); sql.Append("SELECT FDoubleFork FROM ST_CELL WHERE (FWAREHOUSE='" ).Append( FWAREHOUSE ).Append( "') and (F_Z = " ).Append( z ).Append( ") AND (F_X = " ).Append( x ).Append( ") AND (F_Y = " ).Append( y ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { UseAwayFork = Convert.ToInt32(dv[0][0]); } else { UseAwayFork = 0; } switch (UseAwayFork) { case 0://可用任何一个货叉: int xcoor = GetDoubleForkX(Mankind, ManFID, devIndex, devOrder); if (xcoor != -1) { //根据关联任务的货位判断使用近货叉(列坐标小)或者远货叉(列坐标大) if (xcoor != x) { if (xcoor < x) { UseAwayFork = 1; } else { UseAwayFork = 0; } } else { //列坐标相同的,判断层坐标,近货叉(层坐标小)或者远货叉(层坐标大) int ycoor = GetDoubleForkY(Mankind, ManFID, devIndex, devOrder); if (ycoor != -1) { if (ycoor != y) { if (ycoor < y) { UseAwayFork = 1; } else { UseAwayFork = 0; } } else { //列和层都相同的,判断排坐标,近货叉(排坐标小)或者远货叉(排坐标大) int zcoor = GetDoubleForkZ(Mankind, ManFID, devIndex, devOrder); if (zcoor != -1) { if (zcoor != z) { if (zcoor < z) { UseAwayFork = 1; } else { UseAwayFork = 0; } } } } } } } else { UseAwayFork = 1; } break; case 1://只能用近叉 UseAwayFork = 0; break; case 2://只能用远叉 UseAwayFork = 1; break; } return UseAwayFork; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); ; } } /// /// 返回距离原点位置的斜边平方 /// /// /// /// /// public static double GetMinZeroDistance(int monitorIndex,Model.MDevice devinfo, int devOrder) { int x = GetXCoorFromMonitor(monitorIndex, devinfo.DeviceIndex, devOrder); int y = GetYCoorFromMonitor(monitorIndex, devinfo.DeviceIndex, devOrder); int xzero=0,yzero=0; if (devinfo.StackZeroColLayer != "") { char[] cc = new char[1] { ',' }; string[] xy = devinfo.StackZeroColLayer.Split(cc); if (xy.GetLength(0) <= 1) return -1; xzero = Convert.ToInt32(xy[0]); yzero = Convert.ToInt32(xy[1]); return Math.Pow(Convert.ToDouble( x - xzero), 2) + Math.Pow(Convert.ToDouble(y - yzero), 2); } else { return -1; } } public static void GetMinZeroDistanceTask(int[] mtasks , Model.MDevice devinfo, int devOrder,out int mintask ,out double minDist) { minDist = 0; mintask = 0; double temp = 0; minDist = 0; foreach (int monitorIndex in mtasks) { int x = GetXCoorFromMonitor(monitorIndex, devinfo.DeviceIndex, devOrder); int y = GetYCoorFromMonitor(monitorIndex, devinfo.DeviceIndex, devOrder); int xzero = 0, yzero = 0; if (devinfo.StackZeroColLayer != "") { char[] cc = new char[1] { ',' }; string[] xy = devinfo.StackZeroColLayer.Split(cc); xzero = Convert.ToInt32(xy[0]); yzero = Convert.ToInt32(xy[1]); temp = Math.Pow(Convert.ToDouble(x - xzero), 2);// 20130704 +Math.Pow(Convert.ToDouble(y - yzero), 2) } if (temp <= minDist) { minDist = temp; mintask = monitorIndex; } else { if (minDist == 0) { minDist = temp; mintask = monitorIndex; } } } } public static int GetDoubleForkFromST_CELL(int z, int x, int y, string FWAREHOUSE) { DataView dv = new DataView();; int UseAwayFork = 1; try { sql.Remove(0, sql.Length); sql.Append("SELECT FDoubleFork FROM ST_CELL WHERE (FWAREHOUSE='" ).Append( FWAREHOUSE ).Append( "') and (F_Z = " ).Append( z ).Append( ") AND (F_X = " ).Append( x ).Append( ") AND (F_Y = " ).Append( y ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { UseAwayFork = Convert.ToInt32(dv[0][0]); } else { sql.Remove(0, sql.Length); string cell = string.Format("{0:D2}-{1:D2}-{2:D2}", z, x, y); sql.Append("SELECT F_UseAwayFork FROM T_Base_Lane_Gate WHERE F_UseAwayFork is not null and F_ZXY='").Append(cell).Append("'"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0)//找到 { int a ; if (int.TryParse(dv[0][0].ToString(), out a)) { UseAwayFork = Convert.ToInt32(dv[0][0]); } else { UseAwayFork = 0; } } else { UseAwayFork = 0; } } return UseAwayFork; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } public static string GetWAREHOUSEFromSTCELL(int stackIndex) { DataView dv=new DataView(); try { devinfo = Model.CGetInfo.GetDeviceInfo(stackIndex); if (devinfo != null) { if (devinfo.VirtualStack > 0) { stackIndex = devinfo.VirtualStack; } } sql.Remove(0, sql.Length); sql.Append("SELECT FWAREHOUSE FROM ST_CELL WHERE (FStack = " ).Append( stackIndex ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return dv[0][0].ToString(); } else { return ""; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 查找多叉关联任务的列坐标 /// /// 任务类型 /// 调度任务索引 /// 设备索引 /// 设备指令 /// public static int GetDoubleForkX(int mankind, int fid, int devIdx, int devOrder) { DataView dv = new DataView(); ; string xc = "F_NumParam2"; if (GetDeviceKindIdx(devIdx) == 1) { if (devOrder == 4) { xc = "F_NumParam2"; } else if (devOrder == 5) { xc = "F_NumParam5"; } } 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( ")"); DataView dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count == 0) return -1; sql.Remove(0, sql.Length); sql.Append("SELECT " ).Append( xc ).Append( " FROM T_Monitor_Task Where ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ") AND (T_Monitor_Task.F_ManageTaskIndex=" ).Append( dv0[0]["F_RELATIVECONTORLID"] ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][xc]); } sql.Remove(0, sql.Length); sql.Append("select T_Manage_Task.FID from T_Manage_Task where (T_Manage_Task.F_ManageTaskKindIndex = ").Append(mankind).Append(") AND (F_RELATIVECONTORLID = " ).Append( fid ).Append( ")"); dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count == 0) return -1; //查找关联自己的主设备指令索引的列坐标 sql.Remove(0, sql.Length); sql.Append("SELECT ").Append(xc).Append(" FROM T_Monitor_Task Where ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ") and (T_Monitor_Task.F_ManageTaskIndex= " ).Append( dv0[0]["FID"] ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][xc]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 查找多叉关联任务的层坐标 /// /// 任务类型 /// 调度任务索引 /// 设备索引 /// 设备指令 /// public static int GetDoubleForkY(int mankind, int fid, int devIdx, int devOrder) { DataView dv = new DataView(); string yc = "F_NumParam3"; if (GetDeviceKindIdx(devIdx) == 1) { if (devOrder == 4) { yc = "F_NumParam3"; } else if (devOrder == 5) { yc = "F_NumParam6"; } } 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 ); DataView dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count == 0) return -1; //查找被关联辅助设备指令索引的层坐标 sql.Remove(0, sql.Length); sql.Append("SELECT " ).Append( yc ).Append( " FROM T_Monitor_Task Where (T_Monitor_Task.F_ManageTaskIndex=" ).Append( dv0[0]["F_RELATIVECONTORLID"] ).Append( " " ).Append( " ) and ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][yc]); } sql.Remove(0, sql.Length); sql.Append("select FID from T_Manage_Task where F_RELATIVECONTORLID = " ).Append( fid ).Append( " and F_ManageTaskKindIndex=" ).Append( mankind ); dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count == 0) return -1; //查找关联自己的主设备指令索引的层坐标 sql.Remove(0, sql.Length); sql.Append("SELECT " ).Append( yc ).Append( " FROM T_Monitor_Task Where (T_Monitor_Task.F_ManageTaskIndex=" ).Append( dv0[0]["FID"] ).Append( " " ).Append( ") and ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][yc]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 查找多叉关联任务的排坐标 /// /// 任务类型 /// 调度任务索引 /// 设备索引 /// 设备指令 /// public static int GetDoubleForkZ(int mankind, int fid, int devIdx, int devOrder) { DataView dv = new DataView(); string zc = "F_NumParam1"; if (GetDeviceKindIdx(devIdx) == 1) { if (devOrder == 4) { zc = "F_NumParam1"; } else if (devOrder == 5) { zc = "F_NumParam4"; } } try { //查找被关联辅助设备指令索引的排坐标 sql.Remove(0, sql.Length); sql.Append("SELECT ").Append(zc).Append(" FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.F_RELATIVECONTORLID = T_Monitor_Task.F_ManageTaskIndex " ).Append( " AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") AND (FID = " ).Append( fid ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][zc]); } //查找关联自己的主设备指令索引的排坐标 sql.Remove(0, sql.Length); sql.Append("SELECT ").Append(zc).Append(" FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.FID = T_Monitor_Task.F_ManageTaskIndex " ).Append( " AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") AND (F_RELATIVECONTORLID = " ).Append( fid ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][zc]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } public static Dictionary GetMutiForkTaskZxyForkNo(int mankind, int fid, int devIdx, int devOrder) {//20120616 Dictionary rettask = new Dictionary(); DataView dv = new DataView(); DataView dv1 = new DataView(); int RELATIVECONTORLID=-1; string zc = "F_NumParam1"; string xc = "F_NumParam2"; string yc = "F_NumParam3"; StringBuilder devstr= new StringBuilder(" and F_DeviceIndex=").Append(devIdx); if (GetDeviceKindIdx(devIdx) == 1) { if (devOrder == 4) { zc = "F_NumParam1"; xc = "F_NumParam2"; yc = "F_NumParam3"; } else if (devOrder == 5) { zc = "F_NumParam4"; xc = "F_NumParam5"; yc = "F_NumParam6"; } } else if (GetDeviceKindIdx(devIdx) == 6) {//1运行,2取货,3送货,4取送货,5允许AGV移载 if (devOrder == 2) { zc = "F_NumParam1"; xc = "F_NumParam2"; yc = "F_NumParam3"; } else if (devOrder == 3) { zc = "F_NumParam4"; xc = "F_NumParam5"; yc = "F_NumParam6"; } else { zc = "F_NumParam1"; xc = "F_NumParam2"; yc = "F_NumParam3"; } } else if (GetDeviceKindIdx(devIdx) == 2) { int length=devIdx.ToString().Length; string devicetemp = devIdx.ToString(); if (length>5) { devicetemp = devIdx.ToString().Substring(0, 5); } devstr = new StringBuilder(" and F_DeviceIndex like '%").Append(devicetemp).Append("%'"); } 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>0"); DataView dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count == 0) return null ; RELATIVECONTORLID = Convert.ToInt32(dv0[0]["F_RELATIVECONTORLID"]); sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex,").Append(zc).Append(",").Append(xc).Append(",").Append(yc) .Append(",F_UseAwayFork,T_Manage_Task.F_ManageTaskKindIndex,fid FROM T_Monitor_Task,T_Manage_Task Where ( T_Monitor_Task.F_ManageTaskKindIndex = ").Append(mankind ).Append(")").Append(devstr.ToString()).Append(" and F_DeviceCommandIndex=") .Append(devOrder).Append(" AND (F_RELATIVECONTORLID=").Append(RELATIVECONTORLID).Append(")") .Append(" and T_Monitor_Task.F_ManageTaskIndex=FID"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { for (int i = 0; i < dv.Count; i++) { //int rmankind = Convert.ToInt32(dv[i]["F_ManageTaskKindIndex"]); //int rman = Convert.ToInt32(dv[i]["fid"]); //sql.Remove(0, sql.Length); //sql.Append("SELECT MIN(F_MonitorIndex) AS mmi FROM dbo.T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(rman).Append(") AND (F_ManageTASKKINDINDEX = ").Append(rmankind).Append(")"); //dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //if (dv1.Count > 0) //{ // if ((dv1[0]["mmi"] != DBNull.Value) && (dv1[0]["mmi"].ToString() != dv[i]["F_MonitorIndex"].ToString())) // { // continue; // } //} int[] zxy = new int[4]; zxy[0] = Convert.ToInt32(dv[i][zc]); zxy[1] = Convert.ToInt32(dv[i][xc]); zxy[2] = Convert.ToInt32(dv[i][yc]); zxy[3] = Convert.ToInt32(dv[i]["F_UseAwayFork"]); rettask.Add(Convert.ToInt32(dv[i]["F_MonitorIndex"]), zxy); } return rettask; } else { return null; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 查找多叉关联任务的ST_CELL表的使用哪个货叉属性是否相同 /// /// 任务类型 /// 调度任务索引 /// 设备索引 /// 设备指令 /// public static bool EqualMonitorDoubleFork(int mankind, int fid, int devIdx, int devOrder) { DataView dv= new DataView(); char DoubleFork = '0', DoubleFork1 = '0'; string xc = "F_NumParam2";string yc = "F_NumParam3";string zc = "F_NumParam1"; if (GetDeviceKindIdx(devIdx) == 1) { if ((devOrder == 4)||(devOrder == 2)) { xc = "F_NumParam2"; yc = "F_NumParam3"; zc = "F_NumParam1"; } else if ((devOrder == 5)||(devOrder == 3)) { xc = "F_NumParam5"; yc = "F_NumParam6"; zc = "F_NumParam4"; } } try { int z = 0, x = 0, y = 0, z1 = 0, x1 = 0, y1 = 0; //查找被关联辅助设备指令索引的列坐标 sql.Remove(0, sql.Length); sql.Append("SELECT " ).Append( zc ).Append( "," ).Append( xc ).Append( "," ).Append( yc ).Append( ",F_UseAwayFork FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.F_RELATIVECONTORLID = T_Monitor_Task.F_ManageTaskIndex " ).Append( " AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") AND (FID = " ).Append( fid ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ")"); ; dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { z = Convert.ToInt32(dv[0][zc]); x = Convert.ToInt32(dv[0][xc]); y = Convert.ToInt32(dv[0][yc]); DoubleFork = Convert.ToChar(dv[0]["F_UseAwayFork"]); } else { //查找关联自己的主设备指令索引的列坐标 sql.Remove(0, sql.Length); sql.Append("SELECT " ).Append( zc ).Append( "," ).Append( xc ).Append( "," ).Append( yc ).Append( ",F_UseAwayFork FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.FID = T_Monitor_Task.F_ManageTaskIndex " ).Append( " AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") AND (F_RELATIVECONTORLID = " ).Append( fid ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { z = Convert.ToInt32(dv[0][zc]); x = Convert.ToInt32(dv[0][xc]); y = Convert.ToInt32(dv[0][yc]); DoubleFork = Convert.ToChar(dv[0]["F_UseAwayFork"]); } } if ((z == 0) && (x == 0) && (y == 0)) { return false; } else { sql.Remove(0, sql.Length); sql.Append("SELECT " ).Append( zc ).Append( "," ).Append( xc ).Append( "," ).Append( yc ).Append( ",F_UseAwayFork FROM T_Monitor_Task Where ( F_ManageTASKKINDINDEX = " ).Append( mankind ).Append( ") AND (F_ManageTaskIndex = " ).Append( fid ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { z1 = Convert.ToInt32(dv[0][zc]); x1 = Convert.ToInt32(dv[0][xc]); y1 = Convert.ToInt32(dv[0][yc]); DoubleFork1 = Convert.ToChar(dv[0]["F_UseAwayFork"]); if (((x1 > x) && (DoubleFork1 > DoubleFork)) || ((x > x1) && (DoubleFork > DoubleFork1))) { return true; } else { return false; } } else { return false; } } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 查找多叉关联任务的T_Base_AGV_Gate表的货叉属性是否匹配 /// /// 任务类型 /// 调度任务索引 /// 设备索引 /// 设备指令 /// public static bool EqualAGVGateDoubleFork(int mankind, int fid, int devIdx, int devOrder) {//20110110 1运行,2取货,3送货,4取送货,5允许AGV移载 DataView dv = new DataView(); string xc = "F_NumParam2"; if (GetDeviceKindIdx(devIdx) == 6) { if (devOrder == 1) { xc = "F_NumParam5"; } else if ((devOrder == 2) || (devOrder == 5)) { xc = "F_NumParam2"; } else if (devOrder == 3) { xc = "F_NumParam5"; } else { xc = "F_NumParam2"; } } try { int x = 0, x1 = 0; int channelleft = 0, channelleft1 = 0, xd = 0, xd1 = 0; StringBuilder sql = new StringBuilder(); 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>0"); DataView dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count == 0) return false; int RELATIVECONTORLID = Convert.ToInt32(dv0[0]["F_RELATIVECONTORLID"]); //查找被关联辅助设备指令索引的列坐标 sql.Remove(0, sql.Length); sql.Append("SELECT ").Append( xc ).Append(" FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.FID = T_Monitor_Task.F_ManageTaskIndex ").Append( " AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") AND (FID = " ).Append( fid).Append(") and (F_DeviceIndex=").Append(devIdx).Append(" and F_DeviceCommandIndex=").Append(devOrder).Append(") and F_RELATIVECONTORLID=").Append(RELATIVECONTORLID); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { xd = Convert.ToInt32(dv[0][xc]); dv = dbo.ExceSQL("SELECT F_Sequence FROM T_Base_AGV_Gate WHERE (F_AGVGateDeviceIndex = " + xd + ")").Tables[0].DefaultView; if (dv.Count > 0) { x = Convert.ToInt32(dv[0]["F_Sequence"]); } else { x = 0; } } if (x == 0) { return false; } else { sql.Append("SELECT ").Append( xc ).Append( " FROM T_Monitor_Task Where ( F_ManageTASKKINDINDEX = " ).Append( mankind ).Append( ") AND (F_ManageTaskIndex = ").Append( fid ).Append( ") and (F_DeviceIndex=" ).Append( devIdx ).Append( " and F_DeviceCommandIndex=" ).Append( devOrder ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { xd1 = Convert.ToInt32(dv[0][xc]); dv = dbo.ExceSQL("SELECT F_Sequence FROM T_Base_AGV_Gate WHERE (F_AGVGateDeviceIndex = " + xd1 + ")").Tables[0].DefaultView; if (dv.Count > 0) { x1 = Convert.ToInt32(dv[0]["F_Sequence"]); } else { x1 = 0; } int DoubleFork = 0, DoubleFork1 = 0; dv = dbo.ExceSQL("SELECT F_UseAwayFork,F_IfChannelLeft FROM T_Base_AGV_Gate WHERE F_AGVGateDeviceIndex =" + xd).Tables[0].DefaultView; if (dv.Count > 0) { DoubleFork = Convert.ToInt32(dv[0]["F_UseAwayFork"]); channelleft = Convert.ToInt32(dv[0]["F_IfChannelLeft"]); } else { return false; } dv = dbo.ExceSQL("SELECT F_UseAwayFork,F_IfChannelLeft FROM T_Base_AGV_Gate WHERE F_AGVGateDeviceIndex =" + xd1).Tables[0].DefaultView; if (dv.Count > 0) { DoubleFork1 = Convert.ToInt32(dv[0]["F_UseAwayFork"]); channelleft1 = Convert.ToInt32(dv[0]["F_IfChannelLeft"]); } else { return false; } if ((((x1 > x) && (DoubleFork1 > DoubleFork)) || ((x > x1) && (DoubleFork > DoubleFork1))) && (channelleft == channelleft1)) { return true; } else { return false; } } else { return false; } } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 在设备指令队列表获取Z 排坐标 /// /// 设备指令索引 /// public static int GetZCoorFromMonitor(int monitorIndex, int devIdx, int devOrder) { DataView dv = new DataView(); string zc = "F_NumParam1"; if (GetDeviceKindIdx(devIdx) == 1) { if (devOrder == 4 || devOrder == 2) { zc = "F_NumParam1"; } else if (devOrder == 5 || devOrder == 3) { zc = "F_NumParam4"; } } try { sql.Remove(0, sql.Length); sql.Append("SELECT ").Append(zc).Append(" FROM T_Monitor_Task WHERE (F_MonitorIndex = " ).Append( monitorIndex ).Append( ")"); 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(); } } /// /// 在设备指令队列表获取X 列坐标 /// /// 设备指令索引 /// public static int GetXCoorFromMonitor(int monitorIndex, int devIdx, int devOrder) { DataView dv = new DataView(); string xc = "F_NumParam2"; if (GetDeviceKindIdx(devIdx) == 1) { if (devOrder == 4 || devOrder == 2) { xc = "F_NumParam2"; } else if (devOrder == 5 || devOrder == 3) { xc = "F_NumParam5"; } } try { sql.Remove(0, sql.Length); sql.Append("SELECT ").Append(xc).Append(" FROM T_Monitor_Task WHERE (F_MonitorIndex = " ).Append( monitorIndex ).Append( ")"); 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(); } } /// /// 在设备指令队列表获取全局X 列坐标 /// /// 设备指令索引 /// public static int GetGlobalXCoorFromMonitor(int monitorIndex, int devIdx, int devOrder) { DataView dv = new DataView(); int globalx = 0; string sql = string.Empty; string cellcode = string.Empty; try { sql = string.Format("SELECT F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex ={0}",monitorIndex); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { int z = Convert.ToInt32(dv[0]["F_NumParam1"]); int x = Convert.ToInt32(dv[0]["F_NumParam2"]); int y = Convert.ToInt32(dv[0]["F_NumParam3"]); int z1 = Convert.ToInt32(dv[0]["F_NumParam4"]); int x1 = Convert.ToInt32(dv[0]["F_NumParam5"]); int y1 = Convert.ToInt32(dv[0]["F_NumParam6"]); globalx = x;//默认值,适用于RGV if (GetDeviceKindIdx(devIdx) == 1) { if (devOrder == 4) { cellcode = string.Format("{0:D2}-{1:D2}-{2:D2}", z, x, y); globalx = x; } else if (devOrder == 5) { cellcode = string.Format("{0:D2}-{1:D2}-{2:D2}", z1, x1, y1); globalx = x1; } sql = string.Format("SELECT F_X_Global FROM ST_CELL where FCELLCODE='{0}'", cellcode); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { globalx = Convert.ToInt32(dv[0]["F_X_Global"]); } else { sql = string.Format("SELECT F_Global_X FROM T_Base_Lane_Gate where F_ZXY='{0}'", cellcode); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { globalx = Convert.ToInt32(dv[0]["F_Global_X"]); } } } return globalx; } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// ///根据设备指令获得取送货坐标 coor[0] = z;coor[1] = x;coor[2] = y;coor[3] = z1;coor[4] = x1;coor[5] = y1 /// /// /// /// /// /// public static int[] GetCoorFromMonitor(int monitorIndex) { DataView dv = new DataView(); string sql = string.Empty; //string cellcode = string.Empty; int [] coor = new int[6]; try { sql = string.Format("SELECT F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex ={0}",monitorIndex); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { int z = Convert.ToInt32(dv[0]["F_NumParam1"]); int x = Convert.ToInt32(dv[0]["F_NumParam2"]); int y = Convert.ToInt32(dv[0]["F_NumParam3"]); int z1 = Convert.ToInt32(dv[0]["F_NumParam4"]); int x1 = Convert.ToInt32(dv[0]["F_NumParam5"]); int y1 = Convert.ToInt32(dv[0]["F_NumParam6"]); coor[0] = z; coor[1] = x; coor[2] = y; coor[3] = z1; coor[4] = x1; coor[5] = y1; return coor; //if (GetDeviceKindIdx(devIdx) == 1) //{ // if (devOrder == 4) // { // cellcode = string.Format("{0:D2}-{1:D2}-{2:D2}", z, x, y); // } // else if (devOrder == 5) // { // cellcode = string.Format("{0:D2}-{1:D2}-{2:D2}", z1, x1, y1); // } // sql = string.Format("SELECT F_X_Global FROM ST_CELL where FCELLCODE='{0}'", cellcode); // dv = dbo.ExceSQL(sql).Tables[0].DefaultView; // if (dv.Count > 0) // { // globalx = Convert.ToInt32(dv[0]["F_X_Global"]); // } // else // { // sql = string.Format("SELECT F_Global_X FROM T_Base_Lane_Gate where F_ZXY='{0}'", cellcode); // dv = dbo.ExceSQL(sql).Tables[0].DefaultView; // if (dv.Count > 0) // { // globalx = Convert.ToInt32(dv[0]["F_Global_X"]); // } // } //} } else { return null; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 在设备指令队列表获取Y 层坐标 /// /// 设备指令索引 /// public static int GetYCoorFromMonitor(int monitorIndex, int devIdx, int devOrder) { DataView dv = new DataView(); string yc = "F_NumParam3"; if (GetDeviceKindIdx(devIdx) == 1) { if (devOrder == 4) { yc = "F_NumParam3"; } else if (devOrder == 5) { yc = "F_NumParam6"; } } try { sql.Remove(0, sql.Length); sql.Append("SELECT ").Append(yc).Append(" FROM T_Monitor_Task WHERE (F_MonitorIndex = " ).Append( monitorIndex ).Append( ")"); 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(); } } /// /// 返回双顶升机设备指令信息(返回NULL表示没有;否则返回包含自己的所有货叉的设备指令信息):【0】任务号【1】条码 /// /// 设备指令索引 /// 设备索引 /// public static int GetDoubleLiftInfo(int monitorIndex, int devIdx) { DataView dv = new DataView(); try { int mankind = GetManageTaskKindIndexFromMonitor(monitorIndex); int fid = GetManageTaskIndexfromMonitor(monitorIndex); int devOrder = GetDeviceOrderFromMonitor(monitorIndex); int relFID = GetRelativeControlID(mankind, fid); if (relFID == -1) return 0; //--------获取设备货叉,与参数的货叉取反 string str_device = ""; int i_fork = 0; switch (devIdx.ToString().Substring(5, 1)) { case "1": i_fork = 2; str_device = devIdx.ToString().Substring(0, 5) + i_fork.ToString(); break; case "2": i_fork = 1; str_device = devIdx.ToString().Substring(0, 5) + i_fork.ToString(); break; } sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex,F_TxtParam,F_DeviceIndex FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.FID = T_Monitor_Task.F_ManageTaskIndex ").Append( " AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( T_Monitor_Task.F_ManageTaskKindIndex = ").Append(mankind) .Append(") and (F_DeviceIndex=").Append(str_device).Append(" and F_DeviceCommandIndex=").Append(devOrder).Append(") and F_RELATIVECONTORLID=").Append(relFID).Append(" and F_MonitorIndex<>").Append(monitorIndex); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return (int) dv[0]["F_MonitorIndex"]; } else { return 0; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 返回多叉关联设备指令信息(返回NULL表示没有;否则返回包含自己的所有货叉的设备指令信息):【0】设备指令索引【1】提前检测【2】设备索引【3】路径 /// /// 设备指令索引 /// 设备索引 /// public static Dictionary GetDoubleForkMonitorInfo(int monitorIndex, int devIdx) { DataView dv = new DataView(); Dictionary rtd = new Dictionary();; string[] rr = null; try {// int length=devIdx.ToString().Length; if(length>5) { devIdx = Convert.ToInt32(devIdx.ToString().Substring(0, 5));//20160419出库升降站台的处理 } int mankind = GetManageTaskKindIndexFromMonitor(monitorIndex); int fid = GetManageTaskIndexfromMonitor(monitorIndex); int devOrder = GetDeviceOrderFromMonitor(monitorIndex); int relFID = GetRelativeControlID(mankind, fid); if (relFID == -1) return null; sql.Remove(0, sql.Length); //20160419 sql.Append("SELECT F_MonitorIndex,F_AheadDetect,F_DeviceIndex,F_RouteID,F_TxtParam FROM T_Manage_Task,T_Monitor_Task Where (T_Manage_Task.FID = T_Monitor_Task.F_ManageTaskIndex ").Append( " AND T_Manage_Task.F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX) and ( T_Monitor_Task.F_ManageTaskKindIndex = " ).Append( mankind ) .Append( ") and (F_DeviceIndex like '").Append(devIdx).Append("%' and F_DeviceCommandIndex=").Append(devOrder).Append(") and F_RELATIVECONTORLID=").Append(relFID ).Append(" and F_MonitorIndex<>").Append(monitorIndex); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count == 0) return null; for(int i=0;i /// 是否存在关联任务 /// /// /// /// public static bool GetIfDoubleForkTask(int monitorIndex, int devIdx) { DataView dv = new DataView(); string sqlstr = string.Empty; try {// int length=devIdx.ToString().Length; if (length > 5) { devIdx = Convert.ToInt32(devIdx.ToString().Substring(0, 5));//20160419出库升降站台的处理 } int mankind = GetManageTaskKindIndexFromMonitor(monitorIndex); int fid = GetManageTaskIndexfromMonitor(monitorIndex); int relFID = GetRelativeControlID(mankind, fid); if (relFID == -1) return false ; sqlstr=string.Format("SELECT FID,F_RELATIVECONTORLID FROM T_Manage_Task WHERE (F_ManageTaskKindIndex = {0}) AND (F_RELATIVECONTORLID = {1}) and (FID!={2})", mankind, relFID, fid); dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } public static int GetUseAwayForkFromLaneGate(int lanegate) {//20120820 DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT F_UseAwayFork 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_UseAwayFork"].ToString(), out a) == false) { return 0; } else { return Convert.ToInt32( dv[0]["F_UseAwayFork"]); } } else { return 0; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } public static int GetEndDeviceFromManage(int mti, int fid) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT FENDDEVICE FROM T_Manage_Task where FID={0} and F_ManageTaskKindIndex={1}", fid, mti)).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][0]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 返回未拆分的多叉关联设备指令,true 代表有未拆分的多叉关联设备指令 /// /// 设备指令索引 /// public static bool GetMutiForkUnIntoStep(int monitorIndex) { DataView dv = new DataView(); try { int mankind = GetManageTaskKindIndexFromMonitor(monitorIndex); int fid = GetManageTaskIndexfromMonitor(monitorIndex); //查找被关联辅助设备指令索引的列坐标 sql.Remove(0, sql.Length); sql.Append("SELECT F_RELATIVECONTORLID FROM T_Manage_Task Where (T_Manage_Task.F_RELATIVECONTORLID <>-1 ) and ( F_ManageTaskKindIndex = " ).Append( mankind ).Append( ") AND (FID = " ).Append( fid ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { sql.Remove(0, sql.Length); sql.Append("SELECT FID FROM T_Manage_Task Where ( F_ManageTaskKindIndex = ").Append(mankind).Append(") AND (F_RELATIVECONTORLID = ").Append( dv[0][0] ).Append( " and FIntoStepOK<>'1')"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return true; } } return false; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } public static int GetManageTaskIndexfromMonitor(int monitorIdx) { //20100108 DataView dv = new DataView(); try { //20100108 sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTaskIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " ).Append( monitorIdx ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_ManageTaskIndex"]); } else { return -1; } } catch (Exception ex) {//20100108 throw ex; } finally {//20100108 dv.Dispose(); } } public static int GetManageTaskKindIndexFromMonitor(int monitorIdx) {//20100108 DataView dv = new DataView(); try { //20100108 sql.Remove(0, sql.Length); sql.Append("SELECT F_ManageTaskKindIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " ).Append( monitorIdx ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]); } else { return -1; } } catch (Exception ex) {//20100108 throw ex; } finally {//20100108 dv.Dispose(); } } public static int GetRelativeControlID(int mankind, int fid) { object ob = dbo.GetSingle(string.Format("SELECT F_RELATIVECONTORLID FROM T_Manage_Task WHERE (F_ManageTaskKindIndex = {0}) AND (FID = {1})", mankind, fid)); if (ob != null) { return Convert.ToInt32(ob); } else { return -1; } } public static string GetXcorrFromForkNoAndDevice(int device, int forkno) { DataView dv = new DataView(); try { //dv = dbo.ExceSQL(string.Format("SELECT F_ZXY FROM T_Base_Lane_Gate where F_LaneGateDeviceIndex like '{0}%' and F_UseAwayFork='{1}'", device, forkno)).Tables[0].DefaultView; dv = dbo.ExceSQL(string.Format("SELECT F_ZXY FROM T_Base_Lane_Gate where F_LaneGateDeviceIndex like '{0}%' ",device )).Tables[0].DefaultView; if (dv.Count > 0) { char[] cc = new char[1] { '-' }; string[] zxy=dv[0][0].ToString().Split(cc); if (zxy.GetLength(0) >= 2) { return zxy[1]; } else { return "0"; } } else { return "0"; } } catch (Exception ex) { throw ex; } } /// /// 在调度队列中找到设备命令 /// /// 调度所引 /// public static int GetDeviceOrderFromMonitor(int MonitorIndex) { //20100108 DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("select F_DeviceCommandIndex from T_Monitor_Task where (F_DeviceCommandIndex IS NOT NULL) and F_MonitorIndex=" ).Append( MonitorIndex); //20100108 dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } public static int GetDeviceKindIdx(int devIdx) { try { devinfo = Model.CGetInfo.GetDeviceInfo(devIdx); return devinfo.DeviceKind; } catch (Exception ex) { throw ex; } } //20170301 /// /// 在发送机器人拆垛指令之前,判断管理系统是否要求回流 /// CONTROL_BACK_FLAG为空时,表示正常拆垛,为1时表示回流 /// /// /// public static int GetBackFlagFromIOControl(int ManageTaskIndex) { //20100108 DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("select CONTROL_ID,CONTROL_BACK_FLAG from IO_CONTROL where (CONTROL_BACK_FLAG IS NOT NULL) and CONTROL_ID=").Append(ManageTaskIndex); //20100108 dv = dboM.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["CONTROL_BACK_FLAG"]);//为1时表示回流,等待管理系统下达任务 } else { return 0;//正常拆垛 } } catch (Exception ex) { return 0;//正常拆垛 //throw ex; } finally { dv.Dispose(); } } public static int GetDeviceIndexFromMonitor(int MonitorIndex) { //20100108 DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("select F_DeviceIndex from T_Monitor_Task where (F_DeviceIndex IS NOT NULL) and F_MonitorIndex=" ).Append( MonitorIndex); //20100108 dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_DeviceIndex"]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 20110608获取调度设备指令开始时间 /// /// /// public static string GetMonitorTaskBeginTime(int monitorIndex) { sql.Remove(0, sql.Length); sql.Append("SELECT F_StartTime FROM T_Monitor_Task WHERE F_MonitorIndex = ").Append(monitorIndex); object ob=dbo.GetSingle(sql.ToString()); if (ob != null) { return ob.ToString(); } else { return "-"; } } public static void ActionComplete(int DeviceIdx, int TaskIdx, int ClearZero) { int devKind = GetDeviceKindIdx(DeviceIdx); int order = GetDeviceOrderFromMonitor(TaskIdx); int fid = GetManageTaskIndexfromMonitor(TaskIdx); int mti = GetManageTaskKindIndexFromMonitor(TaskIdx); string cap; int errrcode = GetExceptionNOFromManageTask(fid, mti); DataView dv = new DataView(); //dbo.TransBegin(); try { //20100127 sql.Remove(0, sql.Length); sql.Append("select count(F_MonitorIndex) as counts from T_Monitor_Task " ).Append( " where F_ManageTaskIndex =" ).Append( fid ).Append( " and F_ManageTaskKindIndex= " ).Append( mti); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if ((Convert.ToInt32(dv[0]["counts"]) == 1) ) { //固定路径模式 //调度任务的fid的最后一个监控分解任务完成 if (mti == 1) { cap = "调度任务"; //完成FSTATUS=999;970堆垛机送货重故障异常完成;980堆垛机取空故障异常完成;990条码扫描异常完成;调度撤销删除调度任务900 if (errrcode > 900)//异常完成 { sql.Remove(0, sql.Length); sql.Append("update IO_Control set Control_STATUS=" ).Append( errrcode ).Append( " where Control_ID=" ).Append( fid); dboM.ExceSQL(sql.ToString()); } else { if (ClearZero == Model.CGeneralFunction.TASKDELETE)//调度撤销删除调度任务900 { sql.Remove(0, sql.Length); sql.Append("update IO_Control set Control_STATUS=" ).Append( Model.CGeneralFunction.TASKDELETE ).Append( " where Control_ID=" ).Append( fid); dboM.ExceSQL(sql.ToString()); } else//完成FSTATUS=999 { sql.Remove(0, sql.Length); sql.Append("update IO_Control set Control_STATUS=" ).Append( Model.CGeneralFunction.TASKFINISH ).Append( " where Control_ID=" ).Append( fid); dboM.ExceSQL(sql.ToString()); } } } else if (mti == 4) { cap = "手工任务"; } else { cap = "临时任务"; } //回写管理表 if (ClearZero == Model.CGeneralFunction.TASKDELETE)//调度撤销删除调度任务900 { ReturnManageInfo(fid, mti, cap, false); } else { ReturnManageInfo(fid, mti, cap, true); } } } //被这个任务号锁定的设备全部解锁 sql.Remove(0, sql.Length); sql.Append("update T_Base_Device set F_LockedState=0 where F_LockedState=" ).Append( TaskIdx); dbo.ExceSQL(sql.ToString()); if (ClearZero == 1) { if (mti == 1) { sql.Remove(0, sql.Length); sql.Append("UPDATE IO_CONTROL SET ERROR_TEXT ='' WHERE Control_ID=" ).Append( fid ).Append( " and Control_STATUS<900"); dboM.ExceSQL(sql.ToString()); } } sql.Remove(0, sql.Length); sql.Append("delete from T_Monitor_Task where F_MonitorIndex=" ).Append( TaskIdx); dbo.ExceSQL(sql.ToString()); } catch (Exception ex) { throw ex; } finally {//20100127 dv.Dispose(); } } public static int GetExceptionNOFromManageTask(int FID, int ManTaskKind) { //20100127 DataTable dt = new DataTable(); try { sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex, FExceptionNO FROM T_Manage_Task WHERE (FID = " + FID + ") AND (F_ManageTaskKindIndex = " + ManTaskKind + ") "); //20100127 dt = dbo.ExceSQL(sql.ToString()).Tables[0]; if (dt.Rows.Count > 0) { if (dt.Rows[0]["FExceptionNO"] == DBNull.Value) { return -1; } else { return Convert.ToInt32(dt.Rows[0]["FExceptionNO"]); } } else { return -1; } } catch (Exception ex) {//20100127 throw ex; } finally {//20100127 dt.Dispose(); } } static void ReturnManageInfo(int fid, int mti, string cap, bool IFOK) { //20100127 DataView dv = new DataView(); try { //200906240111增加货位记录:入库1-结束位置有货;出库2-起始位置无货;倒库3-起始位置无货,结束位置有货 //20100127 sql.Remove(0, sql.Length); sql.Append("SELECT FID, F_ManageTaskKindIndex,FCONTROLTASKTYPE, FSTARTDEVICE,FSTARTCELL, FENDDEVICE,FENDCELL FROM T_Manage_Task where F_ManageTaskKindIndex=" ).Append( mti ).Append( " and FID=" ).Append( fid ); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { switch (dv[0]["FCONTROLTASKTYPE"].ToString()) { case "1": sql.Remove(0, sql.Length); sql.Append("UPDATE ST_CELL SET FCELLSTATUS = 1 WHERE (FLaneWay=" ).Append( dv[0]["FENDDEVICE"] ).Append( " and FCELLCODE = '" ).Append( dv[0]["FENDCELL"] ).Append( "')"); dbo.ExceSQL(sql.ToString()); break; case "2": sql.Remove(0, sql.Length); sql.Append("UPDATE ST_CELL SET FCELLSTATUS =0 WHERE (FLaneWay=" ).Append( dv[0]["FSTARTDEVICE"] ).Append( " and FCELLCODE = '" ).Append( dv[0]["FSTARTCELL"] ).Append( "')"); dbo.ExceSQL(sql.ToString()); break; case "3": sql.Remove(0, sql.Length); sql.Append("UPDATE ST_CELL SET FCELLSTATUS = 1 WHERE (FLaneWay=" ).Append( dv[0]["FENDDEVICE"] ).Append( " and FCELLCODE = '" ).Append( dv[0]["FENDCELL"] ).Append( "')"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("UPDATE ST_CELL SET FCELLSTATUS =0 WHERE (FLaneWay=" ).Append( dv[0]["FSTARTDEVICE"] ).Append( " and FCELLCODE = '" ).Append( dv[0]["FSTARTCELL"] ).Append( "')"); dbo.ExceSQL(sql.ToString()); break; default: break; } } //////////////////// sql.Remove(0, sql.Length); sql.Append("delete from T_Manage_Task where FID=" ).Append( fid ).Append( " and F_ManageTaskKindIndex= " ).Append( mti); dbo.ExceSQL(sql.ToString()); } catch (Exception ex) {//20100127 throw ex; } finally {//20100127 dv.Dispose(); } } public const string DBSend = "DB1"; public const string DBGet = "DB2"; /// /// 20110216根据ReadSubscription标识找到此订阅的开始设备 /// /// ReadSubscription标识 /// public static Model.MDevice GetDeviceReadSubscriptionDB2Data(StringBuilder sb) { DataView dv = dbo.ExceSQL("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_DeviceIndex=" + sb.ToString() + ")").Tables[0].DefaultView; if (dv.Count > 0) { return Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[0]["F_DeviceIndex"])); } else { return null; } } #region 与管理任务交互的调度任务状态 /// /// 任务等待,默认0 /// public static readonly int TASKWAIT = CGetInfo.GetIOControlStatus("TASKWAIT").StatusID; /// /// 任务开始运行,默认10 /// public static readonly int TASKRUN = CGetInfo.GetIOControlStatus("TASKRUN").StatusID; /// /// 调度申请改道,默认30 /// public static readonly int TASKALTERROUTEAPPLY = CGetInfo.GetIOControlStatus("TASKALTERROUTEAPPLY").StatusID; /// /// 管理答复改道申请,默认40 /// public static readonly int TASKALTERROUTEREPLY = CGetInfo.GetIOControlStatus("TASKALTERROUTEREPLY").StatusID; /// /// 管理任务被调度删除,默认900 /// public static readonly int TASKDELETE = CGetInfo.GetIOControlStatus("TASKDELETE").StatusID; /// /// 指令重发,默认920 /// public static readonly int TASKRESTORE = CGetInfo.GetIOControlStatus("TASKRESTORE").StatusID; /// /// 人工暂停出库,默认940 /// public static readonly int TASKSTOPOUTPUT = CGetInfo.GetIOControlStatus("TASKSTOPOUTPUT").StatusID; /// /// 任务类型错,送到拆盘机的不是空托盘组,默认950 /// public static readonly int TASKTYPEERROR = CGetInfo.GetIOControlStatus("TASKTYPEERROR").StatusID; /// /// 任务被取消,搬运到异常出库站台,默认960 /// public static readonly int TASKCANCEL = CGetInfo.GetIOControlStatus("TASKCANCEL").StatusID; /// /// 堆垛机的送货重需要改路径处理,默认970 /// public static readonly int TASKREPEATINPUT = CGetInfo.GetIOControlStatus("TASKREPEATINPUT").StatusID; /// /// 堆垛机的取空处理,调度取消执行管理任务,默认980 /// public static readonly int TASKEMPTYOUTPUT = CGetInfo.GetIOControlStatus("TASKEMPTYOUTPUT").StatusID; /// /// 任务异常完成,默认990 /// public static readonly int TASKABEND = CGetInfo.GetIOControlStatus("TASKABEND").StatusID; /// /// 任务搬运完成,默认999 /// public static readonly int TASKFINISH = CGetInfo.GetIOControlStatus("TASKFINISH").StatusID; /// /// 入库任务RFID比对错误,默认值930 /// public static readonly int TASKINPUTRFIDERROR = CGetInfo.GetIOControlStatus("TASKINPUTRFIDERROR").StatusID; /// /// 20100617管理任务对出库托盘确认接收,默认值50 /// public static readonly int TASKOUTCONFIRM = CGetInfo.GetIOControlStatus("TASKOUTCONFIRM").StatusID; /// /// 20101011双叉极限货位需要更换货叉,默认值800 /// public static readonly int TASKCHANGEFORK = CGetInfo.GetIOControlStatus("TASKCHANGEFORK").StatusID; /// /// 20120820双堆垛机同轨,极限位置需要两个堆垛机组合作业,默认值810 /// public static readonly int TASKCHANGESTACK = CGetInfo.GetIOControlStatus("TASKCHANGESTACK").StatusID; /// 20120820双堆垛机同轨,需要缓存的双叉堆垛机,默认值811 /// public static readonly int TASKEXCHANGE = CGetInfo.GetIOControlStatus("TASKEXCHANGE").StatusID; /// /// 20101011调度已经获取任务,默认值7 /// public static readonly int TASKCONTROLREADED = CGetInfo.GetIOControlStatus("TASKCONTROLREADED").StatusID; /// /// 20101028堆垛机单叉入库任务立即执行:默认值,25 /// public static readonly int TASKSINGLEFORKRUN = CGetInfo.GetIOControlStatus("TASKSINGLEFORKRUN").StatusID; #region 扫码异常处理20110210 /// /// 20110210组箱区入库、出库扫码异常:默认值,70 /// public static readonly int TASKINPUTSCANERROR = CGetInfo.GetIOControlStatus("TASKINPUTSCANERROR").StatusID; /// /// 20110210组箱区二楼出库扫码异常:默认值,60 /// public static readonly int TASKOUTPUTSCANERROR = CGetInfo.GetIOControlStatus("TASKOUTPUTSCANERROR").StatusID; #endregion #endregion #region 堆垛机取空和送重的故障码 ///// ///// 堆垛机的送重故障码,默认48(双叉中的近叉) ///// //public static readonly int STACKREPEATINPUT =CGetInfo.GetIOControlStatus("STACKREPEATINPUT").StatusID; ///// ///// 堆垛机的取空故障码,默认49(双叉中的近叉) ///// //public static readonly int STACKEMPTYOUTPUT =CGetInfo.GetIOControlStatus("STACKEMPTYOUTPUT").StatusID; ///// ///// 堆垛机的送重故障码,默认60(双叉中的远叉) ///// //public static readonly int STACKREPEATINPUTAWAY = CGetInfo.GetIOControlStatus("STACKREPEATINPUTAWAY").StatusID; ///// ///// 堆垛机的取空故障码,默认62(双叉中的远叉) ///// //public static readonly int STACKEMPTYOUTPUTAWAY = CGetInfo.GetIOControlStatus("STACKEMPTYOUTPUTAWAY").StatusID; ///// ///// 堆垛机的送重故障码,默认61(双叉) ///// //public static readonly int STACKREPEATINPUTDOUBLE = CGetInfo.GetIOControlStatus("STACKREPEATINPUTDOUBLE").StatusID; ///// ///// 堆垛机的取空故障码,默认63(双叉) ///// //public static readonly int STACKEMPTYOUTPUTDOUBLE = CGetInfo.GetIOControlStatus("STACKEMPTYOUTPUTDOUBLE").StatusID; #endregion #region 设备类型 /// /// 20110803堆垛机的设备类型,默认值1 /// public static readonly int StackKind = CGetInfo.GetDeviceKind("StackKind").DeviceKindIndex; /// /// 20110803输送机的设备类型,默认值2 /// public static readonly int ConveyorKind = CGetInfo.GetDeviceKind("ConveyorKind").DeviceKindIndex; /// /// 20110803升降机的设备类型,默认值3 /// public static readonly int LifterKind = CGetInfo.GetDeviceKind("LifterKind").DeviceKindIndex; /// /// 20110803RGV穿梭车的设备类型,默认值4 /// public static readonly int RGVKind = CGetInfo.GetDeviceKind("RGVKind").DeviceKindIndex; /// /// 20110803叠盘机的设备类型,默认值5 /// public static readonly int PileKind = CGetInfo.GetDeviceKind("PileKind").DeviceKindIndex; /// /// 20110803AGV车的设备类型,默认值6 /// public static readonly int AGVKind = CGetInfo.GetDeviceKind("AGVKind").DeviceKindIndex; /// /// 20110803托盘条码扫描仪的设备类型,默认值7 /// public static readonly int BarcodeScanKind = CGetInfo.GetDeviceKind("BarcodeScanKind").DeviceKindIndex; /// /// 20110803称重设备的设备类型,默认值8 /// public static readonly int WeighKind = CGetInfo.GetDeviceKind("WeighKind").DeviceKindIndex; /// /// 20110803站台的设备类型,默认值9 /// public static readonly int PlatFormKind = CGetInfo.GetDeviceKind("PlatFormKind").DeviceKindIndex; /// /// 20110803巷道的设备类型,默认值10 /// public static readonly int LanewayKind = CGetInfo.GetDeviceKind("LanewayKind").DeviceKindIndex; /// /// 20110803AGV通道的设备类型,默认值11 /// public static readonly int AGVLane = CGetInfo.GetDeviceKind("AGVLane").DeviceKindIndex; /// /// 20110803虚拟关键设备的设备类型,默认值12 /// public static readonly int DummyKind = CGetInfo.GetDeviceKind("DummyKind").DeviceKindIndex; /// /// 20110803空设备的设备类型,默认值13 /// public static readonly int BlankKind = CGetInfo.GetDeviceKind("BlankKind").DeviceKindIndex; /// /// 20110803确认按钮的设备类型,默认值14 /// public static readonly int ConfirmButtonKind = CGetInfo.GetDeviceKind("ConfirmButtonKind").DeviceKindIndex; /// /// 20110803确认按钮的设备类型,默认值15 /// public static readonly int TimerKind = CGetInfo.GetDeviceKind("TimerKind").DeviceKindIndex; /// /// 20110803指示灯的设备类型,默认值16 /// public static readonly int LightKind = CGetInfo.GetDeviceKind("LightKind").DeviceKindIndex; /// /// 20110803码垛机的设备类型,默认值17 /// public static readonly int RobotKind = CGetInfo.GetDeviceKind("RobotKind").DeviceKindIndex; /// /// 20110803检测开关的设备类型,默认值18 /// public static readonly int DetectSwitchKind = CGetInfo.GetDeviceKind("DetectSwitchKind").DeviceKindIndex; /// /// 20110803气动推杆设备类型,默认值19 /// public static readonly int HandspikeKind = CGetInfo.GetDeviceKind("HandspikeKind").DeviceKindIndex; /// /// 20110803气动阻挡设备类型,默认值20 /// public static readonly int BlockKind = CGetInfo.GetDeviceKind("BlockKind").DeviceKindIndex; /// /// 20110803一号工程码扫描器设备类型,默认值21 /// public static readonly int FirstProjectCodeScanKind = CGetInfo.GetDeviceKind("FirstProjectCodeScanKind").DeviceKindIndex; /// /// 20110803现场控制触摸屏申请信息设备类型,默认值22 /// public static readonly int HMIKind = CGetInfo.GetDeviceKind("HMIKind").DeviceKindIndex; /// /// 20110803一号工程码计数器设备类型,默认值23 /// public static readonly int FirstProjectCodeCounterKind = CGetInfo.GetDeviceKind("FirstProjectCodeCounterKind").DeviceKindIndex; /// /// 20110803机器人码垛信息设备类型,默认值24 /// public static readonly int RobotPileInfoKind = CGetInfo.GetDeviceKind("RobotPileInfoKind").DeviceKindIndex; /// /// 20110803机器人码垛通道设备类型,默认值25 /// public static readonly int RobotPileLaneKind = CGetInfo.GetDeviceKind("RobotPileLaneKind").DeviceKindIndex; /// /// 20110803班次产量计数器设备类型,默认值26 /// public static readonly int ClassOutputCounter = CGetInfo.GetDeviceKind("ClassOutputCounter").DeviceKindIndex; /// /// 20110803烟箱品牌设备类型,默认值27 /// public static readonly int TobaccoBoxBreed = CGetInfo.GetDeviceKind("TobaccoBoxBreed").DeviceKindIndex; /// /// 20110803光电检测开始点设备类型,默认值28 /// public static readonly int DetectSwitchStartKind = CGetInfo.GetDeviceKind("DetectSwitchStartKind").DeviceKindIndex; /// /// 20110803摄像头设备类型,默认值29 /// public static readonly int CameraKind = CGetInfo.GetDeviceKind("CameraKind").DeviceKindIndex; /// /// 20110803和管理交互的虚拟设备类型,默认值30 /// public static readonly int IOControlDummyKind = CGetInfo.GetDeviceKind("IOControlDummyKind").DeviceKindIndex; #endregion } }