Beispiel #1
0
 protected void Run()
 {
     try
     {
         int plcMPI = 2;
         CallDave.daveInterface di = CreateDaveInterface_Define(IP, Port);
         while (IsBeginProcess && di != null)
         {
             int res = di.initAdapter();
             if (res == 0)
             {
                 _dVC = new CallDave.daveConnection(di, plcMPI, rack, slot);
                 if (0 == _dVC.connectPLC())
                 {
                     Status = ePLCStatus.Connected;;
                     int times = 1;
                     if (LoopWrite != null)
                     {
                         do
                         {
                             EArgOnHandle_Process e = new EArgOnHandle_Process(_dVC);
                             LoopWrite(this, e);
                             if (e.result)
                             {
                                 times = 0;
                             }
                             else
                             {
                                 times++;
                             }
                             Thread.Sleep(this.ProecssSleepTime);
                         } while (times <= MaxReConnTime);
                     }
                     //Log PLCProcesser.ReConnSleep 后重新连接
                     WLog.WriteLog(Enum_LogType.LogType_Communication, Enum_LogGrade.LogGrade_Nin, Enum_LogMessageType.LogMsgType_Event, "Run", "ReConnSleep", "");
                     Thread.Sleep(this.ReConnSleep);
                 }
                 Thread.Sleep(this.ReConnSleep);
             }
         }
         if (di != null)
         {
             di.disconnectAdapter();
         }
         Status = ePLCStatus.Closed;
         WLog.WriteLog(Enum_LogType.LogType_Error, Enum_LogGrade.LogGrade_Fiv, Enum_LogMessageType.LogMsgType_Exception, "Run", "Closed", string.Format("IP:{0},Port:{1},Flag:{2}", IP, Port, IsBeginProcess));
     }
     catch (Exception ex)
     {
         Status = ePLCStatus.Failed;
         WLog.WriteLog(Enum_LogType.LogType_Error, Enum_LogGrade.LogGrade_Nin, Enum_LogMessageType.LogMsgType_Exception, "Run", ex.Message, ex.StackTrace);
     }
 }
