//********************************************************************************* // SCUtility.cs //********************************************************************************* // File Name: SCUtility.cs // Description: ScriptControl 共用工具元件 // //(c) Copyright 2014, MIRLE Automation Corporation // // Date Author Request No. Tag Description // ------------- ------------- ------------- ------ ----------------------------- //********************************************************************************** using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading.Tasks; using com.mirle.ibg3k0.bcf.Common; using com.mirle.ibg3k0.sc.App; using System.Data; using System.Reflection; using NLog; using com.mirle.ibg3k0.stc.Data.SecsData; using com.mirle.ibg3k0.bcf.Controller; using com.mirle.ibg3k0.sc.Data.VO; using System.Collections; using System.Diagnostics; using com.mirle.ibg3k0.Utility.ul.Data; using com.mirle.ibg3k0.WpfTools.Data.VO; using System.Text.RegularExpressions; namespace com.mirle.ibg3k0.sc.Common { public class SCUtility { private static Logger logger = LogManager.GetCurrentClassLogger(); private static Logger SECSMsgLogger = LogManager.GetLogger("SECSMsgLogger"); private static Logger CSTInfoLogger = LogManager.GetLogger("CSTInfoLogger"); private static Logger OperationLogger = LogManager.GetLogger("OperationLogger"); private static Logger HostLogger = LogManager.GetLogger("HostLogger"); private static Logger logger_SystemError = LogManager.GetLogger("SystemErrorLogger"); //private CommonInfo ci; //Transfer Type的feature public const String FUNCTION_FEATURE_EC = "HH"; public const String FUNCTION_FEATURE_EC2 = "HP"; public const String FUNCTION_FEATURE_EC3 = "HR"; public const String FUNCTION_FEATURE_EC4 = "HD"; public const String FUNCTION_FEATURE_EC5 = "HW"; public const String FUNCTION_FEATURE_EC6 = "HS"; public const String FUNCTION_FEATURE_EC7 = "HC"; //Transfer Type public const String FUNCTION_TRANSDFERTYPE_SEND = "Send"; public const String FUNCTION_TRANSDFERTYPE_RECEIVE = "Receive"; private static string selectPLCTransferType(string function_name) { string type = string.Empty; if (function_name.Contains(FUNCTION_FEATURE_EC) || function_name.Contains(FUNCTION_FEATURE_EC2) || function_name.Contains(FUNCTION_FEATURE_EC3) || function_name.Contains(FUNCTION_FEATURE_EC4) || function_name.Contains(FUNCTION_FEATURE_EC5) || function_name.Contains(FUNCTION_FEATURE_EC6) || function_name.Contains(FUNCTION_FEATURE_EC7)) { type = FUNCTION_TRANSDFERTYPE_SEND; } else { type = FUNCTION_TRANSDFERTYPE_RECEIVE; } return type; } public static void SystemEventLog(string msg, EventLogEntryType type) { try { string src_name = "SC Application"; if (!EventLog.SourceExists(src_name)) { EventLog.CreateEventSource(src_name, src_name); } EventLog eLog = new EventLog(); eLog.Source = src_name; eLog.WriteEntry(msg, type); } catch (Exception ex) { logger_SystemError.Error(ex, "Exception"); } } public static Boolean isMatche(Object obj1, Object obj2) { return BCFUtility.isMatche(obj1, obj2); } public static Boolean isEmpty(Object obj) { return BCFUtility.isEmpty(obj); } public static String Trim(String source) { return Trim(source, false); } /// /// /// /// public static String TrimAndToUpper(String source) { return ToUpper(Trim(source, false), false); } public static String Trim(string source, Boolean rtnEmptyStr) { if (source == null) { return (rtnEmptyStr ? string.Empty : source); } return source.Trim(); } /// /// /// /// /// public static String ToUpper(string source, Boolean rtnEmptyStr) { if (source == null) { return (rtnEmptyStr ? string.Empty : source); } return source.ToUpper(); } public static String FirstToUpper_ElseToLower(string source) { if (source == null || source == string.Empty) { return source; } source = source.Trim(); return source[0].ToString().ToUpper() + source.Substring(1).ToLower(); } public static String FillPadLeft(string source, char padChar, int length) { if (source == null) { return null; } return Trim(source).PadLeft(length, padChar); } public static String convert2SlotMapMES(string slotMap) { string rtnSlotMap = string.Empty; if (slotMap == null) { return rtnSlotMap; } rtnSlotMap = slotMap.Replace(SCAppConstants.CSTSlotMap.Not_Exist, SCAppConstants.X_FLAG.ToString()); rtnSlotMap = rtnSlotMap.Replace(SCAppConstants.CSTSlotMap.Exist, SCAppConstants.O_FLAG.ToString()); return rtnSlotMap; } public static void Fill(object LogicObject, DataRow Row) { Dictionary props = new Dictionary(); foreach (PropertyInfo p in LogicObject.GetType().GetProperties()) props.Add(p.Name, p); foreach (DataColumn col in Row.Table.Columns) { string name = col.ColumnName; if (Row[name] != DBNull.Value && props.ContainsKey(name)) { object item = Row[name]; PropertyInfo p = props[name]; if (p.PropertyType != col.DataType) item = Convert.ChangeType(item, p.PropertyType); p.SetValue(LogicObject, item, null); } } } /// /// 更改系統時間 /// /// public static void updateSystemTime(DateTime hostTime) { SystemTime st = new SystemTime(); st.FromDateTime(hostTime); SystemTime.SetSystemTime(ref st); SystemTime.GetSystemTime(ref st); logger.Info("Set System Time:{0}", st.ToDateTime().ToString(SCAppConstants.TimestampFormat_16)); } public static string stringListToString(string tagS, List sList) { StringBuilder sb = new StringBuilder(); foreach (String str in sList) { sb.Append(str); if (tagS != null) { sb.Append(tagS); } } return sb.ToString(); } public static void secsActionRecordMsg(SCApplication scApp, Boolean isReceive, SXFY sxfy) { if (sxfy == null) { return; } StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("[{0}][{1}][{2}][{3}][{4}][{5}]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), (isReceive ? "R" : "S"), sxfy.StreamFunction, sxfy.SystemByte, sxfy.W_Bit, sxfy.SECSAgentName)); string msg = string.Format("{0}{1}", sb.ToString(), sxfy.GetType().Name); scApp.getEQObjCacheManager().CommonInfo.SECS_Msg = msg; SECSMsgLogger.Info(msg); string sDateTime = DateTime.Now.ToString(SCAppConstants.DateTimeFormat_23); Task.Run(() => { setLogInfo_SECS(scApp, isReceive, sxfy, sDateTime); }); } public static void secsActionRecordMsg(SCApplication scApp, Boolean isReceive, int systemByte, string secsAgentName, string msg) { StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("[{0}][{1}][{2}][{3}][{4}]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), (isReceive ? "R" : "S"), systemByte, secsAgentName, msg)); sb.AppendLine("[" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "] " + (isReceive ? "[R]" : "[S]") + "[" + msg + "]"); scApp.getEQObjCacheManager().CommonInfo.SECS_Msg = sb.ToString(); SECSMsgLogger.Info(sb.ToString()); } /// /// Add by Allen /// /// /// /// /// public static void jsecsActionRecordMsg(JSECS_Base.JSecs jsecs, Boolean isReceive, SecsMessage sxfy, UInt32 SB) { if (sxfy == null) { return; } if (scApp == null) { scApp = SCApplication.getInstance(); } StringBuilder sb = new StringBuilder(); int S = 0, F = 0, W = 0; sxfy.GetSFW(ref S, ref F, ref W); sb.AppendLine(string.Format("[{0}][{1}][{2}][{3}][{4}][{5}]", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"), (isReceive ? "R" : "S"), "S" + S.ToString() + "F" + F.ToString(), SB, W, scApp.getEQObjCacheManager().getLine().Line_ID)); string msg = string.Format("{0}{1}", sb.ToString(), sxfy.GetType().Name); scApp.getEQObjCacheManager().CommonInfo.SECS_Msg = msg; SECSMsgLogger.Info(msg); string sDateTime = DateTime.Now.ToString(SCAppConstants.DateTimeFormat_23); // Task.Run(() => // { // setLogInfo_JSECS(jsecs, isReceive, sxfy, sDateTime, SB); // }); setLogInfo_JSECS(jsecs, isReceive, sxfy, sDateTime, SB); } public static void actionRecordMsg(SCApplication scApp, String funID, String eqID, String msg, String result) { StringBuilder sb = new StringBuilder(); String dateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); sb.Append(String.Format("[{0}][{1}][{2}][{3}][{4}]", dateTime, funID, eqID, msg, result)); scApp.getEQObjCacheManager().CommonInfo.Action_Msg = sb.ToString(); SECSMsgLogger.Info(sb.ToString()); } /// /// Add by Allen /// /// /// /// /// /// public static void setLogInfo_JSECS(JSECS_Base.JSecs jsecs, Boolean isReceive, SecsMessage sxfy, string sDateTime, UInt32 sb) { try { if (scApp == null) { scApp = SCApplication.getInstance(); } int s = 0, f = 0, w = 0; sxfy.GetSFW(ref s, ref f, ref w); string DevID = ""; string context = ""; int SB = (int)sb; sxfy.GetText(ref context, SECS.TextOption_Default); jsecs.GetHSMS().GetConfig(SECS.CN_DeviceID, ref DevID); JSECS_Log_Parser.JSECSLogPaser jSECSLogPaser = new JSECS_Log_Parser.JSECSLogPaser(sxfy); LogTitle_SECS logTitleTemp = new LogTitle_SECS() { EQ_ID = scApp.getEQObjCacheManager().getLine().Line_ID, SendRecive = isReceive ? FUNCTION_TRANSDFERTYPE_RECEIVE : FUNCTION_TRANSDFERTYPE_SEND, Sx = s.ToString(), Fy = f.ToString(), DeviceID = DevID, FunName = jSECSLogPaser.GetAlias() ?? string.Empty, Message = jSECSLogPaser.ToLogString(jsecs) ?? context, SystemByte = SB.ToString(), LogType = SCAppConstants.LogType.SECS_ForHost.ToString() }; logTitleTemp.Time = sDateTime; logUtility.addLogInfo(logTitleTemp); } catch (Exception ex) { logger_SystemError.Warn(ex, "Exception:"); } } public static void setLogInfo_SECS(SCApplication scApp, Boolean isReceive, SXFY sxfy, string sDateTime) { try { if (isEmpty(sxfy.SECSAgentName)) return; com.mirle.ibg3k0.stc.Common.SECS.SECSAgent secsAgent = scApp.getBCFApplication().getSECSAgent(sxfy.SECSAgentName); string device_id = secsAgent == null ? string.Empty : secsAgent.DeviceID.ToString(); string s = sxfy.getS().ToString(); string f = sxfy.getF().ToString(); LogTitle_SECS logTitleTemp = new LogTitle_SECS() { EQ_ID = sxfy.SECSAgentName, SendRecive = isReceive ? FUNCTION_TRANSDFERTYPE_RECEIVE : FUNCTION_TRANSDFERTYPE_SEND, Sx = s, Fy = f, DeviceID = device_id, FunName = sxfy.StreamFunctionName ?? string.Empty, Message = sxfy.toSECSString(), LogType = SCAppConstants.LogType.SECS_ForHost.ToString() }; logTitleTemp.Time = sDateTime; logUtility.addLogInfo(logTitleTemp); } catch (Exception ex) { logger_SystemError.Warn(ex, "Exception:"); } } public static void PLCActionRecordMsg(SCApplication scApp, string Node_ID, ref List vWriteList) { if (scApp == null) logger.Warn("scApp is null"); if (Node_ID == null) logger.Warn("Node_ID is null"); if (vWriteList == null) logger.Warn("vWriteList is null"); if (scApp == null || Node_ID == null || vWriteList == null) return; scApp.getEQObjCacheManager().CommonInfo.PLC_Msg = string.Format("*************{0}*************", DateTime.Now.ToString()); scApp.getEQObjCacheManager().CommonInfo.PLC_Msg = BCFUtility.writeEquipmentLog(Node_ID, vWriteList); vWriteList.Clear(); } public static void PLCActionRecordMsg(SCApplication scApp, string Node_ID, ref List vEventList) { scApp.getEQObjCacheManager().CommonInfo.PLC_Msg = string.Format("*************{0}*************", DateTime.Now.ToString()); scApp.getEQObjCacheManager().CommonInfo.PLC_Msg = BCFUtility.writeEquipmentLog(Node_ID, vEventList); vEventList.Clear(); } public static void PLCActionRecordMsg(SCApplication scApp, string Node_ID, ref List vEventList, ref List vWriteList) { scApp.getEQObjCacheManager().CommonInfo.PLC_Msg = string.Format("*************{0}*************", DateTime.Now.ToString()); scApp.getEQObjCacheManager().CommonInfo.PLC_Msg = BCFUtility.writeEquipmentLog(Node_ID, vEventList); scApp.getEQObjCacheManager().CommonInfo.PLC_Msg = BCFUtility.writeEquipmentLog(Node_ID, vWriteList); vEventList.Clear(); vWriteList.Clear(); } public static void RecordLog(Logger log, com.mirle.ibg3k0.sc.Data.PLC_Functions.PLC_FunBase fun, SCAppConstants.LogType log_type = SCAppConstants.LogType.PLC_ForEQ) { string msg = fun.ToString(); StringBuilder builder = new StringBuilder(); builder.AppendLine(); builder.Append("-EQ ID :").AppendFormat("[{0}]", fun.EQ_ID).AppendLine(); builder.Append("-Fun ID:").AppendFormat("[{0}]", fun.FunctionName).AppendLine(); builder.Append(msg); log.Info(builder.ToString()); SCUtility.setLogInfo_PLCForEQ(fun.EQ_ID, string.Empty, fun.FunctionName, msg, log_type, ""); } static com.mirle.ibg3k0.Utility.ul.Data.LogUtility logUtility = com.mirle.ibg3k0.Utility.ul.Data.LogUtility.getInstance(); //不記錄到分開的EQ LOG public static void RecordLog(com.mirle.ibg3k0.sc.Data.PLC_Functions.PLC_FunBase fun, string run_mode, SCAppConstants.LogType log_type = SCAppConstants.LogType.PLC_ForEQ) { string msg = fun.ToString(); SCUtility.setLogInfo_PLCForEQ(fun.EQ_ID, string.Empty, fun.FunctionName, msg, log_type, run_mode); } public static void RecordLog(com.mirle.ibg3k0.sc.Data.PLC_Functions.PLC_FunBase fun, SCAppConstants.LogType log_type = SCAppConstants.LogType.PLC_ForEQ) { string msg = fun.ToString(); SCUtility.setLogInfo_PLCForEQ(fun.EQ_ID, selectPLCTransferType(fun.FunctionName), fun.FunctionName, msg, log_type, SCAppConstants.RunMode.convert2Log(scApp.getEQObjCacheManager().getEfemEquipment().Run_Mode)); } private static SCApplication scApp = null; const char CHAR_UNDERLINE = '_'; public static void setLogInfo_PLCForEQ(string eq_id, string send_receive, string function_name, string msg, SCAppConstants.LogType log_type, string run_mode) { if (scApp == null) { scApp = SCApplication.getInstance(); } if (eq_id.Contains(CHAR_UNDERLINE)) { eq_id = eq_id.Split(CHAR_UNDERLINE)[0]; } int PortNo = eq_id.StartsWith("P0") ? int.Parse(eq_id.Substring(1)) : 0; EqptMap eqptMap = null; if (PortNo != 0) { eqptMap = scApp.EqptMapDao.getByEFEM_ID(scApp.BC_ID, SCAppConstants.EQPT_SYMBOL_EFEM); } else { eqptMap = scApp.EqptMapDao.getByEFEM_ID(scApp.BC_ID, eq_id); } string eq_real_id = eqptMap == null ? eq_id : eqptMap.EQPT_REAL_ID; if (PortNo != 0) { eq_real_id += "_P" + PortNo.ToString("00"); } string replacement = ConfigurationManager.AppSettings["UI_MachineName"] ?? ""; if (!string.IsNullOrEmpty(eq_real_id)) { eq_real_id = Regex.Replace(eq_real_id, "EFEM", replacement); } LogTitle_PLC logTitleTemp = new LogTitle_PLC() { EQ_ID = eq_real_id + "_" + run_mode, LogType = log_type.ToString(), SendRecive = send_receive, FunName = function_name, Message = msg }; Task.Run(() => logUtility.addLogInfo(logTitleTemp)); } public static void setLogInfo_PLCForEQ(string eq_id, string send_receive, string function_name, string msg, string sDateTime) { if (scApp == null) { scApp = SCApplication.getInstance(); } if (eq_id.Contains(CHAR_UNDERLINE)) { eq_id = eq_id.Split(CHAR_UNDERLINE)[0]; } int PortNo = 0; EqptMap eqptMap = scApp.EqptMapDao.getByEFEM_ID(scApp.BC_ID, eq_id); string eq_real_id; if (eqptMap == null) { eq_real_id = eq_id; } else { eq_real_id = eqptMap.EQPT_REAL_ID.Trim(); if (PortNo != 0) { eq_real_id += "_P" + PortNo.ToString("00"); } } LogTitle_PLC logTitleTemp = new LogTitle_PLC() { EQ_ID = eq_real_id, SendRecive = send_receive, FunName = function_name, Message = msg, LogType = SCAppConstants.LogType.PLC_ForEQ.ToString() }; logTitleTemp.Time = sDateTime; Task.Run(() => logUtility.addLogInfo(logTitleTemp)); } public static int convertToInt(int int1, int iStartIndex1, int iEndIndex1, int int2, int iStartIndex2, int iEndIndex2) { int shiftInt2 = int2 * (int)Math.Pow(2, 12); UInt16[] iArray1 = new UInt16[1] { (UInt16)int1 }; UInt16[] iArray2 = new UInt16[1] { (UInt16)shiftInt2 }; Boolean[] bArray1 = convertToBooleans(iArray1, 0, 0); Boolean[] bArray2 = convertToBooleans(iArray2, 0, 0); BitArray ResultArray = new BitArray(16); int boolCount = 0; foreach (Boolean b in bArray1) { ResultArray[boolCount] = bArray1[boolCount] | bArray2[boolCount]; boolCount++; } //BitArray bitArray = new BitArray(16); //int j = 0; //for (int i = iStartIndex1; i < iEndIndex1; i++) //{ // bitArray[i] = bArray1[j]; // j++; //} //j = 0; //for (int i = iStartIndex2; i < iEndIndex2; i++) //{ // bitArray[i] = bArray2[j]; // j++; //} int[] intAry = new int[1]; ResultArray.CopyTo(intAry, 0); return intAry[0]; } public static Boolean[] convertToBooleans(UInt16[] dataTemp, int iStartIndex, int iEndIndex) { int[] rangeData = BCFUtility.getArrayRange(dataTemp, iStartIndex, iEndIndex); return (Boolean[])BCFUtility.convertInt2TextByType(16, Type.GetType("System.Boolean[]"), rangeData); } public static void ConvertPLCMsg(string functionName, string EQ_ID, string EQ_Real_ID, StringBuilder convertValue) { string sDateTime = DateTime.Now.ToString(SCAppConstants.DateTimeFormat_23); string sconvertValue = convertValue.ToString(); Task.Run(() => { ConvertPLCMsgAsync(functionName, EQ_ID, EQ_Real_ID, sconvertValue, sDateTime); }); convertValue.Clear(); } protected static Logger convertPLClogger = LogManager.GetLogger("ConvertPLCLog"); public static void ConvertPLCMsgAsync(string functionName, string EQ_ID, string EQ_Real_ID, string convertValue, string sDateTime) { //1.記錄到Total的Log convertPLClogger.Info(Environment.NewLine + "Trigger T:[{0}]{1}******************EQPT {2}:{3}******************{4}{5}{6}{7}" , sDateTime , Environment.NewLine , EQ_ID , EQ_Real_ID , Environment.NewLine , functionName , Environment.NewLine , convertValue); //2.記錄到個別EQ的Log recodeConvertPLCInfoForEq(functionName, EQ_ID.Trim(), convertValue, sDateTime); //3.呈現到畫面上的Log setLogInfo_PLCForEQ(EQ_ID, selectPLCTransferType(functionName), functionName, convertValue, sDateTime); } private static void recodeConvertPLCInfoForEq(string functionName, string EQ_ID, string convertValue, string sDateTime) { if (EQ_ID == SCAppConstants.EQPT_SYMBOL_EFEM) { convertPLClogger_EFEM.Info(Environment.NewLine + "Trigger T:[{0}]{1}******************{2}******************{3}{4}" , sDateTime, Environment.NewLine, functionName, Environment.NewLine, convertValue); } else if (EQ_ID == SCAppConstants.EQPT_SYMBOL_EQ1) { convertPLClogger_EQ1.Info(Environment.NewLine + "Trigger T:[{0}]{1}******************{2}******************{3}{4}" , sDateTime, Environment.NewLine, functionName, Environment.NewLine, convertValue); } else if (EQ_ID == SCAppConstants.EQPT_SYMBOL_EQ2) { convertPLClogger_EQ2.Info(Environment.NewLine + "Trigger T:[{0}]{1}******************{2}******************{3}{4}" , sDateTime, Environment.NewLine, functionName, Environment.NewLine, convertValue); } else if (EQ_ID == SCAppConstants.EQPT_SYMBOL_EQ3) { convertPLClogger_EQ3.Info(Environment.NewLine + "Trigger T:[{0}]{1}******************{2}******************{3}{4}" , sDateTime, Environment.NewLine, functionName, Environment.NewLine, convertValue); } else if (EQ_ID == SCAppConstants.EQPT_SYMBOL_EQ4) { convertPLClogger_EQ4.Info(Environment.NewLine + "Trigger T:[{0}]{1}******************{2}******************{3}{4}" , sDateTime, Environment.NewLine, functionName, Environment.NewLine, convertValue); } } protected static Logger convertPLClogger_EFEM = LogManager.GetLogger("ConvertPLCLog_EFEM"); /// /// /// public static void ConvertPLCMsg_EFEM(string functionName, string Node_ID, Dictionary convertValue, StringBuilder sb) { //convertPLClog.Info("*************{0}*************"); sb.Clear(); foreach (KeyValuePair item in convertValue) { sb.AppendFormat(" {0} = {1}{2}", item.Key, item.Value, Environment.NewLine); } convertPLClogger_EFEM.Info(Environment.NewLine + "*****{0}*****{1}{2}", functionName, Environment.NewLine, sb.ToString()); convertValue.Clear(); } protected static Logger convertPLClogger_EQ1 = LogManager.GetLogger("ConvertPLCLog_EQ1"); protected static Logger convertPLClogger_EQ2 = LogManager.GetLogger("ConvertPLCLog_EQ2"); protected static Logger convertPLClogger_EQ3 = LogManager.GetLogger("ConvertPLCLog_EQ3"); protected static Logger convertPLClogger_EQ4 = LogManager.GetLogger("ConvertPLCLog_EQ4"); public static LogUtility LogUtility { get => logUtility; set => logUtility = value; } /// /// 在Type1 機台 執行FUN時發生錯誤後,顯示到畫面上 /// /// public static void onFunErrorLog(string errorFun) { //BCFApplication.onErrorLog(string.Format("FUN:{0} Has error happend!!", errorFun)); } public static String getPropertiesLength(object obj) { StringBuilder sb = new StringBuilder(); var type = obj.GetType(); // Get the PropertyInfo object: PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo property in properties) { if (property.PropertyType == typeof(string)) { String s; if (property.GetValue(obj) != null) s = property.GetValue(obj).ToString(); else s = string.Empty; sb.AppendFormat("{0}.length = '{1}'", property.Name, s.Length); sb.AppendFormat(" {0}.value = '{1}'", property.Name, property.GetValue(obj)); sb.AppendLine(); } else { sb.AppendFormat("{0}.value = '{1}'", property.Name, property.GetValue(obj)); sb.AppendLine(); } } return sb.ToString(); } public static void TrimAllParameter(object obj) { try { if (obj == null) { return; } var type = obj.GetType(); // Get the PropertyInfo object: PropertyInfo[] properties = type.GetProperties(); foreach (PropertyInfo property in properties) { if (property.PropertyType == typeof(string)) { if (property.GetValue(obj) != null) { String temp = property.GetValue(obj).ToString().Trim(); property.SetValue(obj, temp); } } } } catch (Exception ex) { logger_SystemError.Error(ex, "Exception"); } } public static string ShowCallerInfo(StackTrace st, string remark) { StringBuilder sb = new StringBuilder(); try { if (st == null) { st = new StackTrace(true); } sb.AppendLine(new string('=', 80)); sb.AppendLine(string.Format("Caller Remark: {0}", remark)); StackFrame sf = st.GetFrame(1); MethodBase mb = sf.GetMethod(); sb.AppendLine(string.Format("Caller Module: {0}", mb.Module.FullyQualifiedName)); sb.AppendLine(string.Format("Caller Class & Method: {0}.{1}()", mb.ReflectedType.FullName, mb.Name)); sb.AppendLine(string.Format("File Info: Line {0} in {1}", sf.GetFileLineNumber(), sf.GetFileName())); sb.AppendLine(new string('=', 80)); } catch (Exception ex) { logger_SystemError.Error(ex, "Exception"); } return sb.ToString(); } public static void PrintPortCommandInfo(Port port) { try { string cmdStat = SCApplication.getMessageString("Port_CMD_Status_" + port.PortCommandStatus); string portStat = SCApplication.getMessageString("Port_Status_" + port.Port_Stat); Cassette cst = port.CassetteLoader.CassetteItem; string cstStat = string.Empty; string cstID = string.Empty; if (cst != null) { cstStat = SCApplication.getMessageString("CST_Status_" + cst.CST_Stat); if (!BCFUtility.isEmpty(cst.CST_ID)) { cstID = cst.CST_ID; } } StringBuilder sb = new StringBuilder(); sb.AppendLine(string.Format("Port {0} [Command Status:{1}] [Port Status:{2}][CST ID:{3}][Cst Status:{4}]", port.Port_ID.Trim(), cmdStat, portStat, cstID.Trim(), cstStat)); CSTInfoLogger.Info(sb.ToString()); sb.Clear(); } catch (Exception ex) { CSTInfoLogger.Warn("SCUtility.PrintPortCommandInfo Occur Exception[{0}]", ex.ToString()); logger_SystemError.Error(ex, "Exception"); } } public static void PrintCSTInfo(CSTDataInfo cstInfo) { try { //SCApplication scApp = SCApplication.getInstance(); //if (cstInfo == null) { return; } //StringBuilder sb = new StringBuilder(); //sb.AppendLine(); //sb.AppendLine(string.Format("{0}CST ID: {1}", new string(' ', 5), cstInfo.CST_ID)); //sb.AppendLine(string.Format("{0}Port ID: {1}", new string(' ', 5), cstInfo.Port_ID)); //sb.AppendLine(string.Format("{0}Port Type: {1}", new string(' ', 5), cstInfo.Port_Type)); //sb.AppendLine(string.Format("{0}Port Use Type: {1}", new string(' ', 5), cstInfo.Port_Use_Type)); //sb.AppendLine(string.Format("{0}Quantity: {1}", new string(' ', 5), cstInfo.Quantity)); //sb.AppendLine(string.Format("{0}Slot Select: {1}", new string(' ', 5), cstInfo.Slot_Select)); //if (cstInfo.GlassDataList != null) //{ // foreach (CSTDataInfo.GlassDataInfo glsInfo in cstInfo.GlassDataList) // { // sb.AppendLine(string.Format("{0}[Slot No: {1}][Glass ID: {2}][Lot ID: {3}]", new string(' ', 7), glsInfo.Slot_NO, glsInfo.Glass_ID, glsInfo.Lot_ID)); // sb.AppendLine(string.Format("{0}[Glass ID Type: {1}][Glass Type: {2}]", new string(' ', 10), glsInfo.Glass_ID_Type, glsInfo.Glass_Type)); // sb.AppendLine(string.Format("{0}[PPID: {1}][Sample Flag: {2}]", new string(' ', 10), glsInfo.PPID, glsInfo.Sample_Flag)); // EfemRecipe efemrecipe = getRecipeID(scApp, glsInfo.PPID); // if (efemrecipe != null) // { // sb.AppendLine(string.Format("{0}[EFEM Recipe ID: {1}][Station1 EQ(Recipe ID): {2}({3})][Station2 EQ(Recipe ID): {4}({5})]" // , new string(' ', 10), efemrecipe.Recipe_ID, efemrecipe.St1_Eq, efemrecipe.St1_Recipe, efemrecipe.St2_Eq, efemrecipe.St2_Recipe)); // } // sb.AppendLine(string.Format("{0}[Work Order: {1}][Glass Grade: {2}]", new string(' ', 10), glsInfo.Work_Order, glsInfo.Glass_Grade)); // sb.AppendLine(string.Format("{0}[Glass Judge: {1}][Glass Size: {2}]", new string(' ', 10), glsInfo.Glass_Judge, glsInfo.Glass_Size)); // sb.AppendLine(string.Format("{0}[Glass THK: {1}][Lot Judge: {2}]", new string(' ', 10), glsInfo.Glass_THK, glsInfo.Lot_Judge)); // sb.AppendLine(string.Format("{0}[Maker: {1}][Mask ID: {2}]", new string(' ', 10), glsInfo.Maker, glsInfo.Mask_ID)); // sb.AppendLine(string.Format("{0}[Oper ID: {1}][Prober ID: {2}]", new string(' ', 10), glsInfo.Oper_ID, glsInfo.Prober_ID)); // sb.AppendLine(string.Format("{0}[Prod ID: {1}][Rework Count: {2}]", new string(' ', 10), glsInfo.Prod_ID, glsInfo.Rework_Count)); // sb.AppendLine(string.Format("{0}[Dummy Used Count: {1}][Exp Recipe ID: {2}]", new string(' ', 10), glsInfo.Dummy_Used_Count, glsInfo.Exp_Recipe_ID)); // sb.AppendLine(string.Format("{0}[Exp Unit ID: {1}]", new string(' ', 10), glsInfo.Exp_Unit_ID)); // sb.AppendLine(string.Format("{0}[Panel Judge: {1}]", new string(' ', 10), glsInfo.Panel_Judge)); // sb.AppendLine(string.Format("{0}[Array Repair Type: {1}]", new string(' ', 10), glsInfo.Array_Repair_Type)); // sb.AppendLine(string.Format("{0}[LCVD Repair Type: {1}]", new string(' ', 10), glsInfo.LCVD_Repair_Type)); // } //} //CSTInfoLogger.Info(sb.ToString()); //sb.Clear(); } catch (Exception ex) { CSTInfoLogger.Warn("SCUtility.PrintCSTInfo Occur Exception[{0}]", ex.ToString()); logger_SystemError.Error(ex, "Exception"); } } public static string PrintSortRule(SortRule[] sort_rule) { if (scApp == null) { scApp = SCApplication.getInstance(); } StringBuilder sb = scApp.stringBuilder.GetObject(); string sRule = string.Empty; try { if (sort_rule == null) { return sRule; } sb.AppendLine(); int sort_rule_count = sort_rule.Count(); for (int i = 0; i < sort_rule_count; i++) { sb.AppendLine(string.Format("{0}[Excuting: {1}]", new string(' ', 10), sort_rule[i].Excuting)); sb.AppendLine(string.Format("{0}[Source Port No: {1}][Target Port No: {2}]", new string(' ', 10), sort_rule[i].Source_Port_No, sort_rule[i].Target_Port_No)); sb.AppendLine(string.Format("{0}[Source Slot No: {1}][Target Slot No: {2}]", new string(' ', 10), sort_rule[i].Source_Slot_No, sort_rule[i].Target_Slot_No)); } CSTInfoLogger.Info(sb.ToString()); sRule = sb.ToString(); sb.Clear(); return sRule; } catch (Exception ex) { CSTInfoLogger.Error(ex, "SCUtility.PrintCSTInfo Occur Exception:"); logger_SystemError.Error(ex, "Exception"); return "Exception"; } finally { scApp.stringBuilder.PutObject(sb); } } public static void PrintOperationLog(OperationHis opHis) { try { if (opHis == null) { return; } StringBuilder sb = new StringBuilder(); sb.AppendLine(); sb.AppendLine(string.Format("{0}Time: {1}", new string(' ', 5), opHis.T_Stamp)); sb.AppendLine(string.Format("{0}User: {1}", new string(' ', 5), opHis.User_ID)); sb.AppendLine(string.Format("{0}UI Name: {1}", new string(' ', 5), opHis.Form_Name)); sb.AppendLine(string.Format("{0}Action: ", new string(' ', 5))); sb.AppendLine(string.Format("{0} {1}", new string(' ', 5), opHis.Action)); OperationLogger.Info(sb.ToString()); sb.Clear(); } catch (Exception ex) { OperationLogger.Warn("SCUtility.PrintOperationLog Occur Exception[{0}]", ex.ToString()); logger_SystemError.Error(ex, "Exception"); } } /// /// 根據傳入的IntAry轉出有號數的Int /// /// /// /// /// /// public static double convertInt2TextByType(int expandBitCnt, Type targetType, int[] intAry, double multiplier) { double doubleVal = 0; string bitsVal = string.Empty; bool sign = false; string tureValue = string.Empty; if (targetType.Equals(Type.GetType("System.Int16"))) { bitsVal = Convert.ToString(intAry[0], 2).PadLeft(16, '0'); sign = bitsVal[0] == '1'; tureValue = bitsVal.Substring(1); Int16 val = Convert.ToInt16(tureValue, 2); if (sign) doubleVal = -val * multiplier; else doubleVal = val * multiplier; } else if (targetType.Equals(Type.GetType("System.Int32"))) { bitsVal = Convert.ToString(intAry[0], 2).PadLeft(16, '0'); if (intAry.Length > 1) { bitsVal = string.Format("{0}{1}", Convert.ToString(intAry[1], 2).PadLeft(16, '0'), bitsVal); } sign = bitsVal[0] == '1'; tureValue = bitsVal.Substring(1); Int32 val = Convert.ToInt32(tureValue, 2); if (sign) doubleVal = -val * multiplier; else doubleVal = val * multiplier; } else if (targetType.Equals(Type.GetType("System.Int64"))) { bitsVal = Convert.ToString(intAry[0], 2).PadLeft(16, '0'); if (intAry.Length > 1) { bitsVal = string.Format("{0}{1}", Convert.ToString(intAry[1], 2).PadLeft(16, '0'), bitsVal); } if (intAry.Length > 2) { bitsVal = string.Format("{0}{1}", Convert.ToString(intAry[2], 2).PadLeft(16, '0'), bitsVal); } if (intAry.Length > 3) { bitsVal = string.Format("{0}{1}", Convert.ToString(intAry[3], 2).PadLeft(16, '0'), bitsVal); } sign = bitsVal[0] == '1'; tureValue = bitsVal.Substring(1); Int64 val = Convert.ToInt64(tureValue, 2); if (sign) doubleVal = -val * multiplier; else doubleVal = val * multiplier; } return doubleVal; } /// /// 這個是根據KF欣興的LotID規則實現的Function,用以取得CJID的第3個-後的字串,無法取得則返回unknown-日期時間 /// /// /// public static string GotLotIdFromCJID(string input) { if (string.IsNullOrEmpty(input)) return "unknown-" + DateTime.Now.ToString("yyyyMMddHHmmss"); // 計算破折號的數量和位置 int dashCount = input.Count(c => c == '-'); if (dashCount < 3) return "unknown-" + DateTime.Now.ToString("yyyyMMddHHmmss"); // 找到第三個破折號的位置 int thirdDashPosition = -1; int currentDash = 0; for (int i = 0; i < input.Length; i++) { if (input[i] == '-') { currentDash++; if (currentDash == 3) { thirdDashPosition = i; break; } } } // 返回第三個破折號後的所有內容 return input.Substring(thirdDashPosition + 1); } /// /// 來用排序在DataGridView中呈現順序使用 /// public class DisplayOrder : Attribute { public string ColumnName { get; set; } public int OrderNo { get; set; } } /// /// 控制是否允許存取資料庫的全域變數,同時也會控制 TraceDataReport Timer /// private static bool _allowDBAccess = true; public static bool AllowDBAccess { get { return _allowDBAccess; } set { if (_allowDBAccess != value) { _allowDBAccess = value; // 控制會存取資料庫相關的 Timer ControlTimer("TraceDataReport", value); ControlTimer("VersionDailyCheck", value); ControlTimer("BindingProcessTimer", value); OnDBAccessStateChanged?.Invoke(null, value); } } } /// /// 資料庫存取狀態改變事件 /// public static event EventHandler OnDBAccessStateChanged; private static void ControlTimer(string timerName, bool enable) { var scApp = SCApplication.getInstance(); if (scApp?.getBCFApplication() == null) return; var timer = scApp.getBCFApplication().getTimerAction(timerName); if (timer != null) { try { if (enable) { timer.start(); logger.Info($"已恢復 {timerName} Timer"); } else { timer.stop(); logger.Info($"已暫停 {timerName} Timer"); } } catch (Exception ex) { logger_SystemError.Error(ex, $"控制 {timerName} Timer 時發生錯誤"); } } } } public static class StringBuilderExtensions { public static void Add(this StringBuilder sb, string key, string value) { try { sb.AppendFormat(" {0} = {1}{2}" , key , value , Environment.NewLine); } catch (Exception ex) { LogManager.GetLogger("SystemErrorLogger").Error("SCUtility has Error, method:{0}、key:{1}、value:{2}、Exception Description:{3}", "StringBuilderExtensions - Add", key, value, ex.ToString()); } } } }