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); } }
/// <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; } }
/// <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; } }