using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Curtain.DataAccess; using Curtain.Extension.ExObjectConvert; using Curtain.Extension.ExSystemData; using Curtain.Framework.Json; using Curtain.Helpers; using Curtain.Log; using Curtain.Net.Sockets.PLC; using Curtain.Net.Sockets.PLC.Model; using Curtain.Net.Sockets.PLC.Model.Siemens; using PLC_S.Proxy; namespace PLC_S.ServerModel { /// /// 返回产品型号等信息(打磨 条码+型号) /// public class GoodsCode_DM : SocketServer, IShowFormLog, IWindowsServer { public Dictionary PLC_FLAGS = new Dictionary(); public const string M_NAME = "GC_DM"; private MES_S _mes_s = null; private readonly Logger logger = Logger.CreateLogger(M_NAME); private readonly LogInfo logger_t = new LogInfo(); private readonly LogInfo logger_e = new LogInfo(); private bool _S_STOP = false; public int Interval { get; set; } public string EPTS_CODE { get; set; } public GoodsCode_DM() { logger.FileExistDays = 30; logger.FilePrefix = ""; logger.FileSuffix = M_NAME; logger.LevelOneFile = true; logger.FileNameWithoutDate = true; logger_t.SubFolderFormat = ""; logger_t.FileExistDays = 30; logger_t.LevelOneFile = true; logger_e.FileExistDays = 10; this.Model.FormatType = CommandFormatType.StartStopChar; this.ServerStarting += ServerSocket_ServerStarting; this.ServerStarted += ServerSocket_ServerStarted; this.ServerStoping += ServerSocket_ServerStoping; this.ServerStoped += ServerSocket_ServerStoped; this.ServerMessage += ServerSocket_ServerMessage; this.Received += ServerSocket_Received; _mes_s = MES_S.Get(); } #region Server public IFormLogShow FormLogShow { get; set; } private void ServerSocket_ServerStarting(object sender, CancelEventArgs e) { try { _S_STOP = false; logger.OutputTrace($"{M_NAME}_ServerStarting"); } catch { } } private void ServerSocket_ServerStarted(object sender, EventArgs e) { try { _S_STOP = false; logger.OutputTrace($"{M_NAME}_ServerStarted"); } catch { } } private void ServerSocket_ServerStoping(object sender, CancelEventArgs e) { try { _S_STOP = false; logger.OutputTrace($"{M_NAME}_ServerStoping"); } catch { } } private void ServerSocket_ServerStoped(object sender, EventArgs e) { try { _S_STOP = false; logger.OutputTrace($"{M_NAME}_ServerStoped"); } catch { } } private void ServerSocket_ServerMessage(object sender, ServerMessageEventArgs e) { try { _S_STOP = false; string message = e.ToString(); string cip = e?.Client?.IP; if (e.Type == ServerMessageType.Debug) { Logger.Debug(message, $"{M_NAME}-T[{cip}]", logger_t); } if (e.Type == ServerMessageType.Error) { Logger.Error(e.Exception, message, $"{M_NAME}-E[{cip}]", logger_e); } if (e.Type == ServerMessageType.Trace) { Logger.Trace(message, $"{M_NAME}-T[{cip}]", logger_t); } if (e.Type == ServerMessageType.Warning) { Logger.Warn(message, $"{M_NAME}-E[{cip}]", logger_e); } FormLogShow?.ShowLog("ServerMessage=" + message); } catch { } } #endregion /// /// 返回产品型号 /// /// /// private void ServerSocket_Received(object sender, ReceiveSession e) { PLC_S_GC_DM plc_s = null; string cIP = e?.Client?.IP; string logKeyT = $"{M_NAME}-T[{cIP}]"; string logKeyE = $"{M_NAME}-E[{cIP}]"; _S_STOP = false; SocketClient plc = null; Logger LoggerT = null; try { LoggerT = Logger.CreateLogger(logKeyT, logger_t); lock (LoggerT) { LoggerT.BeginTracking(); string outputMessage = e.ToString(); Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); if (string.IsNullOrWhiteSpace(e.Content)) { outputMessage = "接收数据为空"; Logger.Warn(outputMessage, logKeyT, logger_t); Logger.Warn(outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); return; } outputMessage = e.Content; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); string[] c = e.Content.Split('#'); string flag = null; if (c.Length > 0) { flag = c[0]; } string barcode = null; if (c.Length > 1) { barcode = c[1]; } if (string.IsNullOrWhiteSpace(flag)) { outputMessage = $"[{e.Content}]接收设备代码为空"; Logger.Warn(outputMessage, logKeyT, logger_t); Logger.Warn(outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); return; } plc_s = GetPLC_S_GC(flag, e, logKeyE); if (plc_s == null) { outputMessage = $"[{e.Content}]设备代码[{flag}]未找到ini配置或有错误"; Logger.Error(null, outputMessage, logKeyT, logger_t); Logger.Error(null, outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); return; } outputMessage = $"[{e.Content}]PLC_Connect={JsonHelper.FromObject(plc_s)}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); plc = new SocketClient(); plc.Connect(plc_s.IP, plc_s.Port); //outputMessage = $"[{e.Content}]PLC_Connect=[{plc_s.IP}:{plc_s.Port}]"; //Logger.Trace(outputMessage, logKeyT, logger_t); //FormLogShow?.ShowLog(outputMessage); if (string.IsNullOrWhiteSpace(barcode) || barcode == "0" || barcode.Length != 11 || barcode.StartsWith("0")) { outputMessage = $"[{e.Content}]接收条码格式错误"; Logger.Warn(outputMessage, logKeyT, logger_t); Logger.Warn(outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); SendError(plc_s, e, logKeyT, logKeyE, plc, false); return; } DataRow codeRow = GetGoodsCode(barcode, e, logKeyE); if (codeRow == null) { outputMessage = $"[{e.Content}]此条码[{barcode}]不存在"; Logger.Warn(outputMessage, logKeyT, logger_t); Logger.Warn(outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); SendError(plc_s, e, logKeyT, logKeyE, plc); return; } string code = codeRow["goodscode"].ToString(); string intcode = codeRow["seatcovercode"].ToString(); string groutinglinecode = codeRow["groutinglinecode"].ToString(); outputMessage = $"[{e.Content}]产品型号={code}[{intcode}]"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); if (string.IsNullOrWhiteSpace(intcode)) { outputMessage = $"[{e.Content}]此条码[{barcode}]未设置型号代码"; Logger.Error(null, outputMessage, logKeyT, logger_t); Logger.Error(null, outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); SendError(plc_s, e, logKeyT, logKeyE, plc); return; } // 写入PLC 条码 outputMessage = $"[{e.Content}]SET_BarCode=[{barcode}]{plc_s.Add_BarCode + plc_s.Add_BarCodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); PLCResult p_r = plc.Write(plc_s.Add_BarCode, plc_s.Add_BarCodeNum, barcode); outputMessage = $"[{e.Content}]END_BarCode=[{p_r}]{plc_s.Add_BarCode + plc_s.Add_BarCodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); // 写入PLC 型号 outputMessage = $"[{e.Content}]SET_GoodsCode=[{intcode}]{plc_s.Add_Code + plc_s.Add_CodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); p_r = plc.Write(plc_s.Add_Code, plc_s.Add_CodeNum, (short)(intcode.ToInt32())); outputMessage = $"[{e.Content}]END_GoodsCode=[{p_r}]{plc_s.Add_Code + plc_s.Add_CodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); // 写入成型线号 6331-6332 20250313 qq outputMessage = $"[{e.Content}]SET_GROUTINGLINE=[{groutinglinecode}]{plc_s.Add_GroutingLineCode + plc_s.Add_GroutingLineCodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); //p_r = plc.Write(plc_s.Add_GroutingLineCode, "300.26", (short)(groutinglinecode.Length)); p_r = plc.Write(plc_s.Add_GroutingLineCode, plc_s.Add_GroutingLineCodeNum, groutinglinecode); outputMessage = $"[{e.Content}]END_GROUTINGLINE=[{p_r}]{plc_s.Add_GroutingLineCode + plc_s.Add_GroutingLineCodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); if (flag == "6331" || flag == "31") { // 智能线 直接计件 string roomcode = "0#"; // 打磨工号 string usercode = ""; using (IDataAccess dataAccess = PLC_S_DataAccess.GetDataAccess()) { string sqlString1 = @" SELECT t.flowprocedureid FROM tp_pm_inproduction t WHERE t.barcode = @barcode@ "; CDAParameter[] ps1 = new CDAParameter[] { new CDAParameter("barcode", barcode), }; string p_id = dataAccess.ExecuteScalar(sqlString1, ps1) + ""; if (p_id != "93") { string sqlString = @" SELECT t.usercode FROM tp_mst_workstation t WHERE t.workstationtypeid = 3310 AND t.workstationid = @workstationid@ "; CDAParameter[] ps = new CDAParameter[] { new CDAParameter("workstationid", 31), }; DataTable dataTable = dataAccess.ExecuteDatatable(sqlString, ps); if (dataTable.HasData()) { usercode = dataTable.Rows[0]["usercode"].ToString(); } outputMessage = $"[{e.Content}]DB_UserCode=[{usercode}]"; //logger_t.OutputTrace(outputMessage); Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); string sql = @" update tp_pm_groutingdailydetail set POLISHROOM = :POLISHROOM WHERE barcode = :barcode"; CDAParameter[] pss = new CDAParameter[] { new CDAParameter("POLISHROOM", roomcode), new CDAParameter("barcode", barcode), }; dataAccess.ExecuteNonQuery(sql, pss); outputMessage = $"[{e.Content}]DB_ROOM=[{roomcode}]"; //logger_t.OutputTrace(outputMessage); Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); string result = SmartDeviceProxy.Instance.Invoke( p => p.AddWorkPieceByStatus3("dongke", usercode, null, 93, barcode, roomcode)); outputMessage = $"[{e.Content}]MES_Result=[{result}]"; //logger_t.OutputTrace(outputMessage); Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); // 返回状态(成功、失败) if (result != "OK") { if (result == "EE") { outputMessage = $"[{e.Content}]result=[{result}]MES服务端异常(详情参见MES端日志)"; } else if (result == "EU-01") { outputMessage = $"[{e.Content}]result=[{result}]无效的帐套或工号(详情参见MES端日志)"; } else { outputMessage = $"[{e.Content}]result=[{result}]其他错误(详情参见MES端日志)"; } //logger_e_out.OutputError(null, outputMessage); //logger_t.OutputError(null, outputMessage); //logger_e.OutputError(null, outputMessage); Logger.Error(null, outputMessage, logKeyT, logger_t); Logger.Error(null, outputMessage, logKeyE, logger_e); FormLogShow?.ShowLog(outputMessage); //2.状态(int)【1:MES写入完成,2:PLC读取完成,0:PLC复位】 outputMessage = $"[{e.Content}]SET_F_Code=[0]{plc_s.Add_F_Code + plc_s.Add_F_CodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); p_r = plc?.Write(plc_s.Add_F_Code, plc_s.Add_F_CodeNum, (short)0); outputMessage = $"[{e.Content}]END_F_Code=[{p_r}]{plc_s.Add_F_Code + plc_s.Add_F_CodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); //3.通信异常标识(int)【0:正常,1:后台处理异常,报警】 outputMessage = $"[{e.Content}]SET_ErrorNum=[1]{plc_s.Add_Error + plc_s.Add_ErrorNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); p_r = plc?.Write(plc_s.Add_Error, plc_s.Add_ErrorNum, (short)1); outputMessage = $"[{e.Content}]END_ErrorNum=[{p_r}]{plc_s.Add_Error + plc_s.Add_ErrorNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); return; } } } } //2.状态(int)【1:MES写入完成,2:PLC读取完成,0:PLC复位】 outputMessage = $"[{e.Content}]SET_F_Code=[1]{plc_s.Add_F_Code + plc_s.Add_F_CodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); p_r = plc?.Write(plc_s.Add_F_Code, plc_s.Add_F_CodeNum, (short)1); outputMessage = $"[{e.Content}]END_F_Code=[{p_r}]{plc_s.Add_F_Code + plc_s.Add_F_CodeNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); //3.通信异常标识(int)【0:正常,1:后台处理异常,报警】 outputMessage = $"[{e.Content}]SET_ErrorNum=[0]{plc_s.Add_Error + plc_s.Add_ErrorNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); p_r = plc?.Write(plc_s.Add_Error, plc_s.Add_ErrorNum, (short)0); outputMessage = $"[{e.Content}]END_ErrorNum=[{p_r}]{plc_s.Add_Error + plc_s.Add_ErrorNum}"; Logger.Trace(outputMessage, logKeyT, logger_t); FormLogShow?.ShowLog(outputMessage); } } catch (Exception ex) { FormLogShow?.ShowLog($"[{e.Content}]ERROR={ex.Message}"); if (plc_s != null) { Logger.Error(ex, $"[{e.Content}]ERROR", logKeyT, logger_t); Logger.Error(ex, $"[{e.Content}]ERROR", logKeyE, logger_e); SendError(plc_s, e, logKeyT, logKeyE, plc); } else { Logger.Error(ex, $"[{e.Content}]ERROR-NOFLAG", logKeyT, logger_t); Logger.Error(ex, $"[{e.Content}]ERROR-NOFLAG", logKeyE, logger_e); } } finally { LoggerT?.EndTracking(); plc?.Disconnect(); plc?.Close(); //e.ReturnMessage("0000"); } } private void SendError(PLC_S_GC_DM plc_s, ReceiveSession e, string loggerNameT, string loggerNameE, SocketClient plc, bool isClear = true) { try { //using (SocketClient plc = new SocketClient()) { string outputMessage; if (isClear) { //// 写入PLC 条码 //outputMessage = $"[{e.Content}]SET_BarCode=[0]{plc_s.Add_BarCode + plc_s.Add_BarCodeNum}"; //Logger.Trace(outputMessage, loggerNameT, logger_t); //FormLogShow?.ShowLog(outputMessage); //plc.Write(plc_s.Add_BarCode, plc_s.Add_BarCodeNum, "00000000000"); //outputMessage = $"[{e.Content}]END_BarCode=[0]{plc_s.Add_BarCode + plc_s.Add_BarCodeNum}"; //Logger.Trace(outputMessage, loggerNameT, logger_t); //FormLogShow?.ShowLog(outputMessage); // 写入PLC 型号 outputMessage = $"[{e.Content}]SET_GoodsCode=[0]{plc_s.Add_Code + plc_s.Add_CodeNum}"; Logger.Trace(outputMessage, loggerNameT, logger_t); FormLogShow?.ShowLog(outputMessage); PLCResult p_r1 = plc.Write(plc_s.Add_Code, plc_s.Add_CodeNum, (short)0); outputMessage = $"[{e.Content}]END_GoodsCode=[{p_r1}]{plc_s.Add_Code + plc_s.Add_CodeNum}"; Logger.Trace(outputMessage, loggerNameT, logger_t); FormLogShow?.ShowLog(outputMessage); ////2.状态(int)【1:MES写入完成,2:PLC读取完成,0:PLC复位】 //outputMessage = $"[{e.Content}]SET_F_Code=[0]{plc_s.Add_F_Code + plc_s.Add_F_CodeNum}"; //Logger.Trace(outputMessage, loggerNameT, logger_t); //FormLogShow?.ShowLog(outputMessage); //plc?.Write(plc_s.Add_F_Code, plc_s.Add_F_CodeNum, (short)0); //outputMessage = $"[{e.Content}]END_F_Code=[0]{plc_s.Add_F_Code + plc_s.Add_F_CodeNum}"; //Logger.Trace(outputMessage, loggerNameT, logger_t); //FormLogShow?.ShowLog(outputMessage); } outputMessage = $"[{e.Content}]SET_ErrorNum=[1]{plc_s.Add_Error + plc_s.Add_ErrorNum}"; Logger.Trace(outputMessage, loggerNameT, logger_t); FormLogShow?.ShowLog(outputMessage); PLCResult p_r = plc?.Write(plc_s.Add_Error, plc_s.Add_ErrorNum, (short)1); outputMessage = $"[{e.Content}]END_ErrorNum=[{p_r}]{plc_s.Add_Error + plc_s.Add_ErrorNum}"; Logger.Trace(outputMessage, loggerNameT, logger_t); FormLogShow?.ShowLog(outputMessage); } } catch (Exception ex) { Logger.Error(ex, $"[{e.Content}]ERROR-SendError", loggerNameT, logger_t); Logger.Error(ex, $"[{e.Content}]ERROR-SendError", loggerNameE, logger_e); FormLogShow?.ShowLog($"[{e.Content}]ERROR-SendError={ex.Message}"); } } private DataRow GetGoodsCode(string barcode, ReceiveSession e, string loggerName) { IDataAccess dataAccess = null; try { dataAccess = PLC_S_DataAccess.GetDataAccess(e); string sqlString = "select g.goodscode, g.seatcovercode , gdd.groutinglinecode\n" + " from tp_pm_groutingdailydetail gdd\n" + " inner join tp_mst_goods g\n" + " on g.goodsid = gdd.goodsid\n" + " where gdd.barcode = :barcode"; DataTable dataTable = dataAccess.ExecuteDatatable(sqlString, new CDAParameter(":barcode", barcode)); if (dataTable.HasData()) { return dataTable.Rows[0]; } return null; } catch (Exception ex) { Logger.Error(ex, $"[{e.Content}]ERROR-GetGoodsCode", loggerName, logger_e); FormLogShow?.ShowLog($"[{e.Content}]ERROR-GetGoodsCode={ex.Message}"); return null; } finally { dataAccess?.Close(); } } private PLC_S_GC_DM GetPLC_S_GC(string flag, ReceiveSession e, string loggerName) { try { flag = M_NAME + flag; if (PLC_FLAGS.ContainsKey(flag)) { return PLC_FLAGS[flag]; } else { PLC_S_GC_DM plc_s = new PLC_S_GC_DM(); INIHelper ini = INIHelper.Create($@"PLC_S_INI\PLC_S_{M_NAME}.ini"); plc_s.IP = ini.Read(flag, "IP"); plc_s.Port = ini.Read(flag, "Port").ToInt32(); plc_s.Add_BarCode = ini.Read(flag, "Add_BarCode"); plc_s.Add_BarCodeNum = ini.Read(flag, "Add_BarCodeNum"); plc_s.Add_Code = ini.Read(flag, "Add_Code"); plc_s.Add_CodeNum = ini.Read(flag, "Add_CodeNum"); plc_s.Add_GroutingLineCode = ini.Read(flag, "Add_GroutingLineCode"); plc_s.Add_GroutingLineCodeNum = ini.Read(flag, "Add_GroutingLineCodeNum"); plc_s.Add_F_Code = ini.Read(flag, "Add_F_Code"); plc_s.Add_F_CodeNum = ini.Read(flag, "Add_F_CodeNum"); plc_s.Add_Error = ini.Read(flag, "Add_Error"); plc_s.Add_ErrorNum = ini.Read(flag, "Add_ErrorNum"); PLC_FLAGS.Add(flag, plc_s); return plc_s; } } catch (Exception ex) { Logger.Error(ex, $"[{e.Content}]ERROR-GetPLC_S_GC", loggerName, logger_e); FormLogShow?.ShowLog($"[{e.Content}]ERROR-GetPLC_S_GC={ex.Message}"); return null; } } } }