using RGD.DataService; using RGD.DBUtility; using System; using System.Data; namespace RGD.WCS { /// /// Creator:RGD /// 通用函数类库 /// public class CCommonFunction { private string _DisassembleTaskError = ""; public string DisassembleTaskError { get { return _DisassembleTaskError; } set { _DisassembleTaskError = value; } } public CCommonFunction() { } /// /// //获得将要生成的设备指令任务 索引号 /// /// 没用到 /// 没用到 /// 设备指令索引值1--32000 public int GetMonitorIndex(int managerTaskIndex, int managerTaskKindIndex) { DataView dvMt; try { int maxIdx = 0; string sql = "SELECT F_MonitorIndex FROM T_Base_Monitor_Task_Index"; dvMt = DbHelperSQL.Query(sql).Tables[0].DefaultView; if (dvMt.Count > 0 && dvMt[0]["F_MonitorIndex"] != DBNull.Value) { maxIdx = (Convert.ToInt32(dvMt[0]["F_MonitorIndex"]) + 1); if (maxIdx >= 32000)//预留2000个给接近上限的拆分任务 { maxIdx = 1; } } else//现在没有该管理的设备指令记录 { maxIdx = 1; } //判断调度任务表是否有重复值 if (IFExitMonitorIndex(maxIdx) == true) { UpdateMonitorIndex(maxIdx); maxIdx = GetMonitorIndex(managerTaskIndex, managerTaskKindIndex); } UpdateMonitorIndex(maxIdx); return maxIdx; } catch (Exception ex) { _DisassembleTaskError = "获得指定调度任务的设备指令索引失败!" + ex.Message; throw ex; } finally { dvMt = null; } } /// /// 判断调度任务号在队列中是否存在,true已经存在;false不存在 /// /// /// private bool IFExitMonitorIndex(int Monitorindex) { DataView dv; try { dv = DbHelperSQL.Query("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " + Monitorindex + ")").Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } catch (Exception ex) { throw ex; } finally { dv = null; } } /// /// 更新设备指令索引 /// /// public void UpdateMonitorIndex(int MonitorIndex) { DbHelperSQL.ExecuteSql("update T_Base_Monitor_Task_Index set F_MonitorIndex=" + MonitorIndex); } //--------------------------------------------------------------------------------------------------------- /// /// 获取调度生成的调度任务的索引 /// /// public int GetTempManageIdx() { DataSet ds; try { int maxIdx = 10001; ds = DbHelperSQL.Query("SELECT F_ManageTaskIndex FROM T_Base_Manage_Task_Index_Temp_Task"); if (ds.Tables[0].DefaultView.Count > 0) { if ((Convert.ToInt32(ds.Tables[0].DefaultView[0]["F_ManageTaskIndex"]) + 1) >= 19998) { maxIdx = 10001; } else { maxIdx = (Convert.ToInt32(ds.Tables[0].DefaultView[0]["F_ManageTaskIndex"]) + 1); } } else { maxIdx = 10001; } //判断临时调度任务表是否有重复值 if (IFExitTempManageIndex(maxIdx) == true) { RecordMaxTempManageTaskFID(maxIdx); maxIdx = GetTempManageIdx(); return maxIdx; } RecordMaxTempManageTaskFID(maxIdx); return maxIdx; } catch (Exception ex) { _DisassembleTaskError = "获得指定调度任务的临时任务索引失败," + ex.Message; throw ex; } finally { ds = null; } } /// /// 自动任务索引是否存在 /// /// /// private bool IFExitTempManageIndex(int fid) { DataView dv; try { dv = DbHelperSQL.Query("SELECT fid FROM T_Manage_Task WHERE (F_ManageTaskKindIndex=2 and fid = " + fid + ")").Tables[0].DefaultView; if (dv.Count > 0) { return true; } else { return false; } } catch (Exception ex) { throw ex; } finally { dv = null; } } /// /// 记录调度生成的调度任务的索引的最大值 /// /// 调度生成的调度任务的索引 private void RecordMaxTempManageTaskFID(int fid) {//20100108 DataView dv; try {//20100108 dv = DbHelperSQL.Query("select F_ManageTaskIndex from T_Base_Manage_Task_Index_Temp_Task").Tables[0].DefaultView; if (dv.Count > 0) { //if (fid == 19998) //{ // dbo.ExceSQL("UPDATE T_Base_Manage_Task_Index_Temp_Task SET F_ManageTaskIndex =10001"); // return; //} //if (fid > Convert.ToInt32(dv[0]["F_ManageTaskIndex"])) //{ DbHelperSQL.ExecuteSql("UPDATE T_Base_Manage_Task_Index_Temp_Task SET F_ManageTaskIndex =" + fid); return; //} } else { DbHelperSQL.ExecuteSql("INSERT INTO T_Base_Manage_Task_Index_Temp_Task (F_ManageTaskIndex)VALUES (" + fid + ")"); return; } } catch (Exception ex) {//20100108 _DisassembleTaskError = "获得记录调度任务最大任务索引失败," + ex.Message; throw ex; //return 0; } finally {//20100108 dv = null; } } //--------------------------------------------------------------------------------------------------------- /// /// Control成功发送命令后的处理信息 /// /// 调度任务类型873154021 /// 调度任务索引 /// 设备指令索引 /// 设备索引 /// 详细路径步骤索引 public void SendOrderSuccess(int taskKindIndex, int Managefid, int MonirotIdx, int deviceidx, int detailidx) { string AssociateDevice = "";//关联设备 string LockedDeviceIndex = "";//被锁定的设备索引组,以“;”分隔 char[] sep = new char[1]; string[] split; DataView dvs; try { int devKind = BaseDeviceService.GetDeviceKindIdx(deviceidx); int order = GetDeviceOrderFromMonitor(MonirotIdx); //8:更改作业记录的状态F_Status为1,更改设备为占用状态(T_Base_device的F_LockedState=设备指令单) string dtime = DateTime.Now.ToString("u"); dtime = dtime.Substring(0, dtime.Length - 1); DbHelperSQL.ExecuteSql("update T_Monitor_Task set F_StartTime='" + dtime + "',F_Status=1,F_SendCount=F_SendCount+1 where F_Status=0 and F_MonitorIndex=" + MonirotIdx);//20100905 if (taskKindIndex != 4)//20100610 { //20101220AGV和输送机送出指令不需要锁定设备 if (devKind != 5 && devKind != 6 && (devKind != 2 && order != 6)) { DbHelperSQL.ExecuteSql("update T_Base_device set F_LockedState=" + MonirotIdx + " where F_DeviceIndex=" + deviceidx + ""); } } if (devKind == 1) { //修改T_Manage_Task的FLANEWAY,FSTACK dvs = DbHelperSQL.Query("SELECT F_LaneDeviceIndex,F_StackIndex FROM T_Base_LaneInfo where F_StackIndex=" + deviceidx + "").Tables[0].DefaultView; int laneway = 0; if (dvs.Count > 0) { laneway = Convert.ToInt32(dvs[0]["F_LaneDeviceIndex"]); } DbHelperSQL.ExecuteSql("update T_Manage_Task set FLANEWAY=" + laneway + ",FSTACK=" + deviceidx + " where F_ManageTaskKindIndex=" + taskKindIndex + " and FID=" + Managefid); } if (taskKindIndex != 4) { //如果是RGV、堆垛机的将取(运行)命令需要增加调度任务预约锁F_ManTaskReserve && (order == 7)) && ((order == 2) || (order == 4)) if ((devKind == 4) || (devKind == 1))//20100610 {////RGV运到到输送机//堆垛机将取 DbHelperSQL.ExecuteSql("UPDATE T_Base_Device SET F_ManTaskReserve = " + (taskKindIndex.ToString() + Managefid.ToString()) + " WHERE (F_DeviceIndex = " + deviceidx + ")"); } } //9:给调度任务表回写调度任务IO_Control的正在执行状态FSTATUS=1;T_Manage_Task的正在执行状态FSTATUS=1 DbHelperSQL.ExecuteSql("update T_Manage_Task set FSTATUS='1' where F_ManageTaskKindIndex=" + taskKindIndex + " and FID=" + Managefid); if (taskKindIndex == 1)//调度任务 {//上报管理运行 } //10:调度任务表里的F_RunningLock所有对应设备索引加锁,但是F_AssociateDeviceIndex关联设备不加锁 AssociateDevice = GetAssociateDevice(MonirotIdx); if (AssociateDevice == "") AssociateDevice = null; if (AssociateDevice != null) { sep[0] = '-'; split = AssociateDevice.Split(sep); AssociateDevice = split[0]; } sep[0] = ';'; LockedDeviceIndex = GetLockedDeviceIndex(MonirotIdx); if (LockedDeviceIndex != "") { split = LockedDeviceIndex.Split(sep); for (int m = split.GetLowerBound(0); m <= split.GetUpperBound(0); m++) { DbHelperSQL.ExecuteSql("update T_Base_device set F_LockedState=" + MonirotIdx + " where F_DeviceIndex=" + Convert.ToInt32(split[m]) + "and F_DeviceIndex<>" + Convert.ToInt32(AssociateDevice)); } } } catch (Exception ex) { throw ex; } finally { sep = null; split = null; dvs = null; } } /// /// 根据前面得到的F_MonitorIndex值获得被锁定的设备索引 /// /// 以“;”隔开的设备索引组字符串 private string GetLockedDeviceIndex(int MonitorIndex) { DataSet ds; try { string sql = "select F_RunningLock from T_Monitor_Task where F_MonitorIndex=" + MonitorIndex; ds = DbHelperSQL.Query(sql); if (ds.Tables[0].DefaultView.Count > 0) { return ds.Tables[0].DefaultView[0]["F_RunningLock"].ToString(); } else return ""; } catch (Exception ex) { throw ex; } finally { ds = null; } } /// /// 根据前面得到的MonitorIndex值取得"关联设备索引-命令" /// /// 关联设备索引-命令,null表示没有 private string GetAssociateDevice(int MonitorIndex) { DataView dv; DataView dvv; try { string sql = "select F_Associate from T_Monitor_Task where (F_Associate IS NOT NULL) and F_MonitorIndex=" + MonitorIndex; dv = DbHelperSQL.Query(sql).Tables[0].DefaultView; if (dv.Count > 0) { string sql1 = "select F_DeviceIndex,F_DeviceCommandIndex from T_Monitor_Task where F_MonitorIndex=" + dv[0]["F_Associate"]; dvv = DbHelperSQL.Query(sql1).Tables[0].DefaultView; if (dvv.Count > 0) { return dvv[0]["F_DeviceIndex"].ToString() + "-" + dvv[0]["F_DeviceCommandIndex"].ToString(); } else { return null; } } else { return null; } } catch (Exception ex) { throw ex; } finally { dv = null; dvv = null; } } //--------------------------------------------------------------------------------------------------------- /// /// 在设备指令信息中获得堆垛机的 /// 取货点Z坐标(站在堆垛机上,面向操作面板:左侧-1,右侧-2) /// 取货点X坐标(沿轨道方向) /// 取货点Y坐标(沿高度方向) /// 送货点Z坐标(站在堆垛机上,面向操作面板:左侧-1,右侧-2) /// 送货点X坐标(沿轨道方向) /// 送货点Y坐标(沿高度方向) /// /// 设备指令索引 /// 0--5六个数组分别依次代表6个坐标 public int[] GetCoordinatesFromMonitorTask(int TaskIdx) { DataView dv; int[] gc; try { dv = DbHelperSQL.Query("select * from T_Monitor_Task where F_MonitorIndex=" + TaskIdx).Tables[0].DefaultView; gc = new int[6]; //F_NumParam1--z,x--2,y--3;F_NumParam4--z,5--x,6--y if (dv.Count > 0) { gc[0] = Convert.ToInt32(dv[0]["F_NumParam1"]); gc[1] = Convert.ToInt32(dv[0]["F_NumParam2"]); gc[2] = Convert.ToInt32(dv[0]["F_NumParam3"]); gc[3] = Convert.ToInt32(dv[0]["F_NumParam4"]); gc[4] = Convert.ToInt32(dv[0]["F_NumParam5"]); gc[5] = Convert.ToInt32(dv[0]["F_NumParam6"]); return gc; } return null; } catch (Exception ex) { throw ex; } finally { dv = null; gc = null; } } /// /// 在调度队列中找到设备命令 /// /// 调度所引 /// public int GetDeviceOrderFromMonitor(int MonitorIndex) { DataView dv; try { string sql = "select F_DeviceCommandIndex from T_Monitor_Task where (F_DeviceCommandIndex IS NOT NULL) and F_MonitorIndex=" + MonitorIndex; dv = DbHelperSQL.Query(sql).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]); } else { return -1; } } catch (Exception ex) { throw ex; } finally { dv = null; } } public int GetManageTaskIndexfromMonitor(int monitorIdx) { //20100108 DataView dv; try { //20100108 dv = DbHelperSQL.Query("SELECT F_ManageTaskIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " + monitorIdx + ")").Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_ManageTaskIndex"]); } else { return -1; } } catch (Exception ex) {//20100108 throw ex; } finally {//20100108 dv = null; } } public int GetManageTaskKindIndexFromMonitor(int monitorIdx) {//20100108 DataView dv; try { //20100108 dv = DbHelperSQL.Query("SELECT F_ManageTaskKindIndex FROM T_Monitor_Task WHERE (F_MonitorIndex = " + monitorIdx + ")").Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_ManageTaskKindIndex"]); } else { return -1; } } catch (Exception ex) {//20100108 throw ex; } finally {//20100108 dv = null; } } public int GetFCONTROLTASKTYPEFromManageTask(int taskKindIndex, int Managefid) { //20100108 DataView dv; try { //20100108 dv = DbHelperSQL.Query("SELECT FCONTROLTASKTYPE FROM T_Manage_Task WHERE (FID = " + Managefid + ") AND (F_ManageTaskKindIndex = " + taskKindIndex + ")").Tables[0].DefaultView; if (dv.Count > 0) { if (dv[0]["FCONTROLTASKTYPE"] == DBNull.Value) return -1; return Convert.ToInt32(dv[0]["FCONTROLTASKTYPE"]); } else { return -1; } } catch (Exception ex) {//20100108 throw ex; } finally {//20100108 dv = null; } } /// /// 是否需要优化调度 /// /// /// public bool NeedOptimize(int DeviceIdx) { DataView dv; try { dv = DbHelperSQL.Query("SELECT F_DeviceIndex, F_NeedOptimize FROM T_Base_Device where F_DeviceIndex=" + DeviceIdx + " and F_NeedOptimize='1'").Tables[0].DefaultView; if (dv.Count > 0) { return true; } else return false; } catch (Exception ex) { throw ex; } finally { dv = null; } } /// /// 根据设备指令索引MonitorIndex检索出需要向T_Monitor_Task_Child插入的纪录,并且完成插入工作 /// /// public void InsertMonitorOptimizeChildTask(int MonitorIndex) { try { //起始x坐标,列-沿轨道方向 // 起始y坐标,层-高度方向 // 起始z坐标,排-面向堆垛机操作面板,1-左侧,2-右侧 //F_NumParam1--z,x--2,y--3;F_NumParam4--z,5--x,6--y string sql; int[] childInfo = GetMonitorChildIndex(MonitorIndex); sql = "INSERT INTO T_Monitor_Task_Child(F_Child_Index, F_TargetX, F_TargetY, F_TargetZ, F_OriginX, F_OriginY, F_OriginZ, F_Order,F_DeviceKindIndex,F_DummyDeviceIndex,F_MonitorIndex, F_Status)" + "VALUES (" + childInfo[0] + "," + childInfo[2] + "," + childInfo[3] + "," + childInfo[1] + "," + childInfo[5] + "," + childInfo[6] + "," + childInfo[4] + "," + childInfo[7] + "," + childInfo[8] + "," + childInfo[9] + "," + MonitorIndex + ",0,)"; DbHelperSQL.ExecuteSql(sql); } catch (Exception ex) { throw ex; } } /// /// //获得需要优化调度设备指令的子任务索引 ///conInfo[9]=设备索引 ; ///conInfo[8]=设备种类索引 ; ///conInfo[7]=命令 ; ///conInfo[1] = ["F_NumParam1"]; ///conInfo[2] = ["F_NumParam2"]; ///conInfo[3] = ["F_NumParam3"]; ///conInfo[4] = ["F_NumParam4"]; ///conInfo[5] = ["F_NumParam5"]; ///conInfo[6] = ["F_NumParam6"]; /// /// /// 子任务索引值1--65535 private int[] GetMonitorChildIndex(int monitorTaskIndex) { //20100108 DataView dvMt; int[] conInfo = new int[10]; DataView dv; try { int devKindIndex; //20100108 dv = DbHelperSQL.Query("SELECT T_Base_Device.F_DeviceIndex,T_Base_Device.F_DeviceKindIndex,T_Monitor_Task.F_DeviceCommandIndex," + "F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task" + " WHERE (T_Monitor_Task.F_MonitorIndex = " + monitorTaskIndex + ") and " + " (T_Monitor_Task.F_DeviceIndex = T_Base_Device.F_DeviceIndex)").Tables[0].DefaultView; if (dv.Count > 0) { devKindIndex = Convert.ToInt32(dv[0]["F_DeviceKindIndex"]); conInfo[9] = Convert.ToInt32(dv[0]["F_DeviceIndex"]); conInfo[8] = devKindIndex; conInfo[7] = Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]); conInfo[1] = Convert.ToInt32(dv[0]["F_NumParam1"]); conInfo[2] = Convert.ToInt32(dv[0]["F_NumParam2"]); conInfo[3] = Convert.ToInt32(dv[0]["F_NumParam3"]); conInfo[4] = Convert.ToInt32(dv[0]["F_NumParam4"]); conInfo[5] = Convert.ToInt32(dv[0]["F_NumParam5"]); conInfo[6] = Convert.ToInt32(dv[0]["F_NumParam6"]); } else { return null; } string sql = "SELECT F_Child_Index FROM T_Monitor_Task_Child_Index"; //20100108 dvMt = DbHelperSQL.Query(sql).Tables[0].DefaultView; if (dvMt.Count > 0 && dvMt[0]["F_Child_Index"] != DBNull.Value) { int maxIdx; maxIdx = (Convert.ToInt32(dvMt[0]["F_Child_Index"]) + 1); if (maxIdx >= 64000) { UpdateMonitorChildIndex(Convert.ToInt32(devKindIndex.ToString() + "0" + "1")); conInfo[0] = Convert.ToInt32(devKindIndex.ToString() + "0" + "1"); return conInfo; } else { UpdateMonitorChildIndex(maxIdx); conInfo[0] = maxIdx; return conInfo; } } else//现在没有该设备指令子任务记录 { UpdateMonitorIndex(Convert.ToInt32(devKindIndex.ToString() + "0" + "1")); conInfo[0] = Convert.ToInt32(devKindIndex.ToString() + "0" + "1"); return conInfo; } } catch (Exception ex) { _DisassembleTaskError = "获得指定调度任务的设备指令索引失败!" + ex.Message; throw ex; //return 0; } finally {//20100108 dv = null; dvMt = null; conInfo = null; } } private void UpdateMonitorChildIndex(int MonitorChildIndex) { DbHelperSQL.ExecuteSql("update T_Monitor_Task_Child_Index set F_Child_Index=" + MonitorChildIndex); } /// /// 获得设备指令任务的关联对等设备索引:堆垛机的取货指令任务的取货站台的双叉对等关联站台 /// 返回值“-1”表示无关联站台;“0”表示自关联站台;其它值表示关联站台设备索引 /// /// 设备指令索引 /// 设备索引 /// //public int GetCorrel_DeviceIndex(int MonitorTask) //{ // int[] zxy = GetCoordinatesFromMonitorTask(MonitorTask); // string zxystr = ""; // if (zxy != null) // { // zxystr = (zxy[0].ToString().Length == 1 ? "0" + zxy[0].ToString() : zxy[0].ToString()) + "-" + // ((zxy[1].ToString().Length == 1) ? ("0" + zxy[1].ToString()) : (zxy[1].ToString())) + "-" + // ((zxy[2].ToString().Length == 1) ? ("0" + zxy[2].ToString()) : (zxy[2].ToString())); // DataView dv = DbHelperSQL.Query("SELECT F_LaneGateDeviceIndex,F_CorrelDeviceIndex FROM T_Base_Lane_Gate where (T_Base_Lane_Gate.F_ZXY = '" + zxystr + "')").Tables[0].DefaultView; // if (dv.Count > 0) // { // if (dv[0]["F_LaneGateDeviceIndex"].ToString() == dv[0]["F_CorrelDeviceIndex"].ToString()) // { // return 0; // } // else // { // return int.Parse(dv[0]["F_CorrelDeviceIndex"].ToString()); // } // } // } // return -1; //} /// /// 任务拆分 调用 /// 根据设备索引获得关联设备信息:【0】有物检测【1】顶升高位检测【2】顶升低位检测 /// 【3】设备索引【4】运行监测【5】近巷道2列有物检测【6】远巷道1列有物检测【7】是否使用远货叉【8】关联设备索引【9】顶升中位检测 /// /// 设备索引 /// 是否自关联 /// public string[] GetCorrel_DeviceInfo(int DeviceIndex, bool ownCorrel) { string[] rr = new string[4]; // 顶升设备是为普通的输送机处理 2011//11/16 DataView dv = DbHelperSQL.Query("SELECT * FROM T_Base_Lane_Gate where F_LaneGateDeviceIndex = " + DeviceIndex).Tables[0].DefaultView; if (dv.Count > 0) { //rr[0] = dv[0]["F_LaneGateDeviceIndex"].ToString(); //rr[1] = dv[0]["F_HighDetect"].ToString(); //rr[2] = dv[0]["F_LowDetect"].ToString(); //rr[3] = dv[0]["F_HavingDetect"].ToString(); //rr[4] = dv[0]["F_RunDetect"].ToString(); //rr[5] = dv[0]["F_NearDetect"].ToString(); //rr[6] = dv[0]["F_FarDetect"].ToString(); //rr[7] = dv[0]["F_UseAwayFork"].ToString(); //rr[8] = dv[0]["F_CorrelDeviceIndex"].ToString(); //rr[9] = dv[0]["F_MiddleDetect"].ToString();//20101220 升降站台中位检测 rr[0] = dv[0]["F_HavingDetect"].ToString(); rr[1] = dv[0]["F_HighDetect"].ToString(); rr[2] = dv[0]["F_LowDetect"].ToString(); rr[3] = dv[0]["F_LaneGateDeviceIndex"].ToString(); //rr[3] = dv[0]["F_HavingDetect"].ToString(); // rr[4] = dv[0]["F_RunDetect"].ToString(); if (ownCorrel == true) { if (dv[0]["F_LaneGateDeviceIndex"].ToString() == DeviceIndex.ToString()) { return rr; } else { return null; } } else { return rr; } } return null; } Model.MDevice devinfo; /// /// 发送设备的送出指令时,需要检测的光电开关设备索引 /// /// 输送设备索引 /// public string GetSendOutDetect(int devinx) { //20101118 devinfo = BaseDeviceService.GetDeviceInfo(devinx); if (devinfo.SendOutDetect == null) return ""; return devinfo.SendOutDetect; } public string GetBarCodeFromMonitor(int Monitorindex) { object ob = DbHelperSQL.GetSingle("SELECT F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = " + Monitorindex + ")"); if (ob != null) { return ob.ToString(); } else { return "0"; } } } }