using System.Runtime.InteropServices; using System.Collections.Generic; using System.Globalization; using System.Text; using System.Data; using System; using CommLayerFactory; using ICommLayer; using DBFactory; using CommonLib; using System.Linq; namespace WcfControlMonitorLib { /// /// Creator:Richard.liu /// 监控调度类 /// public class CControl { int StackMutexXCoor = 4000; int minStackMutexXCoor = 3000;//1488是坐标转换差 int StackZeroXCoor = 4228; StringBuilder AheadDetectUnallow = new StringBuilder();//20110505 StringBuilder sql = new StringBuilder(); StringBuilder sql1 = new StringBuilder(); StringBuilder sql33 = new StringBuilder(); StringBuilder sql34 = new StringBuilder(); StringBuilder sqlsh = new StringBuilder(); char[] dd = new char[1] { '.' };//20101124 string[] DS;//20101124 private Object thisLock = new Object(); DBOperator dbo =CStaticClass.dbo; DBOperator dboM = CStaticClass.dboM; DBOperator dboM1 = CStaticClass.dboM1; Model.MDevice devinfo; Model.MDevice devinfocheck; ISendDeviceOrder sdo; CCommonFunction ccf = new CCommonFunction(); int _DeviceIdx = 0;//设备索引 int _routeID = 0;//路径唯一索引 int _serialNumber = 0;//路径上的设备方向性链表的序号 int _ManageTaskIdx = 0;//调度任务索引 int _ManageKindIdx = 0;//调度任务类型 int _DeviceOrder = 0;//设备命令 int _LockedState = 0; int _Associate = 0; int _ManTaskReserve = 0; string _AheadDetect = ""; int _NumParam1=0; int _NumParam2 = 0; int _NumParam3 = 0; int _NumParam4 = 0; int _NumParam5 = 0; int _NumParam6 = 0; string _TxtParam = "-"; int _DeviceKind = 0; int _OutsideAltDevice = 0; int _InsideAltDevice = 0; int _StartDevice = 0; int _EndDevice = 0; int _RouteKind = 0; //int _UseAwayFork = 1; int _AgvNo = 65535; string _CControlError = "";//监控调度类错误说明 public string CControlError { get { return _CControlError; } set { _CControlError = value; RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", _CControlError); OnRefreshMonitor(rme); } } 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); } } public CControl() { //dbo.Open(); } //~CControl() //{ // dbo.Close(); //} public void StartOrder() { //首先检测第一个调度任务单的“第一个”(所有剩下中的第一个)设备是否被占用,被占用则执行下一个调度任务单; //然后检测第一个设备的F_AheadDetect都是否满足条件,不满足,则执行下一个调度任务单; //最后开始执行时检查同步运行的关联设备F_AssociateDeviceIndex,准备给该设备发指令; //更改作业记录的状态F_Status为1,更改设备为占用状态(T_Base_device的F_LockedState=设备指令单) //给调度任务表回写调度任务IO_Control的正在执行状态FSTATUS=1;T_Manage_Task的正在执行状态FSTATUS=1 //路径明细表F_LockedDeviceIndex里的所有对应设备索引加锁,但是关联设备不加锁 StringBuilder taskkind =new StringBuilder() ; DataView dv = new DataView(); DataView dvM = new DataView(); try { if (CStaticClass.Order == true) { taskkind.Append(" (F_ManageTaskKindIndex = 1 or F_ManageTaskKindIndex = 2 or F_ManageTaskKindIndex = 4) "); //调度任务与调度生成的自动任务 } else { return; } dvM = new DataView(); char[] sep = new char[1] { '-' }; //获得管理单据 sql.Remove(0, sql.Length); //20120820 sql.Append("SELECT DISTINCT F_ManageTaskIndex AS MIndex,F_MonitorTaskLevel,F_ManageTaskKindIndex,F_SplitTime FROM T_Monitor_Task where ").Append( taskkind.ToString()).Append(" order by F_ManageTaskKindIndex desc, F_MonitorTaskLevel desc,F_SplitTime asc, F_ManageTaskIndex asc");//20120616 dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { for (int i = 0; i < dv.Count; i++) { try { //1:提取每个管理单据的第一个设备指令 sql.Remove(0, sql.Length); if (CStaticClass.DBFactory == "OracleDBFactory") {//20151120调度系统oracle的特殊语句 add for CATL YB2 //sql.Append("select min(F_MonitorIndex) as minMidx,f_status from T_Monitor_Task where rownum=1 and ").Append(taskkind.ToString()).Append(" and F_ManageTaskIndex = ").Append(dv[i]["MIndex"]).Append(" GROUP BY F_MonitorIndex, F_Status"); // add for CATL YB2 sql.Append("select * FROM( SELECT min(F_MonitorIndex) as minMidx,f_status from T_Monitor_Task where ").Append(taskkind.ToString()).Append(" and F_ManageTaskIndex = ").Append(dv[i]["MIndex"]).Append(" GROUP BY F_MonitorIndex, F_Status order by minmidx ) WHERE ROWNUM <=1 ORDER BY ROWNUM ASC"); } else {//20151120调度系统SQLServer的特殊语句 sql.Append("select top 1 min(F_MonitorIndex) as minMidx,f_status from T_Monitor_Task where ").Append(taskkind.ToString()).Append(" and F_ManageTaskIndex = ").Append(dv[i]["MIndex"]).Append(" GROUP BY F_MonitorIndex, F_Status"); } dvM = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20151120调度系统oracle的特殊语句 if (dvM.Count > 0) {//20110412 if (dvM[0]["F_Status"].ToString() == "0" && dvM[0]["minMidx"] != DBNull.Value) { SendMonitorTask(Convert.ToInt32(dvM[0]["minMidx"])); } else { continue; } } else { continue; } } catch (Exception ex) { CControlError = string.Format("发送命令调用StartOrder时:{0}", ex.StackTrace+ex.Message); } }//for语句结束 //20091107 return; } else { return; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dvM.Dispose(); } } /// /// 提取每个管理单据的第一个设备是否被锁定,true表示被锁定;false表示空闲 /// /// 调度任务号 /// true表示被锁定;false表示空闲 public bool GetFirstDeviceIFLocked(int minMidx, bool checkLockedstate) { char[] sep = new char[1] { '-' }; int msgIdx = 0;//消息编号 int adidx = 0;//关联设备的设备指令索引 DataView dv = new DataView(); try { //获得要发送的信息 if (GetSendInfo(minMidx) == false) {//20120420 return true; } int DeviceIdx = _DeviceIdx;//设备索引 int routeID = _routeID;//路径唯一索引 int serialNumber = _serialNumber;//路径上的设备方向性链表的序号 int ManageTaskIdx = _ManageTaskIdx;//管理任务号 int ManageKindIdx = _ManageKindIdx;//调度任务类型 调度任务 自动任务 手工任务 int DeviceOrder = _DeviceOrder;//设备命令 int LockedState = _LockedState; int Associate = _Associate; int ManTaskReserve = _ManTaskReserve; string AheadDetect = _AheadDetect; int NumParam1 = _NumParam1; int NumParam2 = _NumParam2; int NumParam3 = _NumParam3; int NumParam4 = _NumParam4; int NumParam5 = _NumParam5; int NumParam6 = _NumParam6; string TxtParam = _TxtParam; int DeviceKind = _DeviceKind; int OutsideAltDevice = _OutsideAltDevice; int InsideAltDevice = _InsideAltDevice; int StartDevice = _StartDevice; int EndDevice = _EndDevice; int RouteKind = _RouteKind; int AgvNo = _AgvNo; #region 设备故障时是否自动改道 // 变更路径注释 if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1") { #region MyRegion /* #region 只针对与RGV有关的五个动作判断改路径 //20100108 输送机的接货对接指令不参与改道 if ((_DeviceKind == 4) || ((_DeviceKind == 2) && ((_DeviceOrder == 3))) && (RouteKind != 3)) { bool IfModify = false, IfUseNegativeDevice = false;//20100610 //20091102 RGV的第一个被提前触发的运动指令不需要更改路径 if ((_DeviceKind == 4) && (_DeviceOrder == 7) && (ccf.GetSerialNumberFromRouteDevice(_routeID, _DeviceIdx) > ccf.GetSerialNumberFromRouteDevice(_routeID, _NumParam1))) { sql.Remove(0, sql.Length); sql.Append("SELECT MIN(F_MonitorIndex) AS mmi FROM dbo.T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(ManageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { //20091218 if ((dv[0]["mmi"] != DBNull.Value) && (dv[0]["mmi"].ToString() == minMidx.ToString())) { IfModify = true; IfUseNegativeDevice = true;//20100610 } } } else if ((_DeviceKind == 4) && ((_DeviceOrder == 3) || (_DeviceOrder == 5))) {//20100108对穿梭车送货对接应该加于限制,载货,空闲 devinfo = Model.CGetInfo.DeviceInfo[DeviceIdx]; if ((devinfo.RunState == 0) && (devinfo.HaveGoods == true)) { IfModify = true; IfUseNegativeDevice = false;//20100610 } devinfo = null; } else { IfModify = true; IfUseNegativeDevice = true;//20100610 } if (IfModify == true) { int altsn = ccf.GetSerialNumberFromRouteDevice(_routeID, _OutsideAltDevice); sql.Remove(0, sql.Length); sql.Append("SELECT F_SerialNumber FROM T_Base_Device,T_Base_Route_Device,T_Base_Device_State where ").Append( " T_Base_Device.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and F_ErrorCode =F_DeviceErrorIndex and ").Append( " T_Base_Device_State.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex AND T_Base_Device.F_ErrorCode > 0 AND ").Append( " T_Base_Route_Device.F_SerialNumber > ").Append(_serialNumber).Append(" AND T_Base_Route_Device.F_SerialNumber > ").Append( altsn).Append(" AND T_Base_Route_Device.F_RouteIDSub = ").Append(_routeID).Append(" and F_ErrorLevel=2 "); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { //判断能否改道;向管理申请改道;把ManageTaskIdx,ManageKindIdx 的调度任务全部申请改道 if (GetUsableDestination(_ManageTaskIdx, _ManageKindIdx) == true) { return true; } } #region RGV目标位置被占用需要申请改道 //20100610 devinfo = null; if (_DeviceKind == 4) {//RGV devinfo = Model.CGetInfo.GetDeviceInfo(CDisassembleTask.GetNextDevice(_routeID, _serialNumber)[0]); } else {//输送机送货 devinfo = Model.CGetInfo.GetDeviceInfo(CDisassembleTask.GetNextDevice(_routeID, _serialNumber)[0]);//RGV int sn = 0; if (devinfo != null) { sn = ccf.GetSerialNumberFromRouteDevice(_routeID, devinfo.DeviceIndex); } devinfo = Model.CGetInfo.GetDeviceInfo(CDisassembleTask.GetNextDevice(_routeID, sn)[0]);//接货输送机 } if (devinfo != null) { if (devinfo.HaveGoods == true) {//目标位置被占用,申请改道 if (GetRGVIdleDestination(_ManageTaskIdx, _ManageKindIdx, devinfo.DeviceIndex, IfUseNegativeDevice) == true) { return true; } } } #endregion } } #endregion */ #endregion } #endregion //无用的 if (DeviceKind == 6) { #region AGV if (AgvNo != 65535)//如果是已经分配车号的AGV命令,检查这个车号对应的设备索引是否被锁定 { //LockedState = Convert.ToInt32(dbo.GetSingle("SELECT F_LockedState FROM T_Base_Device where F_DeviceIndex=" + (DeviceIdx + AgvNo) + "")); //if(LockedState>0)return true; } if (AheadDetectOK(minMidx, _AheadDetect, "NO") == true)//提前检测通过 { #region 双叉AGV检测,能同步的关联任务是否AheadDetectOK //20100323 devinfo = Model.CGetInfo.GetDeviceInfo(_DeviceIdx); if (devinfo.IfCorrelDoubleFork == "1") { int[] synctask=Model.CGeneralFunction.MutiForkIfSync(minMidx, _DeviceIdx, _DeviceKind); if (synctask != null)//20120616 { //if((synctask.GetLength(0)==1)&&(synctask[0]==minMidx ))return true;//20120616等待未拆分的可同步执行的任务 string[] df =null; Dictionary mforkmonitorinfo= Model.CGeneralFunction.GetDoubleForkMonitorInfo(minMidx, _DeviceIdx); if (mforkmonitorinfo!=null) { foreach (int i in mforkmonitorinfo.Keys) { df = mforkmonitorinfo[i]; if (df != null) { if (minMidx != Convert.ToInt32(df[0]) && AheadDetectOK(Convert.ToInt32(df[0]), df[1], "NO") == false)//多叉关联提前检测失败 { return true; } #region 关联指令不是第一个指令不能发送 //int rmankind = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(Convert.ToInt32(df[0])); //int rman = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(Convert.ToInt32(df[0])); //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(")"); //dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //if (dv.Count > 0) //{ // if ((dv[0]["mmi"] != DBNull.Value) && (dv[0]["mmi"].ToString() != df[0])) // { // return true; // } //} #endregion } } } } } #endregion return false; } else { return true; } #endregion } else { //非AGV设备:输送机、堆垛机、RGV等 add for CATL YB2 #region 非AGV设备:输送机、堆垛机、RGV等 预约锁 //第一个设备是否被占用,RGV和堆垛机要考虑分步控制时,没执行完连续动作时不接受新的调度任务 if (((_LockedState == 0) && (checkLockedstate == true)) || (checkLockedstate == false)) { #region 检查RGV、堆垛机等是否被调度任务预约F_ManTaskReserve if (_ManTaskReserve > 0 && DeviceKind != 2) { devinfo = Model.CGetInfo.GetDeviceInfo(_DeviceIdx); if (devinfo.IfCorrelDoubleFork == "1") { #region 多叉关联 Dictionary mforkmonInfo = Model.CGeneralFunction.GetDoubleForkMonitorInfo(minMidx, _DeviceIdx); bool iftrue = true; int relfid = ccf.GetRELATIVECONTORLIDFromManageTask(_ManageKindIdx, _ManageTaskIdx); if (_ManTaskReserve.ToString() == _ManageKindIdx.ToString() + _ManageTaskIdx.ToString()) { iftrue = false; } else { if (relfid > 0) {//20130704 dv = dbo.ExceSQL(string.Format("SELECT FID FROM T_Manage_Task where F_RELATIVECONTORLID={0} and F_ManageTaskKindIndex={1}", relfid, _ManageKindIdx)).Tables[0].DefaultView; for (int mt = 0; mt < dv.Count; mt++) { if (_ManTaskReserve.ToString() == _ManageKindIdx.ToString() + dv[mt]["FID"].ToString()) { iftrue = false; } } } } if (iftrue == true) { UpdateAheadDetectUnallow(new StringBuilder(_DeviceIdx.ToString() + "被任务预约" + _ManTaskReserve.ToString().Substring(1)), minMidx); return true; } #endregion } else { if (_ManTaskReserve.ToString() != _ManageKindIdx.ToString() + _ManageTaskIdx.ToString()) { UpdateAheadDetectUnallow(new StringBuilder(_DeviceIdx.ToString() + "被任务预约" + _ManTaskReserve.ToString().Substring(1)), minMidx); return true; } } } #endregion //3:F_AheadDetect检测(检测开关编号组“;”) // 参数1 小任务号 提前检测内容 if (AheadDetectOK(minMidx, _AheadDetect, "NO") == true)//提前检测通过 { bool canAssign = true; int CONTROLTASKTYPE = ccf.GetFCONTROLTASKTYPEFromManageTask(ManageKindIdx, ManageTaskIdx); devinfo = Model.CGetInfo.GetDeviceInfo(_DeviceIdx); if (_DeviceIdx == devinfo.VirtualStack && devinfo.IfCorrelDoubleFork != "1")//20181017 { //string DoWorkStack, string ChangeCell, string ChangeStackCell2,int UseAwayFork,int UseAwayFork2, bool DeleteRelative AssignStackNo(_DeviceIdx, minMidx, ManageKindIdx, ManageTaskIdx, "", "", "", 0, 0, false, CONTROLTASKTYPE); return true;//20120906 } #region 增加双顶升站台 任务发送的时候任务同步发送 把路径改为下一节设备,就在检测两个不同下节设备了 // add for CATL YB2 未修改完 // 如果是双叉关联任务输送机,发送双任务时候 //if (devinfo.IfCorrelDoubleFork == "1" && devinfo.DeviceKind == 2) //{ // 查出关联任务号和关联任务对应的大任务 ManageTaskIdx // 方法 ManageTaskIdx 为大任务号 // 关联设备任务号 //int relativeControlID = ccf.GetGoodMatchID(ManageTaskIdx); //// 关联任务对应的 管理任务号 //int assTaskID = ccf.GetGoodMatchIDFid(ManageTaskIdx, relativeControlID); //if (GetSendInfo(minMidx) == false) //{//20120420 // return true; //} //} #endregion #region 多叉堆垛机检测,能同步的DoubleFork是否AheadDetectOK //20100323 //devinfo = Model.CGetInfo.GetDeviceInfo(_DeviceIdx); if (devinfo.IfCorrelDoubleFork == "1" && ((devinfo.DeviceKind == 1) || (devinfo.DeviceKind == 4))) { int[] synctask = Model.CGeneralFunction.MutiForkIfSync(minMidx, _DeviceIdx, _DeviceKind); if (synctask != null)//20120616 { if ((synctask.GetLength(0) == 1) && (synctask[0] == minMidx)) return true;//20120616等待未拆分的可同步执行的任务 string[] df = null; Dictionary mforkmonitorinfo = Model.CGeneralFunction.GetDoubleForkMonitorInfo(minMidx, _DeviceIdx); foreach (int i in mforkmonitorinfo.Keys) { if (Array.IndexOf(synctask, i) >= 0) {//20120906 df = mforkmonitorinfo[i]; if (df != null && Convert.ToInt32(df[0]) != minMidx)//20181007自己可以不用判断了 { if (AheadDetectOK(Convert.ToInt32(df[0]), df[1], "NO") == false)//多叉关联提前检测失败 { AheadDetectUnallow.Remove(0, AheadDetectUnallow.Length); AheadDetectUnallow.Append("ID为" + df[0] + "的关联任务下发条件不满足!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); //return true; if (DeviceIdx == devinfo.VirtualStack)//20181007 { canAssign = false; break; } else { return true; } } #region 关联指令不是第一个指令不能发送 int rmankind = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(Convert.ToInt32(df[0])); int rman = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(Convert.ToInt32(df[0])); sql.Remove(0, sql.Length); // oracle 修改 sql.Append("SELECT MIN(F_MonitorIndex) AS mmi FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(rman).Append(") AND (F_ManageTASKKINDINDEX = ").Append(rmankind).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if ((dv[0]["mmi"] != DBNull.Value) && (dv[0]["mmi"].ToString() != df[0])) { if (DeviceIdx == devinfo.VirtualStack)//20181007 { canAssign = false; break; } else { return true; } } } #endregion } } } } if (_DeviceIdx == devinfo.VirtualStack && devinfo.DeviceKind == 1) { if (canAssign)//双叉检测都通过 { // string[] df = null; //查找双叉任务分别对应的取送货堆垛机 Dictionary mforkmonitorinfo = Model.CGeneralFunction.GetDoubleForkMonitorInfo(minMidx, _DeviceIdx); bool IfCombinedWork = false; string getstack, sendstack; int workstackcount; bool IfCombinedWork2 = false; string getstack2, sendstack2; int workstackcount2; bool ifget = GetWorkStack(_DeviceIdx, minMidx, out getstack, out sendstack, out IfCombinedWork, out workstackcount); bool sameCombined = false;//同时倒换堆垛机,此时需要选择两个相邻的中转站台 bool deleteRelative = false;//是否解除关联关系 string workstack = string.Empty; string cell = ""; string cell2 = ""; string TaskUseAwayFork = "0";//1,2,3;0没分配货叉 string TaskUseAwayFork2 = "0";//1,2,3;0没分配货叉 int temptask = minMidx; if (mforkmonitorinfo != null) { foreach (int CorrTaskindex in mforkmonitorinfo.Keys) { if (CorrTaskindex != minMidx) { int ManageTaskIdx2 = ccf.GetManageTaskIndexfromMonitor(CorrTaskindex); int ManageKindIdx2 = ccf.GetManageTaskKindIndexFromMonitor(CorrTaskindex); bool ifCorrget = GetWorkStack(_DeviceIdx, CorrTaskindex, out getstack2, out sendstack2, out IfCombinedWork2, out workstackcount2); if (IfCombinedWork && IfCombinedWork2)//表示同时倒换堆垛机 { sameCombined = true;//表示同时倒换堆垛机 TaskUseAwayFork = Model.CGeneralFunction.GetUseAwayFork(minMidx);//1,2,3;0没分配货叉 TaskUseAwayFork2 = Model.CGeneralFunction.GetUseAwayFork(CorrTaskindex);//1,2,3;0没分配货叉 //cell = GetChangeStackCellFromStackInfoByFork(getstack, Convert.ToInt32(TaskUseAwayFork)); //cell2 = GetChangeStackCellFromStackInfoByFork(getstack2, Convert.ToInt32(TaskUseAwayFork2)); cell = GetDoubleChangeStackCellFromStackInfoByFork(getstack, Convert.ToInt32(TaskUseAwayFork), Convert.ToInt32(TaskUseAwayFork2), out cell2); if (cell == "" || cell2 == "") { UpdateAheadDetectUnallow(new StringBuilder("需要两个中转站台,存在不可用中转站台"), minMidx); UpdateAheadDetectUnallow(new StringBuilder("需要两个中转站台,存在不可用中转站台"), CorrTaskindex); return true; } //查找本任务货叉对应的中转站台 //查找关联任务货叉对应的中转站台 //都找到对应中转站台之后,才能进行虚拟堆垛机的分配 //ccf.GetFreeStation(); //ccf.GetFreeStation(); } if (!IfCombinedWork && !IfCombinedWork2)//都不需要倒换堆垛机 { //判读取货堆垛机是否相同,如果相同则正常分配,如果不同则解除关联关系 if (getstack != getstack2) { if (getstack.Contains(getstack2))//使用关联任务堆垛机 { workstack = getstack2; minMidx = CorrTaskindex; ManageTaskIdx = ManageTaskIdx2; ManageKindIdx = ManageKindIdx2; } else if (getstack2.Contains(getstack))//使用该堆垛机 { workstack = getstack; } else//解除关联关系 { deleteRelative = true; } } else//使用谁都可以 { } } if (IfCombinedWork && !IfCombinedWork2)//使用中转的IfCombinedWork的堆垛机 { workstack = getstack; if (CONTROLTASKTYPE == 1) //入库任务,使用不需要中转的堆垛机 { workstack = getstack2; minMidx = CorrTaskindex; ManageTaskIdx = ManageTaskIdx2; ManageKindIdx = ManageKindIdx2; cell2 = ""; } } if (!IfCombinedWork && IfCombinedWork2)//使用IfCombinedWork2的堆垛机 { workstack = getstack2; minMidx = CorrTaskindex; if (CONTROLTASKTYPE == 1) //入库任务,使用不需要中转的堆垛机 { workstack = getstack; minMidx = temptask; //ManageTaskIdx = ManageTaskIdx2; //ManageKindIdx = ManageKindIdx2;//20181219 cell2 = ""; } } } } } //string DoWorkStack, string ChangeCell, string ChangeStackCell2,int UseAwayFork,int UseAwayFork2, bool DeleteRelative AssignStackNo(_DeviceIdx, minMidx, ManageKindIdx, ManageTaskIdx, workstack, cell, cell2, Convert.ToInt32(TaskUseAwayFork), Convert.ToInt32(TaskUseAwayFork2), deleteRelative, CONTROLTASKTYPE); return true;//20120906 } return true;//20120906 } } #endregion #region 注释虚拟堆垛机 //if (_DeviceIdx == devinfo.VirtualStack) //{//20111020 // if(canAssign) // { // AssignStackNo(_DeviceIdx, minMidx, ManageKindIdx, ManageTaskIdx); // } // return true;//20120906 //} #endregion //检查同步运行的关联设备F_AssociateDeviceIndex //4:是否有关联设备命令? #region 是否有关联设备命令 //AssociateDevice = ccf.GetAssociateDevice(minMidx); if (_Associate != 0) { //5:如果有,找到可以运行的关联设备的设备指令,能否运行? //重复递归到2 //split = AssociateDevice.Split(sep); adidx = _Associate; if (adidx != 0) { #region 有关联任务 if (ccf.GetAssociateMonitor(minMidx) == 0) { RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "设备指令:" + minMidx.ToString() + "无法获得关联任务" + adidx.ToString() + ",不能发送此类命令!"); OnRefreshMonitor(rmea); return true; } if (GetFirstDeviceIFLocked(adidx, false) == false) { //6:发送关联设备命令 //CStaticClass.MessageIndex++; CStaticClass.MessageIndex = 1; msgIdx = (CStaticClass.MessageIndex); sdo = CommModeCreate.CreateSendDeviceOrder(_DeviceIdx); //判断是否为堆垛机设备 bool sendok; int[] gc = new int[6] { _NumParam2, _NumParam3, _NumParam1, _NumParam5, _NumParam6, _NumParam4 }; //ccf.GetCoordinatesFromMonitorTask(adidx);//获得坐标 if ((_DeviceKind == 1) || (_DeviceKind == 6)) { //1:堆垛机;4:RGV;6:AGV如果需要优化调度(设备表的F_NeedOptimize='1') //直接写入表:T_Monitor_Task_Child,不发送命令 if (ccf.NeedOptimize(_DeviceIdx) == true) { ccf.InsertMonitorOptimizeChildTask(adidx); sendok = true; } else { sendok = sdo.SendDeviceOrder(msgIdx, adidx, _DeviceOrder, _DeviceIdx, gc[0], gc[1], gc[2], gc[3], gc[4], gc[5]); } } else if (_DeviceKind == 4) { if (ccf.NeedOptimize(_DeviceIdx) == true) { ccf.InsertMonitorOptimizeChildTask(adidx); sendok = true; } else { sendok = sdo.SendDeviceOrder(msgIdx, adidx, _DeviceOrder, _DeviceIdx, gc[2]); } } else { sendok = sdo.SendDeviceOrder(msgIdx, adidx, _DeviceOrder, _DeviceIdx, gc[5]); } if (sendok == false) { return true; } else { //8:更改作业记录的状态F_Status为1,更改设备为占用状态(T_Base_device的F_LockedState=设备指令单) sql.Remove(0, sql.Length); //sql.Append("update T_Monitor_Task set F_StartTime='").Append(DateTime.Now.ToString("u")).Append("',F_Status='1' where F_MonitorIndex=").Append(adidx); sql.Append("update T_Monitor_Task set F_StartTime='").Append(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")).Append("',F_Status='1' where F_MonitorIndex=").Append(adidx); //获取到毫秒的时间值20170923 dbo.ExceSQL(sql.ToString()); //返回到原来设备值 _DeviceIdx = DeviceIdx;//设备索引 _routeID = routeID;//路径唯一索引 _serialNumber = serialNumber;//路径上的设备方向性链表的序号 _ManageTaskIdx = ManageTaskIdx;//调度任务索引 _ManageKindIdx = ManageKindIdx;//调度任务类型 _DeviceOrder = DeviceOrder;//设备命令 _LockedState = LockedState; _Associate = Associate; _ManTaskReserve = ManTaskReserve; _AheadDetect = AheadDetect; _NumParam1 = NumParam1; _NumParam2 = NumParam2; _NumParam3 = NumParam3; _NumParam4 = NumParam4; _NumParam5 = NumParam5; _NumParam6 = NumParam6; _TxtParam = TxtParam; _DeviceKind = DeviceKind; _OutsideAltDevice = OutsideAltDevice; _InsideAltDevice = InsideAltDevice; _StartDevice = StartDevice; _EndDevice = EndDevice; _RouteKind = RouteKind; _AgvNo = AgvNo; return false; } } else { return true; } #endregion } else// { #region MyRegion //返回到原来设备值 _DeviceIdx = DeviceIdx;//设备索引 _routeID = routeID;//路径唯一索引 _serialNumber = serialNumber;//路径上的设备方向性链表的序号 _ManageTaskIdx = ManageTaskIdx;//调度任务索引 _ManageKindIdx = ManageKindIdx;//调度任务类型 _DeviceOrder = DeviceOrder;//设备命令 _LockedState = LockedState; _Associate = Associate; _ManTaskReserve = ManTaskReserve; _AheadDetect = AheadDetect; _NumParam1 = NumParam1; _NumParam2 = NumParam2; _NumParam3 = NumParam3; _NumParam4 = NumParam4; _NumParam5 = NumParam5; _NumParam6 = NumParam6; _TxtParam = TxtParam; _DeviceKind = DeviceKind; _OutsideAltDevice = OutsideAltDevice; _InsideAltDevice = InsideAltDevice; _StartDevice = StartDevice; _EndDevice = EndDevice; _RouteKind = RouteKind; #endregion CControlError = string.Format("拆分调度任务得到的设备指令与详细路径的检索到的关联设备指令不匹配,系统作为没有关联设备指令处理!"); return false; } } else { #region 返回到原来设备值 //返回到原来设备值 _DeviceIdx = DeviceIdx;//设备索引 _routeID = routeID;//路径唯一索引 _serialNumber = serialNumber;//路径上的设备方向性链表的序号 _ManageTaskIdx = ManageTaskIdx;//调度任务索引 _ManageKindIdx = ManageKindIdx;//调度任务类型 _DeviceOrder = DeviceOrder;//设备命令 _LockedState = LockedState; _Associate = Associate; _ManTaskReserve = ManTaskReserve; _AheadDetect = AheadDetect; _NumParam1 = NumParam1; _NumParam2 = NumParam2; _NumParam3 = NumParam3; _NumParam4 = NumParam4; _NumParam5 = NumParam5; _NumParam6 = NumParam6; _TxtParam = TxtParam; _DeviceKind = DeviceKind; _OutsideAltDevice = OutsideAltDevice; _InsideAltDevice = InsideAltDevice; _StartDevice = StartDevice; _EndDevice = EndDevice; _RouteKind = RouteKind; #endregion return false; } #endregion } else { return true; } } else { return true; } #endregion } } catch (Exception ex) { CControlError = string.Format("发送命令调用GetFirstDeviceIFLocked时:{0}" ,ex.StackTrace+ex.Message ); return true; } finally { dv.Dispose(); } } /// /// 检测指定设备命令的执行先决条件是否成立 /// /// 监控唯一索引 /// 是否检测通过,true表示设备执行命令的先决条件成立 public bool AheadDetectOK(int minMidx, string _AheadDetect,string NoDetect) { //if (NoDetect!="NO") { //获得要发送的信息 if (GetSendInfo(minMidx) == false) {//20120420 return false; } } AheadDetectUnallow.Remove(0, AheadDetectUnallow.Length);//20110505 int[] States; string dtime = DateTime.Now.ToString("u"); dtime = dtime.Substring(0, dtime.Length - 1); int DeviceIdx = _DeviceIdx; int TaskIdx = minMidx; int fid = ccf.GetManageTaskIndexfromMonitor(TaskIdx); //获取关联任务ID的 int matchId = ccf.GetGoodMatchID(fid); //返回关联任务号对应的关联任务ID int matchFid = ccf.GetGoodMatchIDFid(fid, matchId); int mti = ccf.GetManageTaskKindIndexFromMonitor(TaskIdx); int DeviceKind = ccf.GetDeviceKindIdx(DeviceIdx);//20100617 int order = ccf.GetDeviceOrderFromMonitor(TaskIdx); int StartDevice = _StartDevice;//当前调度任务起点 int EndDevice = _EndDevice;//当前调度任务终点 int DeviceOrder = _DeviceOrder;//设备命令 bool checktask = true; int ManageKindIdx = _ManageKindIdx; int CONTROLTASKTYPE = ccf.GetFCONTROLTASKTYPEFromManageTask(mti, fid); int EXCEPTIONNO = ccf.GetExceptionNOFromManageTask(fid, mti); devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIdx); int statuss = ccf.GetManageTaskStatus(fid, mti); #region 二楼缓存位置缓存数达到上限时,管理下达的任务不在执行 add for CATL YB2 //管理后序回盘 路径不通和没库存不去抽检口 缓存数最大是17 //if (EndDevice == 22459 || EndDevice == 22473 || EndDevice == 42461 || EndDevice == 42475) //{ // // 缓存上限制 为16个 预留5个给跨级 开关x2了 // int count = 0; // // 查询任务终点的开关电是否有 // //int count1 = CStaticClass.GetDevicePhotoelectric(EndDevice, 0); // // 查询当前正在执行的任务数 // int taskCount = Convert.ToInt32(dbo.GetSingle("select count(*) from T_manage_task where FENDDEVICE=" + EndDevice + " and FSTATUS <> 0")); // DataView dvdvkk = new DataView(); // string sqlstr = string.Empty; // sqlstr = string.Format("SELECT F_REMARK,F_MAXCOUNT FROM T_BASE_TASKCOUNT WHERE F_DEVICEINDEX = {0} ", EndDevice); // dvdvkk = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; // string remark = Convert.ToString(dvdvkk[0]["F_REMARK"]); // string[] buffer_R_QTY = remark.Split(';'); // for (int k = 0; k < buffer_R_QTY.Length; k++) // { // // 判断缓存站台开关点 状态 // if (CStaticClass.GetDevicePhotoelectric(Convert.ToInt32(buffer_R_QTY[k]), 0) == 1) // { // count++; // } // } // //count1 + // // 缓存上限的的数量 是程序 // int totalCache = taskCount + count; // if (totalCache >= Convert.ToInt32(dvdvkk[0]["F_MAXCOUNT"])) // { // AheadDetectUnallow.Append("二楼缓存达上限!"); // UpdateAheadDetectUnallow(AheadDetectUnallow, TaskIdx); // return false; // } //} #endregion #region 检测堆垛机货叉 //if (devinfo.IfCorrelDoubleFork == "1") //{ // if (DeviceKind == 1 && order == 5) // { // int forkAmount = 0; // DataView ForkCount = new DataView(); // sql.Remove(0, sql.Length); // sql.Append("SELECT FUseAwayFork from T_Manage_Task where FID = ").Append(fid).Append(" and FUseAwayFork <> ").Append("'").Append("-").Append("'"); // ForkCount = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; // if (ForkCount.Count > 0) // { // forkAmount = Convert.ToInt32(ForkCount[0]["FUseAwayFork"]); // } // if (ForkCount.Count > 0) // { // if (order == 5) // { // if (forkAmount == 2) // { // int yc = CStaticClass.GetDevicePhotoelectric(DeviceIdx, 1); // if (yc != 1) // { // AheadDetectUnallow.Append("双叉堆垛机取货二叉无货!"); // UpdateAheadDetectUnallow(AheadDetectUnallow, TaskIdx); // return false; // } // } // else // { // int jc = CStaticClass.GetDevicePhotoelectric(DeviceIdx, 0); // if (jc != 1) // { // AheadDetectUnallow.Append("双叉堆垛机取货一叉无货!"); // UpdateAheadDetectUnallow(AheadDetectUnallow, TaskIdx); // return false; // } // } // } // } // } //} #endregion if (DeviceKind == 1 && order==1)//回原点检测条件20120110 { if (devinfo.RunState == 0) { return true; } else { return false; } } //检测(检测开关编号组“;”) DataView dv = new DataView(); DataView dvdv = new DataView(); DataView preMadeT = new DataView(); try { if (devinfo.CommType == "OPCClient")//20100706 只有OPCClient通讯类型的检查设备状态 { #region OPC通讯设备检测设备是否故障 // //gds = CommModeCreate.CreateGetDeviceState(DeviceIdx); // try // { // //States = gds.GetDeviceState(DeviceIdx, TaskIdx);//1完成,2任务号,5设备号 // if (DeviceKind == 13) // { // DeviceIdx = GetNowDevice(minMidx); // } // States = CStaticClass.GetDeviceState(DeviceIdx); // } // catch (Exception ex) // {//20110505 // RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "提前检测时:" + ex.Message); // OnRefreshMonitor(rmea); // return false; // } // if (States == null)//没接收到任何返回值 // { // RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "发送命令时,提前检测没收到PLC数据!"); // OnRefreshMonitor(rmea); // return false; // } // if (((States[1] == 1) || (States[1] >= 30)) && ((DeviceKind != 13) && (DeviceKind != 31)))//运行或者故障 // { // if (States[1] >= 30) // { // devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIdx); // int ErrId = States[1]; // //20110505 // errs = Model.CGetInfo.GetErrorInfo(Convert.ToInt32(_DeviceKind.ToString() + States[1].ToString())); // AheadDetectUnallow.Append(DeviceIdx + "有故障:" + errs.ErrorName); // //20090910 // //有过记录的故障设备的任务号,不再重复处理 // sql.Remove(0, sql.Length); // sql.Append("SELECT F_DeviceIndex FROM T_Base_Device where F_DeviceIndex=" ).Append( DeviceIdx ).Append( " and F_ErrorTaskNo=" ).Append( TaskIdx ); // ; // dt = dbo.ExceSQL(sql.ToString()).Tables[0]; // if (dt.Rows.Count >= 1) // { // //20110505 // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false; // } // //记录发生故障的设备正在执行的任务号 // sql.Remove(0, sql.Length); // sql.Append("update T_Base_Device set F_ErrorTaskNo= " ).Append( TaskIdx ).Append( " where F_DeviceIndex= " ).Append( DeviceIdx); // dbo.ExceSQL(sql.ToString()); // if (CStaticClass.IsEquals(devinfo.ReturnMessage, States, 2) == true) return false; // //if ((_DeviceKind == 2) || (_DeviceKind == 4)) // //{//输送机故障清零 // // sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx); // // sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0); // //} // //if (_DeviceKind == 1) //堆垛机、RGV // //{ // // sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx); // // sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0); // //} // //20110505 // RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "设备索引" + DeviceIdx + "有故障:" + errs.ErrorName); // OnRefreshMonitor(rmea); // rmea = new RefreshMonitorEventArgs("notifyIcon1", "警告:" + devinfo.DeviceName + "," + DeviceIdx + "发生故障:" + errs.ErrorName); // OnRefreshMonitor(rmea); // if (mti == 1) // { // sql.Remove(0, sql.Length); // sql.Append("update IO_Control set ERROR_TEXT='" ).Append( "准备执行管理任务时:" ).Append( devinfo.DeviceName ).Append( "," ).Append( DeviceIdx ).Append( errs.ErrorName ).Append( "' where Control_ID=" ).Append( fid); // dboM.ExceSQL(sql.ToString()); // } // sql.Remove(0, sql.Length); // sql.Append("update T_Manage_Task set FERRORCODE='" ).Append( "准备执行管理任务时:" ).Append( devinfo.DeviceName ).Append( "," ).Append( DeviceIdx ).Append( errs.ErrorName ).Append( "' where F_ManageTaskKindIndex=" ).Append( mti ).Append( " and FID=" ).Append( fid); // dbo.ExceSQL(sql.ToString()); // CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null); // OnDataChange("发送指令提前检测时,",cea); // } // return false; // } // #endregion //} //else //{ // #region 延吉:20100319 AGV的指令67:允许AGV放残托时,如果有1219的送出指令、1220的指令正在执行或者已发送,提前检测失败,需要等待 // // // //if (ccf.GetDeviceOrderFromMonitor(minMidx) == 67) // //{ // // dv = dbo.ExceSQL("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceIndex = 1219) AND (F_DeviceCommandIndex = 6) AND (F_Status > 0)").Tables[0].DefaultView; // // if (dv.Count > 0) // // { // // return false; // // } // // dv = dbo.ExceSQL("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceIndex = 1220) AND (F_Status > 0)").Tables[0].DefaultView; // // if (dv.Count > 0) // // { // // return false; // // } // //} #endregion } #region 2220173-时代吉利 二层缓存出库至一楼任务限制 #endregion #region 2220173-时代吉利 增加堆垛机发送前检测判断堆垛机货叉是否被禁用 禁用时 取消关联任务 更改货叉 if (DeviceKind == 1 && (order == 4 ))//|| order == 5 { sql.Remove(0, sql.Length); sql.Append("select F_enableused from T_BASE_STACKINFO where F_STACKINDEX=").Append(DeviceIdx); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { int forkIndex = Convert.ToInt32(dv[0]["F_enableused"]);//禁用的货叉编号 //int forkMuex = 0;//另外一个货叉 if (forkIndex != 0)//存在被禁用的货叉 数据库这个字段默认值是0 { //switch (forkIndex) //{ // case 1: // forkMuex = 2; // break; // case 2: // forkMuex = 1; // break; //} sql.Remove(0, sql.Length); sql.Append("select F_RELATIVECONTORLID,FUSEAWAYFORK from t_Manage_Task where fid=").Append(fid); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { if (Convert.ToInt32(dvdv[0]["F_RELATIVECONTORLID"]) != -1)//有关联任务 解除 { //sql.Remove(0, sql.Length); //sql.Append("update t_Manage_Task set F_RELATIVECONTORLID=-1,FUSEAWAYFORK='").Append(forkMuex).Append("'").Append(" where fid=").Append(fid); //dbo.ExecuteSql(sql.ToString()); //sql.Remove(0, sql.Length); //sql.Append("update T_MONITOR_TASK set F_USEAWAYFORK='").Append(forkMuex).Append("'").Append(" where F_MONITORINDEX=").Append(TaskIdx); //dbo.ExecuteSql(sql.ToString()); //sql.Remove(0, sql.Length); //sql.Append("update t_Manage_Task set F_RELATIVECONTORLID=-1").Append(" where F_RELATIVECONTORLID=").Append(Convert.ToInt32(dvdv[0]["F_RELATIVECONTORLID"])); //dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Manage_Task set F_RELATIVECONTORLID=-1").Append(" where fid=").Append(fid); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Manage_Task set F_RELATIVECONTORLID=-1").Append(" where F_RELATIVECONTORLID=").Append(Convert.ToInt32(dvdv[0]["F_RELATIVECONTORLID"])); dbo.ExecuteSql(sql.ToString()); return false; } //else //{ // if (dvdv[0]["FUSEAWAYFORK"].ToString() == "-" || dvdv[0]["FUSEAWAYFORK"].ToString() == "0") // { // sql.Remove(0, sql.Length); // sql.Append("update t_Manage_Task set FUSEAWAYFORK='").Append(forkMuex).Append("'").Append(" where fid=").Append(fid); // dbo.ExecuteSql(sql.ToString()); // //没有关联任务 给自己换货叉 // sql.Remove(0, sql.Length); // sql.Append("update T_MONITOR_TASK set F_USEAWAYFORK='").Append(forkMuex).Append("'").Append(" where F_MONITORINDEX=").Append(TaskIdx); // dbo.ExecuteSql(sql.ToString()); // return false; // } // else // { // if (Convert.ToInt32(dvdv[0]["FUSEAWAYFORK"]) == forkIndex) // { // sql.Remove(0, sql.Length); // sql.Append("update t_Manage_Task set FUSEAWAYFORK='").Append(forkMuex).Append("'").Append(" where fid=").Append(fid); // dbo.ExecuteSql(sql.ToString()); // //没有关联任务 给自己换货叉 // sql.Remove(0, sql.Length); // sql.Append("update T_MONITOR_TASK set F_USEAWAYFORK='").Append(forkMuex).Append("'").Append(" where F_MONITORINDEX=").Append(TaskIdx); // dbo.ExecuteSql(sql.ToString()); // return false; // } // } //} } } } } //return true;//ceshi #endregion #region 高端设备U线正在运行总数控制 //if ((DeviceKind == 13) && (order==6)) //{//20120328 // int arrdevice = ccf.GetDeviceArrowFromMonitor(minMidx); // int startdevice = ccf.GetDeviceStartFromMonitor(minMidx); // object ob0 = dbo.GetSingle(string.Format("SELECT count(F_MonitorIndex) as UTaskCount FROM T_Monitor_Task where F_DeviceIndex={0} and F_DeviceCommandIndex={1} and F_Status>0", DeviceIdx, order)); // DataView dvu = dbo.ExceSQL(string.Format("SELECT F_MaxRunTask,F_OutputUDevice,F_InputUDevice FROM T_Base_UArea WHERE (F_UCODE = {0})", DeviceIdx)).Tables[0].DefaultView; // if ((dvu.Count>0) && (ob0 != null)) // { // if (arrdevice == Convert.ToInt32(dvu[0]["F_OutputUDevice"])) // { // //if (Convert.ToInt32(ob0) >= Convert.ToInt32(dvu[0]["F_MaxRunTask"])) // //{ // // AheadDetectUnallow.Append("U线:" + DeviceIdx.ToString() + "正在运行任务已经超限!"); // // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // // return false; // //} // } // else // { // if ((Convert.ToInt32(ob0) >= (Convert.ToInt32(dvu[0]["F_MaxRunTask"]) - 2)) && (startdevice == Convert.ToInt32(dvu[0]["F_InputUDevice"]))) // { // AheadDetectUnallow.Append("U线:" + DeviceIdx.ToString() + "正在运行任务已经超限!"); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false; // } // if ((Convert.ToInt32(ob0) >= (Convert.ToInt32(dvu[0]["F_MaxRunTask"]) - 1)) && (startdevice != Convert.ToInt32(dvu[0]["F_InputUDevice"]))) // { // //AheadDetectUnallow.Append("U线:" + DeviceIdx.ToString() + "正在运行任务已经超限!"); // //UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // //return false; // } // } // } //} #endregion #region zk 增加发送输送线任务提前检测 条码是否一致 if (DeviceKind == 2 && order == 6) { sql.Remove(0, sql.Length); sql.Append("select F_barcode,F_deviceINdex from t_Base_Plc_Ask where F_BindingDevice=").Append(DeviceIdx); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) //有扫码器的位置 { sql.Remove(0, sql.Length); sql.Append("select F_txtParam from t_Monitor_Task where F_monitorIndex=").Append(minMidx); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (!string.IsNullOrEmpty(dvdv[0]["F_txtParam"].ToString())) { if (dvdv[0]["F_txtParam"].ToString() != dv[0]["F_barcode"].ToString()) { AheadDetectUnallow.Append("当前任务条码和申请条码不一致!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } } #endregion #region 判断执行中任务数是否超过限制 add for CATL YB2 控制任务数包括 站台移库任务 // 根据终点位置查询 T_Base_TaskCount 表中的允许执行的最大数量 ,根据这个数量限制执行任务数 //只判断起点是巷道的任务 if ((statuss == 0) && (ManageKindIdx == 2)) { //判断逻辑区域与该任务相同的任务数量 string sqlstrsh = string.Format("select * from T_Base_TaskCount where F_DeviceIndex={0}", EndDevice);//查找终点设备对应的出库任务获取数量和执行数量 dvdv = dbo.ExceSQL(sqlstrsh).Tables[0].DefaultView; if (dvdv.Count > 0) { //int execount; //getcount, //getcount = Convert.ToInt32(dvdv[0]["F_MAXCOUNT"]); int execount = Convert.ToInt32(dvdv[0]["F_EXECOUNT"]); //string checkgoodsdevicee = Convert.ToString(dvdv[0]["F_CHECKGOODS"]);//判读输送机是否有货 string checkgoodsdevicee = Convert.ToString(dvdv[0]["F_CHECKGOODS"]); string[] checkGoods = checkgoodsdevicee.Split(';'); if (execount > 0)//只有在>0时判断 { // 查询出不是当前任务号的 终点位置 是 当前终点位置的任务正在执行的 任务数 sqlstrsh = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FSTATUS > 0) AND FID!={0} and FENDDEVICE='{1}'", fid, EndDevice); dvdv = dbo.ExceSQL(sqlstrsh).Tables[0].DefaultView; int count = dvdv.Count;//已经执行的任务数量 // int goodscounts = ccf.GetTransDeviceGoodsCounts(checkgoodsdevicee);//判读出库目标输送机货物数量 int goodscounts = 0;//判读出库目标输送机货物数量 ccf.GetTransDeviceGoodsCounts(checkgoodsdevice) for (int n = 0; n < checkGoods.Length; n++) { // 判断缓存站台开关点 状态 GetTransDeviceGoodsCounts CStaticClass.GetDevicePhotoelectric(Convert.ToInt32(endTopDevice[j]), 0) == 1 // 终点站台没货 且 无物 if (ccf.GetTransDeviceGoodsCounts(checkGoods[n].ToString()) > 0) { goodscounts = goodscounts + ccf.GetTransDeviceGoodsCounts(checkGoods[n].ToString()); } } // 已经执行的任务数量 和 终点位置任务数量 之和 count += goodscounts; // CATL YB2 抽检口单独限制 //抽检口限制执行的任务数为1 并且判断后面两个站台的,不能自己锁自己 回退任务不判断 //if (!"11501,31501".Contains(StartDevice.ToString()) && !"13501,33501".Contains(EndDevice.ToString())) //2220173-时代吉利 if (!"33501,31502".Contains(StartDevice.ToString()) && !"13501,11502".Contains(EndDevice.ToString())) { // 如果正在执行的任务数和终点位置任务数之和大于允许执行的任务数 if (count >= execount) { //如果是双叉关联任务则不判断 双叉关联任务只在获取任务的时候判断 int relFID = Model.CGeneralFunction.GetRelativeControlID(mti, fid); if (relFID == -1)//对于已经进行双叉关联的任务,不进行判断,由于上面判断了是否有货,所以可能会出现堆垛机取完一个货物后,在取第二个货时不满足条件 { AheadDetectUnallow.Append("终点为" + EndDevice.ToString() + "的执行中出库任务数量超限! 最大值为" + execount.ToString()); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } } } #endregion #region 堆垛机取货条码比对 入库任务比对条码 条码不一样不允许入库 #region 堆垛机取货条码比对 if (CONTROLTASKTYPE == 1 && order == 4 && DeviceKind == 1) { #region 堆垛机取货进行条码比对 // 根据起点位置判断条码扫描是哪个 int bindingDevice = 0; //2220173-时代吉利 switch (StartDevice) { case 11703: case 11702: bindingDevice = 11703; break; case 11706: case 11705: bindingDevice = 11706; break; case 11709: case 11708: bindingDevice = 11709; break; case 11418: case 11417: bindingDevice = 11418; break; case 11414: case 11413: bindingDevice = 11414; break; case 11411: case 11410: bindingDevice = 11411; break; case 31703: case 31702: bindingDevice = 31703; break; case 31706: case 31705: bindingDevice = 31706; break; case 31709: case 31708: bindingDevice = 31709; break; case 31411: case 31410: bindingDevice = 31411; break; case 31414: case 31413: bindingDevice = 31414; break; case 31417: case 31416: bindingDevice = 31417; break; } int comcount = 0; DataView plcAsk = new DataView(); plcAsk = dbo.ExceSQL(string.Format("select F_BARCODE from T_BASE_PLC_ASK where F_BINDINGDEVICE = {0}", bindingDevice)).Tables[0].DefaultView; string[] compare = plcAsk[0]["F_BARCODE"].ToString().Split('|'); // 堆垛机取货任务 判断起始站台任务条码 跟 PLC_ASK 表比对 if (!plcAsk[0]["F_BARCODE"].ToString().Equals("11111") && plcAsk[0]["F_BARCODE"].ToString() != "") { int relFIDcom = Model.CGeneralFunction.GetRelativeControlID(mti, fid); DataView nowTaskBarcode = new DataView(); nowTaskBarcode = dbo.ExceSQL(string.Format("select FPALLETBARCODE from T_MANAGE_TASK where FID= {0}", fid)).Tables[0].DefaultView; if (relFIDcom == -1) { if (compare[0].ToString().Equals(nowTaskBarcode[0]["FPALLETBARCODE"].ToString()) && compare.Length ==1) { comcount++; } } else { #region // 关联任务判断两个任务号 哪个小 哪个任务在前面 if (matchFid > fid) { if (compare[0].ToString().Equals(nowTaskBarcode[0]["FPALLETBARCODE"].ToString())) { comcount++; } } else { if (compare[1].ToString().Equals(nowTaskBarcode[0]["FPALLETBARCODE"].ToString())) { comcount++; } } #endregion } } if (comcount <= 0) { AheadDetectUnallow.Append("当前任务条码和申请条码不一致!"); UpdateAheadDetectUnallow(AheadDetectUnallow, TaskIdx); return false; } #endregion } #endregion #endregion #region 限制堆垛机执行同一终点出库任务的数量 catl yb2 控制任务数 不包括站台移库 只控制堆垛机出库 这只判断不是关联任务的堆垛机出库 //任务为出库时,限制数量>0时,设备为堆垛机时,指令为取货时 int outcount =0;//普通出库任务暂时不限制 string enddevices,startsdevices,strinfo=string.Empty;//拆垛任务终点 string sqlstr = string.Empty; string checkgoodsdevice = string.Empty; bool checkSendDevice = true;//出库时在执行取货任务时,是否判断目标输送机的状态 string sqlin = "SELECT min(F_MonitorIndex) as minMidx FROM T_Monitor_Task,T_Manage_Task where FID=F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex=T_Monitor_Task.F_ManageTASKKINDINDEX group by F_ManageTaskIndex"; //只判断起点是巷道的任务 if (DeviceKind == 1 && (DeviceOrder == 2 || DeviceOrder == 4) && StartDevice.ToString().IndexOf("80") >= 0)// && EndDevice.ToString().IndexOf("180") < 0)//限制不为0,堆垛机, 取货, 起点是巷道 && (devinfo.IfCorrelDoubleFork != "1") { //先判断是否有该任务的关联任务已经执行,如果有则该任务也可以执行 //判断逻辑区域与该任务相同的任务数量 sqlstr = string.Format("select * from T_Base_TaskCount where F_DeviceIndex={0}", EndDevice);//查找终点设备对应的出库任务获取数量和执行数量 dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int getcount, execount; getcount = Convert.ToInt32(dvdv[0]["F_MAXCOUNT"]); execount = Convert.ToInt32(dvdv[0]["F_EXECOUNT"]);//T_Base_TaskCount 表的最大出库数量限制 //checkdevice = Convert.ToInt32(dvdv[0]["F_CHECKDEVICE"]);// enddevices = Convert.ToString(dvdv[0]["F_CHECKENDDEVICE"]);//要判读是否存在该终点的设备 startsdevices = Convert.ToString(dvdv[0]["F_CHECKSTARTDEVICE"]);//要判断是否存在该起点的设备 //checkgoodsdevice = Convert.ToString(dvdv[0]["F_CHECKGOODS"]);//判读输送机是否有货 checkgoodsdevice = Convert.ToString(dvdv[0]["F_CHECKGOODS"]); string[] checkGoods = checkgoodsdevice.Split(';'); outcount = execount; if (startsdevices != "0" || enddevices != "0")//表示同时执行时 { sqlstr = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FSTARTDEVICE in({0})) OR (FENDDEVICE in({1}))", startsdevices, enddevices); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0)//存在相互干扰的出入库任务时,按出库数量限制 { outcount = execount; } else//只存在当前终点的任务时,按获取数量限制,一般情况 获取数量要大于执行数量 { outcount = getcount; } } if (outcount > 0)//只有在>0时判断 { //从T_Manage_Task表里获取到逻辑区域 FLOGIC_AREA 这个字段 int area = ccf.GetLogicAreaFromManageTask(mti, fid); //查询出大任务的 管理任务号 和 任务类型 条件 控制任务 类型不是4 sqlstr = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FSTATUS > 0) AND FID!={0} AND FCONTROLTASKTYPE != 4 AND (FLOGIC_AREA ={1}) ", fid, area); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; int count = dvdv.Count;//已经执行的任务数量 //拆垛位要判断,起位置是否有货 int goodscounts = 0;//判读出库目标输送机货物数量 ccf.GetTransDeviceGoodsCounts(checkgoodsdevice) for (int p = 0; p < checkGoods.Length; p++) { // 判断缓存站台开关点 状态 GetTransDeviceGoodsCounts CStaticClass.GetDevicePhotoelectric(Convert.ToInt32(endTopDevice[j]), 0) == 1 // 终点站台没货 且 无物 if (ccf.GetTransDeviceGoodsCounts(checkGoods[p].ToString()) > 0) { goodscounts = goodscounts + ccf.GetTransDeviceGoodsCounts(checkGoods[p].ToString()); } } count += goodscounts; if (count >= outcount) { // CATL YB2 抽检口单独限制 //抽检口限制执行的任务数为1 并且判断后面两个站台的,不能自己锁自己 //如果是已经执行的任务不判断。执行时发生故障,再次发送时可能不满足发送条件 int status = ccf.GetManageTaskStatus(fid, mti); if (status == 0 )//只判断未执行的任务 { int relFID = Model.CGeneralFunction.GetRelativeControlID(mti, fid); //如果是双叉关联任务则不判断 if (relFID == -1)//对于已经进行双叉关联的任务,不进行判断,由于上面判断了是否有货,所以可能会出现堆垛机取完一个货物后,在取第二个货时不满足条件 { AheadDetectUnallow.Append(string.Format("{0}出库任务数量限制为:{1},该出库任务暂时不能执行,请耐心等待! ", strinfo, outcount)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } else {//如果出库数量是0的时候 这时候执行出库的时候不执行提前检测,堆垛机会驮个货在身上等着 checkSendDevice = false; } } } #endregion #region 判断堆垛机等待执行的任务数 不能大于3 if (mti != 4 && (DeviceKind == 1) ) { int status = ccf.GetManageTaskStatus(fid, mti); if (status == 0) { //判断起点设备类型 int kind = ccf.GetDeviceKindIdx(StartDevice);//20100617 if (kind == 2) { //sqlstr = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FSTATUS = 0) AND FID!={0} AND FCONTROLTASKTYPE != 4 AND (FSTARTDEVICE ={1}) ", fid, StartDevice); sqlstr = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FSTATUS = 0) AND FID!={0} AND (FSTARTDEVICE ={1}) ", fid, StartDevice); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; int count = dvdv.Count; if (count > 1) { AheadDetectUnallow.Append(string.Format("该起点等待执行的任务数量为:{0},不能执行! ", count + 1)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } #endregion #region 在发送任务起点是输送机的任务时,要判断不存在该起点的其他任务(起点任务数量限制 限制起点是等待执行的任务) CATL YB2 //对于一个等待执行的调度任务,当发送第一条设备指令时,要判断是否存在该起点的等待执行的调度任务 //起点设备是输送机 //CControl_AheadDetectOK_NotOnlyOneTask //if (mti != 4 && (DeviceKind == 2) && (StartDevice != 42442 && StartDevice != 42439 && StartDevice != 22441 && StartDevice != 22438 && StartDevice != 22469 && StartDevice != 22483 && StartDevice != 42471 && StartDevice != 42485)) //2220173-时代吉利 二楼出库站台和二楼前序出库 过扫码器下提升机 ??? if (mti != 4 && (DeviceKind == 2) && (StartDevice != 22447 && StartDevice != 22452 && StartDevice != 22458 && StartDevice != 22507 && StartDevice != 22519 && StartDevice != 22542 && StartDevice != 22551 && StartDevice != 42452 && StartDevice != 42457 && StartDevice != 42465 && StartDevice != 42507 && StartDevice != 42519 && StartDevice != 42542 && StartDevice != 42551)) { int status = ccf.GetManageTaskStatus(fid, mti); if (status == 0) { //判断起点设备类型 int kind = ccf.GetDeviceKindIdx(StartDevice);//20100617 AND FID!={0} if (kind == 2) { sqlstr = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FSTATUS = 0) AND (FSTARTDEVICE ={0}) ", StartDevice); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; int count = dvdv.Count; if (count > 1) { AheadDetectUnallow.Append(string.Format("该起点等待执行的任务数量为:{0},不能执行! ", count)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } #endregion #region 判断堆垛机等待执行的任务数 不能大于3 新增 防止堆垛机串任务 堆垛机起点的任务 if (mti != 4 && (DeviceKind == 1) && CONTROLTASKTYPE == 1) { string sqlstrc = string.Empty; int status = ccf.GetManageTaskStatus(fid, mti); if (status == 0) { //判断起点设备类型 int kind = ccf.GetDeviceKindIdx(DeviceIdx);//20100617 if (kind == 1) { sqlstrc = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FSTATUS = 0) AND (FSTARTDEVICE ={0}) ", StartDevice); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; int count = dvdv.Count; if (count > 1) { AheadDetectUnallow.Append(string.Format("该起点等待执行的任务数量为:{0},不能执行! ", count)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } #endregion #region add for CATL 后序任务数控制 缓存线到终点的任务数只能为1 if (mti != 4 && (DeviceKind == 2)&& CONTROLTASKTYPE ==2) { // 电气需要将所有的转台 和他前一节设备状态 合并到转台的.0上 DataView DowManTwoDT = new DataView(); //2220173-时代吉利 F_PREMARK 1-前工序不带缓存;2-前工序带缓存;3-后工序 sql.Remove(0, sql.Length); sql.Append("SELECT F_PREDEVICE,F_REMAKE FROM T_BASE_PREAMBLE WHERE F_PREMARK = 3 and F_PREDEVICE = ").Append(EndDevice); // 后序站台 DowManTwoDT = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (DowManTwoDT.Count > 0) { #region if (Convert.ToInt32(DowManTwoDT[0]["F_PREDEVICE"]) == EndDevice) { // 定义数组 存储后序缓存送出到转台的送出站台 //2220173-时代吉利 string[] strDowSecPost = { "22104", "22109", "22112", "22116", "22204", "22209", "22212", "22216", "22304", "22309", "22312", "22316", "42104", "42109", "42112", "42116", "42204", "42209", "42212", "42216", "42304", "42309", "42312", "42316" }; // 后序缓存到转台 没配置在数据库 直接写死了 能快一些 22105,22110,22111,22116,22205,22210,22211,22216,22310,22305,22311,22315,42104,42108,42109,42114,42210,42205,42211,42216,42310,42305,42311,42316 if (strDowSecPost.Contains(DeviceIdx.ToString())) { DataView DowFID = new DataView(); sql.Remove(0, sql.Length); // 查出终点位置是后序转台,并且任务是出库 任务状态是运行 sql.Append("select FID from T_MANAGE_TASK where FCONTROLTASKTYPE = 2 ").Append(" and FENDDEVICE = ").Append(EndDevice).Append(" and FSTATUS <> 0"); // 后序站台 DowFID = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; int KG = ccf.GetTransDeviceGoodsCounts(EndDevice.ToString()); // 这个字段是维护后续和前序站台 在出库到终点位置时 空盘回库终点开关点没有的现象 string remark = Convert.ToString(DowManTwoDT[0]["F_REMAKE"]); //后续叫料口内侧的顶升 string[] endTopDevice = remark.Split(';'); int tCount = 0; for (int j = 0; j < endTopDevice.Length; j++) { // 判断缓存站台开关点 状态 GetTransDeviceGoodsCounts CStaticClass.GetDevicePhotoelectric(Convert.ToInt32(endTopDevice[j]), 0) == 1 // 终点站台没货 且 无物 if (ccf.GetTransDeviceGoodsCounts(endTopDevice[j].ToString()) > 0) { tCount++; } } KG = KG + tCount; if (KG >= 1) { AheadDetectUnallow.Append("当前终点位置有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } for (int i = 0; i < DowFID.Count; i++) { //查询出FID 是当前终点站台的任务数 int taskCount = Convert.ToInt32(dbo.GetSingle("select count(*) from T_MONITOR_TASK where F_MANAGETASKINDEX <> " + fid + "and F_NUMPARAM1 = " + DeviceIdx + " and F_NUMPARAM4 = " + EndDevice + "and F_STATUS > 0")); if (taskCount > 0) { AheadDetectUnallow.Append("当前终点任务数1"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } #endregion } } #endregion #region add for CATL YB2 在发送任务起点是22469,22483,42471,42485输送线任务时要先判断任务数不能大于3 , 并且 发送任务时判断 当前任务终点站台类型是否为2 // 如果起点位置为22469 和22483 和 42471 和42485 时,控制任务数为每个站台不能大于3不能大于3,并且终点站台类型为2的时候,变更输送线送出任务2条变成一条 // 两条变成一条的判断是终点位置无货,并且没有正在执行的起点是缓存位置或者 二层缓存线的送出任务正在执行任务 //2220173-时代吉利 任务数不能大于2 因为没转台缓存了 终点站台类型为2的时候,变更输送线送出任务2条变成一条好像不需要了??? if (mti != 4 && (DeviceKind == 2)&& ( StartDevice == 22507 || StartDevice == 22519 || StartDevice == 22542 || StartDevice == 22551 || StartDevice == 42507 || StartDevice == 42519 || StartDevice == 42542 || StartDevice == 42551)) { int status = ccf.GetManageTaskStatus(fid, mti); // 任务没发送的时候判断当前起点执行的任务数 if (status == 0 ) { //判断起点设备类型 int kind = ccf.GetDeviceKindIdx(StartDevice);//20100617 if (kind == 2) { int goodsTask = 0; sqlstr = string.Format("SELECT FID,F_ManageTaskKindIndex FROM T_Manage_Task WHERE (FSTATUS <> 0) AND FID!={0} AND (FSTARTDEVICE ={1} ) and (FENDDEVICE ={2} ) ", fid, StartDevice, EndDevice); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; int count = dvdv.Count; int endPoint = ccf.GetTransDeviceGoodsCounts(EndDevice.ToString()); goodsTask = count + endPoint; //2220173-时代吉利 任务数不能大于2 if (goodsTask >= 2) { AheadDetectUnallow.Append(string.Format("该起点执行的任务数量为:{0},不能执行! ", goodsTask)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } // 如果任务数小于三满足了,需要优化下带缓存站台的送出任务, 发送去缓存的送出任务时候,判断是否存在出自己外正在执行的去此终点位置 // 的任务,同时判断终点位置开关状态和故障情况,如果两这之和为0,则将双送出任务修改为单送出任务 // 定义接收带缓存在站台的前序编号 //2220173-时代吉利 站台都是单向的 不存在模式 出库站台就是送到缓存 然后在出到站台就行了 //DataView dvBuffer1 = dboM.ExceSQL("SELECT STATION_MODE FROM IO_CONTROL_BUFFER where station_code =" + EndDevice.ToString()).Tables[0].DefaultView; //if (dvBuffer1[0]["STATION_MODE"].ToString() == "0") //{ // #region // DataView preManTwoDT = new DataView(); // sql.Remove(0, sql.Length); // sql.Append("SELECT F_PREDEVICE FROM T_BASE_PREAMBLE WHERE (F_PREMARK = 2)"); // preManTwoDT = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; // for (int y = 0; y < preManTwoDT.Count; y++) // { // if (Convert.ToInt32(preManTwoDT[y]["F_PREDEVICE"]) == EndDevice) // { // int taskCount = Convert.ToInt32(dbo.GetSingle("select count(*) from T_manage_task where FENDDEVICE=" + EndDevice + " and FSTATUS <> 0"));// + " and FSTARTDEVICE = " + StartDevice // int onCount = ccf.GetTransDeviceGoodsCounts(EndDevice.ToString()); // int toal = taskCount + onCount; // if (toal == 0) // { // // 查出 两条任务号的另一个小任务号 // sql.Clear(); // sql.Append("select F_MONITORINDEX from T_MONITOR_TASK where F_MANAGETASKINDEX = ").Append(fid).Append(" and F_MONITORINDEX <> ").Append(TaskIdx); // dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; // if (dv.Count == 1) // { // // 调试时需要注释 不进行任务变更 // // 测试路径提前检测注释 调试注释 // ccf.UpdatePreMAncahe(fid, TaskIdx, StartDevice, EndDevice, dv[0]["F_MONITORINDEX"].ToString()); // // 修改完提前检测和小任务拆分条数跳出当前方法 // return false; // } // } // } // } // #endregion //} } #endregion #region 在发送socket任务时判断发送时间间隔在200毫秒以上20170923 if (DeviceKind == 6) { //查找已经发送的任务 int timespan=Convert.ToInt32( CStaticClass.SendTimeSpan); sqlstr = string.Format("SELECT F_ManageTASKKINDINDEX, F_DeviceIndex, F_Status,F_StartTime FROM T_Monitor_Task WHERE (F_Status>0 ) AND F_DeviceIndex=({0}) ", DeviceIdx); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; int count = dvdv.Count; for (int i = 0; i < count;i++ ) { DateTime appdt = new DateTime(); DateTime timenow = DateTime.Now.AddMilliseconds(-timespan); if (dvdv[i]["F_StartTime"] == DBNull.Value) { appdt = DateTime.Now.AddMilliseconds(-300); } else { DateTime.TryParse(dvdv[i]["F_StartTime"].ToString(), out appdt); } if (timenow < appdt) { AheadDetectUnallow.Append(string.Format("距上一个任务的发送时间间隔小于{0}毫秒,不能发送! ", timespan)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } #endregion #region 拆零区中转的判断 //if (DeviceKind == 1 && DeviceOrder == 4 // && devinfo.VirtualStack > 0 // && (devinfo.IfCorrelDoubleFork == "1") // && (EndDevice == 12011 || EndDevice == 12015 || EndDevice == 12019))//双叉,且互拆堆垛机 ////&& (EndDevice == 12011 || EndDevice == 12015 || EndDevice == 12019 || (EndDevice == 12023 && CONTROLTASKTYPE == 2) || (EndDevice == 12028 && CONTROLTASKTYPE == 2)))//双叉,且互拆堆垛机 //{ // //查看送货的目标位置是lanegate且需要中转,且取货位置不是中转站台 // //获取坐标,查找lanegate // string errmessage; // Dictionary corrinfo = Model.CGeneralFunction.GetDoubleForkMonitorInfo(minMidx, devinfo.DeviceIndex); // string Fidend = ccf.GetEndDeviceFromManage(mti, fid); // int VirtualStack = devinfo.VirtualStack; // if (corrinfo == null)//20110412没关联任务 // { //查找空位 // int[] zxy = ccf.GetCoordinatesFromMonitorTask(minMidx);//获得任务坐标 // if (zxy != null) // { // string getcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[0], zxy[1], zxy[2]);// get pallete z-x-y // string sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]); // string[] exchangearea = ccf.GetExchangeStationAndEndAreaFromLaneGate(sendcell);//判读是否是到拆零区的任务 // if (exchangearea != null) // { // string TaskUseAwayFork = Model.CGeneralFunction.GetUseAwayFork(minMidx);//1,2,3;0没分配货叉 // string changecell; // bool needexchange = ccf.IfNeedExchangeTask(minMidx, zxy, exchangearea);//是否需要中转,已经在中转站台的任务不需要中转 // if (needexchange)//需要中转 // { // bool mustexchange = ccf.IfExchange(VirtualStack, minMidx, Fidend, 0, zxy, exchangearea, false, out changecell);//不需要指定货叉 // if (mustexchange) // { // if (changecell == "-") // { // AheadDetectUnallow.Append(string.Format("{0}中无可用站台", exchangearea[2])); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false; // } // else // { // if (devinfo.DeviceIndex != devinfo.VirtualStack)//已分配堆垛机 // { // ChangeStackCellCode(minMidx, changecell, DeviceIdx, Model.CGeneralFunction.TASKEXCHANGE); // return false; // //设置中转 // } // else // { // checktask = false; // _AheadDetect = _AheadDetect.Replace(exchangearea[0], "0"); // } // } // } // } // else//从中转站台到目标,要判读目标是否为空闲 // { // if (!ccf.GetIfAreaFree(minMidx, VirtualStack, exchangearea[3], exchangearea[4], out errmessage)) // { // AheadDetectUnallow.Append(string.Format("区域{0}不空闲 ", exchangearea[3])); // //CommonClassLib.CCarryConvert.WriteDarkCasket("检测区域不空闲", minMidx.ToString(), devinfo.DeviceIndex.ToString(), exchangearea[3]); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false;//不能执行出库任务 // } // //不能有到目标位置的已经分配堆垛机的任务 // } // //false 不需要中转可以直接放到终点 // //} // }// if (exchangearea!=null) // }//if (zxy != null) // } // else // { // bool sameend = false; // bool forceexchange = false; // int mankind = 0; // int corrfid = 0; // string corrend = ""; // foreach (int CorrTaskindex in corrinfo.Keys) // { // if (CorrTaskindex != minMidx) // { // mankind = ccf.GetManageTaskKindIndexFromMonitor(CorrTaskindex); // corrfid = ccf.GetManageTaskIndexfromMonitor(CorrTaskindex); // corrend = ccf.GetEndDeviceFromManage(mankind, corrfid); // if (Fidend == corrend)//终点相同 // { // sameend = true; // } // } // } // foreach (int CorrTaskindex in corrinfo.Keys) // { // int[] zxy = ccf.GetCoordinatesFromMonitorTask(CorrTaskindex);//获得任务坐标 // if (zxy != null) // { // string getcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[0], zxy[1], zxy[2]);// get pallete z-x-y // string sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]); // string[] exchangearea = ccf.GetExchangeStationAndEndAreaFromLaneGate(sendcell);//判读是否是到拆零区的任务 // if (exchangearea != null) // { // string TaskUseAwayFork = "0"; // if (sameend) // { // TaskUseAwayFork = Model.CGeneralFunction.GetUseAwayFork(CorrTaskindex);//1,2,3;0没分配货叉 // } // string changecell; // bool needexchange = ccf.IfNeedExchangeTask(CorrTaskindex, zxy, exchangearea);//是否需要中转,已经在中转站台的任务不需要中转 // string endsgroup; // if (CorrTaskindex != minMidx) // { // endsgroup = corrend; // } // else // { // endsgroup = Fidend; // } // string[] ends = endsgroup.Split(';'); // int counts = ends.Length; // if (needexchange)//需要中转 // { // if (sameend)// counts>2表示是出库区,不用中转 // { // //如果minMidx已经中转,CorrTaskindex就不要中转了 // if (counts < 2) // { // int exceptionno = ccf.GetExceptionNOFromManageTask(fid, mti); // if (exceptionno != Model.CGeneralFunction.TASKEXCHANGE) // { // if (CorrTaskindex != minMidx) // { // forceexchange = true; // } // } // } // else // { // int ffid = fid, mmti = mti; // if (CorrTaskindex == minMidx) // { // ffid = corrfid; // mmti = mankind; // } // int exceptionno = ccf.GetExceptionNOFromManageTask(ffid, mmti);//判断关联任务的状态 // if (exceptionno == Model.CGeneralFunction.TASKEXCHANGE) // { // forceexchange = true; // } // } // } // bool mustexchange = ccf.IfExchange(VirtualStack, CorrTaskindex, endsgroup, Convert.ToInt32(TaskUseAwayFork), zxy, exchangearea, forceexchange, out changecell);//不需要指定货叉 // if (mustexchange) // { // if (changecell == "-") // { // AheadDetectUnallow.Append(string.Format("{0}中无可用站台", exchangearea[2])); // UpdateAheadDetectUnallow(AheadDetectUnallow, CorrTaskindex); // return false; // } // else // { // if (devinfo.DeviceIndex != devinfo.VirtualStack)//已经分配堆垛机 // { // ChangeStackCellCode(CorrTaskindex, changecell, DeviceIdx, Model.CGeneralFunction.TASKEXCHANGE); // return false; // //设置中转 // } // else // { // if (CorrTaskindex == minMidx) // { // checktask = false;//未分配堆垛机 // _AheadDetect = _AheadDetect.Replace(exchangearea[0], "0"); // } // } // } // } // else // { // CommonClassLib.CCarryConvert.WriteDarkCasket("拆零不中转,任务号:", CorrTaskindex.ToString(), endsgroup, ""); // } // } // else//从中转站台到目标,要判读目标是否为空闲 // { // if (!ccf.GetIfAreaFree(CorrTaskindex, VirtualStack, exchangearea[3], exchangearea[4], out errmessage)) // { // AheadDetectUnallow.Append(string.Format("区域{0}不空闲 ", exchangearea[3])); // UpdateAheadDetectUnallow(AheadDetectUnallow, CorrTaskindex); // return false;//不能执行出库任务 // } // } // //false 不需要中转可以直接放到终点 // //} // }// if (exchangearea!=null) // }//if (zxy != null) // } // } //} #endregion #region 堆垛机送货位置相同的任务只能有一个正在执行,互斥判断:也不能有终点坐标是该位置的输送机的任务,也要判断RGV任务 //堆垛机送出任务限制 一次只能由一个 GGGGGGGGGGG if (DeviceKind == 1 && (DeviceOrder == 4 || DeviceOrder == 5) )// 取货,送货 //if (DeviceKind == 1 && (DeviceOrder == 4 || DeviceOrder == 5) && devinfo.VirtualStack > 0)// 取货,送货 { int[] zxy = ccf.GetCoordinatesFromMonitorTask(minMidx); if (zxy != null) { sqlstr = string.Format("SELECT F_LaneNo FROM T_Base_StackInfo WHERE F_StackIndex ={0}", DeviceIdx); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int lane = Convert.ToInt32(dvdv[0]["F_LaneNo"]); // int exceptionno = ccf.GetExceptionNOFromManageTask(fid, mti); //20181222 string sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]);//lanegate 坐标 #region 堆垛机送货位置相同的任务只能有一个正在执行 //if (devinfo.VirtualStack > 0 && checktask && DeviceOrder == 4 && ifcheck)//并且不能是倒库的任务 if (DeviceIdx != devinfo.VirtualStack && devinfo.VirtualStack > 0 && checktask && DeviceOrder == 4 && EXCEPTIONNO != Model.CGeneralFunction.TASKCHANGESTACK)//并且不能是倒库的任务 { //sql = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo WHERE F_DeviceIndex !={4} and F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5) and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[0], zxy[1], zxy[2], VirtualStack); //在该巷道内,不能有终点坐标相同的任务在执行 sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo WHERE F_Status >0 and F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5) and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[3], zxy[4], zxy[5]); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0)// 有该出库任务终点货位对应的堆垛机取货任务 { AheadDetectUnallow.Append(string.Format("存在相同终点{0:D2}-{1:D2}-{2:D2}的任务,该任务暂时不能执行! ", zxy[3], zxy[4], zxy[5])); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } else { ////第一条指令不能是送货任务 //sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task,T_Base_StackInfo WHERE F_MonitorIndex in({4}) and F_MonitorIndex !={5} and F_DeviceIndex =F_StackIndex and F_LaneNo ={0} and (F_DeviceCommandIndex =5) and (F_NumParam4 = {1}) AND (F_NumParam5 = {2}) AND (F_NumParam6 = {3})", lane, zxy[3], zxy[4], zxy[5], sqlin,minMidx); //dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; //if (dvdv.Count > 0)// 有该出库任务终点货位对应的堆垛机取货任务 //{ // AheadDetectUnallow.Append(string.Format("存在相同终点{0:D2}-{1:D2}-{2:D2}的任务,该任务暂时不能执行! ", zxy[3], zxy[4], zxy[5])); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false;//不能执行出库任务 //} } } #endregion sqlstr = string.Format("SELECT * FROM T_Base_Lane_Gate where (F_MutexTransEnd is not null or F_CorrelDetect is not null ) and F_ZXY='{0}' and F_LaneIndex={1} ", sendcell, lane);//在lanegate表中查找需要判断的lanegate dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0)// 有该出库任务终点货位对应的堆垛机取货任务 { int Checkgate = Convert.ToInt32(dvdv[0]["F_LaneGateDeviceIndex"]); string mutexend = Convert.ToString(dvdv[0]["F_MutexEnd"]); string mutextransend = Convert.ToString(dvdv[0]["F_MutexTransEnd"]); string CheckForbidden = Convert.ToString(dvdv[0]["F_ChangeCheckForbidden"]);//判断其是否被禁用,以触发变更 string CheckOtherForbidden = Convert.ToString(dvdv[0]["F_ChangeCheckOtherForbidden"]);//被禁用,不触发变更 string ChangeCheckNext = Convert.ToString(dvdv[0]["F_ChangeCheckNext"]); string ChangeCheckEnd = Convert.ToString(dvdv[0]["F_ChangeCheckEnd"]); string ChangeToNewStart = Convert.ToString(dvdv[0]["F_ChangeToNewStart"]); string ChangeToNewNext = Convert.ToString(dvdv[0]["F_ChangeToNewNext"]); string ChangeToNewEnd = Convert.ToString(dvdv[0]["F_ChangeToNewEnd"]); string CorrelDetect = Convert.ToString(dvdv[0]["F_CorrelDetect"]); #region 检测放货位置的相邻位置是否有货 if (CorrelDetect != "")//取货或送货时判断 { int devicebyte = 0, devbit = 0; DS = CorrelDetect.Trim().Split(dd); int.TryParse(DS[0], out devicebyte); int.TryParse(DS[1], out devbit); int sssn = CStaticClass.GetDevicePhotoelectric(devicebyte, devbit); if (sssn != 0) { //int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("{0}有物光电开关遮挡! ", CorrelDetect)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task where F_DeviceCommandIndex=6 and F_DeviceIndex = {0} and F_Status =1", devicebyte); //sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_DeviceCommandIndex=6 and F_Status >0 and F_NumParam4 in({0}) ", mutextransend); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在阻挡的输送机任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } #endregion if (DeviceOrder == 4) { #region 双向互斥任务的判断,需要判断输送机和穿梭车 //查找互斥RGV任务 if (mutexend != "") { //不能有执行的任务 sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE ((F_DeviceCommandIndex =2 and F_NumParam4 = {0}) OR (F_DeviceCommandIndex =3 AND F_NumParam1= {0})) and F_Status>0 ", Convert.ToInt32(mutexend)); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的RGV任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } else { //不能有第一条指令时送货的RGV任务 sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_DeviceCommandIndex =3 AND F_NumParam1= {0} and F_MonitorIndex in({1}) ", Convert.ToInt32(mutexend), sqlin); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的RGV任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } //查找互斥输送机任务 if (mutextransend != "") { //任务号和调度任务类型和管理都一样 查调度任务号 是命令是1和6 起点设备 是Lane_Gate 表对应的 F_MutexTransEnd //限制堆垛机当前有任务 没执行完 不执行其他任务 sqlstr = string.Format(" SELECT F_MonitorIndex FROM T_Monitor_Task where F_DeviceCommandIndex in (6,1) and F_NumParam1 in({0}) and F_MonitorIndex in(SELECT min(F_MonitorIndex) as minMidx FROM T_Monitor_Task,T_Manage_Task where FID=F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex=T_Monitor_Task.F_ManageTASKKINDINDEX group by F_ManageTaskIndex) ", mutextransend); //sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_DeviceCommandIndex=6 and F_Status >0 and F_NumParam4 in({0}) ", mutextransend); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的输送机任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } #endregion // #region 变更堆垛机及输送机,RGV的任务 object[] ob; if (CheckForbidden != "" && CheckOtherForbidden != "")// { int ifForbidden = ccf.GetDeviceLockedState(Convert.ToInt32(CheckForbidden)); if (ifForbidden == -1)//禁用 { int ifotherForbidden = ccf.GetDeviceLockedState(Convert.ToInt32(CheckOtherForbidden)); if (ifotherForbidden != -1)//不能被禁用 { //获得送货位置对应的坐标 string newcell = ccf.GetStackCoordinateFromLaneGate(Convert.ToInt32(ChangeToNewStart));//新的送货坐标 string[] newzxy = newcell.Split('-'); if (newcell != "-" && newzxy.Length > 2) { //更改堆垛机送货坐标, 检测条件 ob = new object[8] { DeviceIdx, fid, mti, newzxy[0], newzxy[1], newzxy[2], Checkgate, ChangeToNewStart }; dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam4={3}, F_NumParam5={4}, F_NumParam6={5},F_AheadDetect = REPLACE(F_AheadDetect, '{6}', '{7}') WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); //更改送货输送机的起点和终点,及送出条件 // ob = new object[8] { Checkgate, fid, mti, ChangeToNewStart, ChangeToNewEnd, ccf.GetRouteIDsub(Convert.ToInt32(ChangeToNewStart)), Checkgate, ChangeToNewStart }; dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam1={3},F_NumParam4={4},F_RouteID={5}, F_AheadDetect = REPLACE(F_AheadDetect, '{6}', '{7}') WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); //更改next设备 ob = new object[6] { Checkgate, fid, mti, ChangeToNewStart, ChangeCheckNext, ChangeToNewNext }; dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_DeviceIndex={3}, F_AheadDetect = REPLACE(F_AheadDetect, '{4}', '{5}') WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); //变更RGV的取货点,检测条件。 ob = new object[6] { ChangeCheckEnd, fid, mti, ChangeToNewEnd, ChangeCheckEnd, ChangeToNewEnd }; dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam1={3}, F_AheadDetect = REPLACE(F_AheadDetect, '{4}', '{5}') WHERE F_DeviceCommandIndex =2 and F_NumParam1={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); CommonClassLib.CCarryConvert.WriteDarkCasket("设备禁用变更后续路径", minMidx.ToString(), DeviceIdx.ToString(), CheckForbidden); return false; } } } } #endregion } } } } } #endregion #region 提前检测信息处理 if ((_AheadDetect != "") && (_AheadDetect != null)) { #region 对于倒换堆垛机的任务,不判断最终目标位置的状态 if (DeviceKind == 1 && devinfo.VirtualStack > 0 && (order == 4 || order == 5))// { string sendcell = ""; if (order == 4) { int[] zxy = ccf.GetCoordinatesFromMonitorTask(minMidx); if (zxy != null) { sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]);//lanegate 坐标 } } else { sql.Remove(0, sql.Length); sql.Append("SELECT FREMARK FROM T_Manage_Task WHERE (FID = ").Append(fid).Append(") AND (F_ManageTaskKindIndex = ").Append(mti).Append(") and (FExceptionNO =").Append(Model.CGeneralFunction.TASKCHANGESTACK).Append(")"); object arrcell = dbo.GetSingle(sql.ToString()); string cell = Convert.ToString(arrcell); string[] cellzxy = cell.Split('-'); if (cellzxy.Length > 2) { sendcell = cell; } } int gate = ccf.GetLaneGateDeviceIndexFromLaneGate(sendcell);//送货位置的设备编号 //string groups = "12027;12032;13003;13004"; string groups = "12027;12032"; bool ifcheck = groups.Contains(gate.ToString());//20181020 if (ifcheck && gate != 0) { string Nocheck = gate.ToString(); _AheadDetect = _AheadDetect.Replace(Nocheck, "0"); } } #endregion char[] cc = new char[1]; cc[0] = ';'; //string[] AheadDetect //去除重复项 _AheadDetect = _AheadDetect.Replace(NoDetect, ""); string[] stringArray = _AheadDetect.Split(cc); List listString = new List(); foreach (string eachString in stringArray) { if (!listString.Contains(eachString))//判断新拼成的检测字符串是否已含有次循环的 { if (!checkSendDevice)//不检测出库输送机 { if (eachString.Contains(DeviceIdx.ToString()))//当前串是否是堆垛机检测条件 { listString.Add(eachString);//将堆垛机检测条件加入到新的检测串中 } } else { listString.Add(eachString);//检测输送线的时候 将原有所有的检测条件都新加到新的串中 } } } string[] AheadDetect = listString.ToArray();//新的检测条件赋值给AheadDetect string[] sp; //通过抽象类工厂获得IGetDeviceState的派生类 //IGetDeviceState GDS; int s = 0; //int[] sss; int fs = 1; //int[] fsss; //提取光电开关索引值 int devk = 0; #region 查找所有禁用设备//20141201张磊发现错误,应该增加设备是否被停用 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_LockedState = - 1) "); DataView dvJY = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20141201张磊发现错误,应该增加设备是否被停用 dvJY.Sort = "F_DeviceIndex";//20141201张磊发现错误,应该增加设备是否被停用 #endregion for (int i = AheadDetect.GetLowerBound(0); i <= AheadDetect.GetUpperBound(0); i++) { if (AheadDetect[i].Trim().Length <= 0) continue; #region 检测逻辑有探物 if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "H")//检测逻辑有探物 { devk = ccf.GetDeviceKindIdx(Convert.ToInt32(AheadDetect[i].Trim().Substring(1))); if (devk == 9) {//机台需要从管理设备表读取 //sql.Remove(0, sql.Length); //sql.Append("SELECT FID FROM T_ITEMDEVICESTATION WHERE (FCODE = '" ).Append( AheadDetect[i].Trim().Substring(1) ).Append( "') AND (FSTATUS = '1002')"); //if (dboM.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0) //{ // fs = fs & 1; //} //else //{ // fs = fs & 0; //} } else { //本地设备表读取 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_HaveGoods FROM T_Base_Device where F_DeviceIndex=").Append( Convert.ToInt32(AheadDetect[i].Trim().Substring(1))); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { int havegoods = -1; if (Convert.ToInt32(dvdv[0]["F_HaveGoods"]) == 0)//20110505 { havegoods = 0; AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "设备逻辑无物!"); } else { havegoods = 1; } fs = fs & havegoods; } } continue; } #endregion #region 检测逻辑无探物 if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "N")//检测逻辑无探物 { //devk = ccf.GetDeviceKindIdx(Convert.ToInt32(AheadDetect[i].Trim().Substring(1))); //if (devk == 9)//注释20180522 //{//机台需要从管理设备表读取;20101028管理依赖任务控制机台的站台是否有物 // //if (dboM.ExceSQL("SELECT FID FROM T_ITEMDEVICESTATION WHERE (FCODE = '" + AheadDetect[i].Trim().Substring(1) + "') AND (FSTATUS = '1002')").Tables[0].DefaultView.Count > 0) // //{ // // fs = fs & 1; // //} // //else // //{ // // fs = fs & 0; // //} //} //else { //本地设备表读取 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_HaveGoods FROM T_Base_Device where F_DeviceIndex=").Append( Convert.ToInt32(AheadDetect[i].Trim().Substring(1))); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { if (Convert.ToInt32(dvdv[0]["F_HaveGoods"]) > 0)//20110505 { AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "设备逻辑有物!"); } s = s + Convert.ToInt32(dvdv[0]["F_HaveGoods"]); } } continue; } #endregion #region 检测设备是否空闲 //20090803检测设备是否空闲idle if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "I")//检测设备是否空闲idle { int idev = Convert.ToInt32(AheadDetect[i].Trim().Substring(1)); if (idev.ToString().Length == 6) { idev = Convert.ToInt32(idev.ToString().Substring(0, 5)); } States = CStaticClass.GetDeviceState(idev); if (States != null) { int kind = ccf.GetDeviceKindIdx(Convert.ToInt32(AheadDetect[i].Trim().Substring(1))); // kkkk调度程序问题 输送线中间拆段的任务 动作完成状态不能判定是空闲状态 让任务下发 // 这样会出现给电气写应答时候 几十毫秒将下一段送出任务下发 //if ((States[1] == 5) && (kind == 2)) //{//只有输送机的完成可作为空闲 // States[1] = 0; //} if (kind == 1 && DeviceHandTaskIfRun(Convert.ToInt32(AheadDetect[i].Trim().Substring(1))) == true) {//20120207 AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "手工任务或者避让任务正在运行!"); States[1] = 1; } if (States[1] != 0)//20110505 { AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "设备不空闲!"); } s = s + States[1]; } if (dvJY.Find(idev) >= 0) {//20141201张磊发现错误,应该增加设备是否被停用 AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "设备被停用!"); s += 1; } continue; } #endregion #region 检测AGV控制台是否连接 ////20090803检测设备是否空闲idle if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "C")//检测设备是否空闲idle { int idev = Convert.ToInt32(AheadDetect[i].Trim().Substring(1)); if (idev.ToString().Length == 6) { idev = Convert.ToInt32(idev.ToString().Substring(0, 5)); } devinfocheck = Model.CGetInfo.GetDeviceInfo(idev); if (devinfocheck != null && SocketsTCPIP.CClientTCPIP.IfConnectServer(devinfocheck.RemoteIP)) { s = s + 0; } else { s = s + 1; AheadDetectUnallow.Append(devinfocheck.DeviceName + "设备未连接!"); } continue; } #endregion #region 检测设备是否被锁定 //20090803检测设备是否空闲idle if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "L")//检测设备是否被锁定 { int idev = Convert.ToInt32(AheadDetect[i].Trim().Substring(1)); if (idev.ToString().Length == 6) { idev = Convert.ToInt32(idev.ToString().Substring(0, 5)); } //本地设备表读取 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState FROM T_Base_Device where F_DeviceIndex=").Append(idev); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { int lockstatus = Convert.ToInt32(dvdv[0]["F_LockedState"]); if (lockstatus == 0)//20110505 { s = s + 0; } else { s = s + 1; AheadDetectUnallow.Append(idev + "设备被锁定!"); } } continue; } #endregion #region 检测F_NumParam1,F_NumParam4设备无正在运行的任务 if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "U")//检测F_NumParam1,F_NumParam4设备无正在运行的任务 { sql.Clear(); sql.Append(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_NumParam1 = {0} or F_NumParam4 = {0}) AND (F_Status > 0)", Convert.ToInt32(AheadDetect[i].Trim().Substring(1)))); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { s = s + 1; AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "有任务正在执行!"); } else { s = s + 0; } continue; } #endregion #region 检查是否有可用缓冲站台20181006 if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "Z")//检测 { string[] stations = AheadDetect[i].Trim().Substring(1).Split(','); int goodscount = 0; for (int k = 0; k < stations.Length; k++) { int device = Convert.ToInt32(stations[k]);// int count = 0; devinfocheck = Model.CGetInfo.GetDeviceInfo(device); if (devinfocheck != null) { if (devinfocheck.SplitByte_0 == 1 || devinfocheck.SplitByte_1 == 1)//有货 { count = 1; } } sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_HaveGoods FROM T_Base_Device where F_DeviceIndex=").Append(device); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { if (Convert.ToInt32(dvdv[0]["F_HaveGoods"]) == 1)//20110505 { count = 1; } } goodscount += count; } if (goodscount == stations.Length)//有货站台数量和站台数量相等 { s = s + 1; AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "无可用站台!"); } else { s = s + 0; } continue; } #endregion #region 检测积放线正在执行任务个数 if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "J")//检测积放线正在执行任务个数(J12008,2) { cc[0] = ','; sp = AheadDetect[i].Trim().Substring(1).Split(cc); if (sp.GetLength(0) == 2) { sql.Clear(); sql.Append(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceIndex={0}) AND (F_Status > 0)", Convert.ToInt32(sp[0]))); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count >= Convert.ToInt32(sp[1])) { s = s + 1; AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "积放任务超限!"); } else { s = s + 0; } } continue; } #endregion #region 检测设备是否被堆垛机预约 //20120409 if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "R" && DeviceKind == 1)////20140309检测设备是否被堆垛机预约 { sql.Remove(0, sql.Length); sql.Append("select F_ManTaskReserve from T_Base_Device where F_ManTaskReserve>0 and F_DeviceIndex=").Append(Convert.ToInt32(AheadDetect[i].Trim().Substring(1))); object obr = dbo.GetSingle(sql.ToString()); if (obr != null) { if (obr.ToString() != (mti.ToString() + fid.ToString())) { bool iftrue = true; int relfid = ccf.GetRELATIVECONTORLIDFromManageTask(mti, fid); if (relfid > 0) {//20130704 dv = dbo.ExceSQL(string.Format("SELECT FID FROM T_Manage_Task where F_RELATIVECONTORLID={0} and F_ManageTaskKindIndex={1}", relfid, mti)).Tables[0].DefaultView; for (int mt = 0; mt < dv.Count; mt++) { if (obr.ToString() == mti.ToString() + dv[mt]["FID"].ToString()) { iftrue = false; } } } if (iftrue == true) { s = s + 1; AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "被调度任务:").Append(obr.ToString()).Append("预约!"); } else { s = s + 0; } } else { s = s + 0; } } continue; } #endregion #region 检测设备光电信号 //检测设备的光电信号:D-12001.0表示输送机12001的入口开关有物;D12001.1表示输送机12001的入口开关无物 //D-12001.2表示输送机12001的顶升高位(高到位);D12001.3表示输送机12001的顶升不在低位(不是低到位) if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "D") { int devicebyte = 0, devbit = 0; DS = AheadDetect[i].Trim().Substring(1).Split(dd); int.TryParse(DS[0], out devicebyte); int.TryParse(DS[1], out devbit); //判断是否检测负数索引值(负数代表是否满足开关量=1的执行前提) if (devicebyte < 0) { #region 负数代表值为1的开关量检测 devinfocheck = Model.CGetInfo.GetDeviceInfo(-devicebyte); if (devinfocheck != null) { int fsn = CStaticClass.GetDevicePhotoelectric(-devicebyte, devbit);//20101124 if (fsn != 1)//20110505 { StringBuilder kg = new StringBuilder(); switch (devbit) { case 0: kg.Append(".0有物"); break; case 1: kg.Append(".1有物"); break; case 2: if (ccf.GetDeviceKindIdx(-devicebyte) == 31) { kg.Append("高位"); } else { kg.Append(".2有物"); } break; case 3: kg.Append(".3低位"); break; case 4: kg.Append(".4高位"); break; case 5: kg.Append("有物"); break; case 6: kg.Append("高位"); break; case 7: kg.Append("堆垛机申请进入"); break; case 8: kg.Append("允许入库输送线动作信号"); break; case 9: kg.Append("取货站台允许堆垛机取货信号"); break; case 10: kg.Append("允许出库输送线动作信号"); break; case 11: kg.Append("送货站台允许堆垛机送货信号"); break; default: break; } AheadDetectUnallow.Append(Convert.ToInt32((-devicebyte)).ToString() + kg.ToString() + "光电开关不遮挡!"); } fs = fs & fsn; } #endregion } else {// #region 正数值不能为1的开关量检测 devinfocheck = Model.CGetInfo.GetDeviceInfo(devicebyte); if (devinfocheck != null) { int sssn = CStaticClass.GetDevicePhotoelectric(devicebyte, devbit); if (sssn != 0)//20110505 { StringBuilder kg = new StringBuilder(); switch (devbit) { case 0: kg.Append(".0有物"); break; case 1: kg.Append(".1有物"); break; case 2: if (ccf.GetDeviceKindIdx(devicebyte) == 31) { kg.Append("高位"); } else { kg.Append(".2有物"); } break; case 3: kg.Append(".3低位"); break; case 4: kg.Append(".4高位"); break; case 5: kg.Append("有物"); break; case 6: kg.Append("高位"); break; case 7: kg.Append("堆垛机申请进入"); break; default: break; } AheadDetectUnallow.Append(devicebyte.ToString() + kg.ToString() + "光电开关遮挡!"); } s = s + sssn; #endregion } } } #endregion #region 检测是否存在执行中的任务 if (AheadDetect[i].Trim().Substring(0, 1).ToUpper() == "T")//检测是否存在执行中的任务 { int idev = Convert.ToInt32(AheadDetect[i].Trim().Substring(1)); if (idev.ToString().Length == 6) { idev = Convert.ToInt32(idev.ToString()); } States = CStaticClass.GetDeviceState(idev); sql.Clear(); sql.Append(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_NumParam4={0}) AND (F_Status > 0) AND F_DEVICEINDEX={1}", idev, DeviceIdx)); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { s = s + 1; AheadDetectUnallow.Append("终点" + AheadDetect[i].Trim().Substring(1) + "存在未完成指令!"); } if ((CStaticClass.GetDevicePhotoelectric(idev, 0) == 1) || (States[1] != 0)) { s = s + 1; AheadDetectUnallow.Append("终点" + AheadDetect[i].Trim().Substring(1) + "有物或报警!"); } continue; } #endregion } #region 非手工任务,如果有手工任务等待执行先执行手工任务 if (mti != 4) {//20120405 if (DeviceHandTaskIfWaitRun(devinfo.DeviceIndex) == true) { AheadDetectUnallow.Append(devinfo.DeviceIndex.ToString() + "手工任务或者避让任务等待运行!"); s += 1; } } #endregion #region 检测向管理申请入库任务条码和PLCASK记录是否匹配,是否有互斥任务 //20130709增加输送站台向管理申请入库任务,或者条码比对的任务,扫描后人工随意搬走箱子的保护,入库任务条码和PLCAsk记录的不相同不再执行任务 //20170110 只判断F_Askkind =4的类型 sql.Remove(0, sql.Length); sql.Append("SELECT T_Base_Device.F_DeviceIndex,F_CheckSendEnd,F_CheckTransEnd,F_CheckTaskEndDevice, F_CheckExeDevice FROM T_Base_Device,T_Base_PLC_Ask WHERE ( T_Base_Device.F_DeviceIndex = T_Base_PLC_Ask.F_DeviceIndex) and (T_Base_Device.F_DeviceKindIndex = 7) and (T_Base_PLC_Ask.F_Askkind=4) AND T_Base_PLC_Ask.F_BindingDevice = ").Append(devinfo.DeviceIndex); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (mti == 1) { if ((dvdv.Count > 0) && (mti != 4) && (CONTROLTASKTYPE == 1)) { sql.Remove(0, sql.Length); sql.Append("SELECT F_BarCode FROM T_Base_PLC_Ask where F_askkind=4 and F_BindingDevice=").Append(devinfo.DeviceIndex); object obr = dbo.GetSingle(sql.ToString()); if (obr != null) { if (obr.ToString().IndexOf("11111") < 0)//只判断前五位就可以 在扫到条码的情况下才判断 { //暂时注释 防止手工入盘 记录的条码 //if ((obr.ToString().IndexOf(ccf.GetBarCodeFromMonitor(minMidx)) < 0) && (ccf.GetBarCodeFromMonitor(minMidx).IndexOf(obr.ToString()) < 0)) //{ // s = s + 1; // AheadDetectUnallow.Append(devinfo.DeviceIndex.ToString() + "记录的条码:").Append(obr.ToString()).Append(",和任务条码").Append(ccf.GetBarCodeFromMonitor(minMidx)).Append("不匹配!"); //} } } } #region 判断是否有与该输送机互斥的任务 判断互斥任务的 //string checksenddevice = Convert.ToString(dvdv[0]["F_CheckSendEnd"]);//20181003,如果是货位就判断是否有到改坐标的堆垛机任务在执行,如果不是就判断是否有到该位置的RGV任务 //string checktransdevice = Convert.ToString(dvdv[0]["F_CheckTransEnd"]);//20181003查找终点是该目标的调度任务,第一天设备指令是否是到该终点的, //string checktaskend = Convert.ToString(dvdv[0]["F_CheckTaskEndDevice"]);//20181003, H行区域,判断终点任务是否有互斥任务 //string checkexedevice = Convert.ToString(dvdv[0]["F_CheckExeDevice"]);//20181003 //int starttransdevice = devinfo.DeviceIndex; //string[] sendcell;//20181003 //string sqlstrs; //int[] zxy = ccf.GetCoordinatesFromMonitorTask(minMidx); //int transend = 0; //if (zxy != null) //{ // transend = zxy[3];//送出指令的终点设备 //} ////更改条码值 //if (checksenddevice != "") //{ // char[] cc1 = new char[1] { '-' };//20181003 // sendcell = checksenddevice.Split(cc1); // if (sendcell.GetLength(0) >= 2)//堆垛机 // { // string lanegatecell = ccf.GetStackCoordinateFromLaneGate(transend); // if (checksenddevice == lanegatecell)//终点设备如果是lanegate // { // sqlstrs = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5) and F_Status>0 and (F_NumParam4 = {0}) AND (F_NumParam5 = {1}) AND (F_NumParam6 = {2})", Convert.ToInt32(sendcell[0]), Convert.ToInt32(sendcell[1]), Convert.ToInt32(sendcell[2])); // dvdv = dbo.ExceSQL(sqlstrs).Tables[0].DefaultView; // if (dvdv.Count > 0) // { // int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); // s = s + 1; // AheadDetectUnallow.Append("存在堆垛机互斥任务:").Append(task).Append(",条码:").Append(ccf.GetBarCodeFromMonitor(task)).Append(",该任务不能执行!"); // } // else // { // //不能有到该位置的送货任务是第一条指令 // sqlstrs = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceCommandIndex =5) and F_MonitorIndex in({3}) and (F_NumParam4 = {0}) AND (F_NumParam5 = {1}) AND (F_NumParam6 = {2})", Convert.ToInt32(sendcell[0]), Convert.ToInt32(sendcell[1]), Convert.ToInt32(sendcell[2]), sqlin); // dvdv = dbo.ExceSQL(sqlstrs).Tables[0].DefaultView; // if (dvdv.Count > 0) // { // int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); // s = s + 1; // AheadDetectUnallow.Append("存在堆垛机互斥任务:").Append(task).Append(",条码:").Append(ccf.GetBarCodeFromMonitor(task)).Append(",该任务不能执行!"); // } // } // } // } // else//RGV // { // // // if (transend.ToString()== checksenddevice)//送出终点设备和RGVgate相同 // { // sqlstrs = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE ((F_DeviceCommandIndex =2 and F_NumParam4 = {0}) OR (F_DeviceCommandIndex =3 AND F_NumParam1= {0})) and F_Status>0 ", Convert.ToInt32(checksenddevice)); // dvdv = dbo.ExceSQL(sqlstrs).Tables[0].DefaultView; // if (dvdv.Count > 0) // { // int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); // s = s + 1; // AheadDetectUnallow.Append("存在穿梭车互斥任务:").Append(task).Append(",条码:").Append(ccf.GetBarCodeFromMonitor(task)).Append(",该任务不能执行!"); // } // else // { // //不能有到该位置的送货任务是第一条指令 // sqlstrs = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_DeviceCommandIndex =3 AND F_NumParam1= {0} and F_MonitorIndex in({1}) ", Convert.ToInt32(checksenddevice), sqlin); // dvdv = dbo.ExceSQL(sqlstrs).Tables[0].DefaultView; // if (dvdv.Count > 0) // { // int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); // s = s + 1; // AheadDetectUnallow.Append("存在穿梭车互斥任务:").Append(task).Append(",条码:").Append(ccf.GetBarCodeFromMonitor(task)).Append(",该任务不能执行!"); // } // } // } // } //} //if (checktransdevice != "") //{//判断终点到该位置的任务的第一条设备指令是否是checktransdevice // //sqlstr = string.Format(" SELECT F_MonitorIndex FROM T_Monitor_Task where F_NumParam4= {0} and F_MonitorIndex in(SELECT min(F_MonitorIndex) as minMidx FROM T_Monitor_Task,T_Manage_Task where FID=F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex=T_Monitor_Task.F_ManageTASKKINDINDEX and FSTATUS>0 and FENDDEVICE= {0} group by F_ManageTaskIndex) ", Convert.ToInt32(checktransdevice)); // if (zxy != null) // { // if (Convert.ToInt32( checktransdevice)!=zxy[3]) // { // sqlstr = string.Format(" SELECT F_MonitorIndex FROM T_Monitor_Task where F_DeviceCommandIndex=6 and F_NumParam4= {0} and F_MonitorIndex != {1} and F_MonitorIndex in(SELECT min(F_MonitorIndex) as minMidx FROM T_Monitor_Task,T_Manage_Task where FID=F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex=T_Monitor_Task.F_ManageTASKKINDINDEX and FENDDEVICE= {0} group by F_ManageTaskIndex) ", Convert.ToInt32(checktransdevice), minMidx); // dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; // if (dvdv.Count > 0) // { // int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); // s = s + 1; // AheadDetectUnallow.Append("存在互斥任务:").Append(task).Append(",条码:").Append(ccf.GetBarCodeFromMonitor(task)).Append(",该任务不能执行!"); // } // } // } //} //#region H型是否存在别的通道终点的任务,与该起点通道互斥 //if (checktaskend != "" && checkexedevice != "") //{ // if (!checktaskend.Contains(zxy[3].ToString()) )//不能是回退任务 // { // //在到该申请设备对应的终点组中,执行的任务中,执行设备要在执行组中,指令才能发送(起点不是该设备,终点在终点组中的任务) // sqlstr = string.Format(" SELECT F_MonitorIndex,F_CurrentLocation FROM T_Monitor_Task where F_DeviceCommandIndex=6 and F_Status>0 and F_NumParam1!= {0} and F_NumParam4 in({1}) ", starttransdevice, checktaskend); // dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; // for (int i = 0; i < dvdv.Count; i++) // { // string currentlocation = Convert.ToString(dvdv[i]["F_CurrentLocation"]); // int task = Convert.ToInt32(dvdv[i]["F_MonitorIndex"]); // if (!checkexedevice.Contains(currentlocation)) // { // s = s + 1; // AheadDetectUnallow.Append("存在互斥任务:").Append(task).Append(",条码:").Append(ccf.GetBarCodeFromMonitor(task)).Append(",该任务暂时不能执行!"); // break; // } // } //} //} #endregion #endregion } #endregion if ((s != 0) || (fs != 1)) { // add for CATL YB2 UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } #region 顶升机先控制近叉输送机送出 ////20111226 //string r1 = "12001,42001,32001,12009,42009,32009,12017,42017,32017"; //if ((r1.IndexOf(DeviceIdx.ToString()) >= 0) &&(devinfo.IfCorrelDoubleFork!="1")) //{ // if (IFExitTopPriDeviceIdxTaskWait(DeviceIdx+1) == true) // { // return false; // } //} #endregion //同一位置的出入库任务,先执行入库任务,再执行出库任务(针对堆垛机的送货位置就是任务的终点,堆垛机的取货位置就是任务的起点) //堆垛机送货位置相同的任务只能有一个正在执行,互斥判断:也不能有终点坐标是该位置的输送机的任务,也要判断RGV任务 #region 判读是否存在RGV的互斥任务,包括堆垛机和输送机 if (DeviceKind ==4 && (DeviceOrder == 2 || DeviceOrder == 3))// 取货,送货 { int[] zxy = ccf.GetCoordinatesFromMonitorTask(minMidx); if (zxy != null) { int nextdevice = zxy[0];//默认F_NumParam1 if (DeviceOrder==2) { nextdevice = zxy[3];//取货任务的目标位置存在F_NumParam4 } //string sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]);//lanegate 坐标 sqlstr = string.Format("SELECT * FROM T_Base_RGV_Gate WHERE F_MutexTransEnd is not null and F_ChannelsIndex = {0} and F_RGVGateDeviceIndex={1}", DeviceIdx, nextdevice);//在lanegate表中查找需要判断的lanegate dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0)// 有该出库任务终点货位对应的堆垛机取货任务 { int Checkgate = Convert.ToInt32(dvdv[0]["F_RGVGateDeviceIndex"]); string mutexend = Convert.ToString(dvdv[0]["F_MutexEnd"]); string mutextransend = Convert.ToString(dvdv[0]["F_MutexTransEnd"]); string CheckForbidden = Convert.ToString(dvdv[0]["F_ChangeCheckForbidden"]);//判断其是否被禁用,以触发变更 string CheckOtherForbidden = Convert.ToString(dvdv[0]["F_ChangeCheckOtherForbidden"]);//被禁用,不触发变更 string ChangeCheckNext = Convert.ToString(dvdv[0]["F_ChangeCheckNext"]); string ChangeCheckEnd = Convert.ToString(dvdv[0]["F_ChangeCheckEnd"]);//;分隔 string ChangeToNewStart = Convert.ToString(dvdv[0]["F_ChangeToNewStart"]); string ChangeToNewNext = Convert.ToString(dvdv[0]["F_ChangeToNewNext"]); string ChangeToNewEnd = Convert.ToString(dvdv[0]["F_ChangeToNewEnd"]);//;分隔 char[] cc = new char[1] { ',' }; //查找互斥的堆垛机任务 #region 双向互斥任务的判断,需要判断输送机和穿梭车 if (mutexend != "") { string[] StackMutexEnd = mutexend.Split(cc);//13001;13002 string sendcell; string[] cellzxy; for (int i = 0; i < StackMutexEnd.Length; i++) { int lanegate = Convert.ToInt32(StackMutexEnd[i]); sendcell = ccf.GetStackCoordinateFromLaneGate(lanegate); if (sendcell != "-") { cellzxy = sendcell.Split('-'); if (cellzxy.Length == 3) { //不能有到该位置的执行任务 sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5) and F_Status>0 and (F_NumParam4 = {0}) AND (F_NumParam5 = {1}) AND (F_NumParam6 = {2})", Convert.ToInt32(cellzxy[0]), Convert.ToInt32(cellzxy[1]), Convert.ToInt32(cellzxy[2])); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的堆垛机任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } else { //不能有到该位置的送货任务是第一条指令 sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceCommandIndex =5) and F_MonitorIndex in({3}) and (F_NumParam4 = {0}) AND (F_NumParam5 = {1}) AND (F_NumParam6 = {2})", Convert.ToInt32(cellzxy[0]), Convert.ToInt32(cellzxy[1]), Convert.ToInt32(cellzxy[2]), sqlin); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的堆垛机任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } } } //查找互斥输送机任务 if (mutextransend != "") { sqlstr = string.Format(" SELECT F_MonitorIndex FROM T_Monitor_Task where F_DeviceCommandIndex=6 and F_NumParam4 in({0}) and F_MonitorIndex in(SELECT min(F_MonitorIndex) as minMidx FROM T_Monitor_Task,T_Manage_Task where FID=F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex=T_Monitor_Task.F_ManageTASKKINDINDEX group by F_ManageTaskIndex) ", mutextransend); //sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_DeviceCommandIndex=6 and F_Status >0 and F_NumParam4 in({0}) ", mutextransend); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的输送机任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } #endregion #region 变更RGV的任务及输送机,堆垛机 object[] ob; if (CheckForbidden != "" && CheckOtherForbidden != "")// { int ifForbidden = ccf.GetDeviceLockedState(Convert.ToInt32(CheckForbidden)); if (ifForbidden == -1)//禁用 { int ifotherForbidden = ccf.GetDeviceLockedState(Convert.ToInt32(CheckOtherForbidden)); if (ifotherForbidden != -1)//不能被禁用 { //获得送货位置对应的坐标 string[] end = ChangeToNewEnd.Split(';'); bool flag = true; if (end.Length > 1) { flag = false;//不需要更新堆垛机坐标 } if (flag) { string checkcell = ccf.GetStackCoordinateFromLaneGate(Convert.ToInt32(ChangeCheckEnd));//原来的取货坐标 string newcell = ccf.GetStackCoordinateFromLaneGate(Convert.ToInt32(ChangeToNewEnd));//新的取货坐标 string[] checkzxy = checkcell.Split('-'); string[] newzxy = newcell.Split('-'); if (checkcell != "-" && checkzxy.Length > 2 && newcell != "-" && newzxy.Length > 2) { //更改堆垛机送货坐标, 检测条件 ob = new object[10] { fid, mti, newzxy[0], newzxy[1], newzxy[2], ChangeCheckEnd, ChangeToNewEnd, checkzxy[0], checkzxy[1], checkzxy[2] }; dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam1={2}, F_NumParam2={3}, F_NumParam3={4},F_AheadDetect = REPLACE(F_AheadDetect, '{5}', '{6}') WHERE F_NumParam1={7} and F_NumParam2={8} and F_NumParam3={9} and (F_ManageTaskIndex ={0}) AND (F_ManageTASKKINDINDEX ={1})", ob)); } } // //获得出库任务终点 string[] checkend = ChangeCheckEnd.Split(';'); string[] newend = ChangeToNewEnd.Split(';'); if (checkend.Length > 1 && newend.Length > 1) { int index = Array.IndexOf(checkend, EndDevice.ToString());//查找任务终点是否在检测组中 if (index > -1) { ChangeToNewEnd = newend[index]; } // 变更任务终点 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FENDDEVICE= ").Append(ChangeToNewEnd).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(fid); dbo.ExecuteSql(sql.ToString()); } //更改送货输送机的起点和终点,及送出条件 ob = new object[9] { Checkgate, fid, mti, ChangeToNewStart, ChangeToNewEnd, ccf.GetRouteIDsub(Convert.ToInt32(ChangeToNewStart)), Checkgate, ChangeToNewStart, ChangeToNewEnd }; int count=dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_NumParam1={3},F_NumParam4={4},F_RouteID={5}, F_AheadDetect = REPLACE(F_AheadDetect, '{6}', '{7}') WHERE F_NumParam4 !={8} and F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); //更改next设备 ob = new object[6] { Checkgate, fid, mti, ChangeToNewStart, ChangeCheckNext, ChangeToNewNext }; dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_DeviceIndex={3}, F_AheadDetect = REPLACE(F_AheadDetect, '{4}', '{5}') WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); //变更RGV的送货点,检测条件。 // ob = new object[5] { Checkgate, fid, mti, Checkgate, ChangeToNewStart };//更该检测条件 //string ssss = string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{3}', '{4}') WHERE ((F_DeviceCommandIndex = 2 and F_NumParam4 = {0}) OR(F_DeviceCommandIndex = 3 AND F_NumParam1 = {0})) and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob); dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{3}', '{4}') WHERE ((F_DeviceCommandIndex = 2 and F_NumParam4 = {0}) OR(F_DeviceCommandIndex = 3 AND F_NumParam1 = {0})) and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); ob = new object[4] { Checkgate, fid, mti, ChangeToNewStart };//更改送货坐标 dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam4={3} WHERE F_DeviceCommandIndex =2 and F_NumParam4={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); ob = new object[4] { Checkgate, fid, mti, ChangeToNewStart };//更改送货坐标 dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam1={3} WHERE F_DeviceCommandIndex =3 and F_NumParam1={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob)); CommonClassLib.CCarryConvert.WriteDarkCasket("设备禁用变更后续路径", minMidx.ToString(), DeviceIdx.ToString(), CheckForbidden); if (count > 0) { return false; } } } } #endregion } } } #endregion #region 判读是否存在输送机的互斥任务,包括堆垛机和RGv if (DeviceKind == 2 && (DeviceOrder == 6))// 送出指令 { int gate = DeviceIdx; string mutexend = ""; string mutextransend = ""; sqlstr = string.Format("SELECT F_LaneGateDeviceIndex,F_MutexEnd, F_MutexTransEnd FROM T_Base_Lane_Gate where F_MutexTransEnd is not null and F_LaneGateDeviceIndex={0} ", gate);//在lanegate表中查找需要判断的lanegate dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0)// 有该出库任务终点货位对应的堆垛机取货任务 { mutexend = Convert.ToString(dvdv[0]["F_MutexEnd"]); mutextransend = Convert.ToString(dvdv[0]["F_MutexTransEnd"]); } #region 双向互斥任务的判断,需要判断输送机和穿梭车 //string sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]);//lanegate 坐标 string ChangeCheckEnd = "";//;分隔 string ChangeToNewEnd = "";//;分隔 string CheckTaskStart = "";//,逗号分隔,判断是否存在该起点的任务 string CheckTaskNewStart = "";//,分隔 sqlstr = string.Format("SELECT * FROM T_Base_RGV_Gate WHERE F_MutexTransEnd is not null and F_RGVGateDeviceIndex={0}", gate);//在lanegate表中查找需要判断的lanegate dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0)// 有该出库任务终点货位对应的RGV取货任务 { mutexend = Convert.ToString(dvdv[0]["F_MutexEnd"]); mutextransend = Convert.ToString(dvdv[0]["F_MutexTransEnd"]); ChangeCheckEnd = Convert.ToString(dvdv[0]["F_ChangeCheckEnd"]);//;分隔 ChangeToNewEnd = Convert.ToString(dvdv[0]["F_ChangeToNewEnd"]);//;分隔 CheckTaskStart = Convert.ToString(dvdv[0]["F_CheckTaskStart"]);//,逗号分隔,判断是否存在该起点的任务 CheckTaskNewStart = Convert.ToString(dvdv[0]["F_CheckTaskNewStart"]);//,分隔 } char[] cc = new char[1] { ',' }; //查找互斥的堆垛机任务 if (mutexend != "") { string[] StackMutexEnd = mutexend.Split(cc);//13001;13002 string sendcell; string[] cellzxy; for (int i = 0; i < StackMutexEnd.Length; i++) { int lanegate = Convert.ToInt32(StackMutexEnd[i]); sendcell = ccf.GetStackCoordinateFromLaneGate(lanegate); if (sendcell != "-") { cellzxy = sendcell.Split('-'); if (cellzxy.Length == 3) { sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceCommandIndex =4 OR F_DeviceCommandIndex =5) and F_Status>0 and (F_NumParam4 = {0}) AND (F_NumParam5 = {1}) AND (F_NumParam6 = {2})", Convert.ToInt32(cellzxy[0]), Convert.ToInt32(cellzxy[1]), Convert.ToInt32(cellzxy[2])); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的堆垛机任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } } //查找互斥RGV任务 if (mutexend != "") { sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE ((F_DeviceCommandIndex =2 and F_NumParam4 in ({0})) OR (F_DeviceCommandIndex =3 AND F_NumParam1 in ({0}))) and F_Status>0 ", mutexend); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的RGV任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } //查找互斥输送机任务 if (mutextransend != "") { sqlstr = string.Format(" SELECT F_MonitorIndex FROM T_Monitor_Task where F_DeviceCommandIndex=6 and F_NumParam4 in({0}) and F_MonitorIndex <>{1} and F_MonitorIndex in(SELECT min(F_MonitorIndex) as minMidx FROM T_Monitor_Task,T_Manage_Task where FID=F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex=T_Monitor_Task.F_ManageTASKKINDINDEX group by F_ManageTaskIndex) ", mutextransend, TaskIdx); //sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_DeviceCommandIndex=6 and F_Status >0 and F_NumParam4 in({0}) ", mutextransend); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的输送机任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } #region H型RGV站台送出指令的判断 if (CheckTaskStart != "" && CheckTaskNewStart != "") { //查找站台送出任务对应的终点,在哪组终点中,获得对应的起点组 //不能存在该起点组的任务 //ChangeCheckEnd = Convert.ToString(dvdv[0]["F_ChangeCheckEnd"]);//;分隔 //ChangeToNewEnd = Convert.ToString(dvdv[0]["F_ChangeToNewEnd"]);//;分隔 //CheckTaskStart = Convert.ToString(dvdv[0]["F_CheckTaskStart"]);//,逗号分隔,判断是否存在该起点的任务 //CheckTaskNewStart = Convert.ToString(dvdv[0]["F_CheckTaskNewStart"]);//,分隔 int[] zxy = ccf.GetCoordinatesFromMonitorTask(minMidx); if (zxy != null) { string checkend = string.Empty; string checkstart = string.Empty; int transend = zxy[3];//任务对应的终点输送机 if(ChangeCheckEnd.Contains(transend.ToString())) { checkend = ChangeCheckEnd.Replace(';',',');// input.Replace("}", ""); checkstart = CheckTaskStart; } if(ChangeToNewEnd.Contains(transend.ToString())) { checkend = ChangeToNewEnd.Replace(';', ','); checkstart = CheckTaskNewStart; } //不能存在起点是checkstart,终点是checkend的任务 sqlstr = string.Format(" SELECT F_MonitorIndex FROM T_Monitor_Task where F_DeviceCommandIndex=6 and F_NumParam4 not in({0}) and F_NumParam1 in ({1})", checkend,checkstart); //sqlstr = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE F_DeviceCommandIndex=6 and F_Status >0 and F_NumParam4 in({0}) ", mutextransend); dvdv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dvdv.Count > 0) { int task = Convert.ToInt32(dvdv[0]["F_MonitorIndex"]); AheadDetectUnallow.Append(string.Format("存在互斥的输送机任务:{0},该任务不能执行! ", task)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } #endregion #endregion } #endregion #region 双伸位的堆垛机在执行起点是里位(1,4排)的任务时,判读是否有起点是外位(2,3排)的任务 山东辛化 (134排) if (devinfo.StackReach == 2 && DeviceKind == 1 && (DeviceOrder == 4))// 双伸堆垛机, 取货 { int[] zxy = ccf.GetCoordinatesFromMonitorTask(minMidx); string neighborzxy = string.Empty; string sqlstrzxy = string.Empty;// string sqlman = string.Empty; //bool insidecell = false;//当前任务对应的里位还是外位 bool check = false; if (zxy != null) { int getZ = zxy[0];//取货的排坐标 int sendZ = zxy[3]; //送货位置对应的排坐标 int newZ;//, newX, newY int tempZ = getZ; //山东辛化处理4-3-3 这特殊货架的转换排 if (DeviceIdx == 11001) { tempZ = getZ % 4; } else { tempZ = getZ % 3; if (tempZ == 2) { //山东辛化这是单排不判断 tempZ = 6; } else if (tempZ == 0) { tempZ = 3; } else { tempZ = 0; } } if (tempZ == 1 || tempZ == 0)//里位取货时,要判读是否有外位的取货任务 {//获取外位坐标 if (tempZ == 1) { newZ = getZ + 1; } else { newZ = getZ - 1; } neighborzxy = string.Format("{0:D2}-{1:D2}-{2:D2}", newZ, zxy[1], zxy[2]);//获得外位坐标 sqlstrzxy = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceCommandIndex =4) and (F_NumParam1 = {0}) AND (F_NumParam2 = {1}) AND (F_NumParam3 = {2}) and (F_DeviceIndex={3})", newZ, zxy[1], zxy[2], DeviceIdx); //sqlstrzxy sqlman = string.Format("SELECT FID FROM T_Manage_Task WHERE (FSTATUS = 0) AND(FSTARTDEVICE = {0}) AND (FSTARTCELL = '{1}') ", StartDevice, neighborzxy); //sqlstrzxy check = true; if (check) { dvdv = dbo.ExceSQL(sqlstrzxy).Tables[0].DefaultView; if (dvdv.Count > 0)// { AheadDetectUnallow.Append(string.Format("存在相邻货位{0}的优先任务,该任务暂时不能执行! ", neighborzxy)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } dvdv = dbo.ExceSQL(sqlman).Tables[0].DefaultView; if (dvdv.Count > 0)// { AheadDetectUnallow.Append(string.Format("存在相邻货位{0}的优先任务,该任务暂时不能执行! ", neighborzxy)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } tempZ = sendZ; //if (tempZ>4) //{ //山东辛化注释 // tempZ = sendZ % 4; //} //山东辛化处理4-3-3 这特殊货架的转换排 if (DeviceIdx == 11001) { tempZ = sendZ % 4; } else { tempZ = sendZ % 3; if (tempZ == 2) { //山东辛化这是单排不判断 tempZ = 6; } else if (tempZ == 0) { tempZ = 3; } else { tempZ = 0; } } if (tempZ == 2 || tempZ == 3)//外位送货时,要判读是否有里位的送货任务 {//获取里位坐标 if (tempZ == 2) { newZ = sendZ - 1; } else { newZ = sendZ + 1; } neighborzxy = string.Format("{0:D2}-{1:D2}-{2:D2}", newZ, zxy[4], zxy[5]);//获得外位坐标 sqlstrzxy = string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE ( F_DeviceCommandIndex =5) and (F_NumParam4 = {0}) AND (F_NumParam5 = {1}) AND (F_NumParam6 = {2}) and (F_DeviceIndex={3})", newZ, zxy[4], zxy[5], DeviceIdx); sqlman = string.Format("SELECT FID FROM T_Manage_Task WHERE (FSTATUS = 0) AND(FENDDEVICE = {0}) AND (FENDCELL = '{1}') ", EndDevice, neighborzxy); check = true; if (check) { dvdv = dbo.ExceSQL(sqlstrzxy).Tables[0].DefaultView; if (dvdv.Count > 0)// { AheadDetectUnallow.Append(string.Format("存在相邻货位{0}的优先任务,该任务暂时不能执行! ", neighborzxy)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } dvdv = dbo.ExceSQL(sqlman).Tables[0].DefaultView; if (dvdv.Count > 0)// { AheadDetectUnallow.Append(string.Format("存在相邻货位{0}的优先任务,该任务暂时不能执行! ", neighborzxy)); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;//不能执行出库任务 } } } } } #endregion #region add for CATL YB2 判断一楼 管理配置的模式类型 1- AGV 0 - 人工 人工模式限制任务数 1 // 人工模式时需要对缓存到前序站台的任务数做数量为 1 的限制 //2220173-时代吉利 单向出入 应该就不需要模式了 //if (SControlMonitor._StationInfo != null)//_StationInfo ._StationInfo[EndDevice] //{ // #region // // 查出 前序站台编号 // //定义 变量前序站台 // string preMade = string.Empty; // preMade = string.Format("SELECT F_PREDEVICE FROM T_BASE_PREAMBLE where F_PREMARK <> 3 "); // preMadeT = dbo.ExceSQL(preMade).Tables[0].DefaultView; // int manMadePre = 0; // for (int p = 0; p < preMadeT.Count; p++) // { // manMadePre = Convert.ToInt32(preMadeT[p]["F_PREDEVICE"]); // if (manMadePre == EndDevice) // { // DataView dvBuffer = dboM.ExceSQL("SELECT STATION_MODE FROM IO_CONTROL_BUFFER where station_code =" + EndDevice.ToString()).Tables[0].DefaultView; // // 判断模式是不是人工模式 // if (SControlMonitor._StationInfo[EndDevice].Station_Mode == "0" || dvBuffer[0]["STATION_MODE"].ToString() == "0") // { // DataView dvPreDevice = dbo.ExceSQL(string.Format("SELECT F_PREDEVICE,F_REMAKE FROM T_BASE_PREAMBLE WHERE (F_PREMARK <> 3) and F_PREDEVICE ='{0}'", EndDevice)).Tables[0].DefaultView; // int tCount = 0; // if (dvPreDevice.Count > 0) // { // //转台开关 // string remark = Convert.ToString(dvPreDevice[0]["F_REMAKE"]); // string[] starTopDevice = remark.Split(';'); // for (int m = 0; m < starTopDevice.Length; m++) // { // int preCount = ccf.GetTransDeviceGoodsCounts(starTopDevice[m].ToString()); // if (preCount > 0) // { // tCount++; // } // } // } // // 如果当前任务模式为人工模式: 需要判断的是到前序的每个终点执行的任务数 和 开关点之和为1 // // 人工模式前序 终点位置光电开关 和 终点位置站台状态 // int manMadePreamble = ccf.GetTransDeviceGoodsCounts(manMadePre.ToString()); // // 查询状态不为 0 的正在执行的任务终点是这的任务 // int totalPre = 0; // //正在执行的任务数 // int taskEndCount = ccf.GetTaskCounts(manMadePre.ToString(), fid); // if (StartDevice == Convert.ToInt32(dvPreDevice[0]["F_REMAKE"])) // { // totalPre = manMadePreamble; // } // else // { // totalPre = manMadePreamble + taskEndCount+ tCount; // } // if (totalPre >=1) // { // AheadDetectUnallow.Append(string.Format("手工模式限制:", manMadePre)); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false;//不能执行出库任务 // } // } // } // } // #endregion //} #endregion #region 增加本级后序供给缓存托盘时候,不能出现跨级盘回库和本机出库去抽检的任务 add for CATL YB2 // 判断起点是 阴极后序扫码 12430 和 阳极后序 32430 的任务 并且终点位置是去缓存线的 // 如果存在上述任务需要执行时,需要判断 是否存在 起点 22454 和 42456 为起点的终点是货位的任务 // 后序产生的空托盘供给缓存线和跨级空托回库任务互斥 存在或者生成抽检任务时候 所有的空托盘都回库 防止后序空托共缓存和区抽检任务顶牛 // 42456 - 32441和32448 //只有本机后工序供给缓存托盘和抽检出库 对顶 //2220173-时代吉利 如下设置的话 需要管理限制抽检出库和空托盘回库不共存 并且跨级直供和本级直供都走 1号提升机 这样1号提升机都是向上的 if (CONTROLTASKTYPE == 4 && order == 6 && ( ("12431,32433".Contains(StartDevice.ToString()) && "22503,22525,22536,22545,42503,42525,42536,42545".Contains(EndDevice.ToString()) ) || ("22438,42443".Contains(StartDevice.ToString()) && "12445,12449,12455,32446,32450,32455".Contains(EndDevice.ToString())) ) ) { // 后序供给缓存 //DataView dvLastStock1 = new DataView(); //DataView dvLastStock2 = new DataView(); //DataView dvCrossStock2 = new DataView(); // 互斥任务判断 DataView dvCrossStock1 = new DataView(); switch (DeviceIdx) { //12430 和 22454起点任务互斥 case 12431: // 增加不等于自己的条件是 防止任务发送成功 但是电气一直为执行或者没回运行状态情况 dvCrossStock1 = dbo.ExceSQL(string.Format("SELECT F_MANAGETASKINDEX FROM T_MONITOR_TASK WHERE F_NUMPARAM1 in (22438) and F_NUMPARAM4 in(12445,12449,12455) and F_STATUS > 0 and F_MONITORINDEX <> {0}", TaskIdx)).Tables[0].DefaultView; break; case 32433: // 增加不等于自己的条件是 防止任务发送成功 但是电气一直为执行或者没回运行状态情况 dvCrossStock1 = dbo.ExceSQL(string.Format("SELECT F_MANAGETASKINDEX FROM T_MONITOR_TASK WHERE F_NUMPARAM1 in (42443) and F_NUMPARAM4 in(32446,32450,32455) and F_STATUS > 0 and F_MONITORINDEX <> {0}", TaskIdx)).Tables[0].DefaultView; break; case 22438: // 增加不等于自己的条件是 防止任务发送成功 但是电气一直为执行或者没回运行状态情况 dvCrossStock1 = dbo.ExceSQL(string.Format("SELECT F_MANAGETASKINDEX FROM T_MONITOR_TASK WHERE F_NUMPARAM1 in (12431) and F_NUMPARAM4 in(22503,22525,22536,22545) and F_STATUS > 0 and F_MONITORINDEX <> {0}", TaskIdx)).Tables[0].DefaultView; break; case 42443: // 增加不等于自己的条件是 防止任务发送成功 但是电气一直为执行或者没回运行状态情况 dvCrossStock1 = dbo.ExceSQL(string.Format("SELECT F_MANAGETASKINDEX FROM T_MONITOR_TASK WHERE F_NUMPARAM1 in (32433) and F_NUMPARAM4 in(42503,42525,42536,42545) and F_STATUS > 0 and F_MONITORINDEX <> {0}", TaskIdx)).Tables[0].DefaultView; break; } //int count1 = dvLastStock1.Count + dvCrossStock1.Count; //int count2 = dvLastStock2.Count + dvCrossStock2.Count; if (dvCrossStock1.Count > 0) { AheadDetectUnallow.Append("存在互斥任务尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, TaskIdx); return false; } } #endregion #region 2220173-时代吉利 经过提升机的指令限制 防止顶牛 左侧本极 右侧跨极+所有直供 //经过提升机的任务 指令终点都拆到 出提升机位置 避让处理 #region 阴极 本极除直供外其他走2号提升机 跨级走1号提升机 #region 1.阴极空托盘回二楼缓存 正常情况下走 14402 向上走 2.空托盘跨级回 正常情况下 走14401 阴极-->阳极 向上走 //2.空托盘跨级回 正常情况下 走14401 阴极-->阳极 向上走 if (CONTROLTASKTYPE == 4 && order == 6 && DeviceIdx == 12431) { //1.阴极空托盘回二楼缓存 正常情况下走 14402 向上走 //117:12431-22503(阴极后序空托盘补阴极缓存) //118:12431-22525(阴极空托出库到阴极缓存区) //119:12431-22536(阴极空托出库到阴极缓存区) //120:12431-22545(阴极空托出库到阴极缓存区) //12431送出 - 22440送出 - 22503(经过14402) //12431送出 - 22434送出 - 22503(经过14401)改道路线 if (ccf.GetNumParam1FromMonitor(minMidx) == 12431 && ccf.GetNumParam4FromMonitor(minMidx) == 22440) { if (ccf.GetDeviceStatusFromBaseDevice(14402) == 998) //禁用了 改走14401 { if (ccf.GetDeviceStatusFromBaseDevice(14401) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=22434 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>22434"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=22434,F_deviceIndex=22434,F_AHEADDETECT='D-21408.0;I21408;I22435;D22435.0' where F_DEVICEINDEX=22440 and F_NUMPARAM1=22440 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //14002提升机没坏 正常判断 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=12439 and (F_numparam1=22433 or F_numparam1=22438) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) //|| ccf.GetTransDeviceGoodsCounts("12439")>0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //当14402 坏了 改道走14401 二楼抽检出库 和跨级回库的也会被改道 所以要限制 if (ccf.GetNumParam1FromMonitor(minMidx) == 12431 && ccf.GetNumParam4FromMonitor(minMidx) == 22434) { //提升机没坏 正常判断 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=12434 and (F_numparam1=22433 or F_numparam1=22438) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0)//|| ccf.GetTransDeviceGoodsCounts("12434") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //2.空托盘跨级回 正常情况下 走14401 阴极-->阳极 向上走 //106:12431-42443(阴极后序空托盘回阳极片区) //12431送出 - 52109送出 - 42443(经过14401) //12431送出 - 52101送出 - 42443(经过14402)改道路线 if (ccf.GetNumParam1FromMonitor(minMidx) == 12431 && ccf.GetNumParam4FromMonitor(minMidx) == 52109) { if (ccf.GetDeviceStatusFromBaseDevice(14401) == 998) //禁用了 改走14402 { if (ccf.GetDeviceStatusFromBaseDevice(14402) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=52101 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>52101"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length);//F_CHANGEROUTEFLG=1, sql.Append("update t_Monitor_Task set F_numParam1=52101,F_deviceIndex=52101,F_AHEADDETECT='D-52101.0;I52101;I51104;D51104.0' where F_DEVICEINDEX=52109 and F_NUMPARAM1=52109 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } // 14402提升机坏 抽检出库、跨级回库走14001了 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=12434 and (F_numparam1=22433 or F_numparam1=22438) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0)// || ccf.GetTransDeviceGoodsCounts("12434") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetNumParam1FromMonitor(minMidx) == 12431 && ccf.GetNumParam4FromMonitor(minMidx) == 52101) { //14401提升机坏 改道14402时 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=12439 and (F_numparam1=22433 or F_numparam1=22438) and F_status>0"); DataView dwdw1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw1.Count > 0)//|| ccf.GetTransDeviceGoodsCounts("12439") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw1[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } #endregion #region 3.本极直供本极 阴极->阴极 4.跨极直供 阴极->阳极 //4.跨极直供 阴极->阳极 //直供常规都走1号提升机 向上 //129:12442-13101(阴极前序实托盘直供阴极后序1片区) //130:12442-13103(阴极前序实托盘直供阴极后序1片区) //131:12442-13201(阴极前序实托盘直供阴极后序2片区) //132:12442-13203(阴极前序实托盘直供阴极后序2片区) //133:12442-13301(阴极前序实托盘直供阴极后序3片区) //134:12442-13303(阴极前序实托盘直供阴极后序3片区) //135:12442-33101(阴极前序实托盘直供阳极后序1片区) //136:12442-33103(阴极前序实托盘直供阳极后序1片区) //137:12442-33201(阴极前序实托盘直供阳极后序2片区) //138:12442-33203(阴极前序实托盘直供阳极后序2片区) //139:12442-33301(阴极前序实托盘直供阳极后序3片区) //140:12442-33303(阴极前序实托盘直供阳极后序3片区) if (CONTROLTASKTYPE == 4 && order == 6 && DeviceIdx == 12452) //12442 { //3.本极直供本极 阴极->阴极 //12442送出-22434送出-22104送出-13101(经过14401) //12442送出-22440送出-22104送出-13101(经过14402)改道路径 //4.跨极直供 阴极->阳极 //12442送出-22434送出-42104送出-33101(经过14401) //12442送出-22440送出-42104送出-33101(经过14402)改道路径 if (ccf.GetNumParam1FromMonitor(minMidx) == 12442 && ccf.GetNumParam4FromMonitor(minMidx) == 22434)//正常走14401 { if (ccf.GetDeviceStatusFromBaseDevice(14401) == 998) //禁用了 改走14402 { if (ccf.GetDeviceStatusFromBaseDevice(14402) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=22440 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>22440"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=22440,F_deviceIndex=22440,F_AHEADDETECT='D-21410.0;I21410;I21411;D21411.0' where F_DEVICEINDEX=22434 and F_NUMPARAM1=22434 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //14001提升机没坏 14402坏了 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=12434 and (F_numparam1=22433 or F_numparam1=22438) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0)// || ccf.GetTransDeviceGoodsCounts("12439") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetNumParam1FromMonitor(minMidx) == 12442 && ccf.GetNumParam4FromMonitor(minMidx) == 22440)//走14402 { //14401提升机坏 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=12439 and (F_numparam1=22433 or F_numparam1=22438) and F_status>0"); DataView dwdw1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw1.Count > 0)//|| ccf.GetTransDeviceGoodsCounts("12434") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw1[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } #endregion #region 5.抽检出库阴极 //121:18001-13501(阴极抽检出库) //122:18002-13501(阴极抽检出库) //123:18003-13501(阴极抽检出库) if (CONTROLTASKTYPE == 2 && order == 6 && DeviceIdx == 22433) { //5.抽检出库阴极 正常走14402 //18001-10001取货-10001送货-22458送出-22433送出-送出12439-13501(经过14402) //18001-10001取货-10001送货-22458送出-22433送出-送出12434-13501(经过14401)改道路径 if (ccf.GetNumParam1FromMonitor(minMidx) == 22433 && ccf.GetNumParam4FromMonitor(minMidx) == 12439) { if (ccf.GetDeviceStatusFromBaseDevice(14402) == 998) //禁用了 改走14401 { if (ccf.GetDeviceStatusFromBaseDevice(14401) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=12434 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>12434"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=12434,F_deviceIndex=12434,F_AHEADDETECT='D-11407.0;I11407;I12435;D12435.0' where F_DEVICEINDEX=12439 and F_NUMPARAM1=12439 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //14002提升机没坏 正常判断 是否存在空托盘回缓存、直供本级、直供跨级、 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=12431 and F_numparam4=22440) or (F_numparam1=12442 and F_numparam4=22440)) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } //14002提升机没坏 14401坏了 正常判断 是否存在空托跨级回 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=12431 and F_numparam4=52101)) and F_status>0"); DataView dwdw2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw2.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw2[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetNumParam1FromMonitor(minMidx) == 22433 && ccf.GetNumParam4FromMonitor(minMidx) == 12434) //改走14001 { //14002提升机坏 正常判断 是否存在空托盘回缓存、直供本级\直供跨级、 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=12431 and F_numparam4=22434) or (F_numparam1=12442 and F_numparam4=22434)) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } //14002提升机坏 正常判断 是否存在空托跨级回 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=12431 and F_numparam4=52109)) and F_status>0"); DataView dwdw2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw2.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw2[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } #endregion #region 6.空托盘 跨级回来的 入库 //248:22438-12445(阳极后序空托盘入阴极库) //249:22438-12449(阳极后序空托盘入阴极库) //250:22438-12455(阳极后序空托盘入阴极库) if (CONTROLTASKTYPE == 4 && order == 6 && DeviceIdx == 22438) { //空托盘 跨级回来的 入库正常走14402 //22438送出-12439送出-12445(经过14402) //22438送出-12434送出-12445(经过14401)改道路径 if (ccf.GetNumParam1FromMonitor(minMidx) == 22438 && ccf.GetNumParam4FromMonitor(minMidx) == 12439) { if (ccf.GetDeviceStatusFromBaseDevice(14402) == 998) //禁用了 改走14401 { if (ccf.GetDeviceStatusFromBaseDevice(14401) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=12434 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>12434"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=12434,F_deviceIndex=12434,F_AHEADDETECT='D-11407.0;I11407;I12435;D12435.0' where F_DEVICEINDEX=12439 and F_NUMPARAM1=12439 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //14002提升机没坏 正常判断 是否存在空托盘回缓存、直供本级、直供跨级 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=12431 and F_numparam4=22440) or (F_numparam1=12442 and F_numparam4=22440)) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【"+ dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } //14002提升机没坏 正常判断 是否存在空托跨级回 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=12431 and F_numparam4=52101)) and F_status>0"); DataView dwdw2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw2.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw2[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetNumParam1FromMonitor(minMidx) == 22438 && ccf.GetNumParam4FromMonitor(minMidx) == 12434) { //14002提升机坏 正常判断 是否存在空托盘回缓存、直供本级、直供跨级 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=12431 and F_numparam4=22434) or (F_numparam1=12442 and F_numparam4=22434)) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } //14002提升机坏 正常判断 是否存在空托跨级回 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=12431 and F_numparam4=52109)) and F_status>0"); DataView dwdw2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw2.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw2[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } #endregion #endregion #region 阳极 直供、空托盘跨级回走2号提升机 空托盘回二楼缓存、抽检出库、跨级回的空托盘回库走1号提升机 #region 1.阳极空托盘回二楼缓存 正常情况下走 34402 向上走 2.空托盘跨级回 正常情况下 走34401 阳极-->阴极 向上走 //2.空托盘跨级回 正常情况下 走34401 阳极-->阴极 向上走 //258:32433-42503(阳极后序空托盘补阳极缓存) //259:32433-42525(阳极后序空托盘补阳极缓存) //260:32433-42536(阳极后序空托盘补阳极缓存) //261:32433-42545(阳极后序空托盘补阳极缓存) if (CONTROLTASKTYPE == 4 && order == 6 && DeviceIdx == 32433) { //1.阳极空托盘回二楼缓存 正常情况下走 34402 向上走 //32433送出-42445送出-42503(经过34402) //32433送出-42442送出-42503(经过34401)改道路径 if (ccf.GetNumParam1FromMonitor(minMidx) == 32433 && ccf.GetNumParam4FromMonitor(minMidx) == 42445) { if (ccf.GetDeviceStatusFromBaseDevice(34402) == 998) //禁用了 改走34401 { if (ccf.GetDeviceStatusFromBaseDevice(34401) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=42442 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>42442"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=42442,F_deviceIndex=42442,F_AHEADDETECT='D-41410.0;I41410;I42443;D42443.0' where F_DEVICEINDEX=42445 and F_NUMPARAM1=42445 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //34002提升机没坏 正常判断 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=32440 and (F_numparam1=42438 or F_numparam1=42443) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) //|| ccf.GetTransDeviceGoodsCounts("12439")>0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //当34402 坏了 改道走34401 二楼抽检出库 和跨级回库的也会被改道 所以要限制 if (ccf.GetNumParam1FromMonitor(minMidx) == 32433 && ccf.GetNumParam4FromMonitor(minMidx) == 42442) { //提升机没坏 正常判断 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=32436 and (F_numparam1=42438 or F_numparam1=42443) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0)//|| ccf.GetTransDeviceGoodsCounts("12434") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //2.空托盘跨级回 正常情况下 走34401 阳极-->阴极 向上走 //247:32433-22438(阳极后序空托盘回阴极片区) //32433送出-52107送出-22438(经过34401) //32433送出-52103送出-22438(经过34402)改道路径 if (ccf.GetNumParam1FromMonitor(minMidx) == 32433 && ccf.GetNumParam4FromMonitor(minMidx) == 52107) { if (ccf.GetDeviceStatusFromBaseDevice(34401) == 998) //禁用了 改走34402 { if (ccf.GetDeviceStatusFromBaseDevice(34402) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=52103 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>52103"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=52103,F_deviceIndex=52103,F_AHEADDETECT='D-52103.0;I52103;I51102;D51102.0' where F_DEVICEINDEX=52107 and F_NUMPARAM1=52107 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } // 34402提升机坏 抽检出库、跨级回库走34001了 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=32436 and (F_numparam1=42443 or F_numparam1=42438) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0)// || ccf.GetTransDeviceGoodsCounts("12434") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetNumParam1FromMonitor(minMidx) == 32433 && ccf.GetNumParam4FromMonitor(minMidx) == 52103) { //34401提升机坏 改道34402时 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=32440 and (F_numparam1=42443 or F_numparam1=42438) and F_status>0"); DataView dwdw1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw1.Count > 0)//|| ccf.GetTransDeviceGoodsCounts("12439") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw1[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } #endregion #region 3.本极直供本极 阴极->阴极 4.跨极直供 阴极->阳极 //4.跨极直供 阴极->阳极 直供都走1号提升机 //270:32443-33102(阳极前序实托盘直供阳极后序1片区) //271:32443-33104(阳极前序实托盘直供阳极后序1片区) //272:32443-33202(阳极前序实托盘直供阳极后序2片区) //273:32443-33204(阳极前序实托盘直供阳极后序2片区) //274:32443-33302(阳极前序实托盘直供阳极后序3片区) //275:32443-33304(阳极前序实托盘直供阳极后序3片区) //276:32443-13102(阳极前序实托盘直供阴极后序1片区) //277:32443-13104(阳极前序实托盘直供阴极后序1片区) //278:32443-13202(阳极前序实托盘直供阴极后序2片区) //279:32443-13204(阳极前序实托盘直供阴极后序2片区) //280:32443-13302(阳极前序实托盘直供阴极后序3片区) //281:32443-13304(阳极前序实托盘直供阴极后序3片区) if (CONTROLTASKTYPE == 4 && order == 6 && DeviceIdx == 32443) //12442 { //3.本极直供本极 阴极->阴极 //32443送出-42442送出-42112送出-33102(经过34401) //32443送出-42445送出-42112送出-33102(经过34402)改道路径 if (ccf.GetNumParam1FromMonitor(minMidx) == 32443 && ccf.GetNumParam4FromMonitor(minMidx) == 42442)//正常走34401 { if (ccf.GetDeviceStatusFromBaseDevice(34401) == 998) //禁用了 改走34402 { if (ccf.GetDeviceStatusFromBaseDevice(34402) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=42445 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>42445"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=42445,F_deviceIndex=42445,F_AHEADDETECT='D-41411.0;I41411;I41412;D41412.0' where F_DEVICEINDEX=42442 and F_NUMPARAM1=42442 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //34001提升机没坏 正常判断 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=42436 and (F_numparam1=42433 or F_numparam1=42438) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0)// || ccf.GetTransDeviceGoodsCounts("12439") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetNumParam1FromMonitor(minMidx) == 32443 && ccf.GetNumParam4FromMonitor(minMidx) == 42445)//走34402 { //提升机没坏 正常判断 是否存在抽检出库、跨级回来的空托盘入库 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where F_numparam4=32440 and (F_numparam1=42433 or F_numparam1=42438) and F_status>0"); DataView dwdw1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw1.Count > 0)//|| ccf.GetTransDeviceGoodsCounts("12434") > 0 { AheadDetectUnallow.Append("存在互斥任务【" + dwdw1[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } #endregion #region 5.抽检出库阳极 if (CONTROLTASKTYPE == 2 && order == 6 && DeviceIdx == 42438) { //5.抽检出库阳极 正常走34402 //262:18004-33501(阳极抽检出库) //263:18005-33501(阳极抽检出库) //264:18006-33501(阳极抽检出库) //18004-10004取货-10004送货-42452送出-42438送出-32440送出-33501(经过34402) //18004-10004取货-10004送货-42452送出-42438送出-32436送出-33501(经过34401)改道路径 if (ccf.GetNumParam1FromMonitor(minMidx) == 42438 && ccf.GetNumParam4FromMonitor(minMidx) == 32440) { if (ccf.GetDeviceStatusFromBaseDevice(34402) == 998) //禁用了 改走34401 { if (ccf.GetDeviceStatusFromBaseDevice(34401) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=32436 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>32436"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=32436,F_deviceIndex=32436,F_AHEADDETECT='D-31407.0;I31407;I32437;D32437.0' where F_DEVICEINDEX=32440 and F_NUMPARAM1=32440 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //34002提升机没坏 正常判断 是否存在空托盘回缓存、直供本级、直供跨级、 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=32433 and F_numparam4=42445) or (F_numparam1=32443 and F_numparam4=42445)) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } //34002提升机没坏 正常判断 是否存在空托跨级回 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=32433 and F_numparam4=52103)) and F_status>0"); DataView dwdw2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw2.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw2[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetNumParam1FromMonitor(minMidx) == 42438 && ccf.GetNumParam4FromMonitor(minMidx) == 32436) //改走34001 { //34002提升机坏 正常判断 是否存在空托盘回缓存、直供本级\直供跨级、 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=32433 and F_numparam4=42442) or (F_numparam1=32443 and F_numparam4=42442)) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } //34002提升机坏 正常判断 是否存在空托跨级回 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=32433 and F_numparam4=52103)) and F_status>0"); DataView dwdw2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw2.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw2[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } #endregion #region 6.空托盘 跨级回来的 入库 if (CONTROLTASKTYPE == 4 && order == 6 && DeviceIdx == 42443) { //空托盘 跨级回来的 入库正常走14402 //42443-32446(阴极后序空托盘入阳极库) //42443-32450(阴极后序空托盘入阳极库) //42443-32455(阴极后序空托盘入阳极库) //42443送出-32440送出-32446(经过34402) //42443送出-32436送出-32446(经过34401)改道路径 if (ccf.GetNumParam1FromMonitor(minMidx) == 42443 && ccf.GetNumParam4FromMonitor(minMidx) == 32440) { if (ccf.GetDeviceStatusFromBaseDevice(34402) == 998) //禁用了 改走14401 { if (ccf.GetDeviceStatusFromBaseDevice(34401) != 998) { sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam4=32436 where F_monitorindex=").Append(minMidx).Append(" and F_numParam4<>32436"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update t_Monitor_Task set F_numParam1=32436,F_deviceIndex=32436,F_AHEADDETECT='D-31407.0;I31407;I32437;D32437.0' where F_DEVICEINDEX=32436 and F_NUMPARAM1=32436 and F_MANAGETASKINDEX=").Append(ccf.GetManageTaskIndexfromMonitor(minMidx)); dbo.ExceSQL(sql.ToString()); return false; } else { AheadDetectUnallow.Append("提升机均被禁用!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } //14002提升机没坏 正常判断 是否存在空托盘回缓存、直供本级、直供跨级 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=32433 and F_numparam4=42445) or (F_numparam1=32443 and F_numparam4=42445)) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } //34002提升机没坏 正常判断 是否存在空托跨级回 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=32433 and F_numparam4=52103)) and F_status>0"); DataView dwdw2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw2.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw2[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetNumParam1FromMonitor(minMidx) == 42443 && ccf.GetNumParam4FromMonitor(minMidx) == 32436) { //14002提升机坏 正常判断 是否存在空托盘回缓存、直供本级、直供跨级 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=32433 and F_numparam4=42442) or (F_numparam1=32443 and F_numparam4=42442)) and F_status>0"); DataView dwdw = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } //14002提升机坏 正常判断 是否存在空托跨级回 sql.Remove(0, sql.Length); sql.Append("select F_monitorindex from t_Monitor_Task where ((F_numparam1=32433 and F_numparam4=52107)) and F_status>0"); DataView dwdw2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dwdw2.Count > 0) { AheadDetectUnallow.Append("存在互斥任务【" + dwdw2[0]["F_monitorindex"] + "】尚未完成"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } #endregion #endregion #endregion #region 顶升机构自关联入库任务单独处理//20101011 //20100406入库顶升时必要检测:1102内探物“-11021”;1121低到位“-11212”;有关联任务时,1102外探物“-11022”; if ((ccf.GetCorrel_DeviceIndex(devinfo.DeviceIndex, true) == "0") && (CONTROLTASKTYPE == 1) && (devinfo.IfCorrelDoubleFork == "1") && (devinfo.VirtualStack == 0))//顶升设备自关联,入库任务20101124增加顶升设备是否双叉判断 { string[] CorrelInfo = ccf.GetOwnCorrel_DeviceInfo(devinfo.DeviceIndex); if (CorrelInfo == null) { //20110505 AheadDetectUnallow.Append("顶升机构" + devinfo.DeviceIndex.ToString()+"没有自关联!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } if ((CStaticClass.GetDevicePhotoelectric(CorrelInfo[5]) == 1) && (CStaticClass.GetDevicePhotoelectric(CorrelInfo[2]) == 1))//近巷道有物,顶升低位//20101124 { #region 等待关联任务配对 //在CStaticClass.DoubleForkWaitTime规定时间内等待;1102(11027)转动等待 sql.Remove(0, sql.Length); sql.Append("SELECT F_TaskIndex,F_DeviceIndex,F_Remark FROM T_Base_PLC_Ask WHERE (F_TaskIndex =").Append(TaskIdx).Append(") AND (F_Remark <> '') AND (F_DeviceIndex=").Append(devinfo.DeviceIndex).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { //(Convert.ToDateTime(dv[0]["F_Remark"]).AddSeconds(Convert.ToInt32(CStaticClass.DoubleForkWaitTime)) > DateTime.Now) || if ((GetIOControlStatus(minMidx) != Model.CGeneralFunction.TASKSINGLEFORKRUN) || ((CStaticClass.GetDevicePhotoelectric(CorrelInfo[6]) == 1) && (CStaticClass.GetDevicePhotoelectric(CorrelInfo[4]) == 0)))//20101124 { if ((CStaticClass.GetDevicePhotoelectric(CorrelInfo[6]) == 1) && (CStaticClass.GetDevicePhotoelectric(CorrelInfo[4]) == 0))//外探物,运行//20101124 { //查找本地管理任务做多叉关联配对,关联任务分配近叉 int mfid = GetEnableDoubleForkManageTask(1, devinfo.DeviceIndex, fid); if (mfid > 0) { sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(mfid).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(fid); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FUseAwayFork='0',F_RELATIVECONTORLID=").Append(fid).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(mfid); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_UseAwayFork='0' where F_ManageTASKKINDINDEX=").Append(mti).Append(" and F_ManageTaskIndex=").Append(mfid).Append(""); dbo.ExecuteSql(sql.ToString()); //由于已经分配路径不一定符合远近货叉的分配原则,需要改道 AlterRoutePath(mti, mfid, CONTROLTASKTYPE, '0', devinfo.DeviceIndex); } return true; } else { //20110505 AheadDetectUnallow.Append("顶升机构" + devinfo.DeviceIndex.ToString() + "等待关联任务!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } else {//超过等待时间或者管理强制执行单叉任务 if (CStaticClass.GetDevicePhotoelectric(CorrelInfo[4]) == 1)//20101124 { sql.Remove(0, sql.Length); sql.Append("update T_Base_PLC_Ask set F_Remark='").Append(dtime).Append("' where (F_DeviceIndex=").Append(devinfo.DeviceIndex).Append(")"); dbo.ExecuteSql(sql.ToString()); //20110505 AheadDetectUnallow.Append("顶升机构" + devinfo.DeviceIndex.ToString() + "等待关联任务!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } sql.Remove(0, sql.Length); sql.Append("update T_Base_PLC_Ask set F_TaskIndex=0,F_Remark='' where (F_DeviceIndex=").Append(devinfo.DeviceIndex).Append(")"); dbo.ExecuteSql(sql.ToString()); return true; } } else { sql.Remove(0, sql.Length); sql.Append("SELECT F_TaskIndex,F_DeviceIndex,F_Remark FROM T_Base_PLC_Ask WHERE (F_TaskIndex =0) AND (F_Remark = '') AND (F_DeviceIndex=").Append(devinfo.DeviceIndex).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { sql.Remove(0, sql.Length); sql.Append("update T_Base_PLC_Ask set F_TaskIndex=").Append(TaskIdx).Append(",F_Remark='").Append(dtime).Append("' where (F_DeviceIndex=").Append(devinfo.DeviceIndex).Append(")"); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_UseAwayFork='1' where F_ManageTASKKINDINDEX=").Append(mti).Append(" and F_ManageTaskIndex=").Append(fid).Append(""); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FUseAwayFork='1' where F_ManageTASKKINDINDEX=").Append(mti).Append(" and FID=").Append(fid).Append(""); dbo.ExecuteSql(sql.ToString()); //由于已经分配路径不一定符合远近货叉的分配原则,需要改道 AlterRoutePath(mti, fid, CONTROLTASKTYPE, '1', devinfo.DeviceIndex); return false; } } #endregion } else { //20110505 AheadDetectUnallow.Append("顶升机构" + devinfo.DeviceIndex.ToString() + "不满足关联状态!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } #endregion //20101011 #region 双叉堆垛机的取货任务在此判断是否关联双叉、验证双叉任务是否为双叉极限货位 if ((devinfo.DeviceKind == 1) && (devinfo.IfCorrelDoubleFork == "1") && (ccf.GetDeviceOrderFromMonitor(minMidx) == 4) && (CONTROLTASKTYPE == 1)&&(devinfo.VirtualStack==0)) { string[] DevLanewayIOInfo = ccf.GetDeviceLaneGateInfoFromStackCoor(devinfo.DeviceIndex,minMidx); if (DevLanewayIOInfo == null) { //不是巷道口的取货任务不需要关联 CommonClassLib.CCarryConvert.WriteDarkCasket("单叉执行原因", minMidx.ToString(), devinfo.DeviceIndex.ToString(), "不是巷道口的取货任务不需要关联"); return true ; } Dictionary corrinfo=Model.CGeneralFunction.GetDoubleForkMonitorInfo(minMidx, devinfo.DeviceIndex); if (corrinfo == null)//20110412没关联任务 { #region 20110412堆垛机在顶升机取单叉任务,验证是否需要换货叉 string ChangeForkCell = ccf.IfLimitCellChangeFork(minMidx, devinfo.DeviceIndex); if (ChangeForkCell != "-")//主任务需要倒换货叉 { ccf.ChangeEndCellCode(minMidx, ChangeForkCell, devinfo.DeviceIndex); return false;//20140423richard如果不返回false,还会使用原来的坐标继续发送 } #endregion #region 20170110单叉入库任务执行时判读关联位置载货状态 int device =Convert.ToInt32( DevLanewayIOInfo[0]); //站台设备编号 string checkgoods = DevLanewayIOInfo[5];//判读该站台的关联站台是否有货 if (checkgoods!="")//不为空 { int devicebyte = 0, devbit = 0; DS = checkgoods.Trim().Split(dd); int.TryParse(DS[0], out devicebyte); int.TryParse(DS[1], out devbit); //判断是否检测负数索引值(负数代表是否满足开关量=1的执行前提) int havegoods = CStaticClass.GetDevicePhotoelectric(devicebyte, devbit);//20101124 if(havegoods==1) { string msg = string.Format("执行单叉入库任务时,入库站台{0}的关联站台有货,不能执行单叉入库", device); AheadDetectUnallow.Append(msg); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } #endregion #region 没关联任务 //string IfCorrel = ccf.GetCorrel_DeviceIndex(minMidx);//20110505 //if (IfCorrel == "")//无关联 //{ //} //else if (IfCorrel == "0")//自关联 //{ // //20110108 // dbo.ExecuteSql("update T_Monitor_Task set F_UseAwayFork='1' where F_ManageTASKKINDINDEX=" + mti + " and F_ManageTaskIndex=" + fid + ""); // dbo.ExecuteSql("update T_Manage_Task set FUseAwayFork='1' where F_ManageTASKKINDINDEX=" + mti + " and FID=" + fid + ""); // #region 20110412堆垛机在顶升机取单叉任务,验证是否需要换货叉 // string ChangeForkCell = ccf.IfLimitCellChangeFork(minMidx, devinfo.DeviceIndex); // if (ChangeForkCell != "-")//主任务需要倒换货叉 // { // ccf.ChangeEndCellCode(minMidx, ChangeForkCell, devinfo.DeviceIndex); // } // #endregion //} //else //{//有关联站台 // #region 双叉对等站台的单任务在此等待关联,双叉极限货位不关联 // if ((CStaticClass.GetDevicePhotoelectric(DevLanewayIOInfo[3]) == 1) && (CStaticClass.GetDevicePhotoelectric(DevLanewayIOInfo[1]) == 1))//有货,顶升高位 // { // #region 顶升高位有货 // bool isend; // return GetCorrManageTask(DevLanewayIOInfo, TaskIdx, CONTROLTASKTYPE, mti, fid, dtime,out isend); // #endregion // } // else // { // CommonClassLib.CCarryConvert.WriteDarkCasket("单叉执行原因", minMidx.ToString(), devinfo.DeviceIndex.ToString(), "顶升高位和有物信号不满足条件"); // } // #endregion //} #endregion } else { #region 有关联任务信息 #region 判断是否还有可关联的关联站台任务20120906 //bool isend; //GetCorrManageTask(DevLanewayIOInfo, TaskIdx, CONTROLTASKTYPE, mti, fid, dtime,out isend); //if (isend == false) return false; #endregion foreach (int CorrTaskindex in corrinfo.Keys) { #region 双叉任务在此验证,是否为双叉极限货位,双极限货位使用双叉倒库货位修改任务 //把倒库货位作为取货和送货动作的目标货位,增加取货和送货动作对于倒库货位的逻辑有物的提前检测 //报告倒库货位完成时,追加倒库货位---》需要换叉的极限货位的取货和送货任务 #region 检查关联任务 string ChangeForkCell1 = ccf.IfLimitCellChangeFork(CorrTaskindex, devinfo.DeviceIndex); #endregion if (ChangeForkCell1 != "-") //关联任务需要倒换货叉 { ccf.ChangeEndCellCode(CorrTaskindex, ChangeForkCell1, devinfo.DeviceIndex); return false;//20140423richard如果不返回false,还会使用原来的坐标继续发送 } #endregion } //判断堆垛机上是否载货 #region 20170110判断堆垛机上是否载货 if (devinfo.SplitByte_0 == 1 || devinfo.SplitByte_1 == 1) { string msg = string.Format("执行双叉入库任务时,堆垛机{0}上有货,不能执行双叉入库", devinfo.DeviceIndex); AheadDetectUnallow.Append(msg); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } #endregion #endregion } } #endregion #region 双叉AGV的入库取货任务在此判断是否关联双叉、验证双叉任务是否为双叉极限货位 if ((devinfo.DeviceKind == 6) && (devinfo.IfCorrelDoubleFork == "1") && (ccf.GetDeviceOrderFromMonitor(minMidx) ==2) && ((CONTROLTASKTYPE == 1)||(CONTROLTASKTYPE == 4))) { Dictionary corrinfo = Model.CGeneralFunction.GetDoubleForkMonitorInfo(minMidx, devinfo.DeviceIndex); if (corrinfo == null) { #region 双叉对等站台的单任务在此等待关联,双叉极限货位不关联 if (GetIOControlStatus(TaskIdx) != Model.CGeneralFunction.TASKSINGLEFORKRUN) {//没强制单叉执行 //查找关联站台 int agvCorrel = GetAGVCorrelIndex(TaskIdx); if (agvCorrel != -1) { //查找本地管理任务做多叉关联配对,关联任务分配货叉 int mfid = GetAGVEnableDoubleForkManageTask(CONTROLTASKTYPE, agvCorrel, devinfo.DeviceIndex); if (mfid > 0) { #region 双叉同为前极限后者后极限不关联,单独执行 if ((IfInSameLimitX(fid, mfid, mti) == true) && (mti == 1)) { sql.Remove(0, sql.Length); sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(fid).Append(")"); dboM.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(mfid).Append(")"); dboM.ExecuteSql(sql.ToString()); return true; } #endregion sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(mfid).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(fid); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(fid).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(mfid); dbo.ExecuteSql(sql.ToString()); return true; } else { //20110505 AheadDetectUnallow.Append("双叉AGV在双叉校表站台取货" + ",等待多叉关联站台"+agvCorrel.ToString()+"的任务!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } else return true ; } else {//管理强制执行单叉任务 return true; } #endregion } } #endregion #region 双叉AGV的出库口输送机取货任务在此判断是否关联双叉20110412 if ((devinfo.DeviceKind == 6) && (devinfo.IfCorrelDoubleFork == "1") && ((ccf.GetDeviceOrderFromMonitor(minMidx) == 2) || (ccf.GetDeviceOrderFromMonitor(minMidx) == 4)) && (CONTROLTASKTYPE == 2)) { Dictionary corrinfo = Model.CGeneralFunction.GetDoubleForkMonitorInfo(minMidx, devinfo.DeviceIndex); if (corrinfo == null) { #region 双叉对等站台的单任务在此等待关联,双叉极限货位不关联 if (GetIOControlStatus(TaskIdx)!= Model.CGeneralFunction.TASKSINGLEFORKRUN)//20110429测试应该为GetIOControlStatus(TaskIdx)!= {//没强制单叉执行 //查找关联站台 int agvCorrel = GetAGVCorrelConveyorIndex(TaskIdx); if (agvCorrel != -1) { #region 查找队列中是否有agvCorrel的任务:如果没有,不再等待,单叉执行; if (GetAGVEnableDoubleForkManageTask(2, agvCorrel, devinfo.DeviceIndex) <= 0)//没有能关联的任务,不再等待,单叉执行 { sql.Remove(0, sql.Length); sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(fid).Append(")"); dboM.ExecuteSql(sql.ToString()); return true; } #endregion #region 20110412有能关联的任务,判断agvCorrel是否有物而且任务已经到取货状态 int[] cstates = CStaticClass.GetDeviceState(agvCorrel); int cssstate = -1; if (cstates != null) { cssstate = cstates[1]; } if ((cssstate!=0) || (CStaticClass.GetDevicePhotoelectric(agvCorrel - 2, 0) != 1) || (CStaticClass.GetDevicePhotoelectric(agvCorrel, 2) != 1))//20110412顶升机空闲、有货、低位 { //20110505 AheadDetectUnallow.Append("双叉AGV在双叉校表站台取货" + ",等待多叉关联站台" + agvCorrel.ToString() + "的任务!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } #endregion //查找本地管理任务做双叉在输送机取货任务关联配对,关联任务分配货叉 int mfid = GetAGVFromConveyorDoubleForkGetGoodManageTask(2, agvCorrel, devinfo.DeviceIndex); if (mfid > 0) { #region 终点不相同,单叉分别执行 if (IFHaveSameEndDevice(fid, mfid, mti) == false) { sql.Remove(0, sql.Length); sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(fid).Append(")"); dboM.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(mfid).Append(")"); dboM.ExecuteSql(sql.ToString()); return true; } #endregion #region 双叉同为前极限后者后极限不关联,单独执行 //if ((IfInSameLimitX(fid, mfid, mti) == true) && (mti == 1)) //{ // sql.Remove(0, sql.Length); // sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(fid).Append(")"); // dboM.ExecuteSql(sql.ToString()); // sql.Remove(0, sql.Length); // sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(mfid).Append(")"); // dboM.ExecuteSql(sql.ToString()); // return true; //} #endregion sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(mfid).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(fid); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(fid).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(mfid); dbo.ExecuteSql(sql.ToString()); return true; } else { //20110505 AheadDetectUnallow.Append("双叉AGV在输送机取货" + ",没找到多叉关联任务,关联站台"+agvCorrel.ToString()+"有异常物体遮挡开关!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } else return true; } else {//管理强制执行单叉任务 return true; } #endregion } } #endregion #region 弯道堆垛机需要优化处理 //if (devinfo.DeviceKind == 1 ) //{ // //先判断是否是弯道堆垛机 // //获得堆垛机当前所在的巷道 // int lanecount = ccf.GetLaneCountsStackIn(DeviceIdx); // if (lanecount>1)//堆垛机对应多个巷道 // { // int curlane = devinfo.ZCoor;//当前所在排Z,可能是1,2,3 ;3代表在弯道 // if (curlane<3)//在弯道时不予判读 // { // int stack =Convert.ToInt32( DeviceIdx.ToString().Substring(2));//01(1101),001(11001) // //先获得堆垛机编号,设备号的后两位M,计算出所在的巷道号:M+Z // int lane; //得到堆垛机当前所在的巷道号:1,2,3,4 // if (curlane % 2 == 0) // { // lane = curlane* stack; // } // else // { // lane =1+ (stack-1)*2; // } // int tasklane = ccf.GetLaneByTask(minMidx,order);//当前任务所在巷道 // if (lane != tasklane)//当堆垛机所在巷道和任务所在巷道不同时 // { // if (order == 4)// // { // //查看是否存在所在巷道的任务 // bool havelanetask = ccf.IfExistTaskInLane(lane); // if (havelanetask) // { // AheadDetectUnallow.Append(string.Format("{0}巷道还有任务未执行完! ", lane));//小于安全距离 // //AheadDetectUnallow.Append(DeviceIdx.ToString() + "还有巷道" + lane.ToString() + "的任务没有执行完"); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false; // } // } // //else // //if (order == 3||order == 5)//送货任务禁止夸hang'dao // //{ // // if (devinfo.SplitByte_0==1) // // { // // AheadDetectUnallow.Append(string.Format("禁止载货经过弯道! "));//小于安全距离 // // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // // return false; // // } // //} // } // //获取任务所在巷道 // //判读是否存在当前所在巷道的任务 // } // } //} #endregion return true; } catch (Exception ex) { string mes = string.Format("发送指令:{0}提前检测:{1}时发生错误:{2}{3}", minMidx, _AheadDetect, ex.StackTrace , ex.Message); RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", mes); OnRefreshMonitor(rme); return false; } finally { dv.Dispose(); dvdv.Dispose(); preMadeT.Dispose(); } } private bool IFExitTopPriDeviceIdxTaskWait(int DeviceIdx) { sql.Clear(); DataView dv0 = new DataView(); DataView dv = new DataView(); try { sql.Append(string.Format("SELECT F_ManageTaskIndex, F_ManageTASKKINDINDEX FROM T_Monitor_Task WHERE (F_DeviceIndex = {0})", DeviceIdx)); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { sql.Clear(); if (CStaticClass.DBFactory == "OracleDBFactory") {//20151120调度系统oracle的特殊语句 sql.Append(string.Format("SELECT F_DeviceIndex,F_Status FROM T_Monitor_Task WHERE rownum=1 and (F_ManageTASKKINDINDEX = {0}) and F_ManageTaskIndex={1} order by F_MonitorIndex asc", Convert.ToInt32(dv[i]["F_ManageTASKKINDINDEX"]), Convert.ToInt32(dv[i]["F_ManageTASKINDEX"]))); } else { sql.Append(string.Format("SELECT top 1 F_DeviceIndex,F_Status FROM T_Monitor_Task WHERE (F_ManageTASKKINDINDEX = {0}) and F_ManageTaskIndex={1} order by F_MonitorIndex asc", Convert.ToInt32(dv[i]["F_ManageTASKKINDINDEX"]), Convert.ToInt32(dv[i]["F_ManageTASKINDEX"]))); } dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20151120调度系统oracle的特殊语句 if (dv0.Count > 0) { if ((dv0[0]["F_DeviceIndex"].ToString() == DeviceIdx.ToString()) && (dv0[0]["F_Status"].ToString() == "0")) { return true; } } } return false; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dv0.Dispose(); } } private int GetBarcodeCoor(int xcoor, int zcoor,int vStack) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT BarcodeCoor FROM T_Base_BarcodeCoor WHERE (XCoor = {0}) AND (ZCoor = {1}) and (VirtualStack={2})", xcoor, zcoor,vStack)).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][0]); } else { dv = dbo.ExceSQL(string.Format("SELECT BarcodeCoor FROM T_Base_BarcodeCoor WHERE (XCoor = {0}) and (VirtualStack={1})", xcoor, vStack)).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][0]); } else { return 0; } } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 获得发送信息 /// /// 设备指令索引 public bool GetSendInfo(int minMidx) { DataView dvD = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceKindIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4," ).Append( "F_NumParam5,F_NumParam6,F_TxtParam,F_AheadDetect,F_ManTaskReserve,F_LockedState," ).Append( "F_Associate,F_SerialNumber,F_RouteID,F_DeviceIndex,F_DeviceCommandIndex," ).Append( "F_MonitorIndex,F_ManageTaskIndex,F_ManageTaskKindIndex,F_OutsideAltDevice," ).Append( "F_InsideAltDevice,F_StartDevice,F_EndDevice,F_RouteKind,F_UseAwayFork,F_AgvNo " ).Append( " FROM V_Monitor_Route_Device where F_MonitorIndex=" ).Append( minMidx); dvD = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvD.Count > 0) { if (dvD[0]["F_AheadDetect"] != DBNull.Value) { _AheadDetect = dvD[0]["F_AheadDetect"].ToString(); } else { _AheadDetect = ""; } if (dvD[0]["F_ManTaskReserve"] != DBNull.Value) { _ManTaskReserve = Convert.ToInt32(dvD[0]["F_ManTaskReserve"]); } else { _ManTaskReserve = 0; } if (dvD[0]["F_Associate"] != DBNull.Value) { _Associate = Convert.ToInt32(dvD[0]["F_Associate"]); } else { _Associate = 0; } if (dvD[0]["F_LockedState"] != DBNull.Value) { _LockedState = Convert.ToInt32(dvD[0]["F_LockedState"]); } else { _LockedState = 0; } if (dvD[0]["F_NumParam1"] != DBNull.Value) { _NumParam1 = Convert.ToInt32(dvD[0]["F_NumParam1"]); } else { _NumParam1 = 0; } if (dvD[0]["F_NumParam2"] != DBNull.Value) { _NumParam2 = Convert.ToInt32(dvD[0]["F_NumParam2"]); } else { _NumParam2 = 0; } if (dvD[0]["F_NumParam3"] != DBNull.Value) { _NumParam3 = Convert.ToInt32(dvD[0]["F_NumParam3"]); } else { _NumParam3 = 0; } if (dvD[0]["F_NumParam4"] != DBNull.Value) { _NumParam4 = Convert.ToInt32(dvD[0]["F_NumParam4"]); } else { _NumParam4 = 0; } if (dvD[0]["F_NumParam5"] != DBNull.Value) { _NumParam5 = Convert.ToInt32(dvD[0]["F_NumParam5"]); } else { _NumParam5 = 0; } if (dvD[0]["F_NumParam6"] != DBNull.Value) { _NumParam6 = Convert.ToInt32(dvD[0]["F_NumParam6"]); } else { _NumParam6 = 0; } if (dvD[0]["F_TxtParam"] != DBNull.Value) { _TxtParam = dvD[0]["F_TxtParam"].ToString(); } else { _TxtParam = "-"; } _serialNumber = Convert.ToInt32(dvD[0]["F_SerialNumber"]); _routeID = Convert.ToInt32(dvD[0]["F_RouteID"]); _DeviceIdx = Convert.ToInt32(dvD[0]["F_DeviceIndex"]); _DeviceOrder = Convert.ToInt32(dvD[0]["F_DeviceCommandIndex"]); _ManageKindIdx = Convert.ToInt32(dvD[0]["F_ManageTaskKindIndex"]); _ManageTaskIdx = Convert.ToInt32(dvD[0]["F_ManageTaskIndex"]); _DeviceKind = Convert.ToInt32(dvD[0]["F_DeviceKindIndex"]); if (dvD[0]["F_OutsideAltDevice"] != DBNull.Value) { _OutsideAltDevice = Convert.ToInt32(dvD[0]["F_OutsideAltDevice"]); } else { _OutsideAltDevice = 0; } if (dvD[0]["F_InsideAltDevice"] != DBNull.Value) { _InsideAltDevice = Convert.ToInt32(dvD[0]["F_InsideAltDevice"]); } else { _InsideAltDevice = 0; } _StartDevice = Convert.ToInt32(dvD[0]["F_StartDevice"]); _EndDevice = Convert.ToInt32(dvD[0]["F_EndDevice"]); _RouteKind = Convert.ToInt32(dvD[0]["F_RouteKind"]); if (dvD[0]["F_AgvNo"] != DBNull.Value) { _AgvNo = Convert.ToInt32(dvD[0]["F_AgvNo"]); } else { _AgvNo = 65535; } return true; } else {//20120420 CControlError = string.Format("发送命令调用GetSendInfo时:路径表里【{0}】设备索引不存在!", GetDeviceFromMonitor(minMidx).ToString()); return false; } } catch (Exception ex) { throw ex; } finally { dvD.Dispose(); } } /// /// 发送指定调度任务号的命令 /// /// /// public bool SendMonitorTask(int MonitorIndex) { //return false; try { lock (thisLock) { char[] sep = new char[1] { '-' }; int msgIdx = 0;//消息编号 bool sendok; #region 多叉关联设备指令,如果不能同步执行,发送距离堆垛机当前位置近的设备指令 // 对于堆垛机 不同步返回的是距离堆垛机最近的任务号 对于输送线返回的是最小的任务号 MonitorIndex = GetDoubleForkMinRouteTask(MonitorIndex); if (MonitorIndex == -1) { return false; } #endregion //2220173-时代吉利 该路径了 Route_device表里面没这个设备发不下去 要是把设备加进去路径表 设备报警就会影响当前路径 //if (ccf.GetChangeRouteFlgFromMonitor(MonitorIndex) != 1) //{ // 获得要发送的信息 对应路径设备的发送信息,如果做路径替换时候,路径表中不存在替换的路径的设备 增加中间设备把相关的替换设备都写在小路径表 则无法查到信息 if (GetSendInfo(MonitorIndex) == false) { return false; } //} int deviceIdx = _DeviceIdx; int deviceKind = _DeviceKind; int deviceOrder = _DeviceOrder; int manageKindIdx = ccf.GetManageTaskKindIndexFromMonitor(MonitorIndex); int manageTaskIdx = ccf.GetManageTaskIndexfromMonitor(MonitorIndex); devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx); if (((deviceKind == 1 && (devinfo.XCoor == 0) && (devinfo.YCoor == 0)) || (deviceKind == 4) && (devinfo.XCoor == 0) && (devinfo.YCoor == 0)) && (devinfo.VirtualStack != deviceIdx))//20130510 { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "的光通讯被遮挡,或者没上电!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; }//ceshi if (ccf.GetManageTaskKindIndexFromMonitor(MonitorIndex) == 4) { #region 手工任务 string ah = "I" + deviceIdx.ToString(); if ((deviceKind != 1) && ((deviceKind != 4))) { ah = ""; } if (AheadDetectOK(MonitorIndex, ah,"NO") == false) //不符合运行条件ccf.GetBeDetectedDevices(_DeviceIdx)) { return false; } //CStaticClass.MessageIndex++; CStaticClass.MessageIndex = 1; msgIdx = (CStaticClass.MessageIndex); sdo = CommModeCreate.CreateSendDeviceOrder(deviceIdx); int[] gc = new int[6] { _NumParam2, _NumParam3, _NumParam1, _NumParam5, _NumParam6, _NumParam4 }; if ((deviceKind == 1) || (deviceKind == 6)) { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[0], gc[1], gc[2], gc[3], gc[4], gc[5]); } else if (deviceKind == 4) { if (ccf.NeedOptimize(deviceIdx) == true) { ccf.InsertMonitorOptimizeChildTask(MonitorIndex); sendok = true; } else { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[2]); } } else { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[5]); } if (sendok == false) { if (sdo.CommLayerError != null) { RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", sdo.CommLayerError); OnRefreshMonitor(rmea); } return false; } else { // add for CATL YB2 输送线和堆垛机能不能同步发送 ccf.SendOrderSuccess(manageKindIdx, manageTaskIdx, MonitorIndex, deviceIdx, _routeID,0); #region 多叉关联任务,能同步的同时报告发送命令成功 //20100323 devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx); if (devinfo.IfCorrelDoubleFork == "1") { int[] mforkMoninfo=Model.CGeneralFunction.MutiForkIfSync(MonitorIndex,deviceIdx, deviceKind); if (mforkMoninfo!=null) { Dictionary corr = Model.CGeneralFunction.GetDoubleForkMonitorInfo(MonitorIndex, deviceIdx); for (int i = 0; i < mforkMoninfo.GetLength(0); i++) { ccf.SendOrderSuccess(ccf.GetManageTaskKindIndexFromMonitor(mforkMoninfo[i]), ccf.GetManageTaskIndexfromMonitor(mforkMoninfo[i]), mforkMoninfo[i], Convert.ToInt32(corr[mforkMoninfo[i]][2]), Convert.ToInt32(corr[mforkMoninfo[i]][3]),1); } } } #endregion return true; } #endregion } #region 自动命令(taskkind == 1,2) //(taskkind == 1,2)自动命令和临时管理管理命令 //2:提取每个管理单据的第一个设备状态 if (GetFirstDeviceIFLocked(MonitorIndex, true) == false)//没有被锁定,空闲 { devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx); CStaticClass.MessageIndex = 1; msgIdx = (CStaticClass.MessageIndex); sdo = CommModeCreate.CreateSendDeviceOrder(deviceIdx); //判断设备是否为堆垛机RGV和AGV int[] gc = new int[6] { _NumParam2, _NumParam3, _NumParam1, _NumParam5, _NumParam6, _NumParam4 };//获得坐标 if (gc == null) { this.CControlError += string.Format("发送命令时不能取得设备坐标!"); return false; } if ((deviceKind == 1) || (deviceKind == 6)) { //1:堆垛机;4:RGV;6:AGV如果需要优化调度(设备表的F_NeedOptimize='1') //直接写入表:T_Monitor_Task_Child,不发送命令 if (ccf.NeedOptimize(deviceIdx) == true) { ccf.InsertMonitorOptimizeChildTask(MonitorIndex); sendok = true; } else { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[0], gc[1], gc[2], gc[3], gc[4], gc[5]); } } else if (_DeviceKind == 4) { if (ccf.NeedOptimize(deviceIdx) == true) { ccf.InsertMonitorOptimizeChildTask(MonitorIndex); sendok = true; } else { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[2]); } } else if (_DeviceKind == 7) { int ControlType = ccf.GetFCONTROLTASKTYPEFromManageTask(_ManageKindIdx, _ManageTaskIdx); #region 条码设备直接比对 DataView dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex FROM T_Base_PLC_Ask ,T_Monitor_Task WHERE T_Base_PLC_Ask.F_DeviceIndex = T_Monitor_Task.F_DeviceIndex AND T_Base_PLC_Ask.F_BarCode = T_Monitor_Task.F_TxtParam and (T_Monitor_Task.F_MonitorIndex = {0})", MonitorIndex)).Tables[0].DefaultView; if ((dv.Count > 0) || (ControlType != 1)) {//比对正确 object[] obj = new object[3] { _ManageKindIdx, _ManageTaskIdx, Model.CGeneralFunction.TASKABEND }; dbo.ExecuteSql(string.Format("UPDATE T_Manage_Task SET FExceptionNO=NULL WHERE (F_ManageTaskKindIndex ={0}) AND (FID ={1}) and FExceptionNO={2}", obj)); Model.CGeneralFunction.ActionComplete(deviceIdx, MonitorIndex, 0); } else {//比对错误,改道异常处理口 //修改目标位置至异常口 dv = dbo.ExceSQL(string.Format("SELECT F_Remark,F_BindingDevice,F_BarCode FROM T_Base_PLC_Ask WHERE T_Base_PLC_Ask.F_DeviceIndex = {0}", deviceIdx)).Tables[0].DefaultView; if (dv.Count > 0) { if ((CStaticClass.DeviceErrorAutoModifyRoutePath == "1") && (dv[0]["F_BarCode"].ToString().IndexOf("11111") < 0)) { object[] obj = new object[5] { _ManageKindIdx, _ManageTaskIdx, Convert.ToInt32(dv[0]["F_Remark"]), Model.CGeneralFunction.TASKABEND, Convert.ToInt32(dv[0]["F_BindingDevice"]) }; dbo.ExecuteSql(string.Format("UPDATE T_Manage_Task SET FExceptionNO={3},FSTARTDEVICE ={4}, FSTARTCELL ='-',FENDDEVICE ={2}, FENDCELL ='-', FENDUCODE =0 WHERE (F_ManageTaskKindIndex ={0}) AND (FID ={1})", obj)); ccf.GetUseableRouteIDSubAndModifyRoute(_ManageTaskIdx, _ManageKindIdx, Convert.ToInt32(dv[0]["F_BindingDevice"])); } else { Model.MError me; if (dv[0]["F_BarCode"].ToString() == "-")//扫描器未读条码 { me = null; Model.CGeneralFunction.ActionComplete(deviceIdx, MonitorIndex, 0); //me = Model.CGetInfo.GetErrorInfo(732); //dbo.ExecuteSql(string.Format("update T_Monitor_Task set F_Status=32 WHERE (T_Monitor_Task.F_MonitorIndex = {0})", MonitorIndex)); } else if (dv[0]["F_BarCode"].ToString().IndexOf("11111") >= 0) {//"1111111111"条码未读到 object[] obj = new object[3] { _ManageKindIdx, _ManageTaskIdx, Model.CGeneralFunction.TASKABEND }; dbo.ExecuteSql(string.Format("UPDATE T_Manage_Task SET FExceptionNO={2} WHERE (F_ManageTaskKindIndex ={0}) AND (FID ={1})", obj)); Model.CGeneralFunction.ActionComplete(deviceIdx, MonitorIndex, 0); //dbo.ExecuteSql(string.Format("update T_Monitor_Task set F_Status=30 WHERE (T_Monitor_Task.F_MonitorIndex = {0})", MonitorIndex)); me = Model.CGetInfo.GetErrorInfo(730); } else {//条码不正确 object[] obj = new object[3] { _ManageKindIdx, _ManageTaskIdx, Model.CGeneralFunction.TASKABEND }; dbo.ExecuteSql(string.Format("UPDATE T_Manage_Task SET FExceptionNO={2} WHERE (F_ManageTaskKindIndex ={0}) AND (FID ={1})", obj)); Model.CGeneralFunction.ActionComplete(deviceIdx, MonitorIndex, 0); // dbo.ExecuteSql(string.Format("update T_Monitor_Task set F_Status=31 WHERE (T_Monitor_Task.F_MonitorIndex = {0})", MonitorIndex)); me = Model.CGetInfo.GetErrorInfo(731); } if (me != null) { RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("notifyIcon1", "警告:" + devinfo.DeviceName + "," + deviceIdx + "发生故障:" + me.ErrorName); OnRefreshMonitor(rmea); } } if (_ManageKindIdx == 1) { sql.Remove(0, sql.Length); sql.Append("update IO_Control set ERROR_TEXT='").Append(devinfo.DeviceName).Append(",").Append(deviceIdx).Append("条码不正确!").Append("' where CONTROL_ID=").Append(manageTaskIdx); dboM.ExceSQL(sql.ToString()); } } } //20130709 dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_BarCode = '-' WHERE (F_DeviceIndex = {0}) ", deviceIdx)); #endregion return true; } else if (_DeviceKind == 8) { #region 称重 //20130510在订阅处理称重任务和重量 ////DataView dv = dbo.ExceSQL(string.Format("SELECT F_BoxBarcode FROM T_Base_PLC_Ask WHERE F_BoxBarcode<>'0' and T_Base_PLC_Ask.F_DeviceIndex = {0}", deviceIdx)).Tables[0].DefaultView; ////if (dv.Count > 0) ////{ //// //向管理写入重量 //// dboM.ExecuteSql(string.Format("UPDATE IO_CONTROL SET CONTROL_REMARK ={0} WHERE CONTROL_ID={1}", dv[0][0].ToString(), manageTaskIdx)); //// Model.CGeneralFunction.ActionComplete(deviceIdx, MonitorIndex, 0); //// dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_BoxBarcode = '0' WHERE (F_DeviceIndex = {0})", deviceIdx)); ////} #endregion //return true; sendok = true; } else { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[5]); } #region 发送任务前判断是不是关联任务(是关联任务判断关联任务能否发送) CATL YB2 //自动任务判断发送成功与否 if (sendok == false) { if (sdo.CommLayerError != null) { RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", sdo.CommLayerError); OnRefreshMonitor(rmea); } return false; } else//发送命令成功 { // 发送后修改发送标志 sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_SendFlag='1' where F_MonitorIndex=").Append(MonitorIndex); dbo.ExecuteSql(sql.ToString());//20100905只重发主任务 ccf.SendOrderSuccess(manageKindIdx, manageTaskIdx, MonitorIndex, deviceIdx, _routeID, 0); #region 多叉关联任务,能同步的同时报告发送命令成功 // add for CATL 判断多叉关联任务是不是同时发送 更新状态 devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx); // 数据库需要把入出库双顶升站台配置 IfCorrelDoubleFork =1 if (devinfo.IfCorrelDoubleFork == "1") { int[] corrtask = Model.CGeneralFunction.MutiForkIfSync(MonitorIndex, deviceIdx, deviceKind); if (corrtask != null) { // 利用循环判断出关联的两个任务的小任务号 int rfid = 0, rmankind = 0, rdev = 0; for (int i = 0; i < corrtask.GetLength(0); i++) { rfid = ccf.GetManageTaskIndexfromMonitor(corrtask[i]); rmankind = ccf.GetManageTaskKindIndexFromMonitor(corrtask[i]); // 返回当前小任务的设备号 rdev = ccf.GetDeviceindexFromMonitor(corrtask[i]); ccf.SendOrderSuccess(rmankind, rfid, corrtask[i], rdev, 0, 1); } } } #endregion return true; } #endregion } else { return false; } #endregion } } catch (Exception ex) {//20110608 CControlError = string.Format( "发送命令调用SendMonitorTask时:{0}" ,ex.StackTrace+ ex.Message); return false; } } int GetDeviceFromMonitor(int monitorIndex) { DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex, F_DeviceIndex 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]["F_DeviceIndex"]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 获取可用的目标位置:入库的巷道或者出库站台 /// /// 调度任务索引 /// 调度任务类别 /// bool GetUsableDestination(int manageTaskIdx,int manageKindIdx ) { //20100610查找一个路径可用,任务数最少的终点设备 Dictionary advDev=new Dictionary(); object ob; DataView dv = new DataView(); DataRowView dr = null ; DataView dvIO = new DataView(); DataTable dtd = new DataTable(); DataTable dt = new DataTable(); try { sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE (FID = ").Append(manageTaskIdx).Append(") AND (F_ManageTaskKindIndex = ").Append(manageKindIdx).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count <= 0) { return false; } dr = dv[0]; //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) { //只修申请改调度任务的路径,不修改调度自动任务路径 if (dr["F_ManageTaskKindIndex"].ToString() != "1") return false; string adviceDev = ""; 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(); return false; } 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)"); 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 break; } } if (advDev.Count == 0)//20100610 { return false; } else {//20100610 int mincount = 9999; foreach (int aaa in advDev.Keys) { if (advDev[aaa] < mincount) { mincount = advDev[aaa]; adviceDev = aaa.ToString(); } } if (adviceDev == "") { return false; } } } else {//20100610 return false; } } 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"]).Append(""); 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"]).Append(",2,'").Append(dr["FENDWAREHOUSE"]).Append("','").Append(dr["FPALLETBARCODE"]).Append("','").Append(adviceDev).Append("',0,'").Append(dtime).Append("',null)"); dboM.ExceSQL(sql.ToString()); dboM.TransCommit(); //把ManageTaskIdx,ManageKindIdx 的调度任务全部申请改道 sql.Remove(0, sql.Length); sql.Append("UPDATE T_Monitor_Task SET F_Status = 3 WHERE (F_ManageTaskIndex = ").Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX =").Append(manageKindIdx).Append(")"); dbo.ExceSQL(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("CControl.GetUsableDestination", "堆垛机入库目标位置发生改道", "管理任务:" + manageKindIdx.ToString() + "-" + manageTaskIdx.ToString(), "条码:" + dr["FPALLETBARCODE"].ToString().ToUpper()); return true; } catch (Exception ex) { CControlError = string.Format("发送指令,申请改道时:{0}", ex.StackTrace+ex.Message); dboM.TransRollback(); return false; } } else { return false; } } catch (Exception ex) { throw ex; } finally { dt.Dispose(); dtd.Dispose(); dv.Dispose(); dvIO.Dispose(); dr=null ; } } bool GetRGVIdleDestination(int manageTaskIdx, int manageKindIdx,int RGVGateDevice, bool IfUseNegativeDevice) { //20100610 t_Base_device 表F_UsableEndDevice字段存放入库或者出库对等的设备索引组(以分号隔开): //负数代表位于当前设备前面(环形RGV行走方向的反方向),只允许在发送RGV取货和第一、二个运动时使用; //正数代表当前设备后面的设备,可以在发送送货和之前的所有命令使用.直道RGV都是正数。 //T_Base_RGV_Gate新增字段“F_EndDevice”用于记载入库时靠近巷道一侧的RGV出入口输送机的对应的巷道设备索引 //或者出库时靠近出库站台一侧的输送机对应的出库站台索引 //可变更目标位置的选择原则:RGV目标位置空闲、无物;目标位置参与的正在执行的调度任务数最少 DataView dv = new DataView(); DataRowView dr = null ; string adviceDev = ""; char[] cc = new char[1] { ';' }; string[] sp; DataView dvIO = new DataView(); Dictionary advDev=new Dictionary(); object ob; DataView dvu = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT * FROM T_Manage_Task WHERE (FID = " ).Append( manageTaskIdx ).Append( ") AND (F_ManageTaskKindIndex = " ).Append( manageKindIdx ).Append( ")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count <= 0) { return false; } dr = dv[0]; //只修申请改调度任务的路径,不修改调度自动任务路径 if (dr["F_ManageTaskKindIndex"].ToString() != "1") return false; 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.TASKCANCEL ).Append( ") or(CONTROL_STATUS=" ).Append( Model.CGeneralFunction.TASKALTERROUTEREPLY ).Append( "))"); dvIO = dboM.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvIO.Count <= 0) { #region 根据T_Base_Device表的F_UsableEndDevice查找可用终点设备 sql.Remove(0, sql.Length); sql.Append("select F_UsableEndDevice from T_Base_Device where F_UsableEndDevice is not null and F_DeviceIndex=" ).Append( RGVGateDevice ).Append( ""); dvu = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvu.Count > 0) { int enddv = 0, DESTINATION = 0; sp = dvu[0]["F_UsableEndDevice"].ToString().Split(cc); for (int i = sp.GetLowerBound(0); i <= sp.GetUpperBound(0); i++) { if (int.TryParse(sp[i], out enddv) == false) continue; enddv = Convert.ToInt32(sp[i]); if (enddv < 0) { //负数代表当前设备前面的设备(环形RGV行走方向的反方向) if (IfUseNegativeDevice == true) { enddv = -(enddv); } else { continue; } } devinfo = Model.CGetInfo.GetDeviceInfo(enddv); if ((devinfo.HaveGoods == true)||(devinfo.RunState==2)) {//目标位置被占用或者故障 continue; } sql.Remove(0, sql.Length); sql.Append("SELECT F_EndDevice FROM T_Base_RGV_Gate WHERE (F_RGVGateDeviceIndex = " ).Append( enddv ).Append( ") AND (F_EndDevice IS NOT NULL)"); ob = dbo.GetSingle(sql.ToString()); if (ob == null) continue; DESTINATION = Convert.ToInt32(ob); if (CDisassembleTask.MinRouteID(Convert.ToInt32(dr["FSTARTDEVICE"]), DESTINATION, dr["FUseAwayFork"]) != -1) { //20100609统计到终点设备正在执行的任务数 sql.Remove(0, sql.Length); sql.Append("SELECT count(FENDDEVICE) as counts FROM T_Manage_Task where FENDDEVICE='" ).Append( DESTINATION ).Append( "' and fstatus>0"); ob = dbo.GetSingle(sql.ToString()); advDev.Add(DESTINATION, Convert.ToInt32(ob)); } } } else { return false; } if (advDev.Count<=0) { return false; } else { int mincount = 9999; foreach (int aaa in advDev.Keys) { if (advDev[aaa] < mincount) { mincount = advDev[aaa]; adviceDev = aaa.ToString(); } } if (adviceDev == "") { return false; } } #endregion //20101108int fid = dboM.GetManageTableIndex("IO_CONTROL_APPLY"); string dtime = DateTime.Now.ToString("u"); dtime = dtime.Substring(0, dtime.Length - 1); 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"] ).Append( " and CONTROL_STATUS<>" ).Append( Model.CGeneralFunction.TASKCANCEL ).Append( ""); 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, WAREHOUSE_CODE, STOCK_BARCODE, DEVICE_CODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK)").Append( "VALUES (" ).Append(appid).Append(",").Append( dr["FID"] ).Append( ",'" ).Append( dr["FENDWAREHOUSE"] ).Append( "','" ).Append( dr["FPALLETBARCODE"] ).Append( "','" ).Append( adviceDev ).Append( "',0,'" ).Append( dtime ).Append( "',null)"); dboM.ExceSQL(sql.ToString()); dboM.TransCommit(); //把ManageTaskIdx,ManageKindIdx 的调度任务全部申请改道 sql.Remove(0, sql.Length); sql.Append("UPDATE T_Monitor_Task SET F_Status = 3 WHERE (F_ManageTaskIndex = " ).Append( manageTaskIdx ).Append( ") AND (F_ManageTASKKINDINDEX =" ).Append( manageKindIdx ).Append( ")"); dbo.ExceSQL(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("CControl.GetRGVIdleDestination", "穿梭车目标位置发生改道", "管理任务:"+ manageKindIdx.ToString() + "-" + manageTaskIdx.ToString(), "条码:" + dr["FPALLETBARCODE"].ToString().ToUpper()); return true; } catch (Exception ex) { dboM.TransRollback(); CControlError = string.Format( "发送指令,申请改道时:{0}", ex.StackTrace+ex.Message); return false; } } else { return false; } } catch (Exception ex) { CControlError = string.Format("发送指令,申请改道时:{0}" , ex.StackTrace+ex.Message); return false; } finally { dv.Dispose(); dr = null; cc = null; sp = null; dvIO.Dispose(); dvu.Dispose(); } } /// /// 返回在顶升处入库任务可以多叉关联的调度任务索引 /// /// 控制任务类型 /// 设备索引 /// int GetEnableDoubleForkManageTask(int controlTaskType, int devindex,int FID) { DataView dv0 = new DataView(); DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex,T_Monitor_Task.F_ManageTaskIndex,T_Monitor_Task.F_ManageTASKKINDINDEX FROM T_Monitor_Task ,T_Manage_Task where T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID AND T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex AND F_DeviceIndex=").Append(devindex).Append(" and FCONTROLTASKTYPE=").Append(controlTaskType); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { for (int i = 0; i < dv.Count; i++) { sql.Remove(0, sql.Length); sql.Append("select min(F_MonitorIndex) as mm from T_Monitor_Task where F_ManageTaskIndex=").Append(dv[i]["F_ManageTaskIndex"]).Append(" and F_ManageTASKKINDINDEX=").Append(dv[i]["F_ManageTASKKINDINDEX"]); dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count > 0) { if (dv0[0]["mm"].ToString() == dv[i]["F_MonitorIndex"].ToString()) { if (FID != Convert.ToInt32(dv[i]["F_ManageTaskIndex"])) { return Convert.ToInt32(dv[i]["F_ManageTaskIndex"]); } } } } return -1; } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dv0.Dispose(); } } /// /// 获得堆垛机在对等站台取货的多叉关联任务 /// /// 控制任务类型 /// 堆垛机设备索引 /// 站台设备索引 /// 调度任务索引 /// int GetEnableDoubleForkManageTask(int controlTaskType, int Stackdevindex,int StationDevice, int FID) { DataView dv1 = new DataView(); DataView dv0 = new DataView(); DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_ZXY FROM T_Base_Lane_Gate,T_Base_LaneInfo WHERE ").Append( "(T_Base_Lane_Gate.F_LaneIndex = T_Base_LaneInfo.F_LaneDeviceIndex) and (T_Base_LaneInfo.F_StackIndex = ").Append( Stackdevindex).Append(") and (F_LaneGateDeviceIndex=").Append(StationDevice).Append(")"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count <= 0) return -1; char[] cc = new char[1] { '-' }; string[] zxy = dv1[0]["F_ZXY"].ToString().Split(cc); sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex,T_Monitor_Task.F_ManageTaskIndex,T_Monitor_Task.F_ManageTASKKINDINDEX ").Append( " FROM T_Monitor_Task ,T_Manage_Task where T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID AND ").Append( "T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex AND F_DeviceIndex=").Append( Stackdevindex).Append(" and FCONTROLTASKTYPE=").Append(controlTaskType).Append(" and F_NumParam1=").Append(zxy[0]).Append( " and F_NumParam2=").Append(zxy[1]).Append(" and F_NumParam3=").Append(zxy[2]).Append(" and F_RELATIVECONTORLID<>").Append(FID); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { for (int i = 0; i < dv.Count; i++) { sql.Remove(0, sql.Length); sql.Append("select min(F_MonitorIndex) as mm from T_Monitor_Task where F_ManageTaskIndex=").Append(dv[i]["F_ManageTaskIndex"]).Append(" and F_ManageTASKKINDINDEX=").Append(dv[i]["F_ManageTASKKINDINDEX"]).Append(" "); dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count > 0) { if (dv0[0]["mm"].ToString() == dv[i]["F_MonitorIndex"].ToString()) { if (FID != Convert.ToInt32(dv[i]["F_ManageTaskIndex"])) { return Convert.ToInt32(dv[i]["F_ManageTaskIndex"]); } } } } return -1; } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dv0.Dispose(); dv1.Dispose(); } } /// /// /// /// 调度任务类型索引 /// 调度任务索引 /// 调度任务类型 /// 最后分配的远、近货叉 void AlterRoutePath(int Mankind,int FID,int ControlTaskType,char UseAwayFork,int NowDevice) { DataView dv = new DataView(); DataView dv1 = new DataView(); DataView dvnew = new DataView(); //先找到以前的路径是否与最后分配的货叉匹配,不匹配的改道 try { sql.Remove(0, sql.Length); sql.Append("SELECT T_Monitor_Task.F_MonitorIndex,T_Monitor_Task.F_DeviceIndex FROM T_Monitor_Task,T_Base_Route_Device where ").Append( " T_Monitor_Task.F_RouteID = T_Base_Route_Device.F_RouteIDSub AND T_Monitor_Task.F_DeviceIndex = T_Base_Route_Device.F_DeviceIndex and T_Monitor_Task.F_ManageTaskIndex=").Append( FID).Append(" and T_Monitor_Task.F_ManageTASKKINDINDEX=").Append(Mankind).Append(" and T_Base_Route_Device.F_UseAwayFork<>'").Append(UseAwayFork).Append("'"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { sql.Remove(0, sql.Length); sql.Append("select * from T_Manage_Task where F_ManageTaskKindIndex=" ).Append( Mankind ).Append( " and FID=" ).Append( FID); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { //20100702 sql.Remove(0, sql.Length); sql.Append("SELECT T_Base_Route_Device.F_RouteIDSub FROM T_Base_Route,T_Base_Route_Device where T_Base_Route.F_RouteID = T_Base_Route_Device.F_RouteID " ).Append( " and (T_Base_Route_Device.F_UseAwayFork = '" ).Append( UseAwayFork ).Append( "') AND (T_Base_Route_Device.F_DeviceIndex = " ).Append( NowDevice ).Append( ") AND (T_Base_Route.F_StartDevice = " ).Append( dv[0]["FSTARTDEVICE"] ).Append( ") AND (T_Base_Route.F_EndDevice = " ).Append( dv[0]["FENDDEVICE"] ).Append( " and F_RouteKind=").Append(ControlTaskType).Append(")"); ; dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count > 0) { int routeidNew=Convert.ToInt32( dv1[0][0]); //删除原来的申请修改路径任务,拆分新的任务并且只保留现有设备开始的任务 sql.Remove(0, sql.Length); sql.Append("DELETE FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " ).Append( FID ).Append( ") AND (F_ManageTASKKINDINDEX =").Append(Mankind).Append(")"); dbo.ExceSQL(sql.ToString()); if (CDisassembleTask.CreateMonitor(Mankind, FID, routeidNew, dv[0], 3) > 0) { sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " ).Append( FID ).Append( ") AND (F_ManageTASKKINDINDEX = ").Append(Mankind).Append(") AND (F_DeviceIndex = " ).Append( NowDevice ).Append( ") AND (F_RouteID = " ).Append( routeidNew ).Append( ") AND (F_Status = 3) "); dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvnew.Count > 0) { sql.Remove(0, sql.Length); sql.Append("delete from T_Monitor_Task where F_MonitorIndex<" ).Append( dvnew[0]["F_MonitorIndex"] ).Append( " and (F_ManageTaskIndex = " ).Append( FID ).Append( ") AND (F_ManageTASKKINDINDEX = ").Append(Mankind).Append(") AND (F_Status = 3)"); dbo.ExceSQL(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = " ).Append( FID ).Append( ") AND (F_ManageTASKKINDINDEX = ").Append(Mankind).Append(") AND (F_Status = 3)"); dbo.ExceSQL(sql.ToString()); } } } } } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dv1.Dispose(); dvnew.Dispose(); } } int GetDoubleForkMinRouteTask(int taskno) { DataView dv = new DataView(); try { //不是双叉的直接返回taskno;是双叉但是可以同步的直接返回taskno //双叉不能同步的反馈距离当前堆垛机位置最短的taskno int manKind = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(taskno); int manFid = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(taskno); int deviceindex = Model.CGeneralFunction.GetDeviceIndexFromMonitor(taskno); int devKind = Model.CGeneralFunction.GetDeviceKindIdx(deviceindex); int devOrder = Model.CGeneralFunction.GetDeviceOrderFromMonitor(taskno); devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex); int nX = Model.CGeneralFunction.GetXCoorFromMonitor(taskno, deviceindex, devOrder); int nY = Model.CGeneralFunction.GetYCoorFromMonitor(taskno, deviceindex, devOrder); double nXY = 0, doubleXY = 0, doubleX = 0, doubleY=0; int XCoor = devinfo.XCoor; int YCoor = devinfo.YCoor; nXY = Math.Pow((double)(nX - XCoor), 2) + (Math.Pow((double)(nY - YCoor), 2)); if (devinfo.IfCorrelDoubleFork == "1") { // 多叉关联的设备信息 Dictionary df = Model.CGeneralFunction.GetDoubleForkMonitorInfo(taskno, deviceindex); if (df == null) return taskno; //不能同步的 if (Model.CGeneralFunction.MutiForkIfSync(taskno, deviceindex, devKind) == null) { #region 遍历每个关联任务 // key值为任务号 foreach (int cortask in df.Keys) { // add for CATL YB2 oracle 未发送的任务 sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(cortask).Append(") AND (F_status = 0)"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count <= 0) { continue; } #region 关联指令不是第一个指令不能发送 int rmankind = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(cortask); int rman = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(cortask); sql.Remove(0, sql.Length); //Oracle 更新 查询当前任务是不是 T_Monitor_Task 表最小的小任务号 按顺序发送 sql.Append("SELECT MIN(F_MonitorIndex) AS mmi FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(rman).Append(") AND (F_ManageTASKKINDINDEX = ").Append(rmankind).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if ((dv[0]["mmi"] != DBNull.Value) && (dv[0]["mmi"].ToString() != cortask.ToString())) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("关联指令不是第一个指令"); UpdateAheadDetectUnallow(AheadDetectUnallow, cortask); return -1; } } #endregion if (devKind == 1) { #region 倒叉方法 YB2没用 //如果存在倒库货位,则后执行该任务20120906嘉兴电力改进,倒库货位的取货命令检测堆垛机货叉对应开关是否有货 if (devOrder == 5)//送货指令时判断20110505 { // YB2 无倒叉 不进这 if (true == IfChangeForkCell_LastRun(deviceindex, cortask))//双叉入库时 { continue; } } #endregion #region 堆垛机 doubleX = Model.CGeneralFunction.GetXCoorFromMonitor(cortask, deviceindex, devOrder); doubleY = Model.CGeneralFunction.GetYCoorFromMonitor(cortask, deviceindex, devOrder); doubleXY = Math.Pow((double)(doubleX - XCoor), 2) + (Math.Pow((double)(doubleY - YCoor), 2)); if (nXY > doubleXY) { nXY = doubleXY; taskno = cortask; } #endregion } else if (devKind == 6) { #region AGV sql.Remove(0, sql.Length); sql.Append("SELECT F_Sequence FROM T_Base_AGV_Gate WHERE (F_AGVGateDeviceIndex = ").Append(nX).Append(")"); nXY = Convert.ToInt32(dbo.GetSingle(sql.ToString())); sql.Remove(0, sql.Length); sql.Append("SELECT F_Sequence FROM T_Base_AGV_Gate WHERE (F_AGVGateDeviceIndex = ").Append(doubleX).Append(")"); doubleXY = Convert.ToInt32(dbo.GetSingle(sql.ToString())); if (nXY < doubleXY) { return taskno; } else { return Convert.ToInt32(df[0]); } #endregion } else { return taskno; } } #endregion //返回当前这条大任务对应的小任务的最小的任务号 return taskno; } else { // 能同步的 #region 遍历每个关联任务 foreach (int cortask in df.Keys) { #region 关联指令不是第一个指令不能发送 int rmankind = Model.CGeneralFunction.GetManageTaskKindIndexFromMonitor(cortask); int rman = Model.CGeneralFunction.GetManageTaskIndexfromMonitor(cortask); sql.Remove(0, sql.Length); sql.Append("SELECT MIN(F_MonitorIndex) AS mmi FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(rman).Append(") AND (F_ManageTASKKINDINDEX = ").Append(rmankind).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if ((dv[0]["mmi"] != DBNull.Value) && (dv[0]["mmi"].ToString() != cortask.ToString())) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("关联指令不是第一个指令"); UpdateAheadDetectUnallow(AheadDetectUnallow, taskno); return -1; } } #endregion } #endregion return taskno; } } else { return taskno; } } catch (Exception ex) { CControlError = string.Format("发送命令调用GetDoubleForkMinRouteTask时:{0},{1}", sql.ToString(), ex.StackTrace+ex.Message ); return taskno; } finally { dv.Dispose(); } } bool IFAGVGate(int devIndex) { sql.Remove(0, sql.Length); sql.Append("SELECT F_AGVGateDeviceIndex FROM T_Base_AGV_Gate WHERE (F_AGVGateDeviceIndex = ").Append(devIndex ).Append(")"); if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0) { return true; } else { return false; } } /// /// 同轨两个堆垛机组合作业,通过中转货位交替作业 /// /// /// /// void ChangeStackCellCode(int taskindex, string ChangeStackCell, int StackIndex,int changetype) {//20120820 int[] zxy; int fid = ccf.GetManageTaskIndexfromMonitor(taskindex); int Mankind = ccf.GetManageTaskKindIndexFromMonitor(taskindex); zxy = ccf.GetCoordinatesFromMonitorTask(taskindex); StringBuilder zxystr = new StringBuilder();//最终放货位置 DataView dvl = new DataView(); DataView dv = new DataView(); if (zxy != null) { zxystr.Append((zxy[3].ToString().Length == 1 ? "0" + zxy[3].ToString() : zxy[3].ToString())).Append("-").Append( ((zxy[4].ToString().Length == 1) ? ("0" + zxy[4].ToString()) : (zxy[4].ToString()))).Append("-").Append( ((zxy[5].ToString().Length == 1) ? ("0" + zxy[5].ToString()) : (zxy[5].ToString()))); } string sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", zxy[3], zxy[4], zxy[5]);//送货位置 if (changetype== Model.CGeneralFunction.TASKEXCHANGE)//如果是缓存任务,判断remark 是否为null,不为空则取remark作为终点 { sql.Remove(0, sql.Length); sql.Append("SELECT FREMARK FROM T_Manage_Task WHERE (FID = ").Append(fid).Append(") AND (F_ManageTaskKindIndex = ").Append(Mankind).Append(")"); object arrcell = dbo.GetSingle(sql.ToString()); string cell = Convert.ToString(arrcell); string[] cellzxy = cell.Split('-'); if(cellzxy.Length>2) { sendcell = cell; } } int getgate = ccf.GetLaneGateDeviceIndexFromLaneGate(sendcell);//送货位置的设备编号 int laneway = 0; devinfocheck = Model.CGetInfo.GetDeviceInfo(StackIndex); int vstack = StackIndex; if (devinfocheck!=null) { vstack = devinfocheck.VirtualStack; } dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = {0})", vstack)).Tables[0].DefaultView; if (dvl.Count > 0) { laneway = Convert.ToInt32(dvl[0]["F_LaneDeviceIndex"]); } else { return; } char[] cc = new char[1] { '-' }; string[] endCell = ChangeStackCell.Split(cc);//Z-X-Y //dbo.TransBegin(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate,T_Base_Device WHERE (T_Base_Lane_Gate.F_LaneGateDeviceIndex = T_Base_Device.F_DeviceIndex) and (F_ZXY = '").Append(ChangeStackCell).Append("') and F_LaneIndex=").Append(laneway); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { sql.Remove(0, sql.Length);//20120420 if (changetype == Model.CGeneralFunction.TASKCHANGESTACK)//倒换堆垛机时,不判断需要中转的任务的目标状态 { // //20181222 string[] exchangearea = ccf.GetExchangeStationAndEndAreaFromLaneGate(sendcell);//判读是否是到中转站台的任务 if (exchangearea != null) { sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_AheadDetect=REPLACE(F_AheadDetect,'").Append(getgate).Append("','").Append(dv[0]["F_LaneGateDeviceIndex"].ToString()) .Append("') where F_ManageTaskIndex=").Append(fid).Append(" and F_ManageTASKKINDINDEX=").Append(Mankind).Append(" and F_DeviceIndex=").Append(StackIndex); dbo.ExecuteSql(sql.ToString()); } sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_AheadDetect=F_AheadDetect+'").Append(";N").Append(dv[0]["F_LaneGateDeviceIndex"].ToString()).Append(";R").Append(dv[0]["F_LaneGateDeviceIndex"].ToString()) .Append("', F_NumParam4=").Append(endCell[0]).Append(",F_NumParam5=").Append(endCell[1]).Append(",F_ChangeStackCell='").Append(laneway.ToString()+","+ChangeStackCell ).Append("',F_NumParam6=").Append(endCell[2]).Append(" where F_ManageTaskIndex=").Append(fid).Append(" and F_ManageTASKKINDINDEX=").Append(Mankind).Append(" and F_DeviceIndex=").Append(StackIndex); dbo.ExecuteSql(sql.ToString()); } if (changetype == Model.CGeneralFunction.TASKEXCHANGE)//中转 //F_AheadDetect = REPLACE(F_AheadDetect, '{0}', '{1}') { //int getgate = ccf.GetLaneGateDeviceIndexFromLaneGate(zxystr.ToString());//送货位置的设备编号 sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_AheadDetect=REPLACE(F_AheadDetect,'").Append(getgate).Append("','").Append(dv[0]["F_LaneGateDeviceIndex"].ToString()) .Append("'), F_NumParam4=").Append(endCell[0]).Append(",F_NumParam5=").Append(endCell[1]).Append(",F_ChangeStackCell='").Append(laneway.ToString() + "," + ChangeStackCell ).Append("',F_NumParam6=").Append(endCell[2]).Append(" where F_ManageTaskIndex=").Append(fid).Append(" and F_ManageTASKKINDINDEX=").Append(Mankind).Append(" and F_DeviceIndex=").Append(StackIndex); dbo.ExecuteSql(sql.ToString()); } sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FREMARK='").Append(sendcell).Append("',FExceptionNO=").Append(changetype).Append(" where FID=").Append(fid).Append(" and F_ManageTaskKindIndex=").Append(Mankind); dbo.ExecuteSql(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("任务中转,任务号:", taskindex.ToString(), ChangeStackCell, changetype.ToString()); } //dbo.TransCommit(); } catch (Exception ex) { throw ex; //dbo.TransRollback(); } finally { dv.Dispose(); dvl.Dispose(); } } int GetIOControlStatus(int TaskIndex) { int mankind = ccf.GetManageTaskKindIndexFromMonitor(TaskIndex); int Fid = ccf.GetManageTaskIndexfromMonitor(TaskIndex); if (mankind == 1) { sql.Remove(0, sql.Length); sql.Append("SELECT CONTROL_STATUS FROM IO_CONTROL WHERE (CONTROL_ID = ").Append(Fid).Append(")"); object ob=dboM.GetSingle(sql.ToString()); if (ob != null) { return Convert.ToInt32(ob); } else { return 1; } } else { return 1; } } /// /// 返回AGV双叉的关联站台,“-1”代表没有关联 /// /// 设备指令索引 /// int GetAGVCorrelIndex(int taskindex) { sql.Remove(0, sql.Length); sql.Append("SELECT F_NumParam2 FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskindex).Append(")"); object ob = dbo.GetSingle(sql.ToString()); if (ob != null) { int cs = Convert.ToInt32(ob); if (cs % 2 == 0) { return (cs-1); } else { return (cs + 1); } } else { return -1; } } int GetAGVCorrelConveyorIndex(int taskindex) { sql.Remove(0, sql.Length); sql.Append("SELECT F_NumParam2 FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskindex).Append(")"); object ob = dbo.GetSingle(sql.ToString()); if (ob != null) { int cs = Convert.ToInt32(ob); if (cs % 2 == 0) { return (cs + 1); } else { return (cs - 1); } } else { return -1; } } /// /// 返回AGV在此站台取货的调度任务索引 /// /// 控制任务类型 /// AGV站台索引 /// int GetAGVEnableDoubleForkManageTask(int controltype, int stationIndex,int agv) {//20110412 DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex,T_Monitor_Task.F_ManageTaskIndex,T_Monitor_Task.F_ManageTASKKINDINDEX ").Append( " FROM T_Monitor_Task ,T_Manage_Task where T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID AND ").Append( "T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex and FCONTROLTASKTYPE=").Append( controltype).Append(" and F_NumParam2=").Append(stationIndex).Append(" and F_DeviceIndex=").Append(agv).Append(" and F_Status=0 and F_DeviceCommandIndex=2"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_ManageTaskIndex"]); } return -1; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } bool IfInSameLimitX(int fid, int mfid,int manKind) { DataView dv = new DataView(); DataView dv1 = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_ForwardLimitX,F_BackLimitX,FEndCol FROM T_Manage_Task,T_Base_LaneInfo WHERE T_Manage_Task.FLANEWAY = T_Base_LaneInfo.F_LaneDeviceIndex and (F_ManageTaskKindIndex = ").Append(manKind).Append(") AND (FID = ").Append(fid).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count == 0) { return false; } sql.Remove(0, sql.Length); sql.Append("SELECT F_ForwardLimitX,F_BackLimitX,FEndCol FROM T_Manage_Task,T_Base_LaneInfo WHERE T_Manage_Task.FLANEWAY = T_Base_LaneInfo.F_LaneDeviceIndex and (F_ManageTaskKindIndex = ").Append(manKind).Append(") AND (FID = ").Append(mfid).Append(")"); dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv1.Count == 0) { return false; } if ((dv[0]["FEndCol"].ToString() == dv[0]["F_ForwardLimitX"].ToString()) && (dv1[0]["F_ForwardLimitX"].ToString() == dv1[0]["FEndCol"].ToString())) { return true; } if ((dv[0]["FEndCol"].ToString() == dv[0]["F_BackLimitX"].ToString()) && (dv1[0]["F_BackLimitX"].ToString() == dv1[0]["FEndCol"].ToString())) { return true; } return false; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dv1.Dispose(); } } int GetAGVFromConveyorDoubleForkGetGoodManageTask(int controltype, int stationIndex,int agv) { DataView dv0 = new DataView(); DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT T_Monitor_Task.F_ManageTaskIndex,F_MonitorIndex,T_Manage_Task.F_ManageTaskKindIndex ").Append( " FROM T_Monitor_Task ,T_Manage_Task where T_Monitor_Task.F_ManageTaskIndex = T_Manage_Task.FID AND ").Append( "T_Monitor_Task.F_ManageTASKKINDINDEX = T_Manage_Task.F_ManageTaskKindIndex and FCONTROLTASKTYPE=").Append( controltype).Append(" and F_NumParam2=").Append(stationIndex).Append(" and F_DeviceIndex=").Append(agv).Append(" and F_Status=0 and F_DeviceCommandIndex=2 order by F_MonitorIndex asc");//20110412 dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { for (int i = 0; i < dv.Count; i++) { sql.Remove(0, sql.Length); if (CStaticClass.DBFactory == "OracleDBFactory") {//20151120调度系统oracle的特殊语句 sql.Append("SELECT F_MonitorIndex ").Append(" FROM T_Monitor_Task where rownum=1 and T_Monitor_Task.F_ManageTaskIndex = ") .Append(dv[i]["F_ManageTaskIndex"].ToString()).Append( " and F_ManageTASKKINDINDEX = ").Append(dv[i]["F_ManageTaskKindIndex"].ToString()).Append(" order by F_MonitorIndex asc"); } else {//20151120调度系统SQLServer的特殊语句 sql.Append("SELECT top 1 F_MonitorIndex ").Append(" FROM T_Monitor_Task where T_Monitor_Task.F_ManageTaskIndex = ") .Append(dv[i]["F_ManageTaskIndex"].ToString()).Append( " and F_ManageTASKKINDINDEX = ").Append(dv[i]["F_ManageTaskKindIndex"].ToString()).Append(" order by F_MonitorIndex asc"); } dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20151120调度系统oracle的特殊语句 if (dv0[0]["F_MonitorIndex"].ToString() == dv[i]["F_MonitorIndex"].ToString()) { return Convert.ToInt32(dv[i]["F_ManageTaskIndex"]); } } } return -1; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dv0.Dispose(); } } bool IFHaveSameEndDevice(int fid,int CorrelFid,int mti) { DataView dv0 = new DataView(); DataView dv = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT FENDDEVICE, FENDCELL, FUseAwayFork FROM T_Manage_Task WHERE (F_ManageTaskKindIndex = ").Append(mti).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 FENDDEVICE, FENDCELL, FUseAwayFork FROM T_Manage_Task WHERE (F_ManageTaskKindIndex = ").Append(mti).Append(") AND (FID = ").Append(CorrelFid).Append(")"); dv0 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv0.Count > 0) { if ((dv[0]["FENDDEVICE"].ToString() == dv0[0]["FENDDEVICE"].ToString()) && (dv[0]["FENDDEVICE"].ToString() == "28001") && (Math.Abs(Convert.ToInt32(dv[0]["FENDCELL"]) - Convert.ToInt32(dv0[0]["FENDCELL"])) == 1))//20110412 { if ((Convert.ToInt32(dv[0]["FENDCELL"]) > Convert.ToInt32(dv0[0]["FENDCELL"])) && (Convert.ToInt32(dv[0]["FUseAwayFork"]) > Convert.ToInt32(dv0[0]["FUseAwayFork"]))) { return true; } if ((Convert.ToInt32(dv[0]["FENDCELL"]) < Convert.ToInt32(dv0[0]["FENDCELL"])) && (Convert.ToInt32(dv[0]["FUseAwayFork"]) < Convert.ToInt32(dv0[0]["FUseAwayFork"]))) { return true; } return false; } else { return false; } } else { return false; } } else { return false; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); dv0.Dispose(); } } /// /// 增加信息提示 /// /// /// void UpdateAheadDetectUnallow(StringBuilder aheadUnallow, int taskindex) { #region 20110505增加的信息提示 int rec = 0; if (aheadUnallow.Length > 0) { //add for CATL YB2 //rec = dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_ErrorCode ='{0}' WHERE F_MonitorIndex ={1} and F_ErrorCode <>'{0}'", aheadUnallow.ToString(), taskindex )); rec = dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_ErrorCode ='{0}' WHERE F_MonitorIndex ={1} and (F_ErrorCode <>'{0}' or F_ErrorCode is null)", aheadUnallow.ToString(), taskindex)); } else { rec = dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_ErrorCode ='' WHERE F_MonitorIndex ={1} and (F_ErrorCode !='' or F_ErrorCode is null)", aheadUnallow.ToString(), taskindex)); //rec = dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_ErrorCode ='' WHERE F_MonitorIndex ={1} and F_ErrorCode <>''", aheadUnallow.ToString(), taskindex)); } if (rec > 0) { CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null); OnDataChange("发送提前检测时,异常",cea); } #endregion } /// /// 如果是倒叉货位,那它后执行 /// /// /// bool IfChangeForkCell_LastRun(int deviceindex,int TaskIndex) {//20110505 DataView dv = new DataView(); try { int laneway = ccf.GetLaneWayFromLaneInfo(deviceindex); int[] zxy = ccf.GetCoordinatesFromMonitorTask(TaskIndex); //写错了 string zxystr = (zxy[3].ToString().Length == 1 ? "0" + zxy[3].ToString() : zxy[0].ToString()) + "-" + string zxystr = (zxy[3].ToString().Length == 1 ? "0" + zxy[3].ToString() : zxy[3].ToString()) + "-" + ((zxy[4].ToString().Length == 1) ? ("0" + zxy[4].ToString()) : (zxy[4].ToString())) + "-" + ((zxy[5].ToString().Length == 1) ? ("0" + zxy[5].ToString()) : (zxy[5].ToString())); int lanedev = ccf.GetChangeCellStationFromLaneGate(laneway,zxystr); //别用like dv = dbo.ExceSQL(string.Format("SELECT F_ChangeForkCell FROM T_Base_LaneInfo WHERE F_LaneDeviceIndex={0} and (F_ChangeForkCell ='{1}' or F_ChangeForkCell = '{2}')", laneway, zxystr,lanedev)).Tables[0].DefaultView; if (dv.Count > 0)//倒库货位的任务后执行 { return true; } return false; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } bool GetWorkStack(int deviceIndex, int taskIndex, out string getstack, out string sendstack, out bool IfCombinedWork, out int workstackcount) {//20120820 //DataView dv = new DataView(); //Model.MDevice devinfo; int resDev = 0; string getcell = string.Empty; string sendcell = string.Empty; IfCombinedWork = false; getstack = ""; sendstack =""; workstackcount=0; try { int[] coor = Model.CGeneralFunction.GetCoorFromMonitor(taskIndex);//获得堆垛机的取货和送货坐标 if (coor == null) { return false; } int Xcoor = coor[1]; int Zcoor = coor[0]; int Ycoor = coor[2]; int XcoorS = coor[4]; int ZcoorS = coor[3]; int YcoorS = coor[5]; int sno = 0; //bool IfCombinedWork = false; //string getstack, sendstack; //int workstackcount; //string lanegate; getcell = string.Format("{0:D2}-{1:D2}-{2:D2}", Zcoor, Xcoor, Ycoor); sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", ZcoorS, XcoorS, YcoorS); int laneway = ccf.GetLaneWayFromLaneInfo(deviceIndex);//获得巷道 GetWorkStackNo(laneway, getcell, sendcell, out getstack, out sendstack, out IfCombinedWork, out workstackcount); return true; } catch (Exception ex) { return false; } } /// /// 分配实际工作的堆垛机设备索引20111020 /// /// 虚拟堆垛机设备索引 /// 设备指令索引 /// 调度任务类型 /// 调度任务索引 /// public bool AssignStackNo(int deviceIndex, int taskIndex, int manKind, int fid, string DoWorkStack, string ChangeCell, string ChangeStackCell2,int UseAwayFork,int UseAwayFork2, bool DeleteRelative, int CONTROLTASKTYPE)// ChangeStackCell:该任务倒库货位 , string ChangeStackCell2关联任务倒库货位 {//20120820 DataView dv = new DataView(); Model.MDevice devinfo; int resDev = 0; string getcell = string.Empty; string sendcell = string.Empty; try { fid = ccf.GetManageTaskIndexfromMonitor(taskIndex);//20181219 int []coor = Model.CGeneralFunction.GetCoorFromMonitor(taskIndex);//获得堆垛机的取货和送货坐标 if (coor == null) { return false; } int Xcoor = coor[1]; int Zcoor = coor[0]; int Ycoor = coor[2]; int XcoorS = coor[4]; int ZcoorS = coor[3]; int YcoorS = coor[5]; int sno = 0; bool IfCombinedWork = false; string getstack,sendstack; int workstackcount; string lanegate; getcell = string.Format("{0:D2}-{1:D2}-{2:D2}", Zcoor, Xcoor, Ycoor); sendcell = string.Format("{0:D2}-{1:D2}-{2:D2}", ZcoorS, XcoorS, YcoorS); //int CONTROLTASKTYPE = ccf.GetFCONTROLTASKTYPEFromManageTask(manKind, fid); //GetSpecialStackNo(deviceIndex, Zcoor, Xcoor, ZcoorS, XcoorS, out sno, out IfCombinedWork); int laneway = ccf.GetLaneWayFromLaneInfo(deviceIndex);//获得巷道 GetWorkStackNo(laneway,getcell, sendcell, out getstack, out sendstack, out IfCombinedWork, out workstackcount); //强制进行倒换堆垛机(堆垛机可以相同) // #region 选择不被禁用的堆垛机执行全部任务 string[] stack = getstack.Split(';'); int count = stack.Length; for (int i = 0; i < count; i++) { int device=Convert.ToInt32( stack[i]);//取货堆垛机 int lockstate= ccf.GetDeviceLockedState(device); string mutex= ccf.GetStackMutexDevice(device);//通用写法是获取堆垛机的互斥堆垛机组,懒得写了,先按一个来吧 int mutexlockstate= ccf.GetDeviceLockedState(Convert.ToInt32(mutex)); if (lockstate == -1)//当前堆垛机被禁用 { if (mutexlockstate == -1)//互斥堆垛机也被禁用 { return false; } else { //要判断当前堆垛机是否在维修区停靠,未在维修区停靠 ,判断安全门的开关状态 SetStackNo(deviceIndex, Convert.ToInt32(mutex), manKind, fid,taskIndex,"",UseAwayFork2,DeleteRelative, CONTROLTASKTYPE,0);//20181225 return true; } } else//当前堆垛机没有被禁用 { if (mutexlockstate == -1)//互斥堆垛机被禁用 { SetStackNo(deviceIndex, device, manKind, fid,taskIndex,"",UseAwayFork2,DeleteRelative, CONTROLTASKTYPE, 0);//20181225 return true; } //else//都没被禁用 } } #endregion //先考虑特殊情况20111226 if (IfCombinedWork == true)//需要多台堆垛机协作 {//两种情况:需要两台,需要三台 devinfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(getstack)); //堆垛机组合交替作业 string ChangeStackCell; if (devinfo.IfCorrelDoubleFork == "1") { if (ChangeCell=="")//20181220 { ChangeStackCell = GetChangeStackCellFromStackInfoByFork(getstack, UseAwayFork); } else { ChangeStackCell = ChangeCell; } } else { ChangeStackCell= GetChangeStackCellFromStackInfo(CONTROLTASKTYPE, Zcoor,ZcoorS, getstack, sendstack, out lanegate);//返回货位编码 Z-X-Y } if (ChangeStackCell != "") { if (StackIfExitTask(Convert.ToInt32(getstack), CONTROLTASKTYPE, 0) == false)//20191219 { ChangeStackCellCode(taskIndex, ChangeStackCell, deviceIndex, Model.CGeneralFunction.TASKCHANGESTACK); SetStackNo(deviceIndex, Convert.ToInt32(getstack), manKind, fid, taskIndex, ChangeStackCell2, UseAwayFork2, DeleteRelative, CONTROLTASKTYPE, 0); return true; } else { return false; } } else {//20120820没有空闲的两个堆垛机公用的交接货位 return false; } } else//单台堆垛机作业 {//分两种情况:getstack含一个设备,含两个设备 string[] workstack = getstack.Split(';'); int workcount = workstack.Length; #region 不需二次选择 if (workcount == 1)//单台堆垛机 { SetStackNo(deviceIndex, Convert.ToInt32(workstack[0]), manKind, fid, taskIndex, ChangeStackCell2, UseAwayFork2, DeleteRelative, CONTROLTASKTYPE, 0); //SetStackNo(deviceIndex, Convert.ToInt32(workstack[0]), manKind, fid,taskIndex,ChangeStackCell2,UseAwayFork2,DeleteRelative, CONTROLTASKTYPE,1); return true; } #endregion #region 需要二次选择 else if (workcount > 1)//多台堆垛机中选择合适的堆垛机 { //然后其余情况根据总列数折中分配给两个堆垛机 resDev = GetPRIStackNo(deviceIndex, Zcoor, Xcoor, ZcoorS, XcoorS); int MutexStack = resDev; for (int i = 0; i < workcount; i++) { if (resDev != Convert.ToInt32(workstack[i])) { MutexStack = Convert.ToInt32(workstack[i]); } } devinfo = Model.CGetInfo.GetDeviceInfo(resDev); int stacksequence=devinfo.Sequence; if (devinfo.RunState == 0 && ccf.GetManTaskReserve(resDev) <= 0 && ccf.GetDeviceLockedState(resDev) == 0) {//空闲、无任务执行、无管理任务预约锁 SetStackNo(deviceIndex, resDev, manKind, fid, taskIndex,ChangeStackCell2,UseAwayFork2,DeleteRelative, CONTROLTASKTYPE, 0); return true; } else {//根据35001当前位置和正在执行的任务的目标位置考虑是否分配35002 int Mutex = resDev;//正在工作的堆垛机 resDev = MutexStack; MutexStack = Mutex; devinfo = Model.CGetInfo.GetDeviceInfo(resDev); if (devinfo != null && devinfo.RunState == 0 && ccf.GetManTaskReserve(resDev) <= 0 && ccf.GetDeviceLockedState(resDev) == 0) { sql = new StringBuilder(string.Format("SELECT F_DeviceCommandIndex,F_NumParam1, F_NumParam2, F_NumParam3, F_NumParam4, F_NumParam5, F_NumParam6 FROM T_Monitor_Task WHERE (F_Status > 0) AND (F_DeviceIndex = {0})", Mutex)); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) {// 判读两台堆垛机的位置关系 int xcoor=0, zcoor=0; string order =dv[0]["F_DeviceCommandIndex"].ToString() ; if (order == "4")//取货 { xcoor = Convert.ToInt32(dv[0]["F_NumParam2"]); zcoor = Convert.ToInt32(dv[0]["F_NumParam1"]); } else if (order == "5")//送货 { xcoor = Convert.ToInt32(dv[0]["F_NumParam5"]); zcoor = Convert.ToInt32(dv[0]["F_NumParam4"]); } if (devinfo.Sequence > stacksequence)//devinfo.Sequence待选堆垛机的序列号,stacksequence正在任务的堆垛机的序列号,序列号小的说明条码值小 { //GetBarcodeCoor(xcoor, zcoor)获得正在执行任务对应的坐标;GetBarcodeCoor(Xcoor, Zcoor)待执行任务的坐标 if ((GetBarcodeCoor(xcoor, zcoor, deviceIndex) + StackMutexXCoor) <= GetBarcodeCoor(Xcoor, Zcoor, deviceIndex)) { SetStackNo(deviceIndex, resDev, manKind, fid, taskIndex,ChangeStackCell2,UseAwayFork2,DeleteRelative, CONTROLTASKTYPE, 0); return true; } } else if (devinfo.Sequence < stacksequence)//devinfo.Sequence待选堆垛机的序列号,stacksequence正在任务的堆垛机的序列号,序列号小的说明条码值小 { //GetBarcodeCoor(xcoor, zcoor)获得正在执行任务对应的坐标;GetBarcodeCoor(Xcoor, Zcoor)待执行任务的坐标 if ((GetBarcodeCoor(Xcoor, Zcoor, deviceIndex) + StackMutexXCoor) <= GetBarcodeCoor(xcoor, zcoor, deviceIndex)) { SetStackNo(deviceIndex, resDev, manKind, fid, taskIndex,ChangeStackCell2,UseAwayFork2,DeleteRelative, CONTROLTASKTYPE, 0); return true; } } } else {//(resDev - devinfo.MutexStack)设备编号小的设备,实际行走位置的坐标值也小 //int xcMutex = (resDev - devinfo.MutexStack) * (GetBarcodeCoor(Xcoor, Zcoor) - Model.CGetInfo.GetDeviceInfo(devinfo.MutexStack).XCoor);//20120513 //int xMutex = Math.Abs(GetBarcodeCoor(Xcoor, Zcoor) - Model.CGetInfo.GetDeviceInfo(devinfo.MutexStack).XCoor);//不空闲堆垛机距离等待执行任务的距离 //int xDev = Math.Abs(GetBarcodeCoor(Xcoor, Zcoor) - Model.CGetInfo.GetDeviceInfo(resDev).XCoor);//待选堆垛机距离等待执行任务的距离 //devinfo = Model.CGetInfo.GetDeviceInfo(devinfo.MutexStack);//20120513 //if ((xDev < xMutex) || ((devinfo.RunState >= 2) && (devinfo.RunState <= 4) && (xcMutex > StackMutexXCoor)))//20120513 //{ // SetStackNo(deviceIndex, resDev, manKind, fid); // return true; //} int taskbarcode = GetBarcodeCoor(Xcoor, Zcoor, deviceIndex);//待执行任务的条码值 int MutexStackbarcode= Model.CGetInfo.GetDeviceInfo(MutexStack).XCoor;//不空闲堆垛机对应的条码值 if (devinfo.Sequence > stacksequence)//devinfo.Sequence待选堆垛机的序列号,stacksequence不空闲堆垛机的序列号,序列号小的说明条码值小 { //GetBarcodeCoor(xcoor, zcoor)获得正在执行任务对应的坐标;GetBarcodeCoor(Xcoor, Zcoor)待执行任务的坐标 if (taskbarcode > devinfo.XCoor || (taskbarcode > MutexStackbarcode + StackMutexXCoor)) { SetStackNo(deviceIndex, resDev, manKind, fid, taskIndex,ChangeStackCell2,UseAwayFork2,DeleteRelative, CONTROLTASKTYPE, 0); return true; } } else if (devinfo.Sequence < stacksequence)//devinfo.Sequence待选堆垛机的序列号,stacksequence正在任务的堆垛机的序列号,序列号小的说明条码值小 { //GetBarcodeCoor(xcoor, zcoor)获得正在执行任务对应的坐标;GetBarcodeCoor(Xcoor, Zcoor)待执行任务的坐标 if (taskbarcode < devinfo.XCoor || (MutexStackbarcode > taskbarcode + StackMutexXCoor)) { SetStackNo(deviceIndex, resDev, manKind, fid, taskIndex,ChangeStackCell2,UseAwayFork2,DeleteRelative, CONTROLTASKTYPE, 0); return true; } } } } } } #endregion } return false; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } private string GetChangeStackCell(int stack) {//20120820根据两个堆垛机的组合任务判断哪个更换堆垛机站台空闲 DataView dv = new DataView(); int fids = 0; string cell = ""; int minfids = int.MaxValue; try { dv = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex, F_ChangeStackCell FROM T_Base_LaneInfo where F_StackIndex={0}", stack)).Tables[0].DefaultView; if (dv.Count > 0) { char[] cc = new char[1] { ';'}; string[] sp=dv[0]["F_ChangeStackCell"].ToString().Split(cc); string ChangeStackCell=string.Empty ; int lanedev = 0; for (int i = 0; i < sp.GetLength(0); i++) {//T_Monitor_Task表新增 F_ChangeStackCell "18001,01-30-02" int.TryParse(sp[i], out lanedev); if (lanedev > 0) {//T_Base_LaneInfo表的 F_ChangeStackCell 和F_ChangeForkCell字段可以填写倒叉货位对应虚拟站台的设备索引 sp[i] = ccf.GetChangeCellFromLaneGate(Convert.ToInt32( dv[0]["F_LaneDeviceIndex"]), lanedev); } ChangeStackCell = dv[0]["F_LaneDeviceIndex"].ToString() + "," + sp[i]; fids = Convert.ToInt32(dbo.GetSingle(string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell='{0}'", ChangeStackCell))); if (fids < minfids) { minfids = fids; cell = sp[i]; } } } return cell; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// /// /// 任务类型 /// 取货位置排坐标 /// 送货位置拍坐标 /// /// /// /// private string GetChangeStackCellFromStackInfo(int type, int ZcoorG, int ZcoorS, string getstack, string sendstack, out string lanegate) {//20120820根据两个堆垛机的组合任务判断哪个更换堆垛机站台空闲 DataView dv = new DataView(); string cell = ""; lanegate = ""; // string lanegate=""; int laneindex=0; string sql = string.Empty; char[] cc = new char[1] { ';' }; //string ChangeStackCell = string.Empty; string GetChangeStackCell = string.Empty; string SendChangeStackCell = string.Empty; string[] Getcell; string[] Sendcell; //string[] changecell; string stack; try { #region 计算双伸堆垛机倒库站台所在的排坐标 int stackreach = 1; int needZ;//倒库站台所在的排坐标 devinfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(getstack));//20180610 if (devinfo != null) { stackreach = devinfo.StackReach; } if (type == 1)//入库 { needZ = ZcoorS;//判断送货位置所在排一侧是否有倒库货位 } else { needZ = ZcoorG;//判断取货位置所在排一侧是否有倒库货位 } //needZ = needZ % 4;//排坐标 bool ifleft = true; if (needZ <= 2)//1,2排是左侧 { ifleft = true; } else { ifleft = false; } #endregion sql = string.Format("SELECT F_StackIndex, F_ChangeStackCell,F_LaneNo FROM T_Base_StackInfo where F_StackIndex={0} or F_StackIndex={1}",getstack ,sendstack); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { for (int i = 0; i < dv.Count;i++ ) { stack = Convert.ToString(dv[i]["F_StackIndex"]); laneindex=Convert.ToInt32(dv[i]["F_LaneNo"]); if (stack==getstack) { GetChangeStackCell = Convert.ToString(dv[i]["F_ChangeStackCell"]); } else if (stack == sendstack) { SendChangeStackCell = Convert.ToString(dv[i]["F_ChangeStackCell"]); } } Getcell = GetChangeStackCell.Split(cc); Sendcell=SendChangeStackCell.Split(cc); bool findedflag = false; int changeZ; for (int i = 0; i < Getcell.Length;i++ ) { //不相邻的堆垛机,选择取货堆垛机的倒货站台 19006和19007, lanegate = Getcell[i]; for (int k = 0; k < Sendcell.Length;k++ ) { if(Getcell[i]==Sendcell[k]) { lanegate = Getcell[i];//相邻的堆垛机使用双方都可到达的倒货站台 19006 和 19006;19007 if (stackreach!=2) { findedflag = true; } if(stackreach ==2) { cell = ccf.GetChangeCellFromLaneGate(laneindex, Convert.ToInt32(lanegate)); changeZ =Convert.ToInt32( cell.Split('-')[0]);//倒库站台对应的排坐标 //changeZ = changeZ % 4; if (ifleft && (changeZ <= 2)) { findedflag = true; } if (!ifleft && (changeZ > 2)) { findedflag = true; } } } } if (findedflag) { break; } } if (lanegate != "") { cell = ccf.GetChangeCellFromLaneGate(laneindex, Convert.ToInt32( lanegate)); } //同时只能执行一个倒货任务,防止11001到11003,和11003到11001同时执行,出现堵死的情况 string sqllstr = string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell ='{0},{1}' ", laneindex, cell); //string sqllstr = string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell !='' "); int changetaskcount= Convert.ToInt32(dbo.GetSingle(sqllstr)); if (changetaskcount>0) { cell = ""; } } return cell;//返回倒货站台对应的设备号19006 } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// /// /// 任务类型 /// 取货位置排坐标 /// 送货位置拍坐标 /// /// /// /// private string GetChangeStackCellFromStackInfoByFork(string getstack,int UseAwayFork) {//20120820根据两个堆垛机的组合任务判断哪个更换堆垛机站台空闲 DataView dv = new DataView(); string cell = ""; int laneindex = 0; string sql = string.Empty; string GetChangeStackCell = string.Empty; string stack; try { sql = string.Format("SELECT F_StackIndex, F_ChangeStackCell,F_LaneNo FROM T_Base_StackInfo where F_StackIndex={0}", getstack); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { stack = Convert.ToString(dv[0]["F_StackIndex"]); laneindex = Convert.ToInt32(dv[0]["F_LaneNo"]); GetChangeStackCell = Convert.ToString(dv[0]["F_ChangeStackCell"]); string stationmessage; string ExchangeStation=GetChangeStackCell.Replace(';',','); cell=ccf.GetFreeStation(ExchangeStation, UseAwayFork, out stationmessage);//获得新的目标 if (cell != "-") { //同时只能执行一个倒货任务,防止11001到11003,和11003到11001同时执行,出现堵死的情况 string sqllstr = string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell ='{0},{1}' ", laneindex, cell); //string sqllstr = string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell !='' "); int changetaskcount = Convert.ToInt32(dbo.GetSingle(sqllstr)); if (changetaskcount > 0) { cell = ""; } } else { cell = ""; } } return cell; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// /// /// 任务类型 /// 取货位置排坐标 /// 送货位置拍坐标 /// /// /// /// private string GetDoubleChangeStackCellFromStackInfoByFork(string getstack, int UseAwayFork, int UseAwayFork2, out string stationcell2) {//20120820根据两个堆垛机的组合任务判断哪个更换堆垛机站台空闲 DataView dv = new DataView(); string cell = ""; stationcell2 = ""; int laneindex = 0; string sql = string.Empty; string message; string GetChangeStackCell = string.Empty; string stack; try { sql = string.Format("SELECT F_StackIndex, F_ChangeStackCell,F_LaneNo FROM T_Base_StackInfo where F_StackIndex={0}", getstack); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { stack = Convert.ToString(dv[0]["F_StackIndex"]); laneindex = Convert.ToInt32(dv[0]["F_LaneNo"]); GetChangeStackCell = Convert.ToString(dv[0]["F_ChangeStackCell"]); string stationmessage; string ExchangeStation = GetChangeStackCell.Replace(';', ','); //cell = ccf.GetFreeStation(ExchangeStation, UseAwayFork, out stationmessage);//获得新的目标 cell = ccf.GetDoubleFreeStation(ExchangeStation, UseAwayFork, UseAwayFork2, out stationcell2,out message); if (cell != "-") { ////同时只能执行一个倒货任务,防止11001到11003,和11003到11001同时执行,出现堵死的情况 //string sqllstr = string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell ='{0},{1}' ", laneindex, cell); ////string sqllstr = string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell !='' "); //int changetaskcount = Convert.ToInt32(dbo.GetSingle(sqllstr)); //if (changetaskcount > 0) //{ // cell = ""; //} } else { cell = ""; } if (stationcell2 != "-") { ////同时只能执行一个倒货任务,防止11001到11003,和11003到11001同时执行,出现堵死的情况 //string sqllstr = string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell ='{0},{1}' ", laneindex, cell); ////string sqllstr = string.Format("SELECT count(distinct F_ManageTaskIndex) as fids FROM T_Monitor_Task where F_ChangeStackCell !='' "); //int changetaskcount = Convert.ToInt32(dbo.GetSingle(sqllstr)); //if (changetaskcount > 0) //{ // cell = ""; //} } else { stationcell2 = ""; } } return cell; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } void SetStackNo(int dummyStackno, int stackno, int manKind, int fid, int monitorindex, string ChangeStackCell2, int UseAwayFork2, bool DeleteRelative, int CONTROLTASKTYPE,int CanSet ) { //20111226考虑调整配套的站台和提前检测,35001-32038;35002-32036 if (StackIfExitTask(stackno, CONTROLTASKTYPE,CanSet) == true) return; Dictionary corr = Model.CGeneralFunction.GetDoubleForkMonitorInfo(monitorindex, dummyStackno); string sqlstr = string.Empty; object[] ob = new object[4] { stackno, manKind, fid, dummyStackno }; dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_DeviceIndex ={0} WHERE (F_ManageTASKKINDINDEX = {1}) AND (F_ManageTaskIndex = {2}) AND (F_DeviceIndex = {3})", ob)); dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect =replace(F_AheadDetect,{3},{0}) WHERE (F_ManageTASKKINDINDEX = {1}) AND (F_ManageTaskIndex = {2}) ", ob)); CommonClassLib.CCarryConvert.WriteDarkCasket("分配堆垛机,任务号:", fid.ToString(), monitorindex.ToString(), stackno.ToString()); if (corr!=null) { foreach (int CorrTaskindex in corr.Keys) { int fid1 = ccf.GetManageTaskIndexfromMonitor(CorrTaskindex); int mankind1 = ccf.GetManageTaskKindIndexFromMonitor(CorrTaskindex); if (CorrTaskindex != monitorindex && !DeleteRelative) { if (ChangeStackCell2!="") { ChangeStackCellCode(CorrTaskindex, ChangeStackCell2, dummyStackno, Model.CGeneralFunction.TASKCHANGESTACK); } ob = new object[4] { stackno, mankind1, fid1, dummyStackno }; dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_DeviceIndex ={0} WHERE (F_ManageTASKKINDINDEX = {1}) AND (F_ManageTaskIndex = {2}) AND (F_DeviceIndex = {3})", ob)); dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect =replace(F_AheadDetect,{3},{0}) WHERE (F_ManageTASKKINDINDEX = {1}) AND (F_ManageTaskIndex = {2}) ", ob)); CommonClassLib.CCarryConvert.WriteDarkCasket("分配双叉堆垛机,任务号:", fid1.ToString(), CorrTaskindex.ToString(), stackno.ToString()); } if (DeleteRelative)//解除关联关系 { sqlstr = string.Format("update T_Manage_Task set F_RELATIVECONTORLID = - 1 where F_ManageTaskKindIndex={0} and FID={1}",mankind1,fid1); dbo.ExecuteSql(sqlstr); } } } } void GetStackRunX_Zcoor(int StackdeviceIndex,out int Xcoor,out int Zcoor) {//20111020 DataView dv = new DataView(); try { Xcoor = 0; Zcoor = 1; sql = new StringBuilder(string.Format("SELECT F_DeviceCommandIndex,F_NumParam1, F_NumParam2, F_NumParam3, F_NumParam4, F_NumParam5, F_NumParam6 FROM T_Monitor_Task WHERE (F_Status > 0) AND (F_DeviceIndex = {0})", StackdeviceIndex)); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if ((dv[0]["F_DeviceCommandIndex"].ToString() == "2") || (dv[0]["F_DeviceCommandIndex"].ToString() == "4"))//将取,取货 { Zcoor = Convert.ToInt32(dv[0]["F_NumParam1"]); Xcoor = Convert.ToInt32(dv[0]["F_NumParam2"]); } else if (dv[0]["F_DeviceCommandIndex"].ToString() == "5")//送货 { Zcoor = Convert.ToInt32(dv[0]["F_NumParam4"]); Xcoor = Convert.ToInt32(dv[0]["F_NumParam5"]); } } //else //{ // int ManTaskReserve = ccf.GetManTaskReserve(StackdeviceIndex); // if (ManTaskReserve > 0) // { // int mti =Convert.ToInt32( ManTaskReserve.ToString().Substring(0, 1)); // int fid = Convert.ToInt32(ManTaskReserve.ToString().Substring(1)); // sql = new StringBuilder(string.Format("SELECT F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1, F_NumParam2, F_NumParam3, F_NumParam4, F_NumParam5, F_NumParam6 FROM T_Monitor_Task WHERE (F_ManageTASKKINDINDEX={0}) AND (F_ManageTaskIndex = {1}) order by F_MonitorIndex asc", mti, fid)); // dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; // if (dv.Count > 0) // { // if (dv[0]["F_DeviceIndex"].ToString() == StackdeviceIndex.ToString()) // { // if ((dv[0]["F_DeviceCommandIndex"].ToString() == "2") || (dv[0]["F_DeviceCommandIndex"].ToString() == "4"))//将取,取货 // { // Zcoor = Convert.ToInt32(dv[0]["F_NumParam1"]); // Xcoor = Convert.ToInt32(dv[0]["F_NumParam2"]); // } // else if (dv[0]["F_DeviceCommandIndex"].ToString() == "5")//送货 // { // Zcoor = Convert.ToInt32(dv[0]["F_NumParam4"]); // Xcoor = Convert.ToInt32(dv[0]["F_NumParam5"]); // } // } // } // } //} } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } void GetStackRunReserveX_Zcoor(int StackdeviceIndex, out int Xcoor, out int Zcoor) {//20111020 Xcoor = 0; Zcoor = 1; DataView dv = new DataView(); try { int ManTaskReserve = ccf.GetManTaskReserve(StackdeviceIndex); if (ManTaskReserve > 0) { int mti = Convert.ToInt32(ManTaskReserve.ToString().Substring(0, 1)); int fid = Convert.ToInt32(ManTaskReserve.ToString().Substring(1)); sql = new StringBuilder(string.Format("SELECT F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1, F_NumParam2, F_NumParam3, F_NumParam4, F_NumParam5, F_NumParam6 FROM T_Monitor_Task WHERE (F_ManageTASKKINDINDEX={0}) AND (F_ManageTaskIndex = {1}) order by F_MonitorIndex asc", mti, fid)); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (dv[0]["F_DeviceIndex"].ToString() == StackdeviceIndex.ToString()) { if ((dv[0]["F_DeviceCommandIndex"].ToString() == "2") || (dv[0]["F_DeviceCommandIndex"].ToString() == "4"))//将取,取货 { Zcoor = Convert.ToInt32(dv[0]["F_NumParam1"]); Xcoor = Convert.ToInt32(dv[0]["F_NumParam2"]); } else if (dv[0]["F_DeviceCommandIndex"].ToString() == "5")//送货 { Zcoor = Convert.ToInt32(dv[0]["F_NumParam4"]); Xcoor = Convert.ToInt32(dv[0]["F_NumParam5"]); } } } } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 插入避让指令 /// /// 避让堆垛机 /// 指令 /// 避让到达的条码坐标 /// 避让堆垛机的货物层高度 void InsertStackMutexOrder(int stackno, int order, int Barcodecoor, int layerhigh, int stacksequence, int workstacksequence, int vStack) {//20111020 DataView dv = new DataView(); string sqlstr;//20180827 try { sqlstr = string.Format("SELECT MAX(BarcodeCoor) AS maxcoor, MIN(BarcodeCoor) AS mincoor FROM T_Base_BarcodeCoor where VirtualStack={0}", vStack); dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dv.Count > 0) { if (Barcodecoor > Convert.ToInt32(dv[0]["maxcoor"])) { Barcodecoor = Convert.ToInt32(dv[0]["maxcoor"]); } if (Barcodecoor < Convert.ToInt32(dv[0]["mincoor"])) { Barcodecoor = Convert.ToInt32(dv[0]["mincoor"]); } } else { return; } if (order == 2 || order == 4) { //if (CStaticClass.GetDevicePhotoelectric(stackno, 0) == 0)//20120110 //{ order = 2; //} //else //{ // order = 1; //} } else { //if (CStaticClass.GetDevicePhotoelectric(stackno, 0) == 1)//20120110 //{ order = 3; //} //else //{ // order = 1; //} } int zc = 0, xc = 0, yc = 0, zc1 = 0, xc1 = 0, yc1 = 0; if (stacksequence< workstacksequence) { sql.Clear(); if (CStaticClass.DBFactory == "OracleDBFactory") {//20151120调度系统oracle的特殊语句 sql.Append(string.Format("SELECT ABS(MIN(BarcodeCoor - {0})) AS Expr1, XCoor, ZCoor FROM T_Base_BarcodeCoor where rownum=1 and BarcodeCoor<={0} and layerhigh<={1} and VirtualStack={2} GROUP BY XCoor, ZCoor ORDER BY Expr1", Barcodecoor, layerhigh,vStack)); } else {//20151120调度系统SQLServer的特殊语句 sql.Append(string.Format("SELECT TOP 1 ABS(MIN(BarcodeCoor - {0})) AS Expr1, XCoor, ZCoor FROM T_Base_BarcodeCoor where BarcodeCoor<={0} and layerhigh<={1} and VirtualStack={2} GROUP BY XCoor, ZCoor ORDER BY Expr1", Barcodecoor, layerhigh,vStack)); } dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20151120调度系统oracle的特殊语句 } else { sql.Clear(); if (CStaticClass.DBFactory == "OracleDBFactory") {//20151120调度系统oracle的特殊语句 sql.Append(string.Format("SELECT ABS(MIN(BarcodeCoor - {0})) AS Expr1, XCoor, ZCoor FROM T_Base_BarcodeCoor where rownum=1 and BarcodeCoor>={0} and layerhigh<={1} and VirtualStack={2} GROUP BY XCoor, ZCoor ORDER BY Expr1", Barcodecoor, layerhigh,vStack)); } else {//20151120调度系统SQLServer的特殊语句 sql.Append(string.Format("SELECT TOP 1 ABS(MIN(BarcodeCoor - {0})) AS Expr1, XCoor, ZCoor FROM T_Base_BarcodeCoor where BarcodeCoor>={0} and layerhigh<={1} and VirtualStack={2} GROUP BY XCoor, ZCoor ORDER BY Expr1", Barcodecoor, layerhigh,vStack)); } dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20151120调度系统oracle的特殊语句 } //order =7 运动20181010 order = 7; if (dv.Count > 0) { if (order == 2|| order == 7) { zc = Convert.ToInt32(dv[0]["ZCoor"]); xc = Convert.ToInt32(dv[0]["XCoor"]); //if (xc == 51) xc = 52;//20120110 //if (xc <= 5) //{ // zc = 2; // xc = 2; //} yc = 1; //if (xc == 52) zc = 1; zc1 = Convert.ToInt32(dv[0]["ZCoor"]); xc1 = Convert.ToInt32(dv[0]["XCoor"]); //if (xc1 == 51) xc1 = 52;//20120110 //if (xc1 <= 5) //{ // zc1 = 2; // xc1 = 2; //} yc1 = 1; } else { zc1 = Convert.ToInt32(dv[0]["ZCoor"]); xc1 = Convert.ToInt32(dv[0]["XCoor"]); //if (xc1 == 51) xc1 = 52;//20120110 //if (xc1 <= 5) //{ // zc1 = 2; // xc1 = 2; //} yc1 = 1; //if (xc1 == 52) zc1 = 2; } } else { if (order != 1) { return; } } bool ifcreat = false; dv = dbo.ExceSQL(string.Format("select F_MonitorIndex,F_NumParam2 from T_Monitor_Task where F_DeviceIndex={0} and F_TxtParam='brbrbr'", stackno)).Tables[0].DefaultView; if (dv.Count <= 0) { ifcreat=true; } else { int xcoor = Convert.ToInt32(dv[0]["F_NumParam2"]);// if(Math.Abs(xc - xcoor)>1)// { ifcreat = true; } } if(ifcreat) { int hidx = ccf.GetTempManageIdx(); int hmindx = ccf.GetMonitorIndex(hidx, 2); sql.Remove(0, sql.Length); sql.Append("insert into T_Monitor_Task(F_MonitorTaskLevel,F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex,"). Append("F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_TxtParam,F_AheadDetect) "). Append("values(2,").Append(ccf.GetRouteIDsub(stackno)).Append(","). Append(hidx).Append(",4,").Append(hmindx).Append(",").Append(stackno). Append(",").Append(order).Append(",").Append(zc).Append(",").Append(xc).Append(",").Append(yc).Append(",").Append(zc1).Append(",").Append(xc1).Append(",").Append(yc1).Append(",'brbrbr','-')"); dbo.ExecuteSql(sql.ToString()); } } catch (Exception ex) { CControlError = string.Format("插入互斥堆垛机避让指令时:{0}", ex.StackTrace+ex.Message ); } finally { dv.Dispose(); } } int GetNowDevice(int taskindex) { DataView dvb = new DataView(); try { sql.Remove(0, sql.Length); sql.Append("SELECT F_NumParam1 FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskindex).Append(")"); dvb = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvb.Count > 0) { return Convert.ToInt32(dvb[0]["F_NumParam1"]); } else { return 0; } } catch (Exception ex) { throw ex; } finally { dvb.Dispose(); } } /// /// 设备指令队列中是否存在可以关联堆垛机的取货命令 /// /// 堆垛机 /// 取货货位 /// 关联货位 /// 此次设备指令索引 /// bool IFHaveStackCorrelGetCommand(int Stackdev,string zxy, string Correlzxy,int nottaskindex) { DataView dv = new DataView(); char[] cc = new char[1] { '-' }; string[] zxystr = zxy.Split(cc); string[] zxystrCorrl = Correlzxy.Split(cc); try { int laneway=ccf.GetLaneWayNoFromStack(Stackdev); int corrdev = 0; dv = dbo.ExceSQL(string.Format("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate WHERE (F_LaneIndex = {0}) AND (F_ZXY = '{1}')",laneway,Correlzxy)).Tables[0].DefaultView; if (dv.Count > 0) { corrdev = Convert.ToInt32(dv[0]["F_LaneGateDeviceIndex"]); } object[] ob = new object[8] { Stackdev, nottaskindex, Convert.ToInt32(zxystr[0]), Convert.ToInt32(zxystr[1]),Convert.ToInt32(zxystr[2]), Convert.ToInt32(zxystrCorrl[0]),Convert.ToInt32(zxystrCorrl[1]),Convert.ToInt32(zxystrCorrl[2]) }; dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceIndex = {0}) AND (F_DeviceCommandIndex =4) AND (F_MonitorIndex<>{1}) and (((F_NumParam1 = {2}) AND (F_NumParam2 = {3}) AND (F_NumParam3 = {4})) or ((F_NumParam1 = {5}) AND (F_NumParam2 = {6}) AND (F_NumParam3 = {7})))", ob)).Tables[0].DefaultView; if (dv.Count > 0) {//20120906不是已经等待多叉关联任务 sql.Remove(0, sql.Length);//输送机等待双叉任务号等于堆垛机取货TaskIdx sql.Append("SELECT F_TaskIndex,F_DeviceIndex,F_Remark FROM T_Base_PLC_Ask WHERE (F_TaskIndex =").Append(Convert.ToInt32(dv[0]["F_MonitorIndex"])).Append(") AND (F_DeviceIndex=").Append(corrdev).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return false; } return true; } else { return false; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); cc = null; zxystrCorrl = null; zxystr = null; } } int GetDeviceOrderFromManTaskReserve(int manTaskReserve,int deviceIndex) { DataView dv = new DataView(); try { int mti = Convert.ToInt32(manTaskReserve.ToString().Substring(0, 1)); int fid = Convert.ToInt32(manTaskReserve.ToString().Substring(1)); dv = dbo.ExceSQL(string.Format("SELECT F_DeviceIndex,F_DeviceCommandIndex FROM T_Monitor_Task WHERE (F_ManageTASKKINDINDEX = {0}) AND (F_ManageTaskIndex = {1}) order by F_MonitorIndex asc", mti, fid)).Tables[0].DefaultView; if (dv.Count > 0) { if (deviceIndex == Convert.ToInt32(dv[0]["F_DeviceIndex"])) { return Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]); } else { return -1; } } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } int GetLayerHigh(int Zcoor, int Xcoor,int vStack) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT LayerHigh FROM T_Base_BarcodeCoor WHERE (ZCoor = {0}) AND (XCoor = {1}) and (VirtualStack={2})", Zcoor, Xcoor,vStack)).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0][0]); } else { return 3; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } void InsertUpDeviceUP(int updevice, int Mankind, int ManFID, int mindex) { DataRowView drv = null ; DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT F_MonitorTaskLevel, F_RouteID, F_TxtParam, F_UseAwayFork,F_PriorMonitor FROM T_Monitor_Task WHERE F_MonitorIndex={0}", mindex)).Tables[0].DefaultView; if (dv.Count > 0) { mindex = Convert.ToInt32(dv[0]["F_PriorMonitor"]); drv = dv[0]; } else return; StringBuilder ah = new StringBuilder(); ah.Append("D-").Append(updevice).Append(".7;D").Append(updevice).Append(".0;I").Append(updevice); if (DeviceAndOrderExitInMonitor(Mankind, ManFID, updevice, 9, 0) == false) { #region 生成输送机命令 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,F_UseAwayFork)").Append( "VALUES (").Append(ManFID).Append(",").Append(Mankind).Append(",").Append(mindex).Append(",").Append(drv["F_MonitorTaskLevel"] ).Append(",").Append(updevice).Append(",").Append(9).Append(",").Append(drv["F_RouteID"]).Append(",").Append(0).Append(",").Append(updevice).Append("," + 0 ).Append(",'").Append(ah).Append("','").Append(drv["F_TxtParam"]).Append("','").Append(drv["F_UseAwayFork"]).Append("')"); dbo.ExceSQL(sql.ToString()); #endregion } } catch (Exception ex) { CControlError = "插入顶升机上升指令时:" + ex.StackTrace+ ex.Message ; } finally { dv.Dispose(); drv = null; } } /// /// 判断调度表T_Monitor_Task是否存在调度任务的设备和命令 /// /// 调度任务类型 /// 调度任务索引 /// 设备所引 /// 设备命令 /// public bool DeviceAndOrderExitInMonitor(int Mankind, int ManFID, int DeviceIndex, int Order, int ArrowAddress) { DataView dv = new DataView(); try { if (Order == -1) return true; sql.Remove(0, sql.Length); switch (ccf.GetDeviceKindIdx(DeviceIndex)) { case 1://堆垛机 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 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) { CControlError = "ControlSystem.CControl.DeviceAndOrderExitInMonitor:" +ex.StackTrace+ ex.Message; return false; } finally { dv.Dispose() ; } } /// /// 堆垛机是否存在避让指令正在运行 /// /// /// bool DeviceHandTaskIfRun(int DeviceIndex) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task where F_ManageTASKKINDINDEX=4 and F_DeviceIndex={0} and F_Status>0", DeviceIndex)).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 堆垛机是否存在避让指令等待运行 /// /// /// bool DeviceHandTaskIfWaitRun(int DeviceIndex) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task where F_ManageTASKKINDINDEX=4 and F_DeviceIndex={0} and F_Status=0", DeviceIndex)).Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } bool StackIfExitTask(int stackno,int CONTROLTASKTYPE,int CanSet) { DataView dv = new DataView(); string sqlstr = string.Empty; try { //是否存在brbrbr的任务,存在避让任务,就不要分配了 dv = dbo.ExceSQL(string.Format("select F_MonitorIndex from T_Monitor_Task where F_DeviceIndex={0} and F_TxtParam='brbrbr'", stackno)).Tables[0].DefaultView; if (dv.Count > 0) { return true; } devinfo = Model.CGetInfo.GetDeviceInfo(stackno); int count =0; if (devinfo != null) { if (devinfo.IfCorrelDoubleFork == "1") { count = 1; //sqlstr = string.Format("SELECT DISTINCT F_ManageTaskIndex FROM T_Monitor_Task where F_DeviceIndex={0}", stackno);//按照关联任务 //sqlstr = string.Format("SELECT DISTINCT F_RELATIVECONTORLID FROM T_Monitor_Task,T_Manage_Task where FID = F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX and F_DeviceIndex ={0}", stackno);//按照关联任务 sqlstr = string.Format("SELECT DISTINCT F_RELATIVECONTORLID FROM T_Monitor_Task,T_Manage_Task where FID = F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex = T_Monitor_Task.F_ManageTASKKINDINDEX and F_DeviceIndex ={0} and FCONTROLTASKTYPE={1}", stackno, CONTROLTASKTYPE);//按照关联任务 } else { count = 0; //按照出库,入库,移库 每种类型可以有一个任务 sqlstr = string.Format("SELECT DISTINCT F_ManageTaskIndex FROM T_Monitor_Task,T_Manage_Task where FID=F_ManageTaskIndex and T_Manage_Task. F_ManageTaskKindIndex=T_Monitor_Task.F_ManageTASKKINDINDEX and F_DeviceIndex={0} and FCONTROLTASKTYPE={1}", stackno, CONTROLTASKTYPE); if (CanSet == 1) { return false; } } } //可以存在一条该堆垛机的任务 dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView; if (dv.Count > count) { return true; } else { return false; } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } void GetSpecialStackNo(int virStack, int startZ, int startX, int endZ, int endX, out int stackno, out bool IfCombinedWork) { stackno = 0; IfCombinedWork = false; int Getdevice = 0, Sendevice = 0; char[] fcc = new char[1] { ';' }; char[] dcc = new char[1] { ',' }; char[] hcc = new char[1] { '-' }; DataView dv = new DataView(); string[] zxys; string[] zx_x; string[] x_x; try { dv = dbo.ExceSQL(string.Format("SELECT T_Base_StackInfo.F_StackIndex, T_Base_StackInfo.F_SpecialZXArea,T_Base_StackInfo.F_PRIZXArea FROM T_Base_StackInfo WHERE T_Base_StackInfo.F_Mutex IS NOT NULL and T_Base_StackInfo.F_VirtualStack={0}", virStack)).Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { zxys = dv[i]["F_SpecialZXArea"].ToString().Split(fcc);//1,0-2;2,0-5 for (int d = 0; d < zxys.GetLength(0); d++) { zx_x = zxys[d].Split(dcc); if (zx_x.GetLength(0) > 1) { for (int h = 1; h < zx_x.GetLength(0); h++) { x_x = zx_x[h].Split(hcc); if (x_x.GetLength(0) > 1) { if ((Convert.ToInt32(zx_x[0]) == startZ) && (startX >= Convert.ToInt32(x_x[0])) && (startX <= Convert.ToInt32(x_x[1]))) { Getdevice = Convert.ToInt32(dv[i]["F_StackIndex"]); } if ((Convert.ToInt32(zx_x[0]) == endZ) && (endX >= Convert.ToInt32(x_x[0])) && (endX <= Convert.ToInt32(x_x[1]))) { Sendevice = Convert.ToInt32(dv[i]["F_StackIndex"]); } } } } } } stackno = Getdevice; if (Getdevice != Sendevice) { devinfo = Model.CGetInfo.GetDeviceInfo(Getdevice); if (Sendevice == devinfo.VirtualStack) { IfCombinedWork = true; } else { IfCombinedWork = false; } } else { IfCombinedWork = false; } } catch (Exception ex) { CControlError = "分配堆垛机号GetSpecialStackNo:" + ex.StackTrace+ex.Message ; } finally { } } void GetWorkStackNo(int lane, string getcell,string sendcell, out string getstacknos,out string sendstacknos, out bool IfCombinedWork,out int workstackcount) { getstacknos = string.Empty ; IfCombinedWork = false; sendstacknos = string.Empty; workstackcount = 0; string sql = string.Empty; DataView dv = new DataView(); char[] cc = new char[1] { ';' }; string[] getstack ; string[] sendstack; int getlanegate,sendlanegate;//判读取送货位置是否为站台 try { string getstacks; string sendstacks; //getstacks = GetWorkStackNoFromCell(lane, getcell, out getlanegate); //sendstacks = GetWorkStackNoFromCell(lane, sendcell, out sendlanegate); //强制指定堆垛机 GetWorkStackNoFromCell(lane, getcell, sendcell, out getstacks, out sendstacks); getstack = getstacks.Split(cc);//获得可执行取货货位的堆垛机编号 sendstack = sendstacks.Split(cc);//获得可执行送货货位的堆垛机编号 //分析堆垛机的关系,找出执行任务的流程 int getstackcount = getstack.Length;//获得堆垛机数量 int sendstackcount = sendstack.Length;//获得堆垛机数量 //货位可以分为4类;11001、11001;11002、11002;11003、11003 #region 单台可取,单台可送 if (getstackcount == 1 && sendstackcount == 1)//只有单台堆垛机能进行取送货 { if (getstack[0] == sendstack[0])//在堆垛机的独立工作区域 { getstacknos = getstack[0]; sendstacknos = sendstack[0]; IfCombinedWork = false; workstackcount = 1; } else//需要倒换堆垛机 { getstacknos = getstack[0]; sendstacknos = sendstack[0];//最终执行任务的堆垛机,需要二次选择堆垛机 IfCombinedWork = true; workstackcount = 3; } return; } #endregion #region 多台可取、多台可送 if (getstackcount>1 && sendstackcount >1)//多堆垛机能进行取送货 { if (getstacks == sendstacks)//在多台堆垛机的都能工作的区域,需要二次选择堆垛机 { getstacknos = getstacks;//返回多台堆垛机的组合 sendstacknos = sendstacks; IfCombinedWork = false; workstackcount = 1; } else { for (int i = 0; i < getstackcount; i++) { string stack1 = getstack[i]; for (int k = 0; k < sendstackcount; k++) { string stack2 = sendstack[k]; if (stack1 == stack2)//选择都能到当达的堆垛机11002 { getstacknos = stack1; sendstacknos = stack2; IfCombinedWork = false; workstackcount = 1; } } } } return; } #endregion #region 单台可取,多台可送 if (getstackcount == 1 && sendstackcount > 1)// { for (int i = 0; i < getstackcount; i++) { int stack1 =Convert.ToInt32( getstack[i]); for (int k = 0; k < sendstackcount; k++) { int stack2 = Convert.ToInt32( sendstack[k]); if (stack1 == stack2) { getstacknos = stack1.ToString(); sendstacknos = stack2.ToString(); IfCombinedWork = false; workstackcount = 1; return; } if (1==Math.Abs(stack1 -stack2))//相邻的堆垛机 { getstacknos = stack1.ToString(); sendstacknos = stack2.ToString(); IfCombinedWork = true; workstackcount = 2; } } } return; } #endregion #region 多台可取,单台可送 if (getstackcount >1 && sendstackcount == 1)// { for (int i = 0; i < getstackcount; i++) { int stack1 = Convert.ToInt32(getstack[i]); for (int k = 0; k < sendstackcount; k++) { int stack2 = Convert.ToInt32(sendstack[k]); if (stack1 == stack2) { getstacknos = stack1.ToString(); sendstacknos = stack2.ToString(); IfCombinedWork = false; workstackcount = 1; return; } if (1 == Math.Abs(stack1 - stack2))//相邻的堆垛机 { getstacknos = stack1.ToString(); sendstacknos = stack2.ToString(); IfCombinedWork = true; workstackcount = 2; } } } return; } #endregion } catch (Exception ex) { CControlError = "分配堆垛机号GetWorkStackNo:" + ex.StackTrace + ex.Message; } finally { } } string GetWorkStackNoFromCell(int lane, string cellcode,out int lanegate) { string stackno = string.Empty; string sql = string.Empty; DataView dv = new DataView(); lanegate = 0; try { sql = string.Format("SELECT FWorkStack FROM ST_CELL where FCELLCODE='{0}' and FLaneWay={1}", cellcode, lane); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { stackno = Convert.ToString(dv[0]["FWorkStack"]); } else { sql = string.Format("SELECT F_WorkStack,F_LaneGateDeviceIndex FROM T_Base_Lane_Gate where F_ZXY='{0}'and F_LaneIndex={1}", cellcode, lane); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { stackno = Convert.ToString(dv[0]["F_WorkStack"]); lanegate = Convert.ToInt32(dv[0]["F_LaneGateDeviceIndex"]); } } return stackno; } catch (Exception ex) { CControlError = "分配堆垛机号GetWorkStackNo:" + ex.StackTrace + ex.Message; return stackno; } finally { dv.Dispose(); } } void GetWorkStackNoFromCell(int lane, string getcellcode, string sendcellcode, out string getstack,out string sendstack) { string stackno = string.Empty; string sql = string.Empty; DataView dv = new DataView(); string forcesgettackno = ""; string forcessendtackno = ""; getstack = ""; sendstack = ""; //lanegate = 0; try { //获得取货货位相关的工作堆垛机和强制工作堆垛机 sql = string.Format("SELECT FWorkStack FROM ST_CELL where FCELLCODE='{0}' and FLaneWay={1}", getcellcode, lane); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { getstack = Convert.ToString(dv[0]["FWorkStack"]); } else { sql = string.Format("SELECT F_WorkStack,F_LaneGateDeviceIndex,F_ForceWorkStack FROM T_Base_Lane_Gate where F_ZXY='{0}'and F_LaneIndex={1}", getcellcode, lane); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { getstack = Convert.ToString(dv[0]["F_WorkStack"]); forcesgettackno = Convert.ToString(dv[0]["F_ForceWorkStack"]); } } //获得送货货位相关的工作堆垛机和强制工作堆垛机 sql = string.Format("SELECT FWorkStack FROM ST_CELL where FCELLCODE='{0}' and FLaneWay={1}", sendcellcode, lane); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { sendstack = Convert.ToString(dv[0]["FWorkStack"]); } else { sql = string.Format("SELECT F_WorkStack,F_LaneGateDeviceIndex,F_ForceWorkStack FROM T_Base_Lane_Gate where F_ZXY='{0}'and F_LaneIndex={1}", sendcellcode, lane); dv = dbo.ExceSQL(sql).Tables[0].DefaultView; if (dv.Count > 0) { sendstack = Convert.ToString(dv[0]["F_WorkStack"]); forcessendtackno = Convert.ToString(dv[0]["F_ForceWorkStack"]); } } if(forcesgettackno!=""&& forcessendtackno!="") { getstack = forcesgettackno; sendstack = forcessendtackno; } //return stackno; } catch (Exception ex) { CControlError = "分配堆垛机号GetWorkStackNo:" + ex.StackTrace + ex.Message; //return stackno; } finally { dv.Dispose(); } } int GetPRIStackNo(int virStack, int startZ, int startX, int endZ, int endX) { int Getdevice = 0; char[] fcc = new char[1] { ';' }; char[] dcc = new char[1] { ',' }; char[] hcc = new char[1] { '-' }; DataView dv=new DataView(); string[] zxys; string[] zx_x; string[] x_x; try { dv = dbo.ExceSQL(string.Format("SELECT T_Base_StackInfo.F_StackIndex, T_Base_StackInfo.F_SpecialZXArea,T_Base_StackInfo.F_PRIZXArea FROM T_Base_StackInfo WHERE T_Base_StackInfo.F_Mutex IS NOT NULL and T_Base_StackInfo.F_VirtualStack={0}", virStack)).Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { zxys = dv[i]["F_PRIZXArea"].ToString().Split(fcc);//1,0-2;2,0-5 for (int d = 0; d < zxys.GetLength(0); d++) { zx_x = zxys[d].Split(dcc); if (zx_x.GetLength(0) > 1) { for (int h = 1; h < zx_x.GetLength(0); h++) { x_x = zx_x[h].Split(hcc); if (x_x.GetLength(0) > 1) { if ((Convert.ToInt32(zx_x[0]) == startZ) && (startX >= Convert.ToInt32(x_x[0])) && (startX <= Convert.ToInt32(x_x[1]))) { Getdevice = Convert.ToInt32(dv[i]["F_StackIndex"]); } } } } } } return Getdevice; } catch (Exception ex) { CControlError = "分配堆垛机号GetPRIStackNo:" + ex.StackTrace+ex.Message ; return Getdevice; } finally { dv.Dispose(); } } /// /// 获取可关联的任务进行配多叉关联 /// /// 巷道出入口信息 /// 设备指令索引 /// 控制任务类型 /// 控制任务类别 /// 控制任务编号 /// 当前时间 /// bool GetCorrManageTask(string[] DevLanewayIOInfo, int TaskIdx, int CONTROLTASKTYPE,int mti,int fid,string dtime,out bool IfCorrTaskEnd) { IfCorrTaskEnd = false; DataView dv = new DataView(); try { sql.Remove(0, sql.Length);//输送机等待双叉任务号等于堆垛机取货TaskIdx sql.Append("SELECT F_TaskIndex,F_DeviceIndex,F_Remark FROM T_Base_PLC_Ask WHERE (F_TaskIndex =").Append(Convert.ToInt32(TaskIdx)).Append(") AND (F_Remark <> '') AND (F_DeviceIndex=").Append(DevLanewayIOInfo[0]).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { #region 有任务等待关联任务 string zxy = DevLanewayIOInfo[9]; int waitdevice = Convert.ToInt32(dv[0]["F_DeviceIndex"]); //DevLanewayIOInfo[8]包含多个关联设备信息逐一检查20120906 char[] cc = new char[1] { ';' }; string[] CorrStations = DevLanewayIOInfo[8].Split(cc); foreach (string cs in CorrStations) { DevLanewayIOInfo = ccf.GetLanewayDeviceInfoFromStackDev(devinfo.DeviceIndex, Convert.ToInt32(cs));//关联站台的信息 string Correlzxy = DevLanewayIOInfo[9]; DateTime dtq = Convert.ToDateTime(dv[0]["F_Remark"]).AddSeconds(Convert.ToInt32(CStaticClass.DoubleForkWaitTime)); if ((GetIOControlStatus(TaskIdx) != Model.CGeneralFunction.TASKSINGLEFORKRUN) && (dtq > DateTime.Now)) { #region 没超时,不是单叉运行 //20111231没超时,不是单叉运行 //查找本地管理任务做多叉关联配对,关联任务分配货叉 int mfid = GetEnableDoubleForkManageTask(CONTROLTASKTYPE, devinfo.DeviceIndex, int.Parse(DevLanewayIOInfo[0]), fid); if (mfid > 0) { #region 双叉同为前极限后者后极限不关联,单独执行 if ((IfInSameLimitX(fid, mfid, mti) == true) && (mti == 1)) { sql.Remove(0, sql.Length); sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(fid).Append(")"); dboM.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKSINGLEFORKRUN).Append(" WHERE (CONTROL_ID = ").Append(mfid).Append(")"); dboM.ExecuteSql(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("单叉执行原因", TaskIdx.ToString(), devinfo.DeviceIndex.ToString(), "双叉同为前极限后者后极限不关联,单独执行"); IfCorrTaskEnd = true; return true; } #endregion sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(fid).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(fid); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set F_RELATIVECONTORLID=").Append(fid).Append(" where F_ManageTaskKindIndex=").Append(mti).Append(" and FID=").Append(mfid); dbo.ExecuteSql(sql.ToString()); //判断是否为1叉的关联任务:是,配叉结束 if (ccf.GetManageTaskStackFork(mti, mfid) == "1") { sql.Remove(0, sql.Length); sql.Append("update T_Base_PLC_Ask set F_Remark='' where (F_TaskIndex=").Append(TaskIdx).Append(")"); dbo.ExecuteSql(sql.ToString()); IfCorrTaskEnd = true; } continue; } else { //20110505 AheadDetectUnallow.Append(devinfo.DeviceIndex.ToString() + "双叉堆垛机等待多叉关联取货任务!"); UpdateAheadDetectUnallow(AheadDetectUnallow, TaskIdx); continue; } #endregion } else { #region 20111230单叉执行极限货位需要倒货叉 #region 堆垛机在顶升机取单叉任务,验证是否需要换货叉 string ChangeForkCell = ccf.IfLimitCellChangeFork(TaskIdx, devinfo.DeviceIndex); if (ChangeForkCell != "-")//主任务需要倒换货叉 { ccf.ChangeEndCellCode(TaskIdx, ChangeForkCell, devinfo.DeviceIndex); sql.Remove(0, sql.Length); sql.Append("update T_Base_PLC_Ask set F_TaskIndex=0,F_Remark='' where (F_DeviceIndex=").Append(waitdevice).Append(")"); dbo.ExecuteSql(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("单叉执行原因", TaskIdx.ToString(), devinfo.DeviceIndex.ToString(), "主任务需要倒换货叉"); IfCorrTaskEnd = true; return true; } #endregion #endregion if ((IFHaveStackCorrelGetCommand(devinfo.DeviceIndex, zxy, Correlzxy, TaskIdx) == true) && (GetIOControlStatus(TaskIdx) != Model.CGeneralFunction.TASKSINGLEFORKRUN))//20101124 {//队列中有可以关联的任务,重新计时 sql.Remove(0, sql.Length); sql.Append("update T_Base_PLC_Ask set F_Remark='").Append(dtime).Append("' where (F_DeviceIndex=").Append(waitdevice).Append(")"); dbo.ExecuteSql(sql.ToString()); //20110505 AheadDetectUnallow.Append(devinfo.DeviceIndex.ToString() + "双叉堆垛机在双叉对等站台取货" + ",等待多叉关联任务!"); UpdateAheadDetectUnallow(AheadDetectUnallow, TaskIdx); return false; } else {//超时或者管理强制执行单叉任务 sql.Remove(0, sql.Length); sql.Append("update T_Base_PLC_Ask set F_TaskIndex=0,F_Remark='' where (F_DeviceIndex=").Append(waitdevice).Append(")"); dbo.ExecuteSql(sql.ToString()); CommonClassLib.CCarryConvert.WriteDarkCasket("单叉执行原因", TaskIdx.ToString(), devinfo.DeviceIndex.ToString(), "超时或者管理强制执行单叉任务"); IfCorrTaskEnd = true; return true; } } } #endregion } return false; } catch (Exception ex) { CControlError = "获取堆垛机关联配叉GetCorrManageTask:"+ex.StackTrace+ex.Message ; return false; } finally { dv.Dispose(); } } } }