using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Text; using System.Xml; using Mesnac.Action.Base; using Mesnac.Action.Feeding.BasicInfo; using Mesnac.Codd.Session; namespace Mesnac.Action.Feeding.FeedingPlc { public class SaveMixingData { #region 基本函数 /// /// 获取本地连接 /// /// private DbHelper getLocalHelper() { return new DatabaseAction().NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.local); } /// /// 获取网络连接 /// /// private DbHelper getServerHelper() { return new DatabaseAction().NewDbHelper(Mesnac.Basic.DataSourceFactory.MCDbType.Server); } private bool IsNet() { bool Result = false; Result = new BaseAction().NetType == BaseAction.NetTypes.Net; return Result; } #endregion #region 数据信息 private RecipeData.RecipeInfo recipeInfo = new RecipeData.RecipeInfo(); private RecipeData.PptPlanInfo planInfo = new RecipeData.PptPlanInfo(); private List allWeightInfo = new List(); private List allMixingInfo = new List(); private void IniRecipeData() { RecipeData recipeData = new RecipeData(); this.recipeInfo = recipeData.GetCurrentRecipeInfo(); this.planInfo = recipeData.GetCurrentPptPlanInfo(); this.allWeightInfo = recipeData.GetCurrentRecipeWeightInfo(); this.allMixingInfo = recipeData.GetCurrentRecipeMixingInfo(); } #endregion #region Plc信息 /// /// 重置存盘信息 /// private void FinishedOneReset() { //清空密炼曲线信号 CurveInfo.Instance.MixingCurve = new StringBuilder(); CurveInfo.Instance.MixTimeStr = new StringBuilder(); CurveInfo.Instance.MixTempStr = new StringBuilder(); CurveInfo.Instance.MixPowerStr = new StringBuilder(); CurveInfo.Instance.MixEnerStr = new StringBuilder(); CurveInfo.Instance.MixPressStr = new StringBuilder(); CurveInfo.Instance.MixSpeedStr = new StringBuilder(); //重置存盘信号 PlcData.Instance.PlcWriteByDataKey(PlcData.Instance.FinishedOneReset, new object[] { 1 }); } private PlanExecuteData planExecuteData = new PlanExecuteData(); private class PlanExecuteData { /// /// 计划编号 /// public string PlanID { get; set; } /// /// 当前计划车数 /// public int RecipeSetNumber { get; set; } /// /// 计划完成数量 /// public int MixingFinishedCount { get; set; } /// /// 密炼开始时间 /// public DateTime MixingStartTime { get; set; } } private void IniPlanExecuteData() { planExecuteData.PlanID = planInfo.PlanID; // 计划完成数量 planExecuteData.RecipeSetNumber = PlcData.Instance.RecipeSetNumber.LastValue.ToInt(); // 计划完成数量 planExecuteData.MixingFinishedCount = PlcData.Instance.MixingFinishedCount.LastValue.ToInt(); // 密炼开始时间 planExecuteData.MixingStartTime = PlcData.Instance.MixingStartTime.LastValue.ToDateTime(); } #region 配方PLC数据读取 private void ReadPlcSaveData() { Equips.Factory.Instance.ReadAll(); IniRecipeData(); IniPlanExecuteData(); } #endregion #endregion #region 条码信息 private ShelfBarcode shelfBarcode; private class ShelfBarcode { private DbHelper dbHelper = null; private string planID = string.Empty; private int shelfLotCount = 0; public ShelfBarcode(DbHelper _dbHelper, string _planID, int _shelfLotCount) { this.dbHelper = _dbHelper; this.planID = _planID; this.shelfLotCount = _shelfLotCount; IniShelfBarcode(); } private void InsertPptShiftConfigBarCode() { string sqstr = @"INSERT INTO dbo.PptShiftConfig( Barcode,BarcodeStart,BarcodeEnd,TotalWeight, ShelfNum,RealWeight,OperCode,MemNote,StockFlag,CheckFlag,UpdateFlag,UPERP) VALUES ( @Barcode,@BarcodeStart,@BarcodeEnd,@TotalWeight, @ShelfNum,@RealWeight,@OperCode,@MemNote,@StockFlag,@CheckFlag,@UpdateFlag, @UPERP)"; dbHelper.CommandText = sqstr; dbHelper.CommandType = CommandType.Text; dbHelper.ClearParameter(); dbHelper.AddParameter("@Barcode", this._shelfbarcode); dbHelper.AddParameter("@BarcodeStart", this._totalCount); dbHelper.AddParameter("@BarcodeEnd", this._totalCount); dbHelper.AddParameter("@TotalWeight", 0); dbHelper.AddParameter("@ShelfNum", 0); dbHelper.AddParameter("@RealWeight", 0); dbHelper.AddParameter("@OperCode", string.Empty); dbHelper.AddParameter("@MemNote", string.Empty); dbHelper.AddParameter("@StockFlag", 0); dbHelper.AddParameter("@CheckFlag", "N"); dbHelper.AddParameter("@UpdateFlag", 0); dbHelper.AddParameter("@UPERP", 0); dbHelper.ExecuteNonQuery(); } private void IniShelfBarcode() { string sqlstr = "SELECT TOP 1 Barcode,ShelfNum FROM dbo.PptShiftConfig WHERE PlanID=@PlanID ORDER BY Barcode DESC"; dbHelper.CommandType = CommandType.Text; dbHelper.CommandText = sqlstr; dbHelper.ClearParameter(); dbHelper.AddParameter("@PlanID", planID); DataTable dt = dbHelper.ToDataTable(); if (dt == null || dt.Rows.Count == 0) { this._totalCount = 1; return; } this._totalCount = dt.Rows.Count + 1; #region 当前架子号是否可用 DataRow row = dt.Rows[0]; string barcode = row["Barcode"].ToString(); if (barcode.Length < 18) { return; } int hasDoneShelfNum = Convert.ToInt16(row["ShelfNum"].ToString()); if (this.shelfLotCount > hasDoneShelfNum) { this._shelfbarcode = barcode; } #endregion } private int _totalCount; public int TotalCount { get { return _totalCount; } } private string _shelfbarcode = string.Empty; public string Barcode { get { if (!string.IsNullOrWhiteSpace(_shelfbarcode)) { return this._shelfbarcode; } string planid = this.planID + "000000000000"; planid = planid.Substring(0, 12); string factid = new BaseAction().GetConfigValue("FactoryID", "1") + "1"; factid = factid.Substring(0, 1); string plancode = planid + factid; string barcode = plancode + this.TotalCount.ToString("D4").Substring(0, 4) + this.shelfLotCount.ToString("D1").Substring(0, 1); this._shelfbarcode = barcode; InsertPptShiftConfigBarCode(); return this._shelfbarcode; } } public override string ToString() { return this.Barcode; } } private class BarcodeInfo { #region 单例实现 private static BarcodeInfo instance; public static BarcodeInfo Instance { get { if (instance == null) { instance = new BarcodeInfo(); } return instance; } } private BarcodeInfo() { } #endregion /// /// 车条码 /// public string LotBarcode { get; set; } } private void IniCurrentLotBarcode() { string barcode = planExecuteData.PlanID; barcode += planExecuteData.MixingFinishedCount.ToString("D4"); BarcodeInfo.Instance.LotBarcode = barcode; } private bool HasSaveBarCode() { string barcode = BarcodeInfo.Instance.LotBarcode; string sqlstr = "SELECT 1 FROM dbo.PptLotData WHERE Barcode=@Barcode"; DbHelper dbHelper = getLocalHelper(); dbHelper.CommandType = CommandType.Text; dbHelper.CommandText = sqlstr; dbHelper.ClearParameter(); dbHelper.AddParameter("@Barcode", barcode); DataTable dt = dbHelper.ToDataTable(); return dt.Rows.Count > 0; } private bool UpdateCurrentShelfBarcode(DbHelper dbHelper) { string sqlstr = @" UPDATE PptShiftConfig SET ShelfNum=ShelfNum+1,BarcodeEnd=@BarcodeEnd,ProdDate=GETDATE(), RealWeight=RealWeight+@RealWeight,MemNote=MemNote+@MemNote, PlanDate=@PlanDate,EquipCode=@EquipCode,ShiftID=@ShiftID,ClassID=@ClassID, MaterialCode=@MaterialCode,MaterialName=@MaterialName,PlanID=@PlanID WHERE Barcode=@Barcode"; dbHelper.CommandText = sqlstr; dbHelper.CommandType = CommandType.Text; dbHelper.ClearParameter(); dbHelper.AddParameter("@BarcodeEnd", shelfBarcode.TotalCount); dbHelper.AddParameter("@RealWeight", totalRealWeight); dbHelper.AddParameter("@MemNote", "," + shelfBarcode.TotalCount.ToString()); dbHelper.AddParameter("@PlanDate", planInfo.PlanDate); dbHelper.AddParameter("@EquipCode", planInfo.RecipeEquipCode); dbHelper.AddParameter("@ShiftID", planInfo.ShiftID); dbHelper.AddParameter("@ClassID", planInfo.ClassID); dbHelper.AddParameter("@MaterialCode", planInfo.RecipeMaterialCode); dbHelper.AddParameter("@MaterialName", planInfo.RecipeMaterialName); dbHelper.AddParameter("@PlanID", planInfo.PlanID); dbHelper.AddParameter("@Barcode", shelfBarcode.Barcode); dbHelper.ExecuteNonQuery(); return true; } #endregion #region 读取配置文件 private string getPlcSchemaPath() { string path = System.Windows.Forms.Application.StartupPath; return Path.Combine(path, "Data\\MCProject\\PlcSchema.xml"); } private string ToValue(XmlNode node, string key, string defaultValue) { foreach (XmlAttribute a in node.Attributes) { if (a.Name.Equals(key, StringComparison.CurrentCultureIgnoreCase)) { return a.Value; } } return defaultValue; } private int ToValue(XmlNode node, string key, int defaultValue) { int Result = 0; string value = ToValue(node, key, string.Empty); if (!string.IsNullOrWhiteSpace(value) && int.TryParse(value, out Result)) { return Result; } return defaultValue; } private class PlcRecipeReaderItem { public PlcRecipeReaderItem() { this.DataFieldName = string.Empty; this.PlcFiledName = string.Empty; this.DataType = string.Empty; this.PlcShifting = 0; this.DefaultValue = 0; this.ValueLen = 1; this.Multiply = 1; this.SetValue = null; } /// /// 数据库字段名 /// public string DataFieldName { get; set; } /// /// Plc别名 /// public string PlcFiledName { get; set; } /// /// 偏移值 /// public int PlcShifting { get; set; } /// /// 默认值 /// public int DefaultValue { get; set; } /// /// 长度 /// public int ValueLen { get; set; } /// /// 数据处理方式 /// public string DataType { get; set; } /// /// 乘数 /// public int Multiply { get; set; } /// /// 原始值 /// public int[] SetValue { get; set; } /// /// 数据转化值 /// /// public object GetValue() { if (string.IsNullOrWhiteSpace(DataType)) { return GetValue_Null(); } return GetValue_Null(); } private double MultiplyData(double buff) { double result = buff; if (this.Multiply != 0) { result = result / (double)this.Multiply; } return result; } private double GetValue_Null() { if (this.SetValue.Length == 0) { return DefaultValue; } return MultiplyData(this.SetValue[0]); } } private class PlcRecipeReader { public PlcRecipeReader() { this.PlcFiledName = string.Empty; this.ThisCount = 1; this.ThisType = 0; this.ItemList = new List(); } /// /// Plc别名 /// public string PlcFiledName { get; set; } /// /// 数量 /// public int ThisCount { get; set; } /// /// 类型 /// public int ThisType { get; set; } /// /// 数据项 /// public List ItemList { get; set; } } private List getPlcRecipeReader(string tableName) { List result = new List(); XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(getPlcSchemaPath()); foreach (XmlNode configNode in xmlDocument) { if (!configNode.Name.Equals("configuration", StringComparison.CurrentCultureIgnoreCase)) { continue; } foreach (XmlNode writeNode in configNode.ChildNodes) { if (!writeNode.Name.Equals("PlcSaveRead", StringComparison.CurrentCultureIgnoreCase)) { continue; } foreach (XmlNode serviceNode in writeNode.ChildNodes) { if (!serviceNode.Name.Equals(tableName, StringComparison.CurrentCultureIgnoreCase)) { continue; } PlcRecipeReader writer = new PlcRecipeReader(); writer.PlcFiledName = ToValue(serviceNode, "equip", string.Empty); writer.ThisCount = ToValue(serviceNode, "count", 1); writer.ThisType = ToValue(serviceNode, "type", 0); foreach (XmlNode node in serviceNode.ChildNodes) { PlcRecipeReaderItem plc = new PlcRecipeReaderItem(); plc.DataFieldName = ToValue(node, "field", string.Empty); plc.PlcFiledName = ToValue(node, "equip", string.Empty); plc.PlcShifting = ToValue(node, "shifting", 0); plc.DefaultValue = ToValue(node, "default", 0); plc.ValueLen = ToValue(node, "len", 1); plc.DataType = ToValue(node, "datatype", string.Empty); plc.Multiply = ToValue(node, "multiply", 1); writer.ItemList.Add(plc); } result.Add(writer); } } } return result; } #endregion #region 数据库信息 #region 更新条数 private bool SetLocalPlanFinishedLotCount(DbHelper dbHelper) { //完成当前计划车数 int finishLotCount = planExecuteData.MixingFinishedCount; string sqlstr = string.Empty; sqlstr = "UPDATE dbo.PptGroupLot SET FinishNum=@FinishNum ,EndDatetime=GETDATE() WHERE FinishTag=0"; dbHelper.CommandType = CommandType.Text; dbHelper.CommandText = sqlstr; dbHelper.ClearParameter(); dbHelper.AddParameter("@FinishNum", finishLotCount); dbHelper.ExecuteNonQuery(); sqlstr = "UPDATE dbo.PptPlan SET RealNum=RealNum+1,RealEndtime=GETDATE() WHERE PlanID=@PlanID"; dbHelper.CommandText = sqlstr; dbHelper.ClearParameter(); dbHelper.AddParameter("@PlanID", planExecuteData.PlanID); dbHelper.ExecuteNonQuery(); return true; } private bool SetServerPlanFinishedLotCount(DbHelper dbHelper) { int finishLotCount = planExecuteData.MixingFinishedCount; string sqlstr = string.Empty; sqlstr = "UPDATE dbo.PptPlan SET RealNum=@realNum,RealEndtime=GETDATE() WHERE PlanID=@PlanId"; dbHelper.CommandType = CommandType.Text; dbHelper.CommandText = sqlstr; dbHelper.ClearParameter(); dbHelper.AddParameter("@realNum", finishLotCount); dbHelper.AddParameter("@PlanId", planExecuteData.PlanID); dbHelper.ExecuteNonQuery(); return true; } #endregion #region SavePptLotData private bool SavePptLotData(DbHelper dbHelper) { #region 基本信息 dbHelper.CommandType = CommandType.Text; StringBuilder sqlstr_field = new StringBuilder(); StringBuilder sqlstr_value = new StringBuilder(); string fieldName = string.Empty; string valueName = string.Empty; sqlstr_field.AppendLine("INSERT INTO dbo.PptLotData("); sqlstr_value.AppendLine(" ) VALUES ("); #region 数据整理 #region Barcode fieldName = "Barcode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, BarcodeInfo.Instance.LotBarcode); #endregion #region PlanDate fieldName = "PlanDate"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planInfo.PlanDate); #endregion #region MaterCode fieldName = "MaterCode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, this.recipeInfo.RecipeMaterialCode); #endregion #region MaterName fieldName = "MaterName"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, this.recipeInfo.RecipeMaterialName); #endregion #region EquipCode fieldName = "EquipCode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planInfo.RecipeEquipCode); #endregion #region SerialID fieldName = "SerialID"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planExecuteData.MixingFinishedCount); #endregion #region ShiftID fieldName = "ShiftID"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planInfo.ShiftID); #endregion #region ClassID fieldName = "ClassID"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planInfo.ClassID); #endregion #region EdtCode fieldName = "EdtCode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, this.recipeInfo.RecipeVersionID); #endregion #region PlanID fieldName = "PlanID"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planInfo.PlanID); #endregion #region StartDatetime fieldName = "StartDatetime"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planExecuteData.MixingStartTime); #endregion #region ShelfBarcode fieldName = "ShelfBarcode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, shelfBarcode.Barcode); #endregion #endregion #endregion #region 配置信息 PlcRecipeReader reader = getPlcRecipeReader("PptLot").FirstOrDefault(); foreach (PlcRecipeReaderItem item in reader.ItemList) { fieldName = item.DataFieldName; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, PlcData.Instance.PlcLastValueRead(item.PlcFiledName)); } #endregion #region 执行存储 #region SDSTime fieldName = "SDSTime"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName); sqlstr_value.Append(valueName).AppendLine(");"); dbHelper.AddParameter(valueName, "0"); #endregion dbHelper.CommandText = sqlstr_field.ToString() + sqlstr_value.ToString(); dbHelper.ExecuteNonQuery(); #endregion return true; } #endregion #region SavePptWeighData private double totalRealWeight = 0; private bool SavePptWeighData(DbHelper dbHelper) { BaseAction action = new BaseAction(); #region 基本信息 List readerLst = getPlcRecipeReader("PptWeighData"); #endregion foreach (PlcRecipeReader reader in readerLst) { int[] buff; if (!PlcData.Instance.PlcLastValueRead(reader.PlcFiledName, out buff)) { continue; } #region 称量配方 List recipeweight = new List(); for (int i = 0; i < allWeightInfo.Count; i++) { if (allWeightInfo[i].WeightType == reader.ThisType) { recipeweight.Add(allWeightInfo[i]); } } if (recipeweight.Count == 0) { continue; } #endregion int shifting = 0; for (int i = 0; i < recipeweight.Count; i++) { RecipeData.RecipeWeightInfo weight = recipeweight[i]; #region 基本信息 dbHelper.CommandType = CommandType.Text; StringBuilder sqlstr_field = new StringBuilder(); StringBuilder sqlstr_value = new StringBuilder(); string fieldName = string.Empty; string valueName = string.Empty; sqlstr_field.AppendLine("INSERT INTO PptWeighData("); sqlstr_value.AppendLine(" ) VALUES ("); #region 数据整理 #region WeightID fieldName = "WeightID"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, weight.WeightID); #endregion #region MaterCode fieldName = "MaterCode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, weight.MaterialCode); #endregion #region MaterName fieldName = "MaterName"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, weight.MaterialName); #endregion #region EquipCode fieldName = "EquipCode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, action.CurrEquipCode); #endregion #region SetWeight fieldName = "SetWeight"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, weight.SetWeight); #endregion #region ErrorAllow fieldName = "ErrorAllow"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, weight.ErrorAllow); #endregion #region WeighTime fieldName = "WeighTime"; valueName = "getdate()"; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); #endregion #region WeighType fieldName = "WeighType"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, weight.WeightType); #endregion #region PlanID fieldName = "PlanID"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planInfo.PlanID); #endregion #region PlanDate fieldName = "PlanDate"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, planInfo.PlanDate); #endregion #endregion #endregion #region 配置信息 foreach (PlcRecipeReaderItem item in reader.ItemList) { fieldName = item.DataFieldName; if (!fieldName.Equals("RealWeight", StringComparison.CurrentCultureIgnoreCase)) { continue; } int[] data = new int[item.ValueLen]; for (int idx = 0; idx < data.Length; idx++) { data[idx] = buff[idx + shifting]; } shifting += item.ValueLen; item.SetValue = data; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); if (fieldName.Equals("RealWeight", StringComparison.CurrentCultureIgnoreCase)) { totalRealWeight += (double)item.GetValue(); } dbHelper.AddParameter(valueName, item.GetValue()); } #endregion #region 执行存储 #region Barcode fieldName = "Barcode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(""); sqlstr_value.Append(valueName).AppendLine(")"); dbHelper.AddParameter(valueName, BarcodeInfo.Instance.LotBarcode); #endregion dbHelper.CommandText = sqlstr_field.ToString() + sqlstr_value.ToString(); dbHelper.ExecuteNonQuery(); #endregion } } dbHelper.CommandText = "UPDATE PptWeighData SET ErrorOut=SetWeight-RealWeight WHERE Barcode='" + BarcodeInfo.Instance.LotBarcode + "'"; dbHelper.ExecuteNonQuery(); return true; } #endregion #region SavePptMixingData private bool SavePptMixingData(DbHelper dbHelper) { #region 基本信息 PlcRecipeReader reader = getPlcRecipeReader("PptMixData").FirstOrDefault(); #endregion int[] buff; if (!PlcData.Instance.PlcLastValueRead(reader.PlcFiledName, out buff)) { return true; } int shifting = 0; for (int i = 0; i < allMixingInfo.Count; i++) { RecipeData.RecipeMixingInfo mixing = allMixingInfo[i]; #region 基本信息 dbHelper.CommandType = CommandType.Text; StringBuilder sqlstr_field = new StringBuilder(); StringBuilder sqlstr_value = new StringBuilder(); string fieldName = string.Empty; string valueName = string.Empty; sqlstr_field.AppendLine("INSERT INTO dbo.PptMixingData("); sqlstr_value.AppendLine(" ) VALUES ("); #region 数据整理 #region SaveTime fieldName = "SaveTime"; valueName = "getdate()"; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); #endregion #region TermCode fieldName = "MixID"; valueName = "@MixID"; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, mixing.MixingStep); #endregion //#region TermCode //fieldName = "TermCode"; //valueName = "@TermCode"; //sqlstr_field.Append(fieldName).AppendLine(","); //sqlstr_value.Append(valueName).AppendLine(","); //dbHelper.AddParameter(valueName, mixing.TermCode); //#endregion //#region ActCode //fieldName = "ActCode"; //valueName = "@ActCode"; //sqlstr_field.Append(fieldName).AppendLine(","); //sqlstr_value.Append(valueName).AppendLine(","); //dbHelper.AddParameter(valueName, mixing.ActionCode); //#endregion #endregion #endregion #region 配置信息 foreach (PlcRecipeReaderItem item in reader.ItemList) { int[] data = new int[item.ValueLen]; for (int idx = 0; idx < data.Length; idx++) { data[idx] = buff[idx + shifting]; } shifting += item.ValueLen; item.SetValue = data; fieldName = item.DataFieldName; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(","); sqlstr_value.Append(valueName).AppendLine(","); dbHelper.AddParameter(valueName, item.GetValue()); } #endregion #region 执行存储 #region Barcode fieldName = "Barcode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(""); sqlstr_value.Append(valueName).AppendLine(")"); dbHelper.AddParameter(valueName, BarcodeInfo.Instance.LotBarcode); #endregion dbHelper.CommandText = sqlstr_field.ToString() + sqlstr_value.ToString(); dbHelper.ExecuteNonQuery(); #endregion } return true; } #endregion #region SavePptShiftConfig private bool SavePptShiftConfig(DbHelper dbHelper) { return true; BaseAction action = new BaseAction(); #region 基本信息 dbHelper.CommandType = CommandType.Text; StringBuilder sqlstr_field = new StringBuilder(); StringBuilder sqlstr_value = new StringBuilder(); string fieldName = string.Empty; string valueName = string.Empty; sqlstr_field.AppendLine("INSERT INTO dbo.PptWeigh("); sqlstr_value.AppendLine(" ) VALUES ("); #region 数据整理 #endregion #endregion #region 执行存储 #region Barcode fieldName = "Barcode"; valueName = "@" + fieldName; sqlstr_field.Append(fieldName).AppendLine(""); sqlstr_value.Append(valueName).AppendLine(")"); dbHelper.AddParameter(valueName, ""); #endregion dbHelper.CommandText = sqlstr_field.ToString() + sqlstr_value.ToString(); action.LogInfo(dbHelper.CommandText); dbHelper.ExecuteNonQuery(); #endregion return true; } #endregion #region SaveMixingCurve private bool SaveMixingCurve(DbHelper dbHelper) { bool Result = false; return true; string sqlstr = "Insert into (BarCode) values ()"; dbHelper.CommandType = CommandType.Text; dbHelper.CommandText = sqlstr; dbHelper.ClearParameter(); dbHelper.AddParameter("", ""); dbHelper.ExecuteNonQuery(); return Result; } #endregion #region 保存信息 private bool SaveInfo() { bool save = false; DbHelper localHelper = getLocalHelper(); DbHelper serverHelper = getServerHelper(); try { localHelper.BeginTransaction(); serverHelper.BeginTransaction(); bool result = true; totalRealWeight = 0; if (result && IsNet()) { shelfBarcode = new ShelfBarcode(serverHelper, planInfo.PlanID, recipeInfo.ShelfLotCount); } if (result) { result = SetLocalPlanFinishedLotCount(localHelper); } if (result && IsNet()) { result = SetServerPlanFinishedLotCount(serverHelper); } if (result) { result = SavePptLotData(localHelper); } if (result && IsNet()) { result = SavePptLotData(serverHelper); } if (result) { result = SavePptMixingData(localHelper); } if (result && IsNet()) { result = SavePptMixingData(serverHelper); } if (result) { result = SavePptWeighData(localHelper); } if (result && IsNet()) { result = SavePptWeighData(serverHelper); } if (result && IsNet()) { result = SavePptShiftConfig(serverHelper); } if (result && IsNet()) { result = SaveMixingCurve(serverHelper); } if (result && IsNet()) { result = UpdateCurrentShelfBarcode(serverHelper); }; if (result) { localHelper.CommitTransaction(); serverHelper.CommitTransaction(); save = true; } else { localHelper.RollbackTransaction(); serverHelper.RollbackTransaction(); } } catch { localHelper.RollbackTransaction(); serverHelper.RollbackTransaction(); } finally { localHelper.CloseConnection(); serverHelper.CloseConnection(); } return save; } #endregion #endregion #region 存盘数据 private class MixingInfo { #region 单例实现 private static MixingInfo instance; public static MixingInfo Instance { get { if (instance == null) { instance = new MixingInfo(); } return instance; } } private MixingInfo() { } #endregion /// /// 上次存盘密炼开始时间 /// public DateTime LastFinishedBatchMixingStaretTime { get; set; } } private void SaveFinishBatchData() { ReadPlcSaveData(); BaseAction action = new BaseAction(); DbHelper dbHelper = getLocalHelper(); //当前计划车数 int planLotCount = planExecuteData.RecipeSetNumber; //完成当前计划车数 int finishLotCount = planExecuteData.MixingFinishedCount; if (finishLotCount == 0) { action.LogDebug("清除错误的存盘信号:" + finishLotCount.ToString()); FinishedOneReset(); return; } if (finishLotCount <= planLotCount && finishLotCount > 0) { action.LogDebug("存盘信号:" + finishLotCount.ToString()); //读取本次存盘信号时间和保存的全局上次时间对比,相同则退出 if (MixingInfo.Instance.LastFinishedBatchMixingStaretTime == planExecuteData.MixingStartTime) { action.LogDebug("清除重复的存盘信号:" + finishLotCount.ToString()); FinishedOneReset(); return; } IniCurrentLotBarcode(); if (HasSaveBarCode()) { action.LogDebug("条码存在:" + BarcodeInfo.Instance.LotBarcode); FinishedOneReset(); return; } action.LogDebug("开始存盘:" + BarcodeInfo.Instance.LotBarcode); if (SaveInfo()) { MixingInfo.Instance.LastFinishedBatchMixingStaretTime = planExecuteData.MixingStartTime; FinishedOneReset(); } } } #endregion #region 密炼曲线 private class CurveInfo { #region 单例实现 private static CurveInfo instance; public static CurveInfo Instance { get { if (instance == null) { instance = new CurveInfo(); } return instance; } } private CurveInfo() { this.MixingCurve = new StringBuilder(); this.MixTimeStr = new StringBuilder(); this.MixTempStr = new StringBuilder(); this.MixPowerStr = new StringBuilder(); this.MixEnerStr = new StringBuilder(); this.MixPressStr = new StringBuilder(); this.MixSpeedStr = new StringBuilder(); } #endregion /// /// 密炼曲线 /// public StringBuilder MixingCurve { get; set; } /// /// 密炼时间 /// public StringBuilder MixTimeStr { get; set; } /// /// 密炼温度 /// public StringBuilder MixTempStr { get; set; } /// /// 密炼功率 /// public StringBuilder MixPowerStr { get; set; } /// /// 密炼能量 /// public StringBuilder MixEnerStr { get; set; } /// /// 密炼压力 /// public StringBuilder MixPressStr { get; set; } /// /// 密炼转速 /// public StringBuilder MixSpeedStr { get; set; } } public void MixingData() { PlanLog currentPlan = Global.Deserialize(PlanCommon.PlanLogFile); if (currentPlan == null) { return; } #region 数据字符串 double mixingTime = PlcData.Instance.CurrentMixingTime.LastValue.ToDouble(); double mixingTemp = PlcData.Instance.CurrentMixingTemp.LastValue.ToDouble(); double mixingPower = PlcData.Instance.CurrentMixingPower.LastValue.ToDouble(); double mixingEnergy = PlcData.Instance.CurrentMixingEnergy.LastValue.ToDouble(); double mixingPressureRam = PlcData.Instance.CurrentMixingPressureRam.LastValue.ToDouble(); double mixingSpeedRotor = PlcData.Instance.CurrentMixingSpeedRotor.LastValue.ToDouble(); double mixingHoopPerstion = PlcData.Instance.CurrentMixingHoopPerstion.LastValue.ToDouble(); StringBuilder sb = new StringBuilder(); sb.Append(String.Format("{0:N2}", mixingTime)).Append(":"); sb.Append(String.Format("{0:N2}", mixingTemp)).Append(":"); sb.Append(String.Format("{0:N2}", mixingPower)).Append(":"); sb.Append(String.Format("{0:N2}", mixingEnergy)).Append(":"); sb.Append(String.Format("{0:N2}", mixingPressureRam)).Append(":"); sb.Append(String.Format("{0:N2}", mixingSpeedRotor)).Append(":"); sb.Append(String.Format("{0:N2}", mixingHoopPerstion)).Append("/"); CurveInfo.Instance.MixingCurve.Append(sb); CurveInfo.Instance.MixTimeStr.Append(String.Format("{0:N2}", mixingTime)).Append(":"); CurveInfo.Instance.MixTempStr.Append(String.Format("{0:N2}", mixingTemp)).Append(":"); CurveInfo.Instance.MixPowerStr.Append(String.Format("{0:N2}", mixingPower)).Append(":"); CurveInfo.Instance.MixEnerStr.Append(String.Format("{0:N2}", mixingEnergy)).Append(":"); CurveInfo.Instance.MixPressStr.Append(String.Format("{0:N2}", mixingPressureRam)).Append(":"); CurveInfo.Instance.MixSpeedStr.Append(String.Format("{0:N2}", mixingSpeedRotor)).Append(":"); if (mixingTime < 2 && CurveInfo.Instance.MixingCurve.Length > 1000) { CurveInfo.Instance.MixingCurve = new StringBuilder(); CurveInfo.Instance.MixTimeStr = new StringBuilder(); CurveInfo.Instance.MixTempStr = new StringBuilder(); CurveInfo.Instance.MixPowerStr = new StringBuilder(); CurveInfo.Instance.MixEnerStr = new StringBuilder(); CurveInfo.Instance.MixPressStr = new StringBuilder(); CurveInfo.Instance.MixSpeedStr = new StringBuilder(); } #endregion DbHelper dbHelper = getLocalHelper(); RecipeData recipeData = new RecipeData(); string planID = recipeData.GetCurrentPlanID(); string socketSendstr = sb.ToString() + Global.ProtocalHeader.ReceivePlanIdIpNumber + ":" + planID + "/"; Mesnac.Communication.TcpService.Instance.NetSendMsg(socketSendstr); //计划总数 int plansCount = recipeData.GetPlansCount(); //完成计划数 int finishPlansCount = recipeData.GetCurrentPlanIndex(); if (finishPlansCount <= plansCount) { if (PlcData.Instance.FinishedBatch.LastValue.ToInt() == 1) { SaveFinishBatchData(); } } } #endregion } public class MixingCurve : FeedingAction, IAction { SaveMixingData data = new SaveMixingData(); private void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { timersTimer.Enabled = false; try { data.MixingData(); } catch { } timersTimer.Enabled = true; } System.Timers.Timer timersTimer = new System.Timers.Timer(); public void Run(RuntimeParameter runtime) { timersTimer.Elapsed += new System.Timers.ElapsedEventHandler(timersTimer_Elapsed); timersTimer.Interval = 1000; timersTimer.Enabled = true; } } }