using HighWayIot.Log4net; using HighWayIot.Plc; using HighWayIot.Plc.PlcHelper; using HighWayIot.Repository.domain; using HighWayIot.Repository.service; using Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml.Schema; using Timer = System.Threading.Timer; namespace HighWayIot.Winform.Business { /// /// 排程信号业务类 /// public class RecipeSendBusiness { private Timer GetSchedulingTimer; private RecipeSignal recipeSignal = new RecipeSignal(); private ZxSchedulingService zxSchedulingService = ZxSchedulingService.Instance; private ZxRecipeParaService zxRecipeParaService = ZxRecipeParaService.Instance; private ZxRecipePositionParaService zxRecipePositionParaService = ZxRecipePositionParaService.Instance; private RecipeParaHelper recipeParaHelper = new RecipeParaHelper(); public static bool RecipeSendMode = false; public static string NowRecipeCode = string.Empty; public static string NowDeviceNo = string.Empty; public RecipeSendBusiness() { GetSchedulingTimer = new Timer(new System.Threading.TimerCallback(ReadSignal), null, 0, 1500); } /// /// 重复读取 /// /// public void ReadSignal(object o) { //读取是True的点位 Dictionary a = recipeSignal.ReadSchedulingSignal(); if (a == null) { return; } int destinationVulcanizationNo; var ares = a.Where(x => x.Value == true).ToList(); if (ares.Count == 1) { destinationVulcanizationNo = ares[0].Key; } else { if (ares.Count > 1) { LogHelper.Instance.Error($"排程信号True值不唯一 {string.Join(", ", ares.Select(x => x.Key).ToList())}"); } return; } if (RecipeSendMode) //通过MES下配方 { //读同步数据库,找到等于0的 List transferEntity = ZxMesPlanTransferService.Instance.GetRecipeInfos(x => x.RequestFlag == false).ToList(); if (transferEntity.Count > 1) { LogHelper.Instance.Error($"标识同步数据不唯一,请检查数据库,当前数量:{transferEntity.Count}"); return; } if (transferEntity.Count == 0) { LogHelper.Instance.Error("配方下发请求不存在,请检查数据库"); return; } //同步到配方(配方和称量,如果是新的加字段) //////////////////////////////更新配方表///////////////////////////////// //var newEneitys = RecipeLists.Where(x => x.RecipeCode == newRecipes.RecipeCode).ToList(); //if (newEneitys.Count > 0) //有就更新 //{ // //配方 // newEneitys[0].RecipeSpecCode = newRecipes.SpecCode; // newEneitys[0].RecipeSpecName = newRecipes.SpecName; // newEneitys[0].SizeKind = newRecipes.RimInch; // newEneitys[0].FixedWidth = newRecipes.FixRubWidth; // if (!zxRecipeService.UpdateRecipeInfo(newEneitys[0])) // { // return; // } //} //else //没有就插入 //{ // ZxRecipeEntity entity = new ZxRecipeEntity() // { // RecipeName = newRecipes.RecipeName, // RecipeCode = newRecipes.RecipeCode, // RecipeSpecCode = newRecipes.SpecCode, // RecipeSpecName = newRecipes.SpecName, // SizeKind = newRecipes.RimInch, // FixedWidth = newRecipes.FixRubWidth, // IsUse = true, // IsDeleted = false, // }; // zxRecipeService.InsertRecipeInfo(entity); //} //同步到对应硫化排程的界面 //后续流程相同 } else //手动下配方 { var schedulingInfo = zxSchedulingService.GetSchedulingInfo(); string recipeNo; ZxRecipeParaEntity recipeParaInfo; List zxRecipePositionParaEntities; if ((destinationVulcanizationNo + 1) <= 62) { recipeNo = schedulingInfo.Single(x => x.Id == destinationVulcanizationNo + 1).RecipeCode1; recipeParaInfo = zxRecipeParaService.GetRecipeParaInfoByRecipeCode(recipeNo).FirstOrDefault(); zxRecipePositionParaEntities = zxRecipePositionParaService.GetRecipePositionParaInfos(x => x.RecipeCode == recipeNo); if (recipeParaInfo == null) { LogHelper.Instance.Error("配方信息获取失败,请检查所选机台是否配置了相应配方"); return; } if (recipeParaHelper.UploadToPLC(recipeParaInfo, zxRecipePositionParaEntities)) { //PlcConnect.PlcWrite2($"B{(destinationVulcanizationNo + 0x901).ToString("X")}", false, DataTypeEnum.Bool); int deviceNo = schedulingInfo.Single(x => x.Id == destinationVulcanizationNo + 1).DeviceNo ?? 0; //MonitorInsert(recipeNo, $"{deviceNo}上模"); LogHelper.Instance.Info($"配方上传成功,配方号:{recipeNo},模具号:{deviceNo}上模"); NowRecipeCode = recipeNo; NowDeviceNo = deviceNo + "-2"; } else { LogHelper.Instance.Error("配方上传失败,检查PLC连接"); return; } } else { recipeNo = schedulingInfo.Single(x => x.Id == destinationVulcanizationNo + 1 - 62).RecipeCode2; recipeParaInfo = zxRecipeParaService.GetRecipeParaInfoByRecipeCode(recipeNo).FirstOrDefault(); zxRecipePositionParaEntities = zxRecipePositionParaService.GetRecipePositionParaInfos(x => x.RecipeCode == recipeNo); if (recipeParaInfo == null) { LogHelper.Instance.Error("配方信息获取失败,请检查所选机台是否配置了相应配方"); return; } if (recipeParaHelper.UploadToPLC(recipeParaInfo, zxRecipePositionParaEntities)) { //PlcConnect.PlcWrite2($"B{(destinationVulcanizationNo - 62 + 0x941).ToString("X")}", false, DataTypeEnum.Bool); int deviceNo = schedulingInfo.Single(x => x.Id == destinationVulcanizationNo + 1 - 62).DeviceNo ?? 0; //MonitorInsert(recipeNo, $"{deviceNo}下模"); LogHelper.Instance.Info($"配方上传成功,配方号:{recipeNo},模具号:{deviceNo}下模"); NowRecipeCode = recipeNo; NowDeviceNo = deviceNo + "-1"; } else { LogHelper.Instance.Error("配方上传失败,检查PLC连接"); return; } } } } } }