Beispiel #2
0
        /// <summary>
        /// 输送机PLC连接的处理逻辑
        /// </summary>
        /// <param name="Sender"></param>
        /// <param name="e"></param>
        private static void V_LoopWrite(object Sender, EArgOnHandle_Process e)
        {
            string plcID        = ((PLCProcesser)Sender).Name;
            string currentConNo = "";

            try
            {
                var ps  = Dic_SRM_PS.Where(item => item.Value.address.PLC == plcID).ToList();
                var spw = Dic_SRM_SPW.Where(item => item.Value.address.PLC == plcID).ToList();

                foreach (var p in ps)
                {
                    //p.Value.LoadFromPLC(e.PLCConn);
                }
                foreach (var s in spw)
                {
                    s.Value.LoadFromPLC(e.PLCConn);
                }

                var arry_sts = Dic_CON_STS.Where(item => item.Value.address.PLC == plcID).ToList();

                foreach (var kv in arry_sts)
                {
                    currentConNo = kv.Key;
                    kv.Value.LoadFromPLC(e.PLCConn);

                    #region 写日志
                    Program.Log_Agent_CON.WriteLog(Enum_LogType.LogType_Debug,
                                                   Enum_LogGrade.LogGrade_Nin,
                                                   Enum_LogMessageType.LogMsgType_Event,
                                                   "V_LoopWrite-ReadConnStatus",
                                                   string.Format("[{0}]-[{1}]", plcID, currentConNo),
                                                   ByteHelper.ToMessage(kv.Value.Tobytes(), CON_Status.cGroupLen));
                    #endregion
                }
                var arry_req = Dic_CON_Req.Where(item => item.Value.address.PLC == plcID).ToList();
                foreach (var kv in arry_req)
                {
                    currentConNo = kv.Key;
                    kv.Value.LoadFromPLC(e.PLCConn);
                    #region 写日志
                    Program.Log_Agent_CON.WriteLog(Enum_LogType.LogType_Debug,
                                                   Enum_LogGrade.LogGrade_Nin,
                                                   Enum_LogMessageType.LogMsgType_Event,
                                                   "V_LoopWrite-ReadRequest",
                                                   string.Format("[{0}]-[{1}]-{2}", plcID, currentConNo, kv.Value.s_ScanBarCode),
                                                   ByteHelper.ToMessage(kv.Value.Tobytes(), CON_Request.cGroupLen));
                    #endregion
                    #region
                    //if (kv.Value.s_OverRead == 1)
                    //{
                    //    string sql = string.Format(ConfigurationManager.AppSettings["Sql_CodeSel"].Replace('\n', ' '));
                    //    string outString = "";
                    //    var db = new DBAccess_MySql("MySql");
                    //    DBAccess_MySql dby = new DBAccess_MySql();
                    //    dby = db.ReturnSQL_String(sql, out outString);
                    //    string a = null;
                    //    while (dby.rec.Read())
                    //    {
                    //        a = dby.rec.GetString(0);
                    //    }
                    //    if (a != "")
                    //    {
                    //        string outBC = "";
                    //        if (!PLCSystem_CON.SIMPLCRequest.TryGetValue(currentConNo, out outBC))
                    //        {
                    //            kv.Value.s_ScanBarCode = a;// outBC;
                    //            kv.Value.s_OverRead = 0;
                    //            PLCSystem_CON.SIMPLCRequest.Remove(currentConNo);

                    //        }
                    //    }
                    //string sql3 = string.Format(ConfigurationManager.AppSettings["Sql_CodeDel"].Replace('\n', ' '));
                    //var rlt = db.ExecSql(sql, out outString);
                    //kv.Value.s_ScanBarCode = ff.txt_BarCode.Text; //"1121712-BN76:S1Q0893:24:011:S22333:";// outBC;
                    //kv.Value.s_OverRead = 0;
                    //PLCSystem_CON.SIMPLCRequest.Remove(currentConNo);
                    ////ff.txt_BarCode.Text = "";
                    //}
                    #endregion
                    if (kv.Value.s_OverRead == 1)
                    {
                        string outBC = "";
                        if (PLCSystem_CON.SIMPLCRequest.TryGetValue("102", out outBC))//(currentConNo, out outBC))
                        {
                            kv.Value.s_ScanBarCode = outBC;
                            kv.Value.s_OverRead    = 0;
                            PLCSystem_CON.SIMPLCRequest.Remove("102");
                        }
                        if (PLCSystem_CON.SIMPLCRequest.TryGetValue(currentConNo, out outBC))
                        {
                            kv.Value.s_ScanBarCode = outBC;
                            kv.Value.s_OverRead    = 1;
                            PLCSystem_CON.SIMPLCRequest.Remove(currentConNo);
                        }
                    }
                    if (kv.Value.s_OverRead == 0)
                    {
                        string outString = "";
                        //插入输入库,分配货位,分配目的地
                        //应答消息
                        CON_Response cr = null;
                        Dic_CON_Res.TryGetValue(kv.Key, out cr);
                        if (cr == null)
                        {
                            continue;
                        }
                        cr.s_TUID    = kv.Value.s_ScanBarCode;
                        cr.s_TaskID  = kv.Value.s_TaskID;
                        cr.s_FromLoc = kv.Value.s_RequestLoc;

                        BarcodeInfo bi = new BarcodeInfo(cr.s_TUID);

                        #region
                        //Program.Log_Agent_CON.WriteLog(Enum_LogType.LogType_Debug,
                        //    Enum_LogGrade.LogGrade_Nin,
                        //    Enum_LogMessageType.LogMsgType_Event,
                        //    "V_LoopWrite-WriteResponse",
                        //    "条码分解",
                        //    bi.ToString());
                        #endregion

                        CurentBarcode = bi.ToString();
                        if (kv.Value.StnType == eStationType.SP)
                        {
                            //匹配路线更新目的地,(紧测试用,将来会用WMBusiness里业务类代替)
                            string toLoc = "0";
                            //Dic_setPath.TryGetValue(cr.s_FromLoc.ToString(), out toLoc);

                            WMBusiness wmsbus = new WMBusiness();
                            var        b      = wmsbus.RequestInStock(cr.s_TUID, cr.s_FromLoc.ToString(), out toLoc, out outString);
                            if (b)
                            {
                                byte tb_toLoc = 0;
                                if (!byte.TryParse(toLoc, out tb_toLoc))
                                {
                                    continue;
                                }
                                cr.s_ToLoc = tb_toLoc;
                                //将应答任务目的地写入PLC
                                cr.WirteToPLC(e.PLCConn);
                                #region
                                Program.Log_Agent_CON.WriteLog(Enum_LogType.LogType_Debug,
                                                               Enum_LogGrade.LogGrade_Nin,
                                                               Enum_LogMessageType.LogMsgType_Event,
                                                               "V_LoopWrite-WriteResponse",
                                                               string.Format("PLC:[{0}]-CON:[{1}]-TUID:[{2}]-FROMLOC:[{3}]-TOLOC:{4}-Resoponse:", plcID, currentConNo, cr.s_TUID, cr.s_FromLoc.ToString(), cr.s_ToLoc),
                                                               ByteHelper.ToMessage(cr.Tobytes(), CON_Response.cGroupLen));
                                #endregion
                            }
                            else
                            {
                                Program.Log_Agent_CON.WriteLog(Enum_LogType.LogType_Error,
                                                               Enum_LogGrade.LogGrade_Nin,
                                                               Enum_LogMessageType.LogMsgType_Event,
                                                               "V_LoopWrite-WriteResponse", "入库请求失败.", outString);
                            }
                        }
                        else if (kv.Value.StnType == eStationType.AP)
                        {
                            string toLoc = "0";
                            Dic_setPath.TryGetValue(kv.Value.s_RequestLoc.ToString(), out toLoc);
                            cr.s_ToLoc = byte.Parse(toLoc);
                            //将应答任务目的地写入PLC
                            cr.WirteToPLC(e.PLCConn);
                        }
                        else
                        {
                            //异常处理20181206
                        }
                        //更新请求任务WCS已写入状态
                        var r = kv.Value.SetOverRead(e.PLCConn);
                        Program.Log_Agent_CON.WriteLog(Enum_LogType.LogType_Debug,
                                                       Enum_LogGrade.LogGrade_Nin,
                                                       Enum_LogMessageType.LogMsgType_Event,
                                                       "V_LoopWrite-UpdateRequestStats",
                                                       string.Format("PLC:[{0}]-CON:[{1}]-TUID:[{2}]-FROMLOC:[{3}]-WriteStatus:[{4}]", plcID, currentConNo, cr.s_FromLoc.ToString(), cr.s_TUID, r.ToString()), "");
                    }
                }
                e.result = true;
            }
            catch (Exception ex)
            {
                Program.Log_Agent_CON.WriteLog(Enum_LogType.LogType_Error,
                                               Enum_LogGrade.LogGrade_Nin,
                                               Enum_LogMessageType.LogMsgType_Exception,
                                               string.Format("V_LoopWrite-[{0}]-[{1}]", plcID, currentConNo),
                                               ex.Message,
                                               ex.StackTrace);
                e.result = false;
            }
        }
