using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using ICommLayer;
using CommLayerFactory;
using DBFactory;
using CommonLib;
namespace WcfControlMonitorLib
{
    /// <summary>
    /// Creator:Richard.liu
    /// 
    /// 命令开关等全局变量的定义
    /// </summary>
    public static class CStaticClass
    {
        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);
            }
        }
        static StringBuilder sss = new StringBuilder();
        static StringBuilder[] wv = {new StringBuilder("2") };
        static StringBuilder[] witemnames ={ new StringBuilder("") };
        static char[] dd = new char[1] { '.' };//20101124
        static string[] sp;//20101124

        static string _userID;

        /// <summary>
        /// 用户编号
        /// </summary>
        
        public static string UserID
        {
            get { return CStaticClass._userID; }
            set { CStaticClass._userID = value; }
        }
        static bool _testSendOrder = false; //测试将发送指令
        /// <summary>
        /// 测试将任务拆分为指令
        /// </summary>
        public static bool TestSendOrder
        {
            get { return _testSendOrder; }
            set { CStaticClass._testSendOrder = value; }
        }

      

        public static bool StopTestLane = true;

        public static bool TestOutEnd = false;
        public static bool TestInEnd = false;
        public static bool ContainAGV = false;//是否携带AGV测试

        public static int  TestKind = 1;//简单任务,2货位测试

        private static Dictionary<int, bool> _stoptest = new Dictionary<int, bool>();//是否停止测试
        public static Dictionary<int, bool> StopTest
        {
            get { return _stoptest; }
            set { _stoptest = value; }
        }

        private static Dictionary<int, bool> _stopout = new Dictionary<int, bool>();//是否停止出库测试
        public static Dictionary<int, bool> StopOut
        {
            get { return _stopout; }
            set { _stopout= value; }
        }
        private static Dictionary<int, bool> _stopin = new Dictionary<int, bool>();//是否停止入库测试
        public static Dictionary<int, bool> StopIn
        {
            get { return _stopin; }
            set { _stopin = value; }
        }

        private static Dictionary<int, string> _testcell = new Dictionary<int, string>();//更新并存储上次测试的货位
        public static Dictionary<int, string> TestCell
        {
            get { return _testcell; }
            set { _testcell = value; }
        }
        private static Dictionary<int, string> _testenddevice = new Dictionary<int, string>();//存储终点设备编号
        public static Dictionary<int, string> TestEndDevice
        {
            get { return _testenddevice; }
            set { _testenddevice = value; }
        }

        static int _MessageIndex;
        static bool _Order;//
        static bool _ObtainManageTask;//
        static bool _autoOrder;
        static bool _handOrder;
        static bool _tempOrder;
        static ISendDeviceOrder sdo;
        
        //20091102
        public static int gcCount = 0;


        //20091107
        static string _ManageServiceAddress = "http://localhost:5252/lcs/thirdParty/taskStatusReport";//WCS 任务执行过程,将任务执行的状态回传给 LCS 系统。
        static string _ManageServiceAddress2 = "http://localhost:5252/lcs/thirdParty/inboundApply";//当入库的作业需要经过外部扫码设备触发分配库位或校验是否能入库时,WCS 通过此 接口向 LCS 申请。
        static string _ManageServiceAddress3 = "http://localhost:5252/lcs/thirdParty/wcsTaskInfo";//WCS 通知 LCS 调用 AGV 取货
        static string _ManageServiceAddress4 = "http://localhost:5252/api/lcs/thirdParty/requestRescore";//WCS 通过该接口请求 LCS 对目标库位进行重新分配。
        static string _ManageServiceAddress5 = "http://localhost:5252/api/lcs/thirdParty/autoMoveOut";//WCS 请求 WMS 判断外排是否需要自动移库

        public static string ManageServiceAddress
        {
            get { return CStaticClass._ManageServiceAddress; }
            set
            {
                if (value != "")
                {
                    CStaticClass._ManageServiceAddress = value;
                }
            }
        }
        public static string ManageServiceAddressTwo
        {
            get { return CStaticClass._ManageServiceAddress2; }
            set
            {
                if (value != "")
                {
                    CStaticClass._ManageServiceAddress2 = value;
                }
            }
        }
        public static string ManageServiceAddressThree
        {
            get { return CStaticClass._ManageServiceAddress3; }
            set
            {
                if (value != "")
                {
                    CStaticClass._ManageServiceAddress3 = value;
                }
            }
        }
        public static string ManageServiceAddressFour
        {
            get { return CStaticClass._ManageServiceAddress4; }
            set
            {
                if (value != "")
                {
                    CStaticClass._ManageServiceAddress4 = value;
                }
            }
        }
        public static string ManageServiceAddressFive
        {
            get { return CStaticClass._ManageServiceAddress5; }
            set
            {
                if (value != "")
                {
                    CStaticClass._ManageServiceAddress5 = value;
                }
            }
        }      
        static string _movedDeviceAheadTrigger = "1";
        /// <summary>
        /// 移动设备是否被提前触发将取
        /// </summary>
        public static string MovedDeviceAheadTrigger
        {
            get { return CStaticClass._movedDeviceAheadTrigger; }
            set 
            {
                if ((value == "0") || (value == "1"))
                {
                    CStaticClass._movedDeviceAheadTrigger = value;
                }
                else
                {
                    CStaticClass._movedDeviceAheadTrigger = "1";
                }
            }
        }
        
        static string _outDetectArrowIdleGoods = "1";
        /// <summary>
        /// 堆垛机出库是否检测目标输送机空闲和有物
        /// </summary>
        public static string OutDetectArrowIdleGoods
        {
            get { return CStaticClass._outDetectArrowIdleGoods; }
            set 
            {
                if ((value == "0") || (value == "1"))
                {
                    CStaticClass._outDetectArrowIdleGoods = value;
                }
                else
                {
                    CStaticClass._outDetectArrowIdleGoods = "1";
                }
            }
        }
        
        static string _deviceErrorAutoModifyRoutePath = "0";
        /// <summary>
        /// 设备发生故障自动变更路径
        /// </summary>
        public static string DeviceErrorAutoModifyRoutePath
        {
            get { return CStaticClass._deviceErrorAutoModifyRoutePath; }
            set 
            { 
                if ((value == "0") || (value == "1"))
                {
                    CStaticClass._deviceErrorAutoModifyRoutePath = value; 
                }
                else
                {
                    CStaticClass._deviceErrorAutoModifyRoutePath = "0";
                }
            }
        }

        static string _doubleForkWaitTime = "120";
        /// <summary>
        /// 多叉关联入库任务允许等待的时间单位(秒):默认120秒
        /// </summary>
        public static string DoubleForkWaitTime
        {
            
            get { return CStaticClass._doubleForkWaitTime; }
            set 
            {int aa;
                if (int.TryParse(_doubleForkWaitTime,out aa)==true )
                {
                
                    CStaticClass._doubleForkWaitTime = value;
                }
                else
                {
                    CStaticClass._doubleForkWaitTime = "120";
                }
            }
        }
        static string _transportTimeout = "5";
        /// <summary>
        /// 输送超时最大允许时间单位(分):默认5分钟//20110608
        /// </summary>
        public static string TransportTimeout
        {
            get { return CStaticClass._transportTimeout; }
            set
            {
                int aa;
                if (int.TryParse(_transportTimeout,out aa) == true)
                {

                    CStaticClass._transportTimeout = value;
                }
                else
                {
                    CStaticClass._transportTimeout = "5";
                }
            }
        }
        static string _agvAllowSingleFork = "1";
        /// <summary>
        /// AGV是否允许单叉动作,:默认允许单叉动作 1
        /// </summary>
        public static string AGVAllowSingleFork
        {
            get { return CStaticClass._agvAllowSingleFork; }
            set 
            {
                if ((value == "0") || (value == "1"))
                {
                    CStaticClass._agvAllowSingleFork = value; 
                }
                else
                {
                    CStaticClass._agvAllowSingleFork = "0";
                }
                
            }
        }
        static string _stockCodeCheck = "^[B|D|G|P][A-Z][0-9]{4}$";
        /// <summary>
        /// 条码格式检查
        /// </summary>
        public static string StockCodeCheck
        {

            get { return CStaticClass._stockCodeCheck; }
            set
            {
                int aa;
                if (int.TryParse(_stockCodeCheck, out aa) == true)
                {

                    CStaticClass._stockCodeCheck = value;
                }
                else
                {
                    CStaticClass._stockCodeCheck = "^[B|D|G|P][A-Z][0-9]{4}$";
                }
            }
        }

        static string _HCA12068 = "6";

        public static string HCA12068
        {
            get { return CStaticClass._HCA12068; }
            set
            {
                int aa;
                if (int.TryParse(value, out aa) == true)
                {

                    CStaticClass._HCA12068 = value;
                }
            }
        }
        static string _HCB12019 = "4";

        public static string HCB12019
        {
            get { return CStaticClass._HCB12019; }

            set
            {
                int aa;
                if (int.TryParse(value, out aa) == true)
                {

                    CStaticClass._HCB12019 = value;
                }
               
            }
        }
        static string _HCB12034 = "3";

        public static string HCB12034
        {
            get { return CStaticClass._HCB12034; }
            set
            {
                int aa;
                if (int.TryParse(value, out aa) == true)
                {
                    CStaticClass._HCB12034 = value;
                }
            }
        }
        static string _HCBLanewayOutDB = "2";

        public static string HCBLanewayOutDB
        {
            get { return CStaticClass._HCBLanewayOutDB; }
            set
            {
                int aa;
                if (int.TryParse(value, out aa) == true)
                {
                    CStaticClass._HCBLanewayOutDB = value;
                }
            }
        }
        static string _savedays = "60";
        /// <summary>
        /// 保存任务历史记录的时间
        /// </summary>
        public static string SaveDays
        {
            get { return CStaticClass._savedays; }
            set
            {
                int aa;
                if (int.TryParse(_savedays, out aa) == true)
                {

                    CStaticClass._savedays = value;
                }
                else
                {
                    CStaticClass._savedays = "60";
                }
            }
        }
        static string _outtaskcounts = "4";
        /// <summary>
        /// 终点相同的出库任务,执行的最大数量,通用
        /// </summary>
        public static string OutTaskCounts
        {
            get { return CStaticClass._outtaskcounts; }
            set
            {
                int aa;
                if (int.TryParse(_outtaskcounts, out aa) == true)
                {

                    CStaticClass._outtaskcounts = value;
                }
                else
                {
                    CStaticClass._outtaskcounts = "4";
                }
            }
        }
        static string _outtaskcounts1 = "4";
        /// <summary>
        /// 终点相同的出库任务,执行的最大数量
        /// </summary>
        public static string OutTaskCounts1
        {
            get { return CStaticClass._outtaskcounts1; }
            set
            {
                int aa;
                if (int.TryParse(_outtaskcounts1, out aa) == true)
                {

                    CStaticClass._outtaskcounts1 = value;
                }
                else
                {
                    CStaticClass._outtaskcounts1 = "4";
                }
            }
        }
        static string _outtaskcounts2 = "4";
        /// <summary>
        /// 终点相同的出库任务,执行的最大数量
        /// </summary>
        public static string OutTaskCounts2
        {
            get { return CStaticClass._outtaskcounts2; }
            set
            {
                int aa;
                if (int.TryParse(_outtaskcounts2, out aa) == true)
                {

                    CStaticClass._outtaskcounts2 = value;
                }
                else
                {
                    CStaticClass._outtaskcounts2 = "4";
                }
            }
        }
        static string _outtaskcounts3 = "3";
        /// <summary>
        /// 终点相同的出库任务,执行的最大数量
        /// </summary>
        public static string OutTaskCounts3
        {
            get { return CStaticClass._outtaskcounts3; }
            set
            {
                int aa;
                if (int.TryParse(_outtaskcounts3, out aa) == true)
                {

                    CStaticClass._outtaskcounts3 = value;
                }
                else
                {
                    CStaticClass._outtaskcounts3 = "4";
                }
            }
        }
        //20100108

        /// <summary>
        /// 摄像头服务器IP
        /// </summary>
        public static string CameraIP = "1";
        /// <summary>
        /// 登陆摄像头服务器的用户标识
        /// </summary>
        public static string CameraUsername = "1";
        /// <summary>
        /// 登陆摄像头服务器的密码
        /// </summary>
        public static string CameraPassword = "1";
        public static bool IfRemind = false;

        public static DateTime routetime=DateTime.Now.AddSeconds(-10);
       
        public static DBOperator dbo =CommonClassLib.AppSettings.dbo; //20130510
        public static DBOperator dbo1 = CommonClassLib.AppSettings.dbo1; //20130510
        public static DBOperator dboM = CommonClassLib.AppSettings.dboM; //20130510
        public static DBOperator dboM1 = CommonClassLib.AppSettings.dboM1; //20130510

        static bool _deviceInit;
        static string _routeSearchMode="0";
        static bool _realRefresh=true;
        public static Model.MDevice devinfo28;
        //20100609
        public static Dictionary<int, System.IO.Ports.SerialPort> serialports=new Dictionary<int,System.IO.Ports.SerialPort>();
        
        static Model.MDevice devinfo;
        static string _manstatus = " F_Status<>-1 ";//默认,显示调度任务全部队列
        static string _monstatus = " F_Status<>-1 ";//默认,显示设备指令全部队列

        static StringBuilder manZWhere = new StringBuilder();
        /// <summary>
        /// 获取的任务的排(Z)的between条件OR关系
        /// </summary>
        public static StringBuilder ManZWhere
        {
            get { return CStaticClass.manZWhere; }
            set {
                CStaticClass.manZWhere = value;
                }
            
        }
        //20100607管理数据库类工厂初始化
        
        static string _manDBFactory = dboM.GetValue("ManDBFactory");
        /// <summary>
        /// 管理系统的数据库工厂:SQLServerDBFactory,OracleDBFactory,OleDBFactory
        /// </summary>
        public static string ManDBFactory
        {
            get { return CStaticClass._manDBFactory; }
            set 
            {
                if ((value == "SQLServerDBFactory") || (value == "OracleDBFactory") || (value == "OleDBFactory"))
                {

                    CStaticClass._manDBFactory = value;

                }
                else
                {
                    CStaticClass._manDBFactory = "SQLServerDBFactory";
                }
            }
        }

        static string _DBFactory = dbo.GetValue("DBFactory");//20151120调度系统数据库工厂
        /// <summary>
        /// 调度系统数据库工厂:SQLServerDBFactory,OracleDBFactory,OleDBFactory
        /// </summary>
        public static string DBFactory
        {//20151120调度系统数据库工厂
            get { return CStaticClass._DBFactory; }
            set
            {
                if ((value == "SQLServerDBFactory") || (value == "OracleDBFactory") || (value == "OleDBFactory"))
                {

                    CStaticClass._DBFactory = value;

                }
                else
                {
                    CStaticClass._DBFactory = "SQLServerDBFactory";
                }
            }
        }


        /// <summary>
        /// 显示调度任务全部队列" F_Status<>-1 ";等待队列" F_Status=0 ";运行队列" F_Status=1 ";
        /// </summary>
        public static string Manstatus
        {
            get { return CStaticClass._manstatus; }
            set { CStaticClass._manstatus = value; }
        }
        
        /// <summary>
        /// 显示设备指令全部队列" F_Status<>-1 ";等待队列" F_Status=0 ";运行队列" F_Status=1 ";
        /// </summary>
        public static string  Monstatus
        {
            get { return CStaticClass._monstatus; }
            set { CStaticClass._monstatus = value; }
        }
        /// <summary>
        /// 是否实时刷新监控和调度任务列表
        /// </summary>
        public static bool RealRefresh
        {
            get { return CStaticClass._realRefresh; }
            set { CStaticClass._realRefresh = value; }
        }
        /// <summary>
        /// 路径搜索方式:0,按照最优路径选择固定路线;1,每个正在工作的节点作为起始点,向末端节点重新搜索下一个最优路径的节点
        /// </summary>
        public static string RouteSearchMode
        {
            get { return CStaticClass._routeSearchMode; }
            set {
                if ((value == "0") || (value == "1"))
                {
                    CStaticClass._routeSearchMode = value;
                }
                else
                {
                    CStaticClass._routeSearchMode = "0";
                }
            }
        }
        
        /// <summary>
        /// 执行自动命令开关
        /// </summary>
        public static bool AutoOrder
        {
            get { return CStaticClass._autoOrder; }
            set { CStaticClass._autoOrder = value; }
        }
        
        /// <summary>
        /// 执行手工命令开关
        /// </summary>
        public static bool HandOrder
        {
            get { return CStaticClass._handOrder; }
            set { CStaticClass._handOrder = value; }
        }
        /// <summary>
        /// 执行临时管理命令开关
        /// </summary>
        public static bool TempOrder
        {
            get { return CStaticClass._tempOrder; }
            set { CStaticClass._tempOrder = value; }
        }
        /// <summary>
        /// 监控发送消息索引
        /// </summary>
        public static int MessageIndex
        {
            get { return CStaticClass._MessageIndex; }
            set
            {
                if (value > 240)
                {
                    value = 1;
                }

                CStaticClass._MessageIndex = value;
            }
        }
        /// <summary>
        /// 命令开关是否打开
        /// </summary>
        public static bool Order
        {
            get { return CStaticClass._Order; }
            set { CStaticClass._Order = value; }
        }
        /// <summary>
        /// 是否获取调度任务
        /// </summary>
        public static bool ObtainManageTask
        {
            get { return _ObtainManageTask; }
            set { _ObtainManageTask = value; }
        }
        /// <summary>
        /// 是否执行设备初始化命令
        /// </summary>
        public static bool DeviceInit
        {
            get { return CStaticClass._deviceInit; }
            set { CStaticClass._deviceInit = value; }
        }

        public static void ReConnect()
        {
            //20100127
            //SimensProdave6.CSimensProdave6_S7.InitCount = 0;
            SocketsTCPIP.CClientTCPIP.TcpIPInitCount =new Dictionary<string,int>();

            OPCClient.CCommonOPCClient.ConnectCount = new Dictionary<string, int>();
        }
        static StringBuilder sql = new StringBuilder();
        public static int[] DeviceStateAllReturns;
        public static string GetDeviceReadSubscription(int deviceindex)
        {//20110216
            //object lockthis = new object();
            //lock (lockthis)
            {
                DataView dv = dbo.ExceSQL(string.Format("SELECT F_ReadSubscription FROM T_Base_Device WHERE (F_DeviceIndex = {0})",deviceindex)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return dv[0]["F_ReadSubscription"].ToString();
                }
                else
                {
                    return null;
                }
            }
        }
        /// <summary>
        /// 20110216支持多个S7Connnection组态OPC
        /// </summary>
        public static Dictionary <string,int[]> MutiReadSubscriptionDeviceStateReturns=new Dictionary<string,int[]>();
        public static Dictionary<string, int[]> MutiReadSubscriptionDeviceSplitReturns = new Dictionary<string, int[]>();
        /// <summary>
        /// 取得所有光电开关的信号
        /// </summary>
        //public static void GetAllReturns()
        //{//20110216
            
        //    try
        //    {
        //        DataView dv = dbo.ExceSQL("SELECT F_DeviceIndex,F_S7Connection FROM T_Base_Device WHERE (F_DeviceKindIndex = 28)").Tables[0].DefaultView;
        //        if (dv.Count > 0)
        //        {
        //            for (int i = 0; i < dv.Count; i++)
        //            {
        //                gds = CommModeCreate.CreateGetDeviceState(Convert.ToInt32(dv[i]["F_DeviceIndex"]));
        //                MutiS7ConnReturns[dv[i]["F_S7Connection"].ToString()] = gds.GetDeviceState(Convert.ToInt32(dv[i]["F_DeviceIndex"]), 0);
        //                if (gds.CommLayerError != null)
        //                {
        //                    RefreshMonitorEventArgs rea = new RefreshMonitorEventArgs("tsStatus", "取得所有光电开关的信号时:" + gds.CommLayerError);
        //                    OnRefreshMonitor(rea);
        //                }
        //            }
        //        }
        //        else
        //        {
        //            MutiS7ConnReturns = null;

        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        RefreshMonitorEventArgs rea = new RefreshMonitorEventArgs("tsStatus", "取得所有光电开关的信号时:" + ex.Message);
        //        OnRefreshMonitor(rea);
                
        //        return;
        //    }
        //}
        
        /// <summary>
        /// 20101118根据设备号和bit位,取得F_SplitByte里的光电bit值:0,1
        /// </summary>
        /// <param name="deviceIdx"></param>
        /// <param name="bit"></param>
        /// <returns></returns>
        public static int GetDevicePhotoelectric(int deviceIdx,int abit)
        {
            try
            {
                devinfo =Model.CGetInfo.GetDeviceInfo(deviceIdx);
                if (devinfo != null)
                {
                    switch (abit)
                    {
                        case 0:
                            return devinfo.SplitByte_0;
                        case 1:
                            return devinfo.SplitByte_1;
                        case 2:
                            return devinfo.SplitByte_2;
                        case 3:
                            return devinfo.SplitByte_3;
                        case 4:
                            return devinfo.SplitByte_4;
                        case 5:
                            return devinfo.SplitByte_5;
                        case 6:
                            return devinfo.SplitByte_6;
                        case 7:
                            return devinfo.SplitByte_7;
                    }
                    return -9999;
                }
                else
                {
                    return -9999;
                }

                #region 旧版标准化
                
                ////20110216
                //DeviceStateAllReturns = CStaticClass.MutiReadSubscriptionDeviceSplitReturns[GetDeviceReadSubscription(deviceIdx)];
                //if (DeviceStateAllReturns != null)
                //{
                //    #region 获取开关量的值

                //    devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx);

                //    int glen = 0;
                //    int IfVis = 0;
                //    if (devinfo.SplitByte != -1)
                //    {
                //        //20110216
                //        devinfo28 = Model.CGeneralFunction.GetDeviceReadSubscriptionDB2Data(new StringBuilder(devinfo.ReadSubscription));
                //        int temp = devinfo.SplitByte - devinfo28.SplitByte;
                //        if (abit > 7)
                //        {
                //            glen = abit - 8;
                //            temp = temp + 1;
                //        }
                //        else
                //        {
                //            glen = abit;
                //        }
                //        if (temp >= 0)
                //        {
                //            IfVis = CommonClassLib.CCarryConvert.GetBitFromInteger(DeviceStateAllReturns[temp], glen);
                            
                //            return IfVis;
                //        }
                //        else
                //        {
                //            return -1;
                //        }

                //    }
                //    else
                //    {
                //        return -1;
                //    }


                //    #endregion


                //}
                //else
                //{
                //    return -1;

                //}

                #endregion

            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rea = new RefreshMonitorEventArgs("tsStatus", string.Format("取得光电开关的信号时:{0}" ,ex.StackTrace+ex.Message ));
                OnRefreshMonitor(rea);
                return -1;
            }
        }
        /// <summary>
        /// //20101124根据【设备号.bit位】的字符串,取得F_SplitByte里的光电bit值:0,1
        /// </summary>
        /// <param name="deviceIdx"></param>
        /// <param name="bit"></param>
        /// <returns></returns>
        public static int GetDevicePhotoelectric(string devicebit)
        {
            sp = devicebit.Split(dd);//20101124
            if (sp.GetLength(0) <= 1) return -1;
            int deviceIdx,abit;
            int.TryParse(sp[0], out deviceIdx);
            int.TryParse(sp[1], out abit);
            try
            {
                devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx);
                if (devinfo != null)
                {
                    switch (abit)
                    {
                        case 0:
                            return devinfo.SplitByte_0;
                        case 1:
                            return devinfo.SplitByte_1;
                        case 2:
                            return devinfo.SplitByte_2;
                        case 3:
                            return devinfo.SplitByte_3;
                        case 4:
                            return devinfo.SplitByte_4;
                        case 5:
                            return devinfo.SplitByte_5;
                        case 6:
                            return devinfo.SplitByte_6;
                        case 7:
                            return devinfo.SplitByte_7;
                    }
                    return -9999;
                }
                else
                {
                    return -9999;
                }

                #region 旧版标准化
		 
	            

                ////20110216
                //DeviceStateAllReturns = CStaticClass.MutiReadSubscriptionDeviceSplitReturns[GetDeviceReadSubscription(deviceIdx)];
                //if (DeviceStateAllReturns != null)
                //{
                //     #region 获取开关量的值

                    //    devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx);

                    //    int glen = 0;
                    //    int IfVis = 0;
                    //    if (devinfo.SplitByte != -1)
                    //    {
                            
                    //        devinfo28 = Model.CGeneralFunction.GetDeviceReadSubscriptionDB2Data(new StringBuilder(devinfo.ReadSubscription));
                    //        int temp = devinfo.SplitByte - devinfo28.SplitByte;
                    //        if (abit > 7)
                    //        {
                    //            glen = abit - 8;
                    //            temp = temp + 1;
                    //        }
                    //        else
                    //        {
                    //            glen = abit;
                    //        }
                    //        if (temp >= 0)
                    //        {
                    //            IfVis = CommonClassLib.CCarryConvert.GetBitFromInteger(DeviceStateAllReturns[temp], glen);
                                
                    //            return IfVis;
                    //        }
                    //        else
                    //        {
                    //            return -1;
                    //        }

                    //    }
                    //    else
                    //    {
                    //        return -1;
                    //    }


                    //    #endregion


                    //}
                    //else
                    //{
                    //    return -1;
                    //}
                #endregion
            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rea = new RefreshMonitorEventArgs("tsStatus", string.Format("取得光电开关的信号时:{0}" ,ex.StackTrace+ex.Message ));
                OnRefreshMonitor(rea);
                return -9999;
            }
        }
        /// <summary>
        /// 状态:0空闲;1运行;2故障;3离线;4被停用;5动作完成
        /// 取得指定设备索引的设备状态:[0]读写标志;[1]状态;[2]任务号;[3]X坐标;[4]Y坐标;[5]设备索引
        /// 
        /// </summary>
        /// <param name="deviceIdx">设备索引</param>
        /// <returns></returns>
        public static int[] GetDeviceState(int deviceIdx)
        {
            int[] states = new int[6]{1,0,0,0,0,deviceIdx};
            devinfo =Model.CGetInfo.GetDeviceInfo(deviceIdx);
            if (devinfo != null)
            {
                states[1] = devinfo.RunState;
                return states;
            }
            else
            {
                return null;
            }
            #region 旧版标准化程序
            

            //Model.MDevice askdev;
            //DataView dvbc;


            //string s = DateTime.Now.Millisecond.ToString(); 
            //try
            //{


            //    //20110216
                
            //    DeviceStateAllReturns = CStaticClass.MutiReadSubscriptionDeviceStateReturns[GetDeviceReadSubscription(deviceIdx)];
            //    string s1 = DateTime.Now.Millisecond.ToString(); 
            //    if (DeviceStateAllReturns != null)
            //    {
            //        #region 获取设备状态

            //        devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx);

            //        if (devinfo.Dbw2Address != -1)
            //        {
            //            //20100108
            //            //DataView dv;
            //            //DataView dvM;
            //            //Model.MDevice askdev;
            //            //20110216
            //            devinfo28 = Model.CGeneralFunction.GetDeviceReadSubscriptionDB2Data(new StringBuilder(devinfo.ReadSubscription));
            //            int temp = devinfo.Dbw2Address - devinfo28.Dbw2Address;
            //            decimal glen = devinfo.Dbw2Getlength;

            //            //20100108
            //            states = new int[6];
            //            wv[0].Remove(0, wv[0].Length);
            //            wv[0].Append("2");
            //            witemnames[0].Remove(0, witemnames[0].Length);
            //            witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(",byte").Append(Convert.ToString(devinfo.Dbw2Address + 0));
            //            sdo = CommModeCreate.CreateSendDeviceOrder(deviceIdx);
            //            switch (devinfo.DeviceKind.ToString())
            //            {
            //                #region 现场控制触摸屏申请信息(16个字节)
            //                case "22":

            //                    if (DeviceStateAllReturns[temp] != 1) return null;
            //                    states = new int[16];
            //                    states[0] = 0;
            //                    states[1] = deviceIdx;
            //                    states[2] = DeviceStateAllReturns[temp + 1];//命令字
            //                    states[3] = (DeviceStateAllReturns[temp + 2] << 8) + DeviceStateAllReturns[temp + 3];//设备索引
            //                    states[4] = (DeviceStateAllReturns[temp + 4] << 8) + DeviceStateAllReturns[temp + 5];//任务号
            //                    askdev = Model.CGetInfo.GetDeviceInfo(states[3]);
            //                    //states[2];//命令字
            //                    //states[3];//设备索引(当前申请设备的索引)
            //                    //states[4];//任务号(需要修改目标位置的任务号)

            //                    //20091102
            //                    if (askdev == null)
            //                    {
            //                        wv[0].Remove(0, wv[0].Length);
            //                        wv[0].Append("37");
            //                        sdo.WriteDBData(witemnames, wv);//20091013
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "37申请的设备号不存在");
            //                        return null;
            //                    }
            //                    int bcz = 0;

            //                    StringBuilder barcode = new StringBuilder();
            //                    for (int j = 6; j < 16; j++)
            //                    {
            //                        bcz = bcz + DeviceStateAllReturns[temp + j];
            //                        barcode.Append(Convert.ToChar(DeviceStateAllReturns[temp + j]).ToString().ToUpper());
            //                        states[j - 1] = DeviceStateAllReturns[temp + j];
            //                    }
            //                    //20090902新增加arraylength
            //                    if (IsEquals(devinfo.ReturnMessage, states, 5) == false)
            //                    {
            //                        devinfo.ReturnMessage = states;
            //                        Model.CGetInfo.SetDeviceMessage(devinfo);
            //                        sss.Remove(0, sss.Length);
            //                        sss.Append("**触摸屏设备索引" + states[1]).Append("**命令字" + states[2])
            //                            .Append("**申请的设备索引" + states[3]).Append("**申请的任务号" + states[4]).Append("**申请的条码" + barcode);
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到现场控制触摸屏申请信息", deviceIdx.ToString(), sss.ToString());

            //                    }
            //                    #region 申请重发当前设备指令(1)

            //                    if (states[2] == 1)//命令字
            //                    {
            //                        if (states[4] == 0)//无任务号
            //                        {
            //                            if (bcz == 0)//无条码号
            //                            {
            //                                //32申请的任务号和条形码都不存在
            //                                wv[0].Remove(0, wv[0].Length);
            //                                wv[0].Append("32");

            //                                sdo.WriteDBData(witemnames, wv);//20091013
            //                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "32申请的任务号和条形码都不存在");
            //                                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
            //                                //    {
            //                                if (askdev.UseCommonDB == "1")
            //                                {
            //                                    sql.Remove(0, sql.Length);
            //                                    sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                                "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_TxtParam = '").Append(
            //                                barcode).Append("'  order by F_MonitorIndex asc");
            //                                }
            //                                else
            //                                {//20090928 and F_DeviceIndex=" + states[3] + "
            //                                    sql.Remove(0, sql.Length);
            //                                    sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                                "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_TxtParam = '").Append(
            //                                barcode).Append("' order by F_MonitorIndex asc");
            //                                }
            //                                //20100108
            //                                dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;

            //                                if (dvbc.Count > 0)
            //                                {
            //                                    if (askdev.UseCommonDB == "1")
            //                                    {
            //                                        //20090915
            //                                        sql.Remove(0, sql.Length);
            //                                        sql.Append("update T_Monitor_Task set  F_AheadDetect='',F_DeviceIndex=").Append(states[3]).Append(" where F_MonitorIndex=").Append(dvbc[0]["F_MonitorIndex"]).Append("");
            //                                        dbo.ExceSQL(sql.ToString());
            //                                    }

            //                                    //wv[0] = "4";
            //                                    //sdo.WriteDBData(witemnames, wv);
            //                                    return states;
            //                                }
            //                                else
            //                                {
            //                                    //35申请的设备号和条形码不匹配
            //                                    wv[0].Remove(0, wv[0].Length);
            //                                    wv[0].Append("35");
            //                                    sdo.WriteDBData(witemnames, wv);//20091013
            //                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "35申请的设备号和条形码不匹配");
            //                                    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 (states[4] == dv[i]["F_TaskIndex"].ToString())
            //                            //    {
            //                            //        return null;
            //                            //    }
            //                            //    else
            //                            //    {

            //                            if (askdev.UseCommonDB == "1")
            //                            {
            //                                sql.Remove(0, sql.Length);
            //                                sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                                        "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex = '").Append(
            //                                        states[4]).Append("' order by F_MonitorIndex asc");
            //                            }
            //                            else
            //                            {//20090928 and F_DeviceIndex=" + states[3] + "
            //                                sql.Remove(0, sql.Length);
            //                                sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                                        "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex = '").Append(
            //                                        states[4]).Append("' order by F_MonitorIndex asc");
            //                            }
            //                            //20101008
            //                            dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;

            //                            if (dvbc.Count > 0)
            //                            {
            //                                if (askdev.UseCommonDB == "1")
            //                                {
            //                                    //20090915
            //                                    sql.Remove(0, sql.Length);
            //                                    sql.Append("update T_Monitor_Task set F_AheadDetect='',F_DeviceIndex=").Append(states[3]).Append(" where F_MonitorIndex=").Append(dvbc[0]["F_MonitorIndex"]);
            //                                    dbo.ExceSQL(sql.ToString());
            //                                }

            //                                //RestoreDevice(Convert.ToInt32(dvbc[0]["F_MonitorIndex"]));
            //                                //wv[0] = "4";
            //                                //sdo.WriteDBData(witemnames, wv);
            //                                ////记录任务号
            //                                //dbo.ExceSQL("update T_Base_PLC_Ask set F_TaskIndex='" + states[4]
            //                                //    + "' where F_DeviceIndex=" + DeviceIndex);
            //                                return states;
            //                            }
            //                            else
            //                            {
            //                                //36申请的设备号和任务号不匹配
            //                                wv[0].Remove(0, wv[0].Length);
            //                                wv[0].Append("36");
            //                                sdo.WriteDBData(witemnames, wv);//20091013
            //                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "36申请的设备号和任务号不匹配");
            //                                return null;
            //                            }
            //                            //    }
            //                            //}
            //                            #endregion
            //                        }

            //                    }

            //                    #endregion

            //                    #region 申请修改当前设备所执行任务目标位置(2)

            //                    else if (states[2] == 2)//命令字
            //                    {
            //                        //申请修改当前设备所执行任务目标位置的F_TaskIndex重复时不允许相应申请
            //                        return states;
            //                    }

            //                    #endregion

            //                    #region 上报完成(3)
            //                    else if (states[2] == 3)//命令字
            //                    {
            //                        if (states[4] == 0)//无任务号
            //                        {
            //                            if (bcz == 0)//无条码号
            //                            {
            //                                //32申请的任务号和条形码都不存在
            //                                wv[0].Remove(0, wv[0].Length);
            //                                wv[0].Append("32");
            //                                sdo.WriteDBData(witemnames, wv);//20091013
            //                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "32申请的任务号和条形码都不存在");
            //                                return null;
            //                            }
            //                            else//有条码号
            //                            {
            //                                #region 有条码号
            //                                //20100108
            //                                sql.Remove(0, sql.Length);
            //                                sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                                        "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_TxtParam = '").Append(
            //                                barcode).Append("'  order by F_MonitorIndex asc");
            //                                dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            //                                if (dvbc.Count > 0)
            //                                {

            //                                    return states;
            //                                }
            //                                else
            //                                {
            //                                    //30申请的条码号不存在
            //                                    wv[0].Remove(0, wv[0].Length);
            //                                    wv[0].Append("30");
            //                                    sdo.WriteDBData(witemnames, wv);//20091013
            //                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "30申请的条码号不存在");
            //                                    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 (states[4] == dv[i]["F_TaskIndex"].ToString())
            //                            //    {
            //                            //        return null;
            //                            //    }
            //                            //    else
            //                            //    {
            //                            //and F_DeviceIndex=" + states[3] + "

            //                            //20100108
            //                            sql.Remove(0, sql.Length);
            //                            sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                                        "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex = '").Append(
            //                                        states[4]).Append("'  order by F_MonitorIndex asc");
            //                            dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            //                            if (dvbc.Count > 0)
            //                            {
            //                                //wv[0] = "2";
            //                                //sdo.WriteDBData(witemnames, wv);
            //                                ////记录任务号
            //                                //dbo.ExceSQL("update T_Base_PLC_Ask set F_TaskIndex='" + states[4]
            //                                //    + "' where F_DeviceIndex=" + DeviceIndex);
            //                                return states;
            //                            }
            //                            else
            //                            {
            //                                //31申请的任务号不存在
            //                                wv[0].Remove(0, wv[0].Length);
            //                                wv[0].Append("31");
            //                                sdo.WriteDBData(witemnames, wv);//20091013
            //                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "31申请的任务号不存在");
            //                                return null;
            //                            }
            //                            //    }
            //                            //}
            //                            #endregion
            //                        }
            //                    }
            //                    #endregion

            //                    #region 删除当前设备所执行的任务(4)(托盘拿走)
            //                    else if (states[2] == 4)//命令字
            //                    {
            //                        //20090915
            //                        if (states[4] == 0)//无任务号
            //                        {
            //                            if (bcz == 0)//无条码号
            //                            {
            //                                //32申请的任务号和条形码都不存在
            //                                wv[0].Remove(0, wv[0].Length);
            //                                wv[0].Append("32");
            //                                sdo.WriteDBData(witemnames, wv);//20091013
            //                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "32申请的任务号和条形码都不存在");
            //                                return null;
            //                            }
            //                            else//有条码号
            //                            {
            //                                #region 有条码号
            //                                //20100108
            //                                sql.Remove(0, sql.Length);
            //                                sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                                        "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_TxtParam = '").Append(
            //                                barcode).Append("'  order by F_MonitorIndex asc");
            //                                dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            //                                if (dvbc.Count > 0)
            //                                {

            //                                    return states;
            //                                }
            //                                else
            //                                {
            //                                    //30申请的条码号不存在
            //                                    wv[0].Remove(0, wv[0].Length);
            //                                    wv[0].Append("30");
            //                                    sdo.WriteDBData(witemnames, wv);//20091013
            //                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "30申请的条码号不存在");
            //                                    return null;
            //                                }
            //                                #endregion
            //                            }
            //                        }
            //                        else
            //                        {//20090915
            //                            #region 有任务号
            //                            //20100108
            //                            sql.Remove(0, sql.Length);
            //                            sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                                                "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_MonitorIndex = '").Append(
            //                                                states[4]).Append("' order by F_MonitorIndex asc");
            //                            dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            //                            if (dvbc.Count > 0)
            //                            {

            //                                return states;
            //                            }
            //                            else
            //                            {
            //                                //31申请的任务号不存在
            //                                wv[0].Remove(0, wv[0].Length);
            //                                wv[0].Append("31");
            //                                sdo.WriteDBData(witemnames, wv);//20091013
            //                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "31申请的任务号不存在");
            //                                return null;
            //                            }
            //                            #endregion
            //                        }
            //                    }
            //                    #endregion
            //                    break;
            //                #endregion


            //                #region 机器人码垛信息
            //                case "24":

            //                    if (DeviceStateAllReturns[temp] != 1) return null;
            //                    states[0] = 0;
            //                    states[1] = deviceIdx;
            //                    states[2] = DeviceStateAllReturns[temp + 1];//机器人动作:1-取货完成;2-放货完成;3-托盘码垛完成
            //                    states[3] = DeviceStateAllReturns[temp + 2];//托盘码垛数量
            //                    //sdo.WriteDBData(witemnames, wv);
            //                    devinfo.ReturnMessage = states;
            //                    Model.CGetInfo.SetDeviceMessage(devinfo);
            //                    //string ssss = "";
            //                    //for (int j = 0; j <= 3; j++)
            //                    //{
            //                    //    ssss += "**" + states[j].ToString();
            //                    //}
            //                    //CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "CGetDeviceState", deviceIdx.ToString(), ssss);


            //                    break;
            //                #endregion


            //                #region 其他设备
            //                case "1"://堆垛机

            //                    states[0] = DeviceStateAllReturns[temp];//读写标志
            //                    states[1] = DeviceStateAllReturns[temp + 1];//状态
            //                    states[2] = (DeviceStateAllReturns[temp + 2] << 8) + DeviceStateAllReturns[temp + 3];//任务号
            //                    states[3] = DeviceStateAllReturns[temp + 7] + (DeviceStateAllReturns[temp + 6] << 8) + (DeviceStateAllReturns[temp + 5] << 16) + (DeviceStateAllReturns[temp + 4] << 32);//X坐标
            //                    states[4] = DeviceStateAllReturns[temp + 11] + (DeviceStateAllReturns[temp + 10] << 8) + (DeviceStateAllReturns[temp + 9] << 16) + (DeviceStateAllReturns[temp + 8] << 32);//Y坐标
            //                    states[5] = deviceIdx;//设备号索引
            //                    if (IsEquals(devinfo.ReturnMessage, states, 3) == false)
            //                    {
            //                        devinfo.ReturnMessage = states;
            //                        Model.CGetInfo.SetDeviceMessage(devinfo);
            //                        sss.Remove(0, sss.Length);
            //                        sss.Append("**读标志" + states[0]).Append("**状态" + states[1]).Append("**任务号" + states[2])
            //                            .Append("**列坐标" + states[3]).Append("**层坐标" + states[4]);
                                                                        
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到堆垛机状态", deviceIdx.ToString(), sss.ToString());
                                   

            //                    }
            //                    break;
            //                case "2"://输送机
            //                    states[0] = DeviceStateAllReturns[temp];//读写标志
            //                    states[1] = DeviceStateAllReturns[temp + 1];//状态
            //                    states[2] = (DeviceStateAllReturns[temp + 2] << 8) + DeviceStateAllReturns[temp + 3];//任务号
            //                    states[3] = 0;
            //                    states[4] = 0;
            //                    states[5] = deviceIdx;//设备号索引
            //                    if (IsEquals(devinfo.ReturnMessage, states, 3) == false)
            //                    {
            //                        devinfo.ReturnMessage = states;
            //                        Model.CGetInfo.SetDeviceMessage(devinfo);
            //                        sss.Remove(0, sss.Length);
            //                        sss.Append("**读标志" + states[0]).Append("**状态" + states[1]).Append("**任务号" + states[2]);
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到输送机状态", deviceIdx.ToString(), sss.ToString());

            //                    }
            //                    break;
            //                case "4"://RGV
            //                    states[0] = DeviceStateAllReturns[temp];//读写标志
            //                    states[1] = DeviceStateAllReturns[temp + 1];//状态
            //                    states[2] = (DeviceStateAllReturns[temp + 2] << 8) + DeviceStateAllReturns[temp + 3];//任务号
            //                    states[3] = DeviceStateAllReturns[temp + 7] + (DeviceStateAllReturns[temp + 6] << 8) + (DeviceStateAllReturns[temp + 5] << 16) + (DeviceStateAllReturns[temp + 4] << 32);//X坐标
            //                    states[4] = 0;
            //                    states[5] = deviceIdx;//设备号索引
            //                    if (IsEquals(devinfo.ReturnMessage, states, 3) == false)
            //                    {
                                    
            //                        devinfo.ReturnMessage = states;
            //                        Model.CGetInfo.SetDeviceMessage(devinfo);
            //                        sss.Remove(0, sss.Length);
            //                        sss.Append("**读标志" + states[0]).Append("**状态" + states[1]).Append("**任务号" + states[2]).Append("**X坐标" + states[3]);
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "CGetDeviceState", deviceIdx.ToString(), sss.ToString());
                                    
            //                    }
            //                    break;
                            


            //                #endregion

            //                #region 高端及相关设备
                            
            //                case "31"://工位输送机
            //                    states[0] = DeviceStateAllReturns[temp];//读写标志
            //                    states[1] = DeviceStateAllReturns[temp + 1];//状态
            //                    StringBuilder barcode1 = new StringBuilder();
            //                    for (int i = 2; i <= 7; i++)
            //                    {
            //                        barcode1.Append(Convert.ToChar(DeviceStateAllReturns[temp + i]));
                                    
            //                    }
            //                    states[2] = GetMonitorTaskIndexFromBarCode(barcode1);
            //                    states[3] = 0;
            //                    states[4] = 0;
            //                    states[5] = deviceIdx;//设备号索引
            //                    if (IsEquals(devinfo.ReturnMessage, states, 3) == false)
            //                    {
            //                        devinfo.ReturnMessage = states;
            //                        Model.CGetInfo.SetDeviceMessage(devinfo);
            //                        sss.Remove(0, sss.Length);
            //                        sss.Append("**读标志" + states[0]).Append("**状态" + states[1]).Append("**条码号" + barcode1 + "**任务号" + states[2]);
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到工位输送机状态", deviceIdx.ToString(), sss.ToString());

            //                    }
            //                    break;
            //                case "32"://工位触摸屏
            //                    if (DeviceStateAllReturns[temp] != 1) return null;
            //                    states = new int[16];
            //                    states[0] = 0;
            //                    states[1] = deviceIdx;
            //                    states[2] = DeviceStateAllReturns[temp + 1];//命令字
            //                    states[3] = (DeviceStateAllReturns[temp + 2] << 8) + DeviceStateAllReturns[temp + 3];//设备索引
            //                    int bcz11 = 0;

            //                    StringBuilder barcode11 = new StringBuilder();
            //                    for (int j = 6; j <= 11; j++)
            //                    {
            //                        bcz11 = bcz11 + DeviceStateAllReturns[temp + j];
            //                        barcode11.Append(Convert.ToChar(DeviceStateAllReturns[temp + j]).ToString().ToUpper());
            //                        states[j - 1] = DeviceStateAllReturns[temp + j];
            //                    }
            //                    states[4] = GetMonitorTaskIndexFromBarCode(barcode11);//任务号
            //                    askdev = Model.CGetInfo.GetDeviceInfo(states[3]);
            //                    //states[2];//命令字
            //                    //states[3];//设备索引(当前申请设备的索引)
            //                    //states[4];//任务号(需要修改目标位置的任务号)

            //                    //20091102
            //                    if (askdev == null)
            //                    {
            //                        wv[0].Remove(0, wv[0].Length);
            //                        wv[0].Append("34");
            //                        sdo.WriteDBData(witemnames, wv);//20091013
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "34申请的设备号不存在");
            //                        return null;
            //                    }

            //                    //20090902新增加arraylength
            //                    if (IsEquals(devinfo.ReturnMessage, states, 5) == false)
            //                    {
            //                        devinfo.ReturnMessage = states;
            //                        Model.CGetInfo.SetDeviceMessage(devinfo);
            //                        sss.Remove(0, sss.Length);
            //                        sss.Append("**触摸屏设备索引" + states[1]).Append("**命令字" + states[2])
            //                            .Append("**申请的设备索引" + states[3]).Append("**申请的任务号" + states[4]).Append("**申请的条码" + barcode11);
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到现场控制触摸屏申请信息", deviceIdx.ToString(), sss.ToString());

            //                    }
                                
            //                    if (bcz11 == 0)//无条码号
            //                    {
            //                        //30条形码不存在
            //                        wv[0].Remove(0, wv[0].Length);
            //                        wv[0].Append("30");

            //                        sdo.WriteDBData(witemnames, wv);//20091013
            //                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "30条形码不存在");
            //                        return null;
            //                    }
            //                    else//有条码号
            //                    {
            //                        #region 有条码号

            //                        sql.Remove(0, sql.Length);
            //                        sql.Append("SELECT F_MonitorIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,").Append(
            //                        "F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6 FROM T_Monitor_Task WHERE F_TxtParam = '").Append(
            //                        barcode11).Append("' order by F_MonitorIndex asc");

            //                        dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;

            //                        if (dvbc.Count > 0)
            //                        {

            //                            return states;
            //                        }
            //                        else
            //                        {
            //                            //35申请的设备号和条形码不匹配
            //                            wv[0].Remove(0, wv[0].Length);
            //                            wv[0].Append("33");
            //                            sdo.WriteDBData(witemnames, wv);//20091013
            //                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", deviceIdx.ToString(), "33申请的设备号和条形码不匹配");
            //                            return null;
            //                        }
            //                        #endregion

            //                    }
                                
            //                #endregion
            //            }


            //            return states;

            //        }
            //        else
            //        {
            //            return null;
            //        }


            //        #endregion


            //    }
            //    else
            //    {
            //        return null;
            //    }
            //}
            //catch (Exception ex)
            //{
            //    string s1 = DateTime.Now.Millisecond.ToString(); 
            //    RefreshMonitorEventArgs rea = new RefreshMonitorEventArgs("tsStatus", "获得设备状态时:" + ex.Message);
            //    OnRefreshMonitor(rea);
            //    return null;
            //}
            //finally
            //{//20100108
            //    //dv=null;
            //    //dvM = null;
            //    askdev = null;
            //    states = null;
                
            //    dvbc = null;
            //}

            #endregion
        }
        public static string GetStringData(int deviceIdx)
        {
            try
            {


                //20110216
                DeviceStateAllReturns = CStaticClass.MutiReadSubscriptionDeviceStateReturns[GetDeviceReadSubscription(deviceIdx)];
                if (DeviceStateAllReturns != null)
                    {
                        #region 获取设备状态

                        devinfo = Model.CGetInfo.GetDeviceInfo(deviceIdx);

                        if (devinfo.Dbw2Address != -1)
                        {
                            //20110216
                            devinfo28 = Model.CGeneralFunction.GetDeviceReadSubscriptionDB2Data(new StringBuilder(devinfo.S7Connection));
                            int temp = devinfo.Dbw2Address - devinfo28.Dbw2Address;
                            decimal glen = devinfo.Dbw2Getlength;
                            
                            string headstr = DeviceStateAllReturns[temp].ToString();
                            if (headstr != "1") return null;
                            wv[0].Remove(0, wv[0].Length);
                            wv[0].Append("2");
                            witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                            sdo = CommModeCreate.CreateSendDeviceOrder(deviceIdx);
                            switch (devinfo.DeviceKind.ToString())
                            {
                                
                                #region 字符串信息
                                case "7"://条形码
                                    sss.Remove(0, sss.Length);
                                    for (int i = 1; i <= 10; i++)
                                    {
                                        sss.Append( Convert.ToChar(DeviceStateAllReturns[temp+i]));

                                    }
                                    
                                    //sdo.WriteDBData(witemnames, wv);
                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "读PLC条码",deviceIdx.ToString(), "读标志1**条码:"+sss.ToString().ToUpper());
                                    break;
                                case "21"://一号工程码
                                    sss.Remove(0, sss.Length);
                                    for (int i = 1; i <= 32; i++)
                                    {
                                        sss.Append(Convert.ToChar(DeviceStateAllReturns[temp + i]));

                                    }

                                    //sdo.WriteDBData(witemnames, wv);
                                    //CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "CGetDeviceState", deviceIdx.ToString(), strdata);
                                    break;
                                
                                #endregion
                            }


                            return sss.ToString().ToUpper() ;

                        }
                        else
                        {
                            return null;
                        }


                        #endregion


                    }
                    else
                    {
                        return null;
                    }
               
            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rea = new RefreshMonitorEventArgs("tsStatus", string.Format("CStaticClass取得设备字符串信息时:{0}" ,ex.StackTrace+ex.Message ));
                OnRefreshMonitor(rea);
                
                return null;
            }
        }
        
        /// <summary> 
        /// 比较两个值型一维数组变量是否值相等 
        /// </summary> 
        /// <param name="array1">值型一维数组1</param> 
        /// <param name="array2">值型一维数组2</param> 
        /// <returns>比较结果,相等则true,否则false</returns> 
        public static bool IsEquals(Array array1, Array array2,int arraylength)
        {//20090902新增加arraylength
            //比较类型是否一样 
            if ((array1 == null) || (array2 == null)) return false;
            if (!Object.ReferenceEquals(array1.GetType(), array2.GetType()))
            {
                return false;
            }

            //比较长度是否一样 
            if (array1.GetLength(0) != array2.GetLength(0))
            {
                return false;
            }

            //比较成员是否对应相等 
            ValueType v1, v2;
            for (int i = 0; i < arraylength; i++)
            {
                v1 = (ValueType)array1.GetValue(i);
                v2 = (ValueType)array2.GetValue(i);

                if (!v1.Equals(v2))
                {
                    return false;
                }
            }
            return true;
        }

        static int GetMonitorTaskIndexFromBarCode(StringBuilder BarCode)
        {//20110216
            DataView dv = dbo.ExceSQL(string.Format("SELECT  F_MonitorIndex FROM T_Monitor_Task WHERE (F_TxtParam = '{0}') order by F_MonitorIndex asc", BarCode.ToString())).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                return Convert.ToInt32( dv[0]["F_MonitorIndex"]);
            }
            else
            {
                return -1;
            }
        }
        public static string SelectGoodsCell(int lane, int enddevice)
        {
            string strCellCode = string.Empty;
            string sqlstr = string.Empty;
            string sqlshort = "1=1";
            DataView dv;

            if (enddevice >= 12001 && enddevice <= 12013)//库前出库
            {
                sqlstr = string.Format("SELECT top 1 * FROM ST_CELL WHERE (FCELLSTATUS = 1) AND(FRunStatus = 0) And(F_X>10)And(F_Y =1)and (FLaneWay={0}) ORDER BY F_Z,F_X , F_Y desc", lane);
            }
            else
                if (enddevice == 12114 || enddevice == 22116 || enddevice == 22134)//LT1出库
                {
                    //if (lane == 15801)
                    //{
                    //    sqlshort = "((F_Z=5 or F_Z=6) And F_X>=3 And F_X<=50 And F_X%3=0 ) ";
                    //}
                    //else//15802
                    //{
                    //    sqlshort = "((F_Z=7 And F_X>=2 And F_X<=49 And F_X%3=2 )or (F_Z=8 And F_X>=34 And F_X<=51 And F_X%3=1 )) ";
                    //}

                    sqlstr = string.Format("SELECT top 1 * FROM ST_CELL WHERE (FCELLSTATUS = 1) AND(FRunStatus = 0)And(F_X >10)  And(F_Y =1)and (FLaneWay={0}) and {1} ORDER BY F_Z, F_X , F_Y desc", lane, sqlshort);

                }

            dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;

            if (dv.Count > 0)
            {
                strCellCode = dv[0]["fcellcode"].ToString().Trim();
                dbo.ExceSQL("update ST_CELL set FRunStatus = 1 where FLaneWay= " + lane + " and fcellcode = '" + strCellCode + "'");

                return strCellCode;
            }
            else
            {
                return "-";
            }

        }
        public static string SelectEmptyPalletCell(string  lanes, int enddevice)
        {
            string strCellCode = string.Empty;
            string sqlstr = string.Empty;
            string sqlshort = "1=1";
            DataView dv;

                if (enddevice == 22052 || enddevice == 22066)//空托盘组出库,在一层
                {

                    sqlstr = string.Format("SELECT top 1 * FROM ST_CELL WHERE (FCELLSTATUS = 1) AND(FRunStatus = 0) And(F_X >19) And(F_X <=30)  And(F_Y =1)and (FLaneWay in ({0})) and {1} ORDER BY F_Z, F_X desc", lanes, sqlshort);

                }
            else
            //if (enddevice >= 12001 && enddevice <= 12013)//
            {
                sqlstr = string.Format("SELECT top 1 * FROM ST_CELL WHERE (FCELLSTATUS = 1) AND(FRunStatus = 0) And(F_X>10)And(F_Y =1)and (FLaneWay in ({0})) ORDER BY F_Z,F_X , F_Y desc", lanes);
            }

            dv = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;

            if (dv.Count > 0)
            {
                strCellCode = dv[0]["fcellcode"].ToString().Trim();
                dbo.ExceSQL("update ST_CELL set FRunStatus = 1 where   fcellcode = '" + strCellCode + "'");

                return strCellCode;
            }
            else
            {
                return "-";
            }

        }
        public static string SelectEmptyCell(int lane)
        {
            string strCellCode = string.Empty;
            DataView dv;

            dv = dbo.ExceSQL("SELECT top 1 * FROM ST_CELL WHERE (FCELLSTATUS = 0) AND(FRunStatus = 0)AND(F_X > 50)AND(F_X != 57)and (FLaneWay=" + lane + ") ORDER BY F_Z, F_Y, F_X").Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                strCellCode = dv[0]["fcellcode"].ToString().Trim();
                dbo.ExceSQL("update ST_CELL set FRunStatus = 1 where FLaneWay= " + lane + " and fcellcode = '" + strCellCode + "'");
                return strCellCode;
            }
            else
            {
                return "-";
            }

        }
        public static string GetCellBarCode(string cell, int lane)
        {
            string barcode = string.Empty;
            DataView dv = dbo.ExceSQL("SELECT  FPALLETBARCODE  FROM ST_CELL WHERE FLaneWay= " + lane + " and fcellcode = '" + cell + "'").Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                barcode = dv[0]["FPALLETBARCODE"].ToString().Trim();
                return barcode;
            }
            else
            {
                return "-";
            }

        }
        public static int GetStackIndexFromLaneInfo(int LaneIndex)
        {
            //20101124
            StringBuilder sql = new StringBuilder();
            sql.Append("SELECT F_StackIndex FROM T_Base_LaneInfo WHERE (F_LaneDeviceIndex = ").Append(LaneIndex).Append(")");
            DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            if (dv.Count > 0)
            {
                return Convert.ToInt32(dv[0][0]);
            }
            else
            {
                return -1;
            }
        }
        public static string SelectEmptyCell(int lane, string cell, int kind)
        {


            char[] cc = new char[1] { '-' };
            string[] sp = cell.Split(cc);
            DataView dv;
            string strCellCode = string.Empty;
            if (sp.Length > 2)//
            {
                if (kind == 1)
                {
                    if (Convert.ToInt32(sp[1]) <= 5)//判断列值,返回大列值
                    {

                        dv = dbo.ExceSQL("SELECT top 1 * FROM ST_CELL WHERE (FCELLSTATUS = 0) AND(FRunStatus = 0)AND(F_X > 50)AND(F_X != 57)and (FLaneWay=" + lane + ") ORDER BY F_Z, F_Y, F_X desc").Tables[0].DefaultView;
                        if (dv.Count > 0)
                        {
                            strCellCode = dv[0]["fcellcode"].ToString().Trim();
                            dbo.ExceSQL("update ST_CELL set FRunStatus = 1 where FLaneWay= " + lane + " and fcellcode = '" + strCellCode + "'");
                            return strCellCode;
                        }
                        else
                        {
                            return "-";
                        }
                    }
                    else//判断列值,返回小列值
                    {
                        dv = dbo.ExceSQL("SELECT top 1 * FROM ST_CELL WHERE (FCELLSTATUS = 0) AND(FRunStatus = 0)AND(F_X > 3)AND(F_X != 57)and (FLaneWay=" + lane + ") ORDER BY F_Z, F_Y, F_X ").Tables[0].DefaultView;
                        if (dv.Count > 0)
                        {
                            strCellCode = dv[0]["fcellcode"].ToString().Trim();
                            dbo.ExceSQL("update ST_CELL set FRunStatus = 1 where FLaneWay= " + lane + " and fcellcode = '" + strCellCode + "'");
                            return strCellCode;
                        }
                        else
                        {
                            return "-";
                        }
                    }
                }
                return "-";
                if (kind == 2)
                {

                    dv = dbo.ExceSQL("SELECT * FROM ST_CELL WHERE (FLaneWay=" + lane + " and F_Z=" +
                                     sp[0] + " and F_X=" + sp[1] + " and F_Y=" + sp[2] + ")").Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        DataView dv0 = dbo.ExceSQL("SELECT * FROM ST_CELL WHERE FLaneWay=" + lane + " and FID>" + dv[0]["FID"] + " order by fid asc").Tables[0].DefaultView;
                        if (dv0.Count > 0)
                        {
                            if (lane == 2801)
                            {
                                if ((dv0[0]["FCELLCODE"].ToString() == "2-1-8") || (dv0[0]["FCELLCODE"].ToString() == "2-2-8"))
                                {
                                    return "2-3-1";
                                }


                            }
                            return dv0[0]["FCELLCODE"].ToString();
                        }
                        else
                        {
                            return "1-1-1";
                        }
                    }

                }
            }
            else
            {
                return "-";
            }

        }
        public static 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 -1;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}