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; namespace PLC_S.ServerModel { /// /// 返回产品型号等信息(1楼试水 条码+型号) /// public class GoodsCode_SS : SocketServer, IShowFormLog, IWindowsServer { public Dictionary PLC_FLAGS = new Dictionary(); public const string M_NAME = "GC_SS"; 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_SS() { 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; } #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_SS 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_SS(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); 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(); 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); //2.状态(int)【0:无,1:PLC等待读取;2.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_SS plc_s, ReceiveSession e, string loggerNameT, string loggerNameE, SocketClient plc) { try { //using (SocketClient plc = new SocketClient()) { string 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\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_SS GetPLC_S_SS(string flag, ReceiveSession e, string loggerName) { try { flag = M_NAME + flag; if (PLC_FLAGS.ContainsKey(flag)) { return PLC_FLAGS[flag]; } else { PLC_S_GC_SS plc_s = new PLC_S_GC_SS(); 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_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; } } } }