using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Windows.Forms; using ICSharpCode.Core; using System.Data; using Mesnac.Action.ChemicalWeighing.Entity; using System.Threading; using System.Configuration; using Mesnac.Action.ChemicalWeighing.Entity.PptPlan; using Mesnac.Action.ChemicalWeighing.Entity.station; using Mesnac.Action.ChemicalWeighing.Product.PptPlan; using Mesnac.Action.ChemicalWeighing.Report; using DevExpress.XtraRichEdit.Fields.Expression; namespace Mesnac.Action.ChemicalWeighing.ChemicalWeighingPlc { /// /// 计划列表下传PLC辅助类 /// public class PlcPlanHelper { static bool flag1=false;//扫码枪是否初始化 ——小料 static bool flag2 = false;//扫码枪是否初始化 ——投料 static bool flag3 = false;//扫码枪是否初始化 ——溶剂称量 #region 事件定义 public static object sender = null; public static event EventHandler OnUpdatePlanStateFromPlc; public static event EventHandler AutoDownloadPlan; public static event EventHandler OnAutoAddPlan; public static event EventHandler OnChangePlan; #endregion #region 字段定义 private static string originalMixPlcPlanTableName = String.Empty; private static string originalMillPlcPlanTableName = String.Empty; #endregion #region 下传计划列表至PLC /// /// 下传计划列表至PLC /// /// 输出消息列表 /// 成功返回true,失败返回false public static bool DownloadPlanData(List msgList) { bool result = true; List list = null; //if (Global.PublicVar.Instance.ChemicalWeighingPlcOnlineFlag) //|| Global.PublicVar.Instance.IsLocalTest) if (true) { if (result) { if (list == null) { list = Product.PptPlan.PlanHelper.GetUnExePlanEntityList(1); } result = DownloadPlanDataToChe(list, msgList); } } return result; } /// /// 下传计划列表至PLC(自动) /// /// 输出消息列表 /// 成功返回true,失败返回false public static bool AutoDownloadPlanData(List msgList) { bool result = true; List list = null; #region 读取应答信号 if (!(BasePlcHelper.Instance.ChemicalWeighing_PLC_LoadingStatus.NowValue.ToInt() == 1 && BasePlcHelper.Instance.ChemicalWeighing_PC_LoadingStatus.NowValue.ToInt() == 0)) { return false; } #endregion if (result) { if (list == null) { list = Product.PptPlan.PlanHelper.GetUnExePlanEntityList(1); } result = DownloadPlanDataToChe(list, msgList); } return result; } #region 下传计划列表至小料PLC /// /// 下传计划列表至小料PLC /// /// 计划列表 /// 输出的消息列表 /// 成功返回true,失败返回flase public static bool DownloadPlanDataToChe(List list, List msgList) { try { #region 定义变量 //int cnt = 0; //循环计数 string msg = String.Empty; List writeDataList = new List(); PropertyInfo[] ps = typeof(RT_Plan).GetProperties(); PropertyInfo[] psMaterial = typeof(Pmt_weigh).GetProperties(); List listMaterial = new List(); //计划对应的配方对应的物料列表 Pmt_recipe currentPmtRecipe = new Pmt_recipe(); //当前配方 RT_Plan nextRTPlan = null; //下一条计划 Pmt_recipe nextPmtRecipe = null; //当前配方 bool planDownFlag = false; if (msgList == null) { msgList = new List(); } #endregion #region 验证处理-配置 if (list == null || list.Count == 0) { msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg40")); //小料-计划信息下传PLC失败:无可下传计划! msgList.Add(msg); ICSharpCode.Core.LoggingService.Error(msg); return false; } List writerList = PlcSchemaHelper.Instance.GetPlcWriter("PlanRecipeData"); //配方头数据 if (writerList == null || writerList.Count == 0) { msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg10")); //小料-计划信息下传PLC失败:在PlcSchema.xml中没有RT_Plan配置节! msgList.Add(msg); ICSharpCode.Core.LoggingService.Error(msg); return false; } List writerList1 = PlcSchemaHelper.Instance.GetMaterialPlcWriter("PlanMaterialData"); //物料数据 if (writerList == null || writerList.Count == 0) { msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg10")); //小料-计划信息下传PLC失败:在PlcSchema.xml中没有RT_Plan配置节! msgList.Add(msg); ICSharpCode.Core.LoggingService.Error(msg); return false; } writerList = writerList.Concat(writerList1).ToList(); #endregion #region 验证处理-数据 if (list == null || list.Count == 0) { msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg15")); //小料-计划信息下传PLC失败:当班计划列表为空! msgList.Add(msg); return false; } else { #region 根据配方recipeID获取物料信息 string recipeID = list[0].Recipe_ID; listMaterial = Product.PptPlan.PlanHelper.GetPmt_weighList(recipeID); if(listMaterial != null) { Global.PublicVar.Instance.currentListPmt_weigh = listMaterial; } #endregion #region 根据配方recipeID获取配方信息 currentPmtRecipe = Technical.PmtRecipe.RecipeHelper.GetRecipeEntityByGUID(recipeID); #endregion #region 获取下一配方信息 nextRTPlan = Product.PptPlan.PlanHelper.GetNextPlan((int)list[0].Plan_Serial); if(nextRTPlan != null){ nextPmtRecipe = Technical.PmtRecipe.RecipeHelper.GetRecipeEntityByGUID(nextRTPlan.Recipe_ID); } #endregion } #endregion #region 业务处理 foreach (PlcWriter writer in writerList) { writeDataList.Clear(); #region 验证处理 if (writer.EquipRunName != "Recipe_Data_Download_BaseInf" && writer.EquipRunName != "Hopper_Recipe_Detail_Inf") { continue; } #endregion #region 获取PLC品牌名称,处理西门子与其他PLC差异 string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName); writer.EquipBrand = equipBrand; #endregion #region 整理数据 if (writer.EquipRunName == "Recipe_Data_Download_BaseInf") { Entity.RT_Plan entity = null; for (int i = 0; i < writer.ThisCount; i++) { if (list != null && i < list.Count) { entity = list[i]; DateTime timeNow = DateTime.Now; foreach (PlcWriteItem item in writer.SchemaList) { item.ClearData(); item.EquipBrand = equipBrand; //设置PLC设备品牌 foreach (PropertyInfo pi in ps) { if (item.DataFieldName == pi.Name) { item.SetValue = pi.GetValue(entity, null); break; } else if (item.EquipRunName == "DownLoad_H_Year") { item.SetValue = timeNow.Year; break; } else if (item.EquipRunName == "DownLoad_H_Month") { item.SetValue = timeNow.Month; break; } else if (item.EquipRunName == "DownLoad_H_Date") { item.SetValue = timeNow.Day; break; } else if (item.EquipRunName == "DownLoad_H_Hour") { item.SetValue = timeNow.Hour; break; } else if (item.EquipRunName == "DownLoad_H_Minute") { item.SetValue = timeNow.Minute; break; } else if (item.EquipRunName == "DownLoad_H_Second") { item.SetValue = timeNow.Second; break; } else if (item.EquipRunName == "DownLoad_MachineCode") { item.SetValue = "01"; break; } else if (item.EquipRunName == "DownLoad_TotalSetWeight") { if (currentPmtRecipe != null && currentPmtRecipe.Total_Weight != null) { item.SetValue = Convert.ToInt32(currentPmtRecipe.Total_Weight * 1000); } break; } else if (item.EquipRunName == "DownLoad_TotalErrorWeight") { if (currentPmtRecipe != null && currentPmtRecipe.Total_Error != null) { item.SetValue = Convert.ToInt32(currentPmtRecipe.Total_Error * 1000); } break; } else if (item.EquipRunName == "DownLoad_1LOT") { if (currentPmtRecipe != null && currentPmtRecipe.GroupBags != null) { item.SetValue = (Int32)currentPmtRecipe.GroupBags; } break; } else if (item.EquipRunName == "DownLoad_NextPlanCode") { if (nextPmtRecipe != null && nextPmtRecipe.Recipe_Name != null) { item.SetValue = nextPmtRecipe.Recipe_Name; } break; } else if (item.EquipRunName == "DownLoad_NextTotalSetWeight") { if (nextPmtRecipe != null && nextPmtRecipe.Total_Weight != null) { item.SetValue = Convert.ToInt32(nextPmtRecipe.Total_Weight * 1000); } break; } else if (item.EquipRunName == "DownLoad_NextPlanNum") { if (nextRTPlan != null && nextRTPlan.Plan_Num != null) { item.SetValue = Convert.ToInt32(nextRTPlan.Plan_Num); } break; } else if (item.EquipRunName == "DownLoad_SeparateNum") { if (entity != null && entity.Plan_Num != null) { item.SetValue = entity.Plan_Num; //后期会有配置项进行设置 } break; } } writeDataList.AddRange(item.WriteData()); } } else { foreach (PlcWriteItem item in writer.SchemaList) { item.ClearData(); item.EquipBrand = equipBrand; //设置PLC设备品牌 writeDataList.AddRange(item.WriteData()); } } } } if (writer.EquipRunName == "Hopper_Recipe_Detail_Inf") { Pmt_weigh entity = null; for (int i = 0; i < writer.ThisCount; i++) { if (listMaterial != null && i < listMaterial.Count) { entity = listMaterial[i]; DateTime timeNow = DateTime.Now; foreach (PlcWriteItem item in writer.SchemaList) { item.ClearData(); item.EquipBrand = equipBrand; //设置PLC设备品牌 foreach (PropertyInfo pi in psMaterial) { if (item.DataFieldName == pi.Name) { item.SetValue = pi.GetValue(entity, null); if (item.DataFieldName == "Set_Weight" || item.DataFieldName == "Set_Error") { object temd = item.SetValue; item.SetValue = Convert.ToDouble(temd) * 1000; } else if (item.DataFieldName == "Weight_Id") { object temd = item.SetValue; item.SetValue = Convert.ToInt32(temd) - 1; } break; } else if (item.EquipRunName == "DownLoad_BinNo") { Pmt_Bin pmtBin = Product.PptPlan.PlanHelper.GetPmt_Bin(entity.Material_ID); if (pmtBin != null && pmtBin.Bin_Serial != null) { item.SetValue = pmtBin.Bin_Serial; } else { item.SetValue = 100; //对应手动秤功能 } break; } } writeDataList.AddRange(item.WriteData()); } } else { foreach (PlcWriteItem item in writer.SchemaList) { item.ClearData(); item.EquipBrand = equipBrand; //设置PLC设备品牌 writeDataList.AddRange(item.WriteData()); } } } } #endregion #region 下传数据 object[] buff = new object[writeDataList.Count]; Array.Copy(writeDataList.ToArray(), buff, buff.Length); ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]开始下传计划信息...", writer.EquipRunName)); if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff)) { msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg50")); //小料-计划信息下传PLC[{0}]失败... msg = String.Format(msg, writer.EquipRunName); msgList.Add(msg); ICSharpCode.Core.LoggingService.Error(msg); return false; } else { planDownFlag = true; } ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]计划信息下传完毕...", writer.EquipRunName)); #endregion } #endregion #region 交互逻辑 if (planDownFlag) { #region 下传请求信号 bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_LoadingStatus, new object[] { 1 }); if (!result) { msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg20")); //小料-计划信息下传PLC:向PLC下传请求信号失败! msgList.Add(msg); ICSharpCode.Core.LoggingService.Error(msg); return false; } #endregion #region 数据下传完成后,将该条计划的状态更改为已下传 Product.PptPlan.PlanHelper.UpdatePlanState(list[0].Plan_Id, 4); planDownFlag = false; #endregion if (AutoDownloadPlan != null) { AutoDownloadPlan(sender, System.EventArgs.Empty); } } #endregion return true; } catch (Exception ex) { msgList.Add(ex.Message); ICSharpCode.Core.LoggingService.Error(ex.Message, ex); return false; } finally { #region 交互逻辑 if (Global.PublicVar.Instance.PlcDownloadMode == 1) { //#region 清除请求信号 //bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.Mix_SysAction_ExchPlanInfoRep_Req, new object[] { 0 }); //if (!result) //{ // BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.Mix_SysAction_ExchPlanInfoRep_Req, new object[] { 0 }); //} //#endregion } #endregion } } #endregion #endregion #region 获取PLC计划列表中某条计划中允许修改的最小车数 /// /// 获取上辅机PLC计划列表中某条计划中允许修改的最小车数 /// /// 要获取的允许最小车数的计划号 /// 返回对应计划号的最小车数 //public static int GetMixMinPlanNumFromPlc(string planID) //{ // DataTable dt = BasePlcHelper.Instance.Mix_PlanState_PlcPlanList.LastValue.ToObject() as DataTable; // if (dt != null && dt.Rows.Count > 0) // { // foreach(DataRow dr in dt.Rows) // { // if (Mesnac.Basic.DataProcessor.RowValue(dr, "PlanID", String.Empty) == planID) // { // return Mesnac.Basic.DataProcessor.RowValue(dr, "NumModifyMin", 0); // } // } // return 0; // } // else // { // return 0; // } //} #endregion #region 获取PLC计划列表中某条计划的计划数 /// /// 获取PLC计划列表中某条计划的计划数 /// /// 计划编号 /// 默认值 /// 返回对应计划号的计划数 //public static int GetMixPlanNumFromPlc(string planID, int defaultValue) //{ // DataTable dt = BasePlcHelper.Instance.Mix_PlanState_PlcPlanList.LastValue.ToObject() as DataTable; // if (dt != null && dt.Rows.Count > 0) // { // foreach (DataRow dr in dt.Rows) // { // if (Mesnac.Basic.DataProcessor.RowValue(dr, "PlanID", String.Empty) == planID) // { // return Mesnac.Basic.DataProcessor.RowValue(dr, "PlanNum", defaultValue); // } // } // return defaultValue; // } // else // { // return defaultValue; // } //} #endregion #region 把PLC的计划状态更新至数据库 /// /// 把PLC的计划状态更新至数据库 /// public static void UpdatePlanStateFromPlc() { try { bool flag = false; #region 小料同步计划状态和完成数 if (BasePlcHelper.Instance.ChemicalWeighing_PLC_Plan_Status_ShakeHand.NowValue.ToInt() == 1 && BasePlcHelper.Instance.ChemicalWeighing_PLC_Plan_Status_FeedBack.NowValue.ToInt() == 0) { int planSerial = BasePlcHelper.Instance.ChemicalWeighing_Plan_Serial.NowValue.ToInt(); //计划序号 int planState = BasePlcHelper.Instance.ChemicalWeighing_Plan_Status.NowValue.ToInt(); //计划状态 int planNum = BasePlcHelper.Instance.ChemicalWeighing_Plan_Number.NowValue.ToInt(); //计划数量 int planRestNum = BasePlcHelper.Instance.ChemicalWeighing_Remain_Number.NowValue.ToInt(); //剩余数量 int planComNum = planNum - planRestNum; //完成数量 if (planState == (int)Entity.PlanState.Producting) { Product.PptPlan.PlanHelper.UpdatePlanInfo(planSerial, planState, planNum, planComNum); } else if (planState == (int)Entity.PlanState.Completed) { Product.PptPlan.PlanHelper.UpdatePlanInfo(planSerial, planState, planNum, planComNum,DateTime.Now.ToString()); } else { return; } flag = true; //PlanListReDown();20211205三元现场注释掉 #region 此处需要将RT_Plan中计划写入到LR_Plan中,同时向LR_Recipe中存储信息 RT_Plan rtPlan = Product.PptPlan.PlanHelper.GetPlanDataEntity(planSerial); if (rtPlan != null) { LR_plan lrPlan = new LR_plan(); Product.PptPlan.PlanHelper.EntityToEntity(rtPlan, lrPlan); if (Product.PptPlan.PlanHelper.LRPlanExists(lrPlan.Plan_Id)) { //更新 if (planState == (int)Entity.PlanState.Producting) { Product.PptPlan.PlanHelper.LRUpdatePlanInfo(lrPlan.Plan_Id, planState, planNum, planComNum); } else if (planState == (int)Entity.PlanState.Completed) { Product.PptPlan.PlanHelper.LRUpdatePlanInfo(lrPlan.Plan_Id, planState, planNum, planComNum, DateTime.Now.ToString()); #region 执行删除计划操作 Product.PptPlan.PlanHelper.DeletePlan(rtPlan.Plan_Id); #endregion } } else { //添加(LR_plan) Product.PptPlan.PlanHelper.LRAddPlan(lrPlan); //添加(LR_recipe) LR_recipe lrRecipe = new LR_recipe(); lrRecipe.Plan_id = rtPlan.Plan_Id; lrRecipe.Equip_Code = rtPlan.Equip_Code; string recipeID = rtPlan.Recipe_ID; List listPmtWeigh = Product.PptPlan.PlanHelper.GetPmt_weighList(recipeID); foreach (Pmt_weigh tempPW in listPmtWeigh) { lrRecipe.Weight_ID = tempPW.Weight_Id - 1; lrRecipe.Set_Weight = (float)tempPW.Set_Weight; lrRecipe.Set_Error = (float)tempPW.Set_Error; lrRecipe.CPK_Error = (decimal)0; Pmt_material pmtMaterial = Product.PptPlan.PlanHelper.GetPmt_material(tempPW.Material_ID); if (pmtMaterial != null) { lrRecipe.Material_Code = pmtMaterial.Material_code; lrRecipe.Material_Name = pmtMaterial.Material_name; lrRecipe.Batch_number = pmtMaterial.Batch_number; lrRecipe.remark = null; Product.PptPlan.PlanHelper.AddLR_recipe(lrRecipe); } } } } #endregion } #endregion #region 触发事件 if (flag) { #region 下传请求信号 bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PLC_Plan_Status_FeedBack, new object[] { 1 }); if (!result) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg30")); //小料-计划信息下传PLC:向PLC下传计划状态请求信号失败! ICSharpCode.Core.LoggingService.Error(msg); } #endregion #region 判断等待计划数和正在运行的计划数。如果两个都是0,清空RT_Plan表。 int waitPlanCount = Product.PptPlan.PlanHelper.GetUnExePlanNum(); int runningPlanCount = Product.PptPlan.PlanHelper.GetRunningPlanNum(); int downPlanCount = Product.PptPlan.PlanHelper.GetDownPlanNum(); if (waitPlanCount == 0 && runningPlanCount == 0 && downPlanCount == 0) { Product.PptPlan.PlanHelper.ClearRT_Plan(); } #endregion if (OnUpdatePlanStateFromPlc != null) { OnUpdatePlanStateFromPlc(sender, System.EventArgs.Empty); } } #endregion } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error("把PLC的计划状态更新至数据库异常:" + ex.Message, ex); } finally { Global.PublicVar.Instance.LocalPlanIsRefresh = false; } } #endregion #region 处理HMI的修改计划请求 /// /// 处理HMI的修改计划请求 /// public static void ChangePlan() { try { bool flag = false; #region 读取并处理HMI的配方添加计划请求(添加计划) if (BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_ShakeHand.NowValue.ToInt() == 1 && (BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_FeedBack.NowValue.ToInt() <= 0 || BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_FeedBack.NowValue.ToInt() == 65535)) { #region 从PLC中获取要添加的计划信息 int planCommand = BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_Command.NowValue.ToInt(); //命令 String sysMachine = BasePlcHelper.Instance.ChemicalWeighing_Sys_Machine2.NowValue.ToString(); //机台号 int[] planIdData; BasePlcHelper.Instance.PlcRead(BasePlcHelper.Instance.ChemicalWeighing_HMIChange_PlanId, out planIdData); string planId = Mesnac.Basic.DataProcessor.ToString1(planIdData); //计划 int ChangePlanNum = BasePlcHelper.Instance.ChemicalWeighing_HMIChange_PlanNum.NowValue.ToInt(); //设定数量 if (String.IsNullOrEmpty(sysMachine)) { sysMachine = "01"; } #endregion #region 验证(PLC中读取过来的planid对应的数据库中的计划必须是存在的) RT_Plan currentRT_Plan = Product.PptPlan.PlanHelper.GetPlanDataEntity(planId); if (currentRT_Plan == null) { ChangePlanErrorReturn(); return; } #endregion #region 判断命令(0默认 1刷新 2上移 3下移 4修改车数 5删除计划)并执行操作 if (planCommand == 1) { //刷新事件,将最新的计划列表重写入PLC。 } else if (planCommand == 2) { #region 获取交换位置对象并判断是否可以上移(条件:在该条计划前,是否有一条未运行中的计划)并执行上移 int swagPlanSerial = (int)currentRT_Plan.Plan_Serial - 1; RT_Plan swagRtPLan = Product.PptPlan.PlanHelper.GetPlanBySerialUp(swagPlanSerial); if (swagRtPLan == null) { ChangePlanErrorReturn(); return; } else { currentRT_Plan.Plan_Serial = currentRT_Plan.Plan_Serial - 1; swagRtPLan.Plan_Serial = swagRtPLan.Plan_Serial + 1; Product.PptPlan.PlanHelper.UpdatePlanSerial(currentRT_Plan); Product.PptPlan.PlanHelper.UpdatePlanSerial(swagRtPLan); #region 重新下传计划列表 flag = PlanListReDown(); #endregion } #endregion } else if (planCommand == 3) { #region 获取交换位置对象并判断是否可以下移(条件:在该条计划后,是否有一条未运行中的计划)并执行下移 int swagPlanSerial = (int)currentRT_Plan.Plan_Serial + 1; RT_Plan swagRtPLan = Product.PptPlan.PlanHelper.GetPlanBySerialDown(swagPlanSerial); if (swagRtPLan == null) { ChangePlanErrorReturn(); return; } else { currentRT_Plan.Plan_Serial = currentRT_Plan.Plan_Serial + 1; swagRtPLan.Plan_Serial = swagRtPLan.Plan_Serial - 1; Product.PptPlan.PlanHelper.UpdatePlanSerial(currentRT_Plan); Product.PptPlan.PlanHelper.UpdatePlanSerial(swagRtPLan); #region 重新下传计划列表 flag = PlanListReDown(); #endregion } #endregion } else if (planCommand == 4) { #region 执行修改计划操作 Product.PptPlan.PlanHelper.UpdatePlanNum(planId, ChangePlanNum); #endregion #region 重新下传计划列表 flag = PlanListReDown(); #endregion } else if (planCommand == 5) { #region 获取计划号对应的序号 int delSerial = (int)currentRT_Plan.Plan_Serial; #endregion #region 执行删除计划操作 Product.PptPlan.PlanHelper.DeletePlan(planId); #endregion #region 整理修改后续计划的序号(-1) List mRtPlan = Product.PptPlan.PlanHelper.GetPlanListAfterPlanSerial(delSerial); if (mRtPlan != null && mRtPlan.Count > 0) { foreach (RT_Plan tempRT in mRtPlan) { tempRT.Plan_Serial = tempRT.Plan_Serial - 1; Product.PptPlan.PlanHelper.UpdatePlanSerial(tempRT); } } #endregion #region 将等待计划数写入PLC WaitPlanNumToPLC(); #endregion #region 重新下传计划列表 flag = PlanListReDown(); #endregion } else { //默认 } #endregion #region 触发事件 if (OnChangePlan != null) { OnChangePlan(sender, System.EventArgs.Empty); } #endregion } #endregion #region HMI修改计划请求交互 if (flag) { #region 下传请求信号 bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_FeedBack, new object[] { 1 }); if (!result) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ChangePlan_logContent_1")); //HMI修改计划请求成功后:向PLC下传反馈信号失败! ICSharpCode.Core.LoggingService.Error(msg); } #endregion } #endregion } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error("从HMI修改计划异常:" + ex.Message, ex); } } #endregion #region 修改计划出现异常反馈到PLC public static void ChangePlanErrorReturn() { bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_HMI_Request_Recipe_Change_FeedBack, new object[] { 3 }); if (!result) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ChangePlan_logContent_2")); //HMI修改计划请求成功后:向PLC下传异常反馈信号失败! ICSharpCode.Core.LoggingService.Error(msg); } } #endregion #region 执行完修改计划操作后重新向PLC写入计划列表数据 public static bool PlanListReDown() { #region 定义变量 bool reFlag = false; List writeDataList = new List(); PropertyInfo[] ps = typeof(RT_Plan).GetProperties(); List rtPlanList = Product.PptPlan.PlanHelper.GetPlanEntityListByNum(5); #endregion #region 验证处理-配置 if (rtPlanList == null || rtPlanList.Count == 0) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_AutoAddPlan_logContent_3")); //HMI添加计划请求成功后:计划列表获取失败! ICSharpCode.Core.LoggingService.Error(msg); } List writerList = PlcSchemaHelper.Instance.GetPlcWriter("PlanListData"); //计划列表数据 if (writerList == null || writerList.Count == 0) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_AutoAddPlan_logContent_4")); //HMI添加计划请求成功后:计划列表写入数据结构获取失败! ICSharpCode.Core.LoggingService.Error(msg); } #endregion #region 业务处理 foreach (PlcWriter writer in writerList) { writeDataList.Clear(); #region 验证处理 if (writer.EquipRunName != "PlanList_Info") { continue; } #endregion #region 获取PLC品牌名称,处理西门子与其他PLC差异 string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName); writer.EquipBrand = equipBrand; #endregion #region 整理数据 if (writer.EquipRunName == "PlanList_Info") { Entity.RT_Plan entity = null; for (int i = 0; i < writer.ThisCount; i++) { if (rtPlanList != null && i < rtPlanList.Count) { entity = rtPlanList[i]; DateTime timeNow = DateTime.Now; foreach (PlcWriteItem item in writer.SchemaList) { item.ClearData(); item.EquipBrand = equipBrand; //设置PLC设备品牌 foreach (PropertyInfo pi in ps) { if (item.DataFieldName == pi.Name) { item.SetValue = pi.GetValue(entity, null); break; } else if (item.EquipRunName == "DownLoad_MachineCode") { item.SetValue = "01"; break; } } writeDataList.AddRange(item.WriteData()); } } } } if (writeDataList.Count < 200) { int fillNum = 200 - writeDataList.Count; for (int i = 0; i < fillNum; i++) { writeDataList.AddRange(new short[] { 0 }); } } #endregion #region 下传数据 object[] buff = new object[writeDataList.Count]; Array.Copy(writeDataList.ToArray(), buff, buff.Length); ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]开始下传计划信息...", writer.EquipRunName)); if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff)) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_AutoAddPlan_logContent_5")); //HMI添加计划请求成功后:计划列表写入PLC失败! ICSharpCode.Core.LoggingService.Error(msg); } else { reFlag = true; } ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]计划列表信息下传完毕...", writer.EquipRunName)); #endregion } #endregion return reFlag; } #endregion #region 待计划数写入PLC public static void WaitPlanNumToPLC() { try { int waitPlanNum = Product.PptPlan.PlanHelper.GetUnExePlanNum(); #region 向PLC写入等待计划数 object[] tempob = new object[1] { 0 }; tempob[0] = waitPlanNum; bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Scheduled_Num, tempob); if (!result) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_AutoAddPlan_logContent_8")); //向PLC写入等待计划数失败! ICSharpCode.Core.LoggingService.Error(msg); } #endregion } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error("把等待计划数写入PLC异常:" + ex.Message, ex); } } #endregion #region 终止计划 /// /// 终止计划方法 /// /// 要终止的计划序号 /// 终止命令 /// 要终止的计划数 /// 要终止的计划剩余数 /// 是否方法内显示消息窗口 /// 输出的消息列表 /// 成功返回true,失败返回false public static bool ExecStop(int planSerial, int planCommand, int planNum, int unFinishedNum, bool isShowMsg, List msgList) { try { #region 1 定义变量 List writeDataList = new List(); #endregion #region 2 验证处理-配置 List writerList = PlcSchemaHelper.Instance.GetPlcWriter("PlanModifyData"); if (writerList == null || writerList.Count == 0) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecStop_logContent_1")); //终止计划数据结构获取失败! ICSharpCode.Core.LoggingService.Error(msg); return false; } #endregion #region 3 业务处理 foreach (PlcWriter writer in writerList) { writeDataList.Clear(); #region 验证处理 if (writer.EquipRunName != "Plan_To_Plc") { continue; } #endregion #region 获取PLC品牌名称,处理西门子与其他PLC差异 string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName); writer.EquipBrand = equipBrand; #endregion #region 整理数据 if (writer.EquipRunName == "Plan_To_Plc") { for (int i = 0; i < writer.ThisCount; i++) { foreach (PlcWriteItem item in writer.SchemaList) { item.ClearData(); item.EquipBrand = equipBrand; if (item.EquipRunName == "DownLoad_PlanSerial") { item.SetValue = planSerial; } else if (item.EquipRunName == "DownLoad_PlanCommand") { item.SetValue = planCommand; } else if (item.EquipRunName == "DownLoad_PlanNum") { item.SetValue = planNum; } else if (item.EquipRunName == "DownLoad_RealNum") { item.SetValue = unFinishedNum; } writeDataList.AddRange(item.WriteData()); } } } #endregion #region 下传数据 bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 1 }); if (!result) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecStop_logContent_3")); //向PLC下传终止计划命令失败! ICSharpCode.Core.LoggingService.Error(msg); return false; } else { object[] buff = new object[writeDataList.Count]; Array.Copy(writeDataList.ToArray(), buff, buff.Length); ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]开始下传终止计划信息...", writer.EquipRunName)); if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff)) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecStop_logContent_2")); //终止计划写入PLC失败! ICSharpCode.Core.LoggingService.Error(msg); return false; } else { bool result1 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 2 }); if (!result1) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecStop_logContent_4")); //向PLC下传终止计划命令及数据成功后,反馈失败! ICSharpCode.Core.LoggingService.Error(msg); return false; } else { int readCount = 0; while (readCount < 5) { if (BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_FeedBack.NowValue.ToInt() == 1) { BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 0 }); BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_FeedBack, new object[] { 0 }); break; } readCount++; Thread.Sleep(200); } } } ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]计划列表信息下传完毕...", writer.EquipRunName)); } #endregion } #endregion #region 4 关闭进度提示 Sys.FrmNotify.Instance.Value = 100; Sys.FrmNotify.Instance.Destory(); #endregion return true; } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error(ex.Message); msgList.Add(ex.Message); return false; } finally { Sys.FrmNotify.Instance.Destory(); } } #endregion #region 修改计划数 /// /// 修改计划数方法 /// /// 要终止的计划编号 /// 新的计划数 /// 是否方法内显示消息窗口 /// 输出的消息列表 /// 成功返回true,失败返回false public static bool ExecModifyPlanNum(int planSerial, int planCommand, int newPlanNum, int unFinishedNum, bool isShowMsg, List msgList) { try { #region 1 定义变量 List writeDataList = new List(); #endregion #region 2 验证处理-配置 List writerList = PlcSchemaHelper.Instance.GetPlcWriter("PlanModifyData"); if (writerList == null || writerList.Count == 0) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecModify_logContent_1")); //上位机修改计划数:数据结构获取失败! ICSharpCode.Core.LoggingService.Error(msg); return false; } #endregion #region 3 业务处理 foreach (PlcWriter writer in writerList) { writeDataList.Clear(); #region 验证处理 if (writer.EquipRunName != "Plan_To_Plc") { continue; } #endregion #region 获取PLC品牌名称,处理西门子与其他PLC差异 string equipBrand = Mesnac.Equips.Factory.Instance.GetEquipBrandByRunName(writer.EquipRunName); writer.EquipBrand = equipBrand; #endregion #region 整理数据 if (writer.EquipRunName == "Plan_To_Plc") { for (int i = 0; i < writer.ThisCount; i++) { foreach (PlcWriteItem item in writer.SchemaList) { item.ClearData(); item.EquipBrand = equipBrand; if (item.EquipRunName == "DownLoad_PlanSerial") { item.SetValue = planSerial; } else if (item.EquipRunName == "DownLoad_PlanCommand") { item.SetValue = planCommand; } else if (item.EquipRunName == "DownLoad_PlanNum") { item.SetValue = newPlanNum; } else if (item.EquipRunName == "DownLoad_RealNum") { item.SetValue = unFinishedNum; } writeDataList.AddRange(item.WriteData()); } } } #endregion #region 下传数据 object[] buff = new object[writeDataList.Count]; Array.Copy(writeDataList.ToArray(), buff, buff.Length); ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]开始下传终止计划信息...", writer.EquipRunName)); if (!BasePlcHelper.Instance.PlcWriteByRunName(writer.EquipRunName, buff)) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecModify_logContent_3")); //上位机修改计划数:写入PLC失败! ICSharpCode.Core.LoggingService.Error(msg); return false; } else { bool result1 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 2 }); if (!result1) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_Product_PptPlan_ExecModify_logContent_4")); //上位机修改计划数:向PLC下传修改计划数成功后,反馈失败! ICSharpCode.Core.LoggingService.Error(msg); return false; } else { int readCount = 0; while (readCount < 5) { if (BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_FeedBack.NowValue.ToInt() == 1) { BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_ShakeHand, new object[] { 0 }); BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Plan_Status_Com_FeedBack, new object[] { 0 }); break; } readCount++; Thread.Sleep(200); } } } ICSharpCode.Core.LoggingService.Debug(String.Format("[{0}]计划列表信息下传完毕...", writer.EquipRunName)); #endregion } #endregion #region 5 关闭进度提示 Sys.FrmNotify.Instance.Value = 100; Sys.FrmNotify.Instance.Destory(); #endregion return true; } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error(ex.Message); msgList.Add(ex.Message); return false; } finally { Sys.FrmNotify.Instance.Destory(); } } #endregion #region 条码命令处理下传 /// /// 条码命令处理下传方法 /// /// 通过Socket取到的扫码枪条码字符串 /// 成功返回true,失败返回false public static bool ScanCodeDown(string codeStr) { try { #region 1 条码处理:取出查找物料等相关信息的字符串。 //string useStr = codeStr.Substring(Global.PublicVar.Instance.ScanCodeStrStart, Global.PublicVar.Instance.ScanCodeStrEnd); string useStr = codeStr; if (useStr == null || useStr == string.Empty || useStr == "") { bool resultHopper_No1 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Hopper_No_103, new object[] { 0 }); bool resultScanCommand1 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_ScanCommand, new object[] { 0 }); if (!resultHopper_No1 || !resultScanCommand1) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_ScanCodeDown_Error1")); //没有获取到条码中的有效信息。 ICSharpCode.Core.LoggingService.Error(msg); } return false; } #endregion #region 2 根据从条码中取出的物料名称获取物料代码 string meterialId = Product.PptPlan.PlanHelper.GetPmt_materialID(useStr); if (meterialId == null || meterialId == string.Empty || meterialId == "") { bool resultHopper_No2 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Hopper_No_103, new object[] { 0 }); bool resultScanCommand2 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_ScanCommand, new object[] { 0 }); if (!resultHopper_No2 || !resultScanCommand2) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_ScanCodeDown_Error2")); //没有找到对应的物料代码。 ICSharpCode.Core.LoggingService.Error(msg); } return false; } #endregion #region 3 根据物料代码获取对应的料仓号 int binSerial = Product.PptPlan.PlanHelper.GetPmt_BinSerial(meterialId); if (binSerial == 0) { bool resultHopper_No3 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Hopper_No_103, new object[] { 0 }); bool resultScanCommand3 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_ScanCommand, new object[] { 0 }); if (!resultHopper_No3 || !resultScanCommand3) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_ScanCodeDown_Error3")); //没有找到对应的料仓号。 ICSharpCode.Core.LoggingService.Error(msg); } return false; } #endregion #region 4 下传料仓号和命令(失败反馈) bool resultHopper_No4 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Hopper_No_103, new object[] { binSerial }); bool resultScanCommand4 = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_ScanCommand, new object[] { 1 }); bool resultFromPlc = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_Open_door_Command_ShakeHand, new object[] { 2 }); if (!resultHopper_No4 || !resultScanCommand4 || !resultFromPlc) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_ScanCodeDown_Error4")); //料仓号获取成功,下传时失败。 ICSharpCode.Core.LoggingService.Error(msg); } #endregion #region 将扫码信息写入数据库报表 LR_BarcodeLog lR_BarcodeLog = new LR_BarcodeLog(); lR_BarcodeLog.Equip_Code = ConfigurationManager.AppSettings["EquipCode"]; lR_BarcodeLog.Scan_Time = DateTime.Now.ToString(); lR_BarcodeLog.Scan_Bar = useStr; lR_BarcodeLog.Material = Product.PptPlan.PlanHelper.GetPmt_material(meterialId).Material_name; lR_BarcodeLog.Bin = binSerial; lR_BarcodeLog.Scan_State = 1; Report.ReportHelper.InsertLR_BarcodeLog(lR_BarcodeLog); #endregion return true; } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error(ex.Message); return false; } finally { Sys.FrmNotify.Instance.Destory(); } } #endregion #region 更新物料名称 /// /// 更新物料名称 /// public static void UpdateMaterialNameToPlc() { try { bool flag = false; #region 更新物料名称及物料代码 if (BasePlcHelper.Instance.ChemicalWeighing_PLC_LoadingConfig.NowValue.ToInt() == 1 && BasePlcHelper.Instance.ChemicalWeighing_PC_LoadingConfig.NowValue.ToInt() == 0) { #region 下传物料名称 List pmt_Bins = Product.PptPlan.PlanHelper.GetAllPmt_Bin(); for (int i = 1; i <= 20; i++) { bool findFlag = false; DataKeyValue ChemicalWeighing_MaterName = new DataKeyValue("MaterName_Bin" + Mesnac.Basic.DataProcessor.FillZero(i.ToString(), 2)); DataKeyValue ChemicalWeighing_MaterCode = new DataKeyValue("MaterCode_Bin" + Mesnac.Basic.DataProcessor.FillZero(i.ToString(), 2)); if (pmt_Bins != null && pmt_Bins.Count > 0) { for (int j = 0; j < pmt_Bins.Count; j++) { Pmt_material pmt_Material = Product.PptPlan.PlanHelper.GetPmt_material(pmt_Bins[j].Material_ID); string binStr = null; if (pmt_Bins[j] != null && pmt_Bins[j].Bin_Serial != null && pmt_Material != null && pmt_Material.Material_name != null) { binStr = Mesnac.Basic.DataProcessor.FillZero(pmt_Bins[j].Bin_Serial.ToString(), 2); if (ChemicalWeighing_MaterName.EquipRunName.Contains(binStr)) { object[] oblist = Mesnac.Basic.DataProcessor.ToPLCDataArray(pmt_Material.Material_name); object[] oblistCode = Mesnac.Basic.DataProcessor.ToPLCDataArray(pmt_Material.Material_code); BasePlcHelper.Instance.PlcWriteByDataKey(ChemicalWeighing_MaterName, FullObj(oblist)); BasePlcHelper.Instance.PlcWriteByDataKey(ChemicalWeighing_MaterCode, FullObj(oblistCode)); findFlag = true; break; } } } if (findFlag == false) { object[] oblist = new object[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; object[] oblistCode = new object[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; BasePlcHelper.Instance.PlcWriteByDataKey(ChemicalWeighing_MaterName, oblist); BasePlcHelper.Instance.PlcWriteByDataKey(ChemicalWeighing_MaterCode, oblistCode); } } } flag = true; #endregion } #endregion #region 触发事件 if (flag) { #region 下传请求信号 bool result = BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_LoadingConfig, new object[] { 1 }); if (!result) { string msg = StringParser.Parse(ResourceService.GetString("Mesnac_Action_ChemicalWeighing_ChemicalWeighingPlc_PlcPlanHelper_Mix_msg60")); //小料物料名称向PLC下传反馈信号失败! ICSharpCode.Core.LoggingService.Error(msg); } #endregion } #endregion } catch (Exception ex) { ICSharpCode.Core.LoggingService.Error("把PLC的计划状态更新至数据库异常:" + ex.Message, ex); } finally { Global.PublicVar.Instance.LocalPlanIsRefresh = false; } } #endregion #region 修改PCOnlin心跳信号 public static void HeartBeatChange() { if (BasePlcHelper.Instance.ChemicalWeighing_PLC_Online_Flag.NowValue.ToInt() != 0) { if (BasePlcHelper.Instance.ChemicalWeighing_PC_Online.NowValue.ToInt() == 1) { BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Online, new object[] { 0 }); } else { BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.ChemicalWeighing_PC_Online, new object[] { 1 }); } } } #endregion #region 自动修改班次 public static void shiftIDAutoChange() { Global.PublicVar.Instance.globalShiftID = Product.ProductHelper.shiftIDAtuoRefresh(); } #endregion public static object[] FullObj(object[] ob) { object[] reOb = ob; if (reOb.Count() < 20) { for (int z = reOb.Count(); z < 20; z++) { object[] tempo = new object[1] { 0 }; reOb = reOb.Concat(tempo).ToArray(); } } return reOb; } #region 溶剂配方 #region 溶剂下发任务到PLC 2023-06-17 /// /// 溶剂下发任务到PLC /// /// /// public static string DownloadPlanDataToPlc(List materialList) { int i = 1; foreach (var item in materialList) { switch (i) { case 1: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep0_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep0_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep0_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1 break; case 2: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep1_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep1_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep1_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1 break; case 3: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep2_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep2_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep2_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1 break; case 4: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep3_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep3_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep3_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1 break; case 5: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep4_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep4_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep4_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1 break; case 6: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep5_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep5_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep5_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1 break; case 7: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep6_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep6_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep6_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1 break; case 8: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep7_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep7_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep7_Tolance_1, new object[] { item.Set_Error * 100 });//设定公差1 break; case 9: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep8_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep8_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep8_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 10: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep9_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep9_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep9_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 11: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep10_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep10_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep10_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 12: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep11_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep11_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep11_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 13: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep12_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep12_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep12_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 14: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep13_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep13_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep13_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 15: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep14_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep14_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep14_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 16: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep15_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep15_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep15_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 17: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep16_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep16_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep16_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 18: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep17_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep17_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep17_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 19: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep18_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep18_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep18_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 20: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep19_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep19_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep19_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; case 21: BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep20_MatCode_1, new object[] { item.MID }); // 物料名称 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep20_Set_1, new object[] { item.Set_Weight * 100 }); // 设定重量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_DosStep20_Tolance_1, new object[] { item.Set_Weight * 100 });//设定公差1 break; default: break; } if (i == 1) { BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_RecipeNo, new object[] { item.MID });//配方编码 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_reqSerial, new object[] { item.Plan_Serial }); // 设定批次 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_Total, new object[] { item.Total_Weight * 100 }); // 总重 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_startScale, new object[] { 1 }); // 启动称量 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_stopScale, new object[] { 1 }); // 停止称量 } i++; } return null; } #endregion /// /// 更新溶剂状态 /// public static void UpdatePlanData() { //状态:1,需要加料,2,称量完成;3,超差报警;4,存盘信号 int status = BasePlcHelper.Instance.solvent_State.NowValue.ToInt(); if (status == 4) { int matSerial = BasePlcHelper.Instance.solvent_MaterRowNum.NowValue.ToInt();//执行顺序 ReadMaterData(matSerial); } } /// /// 完成序号 /// /// public static void ReadMaterData(int serial) { string RMatCode = string.Empty; double RActWeight = 0.000; double RActTol = 0.000; var list = Product.PptPlan.PlanHelper.GetPlan(); if (list.Count == 0) return; int batch = BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt();//完成批次 for (int i = 1; i <= serial; i++) { var plan = list.SingleOrDefault(d => d.MID == i); switch (serial) { case 1: RMatCode = BasePlcHelper.Instance.solvent_SaveData0_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData0_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData0_RActTol_1.NowValue.ToDouble() / 100; break; case 2: RMatCode = BasePlcHelper.Instance.solvent_SaveData1_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData1_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData1_RActTol_1.NowValue.ToDouble() / 100; break; case 3: RMatCode = BasePlcHelper.Instance.solvent_SaveData2_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData2_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData2_RActTol_1.NowValue.ToDouble() / 100; break; case 4: RMatCode = BasePlcHelper.Instance.solvent_SaveData3_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData3_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData3_RActTol_1.NowValue.ToDouble() / 100; break; case 5: RMatCode = BasePlcHelper.Instance.solvent_SaveData4_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData4_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData4_RActTol_1.NowValue.ToDouble() / 100; break; case 6: RMatCode = BasePlcHelper.Instance.solvent_SaveData5_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData5_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData5_RActTol_1.NowValue.ToDouble() / 100; break; case 7: RMatCode = BasePlcHelper.Instance.solvent_SaveData6_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData6_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData6_RActTol_1.NowValue.ToDouble() / 100; break; case 8: RMatCode = BasePlcHelper.Instance.solvent_SaveData7_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData7_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData7_RActTol_1.NowValue.ToDouble() / 100; break; case 9: RMatCode = BasePlcHelper.Instance.solvent_SaveData8_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData8_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData8_RActTol_1.NowValue.ToDouble() / 100; break; case 10: RMatCode = BasePlcHelper.Instance.solvent_SaveData9_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData9_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData9_RActTol_1.NowValue.ToDouble() / 100; break; case 11: RMatCode = BasePlcHelper.Instance.solvent_SaveData10_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData10_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData10_RActTol_1.NowValue.ToDouble() / 100; break; case 12: RMatCode = BasePlcHelper.Instance.solvent_SaveData11_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData11_RActWeight_1.NowValue.ToInt() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData11_RActTol_1.NowValue.ToInt() / 100; break; case 13: RMatCode = BasePlcHelper.Instance.solvent_SaveData12_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData12_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData12_RActTol_1.NowValue.ToDouble() / 100; break; case 14: RMatCode = BasePlcHelper.Instance.solvent_SaveData13_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData13_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData13_RActTol_1.NowValue.ToDouble() / 100; break; case 15: RMatCode = BasePlcHelper.Instance.solvent_SaveData14_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData14_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData14_RActTol_1.NowValue.ToDouble() / 100; break; case 16: RMatCode = BasePlcHelper.Instance.solvent_SaveData15_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData15_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData16_RActTol_1.NowValue.ToDouble() / 100; break; case 17: RMatCode = BasePlcHelper.Instance.solvent_SaveData16_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData16_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData16_RActTol_1.NowValue.ToDouble() / 100; break; case 18: RMatCode = BasePlcHelper.Instance.solvent_SaveData17_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData17_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData17_RActTol_1.NowValue.ToDouble() / 100; break; case 19: RMatCode = BasePlcHelper.Instance.solvent_SaveData18_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData18_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData18_RActTol_1.NowValue.ToDouble() / 100; break; case 20: RMatCode = BasePlcHelper.Instance.solvent_SaveData19_RMatCode1.NowValue.ToString(); RActWeight = BasePlcHelper.Instance.solvent_SaveData19_RActWeight_1.NowValue.ToDouble() / 100; RActTol = BasePlcHelper.Instance.solvent_SaveData19_RActTol_1.NowValue.ToDouble() / 100; break; default: break; } bool result = SaveToHwPlan(plan, batch, RMatCode, RActWeight, RActTol); } var rtplan = list.Take(1).First(); //更新计划完成状态 if (BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt() == rtplan.Plan_Num) { PlanHelper.UpdatePlan(rtplan.Plan_Id, BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt(), 8, rtplan.Plan_TotalWeight, rtplan.Plan_TotalError); //完成后写入清空信号 BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_status, new object[] { 1 });//存盘以后置为1 需要加料 } else { PlanHelper.UpdateRealNum(rtplan.Plan_Id, BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt(), rtplan.Plan_TotalWeight, rtplan.Plan_TotalError); } } public static string GetExecMaterName() { string no = string.Empty;//物料名称 int matSerial = BasePlcHelper.Instance.solvent_MaterRowNum.NowValue.ToInt();//执行顺序 switch (matSerial) { case 1: no = BasePlcHelper.Instance.solvent_SaveData0_RMatCode1.NowValue.ToString(); break; case 2: no = BasePlcHelper.Instance.solvent_SaveData1_RMatCode1.NowValue.ToString(); break; case 3: no = BasePlcHelper.Instance.solvent_SaveData2_RMatCode1.NowValue.ToString(); break; case 4: no = BasePlcHelper.Instance.solvent_SaveData3_RMatCode1.NowValue.ToString(); break; case 5: no = BasePlcHelper.Instance.solvent_SaveData4_RMatCode1.NowValue.ToString(); break; case 6: no = BasePlcHelper.Instance.solvent_SaveData5_RMatCode1.NowValue.ToString(); break; case 7: no = BasePlcHelper.Instance.solvent_SaveData6_RMatCode1.NowValue.ToString(); break; case 8: no = BasePlcHelper.Instance.solvent_SaveData7_RMatCode1.NowValue.ToString(); break; case 9: no = BasePlcHelper.Instance.solvent_SaveData8_RMatCode1.NowValue.ToString(); break; case 10: no = BasePlcHelper.Instance.solvent_SaveData9_RMatCode1.NowValue.ToString(); break; case 11: no = BasePlcHelper.Instance.solvent_SaveData10_RMatCode1.NowValue.ToString(); break; case 12: no = BasePlcHelper.Instance.solvent_SaveData11_RMatCode1.NowValue.ToString(); break; case 13: no = BasePlcHelper.Instance.solvent_SaveData12_RMatCode1.NowValue.ToString(); break; case 14: no = BasePlcHelper.Instance.solvent_SaveData13_RMatCode1.NowValue.ToString(); break; case 15: no = BasePlcHelper.Instance.solvent_SaveData14_RMatCode1.NowValue.ToString(); break; case 16: no = BasePlcHelper.Instance.solvent_SaveData15_RMatCode1.NowValue.ToString(); break; case 17: no = BasePlcHelper.Instance.solvent_SaveData16_RMatCode1.NowValue.ToString(); break; case 18: no = BasePlcHelper.Instance.solvent_SaveData17_RMatCode1.NowValue.ToString(); break; case 19: no = BasePlcHelper.Instance.solvent_SaveData18_RMatCode1.NowValue.ToString(); break; case 20: no = BasePlcHelper.Instance.solvent_SaveData19_RMatCode1.NowValue.ToString(); break; default: break; } return no; } /// /// 已完成重量 /// /// public static double GetExecMaterWeight() { double weight = 0.000; int matSerial = BasePlcHelper.Instance.solvent_MaterRowNum.NowValue.ToInt();//执行顺序 for (int i = 1; i <= matSerial; i++) { switch (matSerial) { case 1: weight = BasePlcHelper.Instance.solvent_SaveData0_RActWeight_1.NowValue.ToDouble(); break; case 2: weight = BasePlcHelper.Instance.solvent_SaveData1_RActWeight_1.NowValue.ToDouble(); break; case 3: weight = BasePlcHelper.Instance.solvent_SaveData2_RActWeight_1.NowValue.ToDouble(); break; case 4: weight = BasePlcHelper.Instance.solvent_SaveData3_RActWeight_1.NowValue.ToDouble(); break; case 5: weight = BasePlcHelper.Instance.solvent_SaveData4_RActWeight_1.NowValue.ToDouble(); break; case 6: weight = BasePlcHelper.Instance.solvent_SaveData5_RActWeight_1.NowValue.ToDouble(); break; case 7: weight = BasePlcHelper.Instance.solvent_SaveData6_RActWeight_1.NowValue.ToDouble(); break; case 8: weight = BasePlcHelper.Instance.solvent_SaveData7_RActWeight_1.NowValue.ToDouble(); break; case 9: weight = BasePlcHelper.Instance.solvent_SaveData8_RActWeight_1.NowValue.ToDouble(); break; case 10: weight = BasePlcHelper.Instance.solvent_SaveData9_RActWeight_1.NowValue.ToDouble(); break; case 11: weight = BasePlcHelper.Instance.solvent_SaveData10_RActWeight_1.NowValue.ToDouble(); break; case 12: weight = BasePlcHelper.Instance.solvent_SaveData11_RActWeight_1.NowValue.ToDouble(); break; case 13: weight = BasePlcHelper.Instance.solvent_SaveData12_RActWeight_1.NowValue.ToDouble(); break; case 14: weight = BasePlcHelper.Instance.solvent_SaveData13_RActWeight_1.NowValue.ToDouble(); break; case 15: weight = BasePlcHelper.Instance.solvent_SaveData14_RActWeight_1.NowValue.ToDouble(); break; case 16: weight = BasePlcHelper.Instance.solvent_SaveData15_RActWeight_1.NowValue.ToDouble(); break; case 17: weight = BasePlcHelper.Instance.solvent_SaveData16_RActWeight_1.NowValue.ToDouble(); break; case 18: weight = BasePlcHelper.Instance.solvent_SaveData17_RActWeight_1.NowValue.ToDouble(); break; case 19: weight = BasePlcHelper.Instance.solvent_SaveData18_RActWeight_1.NowValue.ToDouble(); break; case 20: weight = BasePlcHelper.Instance.solvent_SaveData19_RActWeight_1.NowValue.ToDouble(); break; default: break; } weight += weight; } return weight; } /// /// 初始化扫码设备 采用COM连接 /// public static void InitScanCode() { if (!flag1) { string COM1 = "COM3"; ScanControl scnew = new ScanControl(); scnew.InstanceSerialPort3(COM1); flag1 = true; } //if (!flag2) //{ // string COM2 = "COM5"; // ScanControl scnew2 = new ScanControl(); // scnew2.InstanceSerialPort5(COM2); // flag2 = true; //} } /// /// 小料扫码 /// public static void XlScanCode() { string scan = ScanControl.scanStr; if (!string.IsNullOrEmpty(scan)) { for (int i = 1; i <= 15; i++) { switch (i) { case 1: int scan1 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 2: int scan2 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 3: int scan3 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 4: int scan4 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 5: int scan5 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 6: int scan6 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 7: int scan7 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 8: int scan8 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 9: int scan9 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 10: int scan10 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 11: int scan11 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 12: int scan12 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 13: int scan13 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 14: int scan14 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 15: int scan15 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; default: break; } } } } /// /// 溶剂投料扫码 /// public static void RjScanCode() { string scan = ScanControl.scanStr; for (int i = 1; i <= 20; i++) { switch (i) { case 1: int scan1 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 if (scan1 == 1) { BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_Set_station_U1_barcode, new object[] { 1 });//0、未扫描、1、匹配;2、报警 } break; case 2: int scan2 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 3: int scan3 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 4: int scan4 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 5: int scan5 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 6: int scan6 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 7: int scan7 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 8: int scan8 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 9: int scan9 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 10: int scan10 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 11: int scan11 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 12: int scan12 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 13: int scan13 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 14: int scan14 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; case 15: int scan15 = BasePlcHelper.Instance.solvent_Set_status_U0_stationStatus.NowValue.ToInt();//扫码求情 break; default: break; } } } public static bool SaveToHwPlan(MetagePlan item, int batch, string RMatCode, double realWeight, double realError) { try { bool addPlan = false; bool addWeigh = false; Hw_plan plan = SolventDBHelper.GetRtPlan(item.Plan_Id, batch); if (plan != null) { double totalWeight = plan.Total_Weight + realWeight; double totalError = plan.Total_Error + realError; //保存物料 Hw_weigh weigh = new Hw_weigh(); weigh.Dosing_ID = plan.Dosing_Id; weigh.Plan_ID = item.Plan_Id; weigh.Recipe_ID = item.Recipe_ID; weigh.Material_ID = item.MaterialID; weigh.Material_Name = item.Material_name; weigh.Set_Weight = item.Set_Weight; weigh.Set_Error = item.Set_Error; weigh.Real_Weight = realWeight; weigh.Real_Error = realError; addPlan = SolventDBHelper.UpdateHwPlan(item.Plan_Id, totalWeight, totalError); addWeigh = SolventDBHelper.AddHwWeigh(weigh); if (addPlan && addWeigh) { return true; } else { return false; } } else { //保存计划 Hw_plan hwPlan = new Hw_plan(); hwPlan.Plan_Id = item.Plan_Id; hwPlan.Plan_Serial = item.Plan_Serial; hwPlan.Recipe_ID = item.Recipe_ID; hwPlan.Recipe_Name = item.Recipe_Name; hwPlan.Version = item.Version; hwPlan.Plan_Num = item.Plan_Num; hwPlan.Real_Num = BasePlcHelper.Instance.plt_Station1_Batch.NowValue.ToInt(); hwPlan.Shift_Id = item.Shift_Id; hwPlan.Shift_Class = item.Shift_Class; hwPlan.Total_Weight = realWeight; hwPlan.Total_Error = realError; hwPlan.IsRetransmission = item.IsRetransmission; hwPlan.Retransmission_Num = item.Retransmission_Num; //保存物料 Hw_weigh weigh = new Hw_weigh(); weigh.Plan_ID = item.Plan_Id; weigh.Recipe_ID = item.Recipe_ID; weigh.Material_ID = item.MaterialID; weigh.Material_Name = item.Material_name; weigh.Set_Weight = item.Set_Weight; weigh.Set_Error = item.Set_Error; weigh.Real_Weight = realWeight; weigh.Real_Error = realError; addPlan = SolventDBHelper.AddHwPlan(hwPlan); addWeigh = SolventDBHelper.AddHwWeigh(weigh); if (addPlan && addWeigh) { return true; } else { return false; } } } catch (Exception) { return false; } } #region 设置配方 PLC点位信息 /// /// 重传配方设置数量 /// /// 计划列表 /// 是否设置成功 public static bool ReloadPlanToPlc(int num) { string msg = string.Empty; try { if (BasePlcHelper.Instance.solvent_finishedNum.NowValue.ToInt() < num) { BasePlcHelper.Instance.PlcWriteByDataKey(BasePlcHelper.Instance.solvent_reqSerial, new object[] { num });//设定执行数量 return true; } else { return false; } } catch (Exception ex) { return false; } } #endregion #endregion } }