using System; using System.Collections.Generic; using System.Text; using DBFactory; using ICommLayer; using System.Data; using Microsoft.VisualBasic; namespace SimensProdave6 { public class CGetDeviceState:IGetDeviceState { string _commLayerError; public string CommLayerError { get { return _commLayerError; } set { _commLayerError = value; } } DBOperator dbo = CSimensProdave6_S7.dbo; public CGetDeviceState() { dbo.Open(); } /// ///1、下位机给上位机发送设备(任务)状态信息 ///检测开关: 0-无货1-有货 ///确认按钮: ///第1字节: ///一个变化的值,每确认一次,该值变化一次,以标志一个 ///新的确认消息。例如可以是0、1交替变化,也可以是递 ///增变化。 ///第2字节: ///1-无货确认 ///2-有货确认 ///其他设备: ///第1字 节:设备状态 ///堆垛机:0-空闲 ///1-正在运行 ///2-任务完成 ///3-要求调度重发命令 ///4-通知调度取消当前任务 ///其它值表示错误 /// 穿梭车: /// 0-空闲 /// 1-正在运行 /// 2-完成 /// 3-要求调度重发命令 /// 4-通知调度取消当前任务 /// 其它值表示错误 /// 输送机: /// 0-空闲 /// 1-正在运行 /// 2-完成(只有PC下发的目标设备才允许汇报完成) /// 组合机构需要单独定义状态 /// 其它值表示错误 /// 第2、3字节: 任务号,即上位机下达任务时的任务号 /// 第4、5、6、7字节 /// 堆垛机、穿梭车: /// 终点X坐标(沿轨道方向) /// (第8字节以后部分只对堆垛机有意义) /// 第8、9、10、11字节 /// 终点Y坐标(沿高度方向) /// /// 2.下位机给上位机发送条码信息 /// 托盘条码: /// 第1-10字节:由左到右依次存放托盘上的10位条形码信息 /// 烟箱一号工程码: /// 第1-9字节: 由左到右依次存放烟箱上的后9位一号工程码信息 /// 一号工程码是32位,相同品牌烟箱的一号工程码的前23位相同, /// 所以只存放后9位条码。每个码垛位进烟口有两个烟箱一号工程码存放区, /// 共18个字节,上位机一次将两个烟箱一号工程码的信息同时读取。 /// 上位机成功读取18个字节后,把这18个字节全部写入零, /// 下位机只有检测到18个字节全都是零时才可以写入新的一号工程码信息。 /// /// 3.下位机给上位机发送现场控制触摸屏申请信号 /// 第1字节 申请指令 /// 1- 重发当前设备指令 /// 2- 申请修改当前设备所执行任务的目标位置 /// 第2、3字节 设备索引(当前申请设备的索引) /// 第4、5字节 任务号(需要修改目标位置的任务号) /// 第6、15字节 托盘条码(当前申请设备上的托盘的条码) /// 下位机可能因开关误动作等情况而引起任务记忆丢失, /// 此时根据设备上停放托盘的条码可以重新申请获得任务。 /// 上位机收到此申请后重新发送当前设备的指令。 /// 有设备发生故障时,下位机可以申请修改任务的目标位置。 /// 上位机收到此申请后,如果可以找到新的路径,则修改此任务号的目标位置。 /// 当申请指令为1时,任务号可以是任意值;当申请指令为2时,托盘条码可以是任意值。 /// /// 设备编号 /// 获得上行消息成功后,发送应答消息后返回22个字的状态 public int[] GetDeviceState(int DeviceIndex, int TaskIndex) { try { int[] _Rword = new int[20]; byte[] _RRword; int add = 0; int Bit = 0; //int isn=0; Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); //DataView dv = dbo.ExceSQL("SELECT F_DBW2Address,F_DBWGetLength,F_DeviceIndex,F_DeviceKindIndex,F_OPCProgID, F_RemoteIP FROM T_Base_Device where F_DeviceIndex=" + DeviceIndex).Tables[0].DefaultView; if (devinfo.DeviceIndex== 0) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:在设备表中没找到设备所引!"; return null; } else { switch (devinfo.DeviceKind.ToString()) { #region 光电开关总的采集 case "28": _RRword = CSimensProdave6_S7.DB_Read_Prodave(0, 2, Convert.ToUInt16( devinfo.Dbw2Address), Convert.ToUInt32( devinfo.Dbw2Getlength)); if (_RRword == null) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + CSimensProdave6_S7.ErrorsText; return null; } else { int[] rrr=new int[Convert.ToInt32( devinfo.Dbw2Getlength)]; Array.Copy(_RRword, rrr,Convert.ToInt32( devinfo.Dbw2Getlength)); return rrr; } #endregion #region 光电开关 case "18": Bit = Convert.ToInt16(Convert.ToDecimal(devinfo.Dbw2Getlength) * 8) - 1;//转换成bit0--bit7 if (Bit > 7) { add = 1; Bit = Bit - 8; } else { add = 0; } _RRword = CSimensProdave6_S7.DB_Read_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address + add), 1, Bit); if (_RRword == null) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + CSimensProdave6_S7.ErrorsText; return null; } _Rword[0] = _RRword[0]; _Rword[1] = 3;//3-检测开关状态 _Rword[2] = TaskIndex;//任务号 _Rword[3] = 0; _Rword[4] = 0; _Rword[5] = DeviceIndex;//设备号索引 break; #endregion #region 按钮 case "14": Bit = Convert.ToInt16(devinfo.Dbw2Getlength * 8) - 1;//转换成bit0--bit7 if (Bit > 7) { add = 1; Bit = Bit - 8; } else { add = 0; } _RRword = CSimensProdave6_S7.DB_Read_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address + add), 1, Bit); if (_RRword == null) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + CSimensProdave6_S7.ErrorsText; return null; } _Rword[0] = _RRword[0]; _Rword[1] = 3;//3-检测开关状态 _Rword[2] = TaskIndex;//任务号 _Rword[3] = 0; _Rword[4] = 0; _Rword[5] = DeviceIndex;//设备号索引 break; #endregion #region 现场控制触摸屏申请信息(16个字节) case "22": _RRword = CSimensProdave6_S7.DB_Read_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), Convert.ToUInt32(devinfo.Dbw2Getlength)); if (_RRword == null) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + CSimensProdave6_S7.ErrorsText; return null; } else { _Rword[0] = TaskIndex; _Rword[1] = DeviceIndex; _Rword[2] = _RRword[1]; _Rword[3]=(_RRword[2] << 8) + _RRword[3]; _Rword[4] = (_RRword[4] << 8) + _RRword[5]; } //_Rword[2];//命令字 //_Rword[3];//设备索引(当前申请设备的索引) //_Rword[4];//任务号(需要修改目标位置的任务号) int bcz = 0; byte[] www = new byte[1]; string barcode = string.Empty; for (int j = 6; j <= 15; j++) { bcz = bcz + _RRword[j]; barcode = barcode += Convert.ToChar(_RRword[j]); } #region 申请重发当前设备指令(1) if (_Rword[2] == 1)//命令字 { if (_Rword[4] == 0)//无任务号 { if (bcz == 0)//无条码号 { //32申请的任务号和条形码都不存在 www[0]=32; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); return null; } else//有条码号 { #region 有条码号 //DataView dv = dbo.ExceSQL("SELECT F_BarCode, F_Askkind, F_DeviceIndex FROM T_Base_PLC_Ask where F_DeviceIndex=" + DeviceIndex).Tables[0].DefaultView; //if (dv.Count > 0) //{ // if (barcode == dv[i]["F_BarCode"].ToString()) // { // return null; // } // else // { DataView dvbc = dbo.ExceSQL("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2," + "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_TxtParam = '" + barcode + "' and F_DeviceIndex="+_Rword[3]+" order by F_MonitorIndex asc").Tables[0].DefaultView; if (dvbc.Count > 0) { www[0]=4; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); return _Rword; } else { //35申请的设备号和条形码不匹配 www[0]=35 ; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); return null; } // } //} #endregion } } else//有任务号 { #region 有任务号 //DataView dv = dbo.ExceSQL("SELECT F_TaskIndex, F_Askkind, F_DeviceIndex FROM T_Base_PLC_Ask where F_DeviceIndex=" + DeviceIndex).Tables[0].DefaultView; //if (dv.Count > 0) //{ // if (_Rword[4] == dv[i]["F_TaskIndex"].ToString()) // { // return null; // } // else // { DataView dvbc = dbo.ExceSQL("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2," + "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex = '" + _Rword[4] + "' and F_DeviceIndex=" + _Rword[3] + " order by F_MonitorIndex asc").Tables[0].DefaultView; if (dvbc.Count > 0) { //RestoreDevice(Convert.ToInt32(dvbc[0]["F_MonitorIndex"])); www[0]= 4 ; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); ////记录任务号 //dbo.ExceSQL("update T_Base_PLC_Ask set F_TaskIndex='" + _Rword[4] // + "' where F_DeviceIndex=" + DeviceIndex); return _Rword; } else { //36申请的设备号和任务号不匹配 www[0]= 36; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); return null; } // } //} #endregion } } #endregion #region 申请修改当前设备所执行任务目标位置(2) else if (_Rword[2] == 2)//命令字 { //申请修改当前设备所执行任务目标位置的F_TaskIndex重复时不允许相应申请 } #endregion #region 上报完成(3) else if (_Rword[2] == 3)//命令字 { #region 有任务号 //DataView dv = dbo.ExceSQL("SELECT F_TaskIndex, F_Askkind, F_DeviceIndex FROM T_Base_PLC_Ask where F_DeviceIndex=" + DeviceIndex).Tables[0].DefaultView; //if (dv.Count > 0) //{ // if (_Rword[4] == dv[i]["F_TaskIndex"].ToString()) // { // return null; // } // else // { DataView dvbc = dbo.ExceSQL("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2," + "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex = '" + _Rword[4] + "' and F_DeviceIndex=" + _Rword[3] + " order by F_MonitorIndex asc").Tables[0].DefaultView; if (dvbc.Count > 0) { www[0]=2; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); ////记录任务号 //dbo.ExceSQL("update T_Base_PLC_Ask set F_TaskIndex='" + _Rword[4] // + "' where F_DeviceIndex=" + DeviceIndex); return _Rword; } else { //36申请的设备号和任务号不匹配 www[0]=36; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); return null; } // } //} #endregion } #endregion #region 删除当前设备所执行的任务(4)(托盘拿走) else if (_Rword[2] == 4)//命令字 { DataView dvbc = dbo.ExceSQL("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2," + "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex = '" + _Rword[4] + "' and F_DeviceIndex=" + _Rword[3] + " order by F_MonitorIndex asc").Tables[0].DefaultView; if (dvbc.Count > 0) { www[0] = 3; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); ////记录任务号 //dbo.ExceSQL("update T_Base_PLC_Ask set F_TaskIndex='" + _Rword[4] // + "' where F_DeviceIndex=" + DeviceIndex); return _Rword; } else { //36申请的设备号和任务号不匹配 www[0]= 36 ; CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, www); return null; } } #endregion break; #endregion #region 其他设备 case "1"://堆垛机 _RRword = CSimensProdave6_S7.DB_Read_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), Convert.ToUInt32(devinfo.Dbw2Getlength)); if (_RRword == null) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + CSimensProdave6_S7.ErrorsText; return null; } else { _Rword[0] = Convert.ToInt32(_RRword[0]);//读写标志 _Rword[1] = Convert.ToInt32(_RRword[1]);//状态 _Rword[2] = Convert.ToInt32((_RRword[2] << 8) + _RRword[3]);//任务号 _Rword[3] = Convert.ToInt32(_RRword[7] + (_RRword[6] << 8) + (_RRword[5] << 16) + (_RRword[4] << 32));//X坐标 _Rword[4] = Convert.ToInt32(_RRword[11] + (_RRword[10] << 8) + (_RRword[9] << 16) + (_RRword[8] << 32));//Y坐标 _Rword[5] = DeviceIndex;//设备号索引 } break; case "2"://输送机 _RRword = CSimensProdave6_S7.DB_Read_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), Convert.ToUInt32(devinfo.Dbw2Getlength)); if (_RRword == null) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + CSimensProdave6_S7.ErrorsText; return null; } else { www = new byte[4]; Array.Copy(_RRword, www, 4); CommonClassLib.CCarryConvert.WriteDarkCasket("ReadTcpIp", "CGetDeviceState", DeviceIndex.ToString(), www); _Rword[0] = Convert.ToInt32(_RRword[0]);//读写标志 _Rword[1] = Convert.ToInt32(_RRword[1]);//状态 _Rword[2] = Convert.ToInt32((_RRword[2] << 8) + _RRword[3]);//任务号 _Rword[3] = 0; _Rword[4] = 0; _Rword[5] = DeviceIndex;//设备号索引 } break; case "4"://RGV _RRword = CSimensProdave6_S7.DB_Read_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), Convert.ToUInt32(devinfo.Dbw2Getlength)); if (_RRword == null) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + CSimensProdave6_S7.ErrorsText; return null; } else { www=new byte[8]; Array.Copy(_RRword, www, 8); CommonClassLib.CCarryConvert.WriteDarkCasket("ReadTcpIp", "CGetDeviceState", DeviceIndex.ToString(), www); _Rword[0] = Convert.ToInt32(_RRword[0]);//读写标志 _Rword[1] = Convert.ToInt32(_RRword[1]);//状态 _Rword[2] = Convert.ToInt32((_RRword[2] <<8) + _RRword[3]);//任务号 _Rword[3] = Convert.ToInt32(_RRword[7] + (_RRword[6]<<8) + (_RRword[5] << 16) + (_RRword[4] <<32));//X坐标 _Rword[4] = 0; _Rword[5] = DeviceIndex;//设备号索引 } break; #endregion default: break; } } return _Rword; } catch (Exception ex) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + ex.Message; return null; } } public string GetStringData(int DeviceIndex, int TaskIndex) { try { byte[] _RRword; string headstr = ""; string retdata = ""; Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(DeviceIndex); //DataView dv = dbo.ExceSQL("SELECT F_DBW2Address,F_DBWGetLength,F_DeviceIndex,F_DeviceKindIndex,F_OPCProgID, F_RemoteIP FROM T_Base_Device where F_DeviceIndex=" + DeviceIndex).Tables[0].DefaultView; if (devinfo.DeviceIndex == 0) { _commLayerError = "SimensProdave6.CGetDeviceState.GetStringData发生错误:在设备表中没找到设备所引!"; return null; } else { _RRword = CSimensProdave6_S7.DB_Read_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), Convert.ToUInt32(devinfo.Dbw2Getlength)); if (_RRword == null) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState发生错误:" + CSimensProdave6_S7.ErrorsText; return null; } else { switch (devinfo.DeviceKind.ToString()) { #region 托盘条码信息(10个字节) case "7": headstr = _RRword[0].ToString(); for (int i = 1; i <= 10;i++ ) { retdata += Convert.ToChar(_RRword[i]); } break; #endregion #region 烟箱一号工程码(18个字节) case "21": headstr = _RRword[0].ToString(); for (int i = 1; i <= 18; i++) { retdata += Convert.ToChar(_RRword[i]); } break; #endregion default: break; } } } if (headstr == "1") { byte[] ww=new byte[1]{2}; if (CSimensProdave6_S7.DB_Write_Prodave(0, 2, Convert.ToUInt16(devinfo.Dbw2Address), 1, ww) == false) { _commLayerError = "SimensProdave6.CGetDeviceState.GetDeviceState:" + CSimensProdave6_S7.ErrorsText; return null; } else { return retdata; } } else { return null; } } catch (Exception ex) { _commLayerError = "SimensProdave6.CGetDeviceState.GetStringData发生错误:" + ex.Message; return null; } } void RestoreDevice(int mindex) { SimensProdave6.CSendDeviceOrder sdo=new CSendDeviceOrder(); int DeviceIdx, devKind; DataView dv = dbo.ExceSQL("select F_MonitorIndex,F_DeviceIndex from T_Monitor_Task where F_MonitorIndex=" + mindex).Tables[0].DefaultView; if (dv.Count > 0) { //检查关联命令一起复位 //如果mindex是主动任务(f_associatemonitor有数据),先复位被动的任务;如果mindex是被动任务,先复位自己,再复位主动任务; DataView dv1 = dbo.ExceSQL("select F_DeviceIndex,F_Associate from T_Monitor_Task where F_Associate IS NOT NULL and F_MonitorIndex=" + mindex).Tables[0].DefaultView; if (dv1.Count > 0) { DataView dv2 = dbo.ExceSQL("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_MonitorIndex=" + Convert.ToInt32(dv1[0]["F_Associate"])).Tables[0].DefaultView; if (dv2.Count > 0)//有关联命令,先复位关联命令 { DeviceIdx = Convert.ToInt32(dv2[0]["F_DeviceIndex"]); devKind = GetDeviceKindIdx(DeviceIdx); if ((devKind == 2) || (devKind == 4)) {//输送机清零 sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0); } if ((devKind == 1)) //堆垛机、RGV { sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0); } dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv2[0]["F_DeviceIndex"])); dbo.ExceSQL("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=" + Convert.ToInt32(dv2[0]["F_MonitorIndex"])); } //再复位自己 DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]); devKind = GetDeviceKindIdx(DeviceIdx); if ((devKind == 2) || (devKind == 4)) {//输送机、RGV清零 sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0); } if ((devKind == 1)) //堆垛机 { sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0); } dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv[0]["F_DeviceIndex"])); dbo.ExceSQL("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=" + Convert.ToInt32(dv[0]["F_MonitorIndex"])); } else { //自己是否被关联,先复位自己,再复位主任务 DataView dv3 = dbo.ExceSQL("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_Associate ='" + mindex + "'").Tables[0].DefaultView; if (dv3.Count > 0) { //先复位自己 DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]); devKind = GetDeviceKindIdx(DeviceIdx); if ((devKind == 2) || (devKind == 4)) {//输送机、RGV清零 sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0); } if ((devKind == 1)) //堆垛机 { sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0); } dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv[0]["F_DeviceIndex"])); dbo.ExceSQL("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=" + mindex); //再复位主任务 DeviceIdx = Convert.ToInt32(dv3[0]["F_DeviceIndex"]); devKind = GetDeviceKindIdx(DeviceIdx); if ((devKind == 2) || (devKind == 4)) {//输送机、RGV清零 sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0); } if ((devKind == 1)) //堆垛机 { sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0); } dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv3[0]["F_DeviceIndex"])); dbo.ExceSQL("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=" + Convert.ToInt32(dv3[0]["F_MonitorIndex"])); } else { //无关联任务,只复位自己 DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]); devKind = GetDeviceKindIdx(DeviceIdx); if ((devKind == 2) || (devKind == 4)) {//输送机、RGV清零 sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0); } if ((devKind == 1)) //堆垛机 { sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0); } dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv[0]["F_DeviceIndex"])); dbo.ExceSQL("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=" + mindex); } } } } int GetDeviceKindIdx(int devIdx) { try { string strSql = "SELECT F_DeviceIndex, F_DeviceKindIndex FROM T_Base_Device WHERE F_DeviceIndex=" + devIdx; DataSet ds = dbo.ExceSQL(strSql); DataView dv = ds.Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_DeviceKindIndex"]); } else return 0; } catch (Exception ex) { throw ex; } } } }