using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using CommonLib;
using System.Data;
using ICommLayer;
using CommLayerFactory;
using System.IO;
using System.Threading;
using CommonUtils;
using System.Runtime.InteropServices.ComTypes;

namespace WcfControlMonitorLib
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。

    /// <summary>
    /// 调度wcf的实现
    /// </summary>
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class SControlMonitor : IControlMonitor, IDisposable, IBasicControlMonitor
    {
        #region 变量定义
        //ManageService.S_ManageService g_manageService = new ManageService.S_ManageService();
        Model.MDevice _device = null;
        public static System.Collections.Hashtable ClientCallbackLists = new System.Collections.Hashtable();
        public static System.Collections.Hashtable ClientShowLists = new System.Collections.Hashtable();
        /// <summary>
        /// 数据变化事件
        /// </summary>
        public static event CDataSourceChangeEventHandler DataChange;
        /// <summary>
        /// 通道打开事件
        /// </summary>
        public static event ClientLogEventHandler ChannelOpen;
        /// <summary>
        /// 客户端断开服务
        /// </summary>
        public static event ClientLogEventHandler ClientLogout;
        public static event CUpdateDBEventHandler AGVUpdateDB;
        public static event CUpdateDBEventHandler PLCCommonUpdateDB;
        public static event CDeviceStateChangeEventHandler CDeviceState;
        public static event CStringInfoEventHandler SendBarcode;
        public static event CWriteDarkCasketEventHandler WriteDarkCasket;//20121108
        public static event CSendDeviceOrderEventHandler SendDeviceOrder;//20121108
        static DBFactory.DBOperator dbo = new DBFactory.DBOperator();//20130926
        static DBFactory.DBOperator dboMan = CStaticClass.dboM;//20130510
        static DBFactory.DBOperator dbo1;
        CCommonFunction ccf = new CCommonFunction();
        CGetState cgs = new CGetState();
        static CControl cctrl = new CControl();


        ISendDeviceOrder sdo;
        Model.MDevice devinfo;
        Model.MDevice modifypathdevinfo;
        Model.MDevice askDevinfo;
        Model.MDevice ClientUsedDevinfo;//20161229
        StringBuilder[] wv = { new StringBuilder("2") };
        StringBuilder[] witemnames = { new StringBuilder("") };
        private Object thisLock = new Object();
        DataView dvclient = new DataView();//20161229
        string sqlstr = string.Empty;
        #endregion
        /// <summary>
        /// 构造函数
        /// </summary>
        public SControlMonitor()
        {
            try
            {
                //g_manageService.ManageInStorageCheckoutCompleted += new ManageService.ManageInStorageCheckoutCompletedEventHandler(g_manageService_ManageInStorageCheckoutCompleted);
                //初始化管理和调度交互状态
                Model.CGetInfo.AddIOControlStatus();
                Model.CGetInfo.AddDeviceKindInfo();
                Model.CGetInfo.AddDeviceInfo();
                Model.CGetInfo.AddModifyPathDeviceInfo();
                Model.CGetInfo.AddDeviceErrors();
                #region 调度优化设置
                CStaticClass.MovedDeviceAheadTrigger = CommonClassLib.AppSettings.GetValue("MovedDeviceAheadTrigger");
                CStaticClass.OutDetectArrowIdleGoods = CommonClassLib.AppSettings.GetValue("OutDetectArrowIdleGoods");
                CStaticClass.DeviceErrorAutoModifyRoutePath = CommonClassLib.AppSettings.GetValue("DeviceErrorAutoModifyRoutePath");
                CStaticClass.DoubleForkWaitTime = CommonClassLib.AppSettings.GetValue("DoubleForkWaitTime");
                CStaticClass.StockCodeCheck = CommonClassLib.AppSettings.GetValue("StockCodeCheck");
                CStaticClass.TransportTimeout = CommonClassLib.AppSettings.GetValue("TransportTimeout");
                //20121203
                CStaticClass.HCA12068 = CommonClassLib.AppSettings.GetValue("HCA12068");
                CStaticClass.HCB12019 = CommonClassLib.AppSettings.GetValue("HCB12019");
                CStaticClass.HCB12034 = CommonClassLib.AppSettings.GetValue("HCB12034");
                CStaticClass.HCBLanewayOutDB = CommonClassLib.AppSettings.GetValue("HCBLanewayOutDB");
                CStaticClass.SaveDays = CommonClassLib.AppSettings.GetValue("SaveDays");//保存任务历史记录的时间
                CStaticClass.OutTaskCounts = CommonClassLib.AppSettings.GetValue("OutTaskCounts");//终点相同的出库任务执行的最大数量
                CStaticClass.OutTaskCounts1 = CommonClassLib.AppSettings.GetValue("OutTaskCounts1");//终点相同的出库任务执行的最大数量
                CStaticClass.OutTaskCounts2 = CommonClassLib.AppSettings.GetValue("OutTaskCounts2");
                CStaticClass.OutTaskCounts3 = CommonClassLib.AppSettings.GetValue("OutTaskCounts3");
                CStaticClass.ManageServiceAddress = CommonClassLib.AppSettings.GetValue("ManageServiceAddress");//民航二所
                CStaticClass.ManageServiceAddressTwo = CommonClassLib.AppSettings.GetValue("ManageServiceAddressTwo");
                CStaticClass.ManageServiceAddressThree = CommonClassLib.AppSettings.GetValue("ManageServiceAddressThree");
                #endregion

            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        void CSendBarcode(int deviceindex, string barcode, bool confirm)
        {//一楼条码扫描16001入库分道管理异步回调
            object sender = deviceindex.ToString(); DataView dv = new DataView(); int newdev = 160011;
            int _confirm = 0;//1为剔除 2为直行
            try
            {
                if (confirm == true)
                {
                    _confirm = 2;
                }
                else
                {
                    _confirm = 1;
                }
                #region 挑选写区(160011,160012,160013)
                //依次循环分区写入
                dv = dbo.ExceSQL(string.Format("SELECT F_TaskIndex FROM T_Base_PLC_Ask WHERE (F_DeviceIndex = {0})", deviceindex)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {

                    switch (Convert.ToInt32(dv[0][0]))
                    {
                        case 160011:
                            newdev = 160012;
                            break;
                        case 160012:
                            newdev = 160013;
                            break;
                        case 160013:
                            newdev = 160011;
                            break;
                        default:
                            newdev = 160011;
                            break;
                    }

                }
                #endregion
                CStringInfoEventArgs e = new CStringInfoEventArgs(newdev, barcode, _confirm);
                SendBarcode(sender, e);

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }

        }


        void CCommon_UpdateDB(object sender, CUpdateDBChangeEventArgs e)
        {
            if (PLCCommonUpdateDB != null)
            {//20150103
                PLCCommonUpdateDB(sender, e);
            }

        }


        void CListenAGVState_UpdateDB(object sender, CUpdateDBChangeEventArgs e)
        {
            AGVUpdateDB(sender, e);
        }
        void CClientTCPIP_SendDeviceOrder(object sender, CSendDeviceOrderEventArgs e)
        {
            SendDeviceOrder(sender, e);
        }

        void CClientTCPIP_WriteDarkCasket(object sender, CWriteDarkCasketEventArgs e)
        {
            WriteDarkCasket(sender, e);
        }

        void MonitorRefreshMonitor(RefreshMonitorEventArgs e)
        {
            OnRefreshMonitor(e);
        }
        void MonitorDataChange(object sender, CDataChangeEventArgs e)
        {
            OnDataChange(sender, e);
        }

        #region 事件响应

        public static void OnDataChange(object sender, CDataChangeEventArgs e)
        {
            if (DataChange != null)
            {
                DataChange(sender, e);
            }
        }

        public static event RefreshMonitorEventHandler RefreshMonitor;
        public static void OnRefreshMonitor(RefreshMonitorEventArgs e)
        {
            if (RefreshMonitor != null)
            {
                RefreshMonitor(e);
            }
        }
        public static void OnDeviceState(object sender, CDeviceStateChangeEventArgs e)
        {
            if (CDeviceState != null) CDeviceState(sender, e);
        }
        public void OnChannelOpen(ClientLogEventArgs e)
        {
            if (ChannelOpen != null)
            {
                ChannelOpen(e);
            }
        }

        public void OnClientLogout(ClientLogEventArgs e)
        {
            if (ClientLogout != null)
            {
                ClientLogout(e);
            }
        }
        void Channel_Closing(object sender, EventArgs e)
        {

            lock (ClientCallbackLists)
            {

                var client = (IClient)sender;
                if (ClientCallbackLists.ContainsValue(client) == true)
                {
                    ClientCallbackLists.Remove(client);
                }

            }
            lock (ClientShowLists)
            {

                var client = (IClient)sender;
                if (ClientShowLists.ContainsValue(client) == true)
                {
                    ClientShowLists.Remove(client);
                }

            }
        }


        #endregion

        #region 自定义方法

        /// <summary> 
        /// 比较两个值型一维数组变量是否值相等 
        /// </summary> 
        /// <param name="array1">值型一维数组1</param> 
        /// <param name="array2">值型一维数组2</param> 
        /// <returns>比较结果,相等则true,否则false</returns> 
        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();
            }
        }
        void AssociateComplete(int deviceIdx, int mindex, int status)
        {
            DataView dv = new DataView(); DataView dv1 = new DataView(); DataView dv2 = new DataView(); DataView dv3 = new DataView();
            try
            {
                int ClearZero = 0;
                if (status >= 1)
                {
                    ClearZero = 1;
                }
                else
                {
                    ClearZero = Model.CGeneralFunction.TASKFINISH;
                }
                int DeviceIdx = deviceIdx;
                int devKind;
                //20091107
                dv = dbo.ExceSQL("select F_MonitorIndex,F_Status,F_DeviceIndex,F_DeviceCommandIndex,F_NumParam4 from T_Monitor_Task where F_MonitorIndex=" + mindex).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    //检查关联命令一起报告完成
                    //如果mindex是主动任务(f_associatemonitor有数据),先报告完成被动的任务;如果mindex是被动任务,先报告完成自己,再报告完成主动任务;
                    dv1 = dbo.ExceSQL("select F_DeviceIndex,F_Associate from T_Monitor_Task where F_Associate IS NOT NULL and F_MonitorIndex=" + mindex).Tables[0].DefaultView;
                    if (dv1.Count > 0)
                    {
                        dv2 = dbo.ExceSQL("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_MonitorIndex=" + Convert.ToInt32(dv1[0]["F_Associate"])).Tables[0].DefaultView;
                        if (dv2.Count > 0)//有关联命令,先报告完成关联命令
                        {

                            DeviceIdx = Convert.ToInt32(dv2[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);

                            cgs.ActionComplete(DeviceIdx, Convert.ToInt32(dv2[0]["F_MonitorIndex"]), ClearZero);
                        }
                        //再报告完成自己
                        DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                        devKind = ccf.GetDeviceKindIdx(DeviceIdx);

                        cgs.ActionComplete(DeviceIdx, mindex, ClearZero);
                    }
                    else
                    {
                        //自己是否被关联,先报告完成自己,再报告完成主任务
                        dv3 = dbo.ExceSQL("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_Associate ='" + mindex + "'").Tables[0].DefaultView;
                        if (dv3.Count > 0)
                        {   //先报告完成自己
                            DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);

                            cgs.ActionComplete(DeviceIdx, mindex, ClearZero);
                            //再报告完成主任务
                            DeviceIdx = Convert.ToInt32(dv3[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            cgs.ActionComplete(DeviceIdx, Convert.ToInt32(dv3[0]["F_MonitorIndex"]), ClearZero);
                        }
                        else
                        {
                            //无关联任务,只报告完成自己
                            DeviceIdx = deviceIdx;
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            //20101219运行状态的长输送机链需要给最后一个报告完成的清零
                            if ((devKind == 2) && (Convert.ToInt32(dv[0]["F_NumParam4"]) > 0) && (dv[0]["F_DeviceCommandIndex"].ToString() == "6") && (Convert.ToInt32(dv[0]["F_Status"]) > 0))
                            {
                                DeviceIdx = Convert.ToInt32(dv[0]["F_NumParam4"]);
                            }
                            cgs.ActionComplete(DeviceIdx, mindex, ClearZero);
                        }
                    }

                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                dv1.Dispose();
                dv2.Dispose();
                dv3.Dispose();
            }
        }
        int GetRouteIDsub(int device)
        {
            DataView dv = new DataView();
            Model.MDevice devinfokk;
            string temsql = string.Empty;
            try
            {
                //if (device == 11001 || device == 11002 || device == 11003)
                //{
                //    device = 1100;
                //}
                //string stemkk = "SELECT F_RouteIDSub, F_DeviceIndex, F_RouteID FROM T_Base_Route_Device where F_DeviceIndex like '" + device + "%'";

                devinfokk = Model.CGetInfo.GetDeviceInfo(device);

                if (devinfokk.IsVirtualDevice == 1)
                {
                    temsql = "SELECT F_RouteIDSub, F_DeviceIndex, F_RouteID FROM T_Base_Route_Device where F_DeviceIndex like '" + 1100 + "%'";
                }
                else
                {
                    temsql = "SELECT F_RouteIDSub, F_DeviceIndex, F_RouteID FROM T_Base_Route_Device where F_DeviceIndex=" + device + "";
                }
                dv = dbo.ExceSQL(temsql).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_RouteIDSub"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                devinfokk = null;
            }
        }

        int GetRouteIDsubHand(int device)
        {
            DataView dv = new DataView();
            try
            {
                #region 注释  by lyj 20171120
                //DataView dv = dbo.ExceSQL("SELECT F_RouteIDSub, F_DeviceIndex, F_RouteID FROM T_Base_Route_Device where F_DeviceIndex="+device+"").Tables[0].DefaultView;
                #endregion
                if (device == 11001 || device == 11002 || device == 11003)
                {
                    device = 1100;
                }
                string stemkk = "SELECT F_RouteIDSub, F_DeviceIndex, F_RouteID FROM T_Base_Route_Device where F_DeviceIndex like '" + device + "%'";
                dv = dbo.ExceSQL(stemkk).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return Convert.ToInt32(dv[0]["F_RouteIDSub"]);
                }
                else
                {
                    return -1;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }
        int GetManageHandIdx()
        {
            DataSet ds = new DataSet(); DataSet dss = new DataSet();
            try
            {
                int hidx = 0;
                ds = dbo.ExceSQL("SELECT F_ManageTaskKindIndex, max(FID) as mFID FROM T_Manage_Task Where F_ManageTaskKindIndex=4 group by F_ManageTaskKindIndex");
                if (ds.Tables[0].DefaultView.Count > 0)
                {
                    hidx = Convert.ToInt32(ds.Tables[0].DefaultView[0]["mFID"]) + 1;

                }
                else
                {
                    dss = dbo.ExceSQL("SELECT F_ManageTaskIndex FROM T_Base_Manage_Task_Index_Hand_Task");
                    if (dss.Tables[0].DefaultView.Count > 0)
                    {
                        if ((Convert.ToInt32(dss.Tables[0].DefaultView[0]["F_ManageTaskIndex"]) + 1) >= 29998)
                        {
                            hidx = 20001;
                        }
                        else
                        {
                            hidx = (Convert.ToInt32(dss.Tables[0].DefaultView[0]["F_ManageTaskIndex"]) + 1);
                        }
                    }
                    else
                    {
                        hidx = 20001;
                    }
                }
                RecordMaxHandTaskFID(hidx);
                return hidx;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                ds.Dispose();
                dss.Dispose();
            }
        }
        void RecordMaxHandTaskFID(int fid)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL("select F_ManageTaskIndex from T_Base_Manage_Task_Index_Hand_Task").Tables[0].DefaultView;

                if (dv.Count > 0)
                {
                    if (fid == 29998)
                    {
                        dbo.ExceSQL("UPDATE T_Base_Manage_Task_Index_Hand_Task SET F_ManageTaskIndex =20001");
                        return;
                    }
                    if (fid > Convert.ToInt32(dv[0]["F_ManageTaskIndex"]))
                    {
                        dbo.ExceSQL("UPDATE T_Base_Manage_Task_Index_Hand_Task SET F_ManageTaskIndex =" + fid);
                        return;
                    }
                }
                else
                {
                    dbo.ExceSQL("INSERT INTO T_Base_Manage_Task_Index_Hand_Task (F_ManageTaskIndex)VALUES (" + fid + ")");
                    return;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }

        void ResetSendorder(int askdev, int taskindex, int routeid, int arrowdev)
        {
            StringBuilder sql = new StringBuilder();
            long fid = ccf.GetManageTaskIndexfromMonitor(taskindex);
            int mankind = ccf.GetManageTaskKindIndexFromMonitor(taskindex);

            if (DeviceInRouteSub(askdev, routeid) == true)
            {
                if (arrowdev == askdev)
                {
                    AssociateComplete(askdev, taskindex);
                }
                else
                {

                    RestoreDevice(taskindex);

                }
            }
            else
            {
                sql.Remove(0, sql.Length);
                sql.Append("UPDATE T_Manage_Task SET FCurrentLocation=").Append(askdev).Append(" where FID=").Append(fid).Append(" and F_ManageTaskKindIndex=").Append(mankind);
                dbo.ExceSQL(sql.ToString());
                //判断是否需要向管理申请改道:如果本主路径的所有子路经都不可用就需要向管理申请改道,否则:调度选择一个可用的子路经,自行改道
                //20091005
                if (GetUseableRouteIDSub(fid, mankind, askdev) == false)
                {
                    if (CStaticClass.DeviceErrorAutoModifyRoutePath == "1")
                    {//20091107
                        GetUsableDestination(fid, mankind);
                    }
                }
            }

        }
        void BarCode(int deviceindex, byte[] barbyte)
        {

            StringBuilder[] wv = { new StringBuilder("2") };
            StringBuilder[] witemnames = { new StringBuilder("") };
            StringBuilder sql = new StringBuilder();
            DataView dv = new DataView(); DataView dvbc = new DataView();

            char[] dd = new char[1] { '.' };//20101124
            string[] DS;//20101124
            string _listenPLCAskError = "";
            int i = 0;
            try
            {
                sql.Append("SELECT T_Base_PLC_Ask.F_DeviceIndex,T_Base_PLC_Ask.F_BindingDevice, F_Askkind,F_TaskIndex,F_BarCode,F_Remark").Append(
                   " FROM T_Base_PLC_Ask").Append(" where  T_Base_PLC_Ask.F_DeviceIndex =").Append(deviceindex);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count <= 0) return;
                devinfo = Model.CGetInfo.GetDeviceInfo(deviceindex);
                witemnames[0].Remove(0, witemnames[0].Length);
                witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                wv[0].Remove(0, wv[0].Length);
                wv[0].Append("0");
                #region 判断读条码的条件是否成立

                int[] state;
                state = CStaticClass.GetDeviceState(Convert.ToInt32(dv[i]["F_BindingDevice"]));
                if (state == null)
                {
                    return;
                }
                if ((state[1] >= 30) || (state[1] == 1))
                {
                    //20091128
                    state = null;
                    return;

                }

                //20101118
                DS = ccf.GetBindingDeviceIndexOut(Convert.ToInt32(dv[i]["F_BindingDevice"])).Split(dd);
                int devicebyte = 0; int devbit = 0;
                if (DS.GetLength(0) > 1)
                {
                    int.TryParse(DS[0], out devicebyte);
                    int.TryParse(DS[1], out devbit);
                    if (CStaticClass.GetDevicePhotoelectric(devicebyte, devbit) != 1)
                    {
                        //20091128
                        state = null;
                        return;
                    }
                }
                else
                {//20110510
                    _listenPLCAskError = "条码扫描器申请入库任务:" + dv[i]["F_BindingDevice"].ToString() + ",出口开关没填写记录!";
                    return;
                }
                #endregion

                //扫到的条码(全部非零)与记录的条形码不相等就认为是新条码
                StringBuilder barcodesb = new StringBuilder();
                for (int ik = 1; ik < barbyte.GetLength(0); ik++)
                {
                    barcodesb.Append(Convert.ToChar(barbyte[ik]));
                }
                string barcode = barcodesb.ToString();
                int dcode = Convert.ToInt32(dv[i]["F_BindingDevice"]);
                if (barcode == null)
                {
                    return;
                }
                if ((barcode == "\0\0\0\0\0\0\0\0\0\0") || (barcode == "?/////////") || (barcode == "111111"))
                {
                    #region 没扫到码送出到指定位置//20101208
                    StringBuilder aheadDetect = new StringBuilder();

                    _listenPLCAskError = dcode.ToString() + ",没扫到条码!" + "时间," + DateTime.Now.ToLongTimeString();
                    RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("notifyIcon1", "警告:" + _listenPLCAskError);

                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "条码申请任务", dcode.ToString(), "没扫到条码!");
                    wv[0].Remove(0, wv[0].Length);
                    wv[0].Append("2");
                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);

                    return;

                    #endregion
                }


                //20101124一楼16001扫描器的处理:扫码时,把条码记录字段F_BarCode;
                //如果有本地管理任务,起点位置是此条码绑定设备,置本地管理任务【FSTATUS=0】;否则就是比对。
                //如果没有本地管理任务,就是申请任务。
                //获取任务时,如果入库任务的起点位置是条码绑定设备:如果起点位置,字段F_BarCode记录的条码与任务匹配,置本地管理任务【FSTATUS=0】,否则置【FSTATUS=-1】;
                //如果入库任务的起点位置不是条码绑定设备,置本地管理任务【FSTATUS=0】。

                //20110331

                if (dbo.GetSingle(string.Format("SELECT F_DeviceIndex FROM T_Base_PLC_Ask WHERE (F_DeviceIndex = {0}) AND (F_BarCode = '{1}')", deviceindex, barcode)) != null)//20101124
                {
                    wv[0].Remove(0, wv[0].Length);
                    wv[0].Append("2");
                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                    return;
                }
                #region 条码有对应调度任务存在,重新入库扫描或者条码比对

                if (dbo.GetSingle(string.Format("select fid from T_Manage_Task  where FPALLETBARCODE like '%{0}%'", barcode)) != null)
                {//条码有对应调度任务存在,重新入库扫描或者条码比对
                    int uc = dbo.ExecuteSql(string.Format("update T_Manage_Task set FSTATUS=0 where FCONTROLTASKTYPE=1 and  FSTARTDEVICE={0} and FPALLETBARCODE like '%{1}%'", dcode, barcode));
                    if (uc > 0)
                    {//20101208上次没扫到码的重新执行入库扫描
                        dbo.ExecuteSql(string.Format("update T_Monitor_Task set F_Status=0 where  F_DeviceIndex={0} and F_TxtParam like '%{1}%'", dcode, barcode));
                        wv[0].Remove(0, wv[0].Length);
                        wv[0].Append("2");
                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "条码申请任务", dcode.ToString(), barcode + ":上次PLC搬运错误,重新执行入库条码扫描!");
                        return;
                    }
                    else
                    {//条码比对
                        object ob = dbo.GetSingle(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceIndex = {0}) AND (F_Status = 1) AND (F_TxtParam = '{1}')", deviceindex, barcode));
                        if (ob != null)
                        {//比对正确
                            cgs.ActionComplete(deviceindex, Convert.ToInt32(ob), 0);
                            wv[0].Remove(0, wv[0].Length);
                            wv[0].Append("2");
                            sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                            return;
                        }
                        else
                        {//条码被错误的报告了数据区

                        }


                    }
                }
                #endregion

                #region 条码没有对应的调度任务,申请任务或者比对错误

                else
                {//条码没有对应的调度任务,申请任务或者比对错误
                    #region 条码比对错误
                    object ob = dbo.GetSingle(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_DeviceIndex = {0}) AND (F_Status = 1) AND (F_TxtParam = '{1}')", deviceindex, barcode));
                    if (ob == null)
                    {//比对错误需要改道处理,以后路径里不应该存在其它条码比对了
                        //生成当前条码绑定设备barBindDevice到异常人工处理站台AbendDevice的调度任务,保留原来的调度任务的主键
                        dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex, F_ManageTASKKINDINDEX, F_ManageTaskIndex FROM T_Monitor_Task WHERE (F_DeviceIndex = {0}) AND (F_Status = 1) )", deviceindex)).Tables[0].DefaultView;
                        if (dv.Count > 0)
                        {
                            //1删除现有设备指令索引和调度任务
                            dbo.ExecuteSql(string.Format("delete from T_Monitor_Task where F_ManageTASKKINDINDEX={0} and F_ManageTaskIndex={1}", Convert.ToInt32(dv[0]["F_ManageTASKKINDINDEX"]), Convert.ToInt32(dv[0]["F_ManageTaskIndex"])));
                            dbo.ExecuteSql(string.Format("delete from T_Manage_Task where F_ManageTaskKindIndex={0} and FID={1}", Convert.ToInt32(dv[0]["F_ManageTASKKINDINDEX"]), Convert.ToInt32(dv[0]["F_ManageTaskIndex"])));
                            //2使用调度任务的主键生成新任务、重新拆分
                            Model.AutoTask at = new Model.AutoTask(3, barcode, dcode.ToString(), "-", dv[i]["F_Remark"].ToString(), "-", false, false, 0);
                            BuildAutoTask(at, out _listenPLCAskError);
                            return;
                        }
                        else
                        {//逻辑混乱了

                        }
                    }
                    #endregion

                    #region 扫码申请任务
                    #region 向管理申请入库任务
                    dvbc = dboMan.ExceSQL(string.Format("SELECT DEVICE_CODE,STOCK_BARCODE FROM IO_CONTROL_APPLY WHERE APPLY_TASK_STATUS=0 and DEVICE_CODE='{0}' and (STOCK_BARCODE = '{1}')", dcode, barcode)).Tables[0].DefaultView;
                    if (dvbc.Count > 0)
                    {//20091128
                        wv[0].Remove(0, wv[0].Length);
                        wv[0].Append("2");
                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                        _listenPLCAskError = "输送机:" + dcode.ToString() + "的扫描器向管理申请入库任务时:调度任务有相同的托盘号:" + barcode + "尚未处理!";
                        return;
                    }
                    //向管理申请入库任务

                    //20101124
                    StringBuilder dtime = new StringBuilder(DateTime.Now.ToString("u"));
                    dtime.Remove(dtime.Length - 1, 1);
                    int apptype = 1;
                    ob = new object[7] { apptype, dcode, barcode, 0, dtime, "", ccf.GetWarehouseIndex() };
                    try
                    {
                     //  dboMan.ExecuteSql(string.Format("INSERT INTO IO_CONTROL_APPLY( CONTROL_APPLY_TYPE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK,WAREHOUSE_CODE)VALUES ({0},'{1}','{2}',{3},'{4}','{5}','{6}')", ob));

                    }
                    //20101124
                    catch (Exception ex)
                    {
                        _listenPLCAskError = "向管理申请入库任务:" + ex.Message;
                    }
                    #endregion
                    //20110331
                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "条码申请任务", dcode.ToString(), barcode);
                    #endregion

                    dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_BarCode = '{0}' WHERE (F_DeviceIndex = {1})", barcode, deviceindex));
                    wv[0].Remove(0, wv[0].Length);
                    wv[0].Append("2");
                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                }

                #endregion

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                dvbc.Dispose();
            }



        }

        int GetMonitorRunTaskIndexFromBarCode(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 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();
            }
        }
        void RestoreDevice(int mindex)
        {
            StringBuilder sql = new StringBuilder();
            DataView dv = new DataView(); DataView dv1 = new DataView(); DataView dv2 = new DataView(); DataView dv3 = new DataView();
            try
            {

                int DeviceIdx, devKind;
                sql.Remove(0, sql.Length);
                sql.Append("select F_MonitorIndex,F_DeviceIndex from T_Monitor_Task where F_MonitorIndex=").Append(mindex);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    //检查关联命令一起复位
                    //如果mindex是主动任务(f_associatemonitor有数据),先复位被动的任务;如果mindex是被动任务,先复位自己,再复位主动任务;
                    sql.Remove(0, sql.Length);
                    sql.Append("select F_DeviceIndex,F_Associate from T_Monitor_Task where F_Associate IS NOT NULL and F_MonitorIndex=").Append(mindex);
                    dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv1.Count > 0)
                    {
                        sql.Remove(0, sql.Length);
                        sql.Append("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_MonitorIndex=").Append(Convert.ToInt32(dv1[0]["F_Associate"]));
                        dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                        if (dv2.Count > 0)//有关联命令,先复位关联命令
                        {

                            DeviceIdx = Convert.ToInt32(dv2[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            if ((devKind == 2) || (devKind == 4))
                            {//输送机清零
                                sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                                sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0);
                            }
                            if ((devKind == 1)) //堆垛机、RGV
                            {

                                sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                                sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0);
                            }
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=").Append(Convert.ToInt32(dv2[0]["F_DeviceIndex"]));
                            dbo.ExceSQL(sql.ToString());
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=").Append(Convert.ToInt32(dv2[0]["F_MonitorIndex"]));
                            dbo.ExceSQL(sql.ToString());
                        }
                        //20091128

                        //再复位自己
                        DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                        devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                        if ((devKind == 2) || (devKind == 4))
                        {//输送机、RGV清零
                            sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                            sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0);
                        }
                        if ((devKind == 1)) //堆垛机
                        {

                            sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                            sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0);
                        }
                        sql.Remove(0, sql.Length);
                        sql.Append("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=").Append(Convert.ToInt32(dv[0]["F_DeviceIndex"]));
                        dbo.ExceSQL(sql.ToString());
                        sql.Remove(0, sql.Length);
                        sql.Append("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=").Append(Convert.ToInt32(dv[0]["F_MonitorIndex"]));
                        dbo.ExceSQL(sql.ToString());

                    }
                    else
                    {
                        //自己是否被关联,先复位自己,再复位主任务
                        sql.Remove(0, sql.Length);
                        sql.Append("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_Associate ='").Append(mindex).Append("'");
                        dv3 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                        if (dv3.Count > 0)
                        {   //先复位自己
                            DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            if ((devKind == 2) || (devKind == 4))
                            {//输送机、RGV清零
                                sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                                sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0);
                            }
                            if ((devKind == 1)) //堆垛机
                            {

                                sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                                sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0);
                            }
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=").Append(Convert.ToInt32(dv[0]["F_DeviceIndex"]));
                            dbo.ExceSQL(sql.ToString());
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=").Append(mindex);
                            dbo.ExceSQL(sql.ToString());
                            //再复位主任务
                            DeviceIdx = Convert.ToInt32(dv3[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            if ((devKind == 2) || (devKind == 4))
                            {//输送机、RGV清零
                                sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                                sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0);
                            }
                            if ((devKind == 1)) //堆垛机
                            {

                                sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                                sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0);
                            }
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=").Append(Convert.ToInt32(dv3[0]["F_DeviceIndex"]));
                            dbo.ExceSQL(sql.ToString());
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=").Append(Convert.ToInt32(dv3[0]["F_MonitorIndex"]));
                            dbo.ExceSQL(sql.ToString());
                        }
                        else
                        {
                            //无关联任务,只复位自己
                            DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            if ((devKind == 2) || (devKind == 4))
                            {//输送机、RGV清零
                                sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                                sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0);
                            }
                            if ((devKind == 1)) //堆垛机
                            {

                                sdo = CommModeCreate.CreateSendDeviceOrder(DeviceIdx);
                                sdo.SendDeviceOrder(2, 0, 0, DeviceIdx, 0, 0, 0, 0, 0, 0);
                            }
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=").Append(Convert.ToInt32(dv[0]["F_DeviceIndex"]));
                            dbo.ExceSQL(sql.ToString());
                            sql.Remove(0, sql.Length);
                            sql.Append("update T_Monitor_Task set F_Status=0 where F_MonitorIndex=").Append(mindex);
                            dbo.ExceSQL(sql.ToString());
                        }

                    }

                }

                CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                OnDataChange("SControlMonitor", cea);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                dv1.Dispose();
                dv2.Dispose();
                dv3.Dispose();

            }
        }
        void AssociateComplete(int deviceIdx, int mindex)
        {
            DataView dv = new DataView(); DataView dv1 = new DataView(); DataView dv2 = new DataView(); DataView dv3 = new DataView();
            int DeviceIdx = deviceIdx;
            StringBuilder sql = new StringBuilder();
            int devKind;
            try
            {
            AA:
                sql.Remove(0, sql.Length);
                sql.Append("select F_MonitorIndex,F_DeviceIndex from T_Monitor_Task where F_MonitorIndex=").Append(mindex);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    Model.MDevice devm = Model.CGetInfo.GetDeviceInfo(deviceIdx);
                    int[] dblmonitor = null;
                    if (devm.IfCorrelDoubleFork == "1")
                    {
                        dblmonitor = Model.CGeneralFunction.MutiForkIfSync(mindex, deviceIdx, devm.DeviceKind);
                    }
                    //检查关联命令一起复位
                    //如果mindex是主动任务(f_associatemonitor有数据),先复位被动的任务;如果mindex是被动任务,先复位自己,再复位主动任务;
                    sql.Remove(0, sql.Length);
                    sql.Append("select F_DeviceIndex,F_Associate from T_Monitor_Task where F_Associate IS NOT NULL and F_MonitorIndex=").Append(mindex);
                    dv1 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dv1.Count > 0)
                    {
                        sql.Remove(0, sql.Length);
                        sql.Append("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_MonitorIndex=").Append(Convert.ToInt32(dv1[0]["F_Associate"]));
                        dv2 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                        if (dv2.Count > 0)//有关联命令,先复位关联命令
                        {

                            DeviceIdx = Convert.ToInt32(dv2[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            cgs.ActionComplete(DeviceIdx, Convert.ToInt32(dv2[0]["F_MonitorIndex"]), 1);
                        }

                        //再复位自己
                        DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                        devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                        cgs.ActionComplete(DeviceIdx, mindex, 1);
                    }
                    else
                    {
                        //自己是否被关联,先复位自己,再复位主任务
                        sql.Remove(0, sql.Length);
                        sql.Append("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_Associate ='").Append(mindex).Append("'");
                        dv3 = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                        if (dv3.Count > 0)
                        {   //先复位自己
                            DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            cgs.ActionComplete(DeviceIdx, mindex, 1);
                            //再复位主任务
                            DeviceIdx = Convert.ToInt32(dv3[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            cgs.ActionComplete(DeviceIdx, Convert.ToInt32(dv3[0]["F_MonitorIndex"]), 1);
                        }
                        else
                        {
                            //无关联任务,只复位自己
                            DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                            devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                            cgs.ActionComplete(DeviceIdx, mindex, 1);
                        }

                    }


                    if (devm != null)
                    {
                        if (devm.IfCorrelDoubleFork == "1")
                        {
                            if (dblmonitor != null)
                            {
                                foreach (int dm in dblmonitor)
                                {

                                    mindex = Convert.ToInt32(dblmonitor[dm]);
                                    goto AA;

                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
                dv1.Dispose();
                dv2.Dispose();
                dv3.Dispose();
            }

        }
        /// <summary>
        /// 获取可用的目标位置:入库的巷道或者出库站台
        /// </summary>
        /// <param name="manageTaskIdx">调度任务索引</param>
        /// <param name="manageKindIdx">调度任务类别</param>
        /// <returns></returns>
        bool GetUsableDestination(long manageTaskIdx, int manageKindIdx)
        {
            //20091128
            //DataView DV;
            DataView dv = new DataView();
            DataRowView dr = null;

            string adviceDev = "";
            char[] cc = new char[1] { ';' };
            string[] sp;
            DataView dvIO = new DataView(); DataView dvu = new DataView();
            StringBuilder sql = new StringBuilder();

            try
            {
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Manage_Task WHERE (FID = ").Append(manageTaskIdx).Append(") AND (F_ManageTaskKindIndex = ").Append(manageKindIdx).Append(")");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count <= 0)
                {
                    return false;
                }
                dr = dv[0];
                //只修申请改调度任务的路径,不修改调度自动任务路径
                if (dr["F_ManageTaskKindIndex"].ToString() != "1") return false;
                //20091128
                sql.Remove(0, sql.Length);
                sql.Append("select CONTROL_ID, CONTROL_STATUS from IO_Control where (CONTROL_ID = ").Append(Convert.ToInt32(dr["FID"])).Append(") AND ((CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKALTERROUTEAPPLY).Append(") or (CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKCANCEL).Append(") or(CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKALTERROUTEREPLY).Append("))");
                dvIO = dboMan.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dvIO.Count <= 0)
                {

                    #region 根据T_Base_Device表的F_UsableEndDevice查找可用终点设备
                    sql.Remove(0, sql.Length);
                    sql.Append("select F_UsableEndDevice from T_Base_Device where F_UsableEndDevice is not null and F_DeviceIndex=").Append(dr["FCurrentLocation"]);
                    dvu = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (dvu.Count > 0)
                    {
                        sp = dvu[0]["F_UsableEndDevice"].ToString().Split(cc);
                        for (int i = sp.GetLowerBound(0); i <= sp.GetUpperBound(0); i++)
                        {
                            if (CDisassembleTask.MinRouteID(Convert.ToInt32(dr["FSTARTDEVICE"]), Convert.ToInt32(sp[i]), dr["FUseAwayFork"]) != -1)
                            {
                                adviceDev = sp[i];
                                break;
                            }
                        }
                    }
                    //20091128
                    //dvu = null;
                    if (adviceDev == "")
                    {
                        return false;
                    }
                    #endregion


                    string dtime = DateTime.Now.ToString("u");
                    dtime = dtime.Substring(0, dtime.Length - 1);

                    dboMan.TransBegin();
                    try
                    {
                        #region 入库任务运到出库站台需要上报IO_CONTROL表FSTATUS=960
                        //3241;3249;3256;3257;3258
                        string[] outstation = new string[5] { "3241", "3249", "3256", "3257", "3258" };
                        if (ccf.GetFCONTROLTASKTYPEFromManageTask(manageKindIdx, manageTaskIdx) == 1)//入库任务
                        {
                            if (Array.IndexOf(outstation, dr["FCurrentLocation"].ToString()) >= 0)
                            {
                                sql.Remove(0, sql.Length);
                                sql.Append("update IO_Control set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKCANCEL).Append(",ERROR_TEXT='入库任务被误搬运到出库站台!' where CONTROL_ID=").Append(manageTaskIdx);
                                dboMan.ExceSQL(sql.ToString());

                            }
                        }
                        //20091128
                        outstation = null;
                        #endregion

                        //20090918
                        sql.Remove(0, sql.Length);
                        sql.Append(" update IO_CONTROL set CONTROL_STATUS=").Append(Model.CGeneralFunction.TASKALTERROUTEAPPLY).Append(" where CONTROL_ID=").Append(dr["FID"]).Append(" and CONTROL_STATUS<>").Append(Model.CGeneralFunction.TASKCANCEL);
                        dboMan.ExceSQL(sql.ToString());
                        //向管理申请修改任务//20101108
                        int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);
                        sql.Remove(0, sql.Length);
                        sql.Append("INSERT INTO IO_CONTROL_APPLY ( CONTROL_APPLY_ID,CONTROL_ID, WAREHOUSE_CODE, STOCK_BARCODE, DEVICE_CODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK)").Append(
                        "VALUES (").Append(appid).Append(",").Append(dr["FID"]).Append(",'").Append(dr["FENDWAREHOUSE"]).Append("','").Append(dr["FPALLETBARCODE"]).Append("','").Append(adviceDev).Append("',0,'").Append(dtime).Append("',null)");
                        dboMan.ExceSQL(sql.ToString());
                        dboMan.TransCommit();
                        //把ManageTaskIdx,ManageKindIdx 的调度任务全部申请改道
                        sql.Remove(0, sql.Length);
                        sql.Append("UPDATE T_Monitor_Task SET  F_Status = 3 WHERE (F_ManageTaskIndex = ").Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX =").Append(manageKindIdx).Append(")");
                        dbo.ExceSQL(sql.ToString());
                        //20090910
                        CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                        OnDataChange("SControlMonitor", cea);
                        return true;
                    }
                    catch (Exception ex)
                    {
                        RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", string.Format("{0},GetUsableDesination向管理申请改道时错误:{1}", this.ToString(), ex.StackTrace + ex.Message));
                        OnRefreshMonitor(rme);
                        dboMan.TransRollback();
                        return false;
                    }
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", string.Format("{0},GetUsableDesination获取可用的目标位置时错误:{1}", this.ToString(), ex.StackTrace + ex.Message));
                OnRefreshMonitor(rme);
                return false;
            }
            finally
            {
                dvu.Dispose();
                dv.Dispose();
                dr = null;
                cc = null;
                sp = null;
                dvIO.Dispose();
            }
        }
        /// <summary>
        /// 20091005判断是否可以获得可用的路径子路经
        /// </summary>
        /// <param name="manageTaskIdx">调度任务索引</param>
        /// <param name="manageKindIdx">任务类型索引</param>
        /// <param name="curLocation">当前设备索引</param>
        /// <returns></returns>
        bool GetUseableRouteIDSub(long manageTaskIdx, int manageKindIdx, int curLocation)
        {
            DataView dvmi = new DataView();
            DataView DMAN = new DataView();
            DataView dvnew = new DataView();
            DataView dvc = new DataView();
            StringBuilder sql = new StringBuilder();
            try
            {
                #region 调度任务存在
                //20091128
                sql.Remove(0, sql.Length);
                sql.Append("SELECT * FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX =1) order by F_MonitorIndex asc");
                dvmi = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dvmi.Count > 0)
                {//已经开始执行的需要更改调度任务
                    //判断申请修改路径的第一个调度任务:
                    int monitorIndex = (int)dvmi[0]["F_MonitorIndex"];
                    int associateMonitor = -1;
                    if (dvmi[0]["F_Associate"] != DBNull.Value)
                    {
                        associateMonitor = Convert.ToInt32(dvmi[0]["F_Associate"]);
                    }
                    int devindex = Convert.ToInt32(dvmi[0]["F_DeviceIndex"]);
                    int devKind = ccf.GetDeviceKindIdx(Convert.ToInt32(dvmi[0]["F_DeviceIndex"]));
                    int devCommand = Convert.ToInt32(dvmi[0]["F_DeviceCommandIndex"]);
                    int routeID = Convert.ToInt32(dvmi[0]["F_RouteID"]);
                    int NumParam1 = Convert.ToInt32(dvmi[0]["F_NumParam1"]);
                    int NumParam4 = Convert.ToInt32(dvmi[0]["F_NumParam4"]);
                    string AheadDetect = dvmi[0]["F_AheadDetect"].ToString();

                    //20091128
                    sql.Remove(0, sql.Length);
                    sql.Append("select * from T_Manage_Task WHERE (FID = ").Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX =1)");
                    DMAN = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                    if (DMAN.Count > 0)
                    {
                        int routeidNew = CDisassembleTask.MinRouteID(Convert.ToInt32(DMAN[0]["FSTARTDEVICE"]), Convert.ToInt32(DMAN[0]["FENDDEVICE"]), curLocation);

                        if (routeidNew == -1)
                        {
                            //20091005
                            return false;
                        }
                        //20091005
                        //删除原来的申请修改路径任务,拆分新的任务并且只保留现有设备开始的任务
                        sql.Remove(0, sql.Length);
                        sql.Append("DELETE FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX =1)");
                        dbo.ExceSQL(sql.ToString());
                        //20090910
                        if (CDisassembleTask.CreateMonitor(1, manageTaskIdx, routeidNew, DMAN[0], 3) <= 0)
                        {
                            //重新生成申请修改路径的申请任务
                            sql.Remove(0, sql.Length);
                            sql.Append("INSERT INTO T_Monitor_Task ").Append(
                                        "(F_ManageTaskIndex, F_ManageTASKKINDINDEX, F_MonitorIndex,F_MonitorTaskLevel,").Append(
                                        " F_DeviceIndex, F_DeviceCommandIndex, F_RouteID, F_Status,F_NumParam1, F_NumParam4,").Append(
                                        " F_AheadDetect,F_TxtParam)").Append(
                                    "VALUES (").Append(manageTaskIdx).Append(",1,").Append(monitorIndex).Append(",1,").Append(devindex).Append(",").Append(devCommand).Append(",").Append(routeID).Append(",3,").Append(NumParam1).Append(",").Append(NumParam4
                                        ).Append(",'").Append(AheadDetect).Append("','").Append(DMAN[0]["FPALLETBARCODE"]).Append("')");
                            dbo.ExceSQL(sql.ToString());
                            return false;
                        }

                        if (devKind == 4)
                        {
                            if (devCommand == 7)
                            {
                                int RGVsn = ccf.GetSerialNumberFromRouteDevice(routeID, devindex);
                                int Consn = ccf.GetSerialNumberFromRouteDevice(routeID, NumParam1);

                                #region RGV运动到接货点
                                if (RGVsn > Consn)
                                {
                                    //删除RGV运动到接货点之前的任务
                                    //20091128
                                    sql.Remove(0, sql.Length);
                                    sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                        manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                        devindex).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                        ")  AND (F_NumParam1 = ").Append(NumParam1).Append(")");
                                    dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                    if (dvnew.Count > 0)
                                    {
                                        sql.Remove(0, sql.Length);
                                        sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                        manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                        dbo.ExceSQL(sql.ToString());
                                        sql.Remove(0, sql.Length);
                                        sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                        dbo.ExceSQL(sql.ToString());
                                    }

                                }
                                #endregion

                                #region RGV运动到送货点
                                if (RGVsn < Consn)
                                {
                                    //删除RGV运动到送货点之前的任务
                                    //DataView dvnew = dbo.ExceSQL("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = " +
                                    //    manageTaskIdx + ") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = " +
                                    //    devindex + ") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = " + routeidNew +
                                    //    ") AND (F_Status = 3)  AND (F_NumParam1 <> " + NumParam1 + ")").Tables[0].DefaultView;
                                    int RGVsn1 = ccf.GetSerialNumberFromRouteDevice(routeidNew, devindex);
                                    //找到接货输送机设备索引
                                    List<int> nextcon = CDisassembleTask.GetNextDevice(routeidNew, RGVsn1);
                                    int condev = nextcon[0];
                                    //删除RGV运动到送货点之前的任务
                                    //20091128
                                    sql.Remove(0, sql.Length);
                                    sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                        manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                        devindex).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                        ")  AND (F_NumParam1 = ").Append(condev).Append(")");
                                    dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                    if (dvnew.Count > 0)
                                    {
                                        sql.Remove(0, sql.Length);
                                        sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                        manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                        dbo.ExceSQL(sql.ToString());
                                        sql.Remove(0, sql.Length);
                                        sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                        dbo.ExceSQL(sql.ToString());
                                    }
                                }
                                #endregion
                            }

                            #region RGV送货

                            if ((devCommand == 3) || (devCommand == 5))
                            {
                                int RGVsn = ccf.GetSerialNumberFromRouteDevice(routeidNew, devindex);
                                //找到接货输送机设备索引
                                List<int> nextcon = CDisassembleTask.GetNextDevice(routeidNew, RGVsn);
                                int condev = nextcon[0];
                                //删除RGV运动到送货点之前的任务
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    devindex).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")  AND (F_NumParam1 = ").Append(condev).Append(")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                    dbo.ExceSQL(sql.ToString());
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                }

                            }
                            #endregion

                            #region RGV接货
                            if ((devCommand == 2) || (devCommand == 4))
                            {
                                int RGVsn = ccf.GetSerialNumberFromRouteDevice(routeidNew, devindex);
                                //找到送货输送机设备索引
                                List<int> priorcon = CDisassembleTask.GetPriorDevice(routeidNew, RGVsn);
                                int condev = priorcon[0];
                                //删除RGV运动到接货点之前的任务
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    devindex).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")  AND (F_NumParam1 = ").Append(condev).Append(")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");

                                    dbo.ExceSQL(sql.ToString());
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                }

                            }
                            #endregion
                        }
                        if (devKind == 2)
                        {
                            #region 输送机送货
                            if (devCommand == 3)
                            {
                                int consn = ccf.GetSerialNumberFromRouteDevice(routeidNew, devindex);
                                //找到接货RGV设备索引
                                List<int> nextrgv = CDisassembleTask.GetNextDevice(routeidNew, consn);
                                int rgvdev = nextrgv[0];

                                //删除RGV运动到接货点之前的任务
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    rgvdev).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")  AND (F_NumParam1 = ").Append(devindex).Append(")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                }

                            }
                            #endregion

                            #region 输送机的接货

                            if (devCommand == 4)
                            {
                                int consn = ccf.GetSerialNumberFromRouteDevice(routeID, devindex);
                                //找到送货RGV设备索引
                                List<int> priorrgv = CDisassembleTask.GetPriorDevice(routeID, consn);
                                int rgvdev = priorrgv[0];
                                int rgvsn = ccf.GetSerialNumberFromRouteDevice(routeidNew, rgvdev);
                                List<int> nextdev = CDisassembleTask.GetNextDevice(routeidNew, rgvdev);
                                int condev = nextdev[0];
                                //删除RGV运动到送货点之前的任务
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    rgvdev).Append(") AND (F_DeviceCommandIndex = 7) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ") AND (F_NumParam1 = ").Append(condev).Append(")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());
                                }

                            }

                            #endregion


                            #region 输送机的送出
                            if (devCommand == 6)
                            {
                                //20091128
                                sql.Remove(0, sql.Length);
                                sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    devindex).Append(") AND (F_DeviceCommandIndex = 6) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")");
                                dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                if (dvnew.Count > 0)
                                {
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                    dbo.ExceSQL(sql.ToString());
                                    int CurrentLocation = 0;
                                    sql.Remove(0, sql.Length);
                                    sql.Append("SELECT FCurrentLocation FROM T_Manage_Task where FID=").Append(manageTaskIdx).Append(" and F_ManageTaskKindIndex=1");
                                    dvc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                    if (dvc.Count > 0)
                                    {
                                        CurrentLocation = Convert.ToInt32(dvc[0]["FCurrentLocation"]);
                                    }

                                    if (CurrentLocation == 0) return false;
                                    sql.Remove(0, sql.Length);
                                    sql.Append("update T_Monitor_Task set F_DeviceIndex=").Append(CurrentLocation).Append(" where F_MonitorIndex=").Append(dvnew[0]["F_MonitorIndex"]);
                                    dbo.ExceSQL(sql.ToString());
                                    //20090910已经搬运到CurrentLocation(F_NumParam4=CurrentLocation) 删除送出任务
                                    sql.Remove(0, sql.Length);
                                    sql.Append("delete from T_Monitor_Task where  F_DeviceIndex=").Append(CurrentLocation).Append(" and F_NumParam4=").Append(CurrentLocation);
                                    dbo.ExceSQL(sql.ToString());

                                    sql.Remove(0, sql.Length);
                                    sql.Append("update  T_Monitor_Task set F_Status =0 where  (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                    dbo.ExceSQL(sql.ToString());


                                }
                            }
                            #endregion

                        }
                        #region 堆垛机的送货重
                        if (devKind == 1)
                        {//堆垛机的送货重,只保留堆垛机的送货任务

                            //20091128
                            sql.Remove(0, sql.Length);
                            sql.Append("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) AND (F_DeviceIndex = ").Append(
                                    devindex).Append(") AND (F_DeviceCommandIndex = 5) AND (F_RouteID = ").Append(routeidNew).Append(
                                    ")");
                            dvnew = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                            if (dvnew.Count > 0)
                            {
                                sql.Remove(0, sql.Length);
                                sql.Append("delete from T_Monitor_Task where F_MonitorIndex<").Append(dvnew[0]["F_MonitorIndex"]).Append(" and (F_ManageTaskIndex = ").Append(
                                    manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1)");
                                dbo.ExceSQL(sql.ToString());
                                sql.Remove(0, sql.Length);
                                sql.Append("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=").Append(devindex);
                                dbo.ExceSQL(sql.ToString());
                                sql.Remove(0, sql.Length);
                                sql.Append("update  T_Monitor_Task set F_Status =0 where (F_ManageTaskIndex = ").Append(
                                manageTaskIdx).Append(") AND (F_ManageTASKKINDINDEX = 1) ");
                                dbo.ExceSQL(sql.ToString());
                            }

                        }
                        #endregion

                    }//20090910
                    CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                    OnDataChange("SControlMonitor", cea);
                    return true;
                }//20091005
                #endregion
                else
                {//调度任务不存在
                    return false;
                }

            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rme = new RefreshMonitorEventArgs("tsStatus", this.ToString() + "GetUseableRouteIDSub时错误:" + ex.StackTrace + ex.Message);
                OnRefreshMonitor(rme);
                return false;
            }
            finally
            {
                dvmi.Dispose();
                dvnew.Dispose();
                DMAN.Dispose();
                dvc.Dispose();
            }
        }

        /// <summary>
        /// 判断设备是否被包含在子路径中
        /// </summary>
        /// <param name="deviceIdx">设备索引</param>
        /// <param name="routeSub">子路经</param>
        /// <returns></returns>
        bool DeviceInRouteSub(int deviceIdx, int routeSub)
        {
            DataView dv = new DataView();
            try
            {
                StringBuilder sql = new StringBuilder();
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_RouteIDSub, F_DeviceIndex FROM T_Base_Route_Device Where F_RouteIDSub=").Append(routeSub).Append(" and F_DeviceIndex=").Append(deviceIdx);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }
        }

        void DeleteDeviceTask(int taskindex)
        {
            DataView dvm = new DataView();
            StringBuilder sql = new StringBuilder();
            try
            {

                long fid = ccf.GetManageTaskIndexfromMonitor(taskindex);
                int mti = ccf.GetManageTaskKindIndexFromMonitor(taskindex);
                if (ccf.GetFCONTROLTASKTYPEFromManageTask(mti, fid) == 2) return;
                sql.Remove(0, sql.Length);
                sql.Append("update T_Manage_Task set FExceptionNO=").Append(Model.CGeneralFunction.TASKDELETE).Append(" where (F_ManageTaskKindIndex = ").Append(mti).Append(") AND (FID = ").Append(fid).Append(")");
                dbo.ExceSQL(sql.ToString());
                sql.Remove(0, sql.Length);
                sql.Append("update T_Monitor_Task set F_STATUS=-1 where F_ManageTaskKindIndex=").Append(mti).Append(" and F_ManageTaskIndex=").Append(fid).Append(" and F_STATUS=0");
                dbo.ExceSQL(sql.ToString());
                //通知管理程序删除整个调度任务
                //20091128
                sql.Remove(0, sql.Length);
                sql.Append("SELECT F_ManageTaskKindIndex, F_ManageTaskIndex,F_DeviceIndex,F_MonitorIndex,F_Status ").Append(
                " FROM T_Monitor_Task Where  F_ManageTaskIndex=").Append(fid).Append(" and F_ManageTaskKindIndex= ").Append(
                mti);
                dvm = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                if (dvm.Count > 0)
                {
                    for (int ii = 0; ii < dvm.Count; ii++)
                    {
                        if (Convert.ToInt32(dvm[ii]["F_Status"]) >= 1)
                        {
                            cgs.ActionComplete(Convert.ToInt32(dvm[ii]["F_DeviceIndex"]), Convert.ToInt32(dvm[ii]["F_MonitorIndex"]), 1);
                        }
                        else
                        {
                            cgs.ActionComplete(Convert.ToInt32(dvm[ii]["F_DeviceIndex"]), Convert.ToInt32(dvm[ii]["F_MonitorIndex"]), Model.CGeneralFunction.TASKDELETE);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dvm.Dispose();
            }
        }
        #endregion

        #region 契约实现
        /// <summary>
        /// 根据安装条码扫描器的输送机设备索引查询【在PLC读到的条码】和【已经给管理上报的条码】20140218
        /// </summary>
        /// <param name="bindDeviceOfBarcode">安装条码扫描器的输送机</param>
        /// <param name="readedBarcode">在PLC读到的条码</param>
        /// <param name="reportedBarcode">已经给管理上报的条码</param>
        /// <returns></returns>
        public bool GetReadedAndReportedBarcode(int bindDeviceOfBarcode, out string readedBarcode, out string reportedBarcode, out string errorText)
        {
            DataView dv = new DataView();
            errorText = "";
            readedBarcode = "";
            reportedBarcode = "";
            StringBuilder rb = new StringBuilder("");
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT F_DeviceIndex,F_PalletBarcodeLength,F_PalletBarcodeReservedLength,F_BarCode,F_BarcodeLength,F_Askkind,F_BarcodeReservedLength,F_BarcodeForkAmount FROM T_Base_PLC_Ask WHERE (F_Askkind = 4 OR F_Askkind = 14 OR F_Askkind = 17) AND (F_BindingDevice = {0})", bindDeviceOfBarcode)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    _device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[0]["F_DeviceIndex"]));
                    if (_device.ReturnMessage != null)
                    {
                        int barcodeLenth = 0;
                        int beginchar = 1;
                        int goodsbarcodeLenth = 0;
                        int BoxQuality = 0;
                        if (dv[0]["F_Askkind"].ToString() == "17")//叠盘机
                        {//PLC打包上报箱垛条码组,F_BarCode只记录记录最上面一箱条码
                            barcodeLenth = Convert.ToInt32(dv[0]["F_PalletBarcodeLength"]);
                            //beginchar = 2;
                            beginchar = 1;//无法上报托盘条码,采集托盘数量信息
                            rb.Append(_device.ReturnMessage[1].ToString());

                        }
                        else if (dv[0]["F_Askkind"].ToString() == "15")
                        {//多叉堆垛机在顶升机,条码组申请入库F_BarCode记录所堆垛机最大叉的箱条码
                            barcodeLenth = Convert.ToInt32(dv[0]["F_BarcodeLength"]);
                            beginchar = 2 + Convert.ToInt32(dv[0]["F_BarcodeReservedLength"]) * (Convert.ToInt32(dv[0]["F_BarcodeForkAmount"]) - 1);
                        }
                        else if (dv[0]["F_Askkind"].ToString() == "4")
                        //F_Askkind = 4 
                        {//扫单箱或者码垛入库的托盘条码

                            barcodeLenth = Convert.ToInt32(dv[0]["F_PalletBarcodeLength"]);
                            goodsbarcodeLenth = Convert.ToInt32(dv[0]["F_BarcodeLength"]);
                            beginchar = 2;
                        }
                        else// F_Askkind = 14
                        {//码垛机器人上报托盘条码,物料数量,物料条码
                            barcodeLenth = Convert.ToInt32(dv[0]["F_PalletBarcodeReservedLength"]);
                            beginchar = 3;
                            BoxQuality = _device.ReturnMessage[2];
                        }
                        for (int j = beginchar; j < barcodeLenth - 1; j++)//0字节是【头】,1字节是【数量】2字节开始是条码
                        {
                            rb.Append(Convert.ToChar(_device.ReturnMessage[j]).ToString().ToUpper());
                        }

                        StringBuilder parameter = new StringBuilder();

                        for (int i = 0; i < BoxQuality; i++)
                        {

                            if (i == 0)
                            {
                                parameter.Append('|');//分割托盘条码和物料条码
                            }
                            for (int ii = 0; ii < goodsbarcodeLenth; ii++)
                            {//周转箱叠箱时PalletBarcodeLength=0和PalletBarcodeReservedLength=0
                                // 标志位,类型,数量,托盘条码,内筒/箱体条码
                                parameter.Append(Convert.ToChar(_device.ReturnMessage[barcodeLenth + beginchar + i * goodsbarcodeLenth + ii]).ToString().ToUpper().TrimEnd(';'));//20131106richard
                            }


                            if (i < BoxQuality - 1)
                            {
                                parameter.Append(';');
                            }

                        }
                        readedBarcode = rb.Append(parameter).ToString();
                        if (readedBarcode != dv[0]["F_BarCode"].ToString())
                        {
                            reportedBarcode = "";
                        }
                        else
                        {
                            reportedBarcode = dv[0]["F_BarCode"].ToString();
                        }
                    }
                    else
                    {
                        readedBarcode = "";
                        reportedBarcode = dv[0]["F_BarCode"].ToString();
                    }

                }
                else
                {
                    return false;
                }


                return true;
            }
            catch (Exception ex)
            {
                errorText = ex.Message + ex.StackTrace;
                return false;
            }
        }

        /// <summary>
        /// 卸载
        /// </summary>
        public void Dispose()
        {
            EndListen();
            ClientCallbackLists.Clear();
            ClientShowLists.Clear();
            OPCClient.CCommonOPCClient.DisConnectOPCServer();
        }

        public Model.MError GetDeviceAllErrors(int deviceKindIndex, out string errorText)
        {
            errorText = string.Empty;
            return Model.CGetInfo.DeviceErrors[deviceKindIndex];
        }
        public List<Model.MRoute> GetAllRouteinfo(out string errorText)
        {
            List<Model.MRoute> lmr = new List<Model.MRoute>();
            DataView dv = new DataView();
            errorText = string.Empty;
            StringBuilder sql = new StringBuilder();
            try
            {

                sql.Remove(0, sql.Length);
                sql.Append("select F_RouteID,F_RouteName,F_StartDevice,F_EndDevice,F_RouteKind,F_Status  from T_Base_Route ");
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                Model.MRoute mr = new Model.MRoute();
                for (int i = 0; i < dv.Count; i++)
                {
                    mr.RouteID = Convert.ToInt32(dv[0]["F_RouteID"]);
                    mr.RouteName = dv[0]["F_RouteName"].ToString();
                    mr.StartDevice = Convert.ToInt32(dv[0]["F_StartDevice"]);
                    mr.EndDevice = Convert.ToInt32(dv[0]["F_EndDevice"]);
                    mr.RouteKind = Convert.ToInt32(dv[0]["F_RouteKind"]);
                    mr.Status = Convert.ToInt32(dv[0]["F_Status"]);

                    lmr.Add(mr);
                }
                return lmr;
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
            finally
            {
                dv.Dispose();

            }
        }
        public List<Model.MRoute> GetDeviceJoinRouteinfo(int deviceIndex, out string errorText)
        {
            List<Model.MRoute> lmr = new List<Model.MRoute>();
            DataView dv = new DataView();
            errorText = string.Empty;
            StringBuilder sql = new StringBuilder();
            try
            {

                sql.Remove(0, sql.Length);
                sql.Append("SELECT distinct T_Base_Route.F_RouteID, T_Base_Route.F_RouteName, T_Base_Route.F_StartDevice, T_Base_Route.F_EndDevice, T_Base_Route.F_RouteKind, T_Base_Route.F_Status FROM T_Base_Route,T_Base_Route_Device where T_Base_Route.F_RouteID = T_Base_Route_Device.F_RouteID and F_DeviceIndex=").Append(deviceIndex);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                Model.MRoute mr = new Model.MRoute();
                for (int i = 0; i < dv.Count; i++)
                {
                    mr.RouteID = Convert.ToInt32(dv[i]["F_RouteID"]);
                    mr.RouteName = dv[i]["F_RouteName"].ToString();
                    mr.StartDevice = Convert.ToInt32(dv[i]["F_StartDevice"]);
                    mr.EndDevice = Convert.ToInt32(dv[i]["F_EndDevice"]);
                    mr.RouteKind = Convert.ToInt32(dv[i]["F_RouteKind"]);
                    mr.Status = Convert.ToInt32(dv[i]["F_Status"]);

                    lmr.Add(mr);
                }
                return lmr;
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
            finally
            {
                dv.Dispose();

            }
        }
        public DeviceStateType GetDeviceStateInfo(int deviceIndex, out string errorText)
        {
            errorText = string.Empty;
            try
            {
                DataView dv = dbo.ExceSQL(string.Format("SELECT  F_DeviceIndex,F_DeviceName, F_DeviceKindIndex, F_LockedState ,F_errorcode,  F_ManTaskReserve  FROM  T_Base_Device where F_DeviceIndex={0}", deviceIndex)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    int a = 0; int a1 = 0; int a2 = 0; int a3 = 0;
                    int.TryParse(dv[0]["F_DeviceKindIndex"].ToString(), out a);
                    int.TryParse(dv[0]["F_LockedState"].ToString(), out a1);
                    int.TryParse(dv[0]["F_errorcode"].ToString(), out a2);
                    int.TryParse(dv[0]["F_ManTaskReserve"].ToString(), out a3);
                    DeviceStateType ds = new DeviceStateType();
                    ds.DeviceIndex = Convert.ToInt32(dv[0]["F_DeviceIndex"]);//(int)    .ToString()
                    ds.DeviceKind = a;
                    ds.DeviceName = dv[0]["F_DeviceName"].ToString();
                    ds.ErrorCode = a2;
                    ds.LockedState = a1;
                    ds.ManTaskReserve = a3;
                    return ds;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
        }
        public ManageTask[] GetManageTasks(string FieldName, string content, out string errorText)
        {
            errorText = string.Empty;
            try
            {
                ManageTask[] mt;
                DataView dv = dbo.ExceSQL(string.Format("SELECT *  FROM T_Manage_Task where {0} like '%{1}%'", FieldName, content)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    mt = new ManageTask[dv.Count];
                    for (int i = 0; i < dv.Count; i++)
                    {
                        mt[i] = new ManageTask();
                        mt[i].ManageTaskKindIndex = Convert.ToInt32(dv[i]["F_ManageTaskKindIndex"]);
                        mt[i].FID = Convert.ToInt32(dv[i]["FID"]);
                        mt[i].ControlTaskType = Convert.ToInt32(dv[i]["FControlTaskType"]);
                        mt[i].PalletBarcode = dv[i]["FPalletBarcode"].ToString();
                        mt[i].StartDevice = dv[i]["FStartDevice"].ToString();
                        mt[i].StartCell = dv[i]["FStartCell"].ToString();
                        mt[i].EndDevice = dv[i]["FEndDevice"].ToString();
                        mt[i].EndCell = dv[i]["FEndCell"].ToString();
                        mt[i].Begtime = dv[i]["FBegtime"].ToString();
                        mt[i].Status = Convert.ToInt32(dv[i]["FStatus"]);
                    }
                    return mt;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
        }
        public MonitorTask[] GetMonitorTasks(string FieldName, string content, out string errorText)
        {
            errorText = string.Empty;
            try
            {
                MonitorTask[] mt;
                DataView dv = dbo.ExceSQL(string.Format("SELECT F_TxtParam,F_ManageTaskIndex,F_MonitorIndex,T_Monitor_Task.F_DeviceIndex,F_DeviceName,T_Monitor_Task.F_DeviceCommandIndex,F_DeviceCommandName,T_Monitor_Task.F_ErrorCode,F_ErrorName,F_Status,F_UseAwayFork,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6  FROM  T_Monitor_Task, T_Base_Device,T_Base_Device_Command,T_Base_Device_State where T_Monitor_Task.F_Status = T_Base_Device_State.F_DeviceErrorIndex and T_Base_Device_State.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex and T_Monitor_Task.F_DeviceIndex = T_Base_Device.F_DeviceIndex and T_Monitor_Task.F_DeviceCommandIndex = T_Base_Device_Command.F_DeviceCommandIndex and T_Base_Device_Command.F_DeviceKindIndex = T_Base_Device.F_DeviceKindIndex  and {0} like '%{1}%'", FieldName, content)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    mt = new MonitorTask[dv.Count];
                    for (int i = 0; i < dv.Count; i++)
                    {
                        mt[i] = new MonitorTask();
                        mt[i].BarCode = dv[i]["F_TxtParam"].ToString();
                        mt[i].ManageTaskIndex = Convert.ToInt32(dv[i]["F_ManageTaskIndex"]);
                        mt[i].MonitorIndex = Convert.ToInt32(dv[i]["F_MonitorIndex"]);
                        mt[i].DeviceIndex = Convert.ToInt32(dv[i]["F_DeviceIndex"]);
                        mt[i].DeviceName = dv[i]["F_DeviceName"].ToString();
                        mt[i].DeviceCommandIndex = Convert.ToInt32(dv[i]["F_DeviceCommandIndex"]);
                        mt[i].DeviceCommandName = dv[i]["F_DeviceCommandName"].ToString();
                        mt[i].ErrorCode = Convert.ToInt32(dv[i]["F_ErrorCode"]);
                        mt[i].ErrorName = dv[i]["F_ErrorName"].ToString();
                        mt[i].Status = Convert.ToInt32(dv[i]["F_Status"]);
                        mt[i].ForkNo = Convert.ToInt32(dv[i]["F_UseAwayFork"]);
                        mt[i].NumParam1Z = Convert.ToInt32(dv[i]["F_NumParam1"]);
                        mt[i].NumParam2X = Convert.ToInt32(dv[i]["F_NumParam2"]);
                        mt[i].NumParam3Y = Convert.ToInt32(dv[i]["F_NumParam3"]);
                        mt[i].NumParam4Z = Convert.ToInt32(dv[i]["F_NumParam4"]);
                        mt[i].NumParam5X = Convert.ToInt32(dv[i]["F_NumParam5"]);
                        mt[i].NumParam6Y = Convert.ToInt32(dv[i]["F_NumParam6"]);
                    }
                    return mt;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
        }
        public ST_Cell[] GetAllCellInfos(out string errorText)
        {
            errorText = string.Empty;
            ST_Cell[] sc; DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL("SELECT FID, FWAREHOUSE, FLaneWay, FCELLCODE, FCELLNAME, FCELLSTATUS,FRUNSTATUS, F_Z, F_X, F_Y, FPALLETBARCODE, FStack FROM ST_CELL").Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    sc = new ST_Cell[dv.Count];
                    for (int i = 0; i < dv.Count; i++)
                    {
                        sc[i] = new ST_Cell();
                        sc[i].FID = Convert.ToInt32(dv[i]["FID"]);
                        sc[i].WAREHOUSE = dv[i]["FWAREHOUSE"].ToString();
                        sc[i].LaneWay = Convert.ToInt32(dv[i]["FLaneWay"]);
                        sc[i].CELLCODE = dv[i]["FCELLCODE"].ToString();
                        sc[i].CELLNAME = dv[i]["FCELLNAME"].ToString();
                        sc[i].CELLSTATUS = dv[i]["FCELLSTATUS"].ToString();
                        sc[i].RUNSTATUS = dv[i]["FRUNSTATUS"].ToString();
                        sc[i].RUNSTATUS = dv[i]["FRUNSTATUS"].ToString();
                        sc[i].Z = Convert.ToInt32(dv[i]["F_Z"]);
                        sc[i].X = Convert.ToInt32(dv[i]["F_X"]);
                        sc[i].Y = Convert.ToInt32(dv[i]["F_Y"]);
                        sc[i].Stack = Convert.ToInt32(dv[i]["FStack"]);
                        sc[i].PALLETBARCODE = dv[i]["FPALLETBARCODE"].ToString();

                    }
                    return sc;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
            finally
            {
                dv.Dispose();
            }

        }

        public bool SetDeviceStateInfo(DeviceStateType devstate, out string errorText)
        {
            errorText = string.Empty;
            try
            {
                object[] ob = new object[4] { devstate.LockedState, devstate.ErrorCode, devstate.ManTaskReserve, devstate.DeviceIndex };
                int acount = dbo.ExecuteSql(string.Format("update T_Base_Device set F_LockedState={0},F_errorcode={1},F_ManTaskReserve={2} where F_DeviceIndex={3}", ob));

                return true;
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return false;

            }
        }
        public bool SetRouteStateInfo(int routeID, bool isEnabled, out string errorText)
        {
            int fstatus = 0;
            errorText = string.Empty;
            try
            {
                if (isEnabled == true)
                {
                    fstatus = 1;
                }
                else
                {
                    fstatus = 0;
                }
                Model.MRoute mr = new Model.MRoute();
                mr.RouteID = routeID;
                mr.Status = fstatus;
                return SetRouteState(mr, out errorText);


            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return false;
            }
        }
        public bool SetDeviceJoinRouteStateInfo(int deviceIndex, bool isEnabled, out string errorText)
        {
            DataView dv = new DataView();
            int fstatus = 0;
            errorText = string.Empty;
            StringBuilder sql = new StringBuilder();
            try
            {
                if (isEnabled == true)
                {
                    fstatus = 1;
                }
                else
                {
                    fstatus = 0;
                }
                sql.Remove(0, sql.Length);
                sql.Append("select distinct F_RouteID from T_Base_Route_Device where F_DeviceOrder>0 and F_DeviceIndex=").Append(deviceIndex);
                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                Model.MRoute mr = new Model.MRoute();
                for (int i = 0; i < dv.Count; i++)
                {
                    mr.RouteID = (int)dv[0]["F_RouteID"];
                    mr.Status = fstatus;
                    SetRouteState(mr, out errorText);

                }
                return true;
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();

            }
        }
        public LanguageContent[] GetLanguageContent(string language, out string errorText)
        {
            errorText = string.Empty;
            try
            {
                LanguageContent[] lan;
                DataView dv = dbo.ExceSQL(string.Format("SELECT Name, {0} FROM T_Base_MultiLanguage", language)).Tables[0].DefaultView;
                lan = new LanguageContent[dv.Count];
                for (int i = 0; i < dv.Count; i++)
                {
                    LanguageContent ml = new LanguageContent();
                    ml.key = dv[i][0].ToString();
                    ml.value = dv[i][1].ToString();
                    lan[i] = ml;
                }
                return lan;
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
        }
        public string[] GetLanguageFields(out string errorText)
        {
            errorText = string.Empty;
            string[] lf;
            try
            {
                DataView dv = dbo.ExceSQL("SELECT name FROM syscolumns WHERE (id = OBJECT_ID('T_Base_MultiLanguage')) and name<>'Name'").Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    lf = new string[dv.Count];
                    for (int i = 0; i < dv.Count; i++)
                    {
                        lf[i] = dv[i][0].ToString();
                    }
                    return lf;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
        }
        public DevicesDic GetDevicesDic(out string errorText)
        {
            errorText = string.Empty;
            try
            {
                DevicesDic dd = new DevicesDic();
                dd.MDevices = Model.CGetInfo.DeviceInfo;
                return dd;
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
        }
        /// <summary>
        /// Http客户端调用
        /// </summary>
        /// <param name="errorText"></param>
        /// <returns></returns>
        public byte[] GetAllDevicesString(out string errorText)
        {
            errorText = string.Empty;
            try
            {
                //CommonClassLib.CCarryConvert.WriteDarkCasket("Unity 3D", "客户端调用", "", "");

                return CompressedSerializer.Compress<string>(Model.CGetInfo.GetDeviceInfobyStringALL());
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                //byte[] b = null;
                return null;
            }
        }
        /// <summary>
        /// Http客户端调用
        /// </summary>
        /// <param name="errorText"></param>
        /// <returns></returns>
        public byte[] GetAllCellString(out string errorText)
        {
            errorText = string.Empty;
            StringBuilder _tempSB = new StringBuilder();

            try
            {
                dvclient = dbo.ExceSQL("SELECT  FCELLCODE,FCELLSTATUS,FRUNSTATUS FROM ST_CELL WHERE FCELLSTATUS=1 ").Tables[0].DefaultView;
                if (dvclient.Count > 0)
                {

                    for (int i = 0; i < dvclient.Count; i++)
                    {
                        _tempSB.Append(dvclient[i]["FCELLCODE"].ToString());//货位编码
                        if (i != dvclient.Count - 1)
                        {
                            _tempSB.Append(",");
                        }

                    }
                    return CompressedSerializer.Compress<string>(_tempSB.ToString());

                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
            finally
            {
                dvclient.Dispose();
            }
        }
        /// <summary>
        /// Http客户端调用
        /// </summary>
        /// <param name="DeviceIdx">设备编号</param>
        /// <param name="CellCode">货位编码</param>
        /// <param name="errorText">返回的错误信息</param>
        /// <returns></returns>
        public byte[] GetOneDeviceOrCellString(int DeviceIdx, int ForkIdx, string CellCode, out string errorText)
        {//
            errorText = string.Empty;
            char[] cc = new char[1] { '-' };
            string[] cell;
            StringBuilder _tempSB = new StringBuilder();
            string sqlstr = string.Empty;
            int TaskNo = 0;//任务号
            string ArrowLocation = string.Empty;//目标位置
            string PalletBarCode = string.Empty;//托盘条码
            string GoodsType = string.Empty;
            string GoodsBarCode = string.Empty;//物料条码
            int TaskKind = 2;
            int FID = 0;
            string TaskFork = "0";

            try
            {
                #region 获得设备信息
                if (DeviceIdx > 0)
                {

                    ClientUsedDevinfo = Model.CGetInfo.GetDeviceInfo(DeviceIdx);

                    if (ClientUsedDevinfo == null)//不存在的设备
                    {
                        return null;
                    }

                    TaskNo = ClientUsedDevinfo.TaskNo;//任务号

                    dvclient = dbo.ExceSQL(string.Format("SELECT F_ManageTaskIndex,F_UseAwayFork, F_ManageTASKKINDINDEX,F_DeviceCommandIndex,F_TxtParam, F_NumParam1, F_NumParam2, F_NumParam3, F_NumParam4,F_NumParam5, F_NumParam6 FROM T_Monitor_Task WHERE (F_MonitorIndex = {0})", TaskNo)).Tables[0].DefaultView;

                    if (dvclient.Count > 0)
                    {
                        FID = Convert.ToInt32(dvclient[0]["F_ManageTaskIndex"]);//调度任务号
                        TaskKind = Convert.ToInt32(dvclient[0]["F_ManageTASKKINDINDEX"]);//任务类型
                        TaskFork = dvclient[0]["F_UseAwayFork"].ToString();//货叉号
                        PalletBarCode = dvclient[0]["F_TxtParam"].ToString();//托盘条码
                        int Z = Convert.ToInt32(dvclient[0]["F_NumParam1"]);
                        int X = Convert.ToInt32(dvclient[0]["F_NumParam2"]);
                        int Y = Convert.ToInt32(dvclient[0]["F_NumParam3"]);
                        int Z1 = Convert.ToInt32(dvclient[0]["F_NumParam4"]);
                        int X1 = Convert.ToInt32(dvclient[0]["F_NumParam5"]);
                        int Y1 = Convert.ToInt32(dvclient[0]["F_NumParam6"]);

                        int order = Convert.ToInt32(dvclient[0]["F_DeviceCommandIndex"]);//获得设备命令

                        #region  查找关联任务
                        int temptask;
                        if (TaskFork != ForkIdx.ToString())//不相等则查找关联任务
                        {
                            Dictionary<int, string[]> df = Model.CGeneralFunction.GetDoubleForkMonitorInfo(TaskNo, DeviceIdx);
                            if (df != null)
                            {
                                foreach (int cortask in df.Keys)
                                {
                                    if (cortask != TaskNo)
                                    {

                                        TaskNo = cortask;//新的任务号

                                        dvclient = dbo.ExceSQL(string.Format("SELECT F_UseAwayFork, F_ManageTASKKINDINDEX,F_DeviceCommandIndex,F_TxtParam, F_NumParam1, F_NumParam2, F_NumParam3, F_NumParam4,F_NumParam5, F_NumParam6 FROM T_Monitor_Task WHERE (F_MonitorIndex = {0})", TaskNo)).Tables[0].DefaultView;
                                        if (dvclient.Count > 0)
                                        {
                                            PalletBarCode = df[cortask][4];//新的托盘条码
                                            Z = Convert.ToInt32(dvclient[0]["F_NumParam1"]);
                                            X = Convert.ToInt32(dvclient[0]["F_NumParam2"]);
                                            Y = Convert.ToInt32(dvclient[0]["F_NumParam3"]);
                                            Z1 = Convert.ToInt32(dvclient[0]["F_NumParam4"]);
                                            X1 = Convert.ToInt32(dvclient[0]["F_NumParam5"]);
                                            Y1 = Convert.ToInt32(dvclient[0]["F_NumParam6"]);
                                        }


                                        break;

                                    }
                                }



                            }


                        }
                        #endregion
                        #region 获得目标位置


                        #region 堆垛机
                        if (ClientUsedDevinfo.DeviceKind == 1)
                        {
                            switch (order)
                            {
                                case 1://回原点
                                    ArrowLocation = string.Format("回原点:01列01层");
                                    break;
                                case 2://将取
                                    ArrowLocation = string.Format("将取:{0:D2}排-{1:D2}列-{2:D2}层", Z, X, Y);
                                    break;
                                case 3://将送
                                    ArrowLocation = string.Format("将送:{0:D2}排-{1:D2}列-{2:D2}层", Z1, X1, Y1);
                                    break;
                                case 4://取
                                    ArrowLocation = string.Format("取货:{0:D2}排-{1:D2}列-{2:D2}层", Z, X, Y);

                                    break;
                                case 5://送
                                    ArrowLocation = string.Format("送货:{0:D2}排-{1:D2}列-{2:D2}层", Z1, X1, Y1);
                                    break;
                                case 6:
                                    ArrowLocation = string.Format("取送货:{0:D2}排-{1:D2}列-{2:D2}层 到 {3:D2}排-{4:D2}列-{5:D2}层", Z, X, Y, Z1, X1, Y1);
                                    break;

                            }
                        }
                        #endregion
                        #region 输送机

                        if (ClientUsedDevinfo.DeviceKind == 2)
                        {
                            switch (order)
                            {
                                case 1://正转
                                    ArrowLocation = string.Format("正转");
                                    break;
                                case 2://反转
                                    ArrowLocation = string.Format("反转");
                                    break;
                                case 6://送出
                                    ArrowLocation = string.Format("{0}送出到{1}", Z, Z1);
                                    break;
                                case 8://上升
                                    ArrowLocation = string.Format("上升");
                                    break;
                                case 9://下降
                                    ArrowLocation = string.Format("下降");
                                    break;


                            }
                        }
                        #endregion


                        #endregion



                    }
                    else//任务已经完成
                    {
                        if (ClientUsedDevinfo.DeviceKind == 2)
                        {
                            object bcode = dbo.GetSingle(string.Format("SELECT F_PALLETBARCODE FROM T_Base_Device WHERE (F_DeviceIndex = {0})", DeviceIdx));
                            if (bcode != null)
                            {
                                PalletBarCode = bcode.ToString();
                            }

                        }
                    }

                    #region 获得物料条码信息
                    if (TaskKind == 1 && PalletBarCode != "")//只有管理系统下达的任务才需要查询物料信息
                    {
                        //根据托盘条码查询物料信息
                        sqlstr = string.Format("SELECT  GOODS_PROPERTY1,GOODS_PROPERTY2,GOODS_PROPERTY3,GOODS_PROPERTY4,GOODS_CLASS_NAME  From V_STORAGE_LIST where STOCK_BARCODE = '{0}'", PalletBarCode);
                        dvclient = dboMan.ExceSQL(sqlstr).Tables[0].DefaultView;
                        if (dvclient.Count > 0)//出库任务可以在管理系统查询到
                        {
                            GoodsType = dvclient[0]["GOODS_CLASS_NAME"].ToString();
                            GoodsBarCode = string.Format("{0}|{1}|{2}|{3}",
                                dvclient[0]["GOODS_PROPERTY1"].ToString().Trim(),
                                dvclient[0]["GOODS_PROPERTY2"].ToString().Trim(),
                                dvclient[0]["GOODS_PROPERTY3"].ToString().Trim(),
                                dvclient[0]["GOODS_PROPERTY4"].ToString().Trim());
                        }
                        else//入库任务管理系统查询不到
                        {
                            sqlstr = string.Format("SELECT GOODS_BARCODE FROM T_Manage_Task WHERE (FID = {0}) AND (F_ManageTaskKindIndex ={1})", FID, TaskKind);
                            dvclient = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;
                            if (dvclient.Count > 0)//
                            {
                                GoodsType = "";
                                GoodsBarCode = dvclient[0]["GOODS_PROPERTY1"].ToString().Replace(";", "|");

                            }
                        }

                    }

                    #endregion

                    _tempSB
                     .Append(DeviceIdx).Append(",")//设备编号
                     .Append(TaskNo).Append(",")//任务号
                     .Append(ArrowLocation.Trim()).Append(",")//目标位置
                     .Append(PalletBarCode.Trim()).Append(",")//托盘条码
                     .Append(GoodsType.Trim()).Append(",")//物料类型
                     .Append(GoodsBarCode.Trim());//物料条码
                    //.Append(";");


                }
                #endregion
                #region 获得货位信息
                else
                    if (CellCode != "")
                    {
                        cell = CellCode.Split(cc);
                        if (cell.Length == 3)
                        {


                            #region 获得物料条码信息,连接管理系统数据库


                            //根据托盘条码查询物料信息
                            sqlstr = string.Format("SELECT  STOCK_BARCODE,GOODS_PROPERTY1,GOODS_PROPERTY2,GOODS_PROPERTY3,GOODS_PROPERTY4,GOODS_CLASS_NAME  From V_STORAGE_LIST where CELL_CODE  = '{0:D2}-{1:D2}-{2:D2}'", cell[0], cell[1], cell[2]);
                            dvclient = dboMan.ExceSQL(sqlstr).Tables[0].DefaultView;
                            if (dvclient.Count > 0)
                            {
                                PalletBarCode = dvclient[0]["STOCK_BARCODE"].ToString();//托盘条码
                                GoodsType = dvclient[0]["GOODS_CLASS_NAME"].ToString();//物料类型
                                GoodsBarCode = string.Format("{0}|{1}|{2}|{3}",
                                    dvclient[0]["GOODS_PROPERTY1"].ToString().Trim(),
                                    dvclient[0]["GOODS_PROPERTY2"].ToString().Trim(),
                                    dvclient[0]["GOODS_PROPERTY3"].ToString().Trim(),
                                    dvclient[0]["GOODS_PROPERTY4"].ToString().Trim());

                            }


                            #endregion
                        }
                        _tempSB
                         .Append(CellCode.Trim()).Append(",")//货位
                         .Append(PalletBarCode.Trim()).Append(",")//托盘条码
                         .Append(GoodsType.Trim()).Append(",")//物料类型
                         .Append(GoodsBarCode.Trim());//物料条码
                        //.Append(";");
                    }
                #endregion


                return CompressedSerializer.Compress<string>(_tempSB.ToString());
            }
            catch (Exception ex)
            {
                errorText = ex.Message;
                return null;
            }
            finally
            {
                dvclient.Dispose();
            }
        }
        /// <summary>
        /// 通过设置订阅的监控模式,刷新订阅
        /// </summary>
        /// <returns></returns>
        public bool RefreshMonitoringMode()
        {//20150103增加断网恢复
            OPCClient.CCommonOPCClient.RefreshMonitoringMode();
            return true;
        }
        /// <summary>
        /// 注册客户端
        /// </summary>
        /// <param name="userID">客户端标识</param>
        /// <param name="errText"></param>
        /// <returns></returns>
        public bool RegisterClient(string userID, string userDescription, out string errText)
        {
            try
            {
                #region 检测用户是否存在
                if (ClientShowLists.ContainsValue(userID) == true)
                {
                    errText = "用户:" + userDescription + "已经登录了!请更换其它用户名称重新登录!";
                    return false;
                }
                #endregion

                var client = OperationContext.Current.GetCallbackChannel<IClient>();
                var id = OperationContext.Current.SessionId;

                OperationContext.Current.Channel.Closing += new EventHandler(Channel_Closing);
                ClientCallbackLists.Add(client, userDescription);
                ClientShowLists.Add(client, userID);
                ClientLogEventArgs coea = new ClientLogEventArgs(userDescription + ":连接服务!");

                OnChannelOpen(coea);

                errText = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                errText = ex.StackTrace + ex.Message;
                return false;
            }

        }
        public Model.MDevice SendAllDeviceStates(int device)
        {

            return Model.CGetInfo.GetDeviceInfo(device);
        }
        /// <summary>
        /// 注销客户端
        /// </summary>
        /// <param name="userID">用户标识</param>
        /// <param name="ErrText"></param>
        /// <returns></returns>
        public bool LogoutClient(string userID, out string ErrText)
        {
            try
            {
                var client = OperationContext.Current.GetCallbackChannel<IClient>();
                ClientCallbackLists.Remove(client);
                ClientShowLists.Remove(client);
                ClientLogEventArgs coea = new ClientLogEventArgs(userID + ":断开服务!");
                OnClientLogout(coea);
                ErrText = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                ErrText = ex.StackTrace + ex.Message;
                return false;
            }
        }
        /// <summary>
        /// 获取任务
        /// </summary>
        /// <param name="laneway">巷道限制</param>
        /// <param name="Order">更新"UPDATE",追加"APPEND",替换"REPLACE"</param>
        /// <returns></returns>
        public bool ObtainTask(string laneway, string Order)
        {

            try
            {
                if (Order == "UPDATE")
                {
                    CStaticClass.ManZWhere = new StringBuilder(laneway);
                }
                else if (Order == "APPEND")
                {
                    if (CStaticClass.ManZWhere.ToString().IndexOf(laneway.ToString()) < 0)
                    {
                        CStaticClass.ManZWhere.Append(laneway);
                    }

                }
                else if (Order == "REPLACE")
                {
                    CStaticClass.ManZWhere.Replace(laneway, "");
                }

                CStaticClass.ObtainManageTask = true;

                CCallService.StartListen();//民航二所 打开开关后启用线程调用管理系统的webapi接口
             //   CObtainTask.StartListen();
                return true;
            }
            catch
            {
                return false;
            }
        }
        public bool StopObtainTask()
        {

            try
            {
                CStaticClass.ManZWhere.Remove(0, CStaticClass.ManZWhere.Length);
                CStaticClass.ObtainManageTask = false;
                CCallService.EndListen();  //民航二所 关闭开关后启用线程调用管理系统的webapi接口
                return true;
            }
            catch
            {
                return false;
            }
        }
        public bool OrderTurnOn()
        {
            if (CStaticClass.Order == true) return true;//20121203
            DataView dvx = new DataView(); DataView dv = new DataView();
            try
            {

                CStaticClass.RefreshMonitor += new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CGetState.RefreshMonitor += new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CControl.RefreshMonitor += new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CDisassembleTask.RefreshMonitor += new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CObtainTask.RefreshMonitor += new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CParsePLCData.RefreshMonitor += new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                OPCClient.CCommonOPCClient.UpdateDB += new CUpdateDBEventHandler(CCommon_UpdateDB);
                SocketsTCPIP.CClientTCPIP.UpdateDB += new CUpdateDBEventHandler(CListenAGVState_UpdateDB);
                SocketsTCPIP.CClientTCPIP.SendDeviceOrder += new CSendDeviceOrderEventHandler(CClientTCPIP_SendDeviceOrder);
                SocketsTCPIP.CClientTCPIP.WriteDarkCasket += new CWriteDarkCasketEventHandler(CClientTCPIP_WriteDarkCasket);
                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"])]);
                    }
                }
                CStaticClass.Order = true;
                CStaticClass.ReConnect();
                SocketsTCPIP.CClientTCPIP.InitAllClientTCPIP();
                CParsePLCData.StartListen();
              CCallService.StartListenPLC();//山东时代
              //  CDisassembleTask.StartListen();
              //  CDisassembleTask.StartListen();
                CUpdateIoControl.StartListen(); // NewWrieDarkCasket 位置1
                OPCClient.CCommonOPCClient.CreateSubscriptionGroup();

                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                dv.Dispose();
                dvx.Dispose();
            }
        }


        public bool OrderTurnOff()
        {

            try
            {
                CStaticClass.Order = false;

                CStaticClass.RefreshMonitor -= new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CGetState.RefreshMonitor -= new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CControl.RefreshMonitor -= new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CDisassembleTask.RefreshMonitor -= new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CObtainTask.RefreshMonitor -= new RefreshMonitorEventHandler(MonitorRefreshMonitor);
                CParsePLCData.RefreshMonitor -= new RefreshMonitorEventHandler(MonitorRefreshMonitor);

                OPCClient.CCommonOPCClient.UpdateDB -= new CUpdateDBEventHandler(CCommon_UpdateDB);
                OPCClient.CCommonOPCClient.DisConnectOPCServer();//20141201张磊发现错误,应该注销订阅和事件
                CDisassembleTask.EndListen();
                //20160420 注释4行
                //SocketsTCPIP.CClientTCPIP.UpdateDB -= new CUpdateDBEventHandler(CListenAGVState_UpdateDB);
                //SocketsTCPIP.CClientTCPIP.WriteDarkCasket -= new CWriteDarkCasketEventHandler(CClientTCPIP_WriteDarkCasket);
                //SocketsTCPIP.CClientTCPIP.SendDeviceOrder -= new CSendDeviceOrderEventHandler(CClientTCPIP_SendDeviceOrder);
                //SocketsTCPIP.CClientTCPIP.EndConnect();
                CParsePLCData.EndListen();
                CUpdateIoControl.EndListen(); // NewWrieDarkCasket 位置2'
                CCallService.EndListenPLC();//山东时代
                return true;
            }
            catch
            {
                return false;
            }
        }
        public bool DeviceCommunicationInit(string CommunicationType, out string ErrText)
        {
            try
            {
                if (CommunicationType.IndexOf("OPCClient") >= 0)
                {
                    OPCClient.CCommonOPCClient.ConnectCount = new Dictionary<string, int>();

                }
                else if (CommunicationType.IndexOf("SocketsTCPIP") >= 0)
                {//CommunicationType="SocketsTCPIP:191.168.1.3,3000"
                    char[] cc = new char[1] { ':' };
                    string[] sp = CommunicationType.Split(cc);
                    string remoteip = string.Empty;
                    int port = 0;
                    if (sp.Length > 1)
                    {

                        cc = new char[1] { ',' };
                        string[] sp1 = sp[1].Split(cc);
                        remoteip = sp1[0];
                        port = Convert.ToInt32(sp1[1]);

                        SocketsTCPIP.CClientTCPIP.TcpIPInitCount[remoteip] = 0;
                        SocketsTCPIP.CClientTCPIP.InitClientTCPIP(remoteip, port);

                    }


                }
                ErrText = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                ErrText = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public DataTable GetUsers(out string Errtext)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT f_userid, f_username, f_purview, f_password FROM T_Base_Users")).Tables[0].DefaultView;
                Errtext = string.Empty;
                if (dv.Count <= 0)
                {

                    return null;
                }
                else
                    return dv.Table;

            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return null;
            }
            finally
            {
                dv.Dispose();
            }
        }

        public bool BuildHandTask(Model.HandTask Handtask, out string Errtext)
        {//20141201张磊发现没验证货位和巷道
            DataView dv = new DataView();
            try
            {

                string Sql = string.Empty;
                string dtime = DateTime.Now.ToString("u");
                dtime = dtime.Substring(0, dtime.Length - 1);
                string qcell = string.Empty, scell = string.Empty;
                int hidx = GetManageHandIdx();
                int hmindx = ccf.GetMonitorIndex(hidx, 4);
                int rehidx = 0, rehmindx = 0;
                int[] relfid = null;
                //20101028
                int z = 0, x = 0, y = 0, z1 = 0, x1 = 0, y1 = 0, Inworkbench = 0; ;
                int routeIDsub = GetRouteIDsubHand(Convert.ToInt32(Handtask._deviceIndex));

                if ((routeIDsub == -1) && (ccf.GetDeviceKindIdx(Handtask._deviceIndex) != 13) && (ccf.GetDeviceKindIdx(Handtask._deviceIndex) != 31))
                {

                    Errtext = "您选择的设备错误!";
                    return false;
                }


                #region  add by lyj 20180222 如果目标巷道有堆垛机则返回错误信息
                string[] startcells;
                string[] endcells;
                int zlane = 0;
                int goalLaneno = 0;
                int myLaneno = 0;
                StringBuilder mysql = new StringBuilder();

                DataView dvlane;
                if (!Handtask._cellcodeBegin.Equals(""))
                {
                    startcells = Handtask._cellcodeBegin.Split('-');
                    if (startcells.Length != 0)
                    {
                        zlane = Convert.ToInt32(startcells[0].ToString());
                    }

                }
                else if (!Handtask._cellcodeEnd.Equals(""))
                {

                    endcells = Handtask._cellcodeEnd.Split('-');
                    if (endcells.Length != 0)
                    {
                        zlane = Convert.ToInt32(endcells[0].ToString());
                    }
                }
                if (zlane > 0)
                {
                    if (zlane > 0)
                    {
                        mysql.Append("select top 1 * from ST_CELL where F_Z=").Append(zlane);
                        dvlane = dbo.ExceSQL(mysql.ToString()).Tables[0].DefaultView;
                        if (dvlane.Count > 0)
                        {
                            goalLaneno = Convert.ToInt32(dvlane[0]["FLaneWay"]);
                        }
                        mysql.Remove(0, mysql.Length);
                        mysql.Append("select * from T_Base_Device where  F_StackNum<>0 and  F_DeviceIndex=").Append(goalLaneno);
                        dvlane = dbo.ExceSQL(mysql.ToString()).Tables[0].DefaultView;

                        if (dvlane.Count > 0)
                        {

                            mysql.Remove(0, mysql.Length);
                            mysql.Append("select * from T_Base_StackLaneAndLayuerInfo where F_DeviceIndex=").Append(Handtask._deviceIndex);
                            dvlane = dbo.ExceSQL(mysql.ToString()).Tables[0].DefaultView;
                            myLaneno = Convert.ToInt32(dvlane[0]["F_LaneNumAll"]);
                            if (goalLaneno != myLaneno)
                            {
                                Errtext = "目标巷道有堆垛机,请将堆垛机移除后方可下达!";
                                return false;
                            }

                        }
                    }

                }
                #endregion



                #region 堆垛机
                if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 1)
                {
                    char[] cc = new char[1] { '-' };
                    string[] sp = Handtask._cellcodeBegin.Split(cc);
                    if (sp.Length >= 3)
                    {
                        z = Convert.ToInt32(sp[0]);
                        x = Convert.ToInt32(sp[1]);
                        y = Convert.ToInt32(sp[2]);

                    }
                    sp = Handtask._cellcodeEnd.Split(cc);
                    if (sp.Length >= 3)
                    {
                        z1 = Convert.ToInt32(sp[0]);
                        x1 = Convert.ToInt32(sp[1]);
                        y1 = Convert.ToInt32(sp[2]);

                    }
                }
                #endregion

                #region 物流输送机
                if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 2)
                {
                    z = Handtask._deviceIndex;
                    z1 = Convert.ToInt32(Handtask._arrowLocation);
                }
                #endregion

                if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 4)
                {//RGV

                    z = Convert.ToInt32(Handtask._arrowLocation);
                    z1 = 0;
                    if (Handtask._deviceIndex == 19005)//上海晟碟
                    {
                        if (Convert.ToInt32(Handtask._arrowLocation) == 19002)
                        {
                            z = 1;
                        }
                        else if (Convert.ToInt32(Handtask._arrowLocation) == 29002)
                        {
                            z = 2;
                        }
                        else if (Convert.ToInt32(Handtask._arrowLocation) == 39002)
                        {
                            z = 3;
                        }
                        else if (Convert.ToInt32(Handtask._arrowLocation) == 49002)
                        {
                            z = 4;
                        }
                        else if (Convert.ToInt32(Handtask._arrowLocation) == 59002)
                        {
                            z = 5;
                        }

                    }

                }

                #region 高端输送机
                if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 13)
                {
                    z = Handtask._begindeviceIndex;
                    z1 = Convert.ToInt32(Handtask._arrowLocation);
                    Inworkbench = Handtask._forkNo;
                }
                #endregion

                string useawayfork = "-"; int[] xx; int[] xx1;
                string barcode = string.Empty;
                useawayfork = Handtask._forkNo.ToString();
                char[] cp = new char[1] { ',' };
                if (Handtask._correlTaskForks.Length > 0)
                {
                    string[] cforks = Handtask._correlTaskForks.Split(cp);
                    xx = new int[cforks.Length];
                    xx1 = new int[cforks.Length];
                    relfid = new int[cforks.Length];
                    for (int i = 0; i < cforks.Length; i++)
                    {
                        if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 1)
                        {
                            string useawayfork1 = cforks[i];
                            xx[i] = x + (Convert.ToInt32(useawayfork1) - Handtask._forkNo);
                            xx1[i] = x1 + (Convert.ToInt32(useawayfork1) - Handtask._forkNo);
                            #region 堆垛机

                            if ((Handtask._deviceOrder == 4) || (Handtask._deviceOrder == 5))
                            {
                                object[] ob;//20141201
                                rehidx = hidx + 1 + i;
                                rehmindx = ccf.GetMonitorIndex(rehidx, 4);
                                string bc = rehmindx.ToString();
                                int bcl = bc.Length;
                                for (int j = 0; j < (6 - bcl); j++)
                                {
                                    bc += j.ToString();
                                }
                                if (Handtask._deviceOrder == 4)//取货
                                {//z-x-y

                                    if (x == 1)
                                    {
                                        //xx[i] = 1;
                                    }
                                    else
                                    {
                                        ob = new object[4] { z, xx[i], y, ccf.GetLaneWayNoFromStack(Handtask._deviceIndex) };//20141201
                                        dv = dbo.ExceSQL(string.Format("SELECT FID FROM ST_CELL WHERE (F_Z = {0}) AND (F_X = {1}) AND (F_Y = {2}) and FLaneWay={3}", ob)).Tables[0].DefaultView;//20141201
                                        if (dv.Count == 0)
                                        {
                                            Errtext = "堆垛机取货坐标在数据库不存在!";
                                            return false;

                                        }
                                    }


                                    qcell = z.ToString() + "-" + xx[i].ToString() + "-" + y.ToString();//20101028
                                    dbo.ExceSQL("insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                                        "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_UseAwayFork,F_TxtParam) " +
                                        "values(" + routeIDsub + "," + rehidx + ",4," + rehmindx + "," + Handtask._deviceIndex
                                        + "," + Handtask._deviceOrder + "," + z + "," + xx[i] + "," + y + ",0,0,0,'" + useawayfork1 + "','" + bc + "')");

                                }
                                else if (Handtask._deviceOrder == 5)//送货
                                {//z1-x1-y1

                                    if (x1 == 1)
                                    {
                                        //20130710xx1[i] = 1;
                                    }
                                    else
                                    {
                                        ob = new object[4] { z1, xx1[i], y1, ccf.GetLaneWayNoFromStack(Handtask._deviceIndex) };//20141201
                                        dv = dbo.ExceSQL(string.Format("SELECT FID FROM ST_CELL WHERE (F_Z = {0}) AND (F_X = {1}) AND (F_Y = {2})  and FLaneWay={3}", ob)).Tables[0].DefaultView;//20141201
                                        if (dv.Count == 0)
                                        {
                                            Errtext = "堆垛机送货坐标在数据库不存在!";
                                            return false;

                                        }
                                    }


                                    scell = z1.ToString() + "-" + xx1[i].ToString() + "-" + y1.ToString();//20101028
                                    dbo.ExceSQL("insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                                    "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_UseAwayFork,F_TxtParam) " +
                                    "values(" + routeIDsub + "," + rehidx + ",4," + rehmindx + "," + Handtask._deviceIndex
                                    + "," + Handtask._deviceOrder + ",0,0,0," + z1 + "," + xx1[i] + "," + y1 + ",'" + useawayfork1 + "','" + bc + "')");

                                }

                                dbo.ExceSQL("insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME) values('" +
                                    bc + "'," + rehidx + ",4,-1,1," + Handtask._deviceIndex + ",'" + Handtask._deviceOrder + "','" + qcell + "'," + Handtask._deviceIndex + ",'" + scell + "','" + dtime + "')");

                                RecordMaxHandTaskFID(rehidx);
                                relfid[i] = rehidx;
                            }
                            #endregion
                        }
                        else if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 2)
                        {
                            rehidx = hidx + 1 + i;
                            rehmindx = ccf.GetMonitorIndex(rehidx, 4);
                            string bc = rehmindx.ToString();
                            int bcl = bc.Length;
                            for (int j = 0; j < (6 - bcl); j++)
                            {
                                bc += j.ToString();
                            }
                            string useawayfork1 = (Handtask._forkNo + 1 + i).ToString();
                            //
                            int length = Handtask._deviceIndex.ToString().Length;
                            int newindex = Handtask._deviceIndex;
                            if (length == 6)
                            {

                                string row = Handtask._deviceIndex.ToString().Substring(length - 1, 1);
                                string newrow;
                                if (row == "1")
                                {
                                    newrow = "2";
                                }
                                else
                                {
                                    newrow = "1";
                                }

                                newindex = Convert.ToInt32(string.Format("{0}{1}", Handtask._deviceIndex.ToString().Substring(0, length - 1), newrow));
                                //Handtask._deviceIndex = newindex;
                            }



                            Sql = "insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                        "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_UseAwayFork,F_TxtParam) " +
                        "values(" + routeIDsub + "," + rehidx + ",4," + rehmindx + "," + newindex
                        + "," + Handtask._deviceOrder + "," + z + "," + x + "," + y + "," + z1 + "," + x1 + "," + y1 + ",'" + useawayfork1 + "','" + bc + "')";
                            dbo.ExceSQL(Sql);
                            Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('" +
                                bc + "'," + rehidx + ",4,-1,1," + newindex + ",'" + Handtask._deviceOrder + "','" + z.ToString() + "-" + x.ToString() + "-" + y.ToString()
                                + "'," + Handtask._arrowLocation + ",'" + z1.ToString() + "-" + x1.ToString() + "-" + y1.ToString() + "','" + dtime + "'," + Handtask._forkNo + ")";
                            dbo.ExceSQL(Sql);
                            RecordMaxHandTaskFID(rehidx);
                            relfid[i] = rehidx;
                        }

                    }
                }
                if ((ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 13) || (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 31))
                {
                    barcode = Handtask._cellcodeBegin;
                }
                else
                {
                    barcode = hmindx.ToString();
                }

                int bcll = barcode.Length;
                for (int j = 0; j < (6 - bcll); j++)
                {
                    barcode += j.ToString();
                }

                Sql = "insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                        "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_UseAwayFork,F_TxtParam) " +
                        "values(" + routeIDsub + "," + hidx + ",4," + hmindx + "," + Handtask._deviceIndex
                        + "," + Handtask._deviceOrder + "," + z + "," + x + "," + y + "," + z1 + "," + x1 + "," + y1 + ",'" + useawayfork + "','" + barcode + "')";
                dbo.ExceSQL(Sql);
                Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('" +
                    barcode + "'," + hidx + ",4,-1,1," + Handtask._deviceIndex + ",'" + Handtask._deviceOrder + "','" + z.ToString() + "-" + x.ToString() + "-" + y.ToString()
                    + "'," + Handtask._arrowLocation + ",'" + z1.ToString() + "-" + x1.ToString() + "-" + y1.ToString() + "','" + dtime + "'," + Handtask._forkNo + ")";
                dbo.ExceSQL(Sql);
                RecordMaxHandTaskFID(hidx);
                if (relfid != null)
                {
                    dbo.ExecuteSql("update T_Manage_Task set F_RELATIVECONTORLID=" + hidx + " where F_ManageTaskKindIndex=4 and FID=" + hidx);
                    for (int i = 0; i < relfid.Length; i++)
                    {
                        dbo.ExecuteSql("update T_Manage_Task set F_RELATIVECONTORLID=" + hidx + " where F_ManageTaskKindIndex=4 and FID=" + relfid[i]);
                    }
                }

                Errtext = string.Empty;
                CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                OnDataChange("BuildHandTask", cea);
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public bool BuildHandAssociateTask(int ConveyorIndex, int ConveyorOrder, int RgvIndex, int RgvOrder, string RgvOrderName, out string Errtext)
        {
            try
            {
                int routeRGVIDsub = GetRouteIDsub(RgvIndex);
                int routeIDsub = GetRouteIDsub(ConveyorIndex);
                int hidx = GetManageHandIdx();
                int hmindx = ccf.GetMonitorIndex(hidx, 4);
                int hmindx1 = ccf.GetMonitorIndex(hidx, 4);
                string Sql = string.Empty;
                string dtime = DateTime.Now.ToString("u");
                dtime = dtime.Substring(0, dtime.Length - 1);
                if (RgvOrderName.Contains("接") == true)
                {//输送机送货是主任务
                    Sql = "insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                            "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_Associate) " +
                            "values(" + routeIDsub + "," + hidx + ",4," + hmindx + "," + ConveyorIndex
                            + "," + ConveyorOrder + "," + ConveyorIndex + "," + hmindx1 + ")";
                    dbo.ExceSQL(Sql);
                    Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('-'," +
                        hidx + ",4,-1,1," + ConveyorIndex + ",'" + ConveyorOrder + "','-',0,'-','" + dtime + "',2)";
                    dbo.ExceSQL(Sql);
                    RecordMaxHandTaskFID(hidx);
                    Sql = "insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                            "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1) " +
                            "values(" + routeRGVIDsub + "," + (hidx + 1) + ",4," + hmindx1 + "," + RgvIndex
                            + "," + RgvOrder + "," + ConveyorIndex + ")";
                    dbo.ExceSQL(Sql);
                    Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('-'," +
                        (hidx + 1) + ",4,-1,1," + RgvIndex + ",'" + RgvOrder + "','-',0,'-','" + dtime + "',2)";
                    dbo.ExceSQL(Sql);
                    RecordMaxHandTaskFID((hidx + 1));

                }
                else
                {//RGV送货 主任务
                    Sql = "insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                           "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_Associate) " +
                           "values(" + routeRGVIDsub + "," + hidx + ",4," + hmindx + "," + RgvIndex
                           + "," + RgvOrder + "," + ConveyorIndex + "," + hmindx1 + ")";
                    dbo.ExceSQL(Sql);
                    Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('-'," +
                        (hidx) + ",4,-1,1," + RgvIndex + ",'" + RgvOrder + "','-',0,'-','" + dtime + "',2)";
                    dbo.ExceSQL(Sql);
                    RecordMaxHandTaskFID((hidx));
                    Sql = "insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                            "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1) " +
                            "values(" + routeIDsub + "," + (hidx + 1) + ",4," + hmindx1 + "," + ConveyorIndex
                            + "," + ConveyorOrder + "," + ConveyorIndex + ")";
                    dbo.ExceSQL(Sql);
                    Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('-'," +
                        (hidx + 1) + ",4,-1,1," + ConveyorIndex + ",'" + ConveyorOrder + "','-',0,'-','" + dtime + "',2)";
                    dbo.ExceSQL(Sql);
                    RecordMaxHandTaskFID((hidx + 1));


                }


                Errtext = string.Empty;
                CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                OnDataChange("BuildHandTask", cea);
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public bool BuildAutoTask(Model.AutoTask Autotask, out string Errtext)
        {
            DataView dv = new DataView();
            try
            {
                string Sql, _tasktype;
                if ((Autotask._enableStartCell == true) && (ccf.GetDeviceKindIdx(Convert.ToInt32(Autotask._startDevice)) == 10))
                {


                    if (dbo.Exists("SELECT FID FROM ST_CELL where FLaneWay=" + Autotask._startDevice + " and FCELLCODE='" + Autotask._startCell + "'") == false)
                    {
                        Errtext = "起始位置和起始货位编码在数据库中没有记录!";
                        return false;
                    }

                }
                if ((Autotask._enableEndCell == true) && (ccf.GetDeviceKindIdx(Convert.ToInt32(Autotask._endDevice)) == 10))
                {

                    if (dbo.Exists("SELECT FID FROM ST_CELL where FLaneWay=" + Autotask._endDevice + " and FCELLCODE='" + Autotask._endCell + "'") == false)
                    {
                        Errtext = "终点位置和终点货位编码在数据库中没有记录!";
                        return false;
                    }
                }
                #region AGV通道

                if ((Autotask._enableStartCell == true) && (ccf.GetDeviceKindIdx(Convert.ToInt32(Autotask._startDevice)) == 11))
                {

                    if (dbo.Exists("SELECT F_AGVGateDeviceIndex FROM T_Base_AGV_Gate WHERE (F_ChannelsIndex = " + Autotask._startDevice + ") AND (F_AGVGateDeviceIndex = " + Autotask._startCell + ")") == false)
                    {
                        Errtext = "AGV站点设备在数据库中没有记录!";
                        return false;
                    }

                }
                if ((Autotask._enableEndCell == true) && (ccf.GetDeviceKindIdx(Convert.ToInt32(Autotask._endDevice)) == 11))
                {

                    if (dbo.Exists("SELECT F_AGVGateDeviceIndex FROM T_Base_AGV_Gate WHERE (F_ChannelsIndex = " + Autotask._endDevice + ") AND (F_AGVGateDeviceIndex = " + Autotask._endCell + ")") == false)
                    {
                        Errtext = "AGV站点设备在数据库中没有记录!";
                        return false;
                    }
                }

                #endregion


                Sql = "SELECT F_RouteID FROM T_Base_Route WHERE (F_StartDevice = " + Autotask._startDevice + ") AND (F_EndDevice = " + Autotask._endDevice + ")";
                dv = dbo.ExceSQL(Sql).Tables[0].DefaultView;
                if (dv.Count <= 0)
                {
                    Errtext = "起始位置和结束位置不在有效路径的范围内!";
                    return false;
                }


                _tasktype = Autotask._controlType.ToString();
                string FSTARTCELL = Autotask._startCell, FENDCELL = Autotask._endCell, UseAwayFork = "-";
                int FSTARTDEVICE = Convert.ToInt32(Autotask._startDevice); int FENDDEVICE = Convert.ToInt32(Autotask._endDevice);
                Model.MDevice devinfo = Model.CGetInfo.GetDeviceInfo(FSTARTDEVICE);
                int flaneway = 0;
                int stackno = 0;

                //dbo.TransBegin();
                try
                {
                    if (devinfo != null)
                    {
                        int uc = 0;
                        if (int.TryParse(FSTARTCELL, out uc) == true)
                        {
                            UseAwayFork = dbo.GetSingle("SELECT F_UseAwayFork FROM T_Base_AGV_Gate WHERE ( F_AGVGateDeviceIndex= " + uc + ")").ToString();

                        }
                        if ((UseAwayFork == "-") || (UseAwayFork == null))
                        {
                            UseAwayFork = devinfo.DoubleFork;

                        }

                    }
                    if ((UseAwayFork == "-") || (UseAwayFork == null))
                    {//20110412
                        devinfo = Model.CGetInfo.GetDeviceInfo(FENDDEVICE);
                        if (devinfo != null)
                        {
                            int uc = 0;
                            if (int.TryParse(FENDCELL, out uc) == true)
                            {
                                UseAwayFork = dbo.GetSingle("SELECT F_UseAwayFork FROM T_Base_AGV_Gate WHERE ( F_AGVGateDeviceIndex= " + uc + ")").ToString();
                            }

                            if ((UseAwayFork == "-") || (UseAwayFork == null))
                            {
                                UseAwayFork = devinfo.DoubleFork;
                            }

                        }
                    }
                    StringBuilder sbs = new StringBuilder(); int FSTARTUCODE = 0; int FENDUCODE = 0;
                    sbs.Clear();
                    sbs.Append("SELECT FUCODE,FUCONVEYOR FROM ST_CELL where FCELLCODE='").Append(FSTARTCELL)
                        .Append("' and FLaneWay=").Append(FSTARTDEVICE).Append(" and FUCODE>0");
                    dv = dbo.ExceSQL(sbs.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        FSTARTUCODE = Convert.ToInt32(dv[0][0]);
                        FSTARTCELL = dv[0][1].ToString();
                    }
                    sbs.Clear();
                    sbs.Append("SELECT FUCODE,FUCONVEYOR FROM ST_CELL where FCELLCODE='").Append(FENDCELL)
                        .Append("' and FLaneWay=").Append(FENDDEVICE).Append(" and FUCODE>0");
                    dv = dbo.ExceSQL(sbs.ToString()).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        FENDUCODE = Convert.ToInt32(dv[0][0]);
                        FENDCELL = dv[0][1].ToString();
                    }
                    int a = 0;
                    bool usestartcell = false;
                    bool useendcell = false;
                    if (int.TryParse(FSTARTCELL, out a) == false)
                    {//货位编码
                        //20101124
                        sbs.Remove(0, sbs.Length);
                        sbs.Append("SELECT FLaneWay,FStack FROM ST_CELL where FCELLCODE='");
                        sbs.Append(FSTARTCELL).Append("'");
                        dv = dbo.ExceSQL(sbs.ToString()).Tables[0].DefaultView;
                        //20101124
                        if (dv.Count > 0)
                        {
                            flaneway = Convert.ToInt32(dv[0]["FLaneWay"]);
                            stackno = Convert.ToInt32(dv[0]["FStack"]);//20101028
                            usestartcell = true;

                        }

                    }

                    int iStartLayer = 0;
                    int iEndLayer = 0;
                    if (int.TryParse(FENDCELL, out a) == false)
                    {
                        //20101124
                        sbs.Remove(0, sbs.Length);
                        sbs.Append("SELECT FLaneWay,FStack FROM ST_CELL where FCELLCODE='");
                        sbs.Append(FENDCELL).Append("'");

                        dv = dbo.ExceSQL(sbs.ToString()).Tables[0].DefaultView;
                        //20101124

                        if (dv.Count > 0)
                        {
                            flaneway = Convert.ToInt32(dv[0]["FLaneWay"]);
                            stackno = Convert.ToInt32(dv[0]["FStack"]);//20101028
                            useendcell = true;

                        }

                        
                        if (_tasktype == "5")
                        {
                            iStartLayer = Convert.ToInt16(FSTARTCELL.Split('-')[2]);
                            iEndLayer = Convert.ToInt16(FENDCELL.Split('-')[2]);
                            stackno = FSTARTDEVICE;
                        }
                    }
                    string FLOGIC_AREA = string.Empty;//逻辑区域
                    if (_tasktype == "2" )//出库任务
                    {
                        FLOGIC_AREA = FENDDEVICE.ToString();
                        iStartLayer = Convert.ToInt16(FSTARTCELL.Split('-')[2]);
                    }
                    if ( _tasktype == "3")//移库任务
                    {
                        FLOGIC_AREA = FENDDEVICE.ToString();
                        iStartLayer = Convert.ToInt16(FSTARTCELL.Split('-')[2]);
                        iEndLayer = Convert.ToInt16(FENDCELL.Split('-')[2]);
                    }
                    if (_tasktype == "6")//充电任务 dzf
                    {
                        
                        stackno = FSTARTDEVICE;
                        iEndLayer = Convert.ToInt16(FENDCELL.Split('-')[2]);
                        iStartLayer = iEndLayer;
                    }
                    if (_tasktype == "1")//入库任务
                    {
                        iEndLayer = Convert.ToInt16(FENDCELL.Split('-')[2]);
                    }
                    string dtime = DateTime.Now.ToString("u");//20101028
                    dtime = dtime.Substring(0, dtime.Length - 1);//20101028
                    int AutoManageIdx = ccf.GetTempManageIdx();
                    //插入临时调度任务T_Manage_Task(监控下的调度任务):
                    Sql =
                        "insert into T_Manage_Task(FID,FPALLETBARCODE,FCONTROLTASKTYPE,F_ManageTaskKindIndex,FSTARTWAREHOUSE,FSTARTDEVICE,FSTARTCELL," +
                        "FENDWAREHOUSE,FENDDEVICE,FENDCELL,FLANEWAY,FSTACK,FUseAwayFork,FBEGTIME,FSTARTUCODE,FENDUCODE,WORK_MODE,FLOGIC_AREA,FStartLayer,FEndLayer) " +
                        "values(" + AutoManageIdx + ",'" + Autotask._palletBarcode + "','" + _tasktype + "',2,'" +
                        ccf.GetWarehouseIndex(FSTARTDEVICE, FSTARTCELL) + "','" + FSTARTDEVICE + "','" + FSTARTCELL +
                        "','" + ccf.GetWarehouseIndex(FENDDEVICE, FENDCELL) + "','"
                        + FENDDEVICE + "','" + FENDCELL + "'," + flaneway + "," + stackno + ",'" + UseAwayFork + "','" +
                        dtime + "'," + FSTARTUCODE + "," + FENDUCODE + "," + Autotask._inWorkbench + ",'" +
                        FLOGIC_AREA + "'," + iStartLayer + "," + iEndLayer + ")";//20101028
                    dbo.ExecuteSql(Sql);
                    //通知客户端更新界面

                    if (usestartcell)
                    {
                        Sql = string.Format("update ST_CELL set FRunStatus = 1 where FLaneWay= {0} and fcellcode = '{1}'", flaneway, FSTARTCELL);
                        dbo.ExceSQL(Sql);
                    }

                    if (useendcell)
                    {
                        Sql = string.Format("update ST_CELL set FRunStatus = 1 where FLaneWay= {0} and fcellcode = '{1}'", flaneway, FENDCELL);
                        dbo.ExceSQL(Sql);
                    }
                    CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                    OnDataChange("BuildAutoTask", cea);

                }
                catch (Exception ex)
                {
                    Errtext = ex.StackTrace + ex.Message;
                    return false;
                }
                Errtext = string.Empty;
                return true;
            }
            catch (Exception ex)
            {

                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public bool ModifyManageTask(int Mankind, long ManagetaskID, int ActionID, out string Errtext)
        {
            string barcode = ccf.GetBarCodeFromManageTask(ManagetaskID, Mankind);
            
            int mti = Mankind;
            long fid = ManagetaskID;

            int ControlType = ccf.GetFCONTROLTASKTYPEFromManageTask(mti, fid);//民航二所
            StringBuilder sql = new StringBuilder();//民航二所
            string cap = string.Empty;
            switch (mti)
            {
                case 1:
                    cap = "调度任务";
                    break;
                case 2:
                    cap = "自动任务";
                    break;
                case 3:
                    cap = "临时任务";
                    break;
                case 4:
                    cap = "手工任务";
                    break;
            }
            DataView dv = new DataView(); DataView dvaa = new DataView();
            DataTable tableAGVGate = new DataTable();
            //dbo.TransBegin();
            try
            {

                var client = (IClient)OperationContext.Current.Channel;
                string userDescription = ClientCallbackLists[client].ToString();
                //string userID = ClientShowLists[client].ToString();
                #region 报告完成

                if (ActionID == Model.CGeneralFunction.TASKFINISH)
                {
                    dbo.ExceSQL(string.Format("update T_Monitor_Task set F_STATUS=-1 where F_ManageTaskKindIndex={0} and F_ManageTaskIndex={1} and F_STATUS=0", mti, fid));
                    dv = dbo.ExceSQL(string.Format("SELECT F_ManageTaskKindIndex, F_ManageTaskIndex,F_DeviceIndex,F_MonitorIndex,F_Status,F_DeviceCommandIndex " +
                        ",F_NumParam2,F_NumParam5,F_TxtParam FROM T_Monitor_Task Where  F_ManageTaskIndex={0} and F_ManageTaskKindIndex={1} ", fid, mti)).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {//有调度任务

                        //20100108
                        CommonClassLib.CCarryConvert.WriteDarkCasket("调度任务管理", "调度任务手工报告完成", "托盘条码:" + barcode, "调度任务索引:" + fid.ToString() + "," + userDescription);
                        for (int i = 0; i < dv.Count; i++)
                        {
                            if (ccf.GetDeviceKindIdx(Convert.ToInt32(dv[i]["F_DeviceIndex"])) == 6)
                            {
                                cgs.ActionComplete(Convert.ToInt32(dv[i]["F_DeviceIndex"]), Convert.ToInt32(dv[i]["F_MonitorIndex"]), Model.CGeneralFunction.TASKFINISH);
                                //1	辅料出库;2	空托盘回收;3残托盘回收
                                if (Convert.ToInt32(dv[i]["F_DeviceCommandIndex"]) == 1)
                                {
                                    tableAGVGate = dbo.ExceSQL("SELECT F_AGVGateDeviceIndex FROM T_BASE_AGV_GATE WHERE F_ADDRESS = " + Convert.ToInt32(dv[i]["F_NumParam5"]) + "").Tables[0];
                                    if (tableAGVGate.Rows.Count > 0)
                                    {

                                        dbo.ExecuteSql("UPDATE T_BASE_DEVICE SET F_PALLETBARCODE='" + dv[i]["F_TxtParam"] + "',F_HAVEGOODS = 1 WHERE F_DEVICEINDEX = " + Convert.ToInt32(tableAGVGate.Rows[0]["F_AGVGateDeviceIndex"]) + "");

                                    }
                                }
                                if ((Convert.ToInt32(dv[i]["F_DeviceCommandIndex"]) == 2) || (Convert.ToInt32(dv[i]["F_DeviceCommandIndex"]) == 3))
                                {
                                    tableAGVGate = dbo.ExceSQL("SELECT F_AGVGateDeviceIndex FROM T_BASE_AGV_GATE WHERE F_ADDRESS = " + Convert.ToInt32(dv[i]["F_NumParam2"]) + "").Tables[0];
                                    if (tableAGVGate.Rows.Count > 0)
                                    {
                                        //if (mti == 1)
                                        //{
                                        //    //20090817给管理置无托盘信息
                                        //    dboM.ExecuteSql("UPDATE T_ITEMDEVICE SET devicestatus  ='0' WHERE devicecode = '" + tableAGVGate.Rows[0]["F_AGVGateDeviceIndex"] + "'");
                                        //}
                                        dbo.ExecuteSql("UPDATE T_BASE_DEVICE SET F_PALLETBARCODE='-',F_HAVEGOODS = 0 WHERE F_DEVICEINDEX = " + Convert.ToInt32(tableAGVGate.Rows[0]["F_AGVGateDeviceIndex"]) + "");

                                    }
                                }
                            }
                            else
                            {
                                if (Convert.ToInt32(dv[i]["F_Status"]) >= 1)
                                {
                                    cgs.ActionComplete(Convert.ToInt32(dv[i]["F_DeviceIndex"]), Convert.ToInt32(dv[i]["F_MonitorIndex"]), 1);
                                }
                                else
                                {
                                    cgs.ActionComplete(Convert.ToInt32(dv[i]["F_DeviceIndex"]), Convert.ToInt32(dv[i]["F_MonitorIndex"]), Model.CGeneralFunction.TASKFINISH);
                                }
                            }
                        }
                    }
                    else
                    {


                        //回写管理表

                        cgs.ReturnManageInfo(fid, mti, cap, true);
                        if (mti == 1)
                        {
                            dboMan.ExceSQL("update IO_Control set  Control_STATUS=" + Model.CGeneralFunction.TASKFINISH + " where Control_ID=" + fid);

                            //#region  民航二所 调用wms接口 上报状态——任务完成/删除(共3处)(如果存在该任务其他状态,则删掉)
                            //if (ControlType != 5 && ControlType != 6)
                            //{
                            //    int status = 0;

                            //    status = 999;


                            //    string dTime1 = DateTime.Now.ToString("u");
                            //    dTime1 = dTime1.Substring(0, dTime1.Length - 1);

                            //    object[] ob = new object[8] { fid, status, 0, barcode, status, dTime1, "", 1.ToString() };
                            //    try
                            //    {
                            //        sql.Clear();
                            //        sql.Append("select * from io_control_apply where CONTROL_ID = ").Append(fid);
                            //        if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)

                            //        {
                            //            sql.Clear();
                            //            sql.Append(" delete from io_control_apply where  CONTROL_ID = ").Append(fid);
                            //            dbo.ExceSQL(sql.ToString());
                            //        }

                            //        dbo.ExecuteSql(string.Format("INSERT INTO IO_CONTROL_APPLY(CONTROL_ID,CONTROL_APPLY_TYPE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK,WAREHOUSE_CODE)VALUES ({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}')", ob));
                            //        CommonClassLib.CCarryConvert.WriteDarkCasket("ModifyManageTask", "向管理上报任务状态:", fid.ToString(), ",状态:" + status.ToString() + ",条码:" + barcode.ToString().ToUpper() + ",申请类型:" + status.ToString());
                            //    }
                            //    catch (Exception ex)
                            //    {
                            //        RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理上报任务状态:" + ex.StackTrace + ex.Message);
                            //        OnRefreshMonitor(rmea);
                            //        CommonClassLib.CCarryConvert.WriteDarkCasket("ModifyManageTask", "向管理上报任务状态:出错", fid.ToString(), ",状态:" + status.ToString() + ",条码:" + barcode.ToString().ToUpper() + ",申请类型:" + status.ToString());

                            //    }
                            //}
                            //#endregion
                        }
                    }


                }

                #endregion

                #region 报告删除

                else if (ActionID == Model.CGeneralFunction.TASKDELETE)
                {
                    dv = dbo.ExceSQL("SELECT F_ManageTaskKindIndex, F_ManageTaskIndex,F_DeviceIndex,F_MonitorIndex,F_Status,F_DeviceCommandIndex " +
                   ",F_NumParam2,F_NumParam5,F_TxtParam FROM T_Monitor_Task Where  F_ManageTaskIndex=" + fid + " and F_ManageTaskKindIndex= " +
                   mti).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {
                        if ((ccf.GetDeviceKindIdx(Convert.ToInt32(dv[0]["F_DeviceIndex"])) == 6) && (Convert.ToInt32(dv[0]["F_Status"]) > 0))
                        {//20110110
                            //StringBuilder sql = new StringBuilder();
                            sql.Remove(0, sql.Length);
                            sql.Append("SELECT  F_DeviceIndex,F_DeviceKindIndex, F_LocalIP,  F_LocalPort, F_RemoteIP,  F_RemotePort  FROM T_Base_Device where F_DeviceIndex=").Append(Convert.ToInt32(dv[0]["F_DeviceIndex"]));
                            dvaa = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                            if (dvaa.Count > 0)
                            {
                                byte[] _Sdata = new byte[16];

                                _Sdata[0] = Convert.ToByte(60006 & 255);
                                _Sdata[1] = Convert.ToByte((60006 >> 8) & 255);
                                _Sdata[2] = Convert.ToByte((60006 >> 16) & 255);
                                _Sdata[3] = Convert.ToByte((60006 >> 24) & 255);
                                _Sdata[4] = Convert.ToByte(Convert.ToInt32(dv[0]["F_ManageTaskIndex"]) & 255);
                                _Sdata[5] = Convert.ToByte((Convert.ToInt32(dv[0]["F_ManageTaskIndex"]) >> 8) & 255);
                                _Sdata[6] = Convert.ToByte((Convert.ToInt32(dv[0]["F_ManageTaskIndex"]) >> 16) & 255);
                                _Sdata[7] = Convert.ToByte((Convert.ToInt32(dv[0]["F_ManageTaskIndex"]) >> 24) & 255);
                                _Sdata[8] = Convert.ToByte(Convert.ToInt32(dv[0]["F_MonitorIndex"]) & 255);
                                _Sdata[9] = Convert.ToByte((Convert.ToInt32(dv[0]["F_MonitorIndex"]) >> 8) & 255);
                                _Sdata[10] = Convert.ToByte((Convert.ToInt32(dv[0]["F_MonitorIndex"]) >> 16) & 255);
                                _Sdata[11] = Convert.ToByte((Convert.ToInt32(dv[0]["F_MonitorIndex"]) >> 24) & 255);
                                int ck = 60006 + Convert.ToInt32(dv[0]["F_ManageTaskIndex"]) + Convert.ToInt32(dv[0]["F_MonitorIndex"]);
                                _Sdata[12] = Convert.ToByte(ck & 255);
                                _Sdata[13] = Convert.ToByte((ck >> 8) & 255);
                                _Sdata[14] = Convert.ToByte((ck >> 16) & 255);
                                _Sdata[15] = Convert.ToByte((ck >> 24) & 255);
                                SocketsTCPIP.CClientTCPIP.Send(dvaa[0]["F_RemoteIP"].ToString(), Convert.ToInt32(dvaa[0]["F_RemotePort"]), _Sdata);


                            }

                            Errtext = string.Empty;
                            return true; ;
                        }
                    }
                    //20110222CGetState cgs = new CGetState();
                    //20090902
                    dbo.ExceSQL("update T_Manage_Task set FExceptionNO=" + Model.CGeneralFunction.TASKDELETE + " where (F_ManageTaskKindIndex = " + mti + ") AND (FID = " + fid + ")");

                    dbo.ExceSQL("update T_Monitor_Task set F_STATUS=-1 where F_ManageTaskKindIndex=" + mti + " and F_ManageTaskIndex=" + fid + " and F_STATUS=0");
                    //20110110
                    dv = dbo.ExceSQL("SELECT F_ManageTaskKindIndex, F_ManageTaskIndex,F_DeviceIndex,F_MonitorIndex,F_Status,F_DeviceCommandIndex " +
                        ",F_NumParam2,F_NumParam5,F_TxtParam FROM T_Monitor_Task Where  F_ManageTaskIndex=" + fid + " and F_ManageTaskKindIndex= " +
                        mti).Tables[0].DefaultView;
                    if (dv.Count > 0)
                    {

                        //20100108
                        CommonClassLib.CCarryConvert.WriteDarkCasket("调度任务管理", "调度任务被手工删除!", "托盘条码:" + barcode, "调度任务索引:" + fid.ToString() + "," + userDescription);
                        for (int i = 0; i < dv.Count; i++)
                        {
                            if (ccf.GetDeviceKindIdx(Convert.ToInt32(dv[i]["F_DeviceIndex"])) == 6)
                            {
                                cgs.ActionComplete(Convert.ToInt32(dv[i]["F_DeviceIndex"]), Convert.ToInt32(dv[i]["F_MonitorIndex"]), Model.CGeneralFunction.TASKDELETE);
                                //1	辅料出库;2	空托盘回收;3残托盘回收

                                if ((Convert.ToInt32(dv[i]["F_DeviceCommandIndex"]) == 2) || (Convert.ToInt32(dv[i]["F_DeviceCommandIndex"]) == 3))
                                {
                                    tableAGVGate = dbo.ExceSQL("SELECT F_AGVGateDeviceIndex FROM T_BASE_AGV_GATE WHERE F_ADDRESS = " + Convert.ToInt32(dv[i]["F_NumParam2"]) + "").Tables[0];
                                    if (tableAGVGate.Rows.Count > 0)
                                    {

                                        dbo.ExecuteSql("UPDATE T_BASE_DEVICE SET F_PALLETBARCODE='" + dv[i]["F_TxtParam"] + "',F_HAVEGOODS = 1 WHERE F_DEVICEINDEX = " + Convert.ToInt32(tableAGVGate.Rows[0]["F_AGVGateDeviceIndex"]) + "");

                                    }
                                }
                            }
                            else
                            {
                                if (Convert.ToInt32(dv[i]["F_Status"]) >= 1)
                                {
                                    int fstatus = 1;

                                    cgs.ActionComplete(Convert.ToInt32(dv[i]["F_DeviceIndex"]), Convert.ToInt32(dv[i]["F_MonitorIndex"]), fstatus);
                                }
                                else
                                {
                                    cgs.ActionComplete(Convert.ToInt32(dv[i]["F_DeviceIndex"]), Convert.ToInt32(dv[i]["F_MonitorIndex"]), Model.CGeneralFunction.TASKDELETE);
                                }
                            }
                        }
                    }
                    else
                    {//20110412

                        CommonClassLib.CCarryConvert.WriteDarkCasket("调度任务管理", "调度任务被手工删除!", "托盘条码:" + barcode, "调度任务索引:" + fid.ToString() + "," + userDescription);


                        //回写管理表
                        cgs.ReturnManageInfo(fid, mti, cap, false);
                        if (mti == 1)
                        {

                            dboMan.ExceSQL("update IO_Control set Control_STATUS=" + Model.CGeneralFunction.TASKDELETE + " where Control_ID=" + fid);

                            //#region  民航二所 调用wms接口 上报状态——任务完成/删除(共3处)(如果存在该任务其他状态,则删掉)
                            //if (ControlType != 5 && ControlType != 6)
                            //{
                            //    int status = 0;
                                
                            //     status = 900;
                                

                            //    string dTime1 = DateTime.Now.ToString("u");
                            //    dTime1 = dTime1.Substring(0, dTime1.Length - 1);

                            //    object[] ob = new object[8] { fid, status, 0, barcode, status, dTime1, "", 1.ToString() };
                            //    try
                            //    {
                            //        sql.Clear();
                            //        sql.Append("select * from io_control_apply where CONTROL_ID = ").Append(fid);
                            //        if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)

                            //        {
                            //            sql.Clear();
                            //            sql.Append(" delete from io_control_apply where  CONTROL_ID = ").Append(fid);
                            //            dbo.ExceSQL(sql.ToString());
                            //        }

                            //        dbo.ExecuteSql(string.Format("INSERT INTO IO_CONTROL_APPLY(CONTROL_ID,CONTROL_APPLY_TYPE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK,WAREHOUSE_CODE)VALUES ({0},'{1}','{2}','{3}','{4}','{5}','{6}','{7}')", ob));
                            //        CommonClassLib.CCarryConvert.WriteDarkCasket("ModifyManageTask", "向管理上报任务状态:", fid.ToString(), ",状态:" + status.ToString() + ",条码:" + barcode.ToString().ToUpper() + ",申请类型:" + status.ToString());
                            //    }
                            //    catch (Exception ex)
                            //    {
                            //        RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理上报任务状态:" + ex.StackTrace + ex.Message);
                            //        OnRefreshMonitor(rmea);
                            //        CommonClassLib.CCarryConvert.WriteDarkCasket("ModifyManageTask", "向管理上报任务状态:出错", fid.ToString(), ",状态:" + status.ToString() + ",条码:" + barcode.ToString().ToUpper() + ",申请类型:" + status.ToString());

                            //    }
                            //}
                            //#endregion
                        }
                    }
                }

                #endregion
                //dbo.TransCommit();
                CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                OnDataChange("SControlMonitor", cea);
                Errtext = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                //dbo.TransRollback();
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
                dvaa.Dispose();
                tableAGVGate.Dispose();
            }
        }
        public bool ModifyMonitorTask(int DeviceIndex, int MonitortaskID, int ActionID, out string Errtext)
        {

            int resetOrder = 4;//故障复位
            DataView dv = new DataView(); DataView dv1 = new DataView(); DataView dv2 = new DataView(); DataView dv3 = new DataView();
            try
            {
                var client = (IClient)OperationContext.Current.Channel;
                string userDescription = ClientCallbackLists[client].ToString();
                //string userID = ClientShowLists[client].ToString();

                int mankind = ccf.GetManageTaskKindIndexFromMonitor(MonitortaskID);
                long fid = ccf.GetManageTaskIndexfromMonitor(MonitortaskID);
                dv = dbo.ExceSQL("SELECT * FROM T_Monitor_Task Where F_MonitorIndex=" +
                MonitortaskID).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    if (ActionID == Model.CGeneralFunction.TASKFINISH)
                    {
                        #region 指令完成


                        CommonClassLib.CCarryConvert.WriteDarkCasket("设备指令管理", "手工报告完成", "托盘条码:" + dv[0]["F_TxtParam"].ToString(), "设备索引:" + dv[0]["F_DeviceIndex"].ToString() + ";设备指令索引:" + MonitortaskID.ToString() + "," + userDescription);
                        cgs.ActionComplete(DeviceIndex, MonitortaskID, Convert.ToInt32(dv[0]["F_Status"]));
                        //20111226有RGV的关联任务是接货定堆垛机货叉,不允许报告关联任务完成
                        #endregion
                    }
                    else if (ActionID == Model.CGeneralFunction.TASKDELETE)
                    {
                        #region 指令删除
                        CommonClassLib.CCarryConvert.WriteDarkCasket("设备指令管理", "手工删除设备指令", "托盘条码:" + dv[0]["F_TxtParam"].ToString(), "设备索引:" + dv[0]["F_DeviceIndex"].ToString() + ";设备指令索引:" + MonitortaskID.ToString() + "," + userDescription);
                        cgs.ActionComplete(Convert.ToInt32(dv[0]["F_DeviceIndex"]), Convert.ToInt32(dv[0]["F_MonitorIndex"]), Model.CGeneralFunction.TASKDELETE);

                        #endregion
                    }
                    else if (ActionID == Model.CGeneralFunction.TASKRESTORE)
                    {
                        #region 指令重发
                        int mindex = MonitortaskID;
                        int DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                        int devKind = ccf.GetDeviceKindIdx(DeviceIdx);
                        string sss = "设备索引:" + dv[0]["F_DeviceIndex"].ToString() + ";设备指令索引:" + dv[0]["F_MonitorIndex"].ToString() + "," + userDescription;
                        //20100108操作黑匣子增加托盘条码
                        CommonClassLib.CCarryConvert.WriteDarkCasket("设备指令管理", "手工复位", "托盘条码:" + dv[0]["F_TxtParam"].ToString(), sss);
                        //检查关联命令一起复位
                        //如果mindex是主动任务(f_associatemonitor有数据),先复位被动的任务;如果mindex是被动任务,先复位自己,再复位主动任务;
                        dv1 = dbo.ExceSQL("select F_DeviceIndex,F_Associate from T_Monitor_Task where F_Associate IS NOT NULL and F_MonitorIndex=" + mindex).Tables[0].DefaultView;
                        if (dv1.Count > 0)
                        {
                            dv2 = dbo.ExceSQL("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_MonitorIndex=" + Convert.ToInt32(dv1[0]["F_Associate"])).Tables[0].DefaultView;
                            if (dv2.Count > 0)//有关联命令,先复位关联命令
                            {

                                DeviceIdx = Convert.ToInt32(dv2[0]["F_DeviceIndex"]);
                                SendDeviceReset(out Errtext, DeviceIdx, resetOrder);
                                SendDeviceReset(out Errtext, DeviceIdx, 2);
                                dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv2[0]["F_DeviceIndex"]));
                                dbo.ExceSQL("update T_Monitor_Task set F_SendCount=0,F_Status=0 where F_MonitorIndex=" + Convert.ToInt32(dv2[0]["F_MonitorIndex"]));
                            }
                            //再复位自己
                            DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                            SendDeviceReset(out Errtext, DeviceIdx, resetOrder);
                            SendDeviceReset(out Errtext, DeviceIdx, 2);
                            dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv[0]["F_DeviceIndex"]));
                            dbo.ExceSQL("update T_Monitor_Task set F_SendCount=0,F_Status=0 where F_MonitorIndex=" + Convert.ToInt32(dv[0]["F_MonitorIndex"]));

                        }
                        else
                        {

                            //自己是否被关联,先复位自己,再复位主任务
                            dv3 = dbo.ExceSQL("select F_DeviceIndex,F_MonitorIndex from T_Monitor_Task where F_Associate ='" + mindex + "'").Tables[0].DefaultView;
                            if (dv3.Count > 0)
                            {   //先复位自己
                                DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                                SendDeviceReset(out Errtext, DeviceIdx, resetOrder);
                                SendDeviceReset(out Errtext, DeviceIdx, 2);
                                dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv[0]["F_DeviceIndex"]));
                                dbo.ExceSQL("update T_Monitor_Task set F_SendCount=0,F_Status=0 where F_MonitorIndex=" + mindex);
                                //再复位主任务
                                DeviceIdx = Convert.ToInt32(dv3[0]["F_DeviceIndex"]);
                                SendDeviceReset(out Errtext, DeviceIdx, resetOrder);
                                SendDeviceReset(out Errtext, DeviceIdx, 2);
                                dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv3[0]["F_DeviceIndex"]));
                                dbo.ExceSQL("update T_Monitor_Task set F_SendCount=0,F_Status=0 where F_MonitorIndex=" + Convert.ToInt32(dv3[0]["F_MonitorIndex"]));
                            }
                            else
                            {
                                //无关联任务,只复位自己
                                DeviceIdx = Convert.ToInt32(dv[0]["F_DeviceIndex"]);
                                SendDeviceReset(out Errtext, DeviceIdx, resetOrder);
                                SendDeviceReset(out Errtext, DeviceIdx, 2);
                                dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + Convert.ToInt32(dv[0]["F_DeviceIndex"]));
                                dbo.ExceSQL("update T_Monitor_Task set F_SendCount=0,F_Status=0 where F_MonitorIndex=" + mindex);
                            }
                        }
                        //给管理FERRORCODE清空
                        if (mankind == 1)
                        {
                            dboMan.ExceSQL("UPDATE IO_CONTROL  SET  ERROR_TEXT =''  WHERE CONTROL_ID=" + fid + "");
                        }
                        dbo.ExceSQL("UPDATE T_Manage_Task  SET  FERRORCODE =''  WHERE FID=" + fid + " and F_ManageTaskKindIndex=" + mankind + "");
                        CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                        OnDataChange("TASKRESTORE", cea);
                        #endregion
                    }
                }
                Errtext = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
                dv1.Dispose();
                dv2.Dispose();
                dv3.Dispose();
            }
        }
        public bool ModifyManageTaskFork(int Flag, int FarForkTaskID, int NearForkTaskID, out string Errtext)
        {

            DataView dv = new DataView();
            string managesql, monitorsql;
            int relID = NearForkTaskID;//双叉、近叉任务时的关联任务

            //入库任务需要更改堆垛机的取货坐标,提前检测信息
            //出库任务还需要更改堆垛机的送货坐标,提前检测信息,送出指令的设备编号和坐标

            if (Flag == 2)//远叉任务的关联任务
            {
                relID = FarForkTaskID;
            }

            try
            {
                var client = (IClient)OperationContext.Current.Channel;
                string userDescription = ClientCallbackLists[client].ToString();

                if (FarForkTaskID != 0)//设置远叉
                {

                    managesql = string.Format("update T_Manage_Task set FUseAwayFork=2,F_RELATIVECONTORLID={0} where FID ={1}", relID, FarForkTaskID);
                    monitorsql = string.Format("update T_Monitor_Task set F_UseAwayFork= 2 where F_ManageTaskIndex= {0}", FarForkTaskID);
                    dbo.ExecuteSql(managesql);
                    dbo.ExecuteSql(monitorsql);
                }

                if (NearForkTaskID != 0)//设置近叉
                {
                    managesql = string.Format("update T_Manage_Task set FUseAwayFork=1,F_RELATIVECONTORLID={0} where FID ={1}", relID, NearForkTaskID);
                    monitorsql = string.Format("update T_Monitor_Task set F_UseAwayFork= 1 where F_ManageTaskIndex= {0}", NearForkTaskID);
                    dbo.ExecuteSql(managesql);
                    dbo.ExecuteSql(monitorsql);
                }

                CommonClassLib.CCarryConvert.WriteDarkCasket("货叉管理", "手工双叉任务关联", "1叉任务索引:" + NearForkTaskID.ToString(), "2叉任务索引:" + FarForkTaskID.ToString() + "," + userDescription);

                Errtext = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();

            }

        }
        public bool SetDeviceState(Model.MDevice Devinfo, out string Errtext)
        {
            try
            {

                int lockstate = 0;
                long manTaskReserve = Devinfo.ManTaskReserve;
                int chargeLock = Devinfo.Switch_Lock;
                int errcode = 0;
                if (Devinfo.RunState == 4)
                {
                    lockstate = -1;
                    errcode = 998;
                }
                else
                {
                    errcode = Devinfo.ErrorCode;
                    lockstate = Devinfo.RunState;
                }

                object[] ob = new object[5] { lockstate, errcode, manTaskReserve, chargeLock, Devinfo.DeviceIndex };
                dbo.ExecuteSql(string.Format("UPDATE T_Base_Device SET F_LockedState ={0},f_errorcode={1},F_ManTaskReserve ={2},F_SwitchLock = {3}  where F_DeviceIndex= {4}", ob));
                Model.CGetInfo.SetDeviceInfo(Devinfo);
                Model.CGetInfo.SetModifyPathDeviceInfo(Devinfo);//晟碟
                CDeviceStateChangeEventArgs csce = new CDeviceStateChangeEventArgs(Devinfo);
                OnDeviceState("SControlMonitor.SetDeviceState", csce);
                Errtext = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public Model.MDevice GetDeviceInfo(int Deviceindex, out string Errtext)
        {
            try
            {

                Errtext = string.Empty;
                return Model.CGetInfo.GetDeviceInfo(Deviceindex);
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return null;
            }
        }
        public DataTable GetDeviceInfos(string errorcode, out string Errtext)
        {
            DataView dv = new DataView();
            try
            {

                dv = dbo.ExceSQL(string.Format("SELECT T_Base_Device.F_DeviceIndex,F_DeviceName,T_Base_Device.F_DeviceKindIndex,F_DeviceKindName,F_LockedState,F_errorcode,F_ManTaskReserve,F_HaveGoods FROM  T_Base_Device,T_Base_Device_Kind Where T_Base_Device.F_DeviceKindIndex = T_Base_Device_Kind.F_DeviceKindIndex and  '{0}'", errorcode)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    Errtext = string.Empty;
                    return dv.Table;
                }
                else
                {
                    Errtext = "没有符合条件“" + errorcode + "”的设备信息!";
                    return null;
                }



            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return null;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public bool SetRouteState(Model.MRoute Routeinfo, out string Errtext)
        {
            try
            {
                dbo.ExecuteSql(string.Format("update T_Base_Route  set  f_status={0} where F_RouteID={1}", Routeinfo.Status, Routeinfo.RouteID));
                dboMan.ExecuteSql(string.Format("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS={0} where CONTROL_ROUTE_ID={1}", Routeinfo.Status, Routeinfo.RouteID));
                Errtext = string.Empty;
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public Model.MRoute GetRouteInfo(decimal RouteID, out string Errtext)
        {
            DataView dv = new DataView();
            try
            {
                Errtext = string.Empty;
                Model.MRoute mr = new Model.MRoute();
                dv = dbo.ExceSQL(string.Format("SELECT F_RouteID, F_RouteName, F_StartDevice, F_EndDevice, F_RouteKind,  F_OutsideAltDevice, F_InsideAltDevice, F_Status, F_AutoUpdate FROM T_Base_Route where F_RouteID={0}", RouteID)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    mr.RouteID = RouteID;
                    mr.RouteName = dv[0]["F_RouteName"].ToString();
                    mr.StartDevice = Convert.ToDecimal(dv[0]["F_StartDevice"]);
                    mr.EndDevice = Convert.ToDecimal(dv[0]["F_EndDevice"]);
                    mr.RouteKind = Convert.ToInt32(dv[0]["F_RouteKind"]);
                    mr.OutsideAltDevice = Convert.ToInt32(dv[0]["F_OutsideAltDevice"]);
                    mr.InsideAltDevice = Convert.ToInt32(dv[0]["F_InsideAltDevice"]);
                    mr.Status = Convert.ToInt32(dv[0]["F_Status"]);
                    mr.AutoUpdate = Convert.ToChar(dv[0]["F_AutoUpdate"]);
                    return mr;
                }
                else
                {
                    Errtext = "路径编号在数据库不存在!";
                    return null;
                }

            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return null;
            }
            finally
            {
                dv.Dispose();
            }
        }
        public Model.MRoute[] GetRouteInfos(int RouteState, out string Errtext)
        {
            DataView dv = new DataView();
            try
            {
                Model.MRoute[] mrs;
                Model.MRoute mr = new Model.MRoute();
                Errtext = string.Empty;
                dv = dbo.ExceSQL(string.Format("SELECT F_RouteID, F_RouteName, F_StartDevice, F_EndDevice, F_RouteKind,  F_OutsideAltDevice, F_InsideAltDevice, F_Status, F_AutoUpdate FROM T_Base_Route where F_Status={0}", RouteState)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    mrs = new Model.MRoute[dv.Count];
                    for (int i = 0; i < dv.Count; i++)
                    {
                        mr.RouteID = Convert.ToDecimal(dv[i]["F_RouteID"]); ;
                        mr.RouteName = dv[i]["F_RouteName"].ToString();
                        mr.StartDevice = Convert.ToDecimal(dv[i]["F_StartDevice"]);
                        mr.EndDevice = Convert.ToDecimal(dv[i]["F_EndDevice"]);
                        mr.RouteKind = Convert.ToInt32(dv[i]["F_RouteKind"]);
                        mr.OutsideAltDevice = Convert.ToInt32(dv[i]["F_OutsideAltDevice"]);
                        mr.InsideAltDevice = Convert.ToInt32(dv[i]["F_InsideAltDevice"]);
                        mr.Status = Convert.ToInt32(dv[i]["F_Status"]);
                        mr.AutoUpdate = Convert.ToChar(dv[i]["F_AutoUpdate"]);
                        mrs[i] = mr;
                    }
                    return mrs;

                }
                else
                {
                    Errtext = "路径状态在数据库不存在!";
                    return null;
                }

            }
            catch (Exception ex)
            {

                Errtext = ex.StackTrace + ex.Message;
                return null;
            }
            finally
            {
                dv.Dispose();
            }

        }
        public bool SetForkCombinWaitTime(int WaitTime, out string Errtext)
        {
            try
            {
                Errtext = string.Empty;

                CommonClassLib.AppSettings.SetValue("DoubleForkWaitTime", WaitTime.ToString());
                CStaticClass.DoubleForkWaitTime = WaitTime.ToString();
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public int GetForkCombinWaitTime(out string Errtext)
        {
            try
            {
                int a = -1; Errtext = string.Empty;
                int.TryParse(CommonClassLib.AppSettings.GetValue("DoubleForkWaitTime"), out a);
                return a;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return -1;
            }


        }
        public bool SetConveyorTimeOutTime(int Timeout, out string Errtext)
        {
            try
            {
                Errtext = string.Empty;

                CommonClassLib.AppSettings.SetValue("TransportTimeout", Timeout.ToString());
                CStaticClass.TransportTimeout = Timeout.ToString();
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public int GetConveyorTimeOutTime(out string Errtext)
        {
            try
            {
                int a = -1; Errtext = string.Empty;
                int.TryParse(CommonClassLib.AppSettings.GetValue("TransportTimeout"), out a);
                return a;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return -1;
            }
        }
        public bool SetDBConnection(string MonitorOrManageDB, string ServerHostName, string DBServiceName, string Username, string Password, out string Errtext)
        {
            try
            {
                string dbf = dbo.GetValue("DBFactory");
                string[] temp, connstr;
                string server = "", dbService = "", uid = "", pwd = "";
                char[] dh = new char[1] { '=' };
                char[] fh = new char[1] { ';' };
                Errtext = string.Empty;
                if (MonitorOrManageDB == "Manage")
                {
                    dbf = dbo.GetValue("ManDBFactory");

                    connstr = dbo.GetValue("ManConnString").Split(fh);

                }
                else //if (MonitorOrManageDB == "Monitor")
                {
                    dbf = dbo.GetValue("DBFactory");

                    connstr = dbo.GetValue("ConnString").Split(fh);
                }
                for (int i = connstr.GetLowerBound(0); i <= connstr.GetUpperBound(0); i++)
                {
                    temp = connstr[i].Split(dh);
                    switch (dbf)
                    {
                        case "SQLServerDBFactory":

                            //"Server = (local) ; uid = SA ; pwd =; database = SSWCMS ; MAX Pool Size = 512 "
                            switch (temp[0].Trim())
                            {
                                case "Server":
                                    server = temp[1].Trim();
                                    break;
                                case "database":
                                    dbService = temp[1].Trim();
                                    break;
                                case "uid":
                                    uid = temp[1].Trim();
                                    break;
                                case "pwd":
                                    pwd = temp[1].Trim();
                                    break;
                            }

                            break;

                        case "OracleDBFactory":

                            //"Data Source=Richard-liu;User ID=pdadmin;Password=pdadmin ; MAX Pool Size = 512 "
                            switch (temp[0].Trim())
                            {
                                case "Data Source":
                                    dbService = temp[1].Trim();
                                    break;
                                case "User ID":
                                    uid = temp[1].Trim();
                                    break;
                                case "Password":
                                    pwd = temp[1].Trim();
                                    break;
                                default:
                                    server = "127.0.0.1";
                                    break;
                            }
                            break;
                        case "OleDBFactory":
                            //"Provider=OraOLEDB.Oracle.1;Data Source=Richard-liu;User ID=sa;Password= ; MAX Pool Size = 512 "

                            switch (temp[0].Trim())
                            {
                                case "Data Source":
                                    dbService = temp[1].Trim();
                                    break;
                                case "User ID":
                                    uid = temp[1].Trim();
                                    break;
                                case "Password":
                                    pwd = temp[1].Trim();
                                    break;
                                case "Provider":
                                    server = temp[1].Trim();
                                    break;
                            }
                            break;
                        default:

                            //"Server = (local) ; uid = SA ; pwd =; database = SSWCMS ; MAX Pool Size = 512 "
                            switch (temp[0].Trim())
                            {
                                case "Server":
                                    server = temp[1].Trim();
                                    break;
                                case "database":
                                    dbService = temp[1].Trim();
                                    break;
                                case "uid":
                                    uid = temp[1].Trim();
                                    break;
                                case "pwd":
                                    pwd = temp[1].Trim();
                                    break;
                                default:
                                    server = "(local)";
                                    uid = "SA";

                                    dbService = "SSWCMS";
                                    break;
                            }


                            break;
                    }
                }
                return true;

            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public bool GetDBConnection(string MonitorOrManageDB, out string ServerHostName, out string DBServiceName, out string Username, out string Password, out string Errtext)
        {
            try
            {
                Errtext = string.Empty;
                string dbf = dbo.GetValue("DBFactory");
                string[] temp, connstr;
                string server = "", dbService = "", uid = "", pwd = "";
                char[] dh = new char[1] { '=' };
                char[] fh = new char[1] { ';' };
                if (MonitorOrManageDB == "Manage")
                {
                    dbf = dbo.GetValue("ManDBFactory");

                    connstr = dbo.GetValue("ManConnString").Split(fh);

                }
                else //if (MonitorOrManageDB == "Monitor")
                {
                    dbf = dbo.GetValue("DBFactory");

                    connstr = dbo.GetValue("ConnString").Split(fh);
                }
                for (int i = connstr.GetLowerBound(0); i <= connstr.GetUpperBound(0); i++)
                {
                    temp = connstr[i].Split(dh);
                    switch (dbf)
                    {
                        case "SQLServerDBFactory":

                            //"Server = (local) ; uid = SA ; pwd =; database = SSWCMS ; MAX Pool Size = 512 "
                            switch (temp[0].Trim())
                            {
                                case "Server":
                                    server = temp[1].Trim();
                                    break;
                                case "database":
                                    dbService = temp[1].Trim();
                                    break;
                                case "uid":
                                    uid = temp[1].Trim();
                                    break;
                                case "pwd":
                                    pwd = temp[1].Trim();
                                    break;
                            }

                            break;

                        case "OracleDBFactory":

                            //"Data Source=Richard-liu;User ID=pdadmin;Password=pdadmin ; MAX Pool Size = 512 "
                            switch (temp[0].Trim())
                            {
                                case "Data Source":
                                    dbService = temp[1].Trim();
                                    break;
                                case "User ID":
                                    uid = temp[1].Trim();
                                    break;
                                case "Password":
                                    pwd = temp[1].Trim();
                                    break;
                                default:
                                    server = "127.0.0.1";
                                    break;
                            }
                            break;
                        case "OleDBFactory":
                            //"Provider=OraOLEDB.Oracle.1;Data Source=Richard-liu;User ID=sa;Password= ; MAX Pool Size = 512 "

                            switch (temp[0].Trim())
                            {
                                case "Data Source":
                                    dbService = temp[1].Trim();
                                    break;
                                case "User ID":
                                    uid = temp[1].Trim();
                                    break;
                                case "Password":
                                    pwd = temp[1].Trim();
                                    break;
                                case "Provider":
                                    server = temp[1].Trim();
                                    break;
                            }
                            break;
                        default:

                            //"Server = (local) ; uid = SA ; pwd =; database = SSWCMS ; MAX Pool Size = 512 "
                            switch (temp[0].Trim())
                            {
                                case "Server":
                                    server = temp[1].Trim();
                                    break;
                                case "database":
                                    dbService = temp[1].Trim();
                                    break;
                                case "uid":
                                    uid = temp[1].Trim();
                                    break;
                                case "pwd":
                                    pwd = temp[1].Trim();
                                    break;
                                default:
                                    server = "(local)";
                                    uid = "SA";

                                    dbService = "SSWCMS";
                                    break;
                            }


                            break;
                    }
                }
                ServerHostName = server;
                DBServiceName = dbService;
                Username = uid;
                Password = pwd;
                return true;
            }
            catch (Exception ex)
            {
                ServerHostName = "";
                DBServiceName = "";
                Username = "";
                Password = "";
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public bool SetIOStationProperty(int deviceIndex, int IOStationProperty, out string Errtext)
        {
            DataView dvf = new DataView(); DataView dv = new DataView();
            try
            {
                Errtext = string.Empty;
                string iotype = " (T_Base_Route.F_RouteKind <> 0) ";
                if (IOStationProperty == 1)//入库站台
                {
                    iotype = " (T_Base_Route.F_RouteKind = 1) ";
                    dbo.ExecuteSql("update t_base_route set F_Status=1,F_AutoUpdate=1  where F_StartDevice=" + deviceIndex);
                    dboMan.ExceSQL("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS=1 where START_DEVICE=" + deviceIndex);
                    dbo.ExecuteSql("update t_base_route set F_Status=0,F_AutoUpdate=0  where F_EndDevice=" + deviceIndex);
                    dboMan.ExceSQL("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS=0 where END_DEVICE=" + deviceIndex);
                }
                else if (IOStationProperty == 2)//出库站台
                {
                    iotype = " (T_Base_Route.F_RouteKind = 2) ";
                    dbo.ExecuteSql("update t_base_route set F_Status=1,F_AutoUpdate=1  where F_EndDevice=" + deviceIndex);
                    dboMan.ExceSQL("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS=1 where END_DEVICE=" + deviceIndex);
                    dbo.ExecuteSql("update t_base_route set F_Status=0,F_AutoUpdate=0  where F_StartDevice=" + deviceIndex);
                    dboMan.ExceSQL("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS=0 where START_DEVICE=" + deviceIndex);
                }
                else//0拣选站台
                {
                    iotype = " (T_Base_Route.F_RouteKind <> 0) ";
                    dbo.ExecuteSql("update t_base_route set F_Status=1,F_AutoUpdate=1  where ((F_EndDevice=" + deviceIndex + ") or (F_StartDevice=" + deviceIndex + "))");
                    dboMan.ExceSQL("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS=1 where ((End_Device=" + deviceIndex + ") or (Start_Device=" + deviceIndex + "))");
                }
                dv = dbo.ExceSQL("SELECT DISTINCT T_Base_Route.F_RouteID, T_Base_Route.F_RouteKind,  " +
                    "T_Base_Route_Device.F_DeviceIndex FROM T_Base_Route,T_Base_Route_Device where " +
                    "T_Base_Route.F_RouteID = T_Base_Route_Device.F_RouteID and " + iotype +
                    " AND (T_Base_Route_Device.F_DeviceIndex = " + deviceIndex + ")").Tables[0].DefaultView;

                for (int i = 0; i < dv.Count; i++)
                {
                    dbo.ExecuteSql("update t_base_route set F_Status=1,F_AutoUpdate=1  where f_routeid=" + dv[i]["F_RouteID"]);
                    dboMan.ExceSQL("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS=1 where CONTROL_ROUTE_ID='" + dv[i]["F_RouteID"] + "' and CONTROL_ROUTE_STATUS=0");
                    if (dv[i]["F_RouteKind"].ToString() == "1")
                    {

                        dvf = dbo.ExceSQL("SELECT DISTINCT T_Base_Route.F_RouteID, T_Base_Route.F_RouteKind,  " +
                        "T_Base_Route_Device.F_DeviceIndex FROM T_Base_Route,T_Base_Route_Device where " +
                        "T_Base_Route.F_RouteID = T_Base_Route_Device.F_RouteID and T_Base_Route.F_RouteKind = 2 " +
                        " AND (T_Base_Route_Device.F_DeviceIndex = " + deviceIndex + ")").Tables[0].DefaultView;
                        for (int f = 0; f < dvf.Count; f++)
                        {
                            dbo.ExecuteSql("update t_base_route set F_Status=0,F_AutoUpdate=0  where f_routeid=" + dvf[f]["F_RouteID"]);
                            dboMan.ExceSQL("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS=0 where CONTROL_ROUTE_ID='" + dvf[f]["F_RouteID"] + "' and CONTROL_ROUTE_STATUS=1");
                        }
                    }
                    else if (dv[i]["F_RouteKind"].ToString() == "2")
                    {

                        dvf = dbo.ExceSQL("SELECT DISTINCT T_Base_Route.F_RouteID, T_Base_Route.F_RouteKind,  " +
                        "T_Base_Route_Device.F_DeviceIndex FROM T_Base_Route,T_Base_Route_Device where " +
                        "T_Base_Route.F_RouteID = T_Base_Route_Device.F_RouteID and T_Base_Route.F_RouteKind = 1 " +
                        " AND (T_Base_Route_Device.F_DeviceIndex = " + deviceIndex + ")").Tables[0].DefaultView;
                        for (int f = 0; f < dvf.Count; f++)
                        {
                            dbo.ExecuteSql("update t_base_route set F_Status=0,F_AutoUpdate=0  where f_routeid=" + dvf[f]["F_RouteID"]);
                            dboMan.ExceSQL("update IO_CONTROL_ROUTE set CONTROL_ROUTE_STATUS=0 where CONTROL_ROUTE_ID='" + dvf[f]["F_RouteID"] + "' and CONTROL_ROUTE_STATUS=1");
                        }
                    }


                }
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dvf.Dispose();
                dv.Dispose();
            }
        }
        //public DataView GetIOStationProperty(int deviceIndex, out string Errtext)
        //{

        //}
        public bool SetBlackBoxParameter(int FileCount, int FileSize, out string Errtext)
        {
            Errtext = string.Empty;
            try
            {
                double ssize = 1048576 * Convert.ToDouble(FileSize);
                CommonClassLib.AppSettings.SetValue("DarkCasketSize", ssize.ToString());
                CommonClassLib.AppSettings.SetValue("DarkCasketSum", FileCount.ToString());
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public string GetBlackBoxInfo(string deviceIndex, DateTime BeginTime, DateTime EndTime, out string Errtext)
        {
            try
            {
                Errtext = string.Empty;
                string filePath = System.IO.Path.GetFullPath(System.Reflection.Assembly.GetExecutingAssembly().GetName().ToString());
                filePath = System.IO.Path.GetDirectoryName(filePath);
                filePath = System.IO.Path.Combine(filePath, "DarkCasket");
                // 没找到目录返回
                if (Directory.Exists(filePath) == false)
                {
                    return "";
                }
                string[] files = Directory.GetFiles(filePath);
                Array.Sort(files);
                // 目录为空时候返回
                if (files.Length < 1)
                {
                    Errtext = "目录为空!";
                    return "";
                }
                string opf = files[files.Length - 1];
                string[] cc = new string[1] { "**" };
                string[] sp = null;
                string rtext = string.Empty;
                char[] st = new char[1] { ':' };
                string[] sf;
                DateTime dt;
                using (StreamReader sr = new StreamReader(opf))
                {

                    sr.ReadLine();
                    while (!sr.EndOfStream)
                    {
                        sp = sr.ReadLine().Split(cc, StringSplitOptions.RemoveEmptyEntries);

                        if (sp[3].IndexOf(deviceIndex.ToString()) < 0)
                        {
                            continue;
                        }


                        sf = sp[0].Split(st);
                        dt = Convert.ToDateTime(sf[0] + ":" + sf[1] + ":" + sf[2]);

                        if ((dt.Hour < BeginTime.Hour) || ((dt.Hour > EndTime.Hour)))
                        {
                            continue;
                        }


                        if (sp.GetLength(0) > 0)
                        {
                            rtext += sp[0];
                            for (int i = 1; i < sp.GetLength(0); i++)
                            {
                                rtext += sp[i];
                            }
                            rtext += "\r\n";
                        }


                    }
                }
                return rtext;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return "";
            }
        }
        public DataTable GetAutoTaskHistory(DateTime BeginTime, DateTime EndTime, out string Errtext)
        {
            Errtext = string.Empty;
            try
            {
                DataView dv = dbo.ExceSQL(string.Format("SELECT * FROM T_Manage_Task_BAK WHERE (FBEGTIME >= '{0}') AND (FBEGTIME <= '{1}')", BeginTime, EndTime)).Tables[0].DefaultView;
                return dv.Table;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return null;
            }
        }
        public bool DeleteAutoTaskHistory(DateTime BeginTime, DateTime EndTime, out string Errtext)
        {
            Errtext = string.Empty;
            try
            {
                dbo.ExecuteSql(string.Format("DELETE FROM T_Manage_Task_BAK WHERE (FBEGTIME >= '{0}') AND (FBEGTIME <= '{1}')", BeginTime, EndTime));
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public bool SetUserAndPurview(string UserID, string UserName, string Password, string Purview, out string Errtext)
        {
            DataView dc = new DataView();
            Errtext = string.Empty;
            try
            {
                dc = dbo.ExceSQL(string.Format("select f_userid from t_base_users   where f_userid= '{0}'", UserID)).Tables[0].DefaultView;
                if (dc.Count > 0)
                {
                    object[] ob = new object[4] { UserName, Purview, Password, UserID };
                    int a = dbo.ExecuteSql(string.Format("UPDATE t_base_users  SET f_username = '{0}',f_purview='{1}',f_password='{2}' where f_userid= '{3}'", ob));
                    if (a > 0)
                    {
                        return true;
                    }
                    else
                    {
                        Errtext = "修改用户信息失败!";
                        return false;
                    }
                }
                else
                {
                    object[] ob = new object[4] { UserID, UserName, Purview, Password };
                    int a = dbo.ExecuteSql(string.Format("insert into t_base_users(f_userid,f_username,f_purview,f_password) values('{0}','{1}','{2}','{3}')", ob));
                    if (a > 0)
                    {
                        return true;
                    }
                    else
                    {
                        Errtext = "增加用户信息失败!";
                        return false;
                    }
                }
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dc.Dispose();
            }
        }
        public bool GetUserAndPurview(string UserID, out string UserName, out string Password, out string Purview, out string Errtext)
        {
            DataView dv = new DataView();
            UserName = ""; Password = ""; Purview = "";
            Errtext = string.Empty;
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT f_userid, f_username, f_purview, f_password FROM T_Base_Users where f_userid={0}", UserID)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    UserName = dv[0]["f_username"].ToString();
                    Password = dv[0]["f_password"].ToString();
                    Purview = dv[0]["f_purview"].ToString();
                    return true;
                }
                else
                {
                    Errtext = "用户不存在!";
                    return false;
                }

            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
            }
        }

        public bool SetUserPassword(string UserID, string Password, out string Errtext)
        {
            Errtext = string.Empty;
            try
            {

                int a = dbo.ExecuteSql(string.Format("UPDATE t_base_users  SET f_password='{0}' where f_userid= '{1}'", Password, UserID));
                if (a > 0)
                {
                    return true;
                }
                else
                {
                    Errtext = "修改用户密码失败!";
                    return false;
                }


            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public string GetUserPassword(string UserID, out string Errtext)
        {
            DataView dv = new DataView();
            Errtext = string.Empty;
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT  f_password FROM T_Base_Users where f_userid={0}", UserID)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {

                    return dv[0]["f_password"].ToString();


                }
                else
                {
                    Errtext = "用户不存在!";
                    return "";
                }

            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return "";
            }
            finally
            {
                dv.Dispose();
            }
        }
        public bool ShutDownControlSystem(out string ErrText)
        {
            ErrText = string.Empty;
            try
            {
                SocketsTCPIP.CClientTCPIP.EndConnect();
                CDisassembleTask.EndListen();

                CObtainTask.EndListen();
                CParsePLCData.EndListen();

                CUpdateIoControl.EndListen(); //民航二所 
                CCallService.EndListen();//民航二所 结束调用管理系统接口
                CCallService.EndListenPLC();//山东时代
                //Application.Exit();
                return true;
            }
            catch (Exception ex)
            {
                ErrText = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public bool StartGetALLDeviceState(out string Errtext)
        {


            cgs.GetDeviceState();

            Errtext = cgs.CGetStateError;
            return true;
        }
        public bool StartSendDeviceOrder(out string Errtext)
        {
            if (CStaticClass.Order == true)
            {//20130510
                lock (thisLock)
                {
                    cctrl.StartOrder();
                }
            }
            Errtext = cctrl.CControlError;

            return true;
        }
        //public bool ListenPLCAsk(out string Errtext)
        //{
        //    //clpa.DealwithPLCAsk();
        //    //Errtext = clpa.ListenPLCAskError;
        //    return true;
        //}
        public bool DataClear(out string Errtext)
        {
            DataView dv = new DataView();
            try
            {
                Errtext = string.Empty;
                dbo.ExecuteSql("delete from T_Manage_Task");
                dv = dbo.ExceSQL("select * from T_Monitor_Task").Tables[0].DefaultView;//20100610
                for (int i = 0; i < dv.Count; i++)
                {
                    cgs.ActionComplete(Convert.ToInt32(dv[i]["F_DeviceIndex"]), Convert.ToInt32(dv[i]["F_MonitorIndex"]), Model.CGeneralFunction.TASKDELETE);
                }
                CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "进行数据清理操作", "", "");
                return true;

            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 获得管理任务种类
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="monitorIndex">设备指令索引</param>
        /// <returns></returns>
        public int GetManageTaskKindFromMonitor(out string errtext, int monitorIndex)
        {
            try
            {
                errtext = string.Empty;
                return ccf.GetManageTaskKindIndexFromMonitor(monitorIndex);
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return -1;
            }
        }
        /// <summary>
        /// 获得管理任务索引
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="monitorIndex">设备指令索引</param>
        /// <returns></returns>
        public long GetManageTaskIndexFromMonitor(out string errtext, int monitorIndex)
        {
            try
            {
                errtext = string.Empty;
                return ccf.GetManageTaskIndexfromMonitor(monitorIndex);
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return -1;
            }
        }
        /// <summary>
        /// 获得设备种类索引
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="deviceIndex">设备索引</param>
        /// <returns></returns>
        public int GetDeviceKindIndex(out string errtext, int deviceIndex)
        {
            try
            {
                errtext = string.Empty;
                return ccf.GetDeviceKindIdx(deviceIndex);
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return -1;
            }
        }


        /// <summary>
        /// 发送设备置位清零
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="deviceIndex"></param>
        /// <returns></returns>
        public bool SendDeviceReset(out string errtext, int deviceIndex, int ResetOrder)
        {
            errtext = string.Empty;
            try
            {
                sdo = CommModeCreate.CreateSendDeviceOrder(deviceIndex);
                int deviceKind = GetDeviceKindIndex(out errtext, deviceIndex);
                if ((deviceKind == 1) || (deviceKind == 6))
                {
                    sdo.SendDeviceOrder(ResetOrder, 0, 0, deviceIndex, 0, 0, 0, 0, 0, 0);
                }
                else
                {

                    sdo.SendDeviceOrder(ResetOrder, 0, 0, deviceIndex, 0);

                }
                _device = Model.CGetInfo.GetDeviceInfo(deviceIndex);
                _device.SendMessage = null;
                Model.CGetInfo.SetDeviceInfo(_device);
                Thread.Sleep(500);//20131121richard
                return true;
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        /// <summary>
        /// 心跳诊断
        /// </summary>
        /// <returns></returns>
        public bool Heartbeat(out Model.MonitorInfo monitorinfo)
        {//20130817richard
            Model.MonitorInfo _monitorinfo = new Model.MonitorInfo(CStaticClass.ObtainManageTask, CStaticClass.Order, OPCClient.CCommonOPCClient.ConnectCount, null);
            monitorinfo = _monitorinfo;
            return true;
        }
        /// <summary>
        /// 获得指定SQL语句返回的DataView
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="SQL"></param>
        /// <returns></returns>
        public DataTable GetDataView(out string errtext, string SQL)
        {
            try
            {

                errtext = string.Empty;
                DataView dv = dbo.ExceSQL(SQL).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return dv.Table;
                }
                else
                {
                    errtext = "没查到数据!";
                    return null;
                }
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return null;
            }
        }
        /// <summary>
        /// 只执行SQL,不反悔数据集的,例如insert,update,delete等
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="SQL"></param>
        /// <returns></returns>
        public int ExeSQLNoneQuery(out string errtext, string SQL)
        {
            try
            {

                errtext = string.Empty;
                int a = dbo.ExecuteSql(SQL);
                return a;
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return -1;
            }
        }
        /// <summary>
        /// 获得指定SQL语句返回的DataView
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="SQL"></param>
        /// <returns></returns>
        public DataTable GetManDataView(out string errtext, string SQL)
        {
            DataView dv = new DataView();
            try
            {

                errtext = string.Empty;
                dv = dboMan.ExceSQL(SQL).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return dv.Table;
                }
                else
                {
                    errtext = "没查到数据!";
                    return null;
                }
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return null;
            }
        }
        /// <summary>
        /// 只执行SQL,不反悔数据集的,例如insert,update,delete等
        /// </summary>
        /// <param name="errtext"></param>
        /// <param name="SQL"></param>
        /// <returns></returns>
        public int ExeManSQLNoneQuery(out string errtext, string SQL)
        {
            try
            {

                errtext = string.Empty;
                int a = dboMan.ExecuteSql(SQL);
                return a;
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return -1;
            }
        }

        public StaticProperty GetTurnOrder(StaticProperty sp)
        {
            if (sp != null)
            {
                return sp;
            }
            else
            {
                throw new ArgumentNullException("StaticProperty");
            }
        }

        public bool GetAllManageTask(out string errtext)
        {
            try
            {
                errtext = string.Empty;
                if (CStaticClass.ObtainManageTask == true)
                {
                    if (CObtainTask.GetManagerTask() == 0)
                    {
                        errtext = CObtainTask.CObtainTaskError;
                    }
                }
                return true;
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public bool DisassembleTask(out string errtext)
        {
            try
            {
                errtext = string.Empty;
                if (CStaticClass.Order == true)
                {
                    CDisassembleTask.MyTaskIntoSteps();
                }
                return true;
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        public bool SetLogicHaveGoods(out string errtext, bool ifHaveGoods, int deviceindex)
        {
            errtext = string.Empty;
            try
            {

                if (ifHaveGoods == true)
                {

                    dbo.ExceSQL(string.Format("UPDATE T_Base_Device SET F_HaveGoods = 1 where  F_DeviceIndex ={0}", deviceindex));
                }
                else
                {
                    dbo.ExceSQL(string.Format("UPDATE T_Base_Device SET F_HaveGoods = 0 where  F_DeviceIndex ={0}", deviceindex));
                }
                Model.MDevice dev = Model.CGetInfo.GetDeviceInfo(deviceindex);
                dev.LogicHaveGoods = ifHaveGoods;
                Model.CGetInfo.SetDeviceInfo(dev);
                CDeviceStateChangeEventArgs csce = new CDeviceStateChangeEventArgs(dev);
                OnDeviceState("SControlMonitor.SetLogicHaveGoods", csce);
                return true;

            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }

        public bool DealWithDeviceState(out string errtext, int deviceindex, byte[] splitbyteValue, byte[] devicestates)
        {//deviceindex设备组代表的订阅,首先把设备组按照F_DBW2Address由小到大排序,拆分到具体每个设备
            lock (thisLock)
            {

                if ((splitbyteValue == null) && (devicestates == null))
                {//20120420
                    errtext = OPCClient.CCommonOPCClient.OpcError;
                    RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", string.Format("SControlMonitor.DealWithDeviceState时,订阅组:{0}发生异常,{1}!", deviceindex, errtext));
                    OnRefreshMonitor(rmea);

                    return false;
                }
                errtext = string.Empty; DataView dv = new DataView(); DataView dvsp = new DataView(); DataView dvbc = new DataView(); DataView dvyanshi = new DataView();
                int devicebegin = 0; int DBW2Addressbegin = 0; int SplitBytebegin = 0; string S7Connection = string.Empty;
                int SplitByteLength = 0;
                StringBuilder mysql = new StringBuilder();//add by lyj 20171116
                int lanenumber = 0;
                try
                {
                    StringBuilder sql = new StringBuilder(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection  FROM T_Base_Device WHERE f_controldevice='1' and (F_DeviceKindIndex <>33) AND (F_ReadSubscription = '{0}') AND (F_DBW2Address IS NOT NULL) ORDER BY F_DBW2Address", deviceindex));//20151120,增加字段是否需要服务端处理设备的订阅
                    dv = dbo.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.Clear();
                        sql.Append(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 = dbo.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 = dbo.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));
                            dvsp = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                            if (dvsp.Count > 0)
                            {
                                SplitByteLength = Convert.ToInt32(dvsp[0]["F_DBWGetLength"]);
                            }
                        }
                        else
                        {//20120420
                            RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", string.Format("SControlMonitor.DealWithDeviceState时,订阅组:{0}对应的设备索引不存在!", deviceindex));
                            OnRefreshMonitor(rmea);
                            errtext = string.Format("SControlMonitor.DealWithDeviceState时,订阅组:{0}对应的设备索引不存在!", deviceindex);
                            return false;
                        }
                    }
                    #region I/O点字节集合采集分解  lzm 20250313 添加字段 F_IsAGViostation

                    if (splitbyteValue != null)
                    {
                        Array.Copy(splitbyteValue, CStaticClass.MutiReadSubscriptionDeviceSplitReturns[deviceindex.ToString()], splitbyteValue.Length);
                        dvsp = dbo.ExceSQL(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_IsAGVIOStation FROM T_Base_Device WHERE f_controldevice='1' and (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;//20151120,增加字段是否需要服务端处理设备的订阅
                        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;
                            devinfo.F_IsAGVIOStation = Convert.ToInt32(dvsp[i]["F_IsAGVIOStation"]);
                            Model.CGetInfo.SetDeviceInfo(devinfo);
                            CDeviceStateChangeEventArgs csce = new CDeviceStateChangeEventArgs(devinfo);
                            OnDeviceState("SControlMonitor.DealWithDeviceState", csce);
                        }
                    }

                    #endregion

                    #region 设备状态采集分解

                    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);
                            witemnames[0].Clear();
                            witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20141201张磊发现误写为Dbw1Address
                            sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                            int taskindex = 0; int state = 0;
                            int taskindex2 = 0, taskindex3 = 0;
                            //以下代码重新开发CStaticClass.MutiS7ConnReturns改为按照F_ReadSubscription
                            tempdb2addr = Convert.ToInt32(dv[di]["F_DBW2Address"]) - DBW2Addressbegin;

                            if (devinfo.DeviceKind == 1)
                            {
                                taskindex = (devicestates[tempdb2addr + 2] << 8) + devicestates[tempdb2addr + 3];
                            }
                            else if (3 < devinfo.Dbw2Getlength)
                            {

                                taskindex = (devicestates[tempdb2addr + 2] << 8) + devicestates[tempdb2addr + 3];

                            }


                            if (devinfo.DeviceKind == 1)
                            {
                                state = (devicestates[tempdb2addr +4] << 8) + devicestates[tempdb2addr + 5];
                            }
                            else if (1 < devinfo.Dbw2Getlength)
                            {
                                state = devicestates[tempdb2addr + 1];
                            }



                                int xc = 0; int yc = 0;
                            int devkind = ccf.GetDeviceKindIdx(devidx);
                            if (devkind == 31)
                            {//解析南京14所得高端自动化的是否有物信号,高位低位信号(I/O信号字节填写在状态字节的后面)
                                #region 解析高端设备状态及探物
                                devinfo = Model.CGetInfo.GetDeviceInfo(devidx);
                                devinfo.SplitByte_0 = (devicestates[tempdb2addr + 8] & 1) == 1 ? 1 : 0;
                                devinfo.SplitByte_1 = (devicestates[tempdb2addr + 8] & 2) == 2 ? 1 : 0;
                                devinfo.SplitByte_2 = (devicestates[tempdb2addr + 8] & 4) == 4 ? 1 : 0;
                                devinfo.SplitByte_3 = (devicestates[tempdb2addr + 8] & 8) == 8 ? 1 : 0;
                                devinfo.SplitByte_4 = (devicestates[tempdb2addr + 8] & 16) == 16 ? 1 : 0;
                                devinfo.SplitByte_5 = (devicestates[tempdb2addr + 8] & 32) == 32 ? 1 : 0;
                                devinfo.SplitByte_6 = (devicestates[tempdb2addr + 8] & 64) == 64 ? 1 : 0;
                                devinfo.SplitByte_7 = (devicestates[tempdb2addr + 8] & 128) == 128 ? 1 : 0;
                                if (devinfo.RunState != 4)//20121203
                                {
                                    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;


                                    }
                                }
                                #region 注释 by lyj
                                //barcode.Remove(0, barcode.Length);
                                //for (int i = 2; i <= 7; i++)
                                //{
                                //    barcode.Append(Convert.ToChar(devicestates[tempdb2addr + i]));

                                //}
                                //devinfo.Barcode = barcode.ToString();
                                //if (state == 2)
                                //{//20111231
                                //    #region 判断是否满足条码的正则表达式
                                //    if (ccf.GetCodeCheck(barcode.ToString()) == false) continue;
                                //    #endregion
                                //    devinfo.TaskNo = GetMonitorTaskIndexFromBarCode(barcode, devinfo);
                                //}
                                #endregion
                                #region 设备被停用时,不显示真实状态20120820
                                //if (ccf.GetDeviceLockedState(devidx) == -1) devinfo.RunState = 4;//20121203
                                #endregion
                                Model.CGetInfo.SetDeviceInfo(devinfo);
                                //CDeviceStateChangeEventArgs csce = new CDeviceStateChangeEventArgs(devinfo);
                                //OnDeviceState("SControlMonitor.DealWithDeviceState", csce);
                                #endregion
                            }
                            else
                            {
                                #region 通用物流设备状态
                                devinfo = Model.CGetInfo.GetDeviceInfo(devidx);
                                if (devinfo.RunState != 4)//20121203
                                {
                                    if (state >= 30)
                                    {
                                        devinfo.ErrorCode = state;
                                        devinfo.RunState = 2;
                                        if (devinfo.DeviceKind == 1)
                                        {
                                            //sdo = CommModeCreate.CreateSendDeviceOrder(devinfo.DeviceIndex);
                                            //sdo.SendDeviceOrder(0, 0, 0, devinfo.DeviceIndex, 0, 0, 0, 0, 0, 0);
                                        }
 

                                    }
                                    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.XCoor = devicestates[tempdb2addr + 7] + (devicestates[tempdb2addr + 6] << 8);//X坐标
                                    if (devinfo.DeviceKind == 1)
                                    {
                                        devinfo.YCoor = devicestates[tempdb2addr + 9] + (devicestates[tempdb2addr + 8] << 8);//Y坐标
                                    }
                                    //byte[] mile = new byte[4] { devicestates[tempdb2addr + 24], devicestates[tempdb2addr + 25], devicestates[tempdb2addr + 26], devicestates[tempdb2addr + 27] };
                                    //devinfo.Mile = CommonClassLib.CCarryConvert.bytetofloat(mile);

                                    //byte[] time = new byte[4] { devicestates[tempdb2addr + 36], devicestates[tempdb2addr + 37], devicestates[tempdb2addr + 38], devicestates[tempdb2addr + 39] };
                                    //devinfo.Time = CommonClassLib.CCarryConvert.bytetofloat(time);

                                    devinfo.Mile = devicestates[tempdb2addr + 27] + (devicestates[tempdb2addr + 26] << 8) + (devicestates[tempdb2addr + 25] << 16) + (devicestates[tempdb2addr + 24] << 32);//民航二所
                                    devinfo.Time = devicestates[tempdb2addr + 39] + (devicestates[tempdb2addr + 38] << 8) + (devicestates[tempdb2addr + 37] << 16) + (devicestates[tempdb2addr + 36] << 32);
                                }
                                #region 设备被停用时,不显示真实状态20120820
                                if (ccf.GetDeviceLockedState(devidx) == -1) devinfo.RunState = 4;//20121203
                                #endregion


                                Model.CGetInfo.SetDeviceInfo(devinfo);
                                modifypathdevinfo = Model.CGetInfo.GetModifyPathDeviceInfo(devidx);
                                if (modifypathdevinfo != null)
                                {
                                    modifypathdevinfo.RunState = devinfo.RunState;
                                    modifypathdevinfo.ErrorCode = devinfo.ErrorCode;
                                    modifypathdevinfo.TaskNo = devinfo.TaskNo;
                                    Model.CGetInfo.SetModifyPathDeviceInfo(modifypathdevinfo);
                                }
                                #endregion
                            }
                            #region 处理设备完成、报警、运行状态;条码信息

                            int bcz = 0;
                            int askOrder = 0;
                            int askDevice = 0;
                            string bc = string.Empty;
                            int[] states = new int[(int)devinfo.Dbw2Getlength];
                            int xcrelative = 0, ycrelative = 0;
                            Array.Copy(devicestates, tempdb2addr, states, 0, (int)devinfo.Dbw2Getlength);

                            switch (devkind)
                            {

                                #region 堆垛机
                                case 1:

                                    devinfo.SplitByte_0 = (devicestates[tempdb2addr + 13] & 1) == 1 ? 1 : 0;
                                    devinfo.SplitByte_1 = (devicestates[tempdb2addr + 13] & 2) == 2 ? 1 : 0;
                                    devinfo.SplitByte_6 = (devicestates[tempdb2addr + 13] & 64) == 64 ? 1 : 0;

                                    if (IsEquals(devinfo.ReturnMessage, states, 12) == false)
                                    {

                                        bc = GetBarcodeFromMonitorIndex(taskindex);
                                        xc = devicestates[tempdb2addr + 7] + (devicestates[tempdb2addr + 6] << 8);//X坐标
                                        yc = devicestates[tempdb2addr + 9] + (devicestates[tempdb2addr + 8] << 8);//Y坐标

                                        //xc = devicestates[tempdb2addr + 7] + (devicestates[tempdb2addr + 6] << 8) + (devicestates[tempdb2addr + 5] << 16) + (devicestates[tempdb2addr + 4] << 32);//X坐标
                                        //yc = devicestates[tempdb2addr + 11] + (devicestates[tempdb2addr + 10] << 8) + (devicestates[tempdb2addr + 9] << 16) + (devicestates[tempdb2addr + 8] << 32);//Y坐标
                                        //xcrelative = devicestates[tempdb2addr + 12];
                                        //ycrelative = devicestates[tempdb2addr + 13];


                                        devinfo.ReturnMessage = states;
                                        Model.CGetInfo.SetDeviceMessage(devinfo);
                                        devinfo.YCoor = xc;
                                        devinfo.YCoor = yc;
                                        if (devinfo.YCoor == 0 && devinfo.XCoor == 0 && devinfo.RunState!=4)//上海晟碟
                                        {
                                            devinfo.RunState = 3;
                                        }
                                        sql.Remove(0, sql.Length);
                                        sql.Append("UPDATE SHUTTLE_POSITION SET F_RunStatus = ")
                                           .Append(devinfo.RunState).Append(" WHERE F_DeviceIndex = ")
                                           .Append(devinfo.DeviceIndex).Append("and F_RunStatus<>").Append(devinfo.RunState);
                                        dbo.ExceSQL(sql.ToString());



                                       #region 注释上海晟碟,获取电池电量信息


                                        //devinfo.Battery_Status =
                                        //    devicestates[tempdb2addr + 11] + (devicestates[tempdb2addr + 10] << 8);
                                        ////devinfo.Battery_Status = devicestates[tempdb2addr + 13];
                                        //sql.Remove(0, sql.Length);
                                        ////sql.Append("UPDATE SHUTTLE_POSITION SET F_BatteryStatus = ")
                                        ////    .Append(devinfo.Battery_Status).Append(", F_Postion = ").Append(yc).Append(" WHERE F_DeviceIndex = ")
                                        ////    .Append(devinfo.DeviceIndex);
                                        //sql.Append("UPDATE SHUTTLE_POSITION SET F_BatteryStatus = ")
                                        //    .Append(devinfo.Battery_Status).Append(" WHERE F_DeviceIndex = ")
                                        //    .Append(devinfo.DeviceIndex).Append("and F_BatteryStatus<>").Append(devinfo.Battery_Status);
                                        //dbo.ExceSQL(sql.ToString());
                                        
                                        //if (yc != 0)//上海晟碟, 层信息为0不更新表
                                        //{
                                        //    sql.Remove(0, sql.Length);
                                        //    sql.Append("UPDATE SHUTTLE_POSITION SET F_Postion = ")
                                        //        .Append(yc).Append(" WHERE F_DeviceIndex = ")
                                        //        .Append(devinfo.DeviceIndex).Append("and F_Postion<>").Append(yc);
                                        //    dbo.ExceSQL(sql.ToString());

                                        //}

                                        //#region 20210329_上海晟碟,如果电池电量低于40,生成充电的手工任务 民航二所

                                        //if((devinfo.XCoor!=0 )&& (devinfo.YCoor != 0 ))//dzf
                                        //{
                                        //    if (devinfo.RunState == 0)//空闲模式才能下达任务
                                        //    {
                                        //        if (devinfo.Battery_Status < 40)
                                        //        {
                                        //            //判断是否有该车的充电任务,是否正在充电,满足条件再生成充电任务
                                        //            sql.Remove(0, sql.Length);
                                        //            sql.Append(
                                        //                    "SELECT * FROM T_Manage_Task WHERE FCONTROLTASKTYPE = 6 AND FSTARTDEVICE = '")
                                        //                .Append(devinfo.DeviceIndex.ToString()).Append("'");
                                        //            if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
                                        //            {

                                        //            }

                                        //            else
                                        //            {
                                        //                sql.Remove(0, sql.Length);
                                        //                sql.Append("SELECT * FROM T_Manage_Task WHERE 1<>1 and FSTACK = ")
                                        //                    .Append(devinfo.DeviceIndex.ToString());
                                        //                if (dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView.Count > 0)
                                        //                {

                                        //                }
                                        //                //生成充电任务
                                        //                else//强制生成充电任务
                                        //                {

                                        //                    //没有调度预约锁时候生成充电任务
                                        //                    sql.Remove(0, sql.Length);
                                        //                    sql.Append(
                                        //                            "SELECT F_ManTaskReserve FROM T_Base_Device WHERE F_DeviceIndex = ")
                                        //                        .Append(devinfo.DeviceIndex.ToString());
                                        //                    int  FManTaskReserve = Convert.ToInt32(
                                        //                        dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView[0]
                                        //                            ["F_ManTaskReserve"]);
                                        //                    if (FManTaskReserve == 0)
                                        //                    {
                                        //                        sql.Remove(0, sql.Length);
                                        //                        sql.Append(
                                        //                                "SELECT F_SwitchLock FROM T_Base_Device WHERE F_DeviceIndex = ")
                                        //                            .Append(devinfo.DeviceIndex.ToString());
                                        //                        int iSwitchLock = Convert.ToInt32(
                                        //                            dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView[0]
                                        //                                ["F_SwitchLock"]);
                                        //                        if (iSwitchLock == 0)
                                        //                        {
                                        //                            string strCell = string.Format("{0:D2}-{1:D2}-{2:D2}", 2, 2, yc);
                                        //                            int hidx1 = ccf.GetTempManageIdx();
                                        //                            string dTime1 = DateTime.Now.ToString("u");
                                        //                            dTime1 = dTime1.Substring(0, dTime1.Length - 1);
                                        //                            string strBarcode = DateTime.Now.ToString("yyyyMMddhhmmss");
                                        //                            mysql.Remove(0, mysql.Length);
                                        //                            mysql.Append("INSERT INTO T_Manage_Task")
                                        //                                .Append(
                                        //                                    "(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FCONTROLTASKTYPE,FIntoStepOK,FSTARTDEVICE,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE,FUseAwayFork,FSTACK,FStartLayer,FEndLayer) values('")
                                        //                                .Append("Charge").Append(devinfo.DeviceIndex)
                                        //                                .Append("',")
                                        //                                .Append(hidx1)
                                        //                                .Append(",1,-1,6,0,").Append(devinfo.DeviceIndex).Append(",'").Append(strCell)
                                        //                                .Append("','")
                                        //                                .Append(18001).Append("','").Append(strCell)
                                        //                                .Append("','").Append(dTime1)
                                        //                                .Append("',0,0,11000, ").Append(yc).Append(",").Append(yc).Append(")");
                                        //                            dbo.ExecuteSql(mysql.ToString());
                                        //                        }
                                        //                    }

                                        //                }



                                        //            }


                                        //        }
                                        //    }
                                        //}


                                        //if (devinfo.Battery_Status > 80)
                                        //{
                                        //    sql.Remove(0, sql.Length);
                                        //    sql.Append(
                                        //            "UPDATE T_Base_Device SET F_SwitchLock = 0 WHERE F_SwitchLock <> 0 and F_DeviceIndex = ")
                                        //        .Append(devinfo.DeviceIndex.ToString());
                                        //    dbo.ExecuteSql(sql.ToString());
                                        //}

                                        //#endregion

                                        #endregion

                                        Model.CGetInfo.SetDeviceMessage(devinfo);
                                        sss.Remove(0, sss.Length);
                                        sss.Append("**条码:").Append(bc).Append("**读标志" + devicestates[tempdb2addr + 0]).Append("**状态" + state).Append("**任务号" + taskindex)
                                            .Append("**列坐标" + xc).Append("**层坐标" + yc);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到堆垛机状态", devidx.ToString(), sss.ToString());

                                        #region 20201019_C2厂房,上报穿梭板所在位置及是否可用
                                        //sql.Remove(0, sql.Length);
                                        //sql.Append("SELECT DEVICE_LAYER, DEVICE_STAUTS FROM DEVICE_STAUTS WHERE DEVICE_CODE = '").Append(devinfo.DeviceIndex).Append("'");
                                        //dvbc = dboMan.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                        //if(dvbc.Count > 0)
                                        //{
                                        //    int iLayer = Convert.ToInt32(dvbc[0]["DEVICE_LAYER"]);
                                        //    int iStatus = Convert.ToInt32(dvbc[0]["DEVICE_STAUTS"]);
                                        //    int iCurrnetStatus = state >= 30 ? 0 : 1;
                                        //    StringBuilder update = new StringBuilder();
                                        //    if(iLayer != devinfo.YCoor)
                                        //    {
                                        //        update.Append("DEVICE_LAYER = ").Append(devinfo.YCoor);
                                        //        if(iStatus != iCurrnetStatus)
                                        //        {
                                        //            update.Append(", DEVICE_STAUTS = ").Append(iCurrnetStatus);
                                        //        }
                                        //    }
                                        //    else
                                        //    {
                                        //        if (iStatus != iCurrnetStatus)
                                        //        {
                                        //            update.Append("DEVICE_STAUTS = ").Append(iCurrnetStatus);
                                        //        }
                                        //    }
                                        //    if(iLayer != devinfo.YCoor || iStatus != iCurrnetStatus)
                                        //    {
                                        //        sql.Remove(0, sql.Length);
                                        //        sql.Append("UPDATE DEVICE_STAUTS SET ").Append(update.ToString()).Append(" WHERE DEVICE_CODE = ").Append(devinfo.DeviceIndex);
                                        //        dboMan.ExecuteSql(sql.ToString());
                                        //    }
                                        //}
                                        #endregion
                                    }
                                    #region  注释 by lyj 20171025
                                    //devinfo.SplitByte_0 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 2] & 1) == 1 ? 1 : 0;
                                    //devinfo.SplitByte_1 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 2] & 2) == 2 ? 1 : 0;
                                    //devinfo.SplitByte_6 = devicestates[tempdb2addr + 14];
                                    //devinfo.SplitByte_7 = devicestates[tempdb2addr + 15];                                      
                                    //if (devicestates[tempdb2addr + 0] != 1) continue;
                                    #endregion
                                    if ((state <= 0) || (taskindex <= 0))
                                    {
                                        continue;
                                    }
                                    cgs.GetKindDeviceState(taskindex, devidx, state);
                                    break;
                                #endregion

                                #region 类输送机
                                case 2:

                                   
                                    devinfo.SplitByte_0 = (devicestates[tempdb2addr + 4] & 1) == 1 ? 1 : 0;
                                    devinfo.SplitByte_1 = (devicestates[tempdb2addr + 4] & 2) == 2 ? 1 : 0;
                                    devinfo.SplitByte_2 = (devicestates[tempdb2addr + 4] & 4) == 4 ? 1 : 0;
                                    devinfo.SplitByte_3 = (devicestates[tempdb2addr + 4] & 8) == 8 ? 1 : 0;
                                    devinfo.SplitByte_5 = (devicestates[tempdb2addr + 4] & 32) == 32 ? 1 : 0;
                                    devinfo.SplitByte_6 = (devicestates[tempdb2addr + 4] & 64) == 64 ? 1 : 0;

                                    if (IsEquals(devinfo.ReturnMessage, states, 4) == false)
                                    {

                                        bc = GetBarcodeFromMonitorIndex(taskindex);

                                        devinfo.ReturnMessage = states;
                                        
                                        Model.CGetInfo.SetDeviceMessage(devinfo);
                                        StringBuilder task23 = new StringBuilder();



                                        task23.Append(",1叉条码:").Append(bc);
                                        if (taskindex2 > 0)
                                        {
                                            task23.Append(",2叉任务号:").Append(taskindex2).Append(",2叉条码:").Append(GetBarcodeFromMonitorIndex(taskindex2));
                                        }
                                        if (taskindex3 > 0)
                                        {
                                            task23.Append(",3叉任务号:").Append(taskindex3).Append(",3叉条码:").Append(GetBarcodeFromMonitorIndex(taskindex3));
                                        }
                                        #region AGV取放货的输送线状态实时跟新  PLC断开连接后,该值不会变更,可能存在BUG,需要加以限制   有货可取货
                                        if (devinfo.F_IsAGVIOStation == 1)
                                        {
                                            var signal = devinfo.SplitByte_0 == 1 ? true : false;//1有货,0无光电感应  取货,接货时 有无货状态要不一致
                                            var runstate = devinfo.RunState == 0 ? true : false; //无货空闲=1,有货空闲=2
                                            if (!signal && runstate)
                                            {//空闲,无货 
                                                sql.Remove(0, sql.Length);
                                                sql.Append("update T_AGVIOStation set F_AGVIOStatus=1 where F_DeviceIndex=").Append(devinfo.DeviceIndex);
                                                dbo.ExecuteSql(sql.ToString());
                                            }
                                            else if (signal && runstate)
                                            {//有货空闲
                                                sql.Remove(0, sql.Length);
                                                sql.Append("update T_AGVIOStation set F_AGVIOStatus=2 where F_DeviceIndex=").Append(devinfo.DeviceIndex);
                                                dbo.ExecuteSql(sql.ToString());
                                            }
                                            else
                                            {
                                                sql.Remove(0, sql.Length);
                                                sql.Append("update T_AGVIOStation set F_AGVIOStatus=0 where F_DeviceIndex=").Append(devinfo.DeviceIndex);
                                                dbo.ExecuteSql(sql.ToString());
                                            }
                                        }
                                        #endregion
                                        sss.Remove(0, sss.Length);
                                        sss.Append("**条码:").Append(bc).Append("**读标志" + devicestates[tempdb2addr + 0]).Append("**状态" + state).Append("**任务号:" + taskindex).Append(task23);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到输送机机状态", devidx.ToString(), sss.ToString());
                                    


                                    }
                                    //20170212
                                    if (state <= 0)//20140305|| taskindex <= 0
                                    {
                                        continue;
                                    }
                                  
                                    if ((taskindex2 > 0 || taskindex3 > 0) && (state == 2) && devinfo.IfCorrelDoubleFork == "1")
                                    {
                                        #region 根据电气报告三叉关联,配三叉

                                        string aa;
                                        int mankind = 0, tindex = 0;
                                        long relFID = 0,fid1 = 0, fid2 = 0, fid3 = 0;
                                        if (taskindex3 > 0)
                                        {
                                            mankind = GetManageTaskKindFromMonitor(out  aa, taskindex3);
                                            relFID = GetManageTaskIndexFromMonitor(out  aa, taskindex3);
                                            tindex = taskindex3;
                                        }
                                        if (taskindex2 > 0)
                                        {
                                            mankind = GetManageTaskKindFromMonitor(out  aa, taskindex2);
                                            relFID = GetManageTaskIndexFromMonitor(out  aa, taskindex2);
                                            tindex = taskindex2;
                                        }
                                        if (taskindex > 0)
                                        {
                                            mankind = GetManageTaskKindFromMonitor(out  aa, taskindex);
                                            relFID = GetManageTaskIndexFromMonitor(out  aa, taskindex);
                                            tindex = taskindex;
                                        }
                                        fid1 = GetManageTaskIndexFromMonitor(out  aa, taskindex);
                                        fid2 = GetManageTaskIndexFromMonitor(out  aa, taskindex2);
                                        fid3 = GetManageTaskIndexFromMonitor(out  aa, taskindex3);
                                        //关联分配三叉
                                        sql.Remove(0, sql.Length);
                                        sql.Append("update T_Manage_Task set FUseAwayFork=1,F_RELATIVECONTORLID=").Append(relFID).Append(" where F_ManageTaskKindIndex=").Append(mankind).Append(" and FID=").Append(fid1);
                                        dbo.ExecuteSql(sql.ToString());
                                        sql.Remove(0, sql.Length);
                                        sql.Append("update T_Manage_Task set FUseAwayFork=2,F_RELATIVECONTORLID=").Append(relFID).Append(" where F_ManageTaskKindIndex=").Append(mankind).Append(" and FID=").Append(fid2);
                                        dbo.ExecuteSql(sql.ToString());
                                        sql.Remove(0, sql.Length);
                                        sql.Append("update T_Manage_Task set FUseAwayFork=3,F_RELATIVECONTORLID=").Append(relFID).Append(" where F_ManageTaskKindIndex=").Append(mankind).Append(" and FID=").Append(fid3);
                                        dbo.ExecuteSql(sql.ToString());

                                        int dev2 = devinfo.DeviceIndex, dev1 = devinfo.DeviceIndex;
                                        //堆垛机设备指令配叉F_UseAwayFork、提前检测F_AheadDetect、取货坐标F_NumParam2
                                        sql.Clear();//20151120
                                        if (CStaticClass.DBFactory == "OracleDBFactory")
                                        {//20151120调度系统oracle的特殊语句
                                            sql.Append(string.Format("SELECT  F_ManageTASKKINDINDEX,F_ManageTaskIndex,F_MonitorIndex, F_DeviceIndex FROM T_Monitor_Task WHERE rownum=1 and F_ManageTASKKINDINDEX={0} and F_ManageTaskIndex={1} and (F_MonitorIndex > {2}) ORDER BY F_MonitorIndex", mankind, relFID, tindex));
                                        }
                                        else
                                        {//20151120调度系统SQLServer的特殊语句
                                            sql.Append(string.Format("SELECT TOP 1 F_ManageTASKKINDINDEX,F_ManageTaskIndex,F_MonitorIndex, F_DeviceIndex FROM T_Monitor_Task WHERE F_ManageTASKKINDINDEX={0} and F_ManageTaskIndex={1} and (F_MonitorIndex > {2}) ORDER BY F_MonitorIndex", mankind, relFID, tindex));
                                        }
                                        DataView dvr = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//20151120调度系统oracle的特殊语句
                                        if (dvr.Count > 0)
                                        {
                                            int stackno = Convert.ToInt32(dvr[0]["F_DeviceIndex"]);
                                            //stackno = 15001;//测试
                                            object[] ob = new object[4] { stackno, fid1, mankind, Model.CGeneralFunction.GetXcorrFromForkNoAndDevice(devinfo.DeviceIndex, 1) };
                                            dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam2={3},F_UseAwayFork = 1 WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob));
                                            ob = new object[4] { stackno, fid2, mankind, Model.CGeneralFunction.GetXcorrFromForkNoAndDevice(devinfo.DeviceIndex, 2) };
                                            dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam2={3},F_UseAwayFork = 2 WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob));
                                            ob = new object[4] { stackno, fid3, mankind, Model.CGeneralFunction.GetXcorrFromForkNoAndDevice(devinfo.DeviceIndex, 3) };
                                            dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_NumParam2={3},F_UseAwayFork = 3 WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob));

                                            dvr = dbo.ExceSQL(string.Format("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate WHERE (F_CorrelDeviceIndex LIKE '%{0}%') AND (F_UseAwayFork = '1')", devidx)).Tables[0].DefaultView;
                                            if ((dvr.Count > 0) && (fid1 > 0))
                                            {//2叉设备替换为1叉的
                                                int ndevidx = devidx * 10 + 2;
                                                dev1 = Convert.ToInt32(dvr[0]["F_LaneGateDeviceIndex"]);
                                                ob = new object[5] { ndevidx, dev1, stackno, fid1, mankind };
                                                dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}', '{1}') WHERE F_DeviceIndex={2} and (F_ManageTaskIndex ={3}) AND (F_ManageTASKKINDINDEX ={4})", ob));
                                                ob = new object[4] { dev1.ToString().Substring(0, 5), stackno, fid1, mankind };
                                                dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}.1', '{0}.0') WHERE F_DeviceIndex={1} and (F_ManageTaskIndex ={2}) AND (F_ManageTASKKINDINDEX ={3})", ob));

                                            }
                                            dvr = dbo.ExceSQL(string.Format("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate WHERE (F_CorrelDeviceIndex LIKE '%{0}%') AND (F_UseAwayFork = '2')", devidx)).Tables[0].DefaultView;
                                            if ((dvr.Count > 0) && (fid2 > 0))
                                            {//1叉设备替换为2叉的
                                                int ndevidx = devidx * 10 + 1;
                                                dev2 = Convert.ToInt32(dvr[0]["F_LaneGateDeviceIndex"]);
                                                ob = new object[5] { ndevidx, dev2, stackno, fid2, mankind };
                                                dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}', '{1}') WHERE F_DeviceIndex={2} and (F_ManageTaskIndex ={3}) AND (F_ManageTASKKINDINDEX ={4})", ob));
                                                ob = new object[4] { dev2.ToString().Substring(0, 5), stackno, fid2, mankind };
                                                dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_AheadDetect = REPLACE(F_AheadDetect, '{0}.0', '{0}.1') WHERE F_DeviceIndex={1} and (F_ManageTaskIndex ={2}) AND (F_ManageTASKKINDINDEX ={3})", ob));
                                            }

                                        }
                                        //dev1 = 12041;//模拟测试
                                        //dev2 = 12041;//模拟测试
                                        cgs.ActionComplete(dev1, taskindex, 1);
                                        cgs.ActionComplete(dev2, taskindex2, 1);

                                        //cgs.ActionComplete(dev3, taskindex3, 1);
                                        #endregion
                                    }

                                    else
                                    {
                                        cgs.GetKindDeviceState(taskindex, devidx, state);
                                    }
                                    break;
                                #endregion

                                #region 穿梭车RGV
                                case 4:
                                    devinfo.SplitByte_0 = (devicestates[tempdb2addr + 8] & 1) == 1 ? 1 : 0;
                                    devinfo.SplitByte_1 = (devicestates[tempdb2addr + 8] & 2) == 2 ? 1 : 0;
                                    devinfo.SplitByte_2 = (devicestates[tempdb2addr + 8] & 4) == 4 ? 1 : 0;
                                    devinfo.SplitByte_6 = (devicestates[tempdb2addr + 8] & 64) == 64 ? 1 : 0;
                                    if (IsEquals(devinfo.ReturnMessage, states, 4) == false)
                                    {
                                        

                                        bc = GetBarcodeFromMonitorIndex(taskindex);
                                        //xc = devicestates[tempdb2addr + 7] + (devicestates[tempdb2addr + 6] << 8) + (devicestates[tempdb2addr + 5] << 16) + (devicestates[tempdb2addr + 4] << 32);//X坐标
                                        xc = 1;
                                        devinfo.ReturnMessage = states;
                                        Model.CGetInfo.SetDeviceMessage(devinfo);
                                        sss.Remove(0, sss.Length);
                                        sss.Append("**条码:").Append(bc).Append("**读标志" + devicestates[tempdb2addr + 0]).Append("**状态" + state).Append("**任务号" + taskindex)
                                            .Append("**列坐标" + xc);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到RGV状态", devidx.ToString(), sss.ToString());

                                    }
                                    //devinfo.SplitByte_0 = (devicestates[tempdb2addr + (int)devinfo.Dbw2Getlength - 2] & 1) == 1 ? 1 : 0;
                                    if (devicestates[tempdb2addr + 0] != 1) continue;
                                    if ((state <= 0) || (taskindex <= 0))
                                    {
                                        continue;
                                    }
                                    cgs.GetKindDeviceState(taskindex, devidx, state);
                                    break;
                                #endregion

                                #region 条形码字符串信息
                                case 7:
                                    if (devicestates[tempdb2addr + 0] != 1) continue;
                                    //20140109申请任务(任务不存在)或者条码比对(任务已经存在)
                                    dvsp = dbo.ExceSQL(string.Format("select F_BarCode,F_Time, F_PalletBarcodeLength,F_PalletBarcodeReservedLength,F_BarcodeReservedLength,F_WareHouse,F_ManageAskkind,F_BarcodeForkAmount,F_BarcodeLength,F_BindingDevice,F_Askkind,F_Remark,F_TaskIndex  from T_Base_PLC_Ask  WHERE (F_DeviceIndex = {0}) ", devidx)).Tables[0].DefaultView; //20130510F_ManageAskkind
                                    if (dvsp.Count > 0)
                                    {
                                        StringBuilder warehouse = new StringBuilder(dvsp[0]["F_WareHouse"].ToString());
                                        int dcode = Convert.ToInt32(dvsp[0]["F_BindingDevice"]);
                                        int apptype = Convert.ToInt32(dvsp[0]["F_ManageAskkind"]);//20130510
                                        int BarcodeForkAmount = Convert.ToInt32(dvsp[0]["F_BarcodeForkAmount"]); //多叉堆垛机的货叉数量
                                        int BoxQuality = 0;// devicestates[tempdb2addr + 1]; //数量,只要是上报条码必须预留数量字节
                                        int BarcodeLength = Convert.ToInt32(dvsp[0]["F_BarcodeLength"]);//多叉堆垛机取货站台上报条码、周转箱叠箱、托盘码垛
                                        int BarcodeReservedLength = Convert.ToInt32(dvsp[0]["F_BarcodeReservedLength"]);//多叉堆垛机取货站台上报条码、周转箱叠箱、托盘码垛
                                        if (BarcodeReservedLength < BarcodeLength)
                                        {
                                            BarcodeReservedLength = BarcodeLength;
                                        }
                                        int Weight = devicestates[tempdb2addr + 5] + (devicestates[tempdb2addr + 4] << 8) + (devicestates[tempdb2addr + 3] << 16) + (devicestates[tempdb2addr + 2] << 32); ;//称重重量:1轻,2重 3 超重                                     
                                        int BarcodeTotalLength = BarcodeReservedLength * BoxQuality;
                                        int PalletBarcodeLength = Convert.ToInt32(dvsp[0]["F_PalletBarcodeLength"]);//电力纸箱码垛机器人专用\普通条码申请
                                        int PalletBarcodeReservedLength = Convert.ToInt32(dvsp[0]["F_PalletBarcodeReservedLength"]);//电力纸箱码垛机器人专用\普通条码申请
                                        if (PalletBarcodeReservedLength < PalletBarcodeLength)
                                        {
                                            PalletBarcodeReservedLength = PalletBarcodeLength;
                                        }

                                        StringBuilder incompleteBarcode = new StringBuilder();//  1111111111111111.......
                                        StringBuilder noneBarcode = new StringBuilder();//  \0\0\0\0..........
                                        StringBuilder appbarcode = new StringBuilder();
                                        StringBuilder[] appbarArray = new StringBuilder[BarcodeForkAmount];
                                        StringBuilder parameter = new StringBuilder();//存放给管理上报的纸箱条码组
                                        StringBuilder noreadbarcode = new StringBuilder("11111");//只判断前5位即可

                                        int emptypallet = 0;
                                        int enddeviceindex = Convert.ToInt32(dvsp[0]["F_TaskIndex"]);//存放码垛完成后的目标设备编号 
                                        #region 初始化接收条码

                                        for (int j = 1; j <= BarcodeLength; j++)
                                        {
                                            incompleteBarcode.Append("1");//PLC扫到残码,但是有货物,转换为字符'1'
                                            noneBarcode.Append("0");//PLC没扫描,没货物,保留的空值0,转换为字符'\0'
                                        }
                                        for (int j = 0; j < BarcodeForkAmount; j++)
                                        {//多叉堆垛机,在取货前上报条码格式:头+数量+条码//20140218
                                            appbarArray[j] = new StringBuilder(ASCIIEncoding.ASCII.GetString(devicestates, tempdb2addr + 2 + j * BarcodeReservedLength, BarcodeReservedLength).Substring(0, BarcodeLength));

                                        }
                                        barcode.Clear();
                                        if (PalletBarcodeLength > 0)//托盘条码
                                        {
                                            incompleteBarcode.Clear();//20150103
                                            noneBarcode.Clear();//20150103
                                            for (int j = 2; j <= PalletBarcodeLength+2; j++)
                                            {//20150103
                                                incompleteBarcode.Append("1");//PLC扫到残码,但是有货物,转换为字符'1'
                                                noneBarcode.Append("0");//PLC没扫描,没货物,保留的空值0,转换为字符'\0'
                                            }
                                            //获得托盘条码值
                                            //emptypallet=devicestates[tempdb2addr + 1];//托盘高度检测标志,0表示空托盘,1表示实托盘
                                            for (int j = 2; j < PalletBarcodeLength+2; j++)//标志位+空、实托盘+条码值
                                            {
                                                if (devicestates[tempdb2addr + j] == 1)
                                                {
                                                    barcode.Append("1");
                                                }
                                                else if (devicestates[tempdb2addr + j] == 0)
                                                {
                                                    barcode.Append("0");
                                                }
                                                else
                                                {
                                                    barcode.Append(Convert.ToChar(devicestates[tempdb2addr + j]).ToString().ToUpper());
                                                }

                                            }

                                        }
                                        #region add by lyj 20171027
                                        int heihgt = devicestates[tempdb2addr + 7];
                                        #endregion


                                        if (IsEquals(devinfo.ReturnMessage, states, states.Length) == false)
                                        {
                                            devinfo.ReturnMessage = states;
                                            Model.CGetInfo.SetDeviceMessage(devinfo);
                                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "读PLC条码", devidx.ToString(), "读标志1**条码:" + barcode.ToString().ToUpper());

                                        }

                                        #endregion

                                        //20130831richard
                                        DateTime appdt = new DateTime();
                                        if (dvsp[0]["F_Time"] == DBNull.Value)
                                        {
                                            appdt = DateTime.Now.AddSeconds(-10);
                                        }
                                        else
                                        {
                                            DateTime.TryParse(dvsp[0]["F_Time"].ToString(), out appdt);

                                        }

                                        if (dvsp[0]["F_BarCode"] != DBNull.Value)
                                        {
                                            if ((appdt.AddSeconds(5) > DateTime.Now) && (dvsp[0]["F_BarCode"].ToString() == barcode.ToString()))
                                            {
                                                dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_BarCode = '{1}',F_Time='{2}' WHERE (F_DeviceIndex = {0}) ", devidx, barcode.ToString(), DateTime.Now));
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "PLC重复上报条码:", devidx.ToString(), ",站台:" + dcode + ",条码:" + barcode.ToString().ToUpper());
                                                break;
                                            }

                                        }//20130831richard


                                        switch (dvsp[0]["F_Askkind"].ToString())
                                        {
                                            case "4":
                                                //普通条码申请任务
                                                #region 普通条码申请任务

                                                #region 扫到残码

                                                //if (barcode.ToString() == incompleteBarcode.ToString())
                                                //{//扫到残码
                                                //    RefreshMonitorEventArgs rmea;

                                                //    //if (dcode == 32634 || dcode == 42634)
                                                //    //{
                                                //    //    //自动生成条码“9+dvsp[0]["F_BindingDevice"]+顺序号”
                                                //    //    barcode.Clear();
                                                //    //    barcode.Append(GetErrorBarcode(dcode, devidx, BarcodeLength));
                                                //    //}
                                                //    //else
                                                //    //{
                                                //    //    int abst;
                                                //    //    if (int.TryParse(dvsp[0]["F_Remark"].ToString(), out abst) == true)
                                                //    //    {
                                                //    //        if (IfExitDeviceBarcodeTask(dcode, barcode.ToString()) == false)
                                                //    //        {
                                                //    //            object[] ob = new object[17] { ccf.GetTempManageIdx(), 2, barcode.ToString(), 1, 2, 1, 1, ccf.GetWarehouseIndex(), ccf.GetWarehouseIndex(), "-", dcode, dvsp[0]["F_Remark"].ToString(), "-", 0, DateTime.Now.ToString("u"), 0, Model.CGeneralFunction.TASKABEND };
                                                //    //            dbo.ExceSQL(string.Format("INSERT INTO T_Manage_Task(FID, F_ManageTaskKindIndex,FPALLETBARCODE,FMANAGETASKTYPE,FCONTROLTASKTYPE, FTASKLEVEL, FISRETURN,FSTARTWAREHOUSE,FENDWAREHOUSE, FSTARTCELL, FSTARTDEVICE, FENDDEVICE, FENDCELL, FSTATUS, FBEGTIME, FIntoStepOK,FExceptionNO)VALUES({0},{1},'{2}',{3},{4},{5},{6},'{7}','{8}','{9}',{10},{11},'{12}',{13},'{14}','{15}',{16})", ob));
                                                //    //        }
                                                //    //    }
                                                //    //    else
                                                //    //    {
                                                //    //        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理条码申请任务时:", devidx.ToString(), ",站台:" + dcode + ",扫到残缺条码!" + barcode.ToString().ToUpper());
                                                //    //        rmea = new RefreshMonitorEventArgs("notifyIcon1", "警告:向管理条码申请任务时,站台:" + dcode + ",扫到残缺条码!时间:" + DateTime.Now.ToString("u"));
                                                //    //        OnRefreshMonitor(rmea);
                                                //    //    }
                                                //    //    wv[0].Clear();
                                                //    //    wv[0].Append("2");
                                                //    //    sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                                //    //    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                //    //    dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_Time='{2}', F_BarCode = '{1}' WHERE (F_DeviceIndex = {0}) and F_BarCode<>'{1}'", devidx, barcode.ToString(), DateTime.Now));

                                                //    //    continue;//20160120
                                                //    //}
                                                //}


                                                #endregion

                                                if ((barcode.ToString() == noneBarcode.ToString()) || (barcode.ToString() == incompleteBarcode.ToString()) || (string.IsNullOrEmpty(barcode.ToString().Replace("\0", ""))))
                                                {
                                                    barcode.Clear();
                                                    //barcode.Append(GetErrorBarcode(F_NearApplyStation, devidx, NearBarcodeLength));
                                                    barcode.Append(incompleteBarcode.ToString());
                                                }

                                                #region 向管理申请任务

                                                dvbc = dboMan.ExceSQL(string.Format("SELECT DEVICE_CODE,STOCK_BARCODE FROM IO_CONTROL_APPLY WHERE APPLY_TASK_STATUS<2 and DEVICE_CODE='{0}' and (STOCK_BARCODE = '{1}')", dcode, barcode)).Tables[0].DefaultView;
                                                if (dvbc.Count <= 0)
                                                {
                                                    //dvbc = dboMan.ExceSQL(string.Format("select CONTROL_ID from IO_CONTROL  where STOCK_BARCODE like '%{0}%'", barcode)).Tables[0].DefaultView;
                                                    //if (dvbc.Count <= 0)
                                                    //{
                                                        //dvbc = dbo.ExceSQL(string.Format("select fid from T_Manage_Task  where FPALLETBARCODE like '%{0}%'", barcode)).Tables[0].DefaultView;
                                                        //if (dvbc.Count <= 0)
                                                        //{
                                                            StringBuilder dtime = new StringBuilder(DateTime.Now.ToString("u"));
                                                            dtime.Remove(dtime.Length - 1, 1);

                                                            //int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);//CONTROL_APPLY_ID
                                                            //object[] ob = new object[9] { apptype, dcode, barcode, 0, dtime, "", warehouse.ToString(), appid, BoxQuality };
                                                            
                                                            object[] ob = new object[8] { apptype, dcode, barcode, 0, dtime, "", warehouse.ToString(),Weight };
                                                            try
                                                            {

                                                                //dboMan.ExecuteSql(string.Format("INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_ID, CONTROL_APPLY_TYPE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK,WAREHOUSE_CODE,BOX_QUANTITY)VALUES ({7},{0},'{1}','{2}',{3},'{4}','{5}','{6}',{8})", ob));
                                                                dboMan.ExecuteSql(string.Format("INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_TYPE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK,WAREHOUSE_CODE,CONTROL_APPLY_PARA02)VALUES ({0},'{1}','{2}',{3},'{4}','{5}','{6}',{7})", ob));
                                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理条码申请任务:", devidx.ToString(), ",站台:" + dcode + ",条码:" + barcode.ToString().ToUpper() + ",申请类型:" + apptype.ToString());//20140218
                                                            }
                                                            catch (Exception ex)
                                                            {
                                                                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理申请入库任务时发生错误:" + ex.StackTrace + ex.Message);
                                                                OnRefreshMonitor(rmea);
                                                                continue;//20140218
                                                            }


                                                        //}
                                                    //}
                                                }

                                                #endregion

                                                #endregion
                                                break;
                                            case "7":
                                                //叠盘机前条码扫描器申请入库任务

                                                break;

                                            case "13":
                                                //条码报告完成,考虑第一个扫描器没扫到,但是第二个扫描器却扫到
                                                //没扫到或者有码无对应任务的改道异常口
                                                #region 条码报告完成

                                                //if (barcode.ToString() == incompleteBarcode.ToString())
                                                //{//扫到残码
                                                //    #region 是否具备申请任务扫码条件
                                                //    int[] statess;
                                                //    statess = CStaticClass.GetDeviceState(Convert.ToInt32(dvsp[0]["F_BindingDevice"]));
                                                //    if (statess != null)
                                                //    {
                                                //        if (statess[1] != 0)
                                                //        {
                                                //            break;

                                                //        }

                                                //    }
                                                //    else
                                                //    {
                                                //        break;
                                                //    }
                                                //    RefreshMonitorEventArgs rmea;
                                                //    char[] dd = new char[1] { '.' };
                                                //    string[] DS = ccf.GetBindingDeviceIndexOut(Convert.ToInt32(dvsp[0]["F_BindingDevice"])).Split(dd);
                                                //    int devicebyte = 0; int devbit = 0;
                                                //    if (DS.GetLength(0) > 1)
                                                //    {
                                                //        int.TryParse(DS[0], out devicebyte);
                                                //        int.TryParse(DS[1], out devbit);
                                                //        if (CStaticClass.GetDevicePhotoelectric(devicebyte, devbit) != 1)
                                                //        {

                                                //            statess = null;
                                                //            break;
                                                //        }
                                                //    }
                                                //    else
                                                //    {
                                                //        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理条码申请任务时:", devidx.ToString(), ",站台:" + dvsp[0]["F_BindingDevice"].ToString() + ",出口开关没填写记录!");
                                                //        rmea = new RefreshMonitorEventArgs("notifyIcon1", "警告:条码扫描器申请入库任务:" + dvsp[0]["F_BindingDevice"].ToString() + ",出口开关没填写记录!");
                                                //        OnRefreshMonitor(rmea);
                                                //        break;
                                                //    }
                                                //    #endregion

                                                //    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理条码申请任务时:", devidx.ToString(), ",站台:" + dcode + ",扫到残缺条码!" + barcode.ToString().ToUpper());
                                                //    rmea = new RefreshMonitorEventArgs("notifyIcon1", "警告:向管理条码申请任务时,站台:" + dcode + ",扫到残缺条码!时间:" + DateTime.Now.ToString("u"));
                                                //    OnRefreshMonitor(rmea);
                                                //    int abst;
                                                //    if (int.TryParse(dvsp[0]["F_Remark"].ToString(), out abst) == true)
                                                //    {
                                                //        if (IfExitDeviceBarcodeTask(dcode, barcode.ToString()) == false)
                                                //        {
                                                //            object[] ob = new object[17] { ccf.GetTempManageIdx(), 2, barcode.ToString(), 1, 2, 1, 1, ccf.GetWarehouseIndex(), ccf.GetWarehouseIndex(), "-", dcode, dvsp[0]["F_Remark"].ToString(), "-", 0, DateTime.Now.ToString("u"), 0, Model.CGeneralFunction.TASKABEND };
                                                //            dbo.ExceSQL(string.Format("INSERT INTO T_Manage_Task(FID, F_ManageTaskKindIndex,FPALLETBARCODE,FMANAGETASKTYPE,FCONTROLTASKTYPE, FTASKLEVEL, FISRETURN,FSTARTWAREHOUSE,FENDWAREHOUSE, FSTARTCELL, FSTARTDEVICE, FENDDEVICE, FENDCELL, FSTATUS, FBEGTIME, FIntoStepOK,FExceptionNO)VALUES({0},{1},'{2}',{3},{4},{5},{6},'{7}','{8}','{9}',{10},{11},'{12}',{13},'{14}','{15}',{16})", ob));
                                                //        }

                                                //    }

                                                //}
                                                //else
                                                //{
                                                BarcodeComplete(devidx, dcode, barcode.ToString(), dvsp[0]["F_Remark"].ToString());
                                                //}
                                                #endregion

                                                break;

                                            case "14":
                                                //PLC控制机器人码垛,成功后上报数量、托盘条码和所有表“设备”条码
                                                #region PLC控制机器人码垛,成功后上报数量、托盘条码和所有表“设备”条码,申请码垛任务
                                                //if (barcode.ToString().Length > 0)
                                                {
                                                    //
                                                    #region 测试时生成到22012的搬运任务
                                                    string lanes = ccf.GetTestInLaneway();
                                                    if (lanes != "")
                                                    {
                                                        // continue;//没有开启入库测试的巷道

                                                        string dtimes = DateTime.Now.ToString("u");//20101028
                                                        dtimes = dtimes.Substring(0, dtimes.Length - 1);//20101028
                                                        int AutoManageIdx = ccf.GetTempManageIdx();//调度任务索引
                                                        string stack = "0";//堆垛机FSTACK

                                                        string barcodes = barcode.ToString();//托盘条码

                                                        int controltype = 4;//移库

                                                        string sqlstr = string.Format("insert into T_Manage_Task(FID,FPALLETBARCODE,FCONTROLTASKTYPE,F_ManageTaskKindIndex,FSTARTWAREHOUSE,FSTARTDEVICE,FSTARTCELL,FENDWAREHOUSE,FENDDEVICE,FENDCELL,FLANEWAY,FSTACK,FUseAwayFork,FBEGTIME,FStartCol,FStartLayer) values ({0},'{1}',{2},{3},{4},{5},'{6}',{7},{8},'{9}',{10},{11},'{12}','{13}',{14},{15})", AutoManageIdx, barcodes, controltype, 2, 1, dcode, "", 1, enddeviceindex, "", "0", stack, "-", dtimes, 0, 0);

                                                        dbo.ExceSQL(sqlstr);
                                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "码垛完成生成移库任务", dcode.ToString(), AutoManageIdx.ToString());
                                                        //continue;
                                                    }

                                                    #endregion

                                                    #region 向管理申请码盘后入库任务

                                                    if (apptype < 10)
                                                    {
                                                        //模拟上报管理系统数量
                                                        if (BoxQuality == 0)
                                                        {
                                                            BoxQuality = 4;
                                                        }

                                                        //parameter.Remove(0,parameter.Length);
                                                        //for (int i=1;i<=BoxQuality;i++)
                                                        //{
                                                        //    parameter.Append(i);
                                                        //    if (i < BoxQuality)
                                                        //    {
                                                        //        parameter.Append(";");
                                                        //    }

                                                        //}


                                                        #region 判断是否有已经存在的任务
                                                        /*
                                                         //此处交给管理系统判断,否则码垛不好处理
                                                        if (barcode.ToString().IndexOf(noreadbarcode.ToString()) < 0)//在读取到条码的情况下才判断,11111不判断
                                                        {
                                                        sql.Remove(0, sql.Length);
                                                        sql.Append(
                                                            "SELECT FPALLETBARCODE,FSTARTDEVICE FROM T_Manage_Task  where FSTARTDEVICE=")
                                                            .Append(dcode)
                                                            .Append(" AND FPALLETBARCODE='")
                                                            .Append(barcode)
                                                            .Append("'");
                                                        //20091128
                                                        dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                                        if (dvbc.Count > 0)
                                                        {
                                                            wv[0].Clear();
                                                            wv[0].Append("2");
                                                            sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                            RefreshMonitorEventArgs rmea =
                                                                new RefreshMonitorEventArgs("tsStatus",
                                                                    dcode.ToString() + "码盘位,托盘条码:" + barcode +
                                                                    ",重复收到码盘结束信号!发生时间:" + DateTime.Now.ToString("u"));
                                                            OnRefreshMonitor(rmea);
                                                            errtext = "SControlMonitor.DealWithDeviceState时" +
                                                                      dcode.ToString() + "码盘位,托盘条码:" + barcode +
                                                                      ",重复收到码盘结束信号!发生时间:" + DateTime.Now.ToString("u");
                                                            continue;

                                                        }


                                                        //20090922
                                                        sql.Remove(0, sql.Length);
                                                        sql.Append(
                                                            "SELECT STOCK_BARCODE,START_DEVICE_CODE FROM IO_CONTROL  where START_DEVICE_CODE=")
                                                            .Append(dcode)
                                                            .Append(" AND STOCK_BARCODE='")
                                                            .Append(barcode)
                                                            .Append("'");
                                                        dvbc = dboMan.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                                        if (dvbc.Count > 0)
                                                        {
                                                            wv[0].Clear();
                                                            wv[0].Append("2");
                                                            sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                            RefreshMonitorEventArgs rmea =
                                                                new RefreshMonitorEventArgs("tsStatus",
                                                                    dcode.ToString() + "码盘位,托盘条码:" + barcode +
                                                                    ",重复收到码盘结束信号!发生时间:" + DateTime.Now.ToString("u"));
                                                            OnRefreshMonitor(rmea);
                                                            errtext = "SControlMonitor.DealWithDeviceState时" +
                                                                      dcode.ToString() + "码盘位,托盘条码:" + barcode +
                                                                      ",重复收到码盘结束信号!发生时间:" + DateTime.Now.ToString("u");
                                                            continue;

                                                        }

                                                        sql.Remove(0, sql.Length);
                                                        sql.Append(
                                                            "SELECT DEVICE_CODE,STOCK_BARCODE FROM IO_CONTROL_APPLY WHERE APPLY_TASK_STATUS=0 and DEVICE_CODE='")
                                                            .Append(dcode)
                                                            .Append("' and (STOCK_BARCODE = '")
                                                            .Append(barcode)
                                                            .Append("')");
                                                        dvbc = dboMan.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                                        if (dvbc.Count > 0)
                                                        {
                                                            wv[0].Clear();
                                                            wv[0].Append("2");
                                                            sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                            RefreshMonitorEventArgs rmea =
                                                                new RefreshMonitorEventArgs("tsStatus",
                                                                    string.Format(
                                                                        "SControlMonitor.DealWithDeviceState时向管理申请码垛入库任务时,申请的任务条码:{0}已经存在!",
                                                                        barcode.ToString()));
                                                            OnRefreshMonitor(rmea);
                                                            errtext =
                                                                string.Format(
                                                                    "SControlMonitor.DealWithDeviceState时向管理申请码垛入库任务时,申请的任务条码:{0}已经存在!",
                                                                    barcode.ToString());
                                                            continue;
                                                        }
                                                        }
                                                        */

                                                        #endregion

                                                        //向管理申请入库任务
                                                        string dtime = DateTime.Now.ToString("u");
                                                        dtime = dtime.Substring(0, dtime.Length - 1);
                                                        //int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);
                                                        //CONTROL_APPLY_ID
                                                        object[] ob = new object[8]
                                                       {
                                                        apptype, warehouse.ToString(), dcode, barcode,0, dtime, BoxQuality, parameter.ToString()
                                                        };
                                                        sql.Remove(0, sql.Length);
                                                        //string s4s = string.Format("INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_TYPE,WAREHOUSE_CODE, DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_PARA01,CONTROL_APPLY_PARAMETER)VALUES ({0},'{1}','{2}','{3}',{4},'{5}',{6},'{7}')", ob);
                                                        //  apptype, "warehouse.ToString()", "dcode", "barcode",0, "dtime", BoxQuality," parameter.ToString()"
                                                        sql.Append(string.Format("INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_TYPE,WAREHOUSE_CODE, DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_PARA01,CONTROL_APPLY_PARAMETER)VALUES ({0},'{1}','{2}','{3}',{4},'{5}',{6},'{7}')", ob));
                                                        //sql.Append(
                                                        //    "INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_TYPE,WAREHOUSE_CODE, DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_PARA01,CONTROL_APPLY_PARAMETER)VALUES ")
                                                        //    .Append(
                                                        //        "(")
                                                        //    .Append(apptype)
                                                        //    .Append(",'")
                                                        //    .Append(warehouse.ToString())
                                                        //    .Append("','")
                                                        //    .Append(dcode)
                                                        //    .Append("','")
                                                        //    .Append(barcode)
                                                        //    .Append("',0,'")
                                                        //    .Append(dtime)
                                                        //    .Append("',")
                                                        //    .Append(BoxQuality)
                                                        //    .Append(",'")
                                                        //    .Append(parameter.ToString())
                                                        //    .Append("')"); //20130510
                                                        try
                                                        {
                                                            dboMan.ExceSQL(sql.ToString());
                                                            //20091128
                                                            sql.Remove(0, sql.Length);
                                                            sql.Append("UPDATE T_Base_PLC_Ask SET F_FirstProject = '")
                                                                .Append(parameter.ToString())
                                                                .Append(
                                                                    "',F_Remark='' WHERE (F_Askkind = 14) AND (F_BindingDevice = ")
                                                                .Append(dvsp[0]["F_BindingDevice"])
                                                                .Append(")");
                                                            dbo.ExceSQL(sql.ToString());
                                                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient",
                                                                "向管理申请码垛入库任务:", devidx.ToString(),
                                                                ",站台:" + dcode + ",数量:" + BoxQuality.ToString() + ",托盘条码:" + barcode.ToString().ToUpper() +
                                                                ",垛条码:" + parameter.ToString());

                                                        }
                                                        catch (Exception ex)
                                                        {
                                                            RefreshMonitorEventArgs rmea =
                                                                new RefreshMonitorEventArgs("tsStatus",
                                                                    "向管理申请码垛入库任务:" + ex.StackTrace + ex.Message);
                                                            OnRefreshMonitor(rmea);
                                                            errtext = "向管理申请码垛入库任务:" + ex.StackTrace;
                                                            continue; //20140218
                                                        }
                                                    }

                                                    #endregion

                                                }

                                                #endregion

                                                break;
                                            case "15":
                                                //多叉顶升机条码组申请入库//20140218

                                                //#region 多叉向管理申请任务
                                                //StringBuilder devbind = new StringBuilder();
                                                //StringBuilder devbinds = new StringBuilder();
                                                //parameter.Clear();
                                                //for (int i = 0; i < BarcodeForkAmount; i++)
                                                //{
                                                //    bool ifexit = false;
                                                //    if (appbarArray[i].ToString() != noneBarcode.ToString())
                                                //    {
                                                //        devbind.Clear();
                                                //        devbind.Append(dcode.ToString() + ((i + 1).ToString()));
                                                //        devbinds.Append("|").Append(devbind);
                                                //        if (appbarArray[i].ToString() == incompleteBarcode.ToString())//扫到残码,但是有货物
                                                //        {//自动生成条码“9+dvsp[0]["F_BindingDevice"]+顺序号”

                                                //            parameter.Append("|").Append(GetErrorBarcode(dcode, devidx, BarcodeLength));
                                                //        }
                                                //        else
                                                //        {
                                                //            parameter.Append("|").Append(appbarArray[i].ToString());
                                                //        }
                                                //        dvbc = dboMan.ExceSQL(string.Format("SELECT DEVICE_CODE,STOCK_BARCODE FROM IO_CONTROL_APPLY WHERE APPLY_TASK_STATUS<2 and DEVICE_CODE='{0}' and (STOCK_BARCODE = '{1}')", devbind, appbarArray[i].ToString())).Tables[0].DefaultView;
                                                //        if (dvbc.Count > 0)
                                                //        {
                                                //            ifexit = true;
                                                //        }
                                                //        dvbc = dboMan.ExceSQL(string.Format("select CONTROL_ID from IO_CONTROL  where STOCK_BARCODE like '%{0}%'", appbarArray[i].ToString())).Tables[0].DefaultView;
                                                //        if (dvbc.Count > 0)
                                                //        {
                                                //            ifexit = true;
                                                //        }
                                                //        dvbc = dbo.ExceSQL(string.Format("select fid from T_Manage_Task  where FPALLETBARCODE like '%{0}%'", appbarArray[i].ToString())).Tables[0].DefaultView;
                                                //        if (dvbc.Count > 0)
                                                //        {
                                                //            ifexit = true;
                                                //        }

                                                //    }

                                                //    if (ifexit == true)
                                                //    {
                                                //        RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理申请入库任务时发生错误:条码" + appbarArray[i].ToString() + "对应的管理任务已经存在!");
                                                //        OnRefreshMonitor(rmea);
                                                //    }
                                                //}
                                                //if (devbinds.ToString().Length > 1)
                                                //{

                                                //    devbinds = new StringBuilder(devbinds.ToString().Substring(1));
                                                //    parameter = new StringBuilder(parameter.ToString().Substring(1));
                                                //    barcode.Clear();//记录堆垛机最大叉的箱条码
                                                //    barcode.Append(appbarArray[BarcodeForkAmount - 1].ToString());
                                                //    string dtime = DateTime.Now.ToString("u");
                                                //    dtime = dtime.Substring(0, dtime.Length - 1);
                                                //    int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);//CONTROL_APPLY_ID
                                                //    object[] ob = new object[8] { apptype, devbinds.ToString(), parameter.ToString(), 0, dtime, "", warehouse.ToString(), appid };
                                                //    try
                                                //    {
                                                //        dboMan.ExecuteSql(string.Format("INSERT INTO IO_CONTROL_APPLY( CONTROL_APPLY_ID,CONTROL_APPLY_TYPE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK,WAREHOUSE_CODE)VALUES ({7},{0},'{1}','{2}',{3},'{4}','{5}','{6}')", ob));
                                                //        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理条码申请任务:", devidx.ToString(), ",站台:" + dcode + ",条码:" + parameter.ToString().ToUpper());//20140218
                                                //        sql.Remove(0, sql.Length);
                                                //        sql.Append("UPDATE T_Base_PLC_Ask SET F_FirstProject = '").Append(parameter.ToString()).Append(" WHERE  F_DeviceIndex = ").Append(devidx);
                                                //        dbo.ExecuteSql(sql.ToString());
                                                //    }
                                                //    catch (Exception ex)
                                                //    {
                                                //        RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理申请入库任务时发生错误:" + ex.StackTrace + ex.Message);
                                                //        OnRefreshMonitor(rmea);
                                                //        continue;//20140218

                                                //    }


                                                //}

                                                //#endregion

                                                break;
                                            case "16":
                                                #region 16,PLC入库扫码申请分道
                                                //异步调用管理系统的服务,true:可以入库;false剔出
                                                //object asyncState = new object();

                                                //AsyncCallback cb = new AsyncCallback(FactorizeCallback);

                                                // IAsyncResult ar = g_manageService.BeginManageInStorageCheckout(barcode.ToString(), dcode.ToString(), cb, asyncState);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "调用管理分道时:", dcode.ToString(), ",条码:" + barcode);
                                                //g_manageService.ManageInStorageCheckoutAsync(barcode.ToString(), dcode.ToString());
                                                #endregion

                                                break;
                                            case "17":

                                                #region 叠箱机上报个数和箱条码

                                                //if (parameter.ToString().Length > 0)
                                                {
                                                    #region 测试时生成到22012的搬运任务
                                                    string lanes = ccf.GetTestInLaneway();
                                                    //if (lanes != "")
                                                    {

                                                        barcode.Append(BoxQuality.ToString());//将空托盘的数量付给条码
                                                        string dtimes = DateTime.Now.ToString("u");//20101028
                                                        dtimes = dtimes.Substring(0, dtimes.Length - 1);//20101028
                                                        int AutoManageIdx = ccf.GetTempManageIdx();//调度任务索引
                                                        string stack = "0";//堆垛机FSTACK

                                                        string barcodes = string.Format("{0}EmptyPallet", BoxQuality); //托盘条码

                                                        int controltype = 4;//移库

                                                        string sqlstr = string.Format("insert into T_Manage_Task(FID,FPALLETBARCODE,FCONTROLTASKTYPE,F_ManageTaskKindIndex,FSTARTWAREHOUSE,FSTARTDEVICE,FSTARTCELL,FENDWAREHOUSE,FENDDEVICE,FENDCELL,FLANEWAY,FSTACK,FUseAwayFork,FBEGTIME,FStartCol,FStartLayer) values ({0},'{1}',{2},{3},{4},{5},'{6}',{7},{8},'{9}',{10},{11},'{12}','{13}',{14},{15})", AutoManageIdx, barcodes, controltype, 2, 1, dcode, "", 1, enddeviceindex, "", "0", stack, "-", dtimes, 0, 0);

                                                        dbo.ExceSQL(sqlstr);
                                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "叠盘完成生成站台间移库任务", dcode.ToString(), AutoManageIdx.ToString());
                                                    }

                                                    #endregion
                                                    #region 向管理申请叠箱后入库任务

                                                    /*
                                                    //向管理申请入库任务
                                                     int count=devicestates[tempdb2addr + 1];//叠盘机上的数量
                                                    string dtimes2 = DateTime.Now.ToString("u");
                                                    dtimes2 = dtimes2.Substring(0, dtimes2.Length - 1);
                                                    //int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);//CONTROL_APPLY_ID
                                                    sql.Remove(0, sql.Length);
                                                    sql.Append("INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_TYPE,WAREHOUSE_CODE, DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,BOX_QUANTITY,CONTROL_APPLY_PARAMETER)VALUES ").Append(
                                                        "(").Append(apptype).Append(",'").Append(warehouse.ToString()).Append("','").Append(dcode).Append("','").Append(barcode).Append("',0,'").Append(dtimes2).Append("',").Append(BoxQuality).Append(",'").Append(parameter.ToString()).Append("')");//20130510
                                                    try
                                                    {
                                                        dboMan.ExceSQL(sql.ToString());
                                                        //20091128
                                                        sql.Remove(0, sql.Length);
                                                        sql.Append("UPDATE T_Base_PLC_Ask SET F_FirstProject = '").Append(count).Append("',F_Remark='' WHERE (F_Askkind = 17) AND (F_BindingDevice = ").Append(dvsp[0]["F_BindingDevice"]).Append(")");
                                                        dbo.ExceSQL(sql.ToString());
                                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理申请叠箱入库任务", devidx.ToString(), dcode + "条码" + barcode.ToString().ToUpper() + "垛条码:" + parameter.ToString());

                                                    }
                                                    catch (Exception ex)
                                                    {
                                                        RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理申请叠箱入库任务:" + ex.StackTrace + ex.Message);
                                                        OnRefreshMonitor(rmea);
                                                        errtext = "向管理申请叠箱入库任务:" + ex.StackTrace;
                                                        continue;//20140218
                                                    }
                                                    */

                                                    #endregion

                                                }

                                                #endregion

                                                break;

                                            case "40":
                                                //lishuo 湖西6垛机条码比对 此处记录条码,命令发送时进行条码报完成 
                                                if ((barcode.ToString() == incompleteBarcode.ToString()) || (string.IsNullOrEmpty(barcode.ToString().Replace("\0", ""))))
                                                {
                                                    barcode.Clear();
                                                    barcode.Append(incompleteBarcode.ToString());

                                                }
                                                //获取堆垛机设备信息
                                               //var device= Model.CGetInfo.GetDeviceInfo(dcode);
                                           
                                               // dvbc = dboMan.ExceSQL(string.Format("SELECT 条码 FROM V_Monitor_Task WHERE 设备指令索引={0})", device.TaskNo)).Tables[0].DefaultView;//从视图表获取任务条码
                                               // if (dvbc.Count > 0)
                                               // {
                                               //     if (dvbc[0]["条码"].ToString() == barcode.ToString())//条码和扫码结果一致正常回复
                                               //     {
                                               //         witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                               //         wv[0].Clear();
                                               //         wv[0].Append("2");
                                               //         sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                               //         sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                               //     }
                                               //     else
                                               //     {//条码和扫码结果不一致,暂定回复99
                                               //         witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                               //         wv[0].Clear(); 
                                               //         wv[0].Append("99");
                                               //         sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                               //         sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                               //     }
                                               // }
                                               // else//无对应任务 暂定正常回复
                                               // {
                                                    witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                                    wv[0].Clear();
                                                    wv[0].Append("2");
                                                    sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                //}
                                              
                                               // CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写条码应答", devidx.ToString(), "写标志2**源条码:" + barcode.ToString().ToUpper());
                                                break;
                                            default:
                                                //无类型,条码比对或者记录条码

                                                break;
                                        }

                                        witemnames[0].Clear();
                                        witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                        wv[0].Clear();
                                        wv[0].Append("2");
                                        sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);

                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写条码应答", devidx.ToString(), "写标志2**源条码:" + barcode.ToString().ToUpper());
                                        //dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_Time='{2}', F_BarCode = '{1}' WHERE (F_DeviceIndex = {0}) and F_BarCode<>'{1}'", devidx, barcode.ToString(), DateTime.Now));
                                        dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_Time='{2}', F_BarCode = '{1}',F_TempFirstProject='{3}' WHERE (F_DeviceIndex = {0}) ", devidx, barcode.ToString(), DateTime.Now, emptypallet));

                                    }
                                    break;
                                #endregion

                                #region 现场触摸屏
                                case 22:
                                    #region 立库触摸屏
                                    if (devicestates[tempdb2addr + 0] != 1) continue;
                                    //申请任务变更
                                    bcz = 0;
                                    askOrder = devicestates[tempdb2addr + 1];//命令字
                                    askDevice = (devicestates[tempdb2addr + 2] << 8) + devicestates[tempdb2addr + 3];//设备索引
                                    taskindex = (devicestates[tempdb2addr + 4] << 8) + devicestates[tempdb2addr + 5];//任务号
                                    askDevinfo = Model.CGetInfo.GetDeviceInfo(askDevice);

                                    if (askDevinfo == null)
                                    {
                                        wv[0].Remove(0, wv[0].Length);
                                        wv[0].Append("37");

                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "37申请的设备号不存在");
                                        break;
                                    }
                                    barcode.Clear();
                                    for (int j = 6; j < 13; j++)
                                    {
                                        bcz = bcz + devicestates[tempdb2addr + j];
                                        barcode.Append(Convert.ToChar(devicestates[tempdb2addr + j]).ToString().ToUpper());

                                    }
                                    states = new int[13];
                                    Array.Copy(devicestates, tempdb2addr, states, 0, 13);
                                    if (IsEquals(devinfo.ReturnMessage, states, 13) == false)
                                    {
                                        devinfo.ReturnMessage = states;
                                        Model.CGetInfo.SetDeviceMessage(devinfo);
                                        sss.Remove(0, sss.Length);
                                        sss.Append("**触摸屏设备索引" + devidx).Append("**命令字" + askOrder)
                                           .Append("**申请的设备索引" + askDevice).Append("**申请的任务号" + taskindex).Append("**申请的条码" + barcode);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到现场控制触摸屏申请信息", devidx.ToString(), sss.ToString());
                                    }


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

                                    if (askOrder == 1)//命令字
                                    {
                                        if (taskindex == 0)//无任务号
                                        {
                                            if (bcz == 0)//无条码号
                                            {
                                                //32申请的任务号和条形码都不存在
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("32");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "32申请的任务号和条形码都不存在");
                                                break;
                                            }
                                            else//有条码号
                                            {
                                                #region 有条码号

                                                if (askDevinfo.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
                                                {
                                                    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
                                                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;

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

                                                    ResetSendorder(askDevice, Convert.ToInt32(dv[0]["F_MonitorIndex"]), GetRouteIDsub(askDevice), Convert.ToInt32(dv[0]["F_NumParam4"]));
                                                    wv[0].Remove(0, wv[0].Length);
                                                    wv[0].Append("4");
                                                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                }
                                                else
                                                {
                                                    //35申请的设备号和条形码不匹配
                                                    wv[0].Remove(0, wv[0].Length);
                                                    wv[0].Append("35");
                                                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "35申请的设备号和条形码不匹配");
                                                    break;
                                                }

                                                #endregion
                                            }
                                        }
                                        else//有任务号
                                        {
                                            #region 有任务号
                                            if (askDevinfo.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(
                                                        taskindex).Append("' order by F_MonitorIndex asc");
                                            }
                                            else
                                            {
                                                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(
                                                        taskindex).Append("' order by F_MonitorIndex asc");
                                            }
                                            //20101008
                                            dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;

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

                                                ResetSendorder(askDevice, taskindex, GetRouteIDsub(askDevice), Convert.ToInt32(dv[0]["F_NumParam4"]));
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("4");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                            }
                                            else
                                            {
                                                //36申请的设备号和任务号不匹配
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("36");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "36申请的设备号和任务号不匹配");
                                                break;
                                            }

                                            #endregion
                                        }

                                    }

                                    #endregion

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

                                    else if (askOrder == 2)//命令字
                                    {


                                        break;
                                    }

                                    #endregion

                                    #region 上报完成(3)
                                    else if (askOrder == 3)//命令字
                                    {
                                        if (taskindex == 0)//无任务号
                                        {
                                            if (bcz == 0)//无条码号
                                            {
                                                //32申请的任务号和条形码都不存在
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("32");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "32申请的任务号和条形码都不存在");
                                                break;
                                            }
                                            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");
                                                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                                if (dv.Count > 0)
                                                {
                                                    AssociateComplete(askDevice, Convert.ToInt32(dv[0]["F_MonitorIndex"]));
                                                    wv[0].Remove(0, wv[0].Length);
                                                    wv[0].Append("2");
                                                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                }
                                                else
                                                {
                                                    //30申请的条码号不存在
                                                    wv[0].Remove(0, wv[0].Length);
                                                    wv[0].Append("30");
                                                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "30申请的条码号不存在");
                                                    break;
                                                }
                                                #endregion
                                            }
                                        }
                                        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_MonitorIndex = '").Append(
                                                        taskindex).Append("'  order by F_MonitorIndex asc");
                                            dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                            if (dv.Count > 0)
                                            {
                                                AssociateComplete(askDevice, Convert.ToInt32(dv[0]["F_MonitorIndex"]));
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("2");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                            }
                                            else
                                            {
                                                //31申请的任务号不存在
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("31");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "31申请的任务号不存在");
                                                break;
                                            }

                                            #endregion
                                        }

                                    }
                                    #endregion

                                    #region 删除当前设备所执行的任务(4)(托盘拿走)
                                    else if (askOrder == 4)//命令字
                                    {
                                        if (taskindex == 0)//无任务号
                                        {
                                            if (bcz == 0)//无条码号
                                            {
                                                //32申请的任务号和条形码都不存在
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("32");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "32申请的任务号和条形码都不存在");
                                                break;
                                            }
                                            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");
                                                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                                if (dv.Count > 0)
                                                {
                                                    DeleteDeviceTask(Convert.ToInt32(dv[0]["F_MonitorIndex"]));
                                                    wv[0].Remove(0, wv[0].Length);
                                                    wv[0].Append("3");
                                                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                }
                                                else
                                                {
                                                    //30申请的条码号不存在
                                                    wv[0].Remove(0, wv[0].Length);
                                                    wv[0].Append("30");
                                                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "30申请的条码号不存在");
                                                    break;
                                                }
                                                #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(
                                                                taskindex).Append("' order by F_MonitorIndex asc");
                                            dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                            if (dv.Count > 0)
                                            {
                                                DeleteDeviceTask(Convert.ToInt32(dv[0]["F_MonitorIndex"]));
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("3");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                            }
                                            else
                                            {
                                                //31申请的任务号不存在
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("31");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "31申请的任务号不存在");
                                                break;
                                            }
                                            #endregion
                                        }
                                    }
                                    #endregion

                                    break;

                                    #endregion
                                case 32:
                                    #region 高端触摸屏
                                    if (devicestates[tempdb2addr + 0] != 1) continue;
                                    //20120207申请任务变更
                                    bcz = 0;
                                    askOrder = devicestates[tempdb2addr + 1];//命令字
                                    askDevice = (devicestates[tempdb2addr + 2] << 32) + (devicestates[tempdb2addr + 3] << 16) + (devicestates[tempdb2addr + 4] << 8) + devicestates[tempdb2addr + 5];//设备索引

                                    askDevinfo = Model.CGetInfo.GetDeviceInfo(askDevice);

                                    if (askDevinfo == null)
                                    {
                                        wv[0].Remove(0, wv[0].Length);
                                        wv[0].Append("34");

                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "34申请的设备号不存在");
                                        break;
                                    }
                                    barcode.Clear();
                                    for (int j = 8; j <= 13; j++)
                                    {
                                        bcz = bcz + devicestates[tempdb2addr + j];
                                        barcode.Append(Convert.ToChar(devicestates[tempdb2addr + j]).ToString().ToUpper());

                                    }

                                    states = new int[14];
                                    Array.Copy(devicestates, tempdb2addr, states, 0, 12);
                                    if (IsEquals(devinfo.ReturnMessage, states, 14) == false)
                                    {
                                        devinfo.ReturnMessage = states;
                                        Model.CGetInfo.SetDeviceMessage(devinfo);
                                        sss.Remove(0, sss.Length);
                                        sss.Append("**触摸屏设备:" + devinfo.DeviceName).Append("**命令字" + askOrder)
                                           .Append("**申请的设备索引" + askDevice).Append("**申请的条码" + barcode);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到现场控制触摸屏申请信息", devidx.ToString(), sss.ToString());
                                    }


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

                                    if (askOrder == 1)//命令字
                                    {
                                        if (bcz == 0)//无条码号
                                        {
                                            //30申请条形码不存在
                                            wv[0].Remove(0, wv[0].Length);
                                            wv[0].Append("30");
                                            sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "30申请的条形码不存在");
                                            break;
                                        }
                                        else//有条码号
                                        {
                                            #region 有条码号

                                            int asktaskindex = GetMonitorAskTaskIndexFromBarCode(barcode);
                                            if (asktaskindex > 0)
                                            {
                                                sql.Remove(0, sql.Length);
                                                //20120220F_NumParam1改为askDevice,F_NumParam2改为触摸屏设备的DB1,F_SendFlag=2
                                                sql.Append("update T_Monitor_Task set  F_SendFlag=2,F_Status=0,F_AheadDetect='',F_NumParam1=").Append(askDevice).Append(",F_NumParam2=").Append(devinfo.Dbw1Address).Append("  where F_MonitorIndex=").Append(asktaskindex).Append("");
                                                dbo.ExceSQL(sql.ToString());
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("4");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "4申请重发应答");

                                            }
                                            else
                                            {

                                                //33申请的设备号和条形码不匹配
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("33");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "33申请的设备号和条形码不匹配");
                                                break;
                                            }

                                            #endregion
                                        }

                                    }
                                    #endregion

                                    #region 上报完成(3)
                                    else if (askOrder == 3)//命令字
                                    {
                                        if (bcz == 0)//无条码号
                                        {
                                            //30申请的条形码不存在
                                            wv[0].Remove(0, wv[0].Length);
                                            wv[0].Append("30");
                                            sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "30申请的条形码不存在");
                                            break;
                                        }
                                        else//有条码号
                                        {
                                            #region 有条码号
                                            int asktaskindex = GetMonitorAskTaskIndexFromBarCode(barcode);
                                            if (asktaskindex > 0)
                                            {
                                                AssociateComplete(askDevice, asktaskindex);
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("2");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                            }
                                            else
                                            {
                                                //33申请的条码号不存在
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("33");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "发送现场控制触摸屏申请的反馈信息", devidx.ToString(), "33申请的设备号和条码号不匹配");
                                                break;
                                            }
                                            #endregion
                                        }
                                    }
                                    #endregion

                                    break;

                                    #endregion
                                #endregion

                                #region 高端设备

                                case 31://工位输送机
                                    barcode.Remove(0, barcode.Length);
                                    for (int i = 2; i <= 7; i++)
                                    {
                                        barcode.Append(Convert.ToChar(devicestates[tempdb2addr + i]));

                                    }
                                    #region 判断是否满足条码的正则表达式
                                    if (ccf.GetCodeCheck(barcode.ToString()) == false) continue;
                                    #endregion

                                    taskindex = GetMonitorRunTaskIndexFromBarCode(barcode);

                                    states = new int[8];
                                    Array.Copy(devicestates, tempdb2addr, states, 0, 8);
                                    if (IsEquals(devinfo.ReturnMessage, states, 8) == false)
                                    {
                                        devinfo.ReturnMessage = states;
                                        Model.CGetInfo.SetDeviceMessage(devinfo);
                                        sss.Remove(0, sss.Length);
                                        sss.Append("**条码:").Append(barcode).Append("**读标志" + devicestates[tempdb2addr + 0]).Append("**状态" + state).Append("**任务号" + taskindex);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到输送机机状态", devidx.ToString(), sss.ToString());
                                    }
                                    //if (devicestates[tempdb2addr + 0] != 1) continue;
                                    if ((state <= 1) || (taskindex <= 0))
                                    {
                                        continue;
                                    }
                                    //int order = 0;
                                    //string datetime = GetMonitorTaskStartTime(taskindex,out order );
                                    //if ((datetime != "-") && (order==6))
                                    //{
                                    //    if (Convert.ToDateTime(datetime.Substring(0, 19)).AddSeconds(8) > DateTime.Now)
                                    //    {//20120328
                                    //        break;
                                    //    }
                                    //}
                                    if (state == 2)
                                    {//20120405complete
                                        cgs.GetKindDeviceState(GetMonitorTaskIndexFromBarCode(barcode, devinfo), devidx, state);
                                    }
                                    else
                                    {//20120405error
                                        cgs.GetKindDeviceState(taskindex, devidx, state);
                                    }

                                    break;

                                #endregion

                                #region 到抓取位的两组一号工程码信息
                                case 21:
                                    #region 获取一号工程码信息F_Askkind=8
                                    //F_BindingDevice 绑定设备号+“7”代表存放机器人抓取位的两箱一号工程码的“设备”
                                    //F_BindingDevice 绑定设备号+“8”代表存放码垛位码垛信息的“设备”
                                    sql.Remove(0, sql.Length);
                                    sql.Append("SELECT F_DeviceIndex, F_FirstProject,F_BoxBarcode,F_HaveFirstProject, F_Askkind, F_BindingDevice,F_DoubleFirstProject FROM T_Base_PLC_Ask WHERE (F_Askkind = 8) AND (F_BindingDevice = ").Append(devidx.ToString().Substring(0, devidx.ToString().Length - 1)).Append(")");
                                    dvsp = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                    if (dvsp.Count > 0)
                                    {
                                        barcode.Clear();
                                        for (int j = 0; j <= 32; j++)
                                        {
                                            barcode.Append(devicestates[tempdb2addr + j].ToString().ToUpper());

                                        }
                                        string bcp = barcode.ToString().Substring(1);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "到抓取位的两组一号工程码:", devidx.ToString(), bcp);
                                        string bar1 = "", bar2 = "";
                                        string ExceptionCode = "0";

                                        bar1 = bcp.Substring(0, 16);
                                        bar2 = bcp.Substring(16, 16);

                                        if ((bar1 == "0000000000000000") || (bar1 == "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"))
                                        {

                                            if (dvsp[0]["F_HaveFirstProject"].ToString() == "1")
                                            {
                                                ExceptionCode = "800";
                                            }
                                            else
                                            {
                                                ExceptionCode = "0";
                                            }
                                            bcp = "";
                                        }
                                        else
                                        {
                                            if (dvsp[0]["F_HaveFirstProject"].ToString() == "1")
                                            {
                                                ExceptionCode = "0";

                                            }
                                            else
                                            {
                                                ExceptionCode = "800";
                                            }
                                            bcp = bar1;
                                        }
                                        if ((bar2 != "0000000000000000") && (bar2 != "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"))
                                        {
                                            if (dvsp[0]["F_HaveFirstProject"].ToString() != "1")
                                            {
                                                ExceptionCode = "800";
                                            }
                                            else
                                            {
                                                ExceptionCode = "0";
                                            }
                                            bcp = bcp + ";" + bar2;
                                        }
                                        if (bcp.Length >= 1)
                                        {
                                            if (bcp.Substring(0, 1) == ";")
                                            {
                                                if (bcp.Length > 1)
                                                {
                                                    bcp = bcp.Substring(1);
                                                }
                                                else
                                                {
                                                    bcp = "";
                                                }
                                            }
                                        }
                                        if (ExceptionCode == "800")
                                        {
                                            //判断是否为无码烟,是无码烟不报告异常码,否则报告异常码
                                            sql.Remove(0, sql.Length);
                                            sql.Append("UPDATE T_Base_PLC_Ask SET F_Remark='").Append(ExceptionCode).Append("' WHERE (F_Askkind = 8) AND (F_BindingDevice = ").Append(dvsp[0]["F_BindingDevice"]).Append(")");
                                            dbo.ExceSQL(sql.ToString());
                                        }
                                        //两箱到机器人抓取位,未报告抓取完成的两组一号工程码临时保存区
                                        sql.Remove(0, sql.Length);
                                        sql.Append("UPDATE T_Base_PLC_Ask SET F_DoubleFirstProject = '").Append(bcp).Append("' WHERE (F_Askkind = 8) AND (F_BindingDevice = ").Append(dvsp[0]["F_BindingDevice"]).Append(")");
                                        dbo.ExceSQL(sql.ToString());

                                        wv[0].Remove(0, wv[0].Length);
                                        wv[0].Append("2");
                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                    }


                                    #endregion
                                    break;
                                #endregion

                                #region 烟厂成品机器人码垛信息(抓取完成、放完成、码垛完成)
                                case 24:
                                    #region 成品码垛结束,向管理申请入库任务
                                    //把码盘位输送机,托盘条码,一号工程码信息,码垛数量整合生成向管理申请入库任务
                                    //清空托盘条码、一号工程码信息、异常码信息F_Remark
                                    //设备号:绑定设备号+“6”代表存放码垛位托盘条码的“设备”;绑定设备号+“7”代表存放机器人抓取位的两箱一号工程码的“设备”
                                    //绑定设备号+“8”代表存放码垛位码垛信息的“设备”
                                    sql.Remove(0, sql.Length);
                                    sql.Append("SELECT F_BarCode, F_DeviceIndex, F_FirstProject,F_BoxBarcode,F_HaveFirstProject, F_Askkind, F_BindingDevice,F_DoubleFirstProject FROM T_Base_PLC_Ask WHERE (F_Askkind = 8) AND (F_DeviceIndex = ").Append(devidx).Append(")");
                                    dvsp = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                    if (dvsp.Count > 0)
                                    {

                                        //[1]机器人动作:1-取货完成;2-放货完成;3-托盘码垛完成
                                        //[2]托盘码垛数量
                                        if (states[1] == 1)//取货完成
                                        {
                                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "机器人码垛信息", devidx.ToString(), devidx.ToString() + "取货完成");
                                            sql.Remove(0, sql.Length);
                                            sql.Append("UPDATE T_Base_PLC_Ask SET F_TempFirstProject =   F_DoubleFirstProject WHERE (F_Askkind = 8) AND (F_DeviceIndex = ").Append(devidx).Append(") and (F_DoubleFirstProject<>'')");
                                            dbo.ExceSQL(sql.ToString());

                                        }
                                        else if (states[1] == 2)//放货完成
                                        {
                                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "机器人码垛信息", devidx.ToString(), devidx.ToString() + "放货完成");
                                            sql.Remove(0, sql.Length);
                                            sql.Append("UPDATE T_Base_PLC_Ask SET F_FirstProject =F_FirstProject).Append(';').Append( F_TempFirstProject  WHERE (F_Askkind = 8) AND (F_DeviceIndex = ").Append(devidx).Append(") and (F_TempFirstProject<>'')");
                                            dbo.ExceSQL(sql.ToString());
                                            sql.Remove(0, sql.Length);
                                            sql.Append("UPDATE T_Base_PLC_Ask SET F_TempFirstProject='' WHERE (F_Askkind = 8) AND (F_DeviceIndex = ").Append(devidx).Append(")");
                                            dbo.ExceSQL(sql.ToString());
                                        }
                                        else if (states[1] == 3)//码盘结束
                                        {
                                            #region 码盘结束

                                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "机器人码垛信息", devidx.ToString(), devidx.ToString() + "码盘结束");
                                            //读取托盘条码;
                                            barcode.Clear();
                                            barcode.Append(dvsp[0]["F_BarCode"].ToString());
                                            if ((barcode == null) || (barcode.ToString() == "\0\0\0\0\0\0\0\0\0\0"))
                                            {
                                                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "SControlMonitor.DealWithDeviceState时只读到码盘结束,但没读到对应的托盘条码信息!发生时间:" + DateTime.Now.ToString("u"));
                                                OnRefreshMonitor(rmea);
                                                errtext = "SControlMonitor.DealWithDeviceState时只读到码盘结束,但没读到对应的托盘条码信息!发生时间:" + DateTime.Now.ToString("u");
                                                continue;
                                            }
                                            sql.Remove(0, sql.Length);
                                            sql.Append("SELECT FPALLETBARCODE,FSTARTDEVICE FROM T_Manage_Task  where FSTARTDEVICE=").Append(dvsp[0]["F_BindingDevice"]).Append(" AND FPALLETBARCODE='").Append(barcode).Append("'");
                                            //20091128
                                            dvsp = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                            if (dvsp.Count > 0)
                                            {
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("2");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", dvsp[0]["F_BindingDevice"].ToString() + "码盘通道,托盘条码:" + barcode + ",重复收到码盘结束信号!发生时间:" + DateTime.Now.ToString("u"));
                                                OnRefreshMonitor(rmea);
                                                errtext = "SControlMonitor.DealWithDeviceState时" + dvsp[0]["F_BindingDevice"].ToString() + "码盘通道,托盘条码:" + barcode + ",重复收到码盘结束信号!发生时间:" + DateTime.Now.ToString("u");
                                                continue;

                                            }


                                            //20090922
                                            sql.Remove(0, sql.Length);
                                            sql.Append("SELECT STOCK_BARCODE,START_DEVICE_CODE FROM IO_CONTROL  where START_DEVICE_CODE=").Append(dvsp[0]["F_BindingDevice"]).Append(" AND STOCK_BARCODE='").Append(barcode).Append("'");
                                            dvsp = dboMan.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                            if (dvsp.Count > 0)
                                            {
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("2");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", dvsp[0]["F_BindingDevice"].ToString() + "码盘通道,托盘条码:" + barcode + ",重复收到码盘结束信号!发生时间:" + DateTime.Now.ToString("u"));
                                                OnRefreshMonitor(rmea);
                                                errtext = "SControlMonitor.DealWithDeviceState时" + dvsp[0]["F_BindingDevice"].ToString() + "码盘通道,托盘条码:" + barcode + ",重复收到码盘结束信号!发生时间:" + DateTime.Now.ToString("u");
                                                continue;

                                            }

                                            //一号工程码信息
                                            string FirstProject = ""; string ExceptionCode = "0"; string BoxBarcode = "";
                                            //20091128
                                            sql.Remove(0, sql.Length);
                                            sql.Append("SELECT F_DeviceIndex, F_FirstProject,F_Remark,F_BoxBarcode,F_HaveFirstProject, F_Askkind, F_BindingDevice FROM T_Base_PLC_Ask WHERE (F_Askkind = 8) AND (F_BindingDevice = ").Append(dvsp[0]["F_BindingDevice"]).Append(")");
                                            dvsp = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                            if (dvsp.Count > 0)
                                            {
                                                BoxBarcode = dvsp[0]["F_BoxBarcode"].ToString();
                                                FirstProject = dvsp[0]["F_FirstProject"].ToString();
                                                if (FirstProject.Length > 0)
                                                {
                                                    if (FirstProject.Substring(0, 1) == ";")
                                                    {
                                                        if (FirstProject.Length > 1)
                                                        {
                                                            FirstProject = FirstProject.Substring(1);
                                                        }
                                                    }
                                                }
                                                ExceptionCode = dvsp[0]["F_Remark"].ToString();
                                            }
                                            int dcode = Convert.ToInt32(dvsp[0]["F_BindingDevice"]);

                                            #region 向管理申请码盘后入库任务
                                            //20091128
                                            sql.Remove(0, sql.Length);
                                            sql.Append("SELECT DEVICE_CODE,STOCK_BARCODE FROM IO_CONTROL_APPLY WHERE APPLY_TASK_STATUS=0 and DEVICE_CODE='").Append(dcode).Append("' and (STOCK_BARCODE = '").Append(barcode).Append("')");
                                            dvbc = dboMan.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                            if (dvbc.Count > 0)
                                            {
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("2");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "SControlMonitor.DealWithDeviceState时向管理申请入库任务时,申请的任务条码已经存在!");
                                                OnRefreshMonitor(rmea);
                                                errtext = "SControlMonitor.DealWithDeviceState时向管理申请入库任务时,申请的任务条码已经存在!";
                                                continue;
                                            }
                                            //向管理申请入库任务
                                            string dtime = DateTime.Now.ToString("u");
                                            dtime = dtime.Substring(0, dtime.Length - 1);
                                            //20101108CONTROL_APPLY_ID," + fid + ",
                                            sql.Remove(0, sql.Length);
                                            sql.Append("INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_TYPE, DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK)VALUES ").Append(
                                                "(1,'").Append(dcode).Append("','").Append(barcode).Append("',0,'").Append(dtime).Append("','").Append(BoxBarcode).Append(";").Append(FirstProject).Append(";").Append(states[2].ToString()).Append(";").Append(ExceptionCode).Append(";1").Append("')");//;
                                            try
                                            {
                                                dboMan.ExceSQL(sql.ToString());
                                                //20091128
                                                sql.Remove(0, sql.Length);
                                                sql.Append("UPDATE T_Base_PLC_Ask SET F_FirstProject = '',F_Remark='' WHERE (F_Askkind = 8) AND (F_BindingDevice = ").Append(dvsp[0]["F_BindingDevice"]).Append(")");
                                                dbo.ExceSQL(sql.ToString());

                                            }
                                            catch (Exception ex)
                                            {
                                                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理申请入库任务:" + ex.StackTrace + ex.Message);
                                                OnRefreshMonitor(rmea);
                                                errtext = "向管理申请入库任务:" + ex.Message;
                                                wv[0].Remove(0, wv[0].Length);
                                                wv[0].Append("2");
                                                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                continue;
                                            }

                                            #endregion


                                            #region 设置码垛通道

                                            DataView md = dboMan.ExceSQL("select * from v_fr_routwaysetting").Tables[0].DefaultView;
                                            for (int a = 0; a < md.Count; a++)
                                            {
                                                string boxcode = "";
                                                if (md[a]["fgoodscode"] == DBNull.Value)
                                                {
                                                    boxcode = "0000000000000";
                                                }
                                                else
                                                {
                                                    boxcode = md[a]["fgoodscode"].ToString();
                                                }
                                                int devbind = Convert.ToInt32(md[a]["froutwayid"]);
                                                string HaveFirstProject = md[a]["fbarcodeflag"].ToString();
                                                bool IfHaveFirstProject = false;
                                                if (HaveFirstProject == "1")
                                                {
                                                    IfHaveFirstProject = true;
                                                }
                                                else
                                                {
                                                    IfHaveFirstProject = false;
                                                }
                                                for (int j = 0; j <= 12; j++)
                                                {
                                                    if (boxcode.Length < 13)
                                                    {
                                                        boxcode += "0";
                                                    }
                                                }
                                                int devcount = 28;
                                                if (md[a]["v_fullpalletqty"] != DBNull.Value)
                                                {
                                                    devcount = Convert.ToInt32(md[a]["v_fullpalletqty"]);
                                                }
                                                int dev = Convert.ToInt32(md[a]["froutwayid"].ToString() + "11");
                                                //设置PLC码垛通道(froutwayid:输送机设备索引 fgoodscode:烟箱码 fbarcodeflag :有无一号工程码标识);5244人工码垛位通道
                                                sdo = CommModeCreate.CreateSendDeviceOrder(dev);
                                                sdo.SendDeviceOrder(dev, boxcode, IfHaveFirstProject, false, devcount);
                                                //改写T_Base_PLC_Ask表(F_BindingDevice:输送机设备索引 F_BoxBarcode:烟箱码 F_HaveFirstProject :有无一号工程码标识)
                                                sql.Remove(0, sql.Length);
                                                sql.Append("UPDATE T_Base_PLC_Ask SET  F_HaveFirstProject ='").Append(HaveFirstProject).Append("', F_BoxBarcode ='").Append(boxcode).Append("' WHERE (F_BindingDevice =").Append(devbind).Append(")");
                                                dbo.ExceSQL(sql.ToString());
                                            }
                                            //20091128
                                            md = null;
                                            #endregion


                                            #endregion
                                        }
                                    }
                                    wv[0].Remove(0, wv[0].Length);
                                    wv[0].Append("2");
                                    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);

                                    #endregion
                                    break;
                                #endregion


                                #region 申请托盘出库(电气申请)//20130510
                                case 35:
                                    //没有到出库口任务就向管理申请
                                    if (devicestates[tempdb2addr + 0] == 1)
                                    {
                                        //电气系统在箱体拆盘机缺盘时,每隔一段时间就会申请一次,有拆垛任务时,忽略申请

                                        sql.Remove(0, sql.Length);
                                        sql.Append("SELECT F_WareHouse,F_ManageAskkind,F_DeviceIndex, F_Askkind, F_BindingDevice FROM T_Base_PLC_Ask WHERE (F_DeviceIndex = ").Append(devidx).Append(")");
                                        dvsp = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                        if (dvsp.Count > 0)
                                        {

                                            StringBuilder warehouse =
                                                new StringBuilder(dvsp[0]["F_WareHouse"].ToString());
                                            int apptype = Convert.ToInt32(dvsp[0]["F_ManageAskkind"]); //20130510
                                            int dcode = Convert.ToInt32(dvsp[0]["F_BindingDevice"]);
                                            bool IfExit = false;
                                            string msg = string.Empty;
                                            #region 测试生成出空托盘任务

                                            string lanes = ccf.GetTestInLaneway();
                                            if (lanes != "")
                                            {

                                                #region MyRegion
                                                //20170119
                                                string str = string.Format("({0})", dcode);
                                                if (dcode == 22052)
                                                {
                                                    str = string.Format("({0},{1})", dcode, 22038);
                                                }
                                                dvbc =
                                                    dbo.ExceSQL(
                                                        string.Format(
                                                            "select fid from T_Manage_Task  where FENDDEVICE in {0} ", str))
                                                        .Tables[0].DefaultView;
                                                if (dvbc.Count > 0)
                                                {
                                                    IfExit = true;
                                                    msg = string.Format("申请空托盘出库时,{0}申请的任务在调度系统的任务表里面已经存在,或存在拆垛任务!", dcode, barcode);
                                                    RefreshMonitorEventArgs rmea =
                                                        new RefreshMonitorEventArgs("tsStatus", msg);
                                                    OnRefreshMonitor(rmea);
                                                    errtext = msg;
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "拒绝申请", devidx.ToString(), msg);

                                                }
                                                #endregion

                                                //生成空托盘组出库任务
                                                if (IfExit == false)
                                                {
                                                    string CellCode = CStaticClass.SelectEmptyPalletCell(lanes, dcode);
                                                    int Laneindex = ccf.GetLanewayFromCellCode(CellCode, 1);
                                                    if (Laneindex != -1)
                                                    {
                                                        string dtime = DateTime.Now.ToString("u"); //20101028
                                                        dtime = dtime.Substring(0, dtime.Length - 1); //20101028
                                                        string stack =
                                                            CStaticClass.GetStackIndexFromLaneInfo(Laneindex).ToString();
                                                        int AutoManageIdx = ccf.GetTempManageIdx(); //调度任务索引
                                                        int startdevice = Laneindex;
                                                        int enddevice = dcode;
                                                        string barcodes = AutoManageIdx.ToString(); //托盘条码

                                                        int controltype = 2; //入库

                                                        string sqlstr =
                                                            string.Format(
                                                                "insert into T_Manage_Task(FID,FPALLETBARCODE,FCONTROLTASKTYPE,F_ManageTaskKindIndex,FSTARTWAREHOUSE,FSTARTDEVICE,FSTARTCELL,FENDWAREHOUSE,FENDDEVICE,FENDCELL,FLANEWAY,FSTACK,FUseAwayFork,FBEGTIME,FStartCol,FStartLayer,FLOGIC_AREA) values ({0},'{1}',{2},{3},{4},{5},'{6}',{7},{8},'{9}',{10},{11},'{12}','{13}',{14},{15},'{16}')",
                                                                AutoManageIdx, barcodes, controltype, 2, 1, startdevice,
                                                                CellCode, 1, dcode, "-", Laneindex, stack, "0", dtime, 0, 0,
                                                                enddevice);

                                                        dbo.ExceSQL(sqlstr);
                                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient",
                                                            "自动生成出库任务:" + AutoManageIdx.ToString(),
                                                            startdevice.ToString() + ":" + CellCode, enddevice.ToString());

                                                    }
                                                }
                                                //continue;
                                            }

                                            #endregion

                                            if (apptype < 10)
                                            {
                                                //    continue;
                                                //}
                                                dvbc =
                                                    dboMan.ExceSQL(
                                                        string.Format(
                                                            "SELECT DEVICE_CODE FROM IO_CONTROL_APPLY WHERE APPLY_TASK_STATUS<1 and DEVICE_CODE='{0}' ",
                                                            dcode.ToString())).Tables[0].DefaultView;
                                                if (dvbc.Count > 0)
                                                {
                                                    IfExit = true;
                                                    msg = string.Format("申请空托盘出库时,{0}的申请在管理系统的申请表里面已经存在!", dcode, barcode);
                                                    RefreshMonitorEventArgs rmea =
                                                        new RefreshMonitorEventArgs("tsStatus", msg);
                                                    OnRefreshMonitor(rmea);
                                                    errtext = msg;
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "拒绝申请", devidx.ToString(), msg);
                                                }
                                                //dvbc =
                                                //    dboMan.ExceSQL(
                                                //        string.Format(
                                                //            "select CONTROL_ID from IO_CONTROL  where END_DEVICE_CODE = '{0}'",
                                                //            dcode)).Tables[0].DefaultView;
                                                //if (dvbc.Count > 0)
                                                //{
                                                //    IfExit = true;
                                                //    msg = string.Format("申请空托盘出库时,{0}申请的任务在管理系统的任务表里面已经存在!", dcode, barcode);
                                                //    RefreshMonitorEventArgs rmea =
                                                //        new RefreshMonitorEventArgs("tsStatus", msg);
                                                //    OnRefreshMonitor(rmea);
                                                //    errtext = msg;
                                                //    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "拒绝申请", devidx.ToString(), msg);

                                                //}
                                                //20170119
                                                //判断是否有拆垛任务
                                                #region 判断是否有拆垛任务
                                                int deviceend = 0;
                                                if (dcode == 22052)
                                                {
                                                    deviceend = 21002;

                                                }
                                                else
                                                    if (dcode == 22066)
                                                    {
                                                        deviceend = 21001;
                                                    }
                                                dvbc =
                                                    dbo.ExceSQL(
                                                        string.Format(
                                                            "select fid from T_Manage_Task  where FENDDEVICE ={0} ", deviceend))
                                                        .Tables[0].DefaultView;
                                                if (dvbc.Count > 0)
                                                {
                                                    IfExit = true;
                                                    msg = string.Format("{0}申请空托盘出库时,存在拆垛任务!", dcode);
                                                    RefreshMonitorEventArgs rmea =
                                                        new RefreshMonitorEventArgs("tsStatus", msg);
                                                    OnRefreshMonitor(rmea);
                                                    errtext = msg;
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "拒绝申请", devidx.ToString(), msg);

                                                }
                                                #endregion
                                                #region 计算出库申请的空托盘数量

                                                int applycount = 1;


                                                sqlstr = string.Format("select * from T_Base_TaskCount where F_DeviceIndex={0}", dcode);//查找终点设备对应的出库任务获取数量和执行数量
                                                dvbc = dbo.ExceSQL(sqlstr).Tables[0].DefaultView;
                                                int exemaxcount = 1;
                                                string checkgoogs = string.Empty;
                                                if (dvbc.Count > 0)
                                                {
                                                    exemaxcount = Convert.ToInt32(dvbc[0]["F_EXECOUNT"]);
                                                    checkgoogs = Convert.ToString(dvbc[0]["F_CHECKGOODS"]);
                                                }
                                                dvbc =
                                                    dbo.ExceSQL(
                                                        string.Format(
                                                            "select fid from T_Manage_Task  where FENDDEVICE = {0} ", dcode))
                                                        .Tables[0].DefaultView;
                                                int execount = dvbc.Count;//已经存在的任务数量
                                                if (execount >= exemaxcount)
                                                {
                                                    IfExit = true;
                                                    msg = string.Format("{0}申请空托盘出库时,允许最大任务数量:{1},当前任务数量:{2}", dcode, exemaxcount, execount);
                                                    RefreshMonitorEventArgs rmea =
                                                        new RefreshMonitorEventArgs("tsStatus", msg);
                                                    OnRefreshMonitor(rmea);
                                                    errtext = msg;
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "拒绝申请", devidx.ToString(), msg);
                                                }

                                                //判断一层内筒数量,决定申请出空托盘数量
                                                #region 判断一层内筒数量,决定申请出空托盘数量
                                                if (exemaxcount >= 2 && checkgoogs != "" && execount < exemaxcount)
                                                {
                                                    //只有在一楼拥堵的时候才出两个以上
                                                    //调用函数
                                                    bool iffull = ccf.GetTransDeviceIfFull(checkgoogs);
                                                    if (!iffull)
                                                    {
                                                        int oldexecount = execount;
                                                        execount += 1;//一楼输送线不满载时,少出一个托盘

                                                        if (execount >= exemaxcount)
                                                        {
                                                            IfExit = true;
                                                            msg = string.Format("{0}申请空托盘出库时,允许最大任务数量:{1},当前任务数量:{2},但一楼输送线不满载", dcode, exemaxcount, oldexecount);
                                                            RefreshMonitorEventArgs rmea =
                                                                new RefreshMonitorEventArgs("tsStatus", msg);
                                                            OnRefreshMonitor(rmea);
                                                            errtext = msg;
                                                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "拒绝申请", devidx.ToString(), msg);
                                                        }
                                                    }
                                                }
                                                #endregion
                                                #endregion
                                                applycount = exemaxcount - execount;
                                                if (IfExit == false)
                                                {
                                                    //int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);//CONTROL_APPLY_ID
                                                    string dtime = DateTime.Now.ToString("u");
                                                    dtime = dtime.Substring(0, dtime.Length - 1);
                                                    sql.Remove(0, sql.Length);
                                                    sql.Append(
                                                        "INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_TYPE, WAREHOUSE_CODE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_PARA01,CONTROL_APPLY_REMARK)VALUES ")
                                                        .Append(
                                                            "(")
                                                        .Append(apptype)
                                                        .Append(",'")
                                                        .Append(warehouse.ToString())
                                                        .Append("','")
                                                        .Append(dcode)
                                                        .Append("','',0,'")
                                                        .Append(dtime)
                                                        .Append("','")
                                                        .Append(applycount)
                                                        .Append("','')");
                                                    try
                                                    {
                                                        dboMan.ExceSQL(sql.ToString());
                                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理系统申请托盘出库",
                                                            devidx.ToString(), dcode.ToString().ToUpper() + ",数量:" + applycount.ToString());
                                                    }
                                                    catch (Exception ex)
                                                    {
                                                        RefreshMonitorEventArgs rmea =
                                                            new RefreshMonitorEventArgs("tsStatus",
                                                                "SControlMonitor.申请托盘出库时" + ex.StackTrace + ex.Message);
                                                        OnRefreshMonitor(rmea);
                                                        errtext = "SControlMonitor.申请托盘出库时" + ex.StackTrace;
                                                        wv[0].Remove(0, wv[0].Length);
                                                        wv[0].Append("2");
                                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                                        continue;
                                                    }
                                                }
                                            }
                                            //wv[0].Remove(0, wv[0].Length);
                                            //wv[0].Append("2");
                                            //sdo.WriteDBData(witemnames, wv);
                                        }

                                        witemnames[0].Clear();
                                        witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                        wv[0].Clear();
                                        wv[0].Append("2");
                                        sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);

                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写申请空托盘应答", devidx.ToString(), "写标志2**");
                                        dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_Time='{0}' WHERE (F_DeviceIndex = {1}) ", DateTime.Now, devidx));
                                    }
                                    break;
                                #endregion

                                #region 嘉兴电力四楼三个单元检定回库电气申请放行
                                case 36:
                                    if (states[0] == 1)
                                    {//46006-116;46007-118 46008-120
                                        //设备号:绑定设备+“2”
                                        sql.Remove(0, sql.Length);
                                        sql.Append("SELECT F_DeviceIndex, F_Askkind, F_BindingDevice FROM T_Base_PLC_Ask WHERE (F_DeviceIndex = ").Append(devidx).Append(")");
                                        dvsp = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                        if (dvsp.Count > 0)
                                        {
                                            int dcode = Convert.ToInt32(dvsp[0]["F_BindingDevice"]);//检定单元入口条码扫描
                                            bool IfExit = false;
                                            dvbc = dboMan.ExceSQL(string.Format("SELECT DEVICE_CODE FROM IO_CONTROL_APPLY WHERE APPLY_TASK_STATUS<2 and DEVICE_CODE='{0}' ", dcode)).Tables[0].DefaultView;
                                            if (dvbc.Count > 0)
                                            {
                                                IfExit = true;
                                            }
                                            dvbc = dboMan.ExceSQL(string.Format("select CONTROL_ID from IO_CONTROL  where  START_DEVICE_CODE = '{0}'", dcode)).Tables[0].DefaultView;
                                            if (dvbc.Count > 0)
                                            {
                                                IfExit = true;
                                            }
                                            dvbc = dbo.ExceSQL(string.Format("select fid from T_Manage_Task  where  FSTARTDEVICE = '{0}'", dcode)).Tables[0].DefaultView;
                                            if (dvbc.Count > 0)
                                            {
                                                IfExit = true;
                                            }
                                            if (IfExit == false)
                                            {
                                                int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);//CONTROL_APPLY_ID
                                                string dtime = DateTime.Now.ToString("u");
                                                dtime = dtime.Substring(0, dtime.Length - 1);
                                                sql.Remove(0, sql.Length);
                                                sql.Append("INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_ID,CONTROL_APPLY_TYPE, WAREHOUSE_CODE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK)VALUES ").Append(
                                                    "(").Append(appid).Append(",4,1,'").Append(dcode).Append("',null,0,'").Append(dtime).Append("','')");
                                                try
                                                {
                                                    dboMan.ExceSQL(sql.ToString());
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "检定回库电气申请放行", devidx.ToString(), dcode.ToString().ToUpper());

                                                }
                                                catch (Exception ex)
                                                {
                                                    RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "SControlMonitor.检定回库电气申请放行," + ex.StackTrace + ex.Message);
                                                    OnRefreshMonitor(rmea);
                                                    errtext = "SControlMonitor.检定回库电气申请放行," + ex.StackTrace;
                                                    //wv[0].Remove(0, wv[0].Length);
                                                    //wv[0].Append("2");
                                                    //sdo.WriteDBData(witemnames, wv);
                                                    continue;
                                                }
                                            }
                                            //wv[0].Remove(0, wv[0].Length);
                                            //wv[0].Append("2");
                                            //sdo.WriteDBData(witemnames, wv);
                                        }
                                    }
                                    break;
                                #endregion

                                #region 接收称重信息//20130510
                                case 8:
                                    if (devicestates[tempdb2addr + 0] != 1) continue;
                                    //F_BoxBarcode
                                    StringBuilder weight = new StringBuilder("");
                                    weight.Append(Convert.ToChar(devicestates[tempdb2addr + 4]));
                                    weight.Append(Convert.ToChar(devicestates[tempdb2addr + 3]));
                                    weight.Append(Convert.ToChar(devicestates[tempdb2addr + 2]));
                                    weight.Append(Convert.ToChar(devicestates[tempdb2addr + 1]));
                                    weight.Append(".");
                                    weight.Append(Convert.ToChar(devicestates[tempdb2addr + 5]));//小数部分
                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "接收称重信息", devidx.ToString(), "重量:" + weight.ToString());
                                    //向管理写入重量
                                    int mpindex = ccf.GetMonitorTaskIndexFromSendedDevice(devidx);
                                    long manfid = ccf.GetManageTaskIndexfromMonitor(mpindex);
                                    int manKind = ccf.GetManageTaskKindIndexFromMonitor(mpindex);
                                    if (manKind == 1)
                                    {
                                        dboMan.ExecuteSql(string.Format("UPDATE IO_CONTROL SET CONTROL_REMARK ={0} WHERE  CONTROL_ID={1}", weight.ToString(), manfid));
                                    }
                                    if (weight.ToString() != "0000.0")
                                    {
                                        cgs.ActionComplete(devidx, mpindex, 0);
                                        //dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_BoxBarcode = '{1}' WHERE (F_DeviceIndex = {0}) and F_BoxBarcode<>'{1}'", devidx, weight.ToString()));
                                        witemnames[0].Clear();
                                        witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                        wv[0].Clear();
                                        wv[0].Append("2");
                                        sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写称重应答", devidx.ToString(), "写标志2**称重信息:" + weight.ToString().ToUpper());
                                    }
                                    break;
                                #endregion

                                #region 检尺
                                case 37:
                                    //if (devicestates[tempdb2addr + 0] != 1) continue;
                                    //dvsp = dbo.ExceSQL(string.Format("select F_BarCode,F_Time, F_PalletBarcodeLength,F_PalletBarcodeReservedLength,F_BarcodeReservedLength,F_WareHouse,F_ManageAskkind,F_BarcodeForkAmount,F_BarcodeLength,F_BindingDevice,F_Askkind,F_Remark,F_TaskIndex from T_Base_PLC_Ask  WHERE (F_DeviceIndex = {0}) ", devidx)).Tables[0].DefaultView; //20130510F_ManageAskkind
                                    //if (dvsp.Count > 0)
                                    //{

                                    //    StringBuilder warehouse = new StringBuilder(dvsp[0]["F_WareHouse"].ToString());
                                    //    int dcode = Convert.ToInt32(dvsp[0]["F_BindingDevice"]);
                                    //    int apptype = Convert.ToInt32(dvsp[0]["F_ManageAskkind"]);
                                    //    int sb = Convert.ToInt32(dvsp[0]["F_remark"]);
                                    //    int BoxQuality = devicestates[tempdb2addr + 1];

                                    //    DateTime appdt = new DateTime();
                                    //    if (dvsp[0]["F_Time"] == DBNull.Value)
                                    //    {
                                    //        appdt = DateTime.Now.AddSeconds(-10);
                                    //    }
                                    //    else
                                    //    {
                                    //        DateTime.TryParse(dvsp[0]["F_Time"].ToString(), out appdt);

                                    //    }

                                    //    if (dvsp[0]["F_TaskIndex"] != DBNull.Value)
                                    //    {
                                    //        if ((appdt.AddSeconds(5) > DateTime.Now) && (dvsp[0]["F_TaskIndex"].ToString() == BoxQuality.ToString()))
                                    //        {
                                    //            dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_TaskIndex = '{1}',F_Time='{2}' WHERE (F_DeviceIndex = {0}) ", devidx, BoxQuality, DateTime.Now));
                                    //            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "PLC重复上报检尺:", devidx.ToString(), ",检尺:" + devidx + ",高度:" + BoxQuality.ToString().ToUpper());
                                    //            break;
                                    //        }

                                    //    }

                                    //    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "检尺上报", devidx.ToString(), "读标志1**:" + BoxQuality.ToString());

                                    //    StringBuilder dtime = new StringBuilder(DateTime.Now.ToString("u"));
                                    //    dtime.Remove(dtime.Length - 1, 1);
                                    //    barcode.Clear();
                                    //    dvsp = dbo.ExceSQL(string.Format("select F_BarCode,F_BindingDevice from T_Base_PLC_Ask  WHERE (F_DeviceIndex = {0}) ", dcode)).Tables[0].DefaultView; //20130510F_ManageAskkind
                                    //    if (dvsp.Count > 0)
                                    //    {

                                    //        barcode.Append(dvsp[0]["F_BarCode"]);
                                    //    }

                                    //    string jic = string.Empty;
                                    //    switch (BoxQuality)
                                    //    {
                                    //        case 1:
                                    //            jic = "Low";
                                    //            break;
                                    //        case 2:
                                    //            jic = "Height%";
                                    //            break;

                                    //        case 3:
                                    //            jic = "Height";
                                    //            break;
                                    //        default:
                                    //            jic = BoxQuality.ToString();
                                    //            break;

                                    //    }
                                    //    //int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);//CONTROL_APPLY_ID
                                    //    object[] ob = new object[8] { apptype, sb, barcode, 0, dtime, "", warehouse.ToString(), jic };
                                    //    if (CStaticClass.StopTestLane == true)
                                    //    {
                                    //        if ((!WcfControlMonitorLib.CStaticClass.StopTest.ContainsKey(18001)) || ((WcfControlMonitorLib.CStaticClass.StopTest.ContainsKey(18001)) && WcfControlMonitorLib.CStaticClass.StopTest[18001] == true))
                                    //        {
                                    //            try
                                    //            {

                                    //                dboMan.ExecuteSql(string.Format("INSERT INTO IO_CONTROL_APPLY( CONTROL_APPLY_TYPE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK,WAREHOUSE_CODE,CONTROL_APPLY_PARAMETER)VALUES ({0},'{1}','{2}',{3},'{4}','{5}','{6}','{7}')", ob));
                                    //                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理条码申请任务:", devidx.ToString(), ",站台:" + dcode + ",条码:" + barcode.ToString().ToUpper());//20140218
                                    //            }
                                    //            catch (Exception ex)
                                    //            {
                                    //                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理申请入库任务时发生错误:" + ex.StackTrace + ex.Message);
                                    //                OnRefreshMonitor(rmea);
                                    //                continue;//20140218
                                    //            }
                                    //        }
                                    //    }
                                    //    else
                                    //    {
                                    //        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "调度系统测试:", devidx.ToString(), ",站台:" + dcode + ",条码:" + barcode.ToString().ToUpper());//20140218

                                    //    }
                                    //    witemnames[0].Clear();
                                    //    witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                    //    wv[0].Clear();
                                    //    wv[0].Append("2");
                                    //    sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                    //    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);

                                    //    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写检尺应答", devidx.ToString(), "写标志2**检尺:" + BoxQuality.ToString());
                                    //    ob = new object[4] { devidx, BoxQuality.ToString(), DateTime.Now, barcode };
                                    //    dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_BarCode='{3}',F_Time='{2}', F_TaskIndex ={1} WHERE (F_DeviceIndex = {0}) ", ob));

                                    //}
                                    //break;
                                #endregion

                                #region 每楼层报警点
                                case 38:
                                    //if (devicestates[tempdb2addr + 0] != 1) continue;
                                    devinfo.SplitByte_0 = (devicestates[tempdb2addr + 1] & 1) == 1 ? 1 : 0;
                                    break;
                                #endregion
                                #region 机器人拆垛完成
                                case 39:
                                    if (devicestates[tempdb2addr + 0] != 1) continue;
                                    dvsp = dbo.ExceSQL(string.Format("select F_BarCode,F_Time, F_PalletBarcodeLength,F_PalletBarcodeReservedLength,F_BarcodeReservedLength,F_WareHouse,F_ManageAskkind,F_BarcodeForkAmount,F_BarcodeLength,F_BindingDevice,F_Askkind,F_Remark,F_TaskIndex from T_Base_PLC_Ask  WHERE (F_DeviceIndex = {0}) ", devidx)).Tables[0].DefaultView; //20130510F_ManageAskkind
                                    if (dvsp.Count > 0)
                                    {
                                        int dcode = Convert.ToInt32(dvsp[0]["F_BindingDevice"]);
                                        int taskno = (devicestates[tempdb2addr + 1] << 8) + devicestates[tempdb2addr + 2];//任务号
                                        //if (taskno > 0)
                                        //{
                                        cgs.ActionComplete(dcode, taskno, 0);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "拆垛完成", dcode.ToString(), taskno.ToString());

                                        //}
                                        witemnames[0].Clear();
                                        witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                        wv[0].Clear();
                                        wv[0].Append("2");
                                        sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);

                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写拆垛应答", devidx.ToString(), "写标志2**");

                                        dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_Time='{0}' WHERE (F_DeviceIndex = {1}) ", DateTime.Now, devidx));

                                    }


                                    break;
                                #endregion
                                #region 确认按钮生成入库任务
                                case 34:
                                    if (devicestates[tempdb2addr + 0] != 5) continue;//.0和.1同时又信号
                                    dvsp = dbo.ExceSQL(string.Format("select F_BarCode,F_Time, F_PalletBarcodeLength,F_PalletBarcodeReservedLength,F_BarcodeReservedLength,F_WareHouse,F_ManageAskkind,F_BarcodeForkAmount,F_BarcodeLength,F_BindingDevice,F_Askkind,F_Remark,F_TaskIndex from T_Base_PLC_Ask  WHERE (F_DeviceIndex = {0}) ", devidx)).Tables[0].DefaultView; //20130510F_ManageAskkind
                                    if (dvsp.Count > 0)
                                    {
                                        int dcode = Convert.ToInt32(dvsp[0]["F_BindingDevice"]);
                                        int taskno = (devicestates[tempdb2addr + 1] << 8) + devicestates[tempdb2addr + 2];//任务号
                                        //if (taskno > 0)
                                        //{
                                        cgs.ActionComplete(dcode, taskno, 0);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "拆垛完成", dcode.ToString(), taskno.ToString());

                                        //}
                                        witemnames[0].Clear();
                                        witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                        wv[0].Clear();
                                        wv[0].Append("2");
                                        sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                        sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);

                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写拆垛应答", devidx.ToString(), "写标志2**");

                                        dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_Time='{0}' WHERE (F_DeviceIndex = {1}) ", DateTime.Now, devidx));

                                    }


                                    break;
                                #endregion
                                #region  add by lyj20180427 穿梭板双叉提升机
                                case 40:

                                    if (IsEquals(devinfo.ReturnMessage, states, 4) == false)
                                    {
                                        //taskindex = 26982;//模拟测试
                                        int order = ccf.GetDeviceOrderFromMonitor(taskindex);
                                        int relaid = ccf.GetRelativeTaskIdIndex(taskindex);

                                        devinfo.ReturnMessage = states;

                                        Model.CGetInfo.SetDeviceMessage(devinfo);

                                        sss.Remove(0, sss.Length);

                                        sss.Append("**条码:").Append(bc).Append("**读标志" + devicestates[tempdb2addr + 0]).Append("**状态" + state).Append("**任务号:" + taskindex);
                                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "收到输送机机状态", devidx.ToString(), sss.ToString());


                                        if (taskindex > 0 && state == 2)
                                        {


                                            //devidx = 15002;////模拟测试
                                            int mankindd = 0;
                                            long fidd1 = 0, fidd2 = 0, relFIDD = 0;
                                            string aainfo = string.Empty;
                                            int mankind = GetManageTaskKindFromMonitor(out  aainfo, taskindex);
                                            long mantaskindex = GetManageTaskIndexFromMonitor(out  aainfo, taskindex);
                                            int tasktypee = ccf.GetFCONTROLTASKTYPEFromManageTask(mankind, mantaskindex);
                                            int layer = 0;
                                            layer = ccf.getLayerFromMonitorTask(taskindex);
                                            if (relaid > 0)
                                            {
                                                int[] corrtasks = Model.CGeneralFunction.MutiForkIfSync(taskindex, devidx, 40);
                                                int boxnum = Model.CGeneralFunction.getDoubleForkMonitorCount(taskindex, tasktypee, order);
                                                cgs.ActionComplete(devidx, taskindex, 1);
                                                if(corrtasks[0] != 0)
                                                {
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "多工位提升机状态:", devidx.ToString(), "报完成时:查找关联任务:" + corrtasks[0] + "当前任务:" + taskindex.ToString() + "箱数:" + boxnum);
                                                }
                                                else
                                                {
                                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "多工位提升机状态:", devidx.ToString(), "无关联任务,corrtasks为NULL" + "当前任务:" + taskindex.ToString() + "箱数:" + boxnum);
                                                }
                                                
                                                if (boxnum == 2)
                                                {
                                                    cgs.ActionComplete(devidx, corrtasks[0], 1);
                                                    
                                                }

                                                #region  20180427 add by lyj提升机送货完成解除关联

                                                string sqlrela = string.Empty;
                                                if (order == 5 && devinfo.SplitByte_0 == 0 && devinfo.SplitByte_1 == 0&&tasktypee==1)
                                                {

                                                    sqlrela = "update T_Manage_Task set F_RELATIVECONTORLID=-" + relaid.ToString() + "   where F_RELATIVECONTORLID=" + relaid.ToString();
                                                    dbo.ExceSQL(sqlrela);
                                                }
                                            }
                                            else
                                            {
                                                cgs.ActionComplete(devidx, taskindex, 1);
                                            }

                                                #endregion

                                            #region add by lyj20180507出库不同层配关联
                                            if (tasktypee == 2 && order == 4 && relaid <= 0)
                                            {
                                                int relamonitorindex = 0;
                                                sql.Remove(0, sql.Length);
                                                sql.Append("select F_MonitorIndex from T_Monitor_Task,T_Base_Device,T_Manage_Task ").
                                                    Append("where dbo.T_Base_Device.F_DeviceIndex=dbo.T_Monitor_Task.F_DeviceIndex and dbo.T_Monitor_Task.F_ManageTaskIndex=dbo.T_Manage_Task.FID").
                                                    Append(" and F_DeviceCommandIndex=4 and F_DeviceKindIndex=40 and FCONTROLTASKTYPE=2 ").
                                                    Append("and F_MonitorIndex in(select MIN(F_MonitorIndex) from T_Monitor_Task  group by F_ManageTaskIndex) and F_NumParam1<").
                                                    Append(layer).Append(" order by F_NumParam1 desc");
                                                dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                                if (dv.Count > 0)
                                                {
                                                    if (dv[0]["F_MonitorIndex"] == DBNull.Value) relamonitorindex = 0;
                                                    relamonitorindex = Convert.ToInt32(dv[0]["F_MonitorIndex"]);

                                                    if (relamonitorindex > 0)
                                                    {
                                                        mankindd = mankind;
                                                        relFIDD = mantaskindex;
                                                        fidd1 = mantaskindex;
                                                        fidd2 = GetManageTaskIndexFromMonitor(out aainfo, relamonitorindex);
                                                        sql.Remove(0, sql.Length);
                                                        sql.Append("update T_Manage_Task set FUseAwayFork=1,F_RELATIVECONTORLID=").Append(relFIDD).Append(" where F_ManageTaskKindIndex=").Append(mankindd).Append(" and FID=").Append(fidd1);
                                                        dbo.ExecuteSql(sql.ToString());
                                                        sql.Remove(0, sql.Length);
                                                        sql.Append("update T_Manage_Task set FUseAwayFork=2,F_RELATIVECONTORLID=").Append(relFIDD).Append(" where F_ManageTaskKindIndex=").Append(mankindd).Append(" and FID=").Append(fidd2);
                                                        dbo.ExecuteSql(sql.ToString());

                                                        //int stackno = Convert.ToInt32(dvr[0]["F_DeviceIndex"]);
                                                        //stackno = 15001;//测试
                                                        object[] ob = new object[3] { devidx, fidd1, mankindd };
                                                        dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_UseAwayFork = 1 WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob));
                                                        ob = new object[3] { devidx, fidd2, mankindd };
                                                        dbo.ExceSQL(string.Format("UPDATE T_Monitor_Task SET F_UseAwayFork = 2 WHERE F_DeviceIndex={0} and (F_ManageTaskIndex ={1}) AND (F_ManageTASKKINDINDEX ={2})", ob));
                                                        sql.Remove(0, sql.Length);
                                                        sql.Append("update T_Base_Device set F_ManTaskReserve=").Append((mankindd.ToString() + relFIDD.ToString())).Append(" where F_DeviceIndex=" + devidx);
                                                        dbo.ExceSQL(sql.ToString());

                                                    }
                                                }


                                            }
                                            #endregion



                                        }
                                        else
                                        {

                                            cgs.GetKindDeviceState(taskindex, devidx, state);
                                        }


                                    }
                                    break;
                             

                                case 50:                                  
                                    devinfo.SplitByte_0 = (devicestates[tempdb2addr + 0] & 1) == 1 ? 1 : 0;
                                    Model.CGetInfo.SetDeviceMessage(devinfo);
                                    break;
                                #endregion
                                #region 20210324_上海晟碟,拣选塔灯清零确认
                                case 41:
                                    if(states[0] == 1)
                                    {
                                        //int iStation = deviceindex / 10;
                                        //sql.Remove(0, sql.Length);
                                        //sql.Append("SELECT * FROM IO_Station_Status WHERE F_StationID = ").Append(iStation.ToString());
                                        //dvbc = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
                                        //if(dvbc.Count > 0)
                                        //{
                                        //    sql.Remove(0, sql.Length);
                                        //    sql.Append("UPDATE IO_Station_Status SET F_Status = 0 WHERE F_StationID = ").Append(iStation.ToString());
                                        //    dbo.ExecuteSql(sql.ToString());
                                        //    witemnames[0].Clear();
                                        //    witemnames[0].Append(Model.CGeneralFunction.DBGet).Append(".").Append(Convert.ToString(devinfo.Dbw2Address + 0)).Append(",b");//20130510
                                        //    wv[0].Clear();
                                        //    wv[0].Append("0");
                                        //    sdo = CommModeCreate.CreateSendDeviceOrder(devidx);
                                        //    sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                                        //    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写信号灯应答", devidx.ToString(), "写标志0**");
                                        //}
                                    }
                                    break;
                                #endregion
                            }

                            #endregion
                        }
                    }

                    #endregion

                    return true;
                }
                catch (Exception ex)
                {
                    RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "SControlMonitor.DealWithDeviceState时" + ex.Message + ex.StackTrace);
                    OnRefreshMonitor(rmea);
                    errtext = ex.Message + ex.StackTrace;
                    return false;
                }
                finally
                {
                    dv.Dispose();
                    dvbc.Dispose();
                    dvsp.Dispose();
                }
            }
        }
        void g_manageService_ManageInStorageCheckoutCompleted(object sender, ManageService.ManageInStorageCheckoutCompletedEventArgs e)
        {
            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "管理分道回调返回值:", e.ManageInStorageCheckoutResult.ToString(), ",条码:" + e.sResultBoxBarCode + ",sResult:" + e.sResult);
            CSendBarcode(16001, e.sResultBoxBarCode, e.ManageInStorageCheckoutResult);
        }
        public void FactorizeCallback(IAsyncResult ar)
        {
            try
            {
                string sResult = string.Empty;

                string sBoxBarCode = string.Empty;

                // bool bResult = g_manageService.EndManageInStorageCheckout(out sResult, out sBoxBarCode, ar);
                //CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "管理分道回调时:", "16001", ",条码:" + sBoxBarCode + ";" + bResult.ToString());
                //CSendBarcode(16001, sBoxBarCode, bResult);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }
        /// <summary>
        /// 直接向DB区写数据   lzm 20250317
        /// </summary>
        /// <param name="deviceIndex"></param>
        /// <param name="DBBlock">DB1,DB2</param>
        /// <param name="Wdata">要写入的数据内容</param>
        /// <returns></returns>
        public bool WriteDBData(int deviceIndex, string DBBlock, string Wdata, out string errtext)
        {
            errtext = string.Empty;
            try
            {
                Model.MDevice md = Model.CGetInfo.GetDeviceInfo(deviceIndex);
             
                if (DBBlock == "DB1")
                {
                    StringBuilder[] wv = { new StringBuilder("") };
                    StringBuilder[] wn = { new StringBuilder("") };
                    wn[0].Clear();
                    wn[0].Append(DBBlock).Append(".").Append(Convert.ToString(md.Dbw1Address + 18)).Append(",i");//第18个字节写1 山东时代
                    wv[0].Clear();
                    wv[0].Append(Wdata);
                    sdo = CommModeCreate.CreateSendDeviceOrder(deviceIndex);
                    sdo.WriteDBData(wn, wv, md.S7Connection);
                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写堆垛机急停按钮信号:", deviceIndex.ToString(), md.S7Connection + ";" + DBBlock + ";" + (md.Dbw1Address + 22).ToString() + ";" + Wdata);

                }
                return true;
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }

        /// <summary>
        /// 直接向DB区写数据 输送线  lzm
        /// </summary>
        /// <param name="deviceIndex"></param>
        /// <param name="DBBlock">DB1,DB2</param>
        /// <param name="Wdata">要写入的数据内容</param>
        /// <returns></returns>
        public bool WriteDBDataConveyor(int deviceIndex, string DBBlock, string Wdata, out string errtext)
        {
            errtext = string.Empty;
            try
            {
                Model.MDevice md = Model.CGetInfo.GetDeviceInfo(deviceIndex);

                if (DBBlock == "DB2")
                {
                    StringBuilder[] wv = { new StringBuilder("") };
                    StringBuilder[] wn = { new StringBuilder("") };
                    wn[0].Clear();
                    wn[0].Append(DBBlock).Append(".").Append(Convert.ToString(md.Dbw1Address + 1)).Append(",i");//
                    wv[0].Clear();
                    wv[0].Append(Wdata);
                    sdo = CommModeCreate.CreateSendDeviceOrder(deviceIndex);
                    sdo.WriteDBData(wn, wv, md.S7Connection);
                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写入PLC的站台出入库状态:", deviceIndex.ToString(), md.S7Connection + ";" + DBBlock + ";" + (md.Dbw1Address + 22).ToString() + ";" + Wdata);
                }
                return true;
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="deviceIndex"></param>
        /// <param name="DBBlock"></param>
        /// <param name="Wdata"></param>
        /// <param name="byteindex">索引</param>
        /// <param name="errtext"></param>
        /// <returns></returns>
        public bool WriteDBData2(int deviceIndex, string DBBlock, string Wdata,string byteindex, out string errtext)
        {
            errtext = string.Empty;
            try
            {
                Model.MDevice md = Model.CGetInfo.GetDeviceInfo(deviceIndex);

                if (DBBlock == "DB1")
                {
                    StringBuilder[] wv = { new StringBuilder("") };
                    StringBuilder[] wn = { new StringBuilder("") };
                    wn[0].Clear();
                    wn[0].Append(DBBlock).Append(".").Append(Convert.ToString(md.Dbw1Address + byteindex)).Append(",i");//第22个字节写1 民航二所
                    wv[0].Clear();
                    wv[0].Append(Wdata);
                    sdo = CommModeCreate.CreateSendDeviceOrder(deviceIndex);
                    sdo.WriteDBData(wn, wv, md.S7Connection);
                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "写堆垛机急停按钮信号:", deviceIndex.ToString(), md.S7Connection + ";" + DBBlock + ";" + (md.Dbw1Address + 22).ToString() + ";" + Wdata);
                }
                return true;
            }
            catch (Exception ex)
            {
                errtext = ex.StackTrace + ex.Message;
                return false;
            }
        }
        /// <summary>
        /// 20120616相应CListenAGV线程的数据库更新事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void DealWithListenAGVState_UpdateDB(object sender, CUpdateDBChangeEventArgs e)
        {
            lock (thisLock)
            {
                try
                {
                    if (e.Taskindex > 0)
                    {
                        cgs.ActionComplete(e.Deviceindex, e.Taskindex, e.Taskstate);
                    }
                    else
                    {
                        dbo1 = e.Dbo;
                        dbo1.ExecuteSql(e.ExeSQL.ToString());
                    }

                }
                catch (Exception ex)
                {
                    RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "SControlMonitor.CListenAGVState_UpdateDB时" + ex.Message + ex.StackTrace);
                    OnRefreshMonitor(rmea);
                    return;
                }
            }
        }
        public void DealWithWriteDarkCasket(object sender, CWriteDarkCasketEventArgs e)
        {//20121108
            lock (thisLock)
            {
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < e.Wrinfo.GetLength(0); i++)
                {
                    sb.Append("-").Append(e.Wrinfo[i].ToString());
                }
                CommonClassLib.CCarryConvert.WriteDarkCasket(e.Wrnamespace + "." + e.Wrmethod, e.WrkeyRemark, e.Wrdevice, sb.ToString());
            }
        }
        public void DealWithSendDeviceOrder(object sender, CSendDeviceOrderEventArgs e)
        {//20121108
            lock (thisLock)
            {
                if (ccf.GetDeviceKindIdx(e.Deviceindex) == 6)
                {
                    sdo = CommModeCreate.CreateSendDeviceOrder(e.Deviceindex);
                    SocketsTCPIP.CClientTCPIP.Send(e.RemoteIP, e.RemotePort, e.Sendrinfo);
                }
            }
        }
        public bool ReConnectOPCServer()
        {//20130817richard
            try
            {

                OPCClient.CCommonOPCClient.DisConnectOPCServer();
                OPCClient.CCommonOPCClient.CreateSubscriptionGroup();
                return true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public void ActionError(int DeviceIdx, int TaskIdx, int ErrId)
        {//20131120
            cgs.ActionError(DeviceIdx, TaskIdx, ErrId);
        }
        #endregion
        public string GetErrorBarcode(int devBind, int devBarcode, int barcodeLength)
        {
            int bcsn = 1;
            StringBuilder bc = new StringBuilder();
            StringBuilder sb = new StringBuilder();
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT F_ErrorBarcodeSN FROM T_Base_PLC_Ask WHERE (F_DeviceIndex = {0})", devBarcode)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {

                    bcsn = Convert.ToInt32(dv[0]["F_ErrorBarcodeSN"]) + 1;
                    bc.Append("9").Append(devBind.ToString());
                    for (int i = 0; i < (barcodeLength - bc.Length); i++)
                    {
                        sb.Append("0").Append(bcsn.ToString());
                    }
                    return bc.Append(sb).ToString();
                }
                else
                {
                    return "-";
                }
            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "SControlMonitor.GetErrorBarcode时" + ex.StackTrace + ex.Message);
                OnRefreshMonitor(rmea);
                return "-";
            }
            finally
            {
                dv.Dispose();
            }
        }
        /// <summary>
        /// 根据条码,报告输送机的送出任务完成
        /// </summary>
        /// <param name="Bardevice">条码设备</param>
        /// <param name="BindDevice">条码设备的绑定输送机</param>
        /// <param name="barcode">条码</param>
        /// <param name="AbendDevice">异常处理口设备</param>
        void BarcodeComplete(int Bardevice, int BindDevice, string barcode, string AbendDevice)
        {
            DataView dv = new DataView();
            try
            {
                if (barcode.Contains("11111")) return;//对于未扫描到条码的情况不进行判断20170309
                if (CStaticClass.DBFactory == "OracleDBFactory")
                {//20151120调度系统oracle的特殊语句
                    dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex, F_DeviceIndex, F_DeviceCommandIndex,F_ManageTaskIndex, F_ManageTASKKINDINDEX,F_NumParam4 FROM T_Monitor_Task WHERE rownum=1 and (F_TxtParam like '%{0}%')", barcode)).Tables[0].DefaultView;

                }
                else
                {
                    dv = dbo.ExceSQL(string.Format("SELECT TOP 1 F_MonitorIndex, F_DeviceIndex, F_DeviceCommandIndex,F_ManageTaskIndex, F_ManageTASKKINDINDEX,F_NumParam4 FROM T_Monitor_Task WHERE (F_TxtParam like '%{0}%')", barcode)).Tables[0].DefaultView;
                }
                if (dv.Count > 0)
                {
                    int mankind = Convert.ToInt32(dv[0]["F_ManageTASKKINDINDEX"]);
                    int FID = Convert.ToInt32(dv[0]["F_ManageTaskIndex"]);
                    if ((ccf.GetDeviceKindIdx(Convert.ToInt32(dv[0]["F_DeviceIndex"])) == 2) && ((dv[0]["F_DeviceCommandIndex"].ToString() == "6") || (dv[0]["F_DeviceCommandIndex"].ToString() == "11")) || (ccf.GetDeviceKindIdx(Convert.ToInt32(dv[0]["F_DeviceIndex"])) == 7))
                    {
                        int ctype = ccf.GetFCONTROLTASKTYPEFromManageTask(mankind, FID);
                        if ((dv[0]["F_NumParam4"].ToString() == BindDevice.ToString()))
                        {//正确
                            cgs.ActionComplete(BindDevice, Convert.ToInt32(dv[0]["F_MonitorIndex"]), 0);
                        }
                        else
                        {//可能经过上一个扫描器没扫到,下一条任务是否为此扫描任务,是:两个任务都报完成
                            dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTASKKINDINDEX = {0}) AND (F_ManageTaskIndex = {1}) AND (F_NumParam4 = {2})", mankind, FID, BindDevice)).Tables[0].DefaultView;
                            if (dv.Count > 0)
                            {
                                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "条码报完成", Bardevice.ToString(), "上一个扫描器没扫到码,条码:" + barcode.ToString().ToUpper());

                                dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex,F_DeviceIndex,F_NumParam4 FROM T_Monitor_Task WHERE (F_ManageTASKKINDINDEX = {0}) AND (F_ManageTaskIndex = {1}) AND (F_MonitorIndex <= {2})", mankind, FID, Convert.ToInt32(dv[0]["F_MonitorIndex"]))).Tables[0].DefaultView;
                                for (int i = 0; i < dv.Count; i++)
                                {
                                    cgs.ActionComplete(Convert.ToInt32(dv[0]["F_NumParam4"]), Convert.ToInt32(dv[0]["F_MonitorIndex"]), 1);
                                }
                            }
                            else
                            {
                                int abst = 0;
                                if (int.TryParse(AbendDevice.ToString(), out abst) == true)
                                {
                                    object[] ob = new object[17] { ccf.GetTempManageIdx(), 2, barcode, 1, 2, 1, 1, ccf.GetWarehouseIndex(), ccf.GetWarehouseIndex(), "-", BindDevice, AbendDevice, "-", 0, DateTime.Now.ToString("u"), 0, Model.CGeneralFunction.TASKABEND };
                                    dbo.ExceSQL(string.Format("INSERT INTO T_Manage_Task(FID, F_ManageTaskKindIndex,FPALLETBARCODE,FMANAGETASKTYPE,FCONTROLTASKTYPE, FTASKLEVEL, FISRETURN,FSTARTWAREHOUSE,FENDWAREHOUSE, FSTARTCELL, FSTARTDEVICE, FENDDEVICE, FENDCELL, FSTATUS, FBEGTIME, FIntoStepOK,FExceptionNO)VALUES({0},{1},'{2}',{3},{4},{5},{6},'{7}','{8}','{9}',{10},{11},'{12}',{13},'{14}','{15}',{16})", ob));
                                    CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "条码报完成", Bardevice.ToString(), "条码和任务匹配,但扫描器不在此任务设备指令队列里,条码:" + barcode.ToString().ToUpper());
                                    RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", Bardevice.ToString() + "条码和任务匹配,但扫描器不在此任务设备指令队列里,条码:" + barcode.ToString());
                                    OnRefreshMonitor(rmea);
                                }
                            }
                        }
                    }
                    else
                    {
                        int abst = 0;
                        if (int.TryParse(AbendDevice.ToString(), out abst) == true)
                        {
                            object[] ob = new object[17] { ccf.GetTempManageIdx(), 2, barcode, 1, 2, 1, 1, ccf.GetWarehouseIndex(), ccf.GetWarehouseIndex(), "-", BindDevice, AbendDevice, "-", 0, DateTime.Now.ToString("u"), 0, Model.CGeneralFunction.TASKABEND };
                            dbo.ExceSQL(string.Format("INSERT INTO T_Manage_Task(FID, F_ManageTaskKindIndex,FPALLETBARCODE,FMANAGETASKTYPE,FCONTROLTASKTYPE, FTASKLEVEL, FISRETURN,FSTARTWAREHOUSE,FENDWAREHOUSE, FSTARTCELL, FSTARTDEVICE, FENDDEVICE, FENDCELL, FSTATUS, FBEGTIME, FIntoStepOK,FExceptionNO)VALUES({0},{1},'{2}',{3},{4},{5},{6},'{7}','{8}','{9}',{10},{11},'{12}',{13},'{14}','{15}',{16})", ob));
                            CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "条码报完成", Bardevice.ToString(), "扫描器找不到可以报完成的设备指令,条码:" + barcode.ToString().ToUpper());
                            RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", Bardevice.ToString() + "扫描器找不到可以报完成的设备指令,条码:" + barcode.ToString());
                            OnRefreshMonitor(rmea);
                        }

                    }
                }
                else
                {//扫到码,但是没有匹配任务,改道异常口
                    object[] ob;
                    //if ((BindDevice == 32606 || BindDevice == 42664))
                    //{//向管理申请补充任务
                    //    #region 向管理申请任务

                    //    DataView dvbc = dboMan.ExceSQL(string.Format("SELECT DEVICE_CODE,STOCK_BARCODE FROM IO_CONTROL_APPLY WHERE APPLY_TASK_STATUS<2 and DEVICE_CODE='{0}' and (STOCK_BARCODE = '{1}')", BindDevice, barcode)).Tables[0].DefaultView;
                    //    if (dvbc.Count <= 0)
                    //    {
                    //        dvbc = dboMan.ExceSQL(string.Format("select CONTROL_ID from IO_CONTROL  where STOCK_BARCODE like '%{0}%'", barcode)).Tables[0].DefaultView;
                    //        if (dvbc.Count <= 0)
                    //        {
                    //            dvbc = dbo.ExceSQL(string.Format("select fid from T_Manage_Task  where FPALLETBARCODE like '%{0}%'", barcode)).Tables[0].DefaultView;
                    //            if (dvbc.Count <= 0)
                    //            {
                    //                StringBuilder dtime = new StringBuilder(DateTime.Now.ToString("u"));
                    //                dtime.Remove(dtime.Length - 1, 1);

                    //                int apptype = 1;
                    //                StringBuilder wh = new StringBuilder("1");
                    //                int appid = dboMan.GetManageTableIndex("IO_CONTROL_APPLY", true);//CONTROL_APPLY_ID
                    //                ob = new object[8] { apptype, BindDevice, barcode, 0, dtime, "", wh.ToString(), appid };
                    //                try
                    //                {

                    //                    dboMan.ExecuteSql(string.Format("INSERT INTO IO_CONTROL_APPLY(CONTROL_APPLY_ID, CONTROL_APPLY_TYPE,DEVICE_CODE, STOCK_BARCODE, APPLY_TASK_STATUS, CREATE_TIME,CONTROL_APPLY_REMARK,WAREHOUSE_CODE)VALUES ({7},{0},'{1}','{2}',{3},'{4}','{5}','{6}')", ob));
                    //                }
                    //                catch (Exception ex)
                    //                {
                    //                    RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向管理申请入库任务时发生错误:" + ex.StackTrace+ex.Message );
                    //                    OnRefreshMonitor(rmea);

                    //                }
                    //                CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "向管理条码申请任务:", Bardevice.ToString(), ",站台:" + BindDevice + ",条码:" + barcode.ToString().ToUpper());

                    //            }
                    //        }
                    //    }

                    //    #endregion
                    //    return;
                    //}
                    int abst = 0;
                    if (int.TryParse(AbendDevice.ToString(), out abst) == true)
                    {
                        ob = new object[17] { ccf.GetTempManageIdx(), 2, barcode, 1, 2, 1, 1, ccf.GetWarehouseIndex(), ccf.GetWarehouseIndex(), "-", BindDevice, AbendDevice, "-", 0, DateTime.Now.ToString("u"), 0, Model.CGeneralFunction.TASKABEND };
                        dbo.ExceSQL(string.Format("INSERT INTO T_Manage_Task(FID, F_ManageTaskKindIndex,FPALLETBARCODE,FMANAGETASKTYPE,FCONTROLTASKTYPE, FTASKLEVEL, FISRETURN,FSTARTWAREHOUSE,FENDWAREHOUSE, FSTARTCELL, FSTARTDEVICE, FENDDEVICE, FENDCELL, FSTATUS, FBEGTIME, FIntoStepOK,FExceptionNO)VALUES({0},{1},'{2}',{3},{4},{5},{6},'{7}','{8}','{9}',{10},{11},'{12}',{13},'{14}','{15}',{16})", ob));
                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "条码报完成", BindDevice.ToString(), "扫到条码但没有匹配任务,调度自动改道至异常处理口!");
                        RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", BindDevice.ToString() + "扫到条码但没有匹配任务,调度自动改道至异常处理口!");
                        OnRefreshMonitor(rmea);

                    }
                    else
                    {
                        CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "条码报完成", BindDevice.ToString(), "扫到条码但没有匹配任务!");
                        RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "SControlMonitor.BarcodeComplete时," + BindDevice.ToString() + ",扫到条码但没有匹配任务");
                        OnRefreshMonitor(rmea);

                    }
                }
            }
            catch (Exception ex)
            {
                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "SControlMonitor.BarcodeComplete时" + ex.StackTrace + ex.Message);
                OnRefreshMonitor(rmea);
                return;
            }
            finally
            {

            }
        }

        bool IfExitDeviceBarcodeTask(int device, string barcode)
        {
            DataView dv = new DataView();
            try
            {
                dv = dbo.ExceSQL(string.Format("SELECT FSTARTDEVICE  FROM T_Manage_Task where FPALLETBARCODE='{0}' and FSTARTDEVICE={1}", barcode, device)).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    return true;
                }
                else
                    return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                dv.Dispose();
            }

        }

        #region 线程
        static Thread mythread;
        static bool exitThread = false;

        private void BeginListen()
        {//20091107
            while (!exitThread)
            {

                try
                {
                    if (CStaticClass.ObtainManageTask == true)
                    {
                        CObtainTask.GetManagerTask();
                    }
                    if (CStaticClass.Order == true)
                    {
                        CDisassembleTask.MyTaskIntoSteps();
                        cctrl.StartOrder();
                        //clpa.DealwithPLCAsk();
                        cgs.GetDeviceState();
                    }
                }
                catch (Exception ex)
                {
                    throw ex;
                }
                Thread.Sleep(200);
            }
        }
        public void EndListen()
        {//20091107
            exitThread = true;

            if (mythread != null)
            {

                mythread.Abort();
                mythread = null;
            }
        }
        public void StartListen()
        {
            exitThread = false;
            mythread = new Thread(new ThreadStart(BeginListen));
            mythread.IsBackground = true;
            mythread.Start();
        }
        #endregion

        /// <summary>
        /// 给灯写标志 add by lyj 20171106
        /// </summary>
        /// <param name="device"></param>
        public static void lightFlag(int device, string writevalue)
        {
            ISendDeviceOrder sdo;
            StringBuilder[] wv = { new StringBuilder("2") };
            StringBuilder[] witemnames = { new StringBuilder("") };
            Model.MDevice devinfo;
            try
            {
                devinfo = Model.CGetInfo.GetDeviceInfo(device);
                witemnames[0].Clear();
                witemnames[0].Append(Model.CGeneralFunction.DBSend).Append(".").Append(Convert.ToString(devinfo.Dbw1Address + 0)).Append(",b");//20130510
                wv[0].Clear();
                wv[0].Append(writevalue);
                sdo = CommModeCreate.CreateSendDeviceOrder(device);
                sdo.WriteDBData(witemnames, wv, devinfo.S7Connection);
                //CommonClassLib.CCarryConvert.WriteDarkCasket("opcclient", "设备编号:" + device.ToString(), "写入的值:" + writevalue, "PLC标识:" + devinfo.S7Connection.ToString());
            }
            catch (Exception eda)
            {
                RefreshMonitorEventArgs rmea = new RefreshMonitorEventArgs("tsStatus", "向电气写入灯标志时:" + eda.StackTrace + eda.Message);
                OnRefreshMonitor(rmea);
            }

            finally
            {
                sdo = null;
                devinfo = null;
            }
        }



        /// <summary>
        /// add by lyj 20171116  送货是如果目标巷道有堆垛机则调离堆垛机
        /// </summary>
        /// <param name="Handtask"></param>
        /// <param name="Errtext"></param>
        /// <returns></returns>
        public bool InsertHandTask(Model.HandTask Handtask, out string Errtext)
        {
            DataView dv = new DataView();
            try
            {
                string Sql = string.Empty;
                string dtime = DateTime.Now.ToString("u");
                dtime = dtime.Substring(0, dtime.Length - 1);
                string qcell = string.Empty, scell = string.Empty;
                int hidx = GetManageHandIdx();
                int hmindx = ccf.GetMonitorIndex(hidx, 4);
                int rehidx = 0, rehmindx = 0;
                int[] relfid = null;
                //20101028
                int z = 0, x = 0, y = 0, z1 = 0, x1 = 0, y1 = 0, Inworkbench = 0; ;
                int routeIDsub = GetRouteIDsub(Convert.ToInt32(Handtask._deviceIndex));

                if ((routeIDsub == -1) && (ccf.GetDeviceKindIdx(Handtask._deviceIndex) != 13) && (ccf.GetDeviceKindIdx(Handtask._deviceIndex) != 31))
                {

                    Errtext = "您选择的设备错误!";
                    return false;
                }
                #region 堆垛机
                if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 1)
                {
                    char[] cc = new char[1] { '-' };
                    string[] sp = Handtask._cellcodeBegin.Split(cc);
                    if (sp.Length >= 3)
                    {
                        z = Convert.ToInt32(sp[0]);
                        x = Convert.ToInt32(sp[1]);
                        y = Convert.ToInt32(sp[2]);

                    }
                    sp = Handtask._cellcodeEnd.Split(cc);
                    if (sp.Length >= 3)
                    {
                        z1 = Convert.ToInt32(sp[0]);
                        x1 = Convert.ToInt32(sp[1]);
                        y1 = Convert.ToInt32(sp[2]);

                    }
                }
                #endregion



                string useawayfork = "-"; int[] xx; int[] xx1;
                string barcode = string.Empty;
                useawayfork = Handtask._forkNo.ToString();
                char[] cp = new char[1] { ',' };
                if (Handtask._correlTaskForks.Length > 0)
                {
                    string[] cforks = Handtask._correlTaskForks.Split(cp);
                    xx = new int[cforks.Length];
                    xx1 = new int[cforks.Length];
                    relfid = new int[cforks.Length];
                    for (int i = 0; i < cforks.Length; i++)
                    {
                        if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 1)
                        {
                            string useawayfork1 = cforks[i];
                            xx[i] = x + (Convert.ToInt32(useawayfork1) - Handtask._forkNo);
                            xx1[i] = x1 + (Convert.ToInt32(useawayfork1) - Handtask._forkNo);
                            #region 堆垛机

                            if ((Handtask._deviceOrder == 4) || (Handtask._deviceOrder == 5))
                            {
                                rehidx = hidx + 1 + i;
                                rehmindx = ccf.GetMonitorIndex(rehidx, 4);
                                string bc = rehmindx.ToString();
                                int bcl = bc.Length;
                                for (int j = 0; j < (6 - bcl); j++)
                                {
                                    bc += j.ToString();
                                }
                                if (Handtask._deviceOrder == 4)//取货
                                {//z-x-y

                                    if (x == 1)
                                    {
                                        //xx[i] = 1;
                                    }
                                    else
                                    {
                                        dv = dbo.ExceSQL(string.Format("SELECT FID FROM ST_CELL WHERE (F_Z = {0}) AND (F_X = {1}) AND (F_Y = {2})", z, xx[i], y)).Tables[0].DefaultView;
                                        if (dv.Count == 0)
                                        {
                                            Errtext = "堆垛机取货坐标在数据库不存在!";
                                            return false;

                                        }
                                    }


                                    qcell = z.ToString() + "-" + xx[i].ToString() + "-" + y.ToString();//20101028
                                    dbo.ExceSQL("insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                                        "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_UseAwayFork,F_TxtParam) " +
                                        "values(" + routeIDsub + "," + rehidx + ",4," + rehmindx + "," + Handtask._deviceIndex
                                        + "," + Handtask._deviceOrder + "," + z + "," + xx[i] + "," + y + ",0,0,0,'" + useawayfork1 + "','" + bc + "')");

                                }
                                else if (Handtask._deviceOrder == 5)//送货
                                {//z1-x1-y1

                                    if (x1 == 1)
                                    {
                                        //20130710xx1[i] = 1;
                                    }
                                    else
                                    {
                                        dv = dbo.ExceSQL("SELECT FID FROM ST_CELL WHERE (F_Z = " + z1 + ") AND (F_X = " + xx1[i] + ") AND (F_Y = " + y1 + ")").Tables[0].DefaultView;
                                        if (dv.Count == 0)
                                        {
                                            Errtext = "堆垛机送货坐标在数据库不存在!";
                                            return false;

                                        }
                                    }


                                    scell = z1.ToString() + "-" + xx1[i].ToString() + "-" + y1.ToString();//20101028
                                    dbo.ExceSQL("insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                                    "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_UseAwayFork,F_TxtParam) " +
                                    "values(" + routeIDsub + "," + rehidx + ",4," + rehmindx + "," + Handtask._deviceIndex
                                    + "," + Handtask._deviceOrder + ",0,0,0," + z1 + "," + xx1[i] + "," + y1 + ",'" + useawayfork1 + "','" + bc + "')");

                                }

                                dbo.ExceSQL("insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME) values('" +
                                    bc + "'," + rehidx + ",4,-1,1," + Handtask._deviceIndex + ",'" + Handtask._deviceOrder + "','" + qcell + "'," + Handtask._deviceIndex + ",'" + scell + "','" + dtime + "')");

                                RecordMaxHandTaskFID(rehidx);
                                relfid[i] = rehidx;
                            }
                            #endregion
                        }
                        else if (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 2)
                        {
                            rehidx = hidx + 1 + i;
                            rehmindx = ccf.GetMonitorIndex(rehidx, 4);
                            string bc = rehmindx.ToString();
                            int bcl = bc.Length;
                            for (int j = 0; j < (6 - bcl); j++)
                            {
                                bc += j.ToString();
                            }
                            string useawayfork1 = (Handtask._forkNo + 1 + i).ToString();
                            Sql = "insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                        "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_UseAwayFork,F_TxtParam) " +
                        "values(" + routeIDsub + "," + rehidx + ",4," + rehmindx + "," + Handtask._deviceIndex
                        + "," + Handtask._deviceOrder + "," + z + "," + x + "," + y + "," + z1 + "," + x1 + "," + y1 + ",'" + useawayfork1 + "','" + bc + "')";
                            dbo.ExceSQL(Sql);
                            Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('" +
                                bc + "'," + rehidx + ",4,-1,1," + Handtask._deviceIndex + ",'" + Handtask._deviceOrder + "','" + z.ToString() + "-" + x.ToString() + "-" + y.ToString()
                                + "'," + Handtask._arrowLocation + ",'" + z1.ToString() + "-" + x1.ToString() + "-" + y1.ToString() + "','" + dtime + "'," + Handtask._forkNo + ")";
                            dbo.ExceSQL(Sql);
                            RecordMaxHandTaskFID(rehidx);
                            relfid[i] = rehidx;
                        }

                    }
                }
                if ((ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 13) || (ccf.GetDeviceKindIdx(Handtask._deviceIndex) == 31))
                {
                    barcode = Handtask._cellcodeBegin;
                }
                else
                {
                    barcode = hmindx.ToString();
                }

                int bcll = barcode.Length;
                for (int j = 0; j < (6 - bcll); j++)
                {
                    barcode += j.ToString();
                }

                Sql = "insert into T_Monitor_Task(F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex," +
                        "F_DeviceIndex,F_DeviceCommandIndex,F_NumParam1,F_NumParam2,F_NumParam3,F_NumParam4,F_NumParam5,F_NumParam6,F_UseAwayFork,F_TxtParam) " +
                        "values(" + routeIDsub + "," + hidx + ",4," + hmindx + "," + Handtask._deviceIndex
                        + "," + Handtask._deviceOrder + "," + z + "," + x + "," + y + "," + z1 + "," + x1 + "," + y1 + ",'" + useawayfork + "','" + barcode + "')";
                dbo.ExceSQL(Sql);
                //Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('" +
                //    barcode + "'," + hidx + ",4,-1,1," + Handtask._deviceIndex + ",'" + Handtask._deviceOrder + "','" + z.ToString() + "-" + x.ToString() + "-" + y.ToString()
                //    + "'," + Handtask._arrowLocation + ",'" + z1.ToString() + "-" + x1.ToString() + "-" + y1.ToString() + "','" + dtime + "'," + Handtask._forkNo + ")";

                Sql = "insert into T_Manage_Task(FPALLETBARCODE,FID,F_ManageTaskKindIndex,F_RELATIVECONTORLID,FIntoStepOK,FSTARTDEVICE,FREMARK,FSTARTCELL,FENDDEVICE,FENDCELL,FBEGTIME,WORK_MODE) values('" +
                  barcode + "'," + hidx + ",4,-1,1," + Handtask._deviceIndex + ",'" + Handtask._deviceOrder + "','" + Handtask._cellcodeBegin.ToString()
                  + "'," + Handtask._arrowLocation + ",'" + Handtask._cellcodeEnd.ToString() + "','" + dtime + "'," + Handtask._forkNo + ")";
                dbo.ExceSQL(Sql);
                RecordMaxHandTaskFID(hidx);
                if (relfid != null)
                {
                    dbo.ExecuteSql("update T_Manage_Task set F_RELATIVECONTORLID=" + hidx + " where F_ManageTaskKindIndex=4 and FID=" + hidx);
                    for (int i = 0; i < relfid.Length; i++)
                    {
                        dbo.ExecuteSql("update T_Manage_Task set F_RELATIVECONTORLID=" + hidx + " where F_ManageTaskKindIndex=4 and FID=" + relfid[i]);
                    }
                }

                Errtext = string.Empty;
                CDataChangeEventArgs cea = new CDataChangeEventArgs(null, null);
                OnDataChange("BuildHandTask", cea);
                return true;
            }
            catch (Exception ex)
            {
                Errtext = ex.StackTrace + ex.Message;
                return false;
            }
            finally
            {
                dv.Dispose();
            }
        }

        /// <summary>
        /// 出入库模式修改
        /// </summary>
        /// <returns></returns>
        public bool SendInOutMessageToPlc()
        {
            DataView dv = new DataView();
            try
            {
                dv = dboMan.ExceSQL(string.Format("select * from T_InOutModel")).Tables[0].DefaultView;
                if (dv.Count > 0)
                {
                    for (int i = 0; i < dv.Count; i++)
                    {
                        Model.MDevice md = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(dv[i]["Device_Index"]));
                        if (md.RunState.ToString() != dv[i]["INOut_Value"].ToString())
                        {
                            WriteDBDataConveyor(Convert.ToInt32(dv[i]["Device_Index"]),"DB2", dv[i]["INOut_Value"].ToString(), out string errtext);
                            if (errtext != null)
                            {
                                CommonClassLib.CCarryConvert.WriteDarkCasket("opcclient", "设备编号:" + Convert.ToInt32(dv[i]["Device_Index"]).ToString(),
                                    "写入的值:" + dv[i]["INOut_Value"].ToString()+"异常信息:"+errtext.ToString(), "PLC标识:" + devinfo.S7Connection.ToString());
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {

            }
            return true;
        }
    }

}