Beispiel #3
0
        /// <summary>
        /// 堆垛机PLC连接的处理逻辑
        /// </summary>
        /// <param name="Sender"></param>
        /// <param name="e"></param>
        private static void V_LoopWrite(object Sender, EArgOnHandle_Process e)
        {
            string plcID        = ((PLCProcesser)Sender).Name;
            string currentSRMNo = "";

            try
            {
                var arry_sts = Dic_SRM_STSClass.Where(item => item.Value.address.PLC == plcID).ToList();

                var  arry_pc = Dic_SRM_PS.Where(item => item.Value.address.PLC == plcID).ToList();
                bool f       = false;
                int  r       = 0;
                int  c       = 0;
                foreach (var pc in arry_pc)
                {
                    f = pc.Value.LoadFromPLC(e.PLCConn, 4);
                }

                int s_finish         = 0;
                int s_fault          = 1;
                int s_runMaintenance = 1;
                int s_run            = 1;
                int s_FrGrid         = 0;
                int s_FrTier         = 0;
                int s_pattern        = 0;

                int s_FrStand = 0;//站
                int s_FrLine  = 0;
                int s_FrGrids = 0;
                int s_FrTiers = 0;

                int    s_ToStand = 0;//站
                int    s_ToLine  = 0;
                int    s_ToGrid  = 0;
                int    s_ToTier  = 0;
                string str;

                var arry_res = Dic_SRM_Res.Where(item => item.Value.address.PLC == plcID).ToList();
                foreach (var res in arry_res)
                {
                    res.Value.LoadFromPLC(e.PLCConn);

                    //完成信号
                    s_finish = res.Value.s_finish;

                    //故障
                    s_fault = res.Value.s_fault;

                    //运行维护
                    s_runMaintenance = res.Value.s_runMaintenance;

                    //运行信号
                    s_run = res.Value.s_run;

                    //格
                    s_FrGrid = res.Value.s_FrGrid;

                    //层
                    s_FrTier = res.Value.s_FrTier;
                }

                #region 当前指令
                var arry_dd = Dic_SRM_Request.Where(item => item.Value.address.PLC == plcID).ToList();
                foreach (var s in arry_dd)
                {
                    s.Value.LoadFromPLC(e.PLCConn);
                    int s_serial = s.Value.s_serial;
                    s_pattern = s.Value.s_pattern; //模式

                    s_FrStand = s.Value.s_FrStand; //站
                    s_FrLine  = s.Value.s_FrLine;
                    s_FrGrids = s.Value.s_FrGrid;
                    s_FrTiers = s.Value.s_FrTier;

                    s_ToStand = s.Value.s_ToStand;//站
                    s_ToLine  = s.Value.s_ToLine;
                    s_ToGrid  = s.Value.s_ToGrid;
                    s_ToTier  = s.Value.s_ToTier;
                }
                #endregion

                var        arry_req = Dic_SRM_Request.Where(item => item.Value.address.PLC == plcID).ToList();
                WOrderInfo w        = new WOrderInfo();
                foreach (var s in arry_req)
                {
                    //currentSRMNo = s.Key;
                    //s.Value.LoadFromPLC(e.PLCConn);
                    r = s.Value.s_FrStand;
                    c = s.Value.s_ToStand;

                    #region 写入数据
                    if (s_finish == 1 && s_fault == 0 && s_runMaintenance == 0)
                    {
                        //判断当前指令是否有值
                        str = w.OrderInfo(s_pattern);
                        //更新数据库
                        if (str == "出库")
                        {
                            w.OutAccount(s_FrLine, s_FrGrids, s_FrTiers, s_ToStand);
                        }
                        else if (str == "入库")
                        {
                            w.InAccount(s_FrStand, s_ToLine, s_ToGrid, s_ToTier);
                        }

                        //判断指令排队序列
                        string strs = w.Write();

                        if (strs == "S")
                        {
                            w.ClearAccount();
                            //写入数据成功后  完成信号改为0
                            if (s.Value.WirteToPLC(e.PLCConn))
                            {
                                foreach (var h in PLCSystem_SRM.Dic_SRM_Res)
                                {
                                    h.Value.s_finish = 0;
                                    h.Value.WirteToPLC(e.PLCConn);
                                    int aaa = h.Value.s_finish;
                                }
                                //系统过账
                                w.Account();
                            }
                        }
                        if (strs == "N")
                        {
                            #region 清除数据
                            s.Value.s_serial  = 0;
                            s.Value.s_pattern = 0;
                            s.Value.s_FrStand = 0;
                            s.Value.s_FrLine  = 0;
                            s.Value.s_FrGrid  = 0;
                            s.Value.s_FrTier  = 0;

                            s.Value.s_ToStand = 0;
                            s.Value.s_ToLine  = 0;
                            s.Value.s_ToGrid  = 0;
                            s.Value.s_ToTier  = 0;
                            s.Value.WirteToPLC(e.PLCConn);
                            w.ClearAccount();
                            #endregion
                        }
                        #region 判断当前指令  格 层是否有值
                        //if (str == "写入")
                        //{
                        //    //执行order_info 中排队指令
                        //    w.Write();

                        //    //写入数据成功后  完成信号改为0
                        //    if (s.Value.WirteToPLC(e.PLCConn))
                        //    {
                        //        foreach (var h in PLCSystem_SRM.Dic_SRM_Res)
                        //        {
                        //            h.Value.s_finish = 0;
                        //            h.Value.WirteToPLC(e.PLCConn);
                        //            int aaa = h.Value.s_finish;
                        //        }
                        //        #region 清除数据
                        //        //s.Value.s_serial = 0;
                        //        //s.Value.s_pattern = 0;
                        //        //s.Value.s_FrStand = 0;
                        //        //s.Value.s_FrLine = 0;
                        //        //s.Value.s_FrGrid = 0;
                        //        //s.Value.s_FrTier = 0;

                        //        //s.Value.s_ToStand = 0;
                        //        //s.Value.s_ToLine = 0;
                        //        //s.Value.s_ToGrid = 0;
                        //        //s.Value.s_ToTier = 0;
                        //        //s.Value.WirteToPLC(e.PLCConn);
                        //        #endregion
                        //        //系统过账
                        //        w.Account();
                        //    }
                        //}

                        //if (str == "过账")
                        //{
                        //    s.Value.s_serial = 0;
                        //    s.Value.s_pattern = 0;
                        //    s.Value.s_FrStand = 0;
                        //    s.Value.s_FrLine = 0;
                        //    s.Value.s_FrGrid = 0;
                        //    s.Value.s_FrTier = 0;

                        //    s.Value.s_ToStand = 0;
                        //    s.Value.s_ToLine = 0;
                        //    s.Value.s_ToGrid = 0;
                        //    s.Value.s_ToTier = 0;

                        //    if (s.Value.WirteToPLC(e.PLCConn))
                        //    {
                        //        foreach (var h in PLCSystem_SRM.Dic_SRM_Res)
                        //        {
                        //            h.Value.s_finish = 0;
                        //            h.Value.WirteToPLC(e.PLCConn);
                        //            int aaa = h.Value.s_finish;
                        //        }
                        //        #region 完成后指令过账
                        //        w.ClearAccount();
                        //        #endregion
                        //    }
                        //}

                        #region 清除数据
                        //if (of1!=1)
                        //{
                        //    s.Value.s_serial = 0;
                        //    s.Value.s_pattern = 0;
                        //    s.Value.s_FrStand = 0;
                        //    s.Value.s_FrLine = 0;
                        //    s.Value.s_FrGrid = 0;
                        //    s.Value.s_FrTier = 0;

                        //    s.Value.s_ToStand = 0;
                        //    s.Value.s_ToLine = 0;
                        //    s.Value.s_ToGrid = 0;
                        //    s.Value.s_ToTier = 0;

                        //    if (s.Value.WirteToPLC(e.PLCConn))
                        //    {
                        //        foreach (var h in PLCSystem_SRM.Dic_SRM_Res)
                        //        {
                        //            h.Value.s_finish = 0;
                        //            h.Value.WirteToPLC(e.PLCConn);
                        //            int aaa = h.Value.s_finish;
                        //        }
                        //        #region 完成后指令过账
                        //        w.ClearAccount();
                        //        #endregion
                        //    }
                        //}
                        #endregion

                        #endregion
                    }
                    #endregion

                    #region 清除指令
                    //if (s_finish == 0)
                    //{
                    //    s.Value.s_serial = 0;
                    //    s.Value.s_pattern = 0;
                    //    s.Value.s_FrStand = 0;
                    //    s.Value.s_FrLine = 0;
                    //    s.Value.s_FrGrid = 0;
                    //    s.Value.s_FrTier = 0;

                    //    s.Value.s_ToStand = 0;
                    //    s.Value.s_ToLine = 0;
                    //    s.Value.s_ToGrid = 0;
                    //    s.Value.s_ToTier = 0;

                    //    if (s.Value.WirteToPLC(e.PLCConn))
                    //    {
                    //        foreach (var h in PLCSystem_SRM.Dic_SRM_Res)
                    //        {
                    //            h.Value.s_finish = 0;
                    //            h.Value.WirteToPLC(e.PLCConn);
                    //            int aaa = h.Value.s_finish;
                    //        }
                    //        #region 完成后指令过账
                    //        w.ClearAccount();
                    //        #endregion
                    //    }
                    //}
                    #endregion
                }

                if (s_fault == 1) //故障
                {
                    w.Fault();
                    foreach (var s in PLCSystem_SRM.Dic_SRM_Request)
                    {
                        s.Value.s_serial  = 0;
                        s.Value.s_pattern = 0;
                        s.Value.s_FrStand = 0;
                        s.Value.s_FrLine  = 0;
                        s.Value.s_FrGrid  = 0;
                        s.Value.s_FrTier  = 0;

                        s.Value.s_ToStand = 0;
                        s.Value.s_ToLine  = 0;
                        s.Value.s_ToGrid  = 0;
                        s.Value.s_ToTier  = 0;
                        s.Value.WirteToPLC(e.PLCConn);
                    }
                }

                e.result = true;
            }
            catch (Exception ex)
            {
                Program.Log_Agent_SRM.WriteLog(Enum_LogType.LogType_Error,
                                               Enum_LogGrade.LogGrade_Nin,
                                               Enum_LogMessageType.LogMsgType_Exception,
                                               string.Format("V_LoopWrite-[{0}]-[{1}]", plcID, currentSRMNo),
                                               ex.Message,
                                               ex.StackTrace);
                e.result = false;
            }
        }