using System.Runtime.InteropServices; using System.Collections.Generic; using System.Text; using System.Data; using System; using CommLayerFactory; using ICommLayer; using DBFactory; using CommonLib; using System.Security.Cryptography; using System.Linq; namespace WcfControlMonitorLib { /// /// Creator:Richard.liu /// 监控调度类 /// public class CControl { int StackMutexXCoor = 4800; int minStackMutexXCoor = 2400; int StackZeroXCoor = 1950; StringBuilder AheadDetectUnallow = new StringBuilder();//20110505 StringBuilder sql = new StringBuilder(); char[] dd = new char[1] { '.' };//20101124 string[] DS;//20101124 private Object thisLock = new Object(); DBOperator dbo = CStaticClass.dbo; DBOperator dboM = CStaticClass.dboM; Model.MDevice devinfo; 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; public static int send_intercounts = 0; public static int send_intercountsO = 0; int safe_distance = CStaticClass.Safe_distance; int Safe_distanceRGV = CStaticClass.Safe_distanceRGV; //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 { //send_intercounts += 1; //if (send_intercounts >= 10)//2s 沈北波森2期定时更新设备状态 //{ // Model.MDevice devinfo80001 = Model.CGetInfo.GetDeviceInfo(80001); // Model.MDevice devinfo80002 = Model.CGetInfo.GetDeviceInfo(80002); // Model.MDevice devinfo80003 = Model.CGetInfo.GetDeviceInfo(80003); // StringBuilder[] wv = { new StringBuilder("2") }; // StringBuilder[] witemnames = { new StringBuilder("") }; // if (send_intercountsO == 0) // { // witemnames[0].Clear(); // witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo80001.Dbw2Address + 4)).Append(",b");//20130510 // wv[0].Clear(); // wv[0].Append(1); // sdo = CommLayerFactory.CommModeCreate.CreateSendDeviceOrder(devinfo80001.DeviceIndex); // sdo.WriteDBData(witemnames, wv, devinfo80001.S7Connection); // witemnames[0].Clear(); // witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo80002.Dbw2Address + 4)).Append(",b");//20130510 // wv[0].Clear(); // wv[0].Append(1); // sdo = CommLayerFactory.CommModeCreate.CreateSendDeviceOrder(devinfo80002.DeviceIndex); // sdo.WriteDBData(witemnames, wv, devinfo80002.S7Connection); // //垛机无刷新问题不用订阅组内定期更新某个开关变量 // //witemnames[0].Clear(); // //witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo80003.Dbw2Address + 4)).Append(",b");//20130510 // //wv[0].Clear(); // //wv[0].Append(1); // //sdo = CommLayerFactory.CommModeCreate.CreateSendDeviceOrder(devinfo80003.DeviceIndex); // //sdo.WriteDBData(witemnames, wv, devinfo80003.S7Connection); // } // if (send_intercountsO == 1) // { // witemnames[0].Clear(); // witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo80001.Dbw2Address + 4)).Append(",b");//20130510 // wv[0].Clear(); // wv[0].Append(0); // sdo = CommLayerFactory.CommModeCreate.CreateSendDeviceOrder(devinfo80001.DeviceIndex); // sdo.WriteDBData(witemnames, wv, devinfo80001.S7Connection); // witemnames[0].Clear(); // witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo80002.Dbw2Address + 4)).Append(",b");//20130510 // wv[0].Clear(); // wv[0].Append(0); // sdo = CommLayerFactory.CommModeCreate.CreateSendDeviceOrder(devinfo80002.DeviceIndex); // sdo.WriteDBData(witemnames, wv, devinfo80002.S7Connection); // //witemnames[0].Clear(); // //witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo80003.Dbw2Address + 4)).Append(",b");//20130510 // //wv[0].Clear(); // //wv[0].Append(0); // //sdo = CommLayerFactory.CommModeCreate.CreateSendDeviceOrder(devinfo80003.DeviceIndex); // //sdo.WriteDBData(witemnames, wv, devinfo80003.S7Connection); // } // if (send_intercountsO == 0) // { // send_intercountsO = 1; // } // else if (send_intercountsO == 1) // { // send_intercountsO = 0; // } // send_intercounts = 0; //} 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的特殊语句 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"); } 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") {//20100108 #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 if (DeviceKind == 6) {//20100512 AGV #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) == 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); foreach (int i in mforkmonitorinfo.Keys) { df = mforkmonitorinfo[i]; if (df != null) { if (AheadDetectOK(Convert.ToInt32(df[0]), df[1]) == 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等 #region 非AGV设备:输送机、堆垛机、RGV等 //第一个设备是否被占用,RGV和堆垛机要考虑分步控制时,没执行完连续动作时不接受新的调度任务 //add for TJBS if (_LockedState != 0 && checkLockedstate == true) { UpdateAheadDetectUnallow(new StringBuilder(_DeviceIdx.ToString() + "被任务锁定" + _LockedState.ToString().Substring(1)), minMidx); return true; } if (((_LockedState == 0) && (checkLockedstate == true)) || (checkLockedstate == false)) { #region 检查RGV、堆垛机等是否被调度任务预约F_ManTaskReserve if (_ManTaskReserve > 0 && DeviceKind != 2)//20140309 { 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检测(检测开关编号组“;”) if (AheadDetectOK(minMidx, _AheadDetect) == true)//提前检测通过 { devinfo = Model.CGetInfo.GetDeviceInfo(_DeviceIdx); if (_DeviceIdx == devinfo.VirtualStack && devinfo.DeviceKind == 1) { AssignStackNo(_DeviceIdx, minMidx, ManageKindIdx, ManageTaskIdx); return true;//20120906 } #region 多叉堆垛机检测,能同步的DoubleFork是否AheadDetectOK //20100323 devinfo = Model.CGetInfo.GetDeviceInfo(_DeviceIdx); if (devinfo.IfCorrelDoubleFork == "1" && devinfo.DeviceKind == 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); foreach (int i in mforkmonitorinfo.Keys) { if (Array.IndexOf(synctask, i) >= 0) {//20120906 df = mforkmonitorinfo[i]; if (df != null) { if (AheadDetectOK(Convert.ToInt32(df[0]), df[1]) == 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 //检查同步运行的关联设备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); 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) { 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); int mti = ccf.GetManageTaskKindIndexFromMonitor(TaskIdx); int DeviceKind = ccf.GetDeviceKindIdx(DeviceIdx);//20100617 int order = ccf.GetDeviceOrderFromMonitor(TaskIdx); int DeviceOrder = _DeviceOrder;//设备命令 int StartDevice = _StartDevice;//当前调度任务起点 int EndDevice = _EndDevice;//当前调度任务终点 //add for TJBS int CONTROLTASKTYPE = ccf.GetFCONTROLTASKTYPEFromManageTask(mti, fid); int intN1 = _NumParam1; int intN2 = _NumParam2; int intN3 = _NumParam3; int intN4 = _NumParam4; int intN5 = _NumParam5; int intN6 = _NumParam6; int statuss = ccf.GetManageTaskStatus(fid, TaskIdx); #region 补充顶升机不在高位的顶升命令 //if ((DeviceIdx >= 35000) && (DeviceIdx <= 35003)&&(order ==4)) //{//20120110补充顶升机不在高位的顶升命令 // if (_AheadDetect.IndexOf("D-32036.6") >= 0) // { // if(CStaticClass.GetDevicePhotoelectric(32036,7)==1) // { // InsertUpDeviceUP(32036, mti, fid,minMidx); // } // } // else if (_AheadDetect.IndexOf("D-32049.6") >= 0) // { // if (CStaticClass.GetDevicePhotoelectric(32049, 7) == 1) // { // InsertUpDeviceUP(32049, mti, fid, minMidx); // } // } //} #endregion //20100706 devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIdx); ////add for TJBS FIRE //Model.MDevice devinfoFire; //devinfoFire = Model.CGetInfo.GetDeviceInfo(12059); //if (devinfoFire.SplitByte_6 ==1) //{ // AheadDetectUnallow.Append("Fire WARING!"); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false; //} if (DeviceIdx==11001 || DeviceIdx ==11002) { if (order ==4) { if (_NumParam4 == 2 && _NumParam5 == 53 && _NumParam6 == 1) { DataView dvVirP = new DataView(); sql.Remove(0, sql.Length); sql.Append("SELECT F_SLocked from T_Base_Device where F_DeviceIndex = 12223 "); dvVirP = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (Convert.ToInt32(dvVirP[0]["F_SLocked"]) != 0) { AheadDetectUnallow.Append("中转站台:2-53-1有货!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } } //if (order == 5) //{ // if (_NumParam1 == 2 && _NumParam2 == 53 && _NumParam3 == 1) // { // DataView dvVirP = new DataView(); // sql.Remove(0, sql.Length); // sql.Append("SELECT F_SLocked from T_Base_Device where F_DeviceIndex = 12223 "); // dvVirP = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; // if (Convert.ToInt32(dvVirP[0]["F_SLocked"]) != 0) // { // AheadDetectUnallow.Append("中转站台:2-53-1有货!"); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false; // } // } //} } //add for TJBS if (DeviceKind == 1 || DeviceKind == 4) { if (devinfo.SplitByte_7==1) { AheadDetectUnallow.Append("安全门打开任务不允许发送!"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } if (ccf.GetBarCodeFromMonitor(minMidx) == "brbrbr")//避让指令检测条件20120110 { int zc = 1, xc = 0; GetStackRunX_Zcoor(DeviceIdx, out xc, out zc); if (devinfo.RunState == 0 && xc == 0) { return true; } else { return false; } } if (DeviceKind == 1 && order == 1)//回原点检测条件20120110 { if (devinfo.RunState == 0) { return true; } else { return false; } } //检测(检测开关编号组“;”) DataView dv = new DataView(); DataView dvdv = 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 高端设备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 add for TJBS 双向控制 //入库两节输送线是空闲 无货 //if (order == 4 && "11001,11002,11003".Contains(DeviceIdx.ToString())&& CONTROLTASKTYPE == 2) //{ // string strCheckdevicee = string.Empty; // switch (EndDevice) // { // case 12108: // strCheckdevicee = "12109;12108"; // break; // case 12113: // strCheckdevicee = "12113;12112"; // break; // case 12114: // strCheckdevicee = "12114;12115"; // break; // case 12118: // strCheckdevicee = "12118;12119"; // break; // case 12127: // strCheckdevicee = "12127;12126"; // break; // case 12122: // strCheckdevicee = "12122;12123"; // break; // case 12059: // strCheckdevicee = "12059;12060"; // break; // case 12063: // strCheckdevicee = "12064;12063"; // break; // case 12065: // strCheckdevicee = "12066;12065"; // break; // case 12069: // strCheckdevicee = "12069;12070"; // break; // case 12077: // strCheckdevicee = "12078;12077"; // break; // case 12073: // strCheckdevicee = "12074;12073"; // break; // case 12079: // strCheckdevicee = "12079;12080"; // break; // } // string[] checkGoods = strCheckdevicee.Split(';'); // int goodscounts = 0; // for (int n = 0; n < checkGoods.Length; n++) // { // if (ccf.GetTransDeviceGoodsCounts(checkGoods[n].ToString()) > 0) // { // goodscounts = goodscounts + ccf.GetTransDeviceGoodsCounts(checkGoods[n].ToString()); // } // } // if (goodscounts > 0) // { // AheadDetectUnallow.Append("终点为" + EndDevice.ToString() + "存在出库站台有货"); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false; // } //} #endregion #region add for TJBS 均分逻辑 //DataView dvChange = dbo.ExceSQL("SELECT F_Change FROM T_Monitor_Task where F_Change =1 and F_MONITORINDEX=" + TaskIdx).Tables[0].DefaultView; //if (DeviceIdx == 12043 && order == 6 && EndDevice == 12041 && intN4 == 12048 && statuss ==0&& dvChange.Count == 0) //{ // Model.MDevice devinfo12058; // devinfo12058 = Model.CGetInfo.GetDeviceInfo(12058); // Model.MDevice devinfo12048; // devinfo12048 = Model.CGetInfo.GetDeviceInfo(12048); // Model.MDevice devinfo12055; // devinfo12055 = Model.CGetInfo.GetDeviceInfo(12055); // int intChooseDevice = 0; // //简单写 12058 能缓存2 12055 缓存3 12048 能缓存 5 // //按顺序判断了 // string strCheckEnddevice = "12058;12055;12048"; // int intUpN4 = 0; // int intTaskCount12058 = ccf.GetTransDeviceGoodsCounts("12058"); // int intTaskCount12055 = ccf.GetTransDeviceGoodsCounts("12055"); // int intTaskCount12048 = ccf.GetTransDeviceGoodsCounts("12048"); // string[] checkGoods = strCheckEnddevice.Split(';'); // for (int i = 0; i < checkGoods.Length; i++) // { // int intTaskCount = Convert.ToInt32(dbo.GetSingle("select count(*) from T_MONITOR_TASK where F_NUMPARAM4 = " + checkGoods[i].ToString() + " and F_STATUS <> 0 and F_DEVICECOMMANDINDEX = 6")); // if (Convert.ToInt32(checkGoods[i]) == 12058) // { // intTaskCount12058 += intTaskCount; // } // else if (Convert.ToInt32(checkGoods[i]) == 12055) // { // intTaskCount12055 += intTaskCount; // } // else if (Convert.ToInt32(checkGoods[i])==12048) // { // intTaskCount12048 += intTaskCount; // } // } // if (intTaskCount12058 <=2 && devinfo12058.RunState <=1) // { // intChooseDevice = 12058; // } // else if (intTaskCount12055 <= 2 && devinfo12055.RunState <= 1) // { // intChooseDevice = 12055; // } // else if (intTaskCount12048 <= 4 && devinfo12048.RunState <= 1) // { // intChooseDevice = 12048; // } // if (intChooseDevice !=0) // { // object[] obtt = new object[5] { intChooseDevice, fid, TaskIdx, 0,1 }; // // 替换小任务终点位置 // dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NUMPARAM4 = {0} ,F_Change = {4} WHERE F_MANAGETASKINDEX={1} and (F_MONITORINDEX ={2}) and (F_STATUS = {3}) ", obtt)); // sql.Remove(0, sql.Length); // sql.Append("update T_Base_Device set F_LockedState=0,F_MANTASKRESERVE = 0,F_HaveGoods=0 where F_DEVICEINDEX=").Append(DeviceIdx); // dbo.ExceSQL(sql.ToString()); // return false; // //提前检测 不用改 // //object[] ob = new object[4] { strAhead, FID, TaskIdx, 0 }; // //// 替换小任务终点位置 // //dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AHEADDETECT = '{0}' WHERE F_MANAGETASKINDEX={1} and (F_MONITORINDEX ={2}) and (F_STATUS = {3})", ob)); // } // else // { // if (intN4 == 12048) // { // AheadDetectUnallow.Append("No available platforms exist"); // UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); // return false; // } // } //} #endregion #region 202410 HSCP - 出库任务检查相关站台的出入库属性 if (CONTROLTASKTYPE == 2) { dv = dbo.ExceSQL("select * from T_Base_Station_Model where F_CheckStation = " + EndDevice).Tables[0].DefaultView; if (dv.Count > 0) { // 站台设置检查,检查模式 int StationMode = Convert.ToInt32(dv[0]["F_Station_Type"]); if (StationMode == 1) { AheadDetectUnallow.Append(EndDevice.ToString()).Append("站台入库模式"); UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false;// } } } #endregion #region 提前检测信息处理 if ((_AheadDetect != "") && (_AheadDetect != null)) { char[] cc = new char[1]; cc[0] = ';'; string[] AheadDetect = _AheadDetect.Split(cc); 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) {//机台需要从管理设备表读取;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()); idev = Convert.ToInt32(idev.ToString().Substring(0, 5));// } States = CStaticClass.GetDeviceState(idev); // 202411 HSCP 检查设备是否空闲,去除虚拟设备 if (States != null && idev != 15310 && idev != 15320) { int kind = ccf.GetDeviceKindIdx(Convert.ToInt32(AheadDetect[i].Trim().Substring(1))); //if ((States[1] == 5) && (ccf.GetDeviceKindIdx(Convert.ToInt32(AheadDetect[i].Trim().Substring(1))) == 2)) //{//20120409只有输送机的完成可作为空闲 // States[1] = 0; //} if ((DeviceHandTaskIfRun(Convert.ToInt32(AheadDetect[i].Trim().Substring(1))) == true) && (kind == 1)) {//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 检测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 检测积放线正在执行任务个数 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())) { s = s + 1; AheadDetectUnallow.Append(AheadDetect[i].Trim().Substring(1) + "被调度任务:").Append(obr.ToString()).Append("预约!"); } 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的开关量检测 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; default: break; } AheadDetectUnallow.Append(Convert.ToInt32((-devicebyte)).ToString() + kg.ToString() + "光电开关不遮挡!"); } fs = fs & fsn; #endregion } else {// #region 正数值不能为1的开关量检测 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 双伸位的堆垛机在执行起点是里位(1,4排)的任务时,判读是否有起点是外位(2,3排)的任务 送货到货位时(终点为2,3)判断有没有(1,4)的任务,控制近远叉取送货先后 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; tempZ = getZ % 4; if (tempZ == 1 || tempZ == 0)//里位取货时,要判读是否有外位的取货任务 {//获取外位坐标 if (tempZ == 1) { newZ = getZ + 1; } else { newZ = getZ - 1; } neighborzxy = string.Format("{0:D3}-{1:D3}-{2:D3}", 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; tempZ = sendZ % 4; if (tempZ == 2 || tempZ == 3)//外位送货时,要判读是否有里位的送货任务 {//获取里位坐标 if (tempZ == 2) { newZ = sendZ - 1; } else { newZ = sendZ + 1; } neighborzxy = string.Format("{0:D3}-{1:D3}-{2:D3}", 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 非手工任务,如果有手工任务等待执行先执行手工任务 if (mti != 4) {//20120405 if (DeviceHandTaskIfWaitRun(devinfo.DeviceIndex) == true) { AheadDetectUnallow.Append(devinfo.DeviceIndex.ToString() + "手工任务或者避让任务等待运行!"); s += 1; } } #endregion #region 检测向管理申请入库任务条码和PLCASK记录是否匹配 //20130709增加输送站台向管理申请入库任务,或者条码比对的任务,扫描后人工随意搬走箱子的保护,入库任务条码和PLCAsk记录的不相同不再执行任务 //sql.Remove(0, sql.Length); //sql.Append("SELECT T_Base_Device.F_DeviceIndex 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_BindingDevice = ").Append(devinfo.DeviceIndex); //object obr1 = dbo.GetSingle(sql.ToString()); //if (obr1 != null) //{ // sql.Remove(0, sql.Length); // sql.Append("SELECT F_BarCode FROM T_Base_PLC_Ask where F_BindingDevice=").Append(devinfo.DeviceIndex); // object obr = dbo.GetSingle(sql.ToString()); // if (obr != null) // { // 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("不匹配!"); // } // } //} #endregion if ((s != 0) || (fs != 1)) { UpdateAheadDetectUnallow(AheadDetectUnallow, minMidx); return false; } } #endregion #region 有互斥设备的堆垛机20111020 if (DeviceKind == 1 && devinfo.VirtualStack > 0) { int mutex = ccf.GetStackMutexDevice(DeviceIdx); if (mutex > 0) {//检查互斥设备空闲时的位置和运行的目标位置 Model.MDevice mutexdev = Model.CGetInfo.GetDeviceInfo(mutex); int mutexDeviceLockedState = ccf.GetDeviceLockedState(mutex); if (mutexDeviceLockedState == -1) return true;//20120110 int mutexManTaskReserve = ccf.GetManTaskReserve(mutex); if ((mutexdev.RunState == 0) && (mutexManTaskReserve <= 0) && (mutexDeviceLockedState == 0)) {// #region mutex空闲、无任务、无管理任务预约锁 int xcoor = Model.CGeneralFunction.GetXCoorFromMonitor(TaskIdx, DeviceIdx, ccf.GetDeviceOrderFromMonitor(TaskIdx)); int zcoor = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIdx, DeviceIdx, ccf.GetDeviceOrderFromMonitor(TaskIdx)); int BCcoor = GetBarcodeCoor(xcoor, zcoor); if (mutex > DeviceIdx) {//mutex=35002 if ((BCcoor + StackMutexXCoor) >= mutexdev.XCoor)//mdev.XCoor如果是条码带值需要转换为列值 { InsertStackMutexOrder(mutex, 2, (BCcoor + StackMutexXCoor), 5); if (mutexdev.XCoor > 52000)//20120110 { return true; } else { if (devinfo.XCoor <= mutexdev.XCoor - minStackMutexXCoor) { return true; } else { return false; } } } } else {//mutex35001 if (BCcoor >= (StackMutexXCoor + StackZeroXCoor)) { BCcoor = (BCcoor - StackMutexXCoor); } else { return true;//对开报警吧,管理下任务错了,或者分配堆垛机设备错误 } if (BCcoor <= mutexdev.XCoor)//mdev.XCoor如果是条码带值需要转换为列值 { InsertStackMutexOrder(mutex, 2, BCcoor, 5); if (mutexdev.XCoor < 4481)//20120110 { return true; } else { if (devinfo.XCoor > mutexdev.XCoor + minStackMutexXCoor) { return true; } else { return false; } } } } #endregion } else {//mutex有任务运行 int xcoor = Model.CGeneralFunction.GetXCoorFromMonitor(TaskIdx, DeviceIdx, ccf.GetDeviceOrderFromMonitor(TaskIdx)); int zcoor = Model.CGeneralFunction.GetZCoorFromMonitor(TaskIdx, DeviceIdx, ccf.GetDeviceOrderFromMonitor(TaskIdx)); int bccoor = GetBarcodeCoor(xcoor, zcoor); int mutXcoor; int mutZcoor; GetStackRunX_Zcoor(mutex, out mutXcoor, out mutZcoor); if (mutXcoor > 0) { #region 互斥有任务正在运行 int mutbccoor = GetBarcodeCoor(mutXcoor, mutZcoor); if (mutex > DeviceIdx) { if (mutbccoor <= (bccoor + StackMutexXCoor)) { if (mutbccoor > 52000) {//20120110 return true; } else { return false; } } } else {//mutex小 if (bccoor >= (StackMutexXCoor + StackZeroXCoor)) { if (mutbccoor >= (bccoor - StackMutexXCoor)) { if (mutbccoor < 4481)//20120110 {//20120110 return true; } else { return false; } } } else { if (bccoor >= 52000) { return true; } else { return false; } } } #endregion } else {//有任务,被预约,但没运行任务,可能报警或者触摸屏控制 if ((mutexdev.RunState > 0) || (mutexDeviceLockedState != 0)) {// 报警或者被任务锁定 #region 互斥设备不空闲 if (mutex > DeviceIdx) {//mutex=35002 if (mutexdev.XCoor <= (bccoor + StackMutexXCoor)) { return false;//或者放行直接报警 } } else {//mutex=35001 if (bccoor >= (StackMutexXCoor + StackZeroXCoor)) { if (mutexdev.XCoor >= (bccoor - StackMutexXCoor)) { return false; } } else { return false; } } #endregion } else { #region mutex被管理任务预约了,但是还没运行(【送货】等待运行) int deviceorder = GetDeviceOrderFromManTaskReserve(mutexManTaskReserve, mutex); if (deviceorder == -1) return false; GetStackRunReserveX_Zcoor(mutex, out mutXcoor, out mutZcoor); if (mutex > DeviceIdx) { if (mutexdev.XCoor <= (bccoor + StackMutexXCoor)) { //去货位高度合适位置避让,或者到52列(60000) InsertStackMutexOrder(mutex, deviceorder, (bccoor + StackMutexXCoor), GetLayerHigh(mutZcoor, mutXcoor)); if (mutexdev.XCoor > 52000)//20120110 { return true; } else { if (devinfo.XCoor < mutexdev.XCoor - minStackMutexXCoor) { return true; } else { return false; } } } } else {//mutex小 if (bccoor >= (StackMutexXCoor + StackZeroXCoor)) { if (mutexdev.XCoor >= (bccoor - StackMutexXCoor)) { //去货位高度合适位置避让,或者到0列(2000) InsertStackMutexOrder(mutex, deviceorder, (bccoor - StackMutexXCoor), GetLayerHigh(mutZcoor, mutXcoor)); if (mutexdev.XCoor < 4481) { return true; } else { if (devinfo.XCoor > mutexdev.XCoor + minStackMutexXCoor) { return true; } else { return false; } } } } else { return false; } } #endregion } } } } } #endregion #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 #region 顶升机构自关联入库任务单独处理//20101011 //20100406入库顶升时必要检测:1102内探物“-11021”;1121低到位“-11212”;有关联任务时,1102外探物“-11022”; if ((ccf.GetCorrel_DeviceIndex(devinfo.DeviceIndex, true) == "0") && (CONTROLTASKTYPE == 1) && (devinfo.IfCorrelDoubleFork == "1"))//顶升设备自关联,入库任务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 #region 双伸位的堆垛机在执行起点是里位(1,4排)的任务时,判读是否有起点是外位(2,3排)的任务 送货到货位时(终点为2,3)判断有没有(1,4)的任务,控制近远叉取送货先后 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; // if (tempZ>4) //{ tempZ = getZ % 4; //} if (tempZ == 1 || tempZ == 0)//里位取货时,要判读是否有外位的取货任务 {//获取外位坐标 if (tempZ == 1) { newZ = getZ + 1; } else { newZ = getZ - 1; } neighborzxy = string.Format("{0:D3}-{1:D3}-{2:D3}", 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; //} if (tempZ == 2 || tempZ == 3)//外位送货时,要判读是否有里位的送货任务 {//获取里位坐标 if (tempZ == 2) { newZ = sendZ - 1; } else { newZ = sendZ + 1; } neighborzxy = string.Format("{0:D3}-{1:D3}-{2:D3}", 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 //20101011 #region 双叉堆垛机的取货任务在此判断是否关联双叉、验证双叉任务是否为双叉极限货位 if ((devinfo.DeviceKind == 1) && (devinfo.IfCorrelDoubleFork == "1") && (ccf.GetDeviceOrderFromMonitor(minMidx) == 4)) { 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 没关联任务 //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 } #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 return true; } catch (Exception ex) { RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", "发送指令提前检测时发生错误:" + ex.StackTrace + ex.Message); OnRefreshMonitor(rme); return false; } finally { dv.Dispose(); dvdv.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) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT BarcodeCoor FROM T_Base_BarcodeCoor WHERE (XCoor = {0}) AND (ZCoor = {1})", xcoor, zcoor)).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 (XCoor1 = {0}) AND (ZCoor1 = {1})", xcoor, zcoor)).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) { try { lock (thisLock) { char[] sep = new char[1] { '-' }; int msgIdx = 0;//消息编号 bool sendok; #region 多叉关联设备指令,如果不能同步执行,发送距离堆垛机当前位置近的设备指令 MonitorIndex = GetDoubleForkMinRouteTask(MonitorIndex); if (MonitorIndex == -1) { return false; } #endregion //获得要发送的信息 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); // 202411 HSCP - 虚拟穿梭车和虚拟堆垛机不检查连接状态 if (((deviceKind == 4) && (devinfo.XCoor == 0) && (deviceIdx != 15310) && (deviceIdx != 15320)) && (devinfo.VirtualStack != deviceIdx))//20130510 { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "的光通讯被遮挡,或者没上电!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } if (ccf.GetManageTaskKindIndexFromMonitor(MonitorIndex) == 4) { #region 手工任务 string ah = "I" + deviceIdx.ToString(); if ((deviceKind != 1) && ((deviceKind != 4))) { ah = ""; } if (AheadDetectOK(MonitorIndex, ah) == 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 { #region 202410 HSCP - 发送穿梭车任务计算避让 if ((deviceIdx == 15301) || (deviceIdx == 15302) || (deviceIdx == 15303) || (deviceIdx == 15304)) { DataView dvspS = new DataView(); DataView dvspE = new DataView(); DataView dvspifcreat = new DataView(); DataView dvspavoid = new DataView(); DataView dvspavoid2 = new DataView(); int locationTask = 0; Model.MDevice devinfoUse = Model.CGetInfo.GetDeviceInfo(deviceIdx); Model.MDevice devinfoOther = Model.CGetInfo.GetDeviceInfo(devinfoUse.MutexStack); int EndStationS = GetMonitorStartStationfromMonitor(MonitorIndex);//送货站台 int Get_LocationS = GetMonitorStartStationfromMonitor(MonitorIndex);//取货站台 if ((deviceOrder == 2) || (deviceOrder == 7)) // 取货、运动 { sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(Get_LocationS).Append(" and VirtualStack = ").Append(devinfoUse.VirtualStack);//ORDER BY desc, asc dvspS = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspS.Count > 0) { locationTask = Convert.ToInt32(dvspS[0]["BarcodeCoor"]); } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("发送命令时取送货坐标有误"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } else if (deviceOrder == 3) // 送货 { sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(EndStationS).Append(" and VirtualStack = ") .Append(devinfoUse.VirtualStack);//ORDER BY desc, asc dvspE = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspE.Count > 0) { locationTask = Convert.ToInt32(dvspE[0]["BarcodeCoor"]); } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("发送命令时取送货坐标有误"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } int tempMin = devinfoUse.XCoor < locationTask ? devinfoUse.XCoor : locationTask; // 任务地址和当前车地址选小的 int tempMax = devinfoUse.XCoor > locationTask ? devinfoUse.XCoor : locationTask; // 任务地址和当前车地址选大的 string temp_F_TxtParam = ccf.GetF_TxtParamfromMonitor(MonitorIndex); // 临时任务条码 bool ifcreat = false; dvspifcreat = dbo.ExceSQL(string.Format("select F_MonitorIndex, F_NumParam2, F_Status from T_Monitor_Task " + "where F_DeviceIndex={0} and F_TxtParam='{1}' and F_MonitorTaskLevel = 99 and F_ManageTASKKINDINDEX = 4", devinfoOther.DeviceIndex, temp_F_TxtParam)).Tables[0].DefaultView; if (dvspifcreat.Count <= 0) { // 没有对车避让任务 ifcreat = true; } else { // 已有对车避让任务 if (Convert.ToInt32(dvspifcreat[0]["F_Status"]) > 1)// 添加避让任务已经执行后可以发送当前要执行任务 { ifcreat = true;//do nothing 发送当前任务 } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("等待避让任务执行结束"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } //int Reserve_task_otherdevice = Get_F_ManTaskReserve(devinfoOther.DeviceIndex); int OtherDeviceLockedState = Get_F_LockedState(devinfoOther.DeviceIndex); int otherXcoor; GetStackRunRGVZcoor(devinfoOther.DeviceIndex, out otherXcoor); // 得到对向车执行中任务的站台号 if ((devinfoOther.XCoor > tempMin - Safe_distanceRGV) && (devinfoOther.XCoor < tempMax + Safe_distanceRGV))//可能避让车辆当前位置在避让区内 { if ((devinfoOther.RunState == 0) && (ifcreat == true) && (otherXcoor <= 0))//空闲,无避让任务,无>=已发送状态的任务,otherXcoor<=0 没有执行任务 { if (devinfoOther.DeviceIndex == 15302 || devinfoOther.DeviceIndex == 15303) { // 大条码方向避让 dvspavoid = dbo.ExceSQL(string.Format("select XCoor from T_Base_BarcodeCoor where BarcodeCoor >={0} and VirtualStack = {1} order by BarcodeCoor ", tempMax + Safe_distanceRGV, devinfoUse.VirtualStack)).Tables[0].DefaultView; } else if(devinfoOther.DeviceIndex == 15301 || devinfoOther.DeviceIndex == 15304) { // 小条码方向避让 dvspavoid = dbo.ExceSQL(string.Format("select XCoor from T_Base_BarcodeCoor where BarcodeCoor <= {0} and VirtualStack = {1} order by BarcodeCoor DESC ", tempMin - Safe_distanceRGV, devinfoUse.VirtualStack)).Tables[0].DefaultView; } if (dvspavoid.Count > 0) { 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") .Append(",F_MonitorIndex,F_DeviceIndex,F_DeviceCommandIndex,F_UseAwayFork,F_NumParam1,F_TxtParam,F_AheadDetect) ") .Append("values(99,").Append(ccf.GetRouteIDsub(devinfoOther.DeviceIndex)).Append(",").Append(hidx).Append(",4,") .Append(hmindx).Append(",").Append(devinfoOther.DeviceIndex).Append(",").Append(7).Append(",").Append(0).Append(",") .Append(dvspavoid[0]["XCoor"]).Append(", '").Append(temp_F_TxtParam).Append("','-')"); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); //当前任务添加预约 sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = (").Append(manageKindIdx.ToString()).Append(manageTaskIdx.ToString()).Append(") WHERE (F_DeviceIndex = ").Append(devinfoUse.DeviceIndex).Append(")"); dbo.ExceSQL(sql.ToString()); return false; } else //避让安全距离后超出单叉穿梭全车行程范围 找一个最靠边的站台 { if (devinfoOther.DeviceIndex == 15302 || devinfoOther.DeviceIndex == 15303) //大条码方向 { dvspavoid = dbo.ExceSQL(string.Format("select XCoor from T_Base_BarcodeCoor where VirtualStack = {0} order by BarcodeCoor DESC", devinfoUse.VirtualStack)).Tables[0].DefaultView; } else { dvspavoid = dbo.ExceSQL(string.Format("select XCoor from T_Base_BarcodeCoor where VirtualStack = {0} order by BarcodeCoor ASC ", devinfoUse.VirtualStack)).Tables[0].DefaultView; } if (dvspavoid.Count > 0) { 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") .Append(",F_MonitorIndex,F_DeviceIndex,F_DeviceCommandIndex,F_UseAwayFork,F_NumParam1,F_TxtParam,F_AheadDetect) ") .Append("values(2,").Append(ccf.GetRouteIDsub(devinfoOther.DeviceIndex)).Append(",").Append(hidx).Append(",4,") .Append(hmindx).Append(",").Append(devinfoOther.DeviceIndex).Append(",").Append(7).Append(",").Append(1).Append(",") .Append(dvspavoid[0]["XCoor"]).Append(", '").Append(temp_F_TxtParam).Append("','-')"); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); //当前任务添加预约 sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = (").Append(manageKindIdx.ToString()).Append(manageTaskIdx.ToString()).Append(") WHERE (F_DeviceIndex = ").Append(devinfoUse.DeviceIndex).Append(")"); dbo.ExceSQL(sql.ToString()); return false; } } } else { if (otherXcoor > 0) //可能避让车有>=已发送非避让任务 { int End_Position = 0; sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(otherXcoor).Append(" and VirtualStack = ").Append(devinfoUse.VirtualStack); dvspavoid2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspavoid2.Count > 0) { End_Position = Convert.ToInt32(dvspavoid2[0]["BarcodeCoor"]); } // 暂定15301坐标永远大于15302的坐标 即方案图中下面坐标大于上面坐标 //并且车辆已经运行 if ((((devinfoOther.DeviceIndex == 15301 || devinfoOther.DeviceIndex == 15304) && (End_Position > tempMax + Safe_distanceRGV)) || ((devinfoOther.DeviceIndex == 15302 || devinfoOther.DeviceIndex == 15303) && (End_Position < tempMin - Safe_distanceRGV))) && (devinfoOther.RunState == 1)) { //直接发送当前任务 } else { AheadDetectUnallow.Append(string.Format("等待避让设备{0}任务执行完任务! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } else // 可能避让车没有>=已发送的指令 { if ((devinfoOther.RunState > 0) || (OtherDeviceLockedState != 0)) { // 报警或者其他原因 AheadDetectUnallow.Append(string.Format("等待避让设备{0}状态恢复! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } else { AheadDetectUnallow.Append(string.Format("不明原因,请查看车辆{0}状态及任务状态! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } } else { if (otherXcoor > 0)//可能避让车,有已发送任务 { int otherbccoor = GetBarcodeStationRGV(otherXcoor, devinfoUse.VirtualStack);//获得互斥堆垛机正在执行任务的坐标列条码值 //如果当前位置或者终点位置在避让区,等待执行完任务在判断是否足要避让 if ((devinfoOther.XCoor > tempMin - Safe_distanceRGV) && (devinfoOther.XCoor < tempMax + Safe_distanceRGV) || (otherbccoor < tempMax + Safe_distanceRGV) && (otherbccoor > tempMin - Safe_distanceRGV)) {//如果避让车任务终点在安全距离外 AheadDetectUnallow.Append(string.Format("等待设备{0}执行完任务! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } } #endregion sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[2]); } } else if (_DeviceKind == 13) {//richard.liu20230718鸿安环穿 if (deviceOrder == 4) // 空车移动,输送线发到取货地址,手动下达参数在gc[5] { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[0], gc[1], gc[5], gc[3], gc[4], gc[5]); } else { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[0], gc[1], gc[2], gc[3], gc[4], gc[5]); } //20231017 if (sendok == true && (deviceOrder == 1 || deviceOrder == 2)) // 1:取卸货 2:取货 3:卸货 4:空车移动 { //AddOPCSendData(deviceIdx, MonitorIndex, itemnames, itemvalues); sdo = CommModeCreate.CreateSendDeviceOrder(gc[2]); // 环穿取货输送线设备 _NumParam1 sdo.SendDeviceOrder(2, MonitorIndex, 0, gc[2], 0); // 给取货输送线发送对接任务号 //AddOPCSendData(gc[2], MonitorIndex, itemnames, itemvalues); } } 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 { ////////////////////////// ccf.SendOrderSuccess(manageKindIdx, manageTaskIdx, MonitorIndex, deviceIdx, _routeID); #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])); } } } #endregion return true; } #endregion } #region 自动命令(taskkind == 1,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; } #region RGV选车逻辑 //WangJx1nnn 202409-RGV选车逻辑 #region 202410 HSCP 穿梭车选择,无极限站台、无中转 // 一楼左 int manageSelect_FlagRGV = ccf.GetManageSelectFlagfromManage(manageTaskIdx); if ((deviceIdx == 15310 || deviceIdx == 15320) && (manageSelect_FlagRGV == 0)) { int deviceRGV1 = 15301; int deviceRGV2 = 15302; if ( deviceIdx == 15320 ) { deviceRGV1 = 15304; deviceRGV2 = 15303; } /*202410 HSCP RGV取送货逻辑 1.两车全部在线:15301不取/送12333,15302不送12339; 2.送出12312:优先分配15301;若15301运行,判断15301是入库则等待15301入库完成执行出库,若15301出库则分配15302后注意15301避让; 3.送出12312,优先分配15301;如果15301有出库送出指令再分配15302; 4.12309入库优先3.4.5巷道15301;12333入库优先1.2巷道15302; 5.优先级:取送货指令 > AGV运动; 判断 12339有货时,12309出到异常口的货不接不分配 */ //1查询取送货站台号,判断站台有货且设备不为空闲,报警;报目标位置有任务被预约 //2查询15301.15302设备信息 //3查询设备是否停用,停用设置运行状态为4,否则不变;判断RGV状态 1-5报警 Model.MDevice devinfoRGV1 = Model.CGetInfo.GetDeviceInfo(deviceRGV1); Model.MDevice devinfoRGV2 = Model.CGetInfo.GetDeviceInfo(deviceRGV2); //202410 DataView dv15301 = new DataView(); string sql15301 = string.Empty; sql15301 = string.Format("SELECT f_errorcode FROM T_BASE_DEVICE WHERE f_errorcode='998' and f_deviceindex= '{0}' ", devinfoRGV1.DeviceIndex); dv15301 = dbo.ExceSQL(sql15301).Tables[0].DefaultView; if (dv15301.Count > 0) { devinfoRGV1.RunState = 4; } DataView dv15302 = new DataView(); string sql15302 = string.Empty; sql15302 = string.Format("SELECT f_errorcode FROM T_BASE_DEVICE WHERE f_errorcode='998' and f_deviceindex= '{0}' ", devinfoRGV2.DeviceIndex); dv15302 = dbo.ExceSQL(sql15302).Tables[0].DefaultView; if (dv15302.Count > 0) { devinfoRGV2.RunState = 4; } // 15301与15302双车均不可用 if ((devinfoRGV1.RunState > 1) && (devinfoRGV1.RunState < 5) && (devinfoRGV2.RunState > 1) && (devinfoRGV2.RunState < 5)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("双车状态均不可用,无法选择AGV设备!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } // 4选车 int tempRGV = deviceRGV1; int Aviod15301 = -1; int Aviod15302 = -1; // 只有一台能用(另一台停用),只能选这个 int Get_LocationS = GetMonitorStartStationfromMonitor(MonitorIndex);//取货站台 int EndStationS = GetMonitorEndStationfromMonitor(MonitorIndex);//送货站台 // 只有一辆车可用(另一辆车停用),选用当前车辆。 if (devinfoRGV1.RunState == 4 && (devinfoRGV2.RunState <= 3 || devinfoRGV2.RunState == 5)) { tempRGV = deviceRGV2; } else if (devinfoRGV2.RunState == 4 && (devinfoRGV1.RunState <= 3 || devinfoRGV1.RunState == 5)) { tempRGV = deviceRGV1; } // 如果两车都能用,并且取送货区域交叉查看车的行程远近和状态,如有赶车现象行程也算上。 else { /* * 202412 HSCP RGV取送货逻辑优化(两辆车均在线情况): * 取: * 1.12339/12539异常口任务:分配15301/15304; * 2.12310/12510出库任务:15304空闲或入库任务优先分配15301/15304; * 3.12305/12505入库任务:判断入库任务数=1,则优先分配15301/15304;入库任务数>=2,则优先分15303/15302,再分配15301/15304; * 4.12335/12535出库任务:15303空闲或入库任务优先分配15302/15303; * 5.12335入库任务:判断入库任务数=1,则优先分配15302;入库任务数>=2,则优先分15302,再分配15301; */ // 特殊位置指定车号 // 特殊位置--异常口12339/12539异常口限15301/15303 if ((EndStationS == 12339 || EndStationS == 12539) && (devinfoRGV1.RunState != 4)) { tempRGV = deviceRGV1; } // 特殊位置--下方出入库口12333/12533限15302/15304 else if ((Get_LocationS == 12333 || EndStationS == 12333 || EndStationS == 12533 ) && (devinfoRGV2.RunState != 4)) { tempRGV = deviceRGV2; } // 入 else if (((Get_LocationS == 12309) && (EndStationS <= 12317) && (devinfoRGV1.RunState != 4)) || ((Get_LocationS == 12509) && (EndStationS <= 12517) && (devinfoRGV1.RunState != 4))) { tempRGV = deviceRGV1; // 1楼4.5巷道入库,15301/15304 } else if (((Get_LocationS == 12309) && (EndStationS >= 12521) && (devinfoRGV2.RunState != 4)) || ((Get_LocationS == 12509) && (EndStationS >= 12521) && (devinfoRGV2.RunState != 4))) { tempRGV = deviceRGV2; // 1楼1.2.3巷道入库,15302/15303 } // 出 else if (((EndStationS == 12312) && (Get_LocationS <= 12323) && (devinfoRGV1.RunState != 4)) || ((EndStationS == 12512) && (Get_LocationS <= 12523) && (devinfoRGV1.RunState != 4))) { tempRGV = deviceRGV1; // 1楼3.4.5巷道出库,15301/15304 } else if (((EndStationS == 12312) && (Get_LocationS >= 12327) && (devinfoRGV2.RunState != 4)) || ((EndStationS == 12512) && (Get_LocationS >= 12527) && (devinfoRGV2.RunState != 4))) { tempRGV = deviceRGV2; // 1楼1.2巷道出库,15302/15303 } else { // 判断距离 返回stack1 distance1 avoid2 stack2 distance2 avoid1 // 15301: 0,2-0/1 不避让/避让 0,0-15301 0,1-距离 // 15302: 1,2-0/1 不避让/避让 1,0-15302 1,1-距离 int[,] temp = Calulate_DistanceRGV(devinfoRGV1, devinfoRGV2, MonitorIndex); if ((temp[0, 1] != -1) && (temp[1, 1] != -1)) { if (temp[0, 1] < temp[1, 1]) { tempRGV = temp[0, 0]; } else { tempRGV = temp[1, 0]; } Aviod15302 = temp[0, 2];//记录如果选15301,15302是否需要避让 0-不避让;1-避让。 Aviod15301 = temp[1, 2];//记录如果选15302,15301是否需要避让 0-不避让;1-避让。 } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("选车时取货或送货坐标错误,检查并维护!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } #region 选择车之后有预约锁,报警处理 // 按实际情况更改判断是大任务预约锁还是运行锁,暂时按预约锁执行 int Reserve_15301 = Get_F_ManTaskReserve(deviceRGV1); int Reserve_15302 = Get_F_ManTaskReserve(deviceRGV2); if (((tempRGV == deviceRGV1)&&((devinfoRGV1.RunState != 0)||(Reserve_15301>0)))||((tempRGV == deviceRGV2) &&((devinfoRGV2.RunState != 0)||(Reserve_15302>0)))) { // 如果选定的车报警,且等待时间到,并且如用另一台不需要此车避让才换车,并且另一台车空闲,无预约。 if ((devinfoRGV1.RunState == 2) && (tempRGV == deviceRGV1) && (Aviod15301 == 0) && (devinfoRGV2.RunState == 0) && (Reserve_15302 == 0)) { tempRGV = deviceRGV2; // 1号报警换2号 } else if ((devinfoRGV2.RunState == 2) && (tempRGV == deviceRGV2) && (Aviod15302 == 0) && (devinfoRGV1.RunState == 0) && (Reserve_15301 == 0)) { tempRGV = deviceRGV1; // 2号报警换1号 } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("等待暂选车辆" + tempRGV.ToString() + "状态空闲或预约清除"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; // 选定的车不符合条件时,不更换车,下轮重新选择 } } #endregion #region 202410选车逻辑 /// /* if (tempRGV == 15301) { if (devinfoRGV2.RunState != 4) { if (_NumParam2 == 12333 || _NumParam5 == 12333) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("15301:超出当前范围,不取送12333!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } else if (tempRGV == 15302) { if (devinfoRGV1.RunState != 4) { // 8-112 if ((_NumParam5 == 12309)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("15302:超出当前范围,不送12309!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } */ #endregion #region 修改提前检查、设备号等任务信息 sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET ").Append(" F_AheadDetect=Replace(F_AheadDetect,'") .Append(deviceIdx).Append("','").Append(tempRGV).Append("')").Append(" ,F_DeviceIndex=Replace(F_DeviceIndex,'") .Append(deviceIdx).Append("','").Append(tempRGV).Append("')").Append(" WHERE (F_ManageTaskIndex = ") .Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(manageKindIdx).Append(")"); dbo.ExecuteSql(sql.ToString()); //更新manage表Select_Flag = 1 避免更改成功后再次选车 sql.Clear(); sql.Append("UPDATE T_Manage_Task SET ").Append("manageSelect_Flag = 1 where FID = ").Append(manageTaskIdx); dbo.ExecuteSql(sql.ToString()); #endregion return false; } #endregion #region HSCP RGV发送任务,计算避让。 if ((deviceIdx == 15301) || (deviceIdx == 15302) || (deviceIdx == 15303) || (deviceIdx == 15304)) { DataView dvspQ = new DataView(); DataView dvspS = new DataView(); DataView dvspifcreat = new DataView(); DataView dvspavoid = new DataView(); DataView dvspavoid2 = new DataView(); int locationTask = 0; Model.MDevice devinfoUse = Model.CGetInfo.GetDeviceInfo(deviceIdx); Model.MDevice devinfoOther = Model.CGetInfo.GetDeviceInfo(devinfoUse.MutexStack); #region 车避让 int EndStationS = GetMonitorStartStationfromMonitor(MonitorIndex);//送货站台 int Get_LocationS = GetMonitorStartStationfromMonitor(MonitorIndex);//取货站台 // 取货、运动 if ((deviceOrder == 2) || (deviceOrder == 7)) { //int[] QUstation = new int[] { 12333, 12309, 12315, 12319, 12323, 12327, 12331 }; sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(Get_LocationS).Append(" and VirtualStack = ").Append(devinfoUse.VirtualStack);//ORDER BY desc, asc dvspQ = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspQ.Count > 0) { locationTask = Convert.ToInt32(dvspQ[0]["BarcodeCoor"]); } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("发送命令时取货坐标有误!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } // 送货 else if (deviceOrder == 3) { //int[] SONGstation = new int[] { 12333, 12339, 12312, 12313, 12317, 12321, 13225, 12329 }; sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(EndStationS).Append(" and VirtualStack = ").Append(devinfoUse.VirtualStack);//ORDER BY desc, asc dvspS = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspS.Count > 0) { locationTask = Convert.ToInt32(dvspS[0]["BarcodeCoor"]); } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("发送命令时送货坐标有误!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } #endregion int tempMin = devinfoUse.XCoor < locationTask ? devinfoUse.XCoor : locationTask; // 任务地址和当前车位置选小的 int tempMax = devinfoUse.XCoor > locationTask ? devinfoUse.XCoor : locationTask; // 任务地址和当前车位置选大的 string temp_F_TxtParam = ccf.GetF_TxtParamfromMonitor(MonitorIndex); // 临时任务条码 bool ifcreat = false; dvspifcreat = dbo.ExceSQL(string.Format("select F_MonitorIndex,F_NumParam2,F_Status from T_Monitor_Task where F_DeviceIndex={0} and F_TxtParam='{1}' and F_ManageTASKKINDINDEX = 4", devinfoOther.DeviceIndex, temp_F_TxtParam)).Tables[0].DefaultView; if (dvspifcreat.Count <= 0) { ifcreat = true; // 无避让任务 } else { if (Convert.ToInt32(dvspifcreat[0]["F_Status"]) > 1)//添加避让任务已经执行后可以发送当前要执行任务 { //do nothing 发送当前任务 ifcreat = true; } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("等待避让任务执行结束!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } int OtherDeviceLockedState = Get_F_LockedState(devinfoOther.DeviceIndex); int otherXcoor; GetStackRunRGVZcoor(devinfoOther.DeviceIndex, out otherXcoor); //得到对向车执行中任务的站台号 // 可能避让车辆当前位置在避让区间内,需要避让。 if ((devinfoOther.XCoor > tempMin - Safe_distanceRGV) && (devinfoOther.XCoor < tempMax + Safe_distanceRGV)) { if ((devinfoOther.RunState == 0) && (ifcreat == true) && (otherXcoor <= 0))//空闲,无避让任务,无>=已发送状态的任务,otherXcoor<=0 没有执行任务。 { if ((devinfoOther.DeviceIndex == 15302) || (devinfoOther.DeviceIndex == 15303)) { // 大条码方向避让 12515 dvspavoid = dbo.ExceSQL(string.Format("select XCoor from T_Base_BarcodeCoor where BarcodeCoor >= {0} and VirtualStack = {1} order by BarcodeCoor ", tempMax + Safe_distanceRGV, devinfoUse.VirtualStack)).Tables[0].DefaultView; } else { // 小条码方向避让 dvspavoid = dbo.ExceSQL(string.Format("select XCoor from T_Base_BarcodeCoor where BarcodeCoor <= {0} and VirtualStack = {1} order by BarcodeCoor DESC ", tempMin - Safe_distanceRGV, devinfoUse.VirtualStack)).Tables[0].DefaultView; } if (dvspavoid.Count > 0) { 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_UseAwayFork,F_NumParam1,F_TxtParam,F_AheadDetect) ") .Append("values(99,").Append(ccf.GetRouteIDsub(devinfoOther.DeviceIndex)).Append(",").Append(hidx) // leverl 99 区分其他任务 .Append(",4,").Append(hmindx).Append(",").Append(devinfoOther.DeviceIndex).Append(",").Append(7).Append(",").Append(0) .Append(",").Append(dvspavoid[0]["XCoor"]).Append(", '").Append(temp_F_TxtParam).Append("','-')"); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length);//添加预约 sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = ("). Append(manageKindIdx.ToString()).Append(manageTaskIdx.ToString()).Append(") WHERE (F_DeviceIndex = ").Append(devinfoUse.DeviceIndex).Append(")"); dbo.ExceSQL(sql.ToString()); return false; } else //避让安全距离后超出穿梭车行程范围,找一个最近站台。 { if (devinfoOther.DeviceIndex == 15302 || devinfoOther.DeviceIndex == 15303) // 大条码方向 { dvspavoid = dbo.ExceSQL(string.Format("select XCoor from T_Base_BarcodeCoor where VirtualStack = {0} order by BarcodeCoor DESC", devinfoUse.VirtualStack)).Tables[0].DefaultView; } else { dvspavoid = dbo.ExceSQL(string.Format("select XCoor from T_Base_BarcodeCoor where VirtualStack = {0} order by BarcodeCoor ASC ", devinfoUse.VirtualStack)).Tables[0].DefaultView; } if (dvspavoid.Count > 0) { 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_UseAwayFork,F_NumParam1,F_TxtParam,F_AheadDetect) ") .Append("values(2,").Append(ccf.GetRouteIDsub(devinfoOther.DeviceIndex)).Append(",").Append(hidx) .Append(",4,").Append(hmindx).Append(",").Append(devinfoOther.DeviceIndex).Append(",").Append(7).Append(",") .Append(1).Append(",").Append(dvspavoid[0]["XCoor"]).Append(", '").Append(temp_F_TxtParam).Append("','-')"); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length);//添加预约 sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = (").Append(manageKindIdx.ToString()) .Append(manageTaskIdx.ToString()).Append(") WHERE (F_DeviceIndex = ").Append(devinfoUse.DeviceIndex).Append(")"); dbo.ExceSQL(sql.ToString()); return false; } } } else { if (otherXcoor > 0)//可能避让车有>=已发送非避让任务 { int End_Position = 0; sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(otherXcoor).Append(" and VirtualStack = ").Append(devinfoUse.VirtualStack);//ORDER BY desc, asc.Append(" and LayerHigh = 1") dvspavoid2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspavoid2.Count > 0) { End_Position = Convert.ToInt32(dvspavoid2[0]["BarcodeCoor"]); } // 暂定15301.xcoor<15302.xcoor,即方案图中下面坐标大于上面坐标。 //并且车辆已经运行 if ((((devinfoOther.DeviceIndex == 15302 || devinfoOther.DeviceIndex == 15303) && (End_Position > tempMax + Safe_distanceRGV)) || ((devinfoOther.DeviceIndex == 15301 || devinfoOther.DeviceIndex == 15304) && (End_Position < tempMin - Safe_distanceRGV))) && (devinfoOther.RunState == 1)) { //直接发送当前任务 } else { AheadDetectUnallow.Append(string.Format("等待避让设备{0}任务执行完任务! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } else//可能避让车没有>=已发送的指令 { if ((devinfoOther.RunState > 0) || (OtherDeviceLockedState != 0)) {//报警 AheadDetectUnallow.Append(string.Format("等待避让设备{0}状态恢复! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } else { AheadDetectUnallow.Append(string.Format("不明原因,请查看车辆{0}状态及任务状态! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } } else//当前位置不需要避让 { if (otherXcoor > 0)//可能避让车,有已发送任务 { int otherbccoor = GetBarcodeCoor(otherXcoor, devinfoUse.VirtualStack);//获得互斥堆垛机正在执行任务的坐标列条码值 //如果当前位置或者终点位置在避让区,等待执行完任务在判断是否足要避让 if ((devinfoOther.XCoor > tempMin - Safe_distanceRGV) && (devinfoOther.XCoor < tempMax + Safe_distanceRGV) || (otherbccoor < tempMax + Safe_distanceRGV) && (otherbccoor > tempMin - Safe_distanceRGV)) {//如果避让车任务终点在安全距离外 AheadDetectUnallow.Append(string.Format("等待设备{0}执行完任务! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } } #endregion #endregion #region TJBS垛机选择 int manageSelect_Flag11222 = ccf.GetManageSelectFlagfromManage(manageTaskIdx); if ((deviceIdx == 11222) && (manageSelect_Flag11222 == 0))//选择车 { //1查询取送货站台号,判断站台有货且设备不为空闲,报警;报目标位置有任务被预约 //查看目标输送线是否有另一个状态为大于0的任务 如有不选车等待防止后续车被占用货不能送下去报警 int sendzd = gc[5];//排列层 int sendxd = gc[3]; int sendyd = gc[4]; string sendcell = string.Format("{0:D3}-{1:D3}-{2:D3}", gc[5], gc[3], gc[4]);//要查找到该送货位置 int getgate = ccf.GetLaneGateDeviceIndexFromLaneGate(sendcell);//送货位置的设备编号 if (getgate != 0 && !"22001,22004,22005,22017,22029,22041".Contains(getgate.ToString())) { DataView dvCountd = new DataView(); sql.Remove(0, sql.Length); Model.MDevice devinfoS = Model.CGetInfo.GetDeviceInfo(getgate); if ((devinfoS.SplitByte_0 == 1) || (devinfoS.RunState != 0)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("目标位置不可用,暂不选择垛机"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } else { //包括取送货 sql.Remove(0, sql.Length); sql.Append("select * from T_Monitor_Task where (F_DeviceIndex = 11001 or F_DeviceIndex = 11002 ) and F_Status >= 0 and F_NumParam4 = ").Append(sendzd).Append("and F_NumParam5 =").Append(sendxd).Append(" and F_NumParam6 = ").Append(sendyd); } dvCountd = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvCountd.Count > 0) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("目标位置被任务预约,暂不选择垛机"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } DataView dvCount = new DataView(); //2查询11001.11002设备信息 //3查询设备是否停用,停用设置运行状态为4,否则不变;判断堆垛机状态 1-5报警 Model.MDevice devinfo11001 = Model.CGetInfo.GetDeviceInfo(11001); Model.MDevice devinfo11002 = Model.CGetInfo.GetDeviceInfo(11002); //20240424 tjbs azq 修改 DataView dv998d = new DataView(); string sql998d = string.Empty; sql998d = string.Format("SELECT f_errorcode FROM T_BASE_DEVICE WHERE f_errorcode='998' and f_deviceindex= '{0}' ", devinfo11001.DeviceIndex); dv998d = dbo.ExceSQL(sql998d).Tables[0].DefaultView; if (dv998d.Count > 0) { devinfo11001.RunState = 4; } else { devinfo11001.RunState = devinfo11001.RunState; } DataView dv998dd = new DataView(); string sql998dd = string.Empty; sql998dd = string.Format("SELECT f_errorcode FROM T_BASE_DEVICE WHERE f_errorcode='998' and f_deviceindex= '{0}' ", devinfo11002.DeviceIndex); dv998dd = dbo.ExceSQL(sql998dd).Tables[0].DefaultView; if (dv998dd.Count > 0) { devinfo11002.RunState = 4; } else { devinfo11002.RunState = devinfo11002.RunState; } if ((devinfo11001.RunState > 1) && (devinfo11001.RunState < 5) && (devinfo11002.RunState > 1) && (devinfo11002.RunState < 5)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11001与11002双机状态不可用,无法选择垛机"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } int tempStack = 11001; int Aviod11001 = -1; int Aviod11002 = -1; //1-99 2- 9-112 add for TJBS 1号堆垛机正常是 1- 99 2号堆垛机 是9-112 // 异常1-103 8-112 //两车都不能用时在上面已经return if ((_NumParam2 < 9 || _NumParam5 < 9) )//TJBS需要现场实测只能用11001的列值 1-99 { //此时只能用11001垛机 if ((devinfo11001.RunState > 1) && (devinfo11001.RunState < 5)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11001状态不可用,无法选择垛机"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } else { tempStack = 11001; } } else if (_NumParam2 > 102 || _NumParam5 > 102)//TJBS需要现场实测只能用11002的列值 二号堆垛机正常运行的值是9—112 {//此时只能用11002垛机 if ((devinfo11002.RunState > 1) && (devinfo11002.RunState < 5)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11002状态不可用,无法选择垛机"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } else { tempStack = 11002; } } else//如果两车都能用 并且取送货区域交叉查看车的行程远近和状态,如有赶车现象 行程也算上 { if ((devinfo11002.RunState != 4) && (devinfo11001.RunState == 4))//如果只有一个车能用 只能选此车 { //add for TJBS 判断当前列2号能取不,不能取直接返回 8-112 if ((_NumParam2 < 8 || _NumParam5 < 8) && (_NumParam2 > 112|| _NumParam5 > 112)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11001禁用,11002当前列无法取货,选车失败!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } tempStack = 11002; } else if ((devinfo11002.RunState == 4) && (devinfo11001.RunState != 4)) { //add for TJBS 判断当前列1号能取不,不能取直接返回 1-103 if ((_NumParam2 > 102 || _NumParam5 > 102) ) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11002禁用,11001当前列无法取货,选车失败!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } tempStack = 11001; } else //如果两车都能用 查看车的行程远近和状态,如有赶车现象 行程也算上 { int[,] temp = Calulate_Distance(devinfo11001, devinfo11002, MonitorIndex);//返回stack1 distance1 avoid2 stack2 distance2 avoid1 if ((temp[0, 1] != -1) && (temp[1, 1] != -1)) { if (temp[0, 1] < temp[1, 1]) { tempStack = temp[0, 0]; } else { tempStack = temp[1, 0]; } Aviod11002 = temp[0, 2];//记录如果选11001,11002是否需要避让 Aviod11001 = temp[1, 2];//记录如果选11002,11001是否需要避让 } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("选车时取货或送货坐标错误,检查并维护"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } #region if ((devinfo11002.RunState != 4) && (devinfo11001.RunState == 4))//如果只有一个车能用 只能选此车 { //add for TJBS 判断当前列2号能取不,不能取直接返回 8-112 if ((_NumParam2 < 8 || _NumParam5 < 8) && (_NumParam2 > 112 || _NumParam5 > 112)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11001禁用,11002当前列无法取货,选车失败!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } tempStack = 11002; } else if ((devinfo11002.RunState == 4) && (devinfo11001.RunState != 4)) { //add for TJBS 判断当前列2号能取不,不能取直接返回 1-103 if ((_NumParam2 > 102 || _NumParam5 > 102)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11002禁用,11001当前列无法取货,选车失败!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } tempStack = 11001; } #endregion int Reserve_11001 = Get_F_ManTaskReserve(11001); int Reserve_11002 = Get_F_ManTaskReserve(11002);//按实际情况更改判断是大任务预约锁还是运行锁,暂时按预约锁执行 if (((tempStack == 11001) && ((devinfo11001.RunState != 0) || (Reserve_11001 > 0))) || ((tempStack == 11002) && ((devinfo11002.RunState != 0) || (Reserve_11002 > 0)))) { //int sentcountmax = CStaticClass.Wait_maxCount;//10*0.5 = 5S if ((devinfo11001.RunState == 2) && (tempStack == 11001) && (Aviod11001 == 0) && (devinfo11002.RunState == 0) && (Reserve_11002 == 0))// && (CStaticClass.SendedCount >= sentcountmax)如果选定的车报警,等待时间到,并且如用另一台不需要此车避让才换车,并且另一台车空闲,无预约 { if (_NumParam2 >= 13 && _NumParam5 >= 13) { tempStack = 11002; } //CStaticClass.SendedCount = 0; } else if ((devinfo11002.RunState == 2) && (tempStack == 11002) && (Aviod11002 == 0) && (devinfo11001.RunState == 0) && (Reserve_11001 == 0))// && (CStaticClass.SendedCount >= sentcountmax) { if (_NumParam2 <= 100 || _NumParam5 <= 100) { tempStack = 11001; } //CStaticClass.SendedCount = 0; } else { //CStaticClass.SendedCount++; //if (CStaticClass.SendedCount > sentcountmax) //{ // CStaticClass.SendedCount = 0; //} AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("等待暂选车辆" + tempStack.ToString() + "状态空闲或预约清除"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false;//选定的车不符合条件时,不更换车,下轮重新选择 } } #region add for TJBS 没仔细看上一种选车逻辑 默认极限列都是靠近对应方向的堆垛机 //add for TJBS 没仔细看上一种选车逻辑 默认极限列都是靠近对应方向的堆垛机 if (tempStack == 11001) { if (devinfo11002.RunState == 4) { // 1-103 if (_NumParam2 >102 || _NumParam5 >102) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11001:超出当前车列值"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } else { //1-102 if (_NumParam2 > 102 || _NumParam5 > 102) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11001:超出当前车列值"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } else if (tempStack == 11002) { if (devinfo11001.RunState == 4) { // 8-112 if ((_NumParam2 <8 || _NumParam5 < 8)&&(_NumParam2 > 112 || _NumParam5 > 112)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11002:超出当前车列值"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } else { //9-112 if ((_NumParam2 < 9 || _NumParam5 < 9) && (_NumParam2 > 112 || _NumParam5 > 112)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("11002:超出当前车列值"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } #endregion sql.Clear(); sql.Append("UPDATE T_Monitor_Task SET ").Append(" F_AheadDetect=Replace(F_AheadDetect,'") .Append(11222).Append("','").Append(tempStack).Append("')").Append(" ,F_DeviceIndex=Replace(F_DeviceIndex,'") .Append(11222).Append("','").Append(tempStack).Append("')").Append(" WHERE (F_ManageTaskIndex = ") .Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = ") .Append(manageKindIdx).Append(")"); dbo.ExecuteSql(sql.ToString()); //更新manage表Select_Flag = 1 避免更改成功后再次选车 sql.Clear(); sql.Append("UPDATE T_Manage_Task SET ").Append("manageSelect_Flag = 1 where FID = ").Append(manageTaskIdx); dbo.ExecuteSql(sql.ToString()); return false; } #endregion #region TJBS垛机任务发送 if ((deviceIdx == 11001) || (deviceIdx == 11002)) { DataView dvspS = new DataView(); DataView dvspE = new DataView(); DataView dvspifcreat = new DataView(); DataView dvspavoid = new DataView(); DataView dvspavoid2 = new DataView(); int locationTask = 0; Model.MDevice devinfoUse = Model.CGetInfo.GetDeviceInfo(deviceIdx); Model.MDevice devinfoOther = Model.CGetInfo.GetDeviceInfo(deviceIdx); if (deviceIdx == 11001) { devinfoOther = Model.CGetInfo.GetDeviceInfo(11002); } else { devinfoOther = Model.CGetInfo.GetDeviceInfo(11001); } if ((deviceOrder == 4) || (deviceOrder == 7) || (deviceOrder == 2)) { sql.Remove(0, sql.Length); int tempz = 1; //if (gc[2] == 1 || gc[2] == 2) //{ // tempz = 1; //} //else //{ // tempz = 2; //} sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(gc[0]).Append(" and ZCoor = ").Append(tempz).Append(" and VirtualStack = 11222");//ORDER BY desc, asc.Append(" and LayerHigh = ").Append(Ycoor) dvspS = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspS.Count > 0) { locationTask = Convert.ToInt32(dvspS[0]["BarcodeCoor"]); } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("发送命令时取货坐标有误"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } else if ((deviceOrder == 5) || (deviceOrder == 3)) { sql.Remove(0, sql.Length); int tempz = 1; //if (gc[5] == 1 || gc[5] == 2) //{ // tempz = 1; //} //else //{ // tempz = 2; //} sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(gc[3]).Append(" and ZCoor = ").Append(tempz).Append(" and VirtualStack = 11222");//ORDER BY desc, asc.Append(" and LayerHigh = ").Append(YcoorS) dvspE = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspE.Count > 0) { locationTask = Convert.ToInt32(dvspE[0]["BarcodeCoor"]); } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("发送命令时送货坐标有误"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } int tempMin = devinfoUse.XCoor < locationTask ? devinfoUse.XCoor : locationTask; int tempMax = devinfoUse.XCoor > locationTask ? devinfoUse.XCoor : locationTask; string temp_F_TxtParam = ccf.GetF_TxtParamfromMonitor(MonitorIndex); bool ifcreat = false; dvspifcreat = dbo.ExceSQL(string.Format("select F_MonitorIndex,F_NumParam2, F_Status from T_Monitor_Task where F_DeviceIndex={0} and F_TxtParam='{1}' and F_ManageTASKKINDINDEX = 4", devinfoOther.DeviceIndex, temp_F_TxtParam)).Tables[0].DefaultView; if (dvspifcreat.Count <= 0) { ifcreat = true; } else { if (Convert.ToInt32(dvspifcreat[0]["F_Status"]) > 0)//添加避让任务已经执行后可以发送当前要执行任务 { //do nothing 发送当前任务 } else { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append("等待避让任务执行结束"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } int OtherDeviceLockedState = Get_F_LockedState(devinfoOther.DeviceIndex); int otherXcoor; int otherZcoor; GetStackRunX_Zcoor(devinfoOther.DeviceIndex, out otherXcoor, out otherZcoor); bool boolAllow = true; // locationTask 当前任务列值 if (deviceIdx == 11002) { if (devinfoUse.XCoor <= locationTask || (tempMin< 13 && devinfoOther.XCoor ==1)) { boolAllow = false; } } else if (deviceIdx == 11001) { if (devinfoUse.XCoor >= locationTask) { boolAllow = false; } } //20240424 tjbs azq 修改 DataView dv998d = new DataView(); string sql998d = string.Empty; sql998d = string.Format("SELECT f_errorcode FROM T_BASE_DEVICE WHERE f_errorcode='998' and f_deviceindex= '{0}' ", devinfoOther.DeviceIndex); dv998d = dbo.ExceSQL(sql998d).Tables[0].DefaultView; if (dv998d.Count > 0) { devinfoOther.RunState = 4; } else { devinfoOther.RunState = devinfoOther.RunState; } if ((devinfoOther.XCoor > tempMin - safe_distance) && (devinfoOther.XCoor < tempMax + safe_distance)&& boolAllow && devinfoOther.RunState!=4)//可能避让车辆当前位置需要避让 { if ((devinfoOther.RunState == 0) && (ifcreat == true) && (otherXcoor <= 0))//空闲,无避让任务,无>=已发送状态的任务 { if (devinfoOther.DeviceIndex == 11002) { dvspavoid = dbo.ExceSQL(string.Format("select ZCoor,XCoor,LayerHigh from T_Base_BarcodeCoor where BarcodeCoor >={0} and VirtualStack = 11222 order by BarcodeCoor ", tempMax + safe_distance)).Tables[0].DefaultView;// and ((ZCoor =1 and XCoor%2=0) or (ZCoor =2)) } else { dvspavoid = dbo.ExceSQL(string.Format("select ZCoor,XCoor,LayerHigh from T_Base_BarcodeCoor where BarcodeCoor <= {0} and VirtualStack = 11222 order by BarcodeCoor DESC ", tempMin - safe_distance)).Tables[0].DefaultView;//and ((ZCoor =1 and XCoor%2=0) or (ZCoor =2)) } if (dvspavoid.Count > 0) { int hidx = ccf.GetTempManageIdx(); int hmindx = ccf.GetMonitorIndex(hidx, 2); sql.Remove(0, sql.Length); int tempZ = 1; //if (Convert.ToInt32(dvspavoid[0]["ZCoor"]) == 1) // tempZ = 1; //else // tempZ = 4; sql.Append("insert into T_Monitor_Task(F_MonitorTaskLevel,F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex,"). Append("F_DeviceIndex,F_DeviceCommandIndex,F_UseAwayFork,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_TxtParam,F_AheadDetect) "). Append("values(2,").Append(ccf.GetRouteIDsub(devinfoOther.DeviceIndex)).Append(","). Append(hidx).Append(",4,").Append(hmindx).Append(",").Append(devinfoOther.DeviceIndex). Append(",").Append(2).Append(",").Append(1).Append(",").Append(tempZ).Append(",").Append(dvspavoid[0]["XCoor"]).Append(",").Append(2).Append(",").Append(0).Append(",").Append(0).Append(",").Append(1).Append(",'").Append(temp_F_TxtParam).Append("','-')"); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length);//添加预约 sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = (").Append(manageKindIdx.ToString()).Append(manageTaskIdx.ToString()).Append(") WHERE (F_DeviceIndex = ").Append(devinfoUse.DeviceIndex).Append(")"); dbo.ExceSQL(sql.ToString()); return false; } else//避让安全距离后超出双叉穿梭车行程范围 { if (devinfoOther.DeviceIndex == 11002) { dvspavoid = dbo.ExceSQL(string.Format("select ZCoor,XCoor,LayerHigh from T_Base_BarcodeCoor order by BarcodeCoor DESC")).Tables[0].DefaultView; } else { dvspavoid = dbo.ExceSQL(string.Format("select ZCoor,XCoor,LayerHigh from T_Base_BarcodeCoor order by BarcodeCoor ASC ")).Tables[0].DefaultView; } if (dvspavoid.Count > 0) { int hidx = ccf.GetTempManageIdx(); int hmindx = ccf.GetMonitorIndex(hidx, 2); int tempZ = 1; //if (Convert.ToInt32(dvspavoid[0]["ZCoor"]) == 1) // tempZ = 1; //else // tempZ = 4; 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_UseAwayFork,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_TxtParam,F_AheadDetect) "). Append("values(2,").Append(ccf.GetRouteIDsub(devinfoOther.DeviceIndex)).Append(","). Append(hidx).Append(",4,").Append(hmindx).Append(",").Append(devinfoOther.DeviceIndex). Append(",").Append(2).Append(",").Append(1).Append(",").Append(tempZ).Append(",").Append(dvspavoid[0]["XCoor"]).Append(",").Append(2).Append(",").Append(0).Append(",").Append(0).Append(",").Append(1).Append(",'").Append(temp_F_TxtParam).Append("','-')"); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length);//添加预约 sql.Append("UPDATE T_Base_Device SET F_ManTaskReserve = (").Append(manageKindIdx.ToString()).Append(manageTaskIdx.ToString()).Append(") WHERE (F_DeviceIndex = ").Append(devinfoUse.DeviceIndex).Append(")"); dbo.ExceSQL(sql.ToString()); return false; } } } else { if (otherXcoor > 0)//可能避让车有>=已发送非避让任务 { int Eed_Position = 0; sql.Remove(0, sql.Length); int tempz = 1; //if (otherZcoor == 1 || otherZcoor == 2) //{ // tempz = 1; //} //else //{ // tempz = 2; //} //add for TJBS sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(otherXcoor).Append(" and ZCoor = ").Append(tempz).Append(" and VirtualStack = 11222");//ORDER BY desc, asc.Append(" and LayerHigh = 1") dvspavoid2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspavoid2.Count > 0) { Eed_Position = Convert.ToInt32(dvspavoid2[0]["BarcodeCoor"]); } //并且车辆已经运行 if ((((devinfoOther.DeviceIndex == 11002) && (Eed_Position > tempMax + safe_distance)) || ((devinfoOther.DeviceIndex == 11001) && (Eed_Position < tempMin - safe_distance))) && (devinfoOther.RunState == 1)) { //直接发送当前任务 } else { AheadDetectUnallow.Append(string.Format("等待避让设备{0}任务执行完任务! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } else//可能避让车没有>=已发送的指令 { if ((devinfoOther.RunState > 0) || (OtherDeviceLockedState != 0)) {// 报警或者 AheadDetectUnallow.Append(string.Format("等待避让设备{0}状态恢复! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } else { AheadDetectUnallow.Append(string.Format("不明原因,请查看车辆{0}状态及任务状态! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } } else//当前位置不需要避让 { if (otherXcoor > 0)//可能避让车,有已发送任务 { int otherbccoor = GetBarcodeCoor(otherXcoor, otherZcoor, 11222);//获得互斥堆垛机正在执行任务的坐标列条码值 //如果当前位置或者终点位置在避让区,等待执行完任务在判断是否足要避让 if ((devinfoOther.XCoor > tempMin - safe_distance) && (devinfoOther.XCoor < tempMax + safe_distance) || (otherbccoor < tempMax + safe_distance) && (otherbccoor > tempMin - safe_distance)) {//如果避让车任务终点在安全距离外 AheadDetectUnallow.Append(string.Format("等待设备{0}执行完任务! ", devinfoOther.DeviceIndex)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } } } #endregion #region 同起点存在多条等待下发任务,异常控制 if (deviceKind == 13) {//输送线,直穿,环穿 int StartStation = GetMonitorStartStationfromMonitor(MonitorIndex);//起点站台 DataView taskMsgs = new DataView(); //获取同起点的等待下发的子任务信息 taskMsgs = dbo.ExceSQL(string.Format("select F_ManageTaskIndex,F_MonitorIndex" + " from T_Monitor_Task where F_NumParam1={0} and F_Status=0 ", StartStation)).Tables[0].DefaultView; //筛选其中正要准备下发的任务 int count = 0; foreach (DataRowView taskMsg in taskMsgs) { var taskNumMin = dbo.ExceSQL(string.Format("select top 1 F_MonitorIndex" + " from T_Monitor_Task where F_ManageTaskIndex={0} order by F_MonitorIndex", taskMsg["F_ManageTaskIndex"])).Tables[0].DefaultView; var MinTaskNum = taskNumMin[0]["F_MonitorIndex"].ToString(); var NowTaskNum = taskMsg["F_MonitorIndex"].ToString(); if (MinTaskNum == NowTaskNum) {//最小任务==当前任务,计数加1 count++; } } if (count > 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(string.Format("当前任务起点存在多条等待下发的任务,请处理异常任务", deviceIdx)); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } } #endregion if ((deviceKind == 1) || (deviceKind == 6)) { if ((deviceIdx == 11001) || (deviceIdx == 11002) || (deviceIdx == 11003)) { DataView dv = new DataView(); sql.Remove(0, sql.Length); sql.Append("SELECT FCONTROLTASKTYPE,FENDDEVICE 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) { if (Convert.ToInt32(dv[0]["FCONTROLTASKTYPE"]) == 2) { int End_Device = Convert.ToInt32(dv[0]["FENDDEVICE"]); switch (End_Device) { case 12059: Model.MDevice devinfo12059; Model.MDevice devinfo12060; devinfo12059 = Model.CGetInfo.GetDeviceInfo(12059); devinfo12060 = Model.CGetInfo.GetDeviceInfo(12060); if (devinfo12059.SplitByte_0 + devinfo12060.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12059或12060有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12063: Model.MDevice devinfo12063; Model.MDevice devinfo12064; devinfo12063 = Model.CGetInfo.GetDeviceInfo(12063); devinfo12064 = Model.CGetInfo.GetDeviceInfo(12064); if (devinfo12063.SplitByte_0 + devinfo12064.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12063或12064有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12065: Model.MDevice devinfo12065; Model.MDevice devinfo12066; devinfo12065 = Model.CGetInfo.GetDeviceInfo(12065); devinfo12066 = Model.CGetInfo.GetDeviceInfo(12066); if (devinfo12065.SplitByte_0 + devinfo12066.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12065或12066有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12069: Model.MDevice devinfo12069; Model.MDevice devinfo12070; devinfo12069 = Model.CGetInfo.GetDeviceInfo(12069); devinfo12070 = Model.CGetInfo.GetDeviceInfo(12070); if (devinfo12069.SplitByte_0 + devinfo12070.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12069或12070有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12073: Model.MDevice devinfo12073; Model.MDevice devinfo12074; devinfo12073 = Model.CGetInfo.GetDeviceInfo(12073); devinfo12074 = Model.CGetInfo.GetDeviceInfo(12074); if (devinfo12073.SplitByte_0 + devinfo12074.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12073或12074有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12077: Model.MDevice devinfo12077; Model.MDevice devinfo12078; devinfo12077 = Model.CGetInfo.GetDeviceInfo(12077); devinfo12078 = Model.CGetInfo.GetDeviceInfo(12078); if (devinfo12077.SplitByte_0 + devinfo12078.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12077或12078有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12079: Model.MDevice devinfo12079; Model.MDevice devinfo12080; devinfo12079 = Model.CGetInfo.GetDeviceInfo(12079); devinfo12080 = Model.CGetInfo.GetDeviceInfo(12080); if (devinfo12079.SplitByte_0 + devinfo12080.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12079或12080有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12108: Model.MDevice devinfo12109; Model.MDevice devinfo12108; devinfo12108 = Model.CGetInfo.GetDeviceInfo(12108); devinfo12109 = Model.CGetInfo.GetDeviceInfo(12109); if (devinfo12108.SplitByte_0 + devinfo12109.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12108或12109有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12113: Model.MDevice devinfo12113; Model.MDevice devinfo12112; devinfo12113 = Model.CGetInfo.GetDeviceInfo(12113); devinfo12112 = Model.CGetInfo.GetDeviceInfo(12112); if (devinfo12113.SplitByte_0 + devinfo12112.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12113或12112有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12114: Model.MDevice devinfo12114; Model.MDevice devinfo12115; devinfo12114 = Model.CGetInfo.GetDeviceInfo(12114); devinfo12115 = Model.CGetInfo.GetDeviceInfo(12115); if (devinfo12114.SplitByte_0 + devinfo12115.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12114或12115有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12118: Model.MDevice devinfo12118; Model.MDevice devinfo12119; devinfo12118 = Model.CGetInfo.GetDeviceInfo(12118); devinfo12119 = Model.CGetInfo.GetDeviceInfo(12119); if (devinfo12118.SplitByte_0 + devinfo12119.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12118或12119有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12122: Model.MDevice devinfo12122; Model.MDevice devinfo12123; devinfo12122 = Model.CGetInfo.GetDeviceInfo(12122); devinfo12123 = Model.CGetInfo.GetDeviceInfo(12123); if (devinfo12122.SplitByte_0 + devinfo12123.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12122或12123有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; case 12127: Model.MDevice devinfo12127; Model.MDevice devinfo12126; devinfo12127 = Model.CGetInfo.GetDeviceInfo(12127); devinfo12126 = Model.CGetInfo.GetDeviceInfo(12126); if (devinfo12127.SplitByte_0 + devinfo12126.SplitByte_0 >= 1) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "12127或12126有货"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); return false; } break; default: break; } } } } //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]); if ((deviceKind == 6) && (sendok == false)) { AheadDetectUnallow.Clear(); AheadDetectUnallow.Append(_DeviceIdx.ToString() + "对应的AGV无法连接!"); UpdateAheadDetectUnallow(AheadDetectUnallow, MonitorIndex); } } } 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() != "1111111")) { 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("1111111") >= 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) {//20130510在订阅处理称重任务和重量 //#region 称重 ////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 if (_DeviceKind == 13 || _DeviceKind == 14) {//richard.liu20230718鸿安环穿或者单台车 if (deviceOrder == 4) // 空车移动,输送线发到取货地址,手动下达参数在gc[5] { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[0], gc[1], gc[5], gc[3], gc[4], gc[5]); } else { sendok = sdo.SendDeviceOrder(msgIdx, MonitorIndex, deviceOrder, deviceIdx, gc[0], gc[1], gc[2], gc[3], gc[4], gc[5]); } //20231017 if (sendok == true && (deviceOrder == 1 || deviceOrder == 2)) // 1:取卸货 2:取货 3:卸货 4:空车移动 { //AddOPCSendData(deviceIdx, MonitorIndex, itemnames, itemvalues); sdo = CommModeCreate.CreateSendDeviceOrder(gc[2]); // 环穿取货输送线设备 _NumParam1 sdo.SendDeviceOrder(2, MonitorIndex, 0, gc[2], 0); // 给取货输送线发送对接任务号 //AddOPCSendData(gc[2], MonitorIndex, itemnames, itemvalues); } } 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//发送命令成功 { 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); #region 多叉关联任务,能同步的同时报告发送命令成功 //20100323 devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx); 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); sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_SendFlag='2' where F_MonitorIndex=").Append(corrtask[i]); dbo.ExecuteSql(sql.ToString());//richard.liu20181212被同步运行设备指令做标记2,OEE时不统计时间 } } } #endregion return true; } } 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; } } private int GetBarcodeStationRGV(int xcoor, int vStack) { DataView dv = new DataView(); try { 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 { 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(); } } 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; nXY = Math.Pow((double)(nX - devinfo.XCoor), 2) + (Math.Pow((double)(nY - devinfo.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 遍历每个关联任务 foreach (int cortask in df.Keys) { //20120906 sql.Remove(0, sql.Length); sql.Append("SELECT F_MonitorIndex FROM dbo.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); 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() != cortask.ToString())) { return -1; } } #endregion if (devKind == 1)//堆垛机 {//如果存在倒库货位,则后执行该任务20120906嘉兴电力改进,倒库货位的取货命令检测堆垛机货叉对应开关是否有货 //if (devOrder == 5)//送货指令时判断20110505 //{ // if (true == IfChangeForkCell_LastRun(cortask)) // { // continue; // } //} doubleX = Model.CGeneralFunction.GetXCoorFromMonitor(cortask, deviceindex, devOrder); doubleY = Model.CGeneralFunction.GetYCoorFromMonitor(cortask, deviceindex, devOrder); doubleXY = Math.Pow((double)(doubleX - devinfo.XCoor), 2) + (Math.Pow((double)(doubleY - devinfo.YCoor), 2)); if (nXY > doubleXY) { nXY = doubleXY; taskno = cortask; } } else if (devKind == 6)//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]); } } 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 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() != cortask.ToString())) { 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) {//20120820 int[] 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()))); } int laneway = 0; dvl = dbo.ExceSQL(string.Format("SELECT F_LaneDeviceIndex FROM T_Base_LaneInfo WHERE (F_StackIndex = {0})", StackIndex)).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); int fid = ccf.GetManageTaskIndexfromMonitor(taskindex); int Mankind = ccf.GetManageTaskKindIndexFromMonitor(taskindex); //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 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()); sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FREMARK='").Append(zxystr.ToString()).Append("',FExceptionNO=").Append(Model.CGeneralFunction.TASKCHANGESTACK).Append(" where FID=").Append(fid).Append(" and F_ManageTaskKindIndex=").Append(Mankind); dbo.ExecuteSql(sql.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) { rec = dbo.ExecuteSql(string.Format("UPDATE T_Monitor_Task SET F_ErrorCode ='{0}' WHERE F_MonitorIndex ={1} and F_ErrorCode <>'{0}'", aheadUnallow.ToString(), taskindex)); } else { 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 TaskIndex) {//20110505 DataView dv = new DataView(); try { int laneway = ccf.GetLaneWayFromLaneInfo(ccf.GetDeviceindexFromMonitor(TaskIndex)); int[] zxy = ccf.GetCoordinatesFromMonitorTask(TaskIndex); string zxystr = (zxy[3].ToString().Length == 1 ? "0" + zxy[0].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); dv = dbo.ExceSQL(string.Format("SELECT F_ChangeForkCell FROM T_Base_LaneInfo WHERE F_LaneDeviceIndex={0} and (F_ChangeForkCell like '%{1}%' or F_ChangeForkCell like '%{2}%')", laneway, zxystr, lanedev)).Tables[0].DefaultView; if (dv.Count > 0)//倒库货位的任务后执行 { return true; } return false; } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } /// /// 分配实际工作的堆垛机设备索引20111020 /// /// 虚拟堆垛机设备索引 /// 设备指令索引 /// 调度任务类型 /// 调度任务索引 bool AssignStackNo(int deviceIndex, int taskIndex, int manKind, int fid) {//20120820 DataView dv = new DataView(); Model.MDevice devinfo; int resDev = 0; try { int Xcoor = Model.CGeneralFunction.GetXCoorFromMonitor(taskIndex, deviceIndex, ccf.GetDeviceOrderFromMonitor(taskIndex)); int Zcoor = Model.CGeneralFunction.GetZCoorFromMonitor(taskIndex, deviceIndex, ccf.GetDeviceOrderFromMonitor(taskIndex)); int XcoorS = Model.CGeneralFunction.GetXCoorFromMonitor(taskIndex, deviceIndex, 5); int ZcoorS = Model.CGeneralFunction.GetZCoorFromMonitor(taskIndex, deviceIndex, 5); int sno = 0; bool IfCombinedWork = false; GetSpecialStackNo(deviceIndex, Zcoor, Xcoor, ZcoorS, XcoorS, out sno, out IfCombinedWork); //先考虑特殊情况20111226 if (IfCombinedWork == true) { //两个堆垛机组合交替作业 string ChangeStackCell = GetChangeStackCell(deviceIndex); if (ChangeStackCell != "") { ChangeStackCellCode(taskIndex, ChangeStackCell, deviceIndex); SetStackNo(deviceIndex, sno, manKind, fid); return true; } else {//20120820没有空闲的两个堆垛机公用的交接货位 return false; } } //然后其余情况根据总列数折中分配给两个堆垛机 resDev = GetPRIStackNo(deviceIndex, Zcoor, Xcoor, ZcoorS, XcoorS); devinfo = Model.CGetInfo.GetDeviceInfo(resDev); if (devinfo.RunState == 0 && ccf.GetManTaskReserve(resDev) <= 0 && ccf.GetDeviceLockedState(resDev) == 0) {//空闲、无任务执行、无管理任务预约锁 SetStackNo(deviceIndex, resDev, manKind, fid); return true; } else {//根据35001当前位置和正在执行的任务的目标位置考虑是否分配35002 resDev = devinfo.MutexStack; devinfo = Model.CGetInfo.GetDeviceInfo(resDev); if (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})", devinfo.MutexStack)); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { if (dv[0]["F_DeviceCommandIndex"].ToString() == "4")//取货 { if ((GetBarcodeCoor(Convert.ToInt32(dv[0]["F_NumParam2"]), Convert.ToInt32(dv[0]["F_NumParam1"])) + StackMutexXCoor) <= GetBarcodeCoor(Xcoor, Zcoor)) { SetStackNo(deviceIndex, resDev, manKind, fid); return true; } } if (dv[0]["F_DeviceCommandIndex"].ToString() == "5")//送货 { if ((GetBarcodeCoor(Convert.ToInt32(dv[0]["F_NumParam5"]), Convert.ToInt32(dv[0]["F_NumParam4"])) + StackMutexXCoor) <= GetBarcodeCoor(Xcoor, Zcoor)) { SetStackNo(deviceIndex, resDev, manKind, fid); 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; } } } } 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(); } } void SetStackNo(int dummyStackno, int stackno, int manKind, int fid) { //20111226考虑调整配套的站台和提前检测,35001-32038;35002-32036 if (StackIfExitTask(stackno) == true) return; 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)); } public int GetMonitorStartStationfromMonitor(int MonitorIdx) { DataView dv = new DataView(); try { //20100108 //20101124 sql.Remove(0, sql.Length); sql.Append("SELECT F_NumParam1 FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(MonitorIdx).Append(")"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_NumParam1"]); } else { return -1; } } catch (Exception ex) {//20100108 throw ex; } finally {//20100108 dv.Dispose(); } } public int GetMonitorEndStationfromMonitor(int MonitorIdx) { DataView dv = new DataView(); try { // HSYL F_NumParam4 = 0 ,查找下一个送货任务的 F_NumParam1 int fid = ccf.GetManageTaskIndexfromMonitor(MonitorIdx); int device = ccf.GetDeviceindexFromMonitor(MonitorIdx); if (fid > 0 && device > 0) { sql.Remove(0, sql.Length); sql.Append("SELECT F_NumParam1 FROM T_Monitor_Task WHERE F_DeviceCommandIndex = 3 and F_DeviceIndex = ").Append(device).Append(" and F_ManageTaskIndex = ").Append(fid); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_NumParam1"]); } else { return -1; } } else { return -1; } } catch (Exception ex) {//20100108 throw ex; } finally {//20100108 dv.Dispose(); } } // 202410 得到指定穿梭车正在执行中(已发送、运行、报警)任务的目的站台号;没有执行中任务返回0 void GetStackRunRGVZcoor(int StackdeviceIndex, out int Xcoor) { DataView dv = new DataView(); try { Xcoor = 0; sql = new StringBuilder(string.Format("SELECT F_DeviceCommandIndex,F_NumParam1,F_NumParam4 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() == "7")) //取货,运动 { Xcoor = Convert.ToInt32(dv[0]["F_NumParam1"]); } else if (dv[0]["F_DeviceCommandIndex"].ToString() == "3") //送货 { Xcoor = Convert.ToInt32(dv[0]["F_NumParam1"]); } } } catch (Exception ex) { throw ex; } finally { dv.Dispose(); } } 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) {//20111020 DataView dv = new DataView(); try { dv = dbo.ExceSQL("SELECT MAX(BarcodeCoor) AS maxcoor, MIN(BarcodeCoor) AS mincoor FROM T_Base_BarcodeCoor").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 (stackno == 35001) { 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 (brorder=0 or brorder={2}) GROUP BY XCoor, ZCoor ORDER BY Expr1", Barcodecoor, layerhigh, order)); } 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 (brorder=0 or brorder={2}) GROUP BY XCoor, ZCoor ORDER BY Expr1", Barcodecoor, layerhigh, order)); } 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 (brorder=0 or brorder={2}) GROUP BY XCoor, ZCoor ORDER BY Expr1", Barcodecoor, layerhigh, order)); } 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 (brorder=0 or brorder={2}) GROUP BY XCoor, ZCoor ORDER BY Expr1", Barcodecoor, layerhigh, order)); } dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20151120调度系统oracle的特殊语句 } if (dv.Count > 0) { if (order == 2) { 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; } 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; } } 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) { 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) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT LayerHigh FROM T_Base_BarcodeCoor WHERE (ZCoor = {0}) AND (XCoor = {1})", Zcoor, Xcoor)).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) { DataView dv = new DataView(); try { dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task where F_DeviceIndex={0}", stackno)).Tables[0].DefaultView; if (dv.Count > 0) { 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 { } } /// /// 计算分别用另个rgv的行程、是否需要另一台rgv避让 /// /// /// /// /// int[,] Calulate_DistanceRGV(Model.MDevice devinfo15301, Model.MDevice devinfo15302, int monitorid) { DataView dvspQ = new DataView(); DataView dvspS = new DataView(); int locationStart = 0; int locationEnd = 0; int Distancecar1 = 0; int Distancecar2 = 0; int minLocation15301 = 0; int maxLocation15301 = 0; int minLocation15302 = 0; int maxLocation15302 = 0; int[,] Distance = new int[,] { { -1, -1, 0 }, { -1, -1, 0 } }; // 获得RGV的取货和送货坐标 int[] coor = Model.CGeneralFunction.GetCoorFromMonitor(monitorid); if (coor == null) { return Distance; } int ZcoorQ = coor[0]; // 取货站台号 int ZcoorS = coor[1]; // 送货站台号 sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(ZcoorS).Append(" and VirtualStack = ").Append(devinfo15301.VirtualStack);//ORDER BY desc, asc dvspS = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(ZcoorQ).Append(" and VirtualStack = ").Append(devinfo15301.VirtualStack);//ORDER BY desc, asc dvspQ = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspQ.Count > 0) { locationStart = Convert.ToInt32(dvspQ[0]["BarcodeCoor"]);// 取货站台条码值 } else { return Distance; } if (dvspS.Count > 0) { locationEnd = Convert.ToInt32(dvspS[0]["BarcodeCoor"]);// 送货站台条码值 } else { return Distance; } // 暂定15302坐标永远大于15301的坐标,即方案图中上方坐标大于下方坐标 minLocation15301 = locationStart < locationEnd ? locationStart : locationEnd; minLocation15301 = devinfo15301.XCoor < minLocation15301 ? devinfo15301.XCoor : minLocation15301;//取送货和15301坐标中最小的 minLocation15302 = locationStart < locationEnd ? locationStart : locationEnd; minLocation15302 = devinfo15302.XCoor < minLocation15302 ? devinfo15302.XCoor : minLocation15302;//取送货和15302坐标中最小的 maxLocation15301 = locationStart > locationEnd ? locationStart : locationEnd; maxLocation15301 = devinfo15301.XCoor > maxLocation15301 ? devinfo15301.XCoor : maxLocation15301;//取送货和15301坐标中最大的 maxLocation15302 = locationStart > locationEnd ? locationStart : locationEnd; maxLocation15302 = devinfo15302.XCoor > maxLocation15302 ? devinfo15302.XCoor : maxLocation15302;//取送货和15302坐标中最大的 if ((devinfo15302.XCoor > maxLocation15301) || (devinfo15302.XCoor < minLocation15301))//如果用15301车15302不须避让时 { // 只是选车没考虑安全距离 Distancecar1 = System.Math.Abs((int)(devinfo15301.XCoor - locationStart)) + System.Math.Abs((int)(locationEnd - locationStart)); Distance[0, 2] = 0; // 记录15302不需要避让 } else // 如果用15301,15302须避让时 { // 15302避让只能向方案图中下面走,即向坐标小的方向走 Distancecar1 = System.Math.Abs((int)(devinfo15301.XCoor - locationStart)) + System.Math.Abs((int)(locationEnd - locationStart)) + System.Math.Abs((int)(maxLocation15301 - devinfo15302.XCoor)); Distance[0, 2] = 1;// 记录15302需要避让 } Distance[0, 0] = devinfo15301.DeviceIndex; Distance[0, 1] = Distancecar1; if ((devinfo15301.XCoor > maxLocation15302) || (devinfo15301.XCoor < minLocation15302)) { // 如果用15302车15301不须避让时 Distancecar2 = System.Math.Abs((int)(devinfo15302.XCoor - locationStart)) + System.Math.Abs((int)(locationEnd - locationStart)); Distance[1, 2] = 0; } else { // 15301避让只能向方案图中上面走,即向坐标小的方向走 Distancecar2 = System.Math.Abs((int)(devinfo15302.XCoor - locationStart)) + System.Math.Abs((int)(locationEnd - locationStart)) + System.Math.Abs((int)(minLocation15302 - devinfo15301.XCoor)); Distance[1, 2] = 1; } Distance[1, 0] = devinfo15302.DeviceIndex; Distance[1, 1] = Distancecar2; return Distance; } /// /// 计算分别用另个垛机的行程、是否需要另一台垛机避让 /// /// /// /// /// int[,] Calulate_Distance(Model.MDevice devinfo11001, Model.MDevice devinfo11002, int monitorid) { int Distancecar1 = 0; int Distancecar2 = 0; DataView dvspS = new DataView(); DataView dvspE = new DataView(); int locationstart = 0; int locationEnd = 0; int minLocation11001 = 0; int maxLocation11001 = 0; int minLocation11002 = 0; int maxLocation11002 = 0; int[,] Distance = new int[,] { { -1, -1, 0 }, { -1, -1, 0 } }; int[] coor = Model.CGeneralFunction.GetCoorFromMonitor(monitorid);//获得堆垛机的取货和送货坐标 if (coor == null) { return Distance; } int Xcoor = coor[1]; int Zcoor = coor[0]; //int Ycoor = coor[2]; //if ((Zcoor == 1) || (Zcoor == 2)) //{ Zcoor = 1;//TJBS //} //else //{ // Zcoor = 2; //} int XcoorS = coor[4]; int ZcoorS = coor[3]; //int YcoorS = coor[5]; ZcoorS = 1;//TJBS //if ((ZcoorS == 1) || (ZcoorS == 2)) //{ // ZcoorS = 1; //} //else //{ // ZcoorS = 2; //} sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(XcoorS).Append(" and ZCoor = ").Append(ZcoorS).Append(" and VirtualStack = 11222");//ORDER BY desc, asc.Append(" and LayerHigh = ").Append(YcoorS) dvspE = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; sql.Remove(0, sql.Length); sql.Append("select * from T_Base_BarcodeCoor where XCoor = ").Append(Xcoor).Append(" and ZCoor = ").Append(Zcoor).Append(" and VirtualStack = 11222");//ORDER BY desc, asc.Append(" and LayerHigh = ").Append(Ycoor) dvspS = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvspS.Count > 0) { locationstart = Convert.ToInt32(dvspS[0]["BarcodeCoor"]); } else { return Distance; } if (dvspE.Count > 0) { locationEnd = Convert.ToInt32(dvspE[0]["BarcodeCoor"]); } else { return Distance; } //暂定11002坐标永远大于11001的坐标,即方案图中右侧坐标大于左侧坐标 minLocation11001 = locationstart < locationEnd ? locationstart : locationEnd; minLocation11001 = devinfo11001.XCoor < minLocation11001 ? devinfo11001.XCoor : minLocation11001;//取送货和11001坐标中最小的 minLocation11002 = locationstart < locationEnd ? locationstart : locationEnd; minLocation11002 = devinfo11002.XCoor < minLocation11002 ? devinfo11002.XCoor : minLocation11002;//取送货和11002坐标中最小的 maxLocation11001 = locationstart > locationEnd ? locationstart : locationEnd; maxLocation11001 = devinfo11001.XCoor > maxLocation11001 ? devinfo11001.XCoor : maxLocation11001;//取送货和11001坐标中最大的 maxLocation11002 = locationstart > locationEnd ? locationstart : locationEnd; maxLocation11002 = devinfo11002.XCoor > maxLocation11002 ? devinfo11002.XCoor : maxLocation11002;//取送货和11002坐标中最大的 //只是选车没考虑安全距离 if ((devinfo11002.XCoor > maxLocation11001) || (devinfo11002.XCoor < minLocation11001))//如果用11001车11002不须避让时 { Distancecar1 = System.Math.Abs((int)(devinfo11001.XCoor - locationstart)) + System.Math.Abs((int)(locationEnd - locationstart)); Distance[0, 2] = 0;//记录11002不需要避让 } else//如果用11001车11002须避让时 { //11002避让只能向方案图中右面走,即向坐标大的方向走 Distancecar1 = System.Math.Abs((int)(devinfo11001.XCoor - locationstart)) + System.Math.Abs((int)(locationEnd - locationstart)) + System.Math.Abs((int)(maxLocation11001 - devinfo11002.XCoor)); Distance[0, 2] = 1;//记录11002需要避让 } Distance[0, 0] = devinfo11001.DeviceIndex; Distance[0, 1] = Distancecar1; if ((devinfo11001.XCoor > maxLocation11002) || (devinfo11001.XCoor < minLocation11002))//如果用11002车11001不须避让时 { Distancecar2 = System.Math.Abs((int)(devinfo11002.XCoor - locationstart)) + System.Math.Abs((int)(locationEnd - locationstart)); Distance[1, 2] = 0; } else { //15003避让只能向方案图中下面走,即向坐标小的方向走 Distancecar2 = System.Math.Abs((int)(devinfo11002.XCoor - locationstart)) + System.Math.Abs((int)(locationEnd - locationstart)) + System.Math.Abs((int)(minLocation11002 - devinfo11001.XCoor)); Distance[1, 2] = 1; } Distance[1, 0] = devinfo11002.DeviceIndex; Distance[1, 1] = Distancecar2; return Distance; } /// /// /// /// /// int Get_F_ManTaskReserve(int DeviceIndex) { int ManTaskReserve = 0; DataView dvdv = new DataView(); sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState,F_ManTaskReserve FROM T_Base_Device where F_DeviceIndex=").Append(DeviceIndex); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { ManTaskReserve = Convert.ToInt32(dvdv[0]["F_ManTaskReserve"]); } else { ManTaskReserve = -1; } return ManTaskReserve; } int Get_F_LockedState(int DeviceIndex) { int ManTaskReserve = 0; DataView dvdv = new DataView(); sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_LockedState,F_ManTaskReserve FROM T_Base_Device where F_DeviceIndex=").Append(DeviceIndex); dvdv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvdv.Count > 0) { ManTaskReserve = Convert.ToInt32(dvdv[0]["F_LockedState"]); } else { ManTaskReserve = -1; } return ManTaskReserve; } 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(); } } 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(); } } } }