using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using DotNetSAPI;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Runtime.Serialization;
using CommonLib;
namespace wcfControlMonitorClient
{

    public partial class FrmClient : Form, WcfControlMonitor.IControlMonitorCallback
    {
        //protected override CreateParams CreateParams
        //{

        //    get
        //    {

        //        CreateParams cp = base.CreateParams;

        //        cp.ExStyle |= 0x02000000;//WS_CLIPCHILDREN   两个窗体叠加时,重叠部分不重绘
        //        return cp;

        //    }

        //}
        Model.MDevice devinfo;
        int PLC = 0;
        DateTime lastupdate = DateTime.Now;
        FrmDeviceStatus _deviceStatus = new FrmDeviceStatus();
        FrmWorkstationStatus _worstation = new FrmWorkstationStatus();
        StringBuilder sql = new StringBuilder();
        DBFactory.DBOperator dbo = CStaticClass.dbo;
        DBFactory.DBOperator dbo1 = new DBFactory.DBOperator();
        SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync;
        public SpVoice Voice = new SpVoice();
        public Model.MDevice[] devlist;
        public int devsn = 0;
        private static FrmClient _formInstance;
        public static FrmClient FormInstance
        {
            get
            {
                if (_formInstance == null)
                {
                    _formInstance = new FrmClient();
                }
                return _formInstance;
            }
            set { _formInstance = value; }
        }
        public FrmClient()
        {
            CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "操作日志", "FrmClient()", "", "");
            InitializeComponent();
            try
            {
                //初始化管理和调度交互状态
                Model.CGetInfo.AddIOControlStatus();
                Model.CGetInfo.AddDeviceKindInfo();
                Model.CGetInfo.AddDeviceInfo();
                Model.CGetInfo.AddDeviceErrors();
                devlist = Model.CGetInfo.DeviceInfo.Values.ToArray<Model.MDevice>();

                DataView dv0 = dbo.ExceSQL("SELECT distinct F_S7Connection,F_DBWGetLength FROM T_Base_Device WHERE (F_DeviceKindIndex = 28)").Tables[0].DefaultView;
                if (dv0.Count > 0)
                {
                    for (int i = 0; i < dv0.Count; i++)
                    {
                        if (CStaticClass.MutiS7ConnReturns.ContainsKey(dv0[i]["F_S7Connection"].ToString()) == false)
                        {
                            CStaticClass.MutiS7ConnReturns.Add(dv0[i]["F_S7Connection"].ToString(), new int[Convert.ToInt32(dv0[i]["F_DBWGetLength"])]);
                        }
                    }
                }

                CStaticClass.SystemName = CommonClassLib.AppSettings.GetValue("SystemName");
                this.notifyIcon1.Text = CStaticClass.SystemName;
                this.Text = CStaticClass.SystemName;
                OPCClient.CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName");
                OPCClient.CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID");


                #region 客户端订阅初始化20120428

                DataView dvx;
                DataView dv = dbo.ExceSQL("SELECT F_ReadSubscription, F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_S7Connection, F_SplitByte FROM T_Base_Device WHERE (F_ReadSubscription IS NOT NULL) AND (F_ReadSubscription =F_DeviceIndex) ORDER BY F_ReadSubscription").Tables[0].DefaultView;

                for (int i = 0; i < dv.Count; i++)
                {
                    dvx = dbo.ExceSQL(string.Format("SELECT (MAX(F_DBW2Address) + F_DBWGetLength) AS maxdbw2 FROM T_Base_Device WHERE (F_ReadSubscription = '{0}')  AND (F_DeviceKindIndex <> 33) GROUP BY F_DBWGetLength ORDER BY maxdbw2 DESC", dv[i]["F_ReadSubscription"])).Tables[0].DefaultView;
                    if (dvx.Count > 0)
                    {
                        if (CStaticClass.MutiReadSubscriptionDeviceStateReturns.ContainsKey(dv[i]["F_ReadSubscription"].ToString()) == false)
                        {
                            CStaticClass.MutiReadSubscriptionDeviceStateReturns.Add(dv[i]["F_ReadSubscription"].ToString(), new int[Convert.ToInt32(dvx[0]["maxdbw2"]) - Convert.ToInt32(dv[i]["F_DBW2Address"])]);
                        }

                    }
                }
                dv = dbo.ExceSQL("SELECT F_ReadSubscription, F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_S7Connection, F_SplitByte FROM T_Base_Device WHERE (F_ReadSubscription IS NOT NULL) AND (F_DeviceKindIndex=33)  ORDER BY F_ReadSubscription").Tables[0].DefaultView;

                for (int i = 0; i < dv.Count; i++)
                {
                    if (CStaticClass.MutiReadSubscriptionDeviceSplitReturns.ContainsKey(dv[i]["F_ReadSubscription"].ToString()) == false)
                    {
                        CStaticClass.MutiReadSubscriptionDeviceSplitReturns.Add(dv[i]["F_ReadSubscription"].ToString(), new int[Convert.ToInt32(dv[i]["F_DBWGetLength"])]);
                    }
                }
                CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "操作日志", "FrmClient()-准备CreateSubscriptionGroup", "", "");
                OPCClient.CCommonOPCClient.CreateSubscriptionGroup();
                CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "操作日志", "FrmClient()-CreateSubscriptionGroup", "", "");
                OPCClient.CCommonOPCClient.UpdateDB += new CUpdateDBEventHandler(CCommon_UpdateDB);
                if (OPCClient.CCommonOPCClient.OpcError != null)
                {
                    MessageBox.Show(OPCClient.CCommonOPCClient.OpcError);
                }
            }
            catch (Exception ex)
            {
                CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "操作日志", "FrmClient()-catch", ex.StackTrace, ex.Message);
                throw ex;
            }
                #endregion
        }
        /// <summary>
        /// 客户端事件响应20120428
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void CCommon_UpdateDB(object sender, CUpdateDBChangeEventArgs e)
        {
            if (CStaticClass.WCFOK == true && !CStaticClass.client.IsDisposed)
            {
                string errtext = string.Empty;
                this.BeginInvoke(new MethodInvoker(delegate()
                { DealWithDeviceState(out errtext, e.Deviceindex, e.SplitbyteValue, e.Devicestates); }));

            }
        }
        /// <summary>
        /// 客户端事件响应处理函数20120428
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="deviceindex"></param>
        /// <param name="splitbyteValue"></param>
        /// <param name="devicestates"></param>
        /// <returns></returns>
        bool DealWithDeviceState(out string errtext, int deviceindex, byte[] splitbyteValue, byte[] devicestates)
        {//deviceindex设备组代表的订阅,首先把设备组按照F_DBW2Address由小到大排序,拆分到具体每个设备
            if ((splitbyteValue == null) && (devicestates == null))
            {//20120420
                errtext = OPCClient.CCommonOPCClient.OpcError;
                SendMessage(string.Format("tsStatus@FrmClient.DealWithDeviceState时,订阅组:{0}发生异常,{1}!", deviceindex, errtext));

                return false;
            }

            errtext = string.Empty; DataView dv = new DataView(); DataView dvsp = new DataView(); DataView dvbc = new DataView();
            int devicebegin = 0; int DBW2Addressbegin = 0; int SplitBytebegin = 0; string S7Connection = string.Empty;
            int SplitByteLength = 0;
            try
            {
                StringBuilder sql = new StringBuilder(string.Format("SELECT F_DeviceKindIndex, F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection  FROM T_Base_Device WHERE (F_DeviceKindIndex <>33) AND (F_ReadSubscription = '{0}') AND (F_DBW2Address IS NOT NULL) ORDER BY F_DBW2Address", deviceindex));
                dv = dbo1.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    devicebegin = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                    DBW2Addressbegin = Convert.ToInt32(dv[0]["F_DBW2Address"]);
                    if (Convert.ToInt32(dv[0]["F_DeviceKindIndex"]) != 7 && Convert.ToInt32(dv[0]["F_DeviceKindIndex"]) != 24 && Convert.ToInt32(dv[0]["F_DeviceKindIndex"]) != 35 && Convert.ToInt32(dv[0]["F_DeviceKindIndex"]) != 8 && Convert.ToInt32(dv[0]["F_DeviceKindIndex"]) != 40)
                    {
                        SplitBytebegin = Convert.ToInt32(dv[0]["F_SplitByte"]);    // 光电开关起始
                    }
                    S7Connection = dv[0]["F_S7Connection"].ToString();
                    sql = new StringBuilder(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection  FROM T_Base_Device WHERE  (F_DeviceKindIndex =33) AND (F_ReadSubscription = '{0}') ORDER BY F_DBW2Address", deviceindex));

                    dvsp = dbo1.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dvsp.Count > 0)
                    {
                        SplitByteLength = Convert.ToInt32(dvsp[0]["F_DBWGetLength"]);
                    }
                }
                else
                {
                    sql = new StringBuilder(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection  FROM T_Base_Device WHERE (F_DeviceIndex = '{0}') AND (F_DBW2Address IS NOT NULL) ORDER BY F_DBW2Address", deviceindex));
                    dv = dbo1.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {

                        devicebegin = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                        DBW2Addressbegin = Convert.ToInt32(dv[0]["F_DBW2Address"]);
                        SplitBytebegin = Convert.ToInt32(dv[0]["F_SplitByte"]);
                        S7Connection = dv[0]["F_S7Connection"].ToString();
                        sql = new StringBuilder(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection  FROM T_Base_Device WHERE  (F_DeviceKindIndex =33) AND (F_ReadSubscription = '{0}') ORDER BY F_DBW2Address", deviceindex));
                        dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                        if (dv.Count > 0)
                        {
                            SplitByteLength = Convert.ToInt32(dv[0]["F_DBWGetLength"]);
                        }
                    }
                    else
                    {//20120420
                        errtext = string.Format("FrmClient.DealWithDeviceState时,订阅组:{0}对应的设备索引不存在!", deviceindex);
                        SendMessage(string.Format("tsStatus@FrmClient.DealWithDeviceState时,订阅组:{0}对应的设备索引不存在!", deviceindex));
                        return false;
                    }
                }

                if (splitbyteValue != null)
                {
                    Array.Copy(splitbyteValue, CStaticClass.MutiReadSubscriptionDeviceSplitReturns[deviceindex.ToString()], splitbyteValue.Length);
                    dvsp = dbo1.ExceSQL(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte FROM T_Base_Device WHERE (F_DeviceKindIndex <>31) AND(F_DeviceKindIndex <>33) AND (F_S7Connection  = '{0}') AND (F_DBW2Address IS NOT NULL and F_SplitByte  IS NOT NULL and F_SplitByte >={1} and   F_SplitByte <{1}+{2}) ORDER BY F_DBW2Address", S7Connection, SplitBytebegin, SplitByteLength)).Tables[0].DefaultView;
                    for (int i = 0; i < dvsp.Count; i++)
                    {
                        devinfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dvsp[i]["F_DeviceIndex"]));

                        int delta = Convert.ToInt32(dvsp[i]["F_SplitByte"]) - SplitBytebegin;
                        if (delta < 0) continue;
                        devinfo.SplitByte_0 = (splitbyteValue[delta] & 1) == 1 ? 1 : 0;
                        devinfo.SplitByte_1 = (splitbyteValue[delta] & 2) == 2 ? 1 : 0;
                        devinfo.SplitByte_2 = (splitbyteValue[delta] & 4) == 4 ? 1 : 0;
                        devinfo.SplitByte_3 = (splitbyteValue[delta] & 8) == 8 ? 1 : 0;
                        devinfo.SplitByte_4 = (splitbyteValue[delta] & 16) == 16 ? 1 : 0;
                        devinfo.SplitByte_5 = (splitbyteValue[delta] & 32) == 32 ? 1 : 0;
                        devinfo.SplitByte_6 = (splitbyteValue[delta] & 64) == 64 ? 1 : 0;
                        devinfo.SplitByte_7 = (splitbyteValue[delta] & 128) == 128 ? 1 : 0;
                        //if (devinfo.DeviceIndex == 12103 && devinfo.SplitByte_6 == 0)
                        //{
                        //    label35.Text = "否";
                        //}
                        //if (devinfo.DeviceIndex == 12103 && devinfo.SplitByte_6 == 1)
                        //{
                        //    label35.Text = "是";
                        //}
                        //if (devinfo.DeviceIndex == 12101 && devinfo.SplitByte_6 == 0)
                        //{
                        //    label36.Text = "否";
                        //}
                        //if (devinfo.DeviceIndex == 12101 && devinfo.SplitByte_6 == 1)
                        //{
                        //    label36.Text = "是";
                        //}
                        Model.CGetInfo.SetDeviceInfo(devinfo);


                    }
                }

                int tempdb2addr = 0; StringBuilder sss = new StringBuilder(); StringBuilder barcode = new StringBuilder();
                if (devicestates != null)
                {

                    Array.Copy(devicestates, CStaticClass.MutiReadSubscriptionDeviceStateReturns[deviceindex.ToString()], devicestates.Length);
                    for (int di = 0; di < dv.Count; di++)
                    {

                        int devidx = Convert.ToInt32(dv[di]["F_DeviceIndex"]);
                        devinfo = Model.CGetInfo.GetDeviceInfo(devidx);
                        int taskindex = 0;
                        int state = 0;
                        //以下代码重新开发CStaticClass.MutiS7ConnReturns改为按照F_ReadSubscription
                        if (devinfo.Dbw2Getlength > 3)
                        {
                            tempdb2addr = Convert.ToInt32(dv[di]["F_DBW2Address"]) - DBW2Addressbegin;
                            taskindex = (devicestates[tempdb2addr + 2] << 8) + devicestates[tempdb2addr + 3];
                            
                            switch (devinfo.DeviceKind)
                            {
                                case 1:
                                    devinfo.SplitByte_0 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 7] & 1) == 1 ? 1 : 0;
                                    devinfo.SplitByte_1 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 7] & 2) == 2 ? 1 : 0;
                                    devinfo.SplitByte_2 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 7] & 4) == 4 ? 1 : 0;
                                    devinfo.SplitByte_3 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 7] & 8) == 8 ? 1 : 0;
                                    devinfo.SplitByte_4 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 7] & 16) == 16 ? 1 : 0;
                                    devinfo.SplitByte_5 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 7] & 32) == 32 ? 1 : 0;
                                    devinfo.SplitByte_6 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 7] & 64) == 64 ? 1 : 0;
                                    devinfo.SplitByte_7 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 7] & 128) == 128 ? 1 : 0;
                                    break;
                                case 2:
                                    if (devinfo.IfCorrelDoubleFork == "1")
                                    {
                                        devinfo.SplitByte_0 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 4] & 1) == 1 ? 1 : 0;
                                        devinfo.SplitByte_1 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 4] & 2) == 2 ? 1 : 0;
                                        devinfo.SplitByte_2 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 4] & 4) == 4 ? 1 : 0;
                                        devinfo.SplitByte_3 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 4] & 8) == 8 ? 1 : 0;
                                        devinfo.SplitByte_4 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 4] & 16) == 16 ? 1 : 0;
                                        devinfo.SplitByte_5 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 4] & 32) == 32 ? 1 : 0;
                                        devinfo.SplitByte_6 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 4] & 64) == 64 ? 1 : 0;
                                        devinfo.SplitByte_7 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 4] & 128) == 128 ? 1 : 0;
                                        
                                    }
                                    else
                                    {
                                        devinfo.SplitByte_0 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 6] & 1) == 1 ? 1 : 0;
                                        devinfo.SplitByte_1 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 6] & 2) == 2 ? 1 : 0;
                                        devinfo.SplitByte_2 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 6] & 4) == 4 ? 1 : 0;
                                        devinfo.SplitByte_3 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 6] & 8) == 8 ? 1 : 0;
                                        devinfo.SplitByte_4 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 6] & 16) == 16 ? 1 : 0;
                                        devinfo.SplitByte_5 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 6] & 32) == 32 ? 1 : 0;
                                        devinfo.SplitByte_6 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 6] & 64) == 64 ? 1 : 0;
                                        devinfo.SplitByte_7 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 6] & 128) == 128 ? 1 : 0;
                                        //if (devinfo.DeviceIndex == 12103 && devinfo.SplitByte_6 == 0)
                                        //{
                                        //    label35.Text = "否";
                                        //}
                                        //if (devinfo.DeviceIndex == 12103 && devinfo.SplitByte_6 == 1)
                                        //{
                                        //    label35.Text = "是";
                                        //}
                                        //if (devinfo.DeviceIndex == 12101 && devinfo.SplitByte_6 == 0)
                                        //{
                                        //    label36.Text = "否";
                                        //}
                                        //if (devinfo.DeviceIndex == 12101 && devinfo.SplitByte_6 == 1)
                                        //{
                                        //    label36.Text = "是";
                                        //}
                                    }
                                    break;
                                case 4:
                                    devinfo.SplitByte_0 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 12] & 1) == 1 ? 1 : 0;
                                    devinfo.SplitByte_1 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 12] & 2) == 2 ? 1 : 0;
                                    devinfo.SplitByte_2 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 12] & 4) == 4 ? 1 : 0;
                                    devinfo.SplitByte_3 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 12] & 8) == 8 ? 1 : 0;
                                    devinfo.SplitByte_4 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 12] & 16) == 16 ? 1 : 0;
                                    devinfo.SplitByte_5 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 12] & 32) == 32 ? 1 : 0;
                                    devinfo.SplitByte_6 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 12] & 64) == 64 ? 1 : 0;
                                    devinfo.SplitByte_7 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 12] & 128) == 128 ? 1 : 0;
                                    break;
                                default:
                                    break;
                            }
                            if (devinfo.Dbw2Getlength > 1)
                            {
                                state = devicestates[tempdb2addr + 1];
                            }
                        }
                        if (devinfo.DeviceIndex == 888)
                        {
                            devinfo.XCoor = devicestates[tempdb2addr + 0];
                        }
                        int devkind = devinfo.DeviceKind;
                        if (state >= 30)
                        {
                            devinfo.ErrorCode = state;
                            devinfo.RunState = 2;
                        }
                        else
                        {//0,1,2
                            if (state == 2)
                            {
                                devinfo.RunState = 5;
                            }
                            else
                            {
                                devinfo.RunState = state;
                            }

                            devinfo.ErrorCode = state;


                        }
                        devinfo.TaskNo = taskindex;
                        if ((devinfo.DeviceKind == 1) || (devinfo.DeviceKind == 4))
                        {
                            devinfo.XCoor = devicestates[tempdb2addr + 7] + (devicestates[tempdb2addr + 6] << 8) + (devicestates[tempdb2addr + 5] << 16) + (devicestates[tempdb2addr + 4] << 32);//X坐标
                            //devinfo.XCoor = devicestates[tempdb2addr + 12] ;//X坐标
                            if (devinfo.DeviceKind == 1)
                            {

                                devinfo.YCoor = devicestates[tempdb2addr + 11] + (devicestates[tempdb2addr + 10] << 8) + (devicestates[tempdb2addr + 9] << 16) + (devicestates[tempdb2addr + 8] << 32);//Y坐标
                                //devinfo.YCoor = devicestates[tempdb2addr + 13] ;//Y坐标
                                
                            }
                        }
                        Model.CGetInfo.SetDeviceInfo(devinfo);

                    }



                }
                return true;
            }
            catch (Exception ex)
            {
                SendMessage(string.Format("tsStatus@FrmClient.DealWithDeviceState时{0}", ex.StackTrace + ex.Message));

                errtext = string.Format("tsStatus@FrmClient.DealWithDeviceState时{0}", ex.StackTrace + ex.Message);
                return false;
            }
            finally
            {
                dv.Dispose();
                dvbc.Dispose();
                dvsp.Dispose();
            }
        }

        #region wcf回调
        public void SendDeviceInfo(Model.MDevice devinfo)
        {
            try
            {

                if (CStaticClass.WCFOK == false) return;
                if (this.IsDisposed) return;

                Model.CGetInfo.SetDeviceInfo(devinfo);

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public IAsyncResult BeginSendDeviceInfo(Model.MDevice devinfo, AsyncCallback acb, object state)
        {

            return state as IAsyncResult;

        }
        public void EndSendDeviceInfo(IAsyncResult ar)
        {

        }
        public IAsyncResult BeginSendMessage(string message, AsyncCallback acb, object state)
        {

            return state as IAsyncResult;

        }
        public void EndSendMessage(IAsyncResult ar)
        {

        }
        public void SendMessage(string message)
        {


            char[] cc = new char[1] { '@' };
            string[] strsplit = message.Split(cc);
            if (strsplit.GetLength(0) > 1)
            {//更新指定控件
                if (strsplit[0] == "tsStatus")
                {
                    tsStatus.Text = strsplit[1];
                }
                else if (strsplit[0] == "notifyIcon1")
                {
                    this.BeginInvoke(new MethodInvoker(delegate()
                    {
                        notifyIcon1.BalloonTipText = strsplit[1];
                        notifyIcon1.ShowBalloonTip(10000, "警告:", strsplit[1], ToolTipIcon.Warning);
                    }));
                }
            }
            //else
            //{//刷新数据显示
            //    this.dgvManager.BeginInvoke(new MethodInvoker(delegate()
            //    {
            //        sql.Remove(0, sql.Length);
            //        sql.Append("select * from V_Manage_Task where ").Append(CStaticClass.Manstatus);
            //        this.dgvManager.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            //    }));
            //    this.dgvMonitor.BeginInvoke(new MethodInvoker(delegate()
            //    {
            //        sql.Remove(0, sql.Length);
            //        sql.Append("select * from V_Monitor_Task where ").Append(CStaticClass.Monstatus).Append(" order by 设备指令索引 asc ");

            //        this.dgvMonitor.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
            //    }));

            //}




        }

        //20140824richard
        public void SendOrderMessage(Model.MonitorInfo mi)
        {

            this.BeginInvoke(new MethodInvoker(delegate()
            {
                try
                {
                    if (CStaticClass.UserID.ToUpper() == "SA")
                    {
                        CStaticClass.Order = mi.Orderturnon;
                        CStaticClass.ObtainManageTask = mi.Obtaintask;
                        if (CStaticClass.Order == true)
                        {
                            ClickOrderTurnOn();
                        }
                        else
                        {
                            ClickOrderTurnOff();
                        }
                        if (CStaticClass.ObtainManageTask == true)
                        {
                            ClickObtainTask();
                        }
                        else
                        {
                            ClickStopObtainTask();
                        }
                    }
                }
                catch (Exception ex)
                {

                    if (tsStatus.Text.IndexOf("接收【获取任务和命令开关】广播时:" + ex.Message) < 0)
                    {
                        tsStatus.ForeColor = Color.Red;
                        this.tsStatus.Text += "接收【获取任务和命令开关】广播时:" + ex.Message;
                    }

                }
            }));



        }
        public IAsyncResult BeginSendOrderMessage(Model.MonitorInfo mi, AsyncCallback callBack, object state)
        {
            return state as IAsyncResult;
        }
        public void EndSendOrderMessage(IAsyncResult ar)
        {

        }
        //20140824richard


        #endregion
        private void Client_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (MessageBox.Show("您确认要关闭" + CStaticClass.SystemName + "吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) != DialogResult.OK)
            {
                e.Cancel = true;
                return;
            }
            ClientLogout();
            OPCClient.CCommonOPCClient.DisConnectOPCServer();//20120428
            CommonClassLib.AppSettings.dbo.Close();
            CommonClassLib.AppSettings.dbo1.Close();
            CommonClassLib.AppSettings.dboM.Close();
            FrmLogin.FormInstance.Close();
        }
        void LogCallBack(IAsyncResult ar)
        {
            try
            {
                string strErr = string.Empty;
                if (CStaticClass.WcfControl.EndLogoutClient(out strErr, ar) == true)
                {
                    //if (ar.AsyncState.ToString() == "RegisterClientCallBack")
                    //{
                    //    CStaticClass.WcfControl.BeginRegisterClient(CStaticClass.UserID, "客户端:" + CStaticClass.ClientID + ",用户名:" + CStaticClass.UserID, new AsyncCallback(RegisterClientCallBack), null);
                    //    return;
                    //}
                }
                CStaticClass.WCFOK = false;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        public void ClientLogout()
        {
            try
            {
                string errtext = string.Empty;
                CStaticClass.WcfControl.BeginLogoutClient("客户端:" + CStaticClass.ClientID + ",用户名:" + CStaticClass.UserID, new AsyncCallback(LogCallBack), "");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            FrmHandCommand.FormInstance.Show();
        }

        private void toolStripMenuItem2_Click(object sender, EventArgs e)
        {
            FrmHandAssociateCommand.FormInstance.Show();
        }

        private void MIManageShow_Click(object sender, EventArgs e)
        {
            FrmAutoCommand.FormInstance.Show();
        }

        private void MIAltMonitor_Click(object sender, EventArgs e)
        {
            FrmModifyMonitor.FormInstance.Show();
        }

        private void MIAltManange_Click(object sender, EventArgs e)
        {
            FrmModifyManage.FormInstance.Show();
        }

        private void notifyIcon1_BalloonTipShown(object sender, EventArgs e)
        {
            try
            {
                Voice.Speak(notifyIcon1.BalloonTipText, SpFlags);
            }
            catch
            {

            }
        }

        private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (CStaticClass.WCFOK == true)
            {
                this.TopMost = true;
                this.Visible = true;
                this.TopMost = false;
                this.WindowState = FormWindowState.Maximized;
            }
        }

        private void tsStatus_TextChanged(object sender, EventArgs e)
        {

        }
        private void TSMrefresh_Click(object sender, EventArgs e)
        {
            sql.Remove(0, sql.Length);
            sql.Append("select * from V_Manage_Task where ").Append(CStaticClass.Manstatus);

            this.dgvManager.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
        }
        private void TSMMonitorRefresh_Click(object sender, EventArgs e)
        {
            sql.Remove(0, sql.Length);
            sql.Append("select * from V_Monitor_Task where ").Append(CStaticClass.Monstatus).Append(" order by 设备指令索引 asc ");

            this.dgvMonitor.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
        }
        private void rbmanAll_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rb = (RadioButton)sender;
            if (rb.Checked == true)
            {
                CStaticClass.Manstatus = " F_Status>=-1 ";
            }
            TSMrefresh_Click(sender, e);
        }

        private void rbmanRun_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rb = (RadioButton)sender;
            if (rb.Checked == true)
            {
                CStaticClass.Manstatus = " F_Status=1 ";
            }
            TSMrefresh_Click(sender, e);
        }

        private void rbmanWait_CheckedChanged(object sender, EventArgs e)
        {
            RadioButton rb = (RadioButton)sender;
            if (rb.Checked == true)
            {
                CStaticClass.Manstatus = " F_Status=0 ";
            }
            TSMrefresh_Click(sender, e);
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                string df = "";

                switch (this.comboBox1.Text)
                {
                    case "条码":
                        df = "条码";
                        break;
                    case "调度任务索引":
                        df = "调度任务索引";
                        break;
                    case "设备指令索引":
                        df = "设备指令索引";
                        break;


                    default:
                        return;
                }
                //20100208
                sql.Remove(0, sql.Length);
                sql.Append("select distinct " + df + " from V_Monitor_Task ");

                DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    this.textBox1.DataSource = null;
                    this.textBox1.DisplayMember = df;
                    this.textBox1.ValueMember = df;
                    this.textBox1.DataSource = dv;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.textBox1.Text.Trim().Length == 0) return;
                if (this.comboBox1.Text == "条码")
                {
                    CStaticClass.Monstatus = " 条码='" + this.textBox1.Text.Trim() + "' ";
                }
                if (this.comboBox1.Text == "调度任务索引")
                {
                    CStaticClass.Monstatus = " 调度任务索引='" + this.textBox1.Text.Trim() + "' ";
                }
                if (this.comboBox1.Text == "设备指令索引")
                {
                    CStaticClass.Monstatus = " 设备指令索引='" + this.textBox1.Text.Trim() + "' ";
                }
                TSMMonitorRefresh_Click(sender, e);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            CStaticClass.Monstatus = " F_Status>=-1 ";

            TSMMonitorRefresh_Click(sender, e);
        }
        public void MonitorRefresh()
        {//20110222
            sql.Remove(0, sql.Length);
            sql.Append("select * from V_Monitor_Task where ").Append(CStaticClass.Monstatus).Append(" order by 设备指令索引 asc ");

            this.dgvMonitor.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;


        }

        public void ManagerRefresh()
        {//20110222

            sql.Remove(0, sql.Length);
            sql.Append("select * from V_Manage_Task where ").Append(CStaticClass.Manstatus);
            this.dgvManager.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;


        }
        void BuildHandTaskCallBack(IAsyncResult ar)
        {
            string errtext = string.Empty;

            if (CStaticClass.WcfControl.EndBuildHandTask(out errtext, ar) == false)
            {
                //MessageBox.Show(errtext, "操作提示:", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private void Client_Load(object sender, EventArgs e)
        {
            try
            {
                //for (int i = 0; i <= 1000; i++)
                //{
                //    Model.HandTask ht = new Model.HandTask(11001, 1, 0, "0", "00-00-00", "-", 0, 0);
                //    CStaticClass.WcfControl.BeginBuildHandTask(ht, new AsyncCallback(BuildHandTaskCallBack), ht);
                //}
                #region 添加输送机、穿梭车和堆垛机的单击事件

                foreach (Control ctrl in this.plAccessorial1.Controls)
                {
                    if (ctrl.GetType().ToString() == "System.Windows.Forms.Button")
                    {
                        ctrl.Click += new EventHandler(ctrl_Click);
                    }
                    if ((ctrl.GetType().ToString() == "System.Windows.Forms.Label") && (ctrl.Tag != null) && (ctrl.ForeColor == Color.Red))
                    {
                        ctrl.Click += new EventHandler(ctrl_ClickLabel);
                    }
                    if ((ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox") && (ctrl.Enabled == true))
                    {
                        if (ctrl.Name.IndexOf("pic_") < 0 && ctrl.Name.IndexOf("sto_") < 0)
                        {
                            ctrl.Click += new EventHandler(ctrl_ClickPic);
                        }
                        else
                        {
                            ctrl.Click += new EventHandler(ctrl_Click_1);
                            ctrl.MouseEnter += new EventHandler(Btn_MouseEnter_Stop);
                        }

                    }
                    #endregion
                    TSMrefresh_Click(sender, e);
                    TSMMonitorRefresh_Click(sender, e);
                    //this.MMmasterAdmin.Visible = true;
                    //if (CStaticClass.UserID.ToUpper() == "SA")
                    //{
                    //    this.MMmasterAdmin.Visible = true;
                    //}
                    //else
                    //{
                    //    this.MMmasterAdmin.Visible = false;
                    //}
                }
            }
            catch (Exception ex)
            {
                throw (ex);
            }
        }

        private void MIDeviceState_Click(object sender, EventArgs e)
        {
            FrmDeviceInfoEdit.FormInstance.Show();
        }

        private void MIRouteInfo_Click(object sender, EventArgs e)
        {
            FrmRouteEdit.FormInstance.Show();
        }

        private void MIWaitTime_Click(object sender, EventArgs e)
        {
            FrmWaitTime.FormInstance.Show();
        }

        private void MIMonitorConnectInfo_Click(object sender, EventArgs e)
        {
            FrmConnectDB.FormInstance.ConnectType = "Monitor";
            FrmConnectDB.FormInstance.Show();
        }
        private void ctrl_ClickLabel(object sender, EventArgs e)
        {
            Label label = (Label)sender;
            _deviceStatus.DeviceIndex = Convert.ToInt32(label.Tag);
            _deviceStatus.ShowDialog();
        }
        private void MIIOStation_Click(object sender, EventArgs e)
        {
            FrmIOStation.FormInstance.Show();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (CStaticClass.WCFOK == false)
            {
                if (CStaticClass.WcfControl != null)
                {
                    if (CStaticClass.WcfControl.State == CommunicationState.Faulted)
                    {



                        CStaticClass.WCFOK = false;
                        ReConnectAndRegisterClient();
                    }

                }
                return;
            }
            try
            {
                if (label33.Text == "")
                {
                    if (CStaticClass.UserID != "")
                        label33.Text = dbo.GetSingle("select f_username from T_Base_Users where f_userid='" + CStaticClass.UserID + "'").ToString();
                }
                //CStaticClass.WcfControl.BeginHeartbeat(new AsyncCallback(CallBackHeartbeat), null);
                if (CStaticClass.WcfControl != null)
                {
                    if (CStaticClass.WcfControl.State == CommunicationState.Faulted)
                    {



                        CStaticClass.WCFOK = false;
                        ReConnectAndRegisterClient();
                    }
                    else
                    {

                        CStaticClass.WcfControl.BeginHeartbeat(new AsyncCallback(CallBackHeartbeat), null);
                    }
                }
                //devsn++;
                //if (devsn < devlist.Count())
                //{
                //    CStaticClass.WcfControl.BeginSendAllDeviceStates(devlist[devsn].DeviceIndex, new AsyncCallback(SendAllDeviceStatesCallback), null);
                //}
                //else
                //{
                //    devsn = 0;
                //    CStaticClass.WcfControl.BeginSendAllDeviceStates(devlist[devsn].DeviceIndex, new AsyncCallback(SendAllDeviceStatesCallback), null);

                //}
            }
            catch (Exception ex)
            {

                if (tsStatus.Text.IndexOf("BeginHeartbeat时:" + ex.Message) < 0)
                {
                    tsStatus.ForeColor = Color.Red;
                    this.tsStatus.Text += "BeginHeartbeat时:" + ex.Message;
                }
                CStaticClass.WCFOK = false;
                ReConnectAndRegisterClient();
            }
        }
        public void SendAllDeviceStatesCallback(IAsyncResult ar)
        {
            try
            {
                Model.MDevice dev;
                dev = CStaticClass.WcfControl.EndSendAllDeviceStates(ar);
                if (dev != null)
                {
                    Model.CGetInfo.SetDeviceInfo(dev);
                }
                devsn++;
                if (devsn < devlist.Count())
                {
                    CStaticClass.WcfControl.BeginSendAllDeviceStates(devlist[devsn].DeviceIndex, new AsyncCallback(SendAllDeviceStatesCallback), null);
                }
                else
                {
                    //devsn=0;
                    //CStaticClass.WcfControl.BeginSendAllDeviceStates(devlist[devsn].DeviceIndex, new AsyncCallback(SendAllDeviceStatesCallback), null);

                }
            }
            catch (Exception ex)
            {
                this.BeginInvoke(new MethodInvoker(delegate()
                {
                    if (tsStatus.Text.IndexOf("SendAllDeviceStatesCallback时:" + ex.Message) < 0)
                    {
                        tsStatus.ForeColor = Color.Red;
                        this.tsStatus.Text += "SendAllDeviceStatesCallback时:" + ex.Message;
                    }
                }));

                ReRegisterClient();
            }
        }


        private void MITransportTimeout_Click(object sender, EventArgs e)
        {
            FrmTransportTimeout.FormInstance.Show();
        }

        private void MISeeDarket_Click(object sender, EventArgs e)
        {
            FrmBrowseDarkCasket.FormInstance.Show();
        }

        private void MIDarketFileSet_Click(object sender, EventArgs e)
        {
            FrmDarkCasket.FormInstance.Show();
        }

        private void MIAutoTaskHistory_Click(object sender, EventArgs e)
        {
            FrmBrowseAotoTaskLog.FormInstance.Show();
        }

        private void MIUserInfoManage_Click(object sender, EventArgs e)
        {
            FrmUsers.FormInstance.Show();
        }

        private void MIAltPassword_Click(object sender, EventArgs e)
        {
            FrmPassword.FormInstance.Show();
        }

        private void MMExitSystem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void toolStripMenuItem10_Click(object sender, EventArgs e)
        {
            this.Visible = false;
            //this.WindowState = FormWindowState.Minimized;
        }

        private void toolStripMenuItem8_Click(object sender, EventArgs e)
        {
            this.Visible = true;
            this.WindowState = FormWindowState.Maximized;
        }

        private void toolStripMenuItem9_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void tabPage1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.TranslateTransform(this.tabPage1.AutoScrollPosition.X, this.tabPage1.AutoScrollPosition.Y);
            g.Dispose();
        }
        private void ctrl_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;
            _deviceStatus.DeviceIndex = Convert.ToInt32(btn.Tag);
            _deviceStatus.ShowDialog();
        }
        private void ctrl_ClickTxt(object sender, EventArgs e)
        {
            TextBox txt = (TextBox)sender;
            _worstation.DeviceIndex = Convert.ToInt32(txt.Tag);
            _worstation.ShowDialog();
        }
        private void ctrl_ClickPic(object sender, EventArgs e)
        {
            PictureBox btn = (PictureBox)sender;
            _deviceStatus.DeviceIndex = Convert.ToInt32(btn.Tag);
            _deviceStatus.ShowDialog();
        }

        private void timerFlash_Tick(object sender, EventArgs e)
        {
            string[] DS; char[] dd = new char[1] { '.' };
            Model.MDevice device;
            TimeSpan ts = DateTime.Now.TimeOfDay;
            DataView dv; DataView dvJY;
            this.SuspendLayout(); //richard.liu20140806
            try
            {
                if (CStaticClass.WCFOK == true)
                {
                    sql.Remove(0, sql.Length);//richard.liu20140806
                    sql.Append("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_LockedState = - 1) ");
                    dvJY = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//richard.liu20140806
                    Panel pp = plAccessorial1;
                    PictureBox stack1 ;
                    PictureBox stack2 ;
                    
                    //PictureBox RGV1=bt15001;
                    //PictureBox RGV2 = bt15002;
                    //PictureBox RGV3 = bt25001;
                    TextBox tw1 ;
                    TextBox tw2 ;
                    stack1 = bt11001;
                    stack2 = bt21001;
                   

                    tw1 = t11001;
                    tw2 = t21001;
                    
                    //if (this.tabControl1.SelectedIndex == 0)
                    //{
                    //    stack1 = bt11001;
                    //    stack2 = bt21001;
                    //    //stack4 = bt11004;
                    //    //stack5 = bt11005;

                    //    tw1 = t11001;
                    //    tw2 = t21001;
                    //    //tw4 = t11004;
                    //    //tw5 = t11005;
                    //    pp = plAccessorial1;
                    //}
                    //else
                    //{
                    //    pp = plAccessorial1;
                    //}
                    #region 每层楼监视画面

                    #region 堆垛机、RGV

                    foreach (PictureBox ctrl in pp.Controls.OfType<PictureBox>())
                    {

                        if (ctrl.Enabled == false ) continue;
                        if (ctrl.Name.IndexOf("pic_") >= 0 || ctrl.Name.IndexOf("sto_") >= 0) continue;
                        device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(ctrl.Tag));
                        if (device == null)
                        {//20100108
                            if (tsStatus.Text.IndexOf(ctrl.Name + "控件对应的设备索引:" + ctrl.Tag + "在数据库没有记录!") < 0)
                            {
                                tsStatus.ForeColor = Color.Red;
                                this.tsStatus.Text += ctrl.Name + "控件对应的设备索引:" + ctrl.Tag + "在数据库没有记录!";
                            }
                            continue;
                        }
                        #region 动画

                        if (device.DeviceKind == 1)
                        {//堆垛机
                            switch (device.DeviceIndex)
                            {

                                case 11001:
                                    stack1.Location = new Point((int)(409+  54 * (device.XCoor - 1)), stack1.Location.Y);
                                    tw1.Location = new Point(stack1.Location.X + 10, tw1.Location.Y);
                                    
                                    break;
                                case 21001:

                                    stack2.Location = new Point((int)(424 + 37 * (device.XCoor - 1)), stack2.Location.Y);
                                    tw2.Location = new Point(stack2.Location.X + 10, tw2.Location.Y);
                                    break;

                                
                            }

                        }

                  
                        #endregion

                        #region 设置设备状态
                        if (ctrl.Enabled == false) continue;//20150130 bianzhi
                        switch (device.RunState)
                        {
                            //空闲
                            case 0:
                                ctrl.BackColor = Color.MediumOrchid;
                                break;
                            //运行
                            case 1:
                                ctrl.BackColor = Color.Lime;
                                break;
                            //故障
                            case 2:
                                ctrl.BackColor = Color.Red;
                                break;
                            //离线
                            case 3:
                                ctrl.BackColor = Color.LightYellow;
                                break;
                            //停用
                            case 4:
                                ctrl.BackColor = Color.Maroon;
                                break;
                            //20090920动作完成
                            case 5:
                                ctrl.BackColor = Color.SeaGreen;//MediumOrchid;

                                break;
                        }
                        #endregion

                        #region 设备被禁用
                        //richar.liu20140806
                        dvJY.Sort = "F_DeviceIndex";//20150320 宁波地铁 bianzhi
                        if (dvJY.Find(device.DeviceIndex) >= 0)
                        {
                            ctrl.BackColor = Color.Maroon;
                        }

                        #endregion


                    }

                    #endregion

                    #region 类输送机

                    foreach (Button ctrl in pp.Controls.OfType<Button>())
                    {
                        ctrl.FlatStyle = FlatStyle.Flat;
                        ctrl.FlatAppearance.BorderColor = Color.BlueViolet;
                        ctrl.FlatAppearance.BorderSize = 1;
                        device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(ctrl.Tag));
                        if (device == null)
                        {//20100108
                            if (tsStatus.Text.IndexOf(ctrl.Name + "控件对应的设备索引:" + ctrl.Tag + "在数据库没有记录!") < 0)
                            {
                                tsStatus.ForeColor = Color.Red;
                                this.tsStatus.Text += ctrl.Name + "控件对应的设备索引:" + ctrl.Tag + "在数据库没有记录!";
                            }
                            continue;
                        }
                        #region 设置设备状态
                        switch (device.RunState)
                        {
                            //空闲
                            case 0:

                                ctrl.BackColor = Color.LightSkyBlue;

                                break;
                            //运行
                            case 1:
                                ctrl.BackColor = Color.Lime;
                                break;
                            //故障
                            case 2:
                                ctrl.BackColor = Color.Red;
                                break;
                            //离线
                            case 3:
                                ctrl.BackColor = Color.LightYellow;
                                break;
                            //停用
                            case 4:
                                ctrl.BackColor = Color.Maroon;
                                break;
                            //20090920动作完成
                            case 5:
                                ctrl.BackColor = Color.Gray;

                                break;
                        }
                        #endregion

                        #region 设备被禁用
                        //richar.liu20140806
                        dvJY.Sort = "F_DeviceIndex";//20150320 宁波地铁 bianzhi
                        if (dvJY.Find(device.DeviceIndex) >= 0)
                        {
                            ctrl.BackColor = Color.Maroon;
                        }
                        //------------------------------------------------------//20150319 bianzhi---------------------------------------------------------//
                        //sql.Remove(0, sql.Length);
                        //sql.Remove(0, sql.Length);
                        //sql.Append("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_LockedState = - 1) and F_DeviceIndex=").Append(device.DeviceIndex);
                        //dvJY = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                        //if (dvJY.Count > 0)
                        //{
                        //    ctrl.BackColor = Color.Maroon;
                        //}
                        //------------------------------------------------------//20150319 bianzhi---------------------------------------------------------//
                        #endregion


                    }

                    #endregion

                    #region 货物探测
                    foreach (TextBox ctrl in pp.Controls.OfType<TextBox>())
                    {

                        DS = ctrl.Tag.ToString().Split(dd);
                        int devicebyte = 0; int devbit = 0;
                        int.TryParse(DS[0], out devicebyte);
                        int.TryParse(DS[1], out devbit);
                        device = Model.CGetInfo.GetDeviceInfo(devicebyte);
                        if (device == null)
                        {//20100108
                            if (tsStatus.Text.IndexOf(ctrl.Name + "控件对应的设备索引:" + ctrl.Tag + "在数据库没有记录!") < 0)
                            {
                                tsStatus.ForeColor = Color.Red;
                                this.tsStatus.Text += ctrl.Name + "控件对应的设备索引:" + ctrl.Tag + "在数据库没有记录!";
                            }
                            continue;
                        }

                        switch (devbit)
                        {
                            case 0:
                                ctrl.Visible = device.SplitByte_0 == 1 ? true : false;
                                //if (device.DeviceIndex == 12103 && device.SplitByte_6 == 0)
                                //{
                                //    label35.Text = "否";
                                //}
                                //if (device.DeviceIndex == 12103 && device.SplitByte_6 == 1)
                                //{
                                //    label35.Text = "是";
                                //}
                                //if (device.DeviceIndex == 12101 && device.SplitByte_6 == 0)
                                //{
                                //    label36.Text = "否";
                                //}
                                //if (device.DeviceIndex == 12101 && device.SplitByte_6 == 1)
                                //{
                                //    label36.Text = "是";
                                //}
                                break;
                            case 1:
                                ctrl.Visible = device.SplitByte_1 == 1 ? true : false;
                                break;
                            case 2:
                                ctrl.Visible = device.SplitByte_2 == 1 ? true : false;
                                break;
                            case 3:
                                ctrl.Visible = device.SplitByte_3 == 1 ? true : false;
                                break;
                            case 4:
                                ctrl.Visible = device.SplitByte_4 == 1 ? true : false;
                                break;
                            case 5:
                                ctrl.Visible = device.SplitByte_5 == 1 ? true : false;
                                break;
                            case 6:
                                ctrl.Visible = device.SplitByte_6 == 1 ? true : false;
                                ctrl.BackColor = Color.Goldenrod;
                                
                                break;
                            case 7:
                                ctrl.Visible = device.SplitByte_7 == 1 ? true : false;
                                break;
                        }
                    }
                    #endregion
                    sql.Remove(0, sql.Length);//richard.liu20140806
                    sql.Append("SELECT * FROM T_Base_Device WHERE F_DeviceIndex=13001 ");
                    dvJY = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//richard.liu20140806
                    string bcs = dvJY[0]["F_HaveGoods"].ToString();
                    if (dvJY[0]["F_HaveGoods"].ToString() == "1")
                    {
                        this.pictureBox6.Visible = true;
                        this.label13.Visible = true;

                    }
                    else
                    {
                        this.pictureBox6.Visible = false;
                        this.label13.Visible = false;
                    }
                    sql.Remove(0, sql.Length);//richard.liu20140806
                    sql.Append("SELECT F_HaveGoods FROM T_Base_Device WHERE F_DeviceIndex=23001 ");
                    dvJY = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//richard.liu20140806
                    if (dvJY[0]["F_HaveGoods"].ToString() == "1")
                    {
                        this.pictureBox25.Visible = true;
                        this.label12.Visible = true;
                    }
                    else
                    {
                        this.pictureBox25.Visible = false;
                        this.label12.Visible = false;
                    }
                    sql.Remove(0, sql.Length);//richard.liu20140806
                    sql.Append("SELECT F_HaveGoods FROM T_Base_Device WHERE F_DeviceIndex=23002 ");
                    dvJY = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//richard.liu20140806
                    if (dvJY[0]["F_HaveGoods"].ToString() == "1")
                    {
                        this.pictureBox4.Visible = true;
                        this.label68.Visible = true;
                    }
                    else
                    {
                        this.pictureBox4.Visible = false;
                        this.label68.Visible = false;
                    }
                    #region 逻辑有物显示


                    foreach (RadioButton ctrl in pp.Controls.OfType<RadioButton>())
                    {
                        //20100108DataView dvh;
                        dv = dbo.ExceSQL("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_DeviceIndex = " + ctrl.Tag + ") AND (F_HaveGoods >0)").Tables[0].DefaultView;
                        if (dv.Count > 0)
                        {
                            ctrl.Visible = true;
                            ctrl.BackColor = Color.Blue;
                        }
                        else
                        {
                            ctrl.Visible = false;
                        }

                    }



                    #endregion

                    #endregion
                    #region 刷新按钮 急停按钮通过堆垛机光电开关.6反馈 联机停车
                    foreach (PictureBox ctrl in pp.Controls.OfType<PictureBox>())
                    {
                        if (ctrl.Tag.ToString() != "" && (ctrl.Name.IndexOf("pic_") >= 0 || ctrl.Name.IndexOf("sto_") >= 0))
                        {
                            //如果是紧急停车按钮的时候
                            if (!ctrl.Tag.ToString().Contains("."))
                            {
                                device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(ctrl.Name.ToString().Substring(ctrl.Name.Length - 5, 5)));
                                if (device.DeviceKind == 40)
                                {
                                    //取堆垛机状态来显示颜色
                                    device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(ctrl.Tag));
                                    if (device == null)
                                    {
                                        //判断设备在数据库表中村不存在
                                        if (tsStatus.Text.IndexOf(ctrl.Name + "控件对应的设备索引:" + ctrl.Name.ToString().Substring(ctrl.Name.Length - 5, 5) + "在数据库无该设备") == -1)
                                        {
                                            tsStatus.ForeColor = Color.Red;
                                            this.tsStatus.Text += ctrl.Name + "控件对应的设备索引:" + ctrl.Name.ToString().Substring(ctrl.Name.Length - 5, 5) + "在数据无该设备";
                                        }
                                        continue;
                                    }
                                    DataView dwRunDevice = dbo.ExceSQL("select F_DeviceIndex from T_Base_Device where F_DeviceKindIndex = 1 or F_DeviceKindIndex = 4").Tables[0].DefaultView;
                                    for (int i = 0; i < dwRunDevice.Count; i++)
                                    {
                                        if (ctrl.Tag.ToString() == dwRunDevice[i]["F_DeviceIndex"].ToString())
                                        {
                                            Model.MDevice deviceRun = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(ctrl.Tag.ToString()));
                                            if (deviceRun.SplitByte_6 == 1)
                                            {
                                                //急停显示stop
                                                ctrl.Image = wcfControlMonitorClient.Properties.Resources.stop1;
                                            }
                                            if (deviceRun.SplitByte_6 == 0)
                                            {
                                                //正常显示红色图片
                                                ctrl.Image = wcfControlMonitorClient.Properties.Resources.stop0;
                                            }
                                        }

                                    }
                                }
                            }
                        }
                    }
                    #endregion
                }
            }
            catch (Exception ex)
            {//20100108

                if (tsStatus.Text.IndexOf("刷新界面动画时:" + ex.Message) < 0)
                {
                    tsStatus.ForeColor = Color.Red;
                    this.tsStatus.Text += "刷新界面动画时:" + ex.Message;
                }
            }
            finally
            {//20100108
                TimeSpan ts1 = DateTime.Now.TimeOfDay;
                device = null;
                this.ResumeLayout();//richard.liu20140806
            }
        }

        private void dgvMonitor_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            foreach (DataGridViewRow DGVRow in this.dgvMonitor.Rows)
            {
                if (DGVRow != null)
                {
                    if (Convert.ToInt32(DGVRow.Cells["f_status"].Value) >= 30)
                    {
                        DGVRow.DefaultCellStyle.BackColor = Color.Red;
                    }

                }
            }
        }


        void ReRegisterClient()
        {
            //CStaticClass.ClientID = Dns.GetHostName();

            //var ctx = new InstanceContext(CStaticClass.client);
            //CStaticClass.WcfControl = new WcfControlMonitor.ControlMonitorClient(ctx);

            //string errtext = string.Empty;

            //CStaticClass.WcfControl.BeginRegisterClient(CStaticClass.UserID, "客户端:" + CStaticClass.ClientID + ",用户名:" + CStaticClass.UserID, new AsyncCallback(RegisterClientCallBack), null);
        }

        void RegisterClientCallBack(IAsyncResult ar)
        {
            try
            {
                string ErrText;
                if (CStaticClass.WcfControl.EndRegisterClient(out ErrText, ar) == true)
                {
                    CStaticClass.WCFOK = true;
                    devsn++;
                    if (devsn < devlist.Count())
                    {
                        CStaticClass.WcfControl.BeginSendAllDeviceStates(devlist[devsn].DeviceIndex, new AsyncCallback(SendAllDeviceStatesCallback), null);
                    }
                    else
                    {
                        devsn = 0;
                        CStaticClass.WcfControl.BeginSendAllDeviceStates(devlist[devsn].DeviceIndex, new AsyncCallback(SendAllDeviceStatesCallback), null);

                    }
                }
                else
                {
                    CStaticClass.WcfControl.BeginLogoutClient("客户端:" + CStaticClass.ClientID + ",用户名:" + CStaticClass.UserID, new AsyncCallback(LogCallBack), "RegisterClientCallBack");

                    this.BeginInvoke(new MethodInvoker(delegate()
                    {
                        if (tsStatus.Text.IndexOf("EndRegisterClient时:" + ErrText) < 0)
                        {
                            tsStatus.ForeColor = Color.Red;
                            this.tsStatus.Text += "EndRegisterClient时:" + ErrText;
                        }
                    }));

                }
            }
            catch (Exception ex)
            {
                this.BeginInvoke(new MethodInvoker(delegate()
                {
                    if (tsStatus.Text.IndexOf("EndRegisterClient时:" + ex.Message) < 0)
                    {
                        tsStatus.ForeColor = Color.Red;
                        this.tsStatus.Text += "EndRegisterClient时:" + ex.Message;
                    }
                }));


            }

        }

        private void btClearStatus_Click(object sender, EventArgs e)
        {
            this.tsStatus.Text = "";
        }

        private void MIStartRetrieveTask_Click(object sender, EventArgs e)
        {
            ClickObtainTask();
            CStaticClass.WcfControl.BeginObtainTask("", "UPDATE", new AsyncCallback(CallbackObtainTask), null);

        }
        private void MIStopRetrieveTask_Click(object sender, EventArgs e)
        {
            ClickStopObtainTask();
            CStaticClass.WcfControl.BeginStopObtainTask(new AsyncCallback(CallbackStopObtainTask), null);
        }

        private void MITurnOn_Click(object sender, EventArgs e)
        {

            ClickOrderTurnOn();
            CStaticClass.WcfControl.BeginOrderTurnOn(new AsyncCallback(CallbackTurnOn), null);
        }

        private void MITurnOff_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("您确认要“关闭命令开关”吗?如果“关闭命令开关”将导致调度计算机与所有设备通讯中断!", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) != DialogResult.OK)
            {
                return;
            }
            ClickOrderTurnOff();
            CStaticClass.WcfControl.BeginOrderTurnOff(new AsyncCallback(CallbackTurnOff), null);
        }

        private void MISystemInit_Click(object sender, EventArgs e)
        {
            FrmSystemInit.FormInstance.Show();
        }

        void CallbackObtainTask(IAsyncResult ar)
        {
            CStaticClass.WcfControl.EndObtainTask(ar);
        }
        void CallbackStopObtainTask(IAsyncResult ar)
        {
            CStaticClass.WcfControl.EndStopObtainTask(ar);
        }
        void CallbackTurnOn(IAsyncResult ar)
        {
            CStaticClass.WcfControl.EndOrderTurnOn(ar);
        }
        void CallbackTurnOff(IAsyncResult ar)
        {
            CStaticClass.WcfControl.EndOrderTurnOff(ar);
        }
        void CallBackHeartbeat(IAsyncResult ar)
        {
            this.BeginInvoke(new MethodInvoker(delegate()
            {
                try
                {
                    string errtext = string.Empty;
                    Model.MonitorInfo mi;
                    CStaticClass.WcfControl.EndHeartbeat(out mi, ar);
                    if (CStaticClass.UserID.ToUpper() == "SA")
                    {
                        CStaticClass.Order = mi.Orderturnon;
                        CStaticClass.ObtainManageTask = mi.Obtaintask;
                        if (mi.Orderturnon == true)
                        {
                            ClickOrderTurnOn();
                        }
                        else
                        {
                            ClickOrderTurnOff();
                        }
                        if (mi.Obtaintask == true)
                        {
                            ClickObtainTask();
                        }
                        else
                        {
                            ClickStopObtainTask();
                        }
                    }
                    if (mi.S7connectOnline.Count > 0)
                    {
                        if (mi.S7connectOnline.ContainsKey("S7 connection_1"))
                        {
                            if (mi.S7connectOnline["S7 connection_1"] == 0)
                            {
                                pbF1S7.Image = wcfControlMonitorClient.Properties.Resources.ProgressSuccess;
                                //devinfo = Model.CGetInfo.GetDeviceInfo(888);(原代码 cz改)
                                //devinfo = Model.CGetInfo.GetDeviceInfo(11001);
                                //if (PLC == 0)
                                //{
                                //    PLC = devinfo.XCoor;
                                //}
                                //else
                                //{
                                //    if (PLC == devinfo.XCoor)
                                //    {
                                //        if (lastupdate.AddSeconds(45) < DateTime.Now)
                                //        {
                                //            //do recon
                                //            OPCClient.CCommonOPCClient.kkk();
                                //            lastupdate = DateTime.Now;
                                //            CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "重建订阅组", "", "");
                                //        }

                                //    }
                                //    else
                                //    {
                                //        PLC = devinfo.XCoor;
                                //        lastupdate = DateTime.Now;
                                //    }
                                //}
                            }
                            else
                            {
                                pbF1S7.Image = wcfControlMonitorClient.Properties.Resources.ProgressError;
                            }
                        }
                        if (mi.S7connectOnline.ContainsKey("S7 connection_2"))
                        {
                            if (mi.S7connectOnline["S7 connection_2"] == 0)
                            {
                                pbF2S7.Image = wcfControlMonitorClient.Properties.Resources.ProgressSuccess;
                               
                            }
                            else
                            {
                                pbF2S7.Image = wcfControlMonitorClient.Properties.Resources.ProgressError;
                            }
                        }
                    }
                }
                catch (Exception ex)
                {

                    if (tsStatus.Text.IndexOf("CallBackHeartbeat时:" + ex.Message) < 0)
                    {
                        tsStatus.ForeColor = Color.Red;
                        this.tsStatus.Text += "CallBackHeartbeat时:" + ex.Message;
                    }


                    ReRegisterClient();
                }
            }));

        }

        void ClickObtainTask()
        {
            if (MITurnOn.Checked == true)
            {
                if (this.Text != CStaticClass.SystemName + "【开始获取任务!】" + "【正在执行自动命令!】")
                {
                    this.Text = CStaticClass.SystemName + "【开始获取任务!】" + "【正在执行自动命令!】";
                }
            }
            else
            {
                if (this.Text != CStaticClass.SystemName + "【开始获取任务!】")
                {
                    this.Text = CStaticClass.SystemName + "【开始获取任务!】";
                }
            }
            MIStartRetrieveTask.Checked = true;
            MIStartRetrieveTask.Enabled = false;
            MIStopRetrieveTask.Checked = false;
            MIStopRetrieveTask.Enabled = true;
        }
        void ClickStopObtainTask()
        {
            if (MITurnOn.Checked == true)
            {
                if (this.Text != CStaticClass.SystemName + "【正在执行自动命令!】")
                {
                    this.Text = CStaticClass.SystemName + "【正在执行自动命令!】";
                }
            }
            else
            {
                if (this.Text != CStaticClass.SystemName)
                {
                    this.Text = CStaticClass.SystemName;
                }
            }

            MIStartRetrieveTask.Checked = false;
            MIStartRetrieveTask.Enabled = true;
            MIStopRetrieveTask.Enabled = false;
            MIStopRetrieveTask.Checked = true;
        }
        void ClickOrderTurnOn()
        {
            if (MIStartRetrieveTask.Checked == true)
            {
                if (this.Text != CStaticClass.SystemName + "【开始获取任务!】" + "【正在执行自动命令!】")
                {
                    this.Text = CStaticClass.SystemName + "【开始获取任务!】" + "【正在执行自动命令!】";
                }
            }
            else
            {
                if (this.Text != CStaticClass.SystemName + "【正在执行自动命令!】")
                {
                    this.Text = CStaticClass.SystemName + "【正在执行自动命令!】";
                }
            }
            MITurnOff.Enabled = true;
            MITurnOn.Enabled = false;
            MITurnOff.Checked = false;
            MITurnOn.Checked = true;
        }
        void ClickOrderTurnOff()
        {

            if (MIStartRetrieveTask.Checked == true)
            {
                if (this.Text != CStaticClass.SystemName + "【开始获取任务!】")
                {
                    this.Text = CStaticClass.SystemName + "【开始获取任务!】";
                }
            }
            else
            {
                if (this.Text != CStaticClass.SystemName)
                {
                    this.Text = CStaticClass.SystemName;
                }
            }

            MITurnOff.Enabled = false;
            MITurnOn.Enabled = true;
            MITurnOn.Checked = false;
            MITurnOff.Checked = true;
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            try
            {
                TSMMonitorRefresh_Click(sender, e);
                TSMrefresh_Click(sender, e);
            }
            catch
            {
                //if (tsStatus.Text.IndexOf("读取数据库时:" + ex.Message) < 0)
                //{
                //    tsStatus.ForeColor = Color.Red;
                //    this.tsStatus.Text += "读取数据库时时:" + ex.Message;
                //}
            }
        }

        private void MISystemInit2_Click(object sender, EventArgs e)
        {

            FrmSystemInit.FormInstance.Show();
        }

        private void MIManageConnectInfo_Click(object sender, EventArgs e)
        {
            FrmConnectDB.FormInstance.ConnectType = "Manage";
            FrmConnectDB.FormInstance.Show();
        }
        public 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;
        }
        string GetBarcodeFromMonitorIndex(int taskindex)
        {
            DataView dvb = new DataView(); StringBuilder sss = new StringBuilder("");
            try
            {

                sss.Append("SELECT  F_TxtParam FROM T_Monitor_Task WHERE (F_MonitorIndex = ").Append(taskindex).Append(")");
                dvb = dbo.ExceSQL(sss.ToString()).Tables[0].DefaultView;
                if (dvb.Count > 0)
                {
                    return dvb[0]["F_TxtParam"].ToString();
                }
                else
                {
                    return "-";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dvb.Dispose();
            }
        }
        int GetMonitorRunTaskIndexFromBarCode(StringBuilder BarCode)
        {//20110216
            DataView dv = new DataView();
            try
            {
                string bc = BarCode.ToString();

                dv = dbo1.ExceSQL(string.Format("SELECT T_Monitor_Task.F_MonitorIndex FROM T_Base_Device,T_Monitor_Task WHERE  T_Base_Device.F_DeviceIndex = T_Monitor_Task.F_DeviceIndex and ((T_Base_Device.F_DeviceKindIndex = 13) OR (T_Base_Device.F_DeviceKindIndex = 31)) and (F_TxtParam = '{0}')  and F_Status>0 order by F_MonitorIndex asc", bc)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
                }
                else
                {

                    return -1;

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        int GetMonitorAskTaskIndexFromBarCode(StringBuilder BarCode)
        {//20110216
            DataView dv = new DataView();
            try
            {
                string bc = BarCode.ToString();

                dv = dbo.ExceSQL(string.Format("SELECT T_Monitor_Task.F_MonitorIndex FROM T_Base_Device,T_Monitor_Task WHERE  T_Base_Device.F_DeviceIndex = T_Monitor_Task.F_DeviceIndex and ((T_Base_Device.F_DeviceKindIndex = 13) OR (T_Base_Device.F_DeviceKindIndex = 31)) and (F_TxtParam = '{0}')  and ((F_Status>0) or (F_SendFlag=2 and F_Status=0)) and F_DeviceCommandIndex=6 order by F_MonitorIndex asc", bc)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
                }
                else
                {

                    return -1;

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        int GetMonitorTaskIndexFromBarCode(StringBuilder BarCode, Model.MDevice devinf)
        {//20110216
            DataView dv = new DataView();
            try
            {
                string bc = BarCode.ToString();

                dv = dbo.ExceSQL(string.Format("SELECT T_Monitor_Task.F_MonitorIndex FROM T_Base_Device,T_Monitor_Task WHERE  T_Base_Device.F_DeviceIndex = T_Monitor_Task.F_DeviceIndex and ((T_Base_Device.F_DeviceKindIndex = 13) OR (T_Base_Device.F_DeviceKindIndex = 31)) and (F_TxtParam = '{0}') and (F_NumParam4 = {1} or F_NumParam4 = {2}) and F_Status>0 order by F_MonitorIndex asc", bc, devinf.DeviceIndex, devinf.DeviceVisual)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
                }
                else
                {
                    //dv = dbo.ExceSQL(string.Format("SELECT T_Monitor_Task.F_MonitorIndex FROM T_Base_Device,T_Monitor_Task WHERE  T_Base_Device.F_DeviceIndex = T_Monitor_Task.F_DeviceIndex and ((T_Base_Device.F_DeviceKindIndex = 13) OR (T_Base_Device.F_DeviceKindIndex = 31)) and (F_TxtParam = '{0}')  and F_Status>0 order by F_MonitorIndex asc", bc)).Tables[0].DefaultView;
                    //if (dv.Count > 0)
                    //{
                    //    return Convert.ToInt32(dv[0]["F_MonitorIndex"]);
                    //}
                    //else
                    //{
                    return -1;
                    //}
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        string GetMonitorTaskStartTime(int taskindex, out int order)
        {//20110216
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT F_StartTime,F_DeviceCommandIndex FROM T_Monitor_Task WHERE  F_MonitorIndex={0}", taskindex)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    order = Convert.ToInt32(dv[0]["F_DeviceCommandIndex"]);
                    return dv[0]["F_StartTime"].ToString();
                }
                else
                {
                    order = -1;
                    return "-";
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }

        private void MIZCKSetIO_Click(object sender, EventArgs e)
        {
            FrmZCKSetIOStation.FormInstance.Show();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Minimized;
        }
        //急停按钮 联机停车急停单机事件
        private void ctrl_Click_1(object sender, EventArgs e)
        {
            PictureBox px = (PictureBox)sender;
            //pic30001 截出30001  跟T_BASE_Device  对应
            int DeviceIndexForRunButton = Convert.ToInt32(px.Name.ToString().Substring(px.Name.Length - 5, 5));
            Model.MDevice deviceRun = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(px.Tag.ToString()));
            int iValue = 0;
            //急停写1 正常写0  
            iValue = deviceRun.SplitByte_6 == 1 ? 0 : 1;
            CStaticClass.WcfControl.BeginSendDeviceReset(DeviceIndexForRunButton, iValue, new AsyncCallback(SendDeviceResetCallBack), iValue);
        }
        //急停按钮程序
        void SendDeviceResetCallBack(IAsyncResult ar)
        {
            string errtext = string.Empty;
            if (CStaticClass.WcfControl.EndSendDeviceReset(out errtext, ar) == false)
            {
                MessageBox.Show(errtext, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        //急停显示  用于紧急急停按钮鼠标放上去显示设备信息
        private void Btn_MouseEnter_Stop(object sender, EventArgs e)
        {
            string deviceindex = (sender as Control).Tag.ToString();
            devinfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(deviceindex));
            if (devinfo != null)
            {
                if (devinfo.SplitByte_6 == 0)//停车
                {
                    deviceindex = string.Format("{0}-联机停车", devinfo.DeviceIndex);

                }
                if (devinfo.SplitByte_6 == 1)//未停车
                {
                    deviceindex = string.Format("{0}-未联机停车", devinfo.DeviceIndex);
                }
            }
            toolTip_DeviceIndex.SetToolTip(sender as Control, deviceindex);
        }


        void ReConnectAndRegisterClient()
        {
            try
            {
                CStaticClass.ClientID = Dns.GetHostName();

                var ctx = new InstanceContext(CStaticClass.client);
                CStaticClass.WcfControl = new WcfControlMonitor.ControlMonitorClient(ctx);

                string errtext = string.Empty;
                CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "尝试重新连接", "", "");
                CStaticClass.WcfControl.BeginRegisterClient(CStaticClass.UserID, "客户端:" + CStaticClass.ClientID + ",用户名:" + CStaticClass.UserID, new AsyncCallback(ReConnectAndRegisterClientCallBack), null);

            }
            catch (Exception ex)
            {

                throw ex;
            }


        }
        void ReConnectAndRegisterClientCallBack(IAsyncResult ar)
        {
            try
            {

                string ErrText = string.Empty;
                if (false == CStaticClass.WcfControl.EndRegisterClient(out ErrText, ar))
                {
                    //MessageBox.Show(ErrText, "登陆错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

                    CStaticClass.WCFOK = false;

                    return;
                }

                CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "重连**成功登录系统", "", "");
                tsStatus.Text = "";


                //CStaticClass.WcfControl.BeginSendAllDeviceStates(CStaticClass.client.devlist[0].DeviceIndex, new AsyncCallback(CStaticClass.client.SendAllDeviceStatesCallback), null);
                CStaticClass.WCFOK = true;
                OPCClient.CCommonOPCClient.kkk();
                //OPCClient.CCommonOPCClient.CreateSubscriptionGroup();

            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message, "登陆错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                CStaticClass.WCFOK = false;

                return;
            }
        }

        private void 设备报警记录ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FrmDeviceErrorLog.FormInstance.Show();
        }

    }
}