using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Plc; using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; using Masuit.Tools; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Khd.Core.Wcs.Wcs { public class SystemTimer { private readonly IHost host; private Plc.S7.Plc Plc30 = StaticData.PlcDic[0]; private Plc.S7.Plc Plc31 = StaticData.PlcDic[0]; private Plc.S7.Plc Plc220 = StaticData.PlcDic[2]; public SystemTimer(IHost host) { this.host = host; } public void Start() { Thread messageSynchronousThread = new(MessageSynchronousLogic); messageSynchronousThread.Start(); Thread baseEquipThread = new Thread(BaseEquipLogic); baseEquipThread.Start(); } private void BaseEquipLogic(object? obj) { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); List updateEquips = dbContext.BaseEquip.Where(t => t.remark == "99").ToList(); if (updateEquips.Count > 0) { foreach (var equip in updateEquips) { equip.remark = "0"; dbContext.BaseEquip.Update(equip); dbContext.SaveChanges(); } StaticData.BaseEquip = dbContext.BaseEquip.ToList(); } } catch { } Thread.Sleep(5000); } } private void MessageSynchronousLogic(object? obj) { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); HositerLogic(); CtuLineLogic(); ThirdAgvLogic(dbContext); SecondAgvLogic(dbContext); FiveAgvLogic(dbContext); FiveBearAgvLogic(dbContext); CtuCmdLogic(dbContext); } catch (Exception ex) { try { if (ex is PlcException) { foreach (var item in StaticData.PlcDic) { if (item.Value.IP == ex.Message) { StaticData.PlcDic[item.Key] = new Plc.S7.Plc(item.Value.CPU, item.Value.IP, item.Value.Port, item.Value.Rack, item.Value.Slot); StaticData.PlcDic[item.Key].Open(); } } } } catch { } } Thread.Sleep(5000); } private void ThirdAgvLogic(DefaultDbContext dbContext) { var baseEquip = StaticData.BaseEquip.First(t => t.objid == 9); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "3楼AGV").ToList(); var data = new { reqCode = StaticData.SnowId.NextId(), mapCode = "BB" }; string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString()); var reponse = JsonConvert.DeserializeObject(result); if (reponse != null && reponse.code == "0") { cardStatus cardStatus = reponse.data.First(t => t.robotCode == "2032"); var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type); var XPlc = basePlcs.First(t => t.Name.Contains('X')); var Ylc = basePlcs.First(t => t.Name.Contains('Y')); this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type); this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type); } } private void SecondAgvLogic(DefaultDbContext dbContext) { var baseEquip = StaticData.BaseEquip.First(t => t.objid == 8); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "2楼AGV").ToList(); var data = new { reqCode = StaticData.SnowId.NextId(), mapCode = "CC" }; string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString()); var reponse = JsonConvert.DeserializeObject(result); if (reponse != null && reponse.code == "0") { cardStatus cardStatus = reponse.data.First(t => t.robotCode == "2033"); var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type); var XPlc = basePlcs.First(t => t.Name.Contains('X')); var Ylc = basePlcs.First(t => t.Name.Contains('Y')); this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type); this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type); } } private void FiveAgvLogic(DefaultDbContext dbContext) { var baseEquip = StaticData.BaseEquip.First(t => t.objid == 10); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼AGV").ToList(); List type = new List() { 27, 28, 34, 35, 37, 38, 46, 47 }; var wcsCmds = dbContext.WcsCmd.Where(t => type.Contains(t.cmdType)).ToList(); if (wcsCmds.Count > 0) { WcsCmd wcsCmd = wcsCmds.First(); var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First(); Plc220.WriteToPoint(endPlc.Address, wcsCmd.nextPointId.ToString(), endPlc.type); var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); Plc220.WriteToPoint(startPlc.Address, wcsCmd.currPointId.ToString(), startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); string cmdType = StaticData.BaseDictionary.First(t => t.objid == wcsCmd.cmdType).ToPlc; Plc220.WriteToPoint(cmdPlc.Address, cmdType, cmdPlc.type); } else { var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First(); this.Plc220.WriteToPoint(endPlc.Address, "0", endPlc.type); var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); Plc220.WriteToPoint(startPlc.Address, "0", startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); Plc220.WriteToPoint(cmdPlc.Address, "0", cmdPlc.type); } var data = new { reqCode = StaticData.SnowId.NextId(), mapCode = "EE" }; string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString()); var reponse = JsonConvert.DeserializeObject(result); if (reponse != null && reponse.code == "0") { cardStatus cardStatus = reponse.data.First(t => t.robotCode == "2034"); var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type); var XPlc = basePlcs.First(t => t.Name.Contains('X')); var Ylc = basePlcs.First(t => t.Name.Contains('Y')); this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type); this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type); cardStatus = reponse.data.First(t => t.robotCode == "6011"); quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type); XPlc = basePlcs.First(t => t.Name.Contains('X')); Ylc = basePlcs.First(t => t.Name.Contains('Y')); this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type); this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type); cardStatus = reponse.data.First(t => t.robotCode == "8161"); quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type); XPlc = basePlcs.First(t => t.Name.Contains("X")); Ylc = basePlcs.First(t => t.Name.Contains("Y")); this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type); this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type); } } private void FiveBearAgvLogic(DefaultDbContext dbContext) { var baseEquip = StaticData.BaseEquip.First(t => t.objid == 10); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼背负式").ToList(); var wcsCmds = dbContext.WcsCmd.Where(t => t.cmdType == 32 || t.cmdType == 48).ToList(); if (wcsCmds.Count > 0) { WcsCmd wcsCmd = wcsCmds.First(); var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First(); Plc220.WriteToPoint(endPlc.Address, wcsCmd.nextPointId.ToString(), endPlc.type); var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); Plc220.WriteToPoint(startPlc.Address, wcsCmd.currPointId.ToString(), startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); string cmdType = StaticData.BaseDictionary.First(t => t.objid == wcsCmd.cmdType).ToPlc; Plc220.WriteToPoint(cmdPlc.Address, cmdType, cmdPlc.type); } else { var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First(); this.Plc220.WriteToPoint(endPlc.Address, "0", endPlc.type); var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); Plc220.WriteToPoint(startPlc.Address, "0", startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); Plc220.WriteToPoint(cmdPlc.Address, "0", cmdPlc.type); } } private void CtuCmdLogic(DefaultDbContext dbContext) { var baseEquip = StaticData.BaseEquip.First(t => t.objid == 11); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼CTU").ToList(); var wcsCmds = dbContext.WcsCmd.Where(t => t.cmdType == 29 || t.cmdType == 30 || t.cmdType == 31).ToList(); if (wcsCmds.Count > 0) { var wcsCmd = wcsCmds.First(); List startList = new List(); List endList = new List(); if (wcsCmd.cmdType != 30) { startList.Add(wcsCmd.currPointId); endList.AddRange(wcsCmds.Select(t => t.nextPointId).ToList()); } else { startList.Add(wcsCmd.nextPointId); endList.AddRange(wcsCmds.Select(t => t.currPointId).ToList()); } while (endList.Count < 6) { endList.Add(0); } var endPlcs = basePlcs.Where(t => t.Name.Contains("目的地")).OrderBy(t => t.Name).ToList(); for (int i = 0; i < endPlcs.Count; i++) { this.Plc220.WriteToPoint(endPlcs[i].Address, endList[i].ToString(), endPlcs[i].type); } var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); Plc220.WriteToPoint(startPlc.Address, wcsCmd.currPointId.ToString(), startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); string cmdType = StaticData.BaseDictionary.First(t => t.objid == wcsCmd.cmdType).ToPlc; Plc220.WriteToPoint(cmdPlc.Address, cmdType, cmdPlc.type); } else { var endPlcs = basePlcs.Where(t => t.Name.Contains("目的地")).OrderBy(t => t.Name).ToList(); for (int i = 0; i < endPlcs.Count; i++) { this.Plc220.WriteToPoint(endPlcs[i].Address, "0", endPlcs[i].type); } var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); Plc220.WriteToPoint(startPlc.Address, "0", startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); Plc220.WriteToPoint(cmdPlc.Address, "0", cmdPlc.type); } } private void CtuLineLogic() { var basePlcpoints = StaticData.BasePlcpointList.ToList(); var basePlcs = StaticData.basePlcs.ToList(); var bill = from a in basePlcpoints from b in basePlcs where a.plcpointNo == b.Name && b.Station == "U型线" select new { a, b }; foreach (var item in bill) { if (item.a.plcpointNo.Contains("RFID")) { string? rfid = Plc31.ReadRFID(item.a.plcpointAddress); if (!string.IsNullOrEmpty(rfid)) { rfid = rfid[(rfid.IndexOf("C") + 1)..]; Plc220.WriteToPoint(item.b.Address, rfid, item.b.type); } else { Plc220.WriteToPoint(item.b.Address, "0", item.b.type); } } else { var value = Plc31.Read(item.a.plcpointAddress); if (value != null && !string.IsNullOrEmpty(value.ToString())) { Plc220.WriteToPoint(item.b.Address, value.ToString(), item.b.type); } else { Plc220.WriteToPoint(item.b.Address, "0", item.b.type); } } } } /// /// 提升机和接驳位信息同步 /// private void HositerLogic() { var basePlcpoints = StaticData.BasePlcpointList.ToList(); var basePlcs = StaticData.basePlcs.ToList(); var bill = from a in basePlcpoints from b in basePlcs where a.plcpointNo == b.Name && b.Station != "U型线" select new { a, b }; foreach (var item in bill) { if (item.a.plcpointNo.Contains("RFID")) { string? rfid = Plc30.ReadRFID(item.a.plcpointAddress); if (!string.IsNullOrEmpty(rfid)) { rfid = rfid[(rfid.IndexOf("JYHB") + 4)..]; Plc220.WriteToPoint(item.b.Address, rfid, item.b.type); } else { Plc220.WriteToPoint(item.b.Address, "0", item.b.type); } } else { var value = Plc30.Read(item.a.plcpointAddress); if (value != null && !string.IsNullOrEmpty(value.ToString())) { Plc220.WriteToPoint(item.b.Address, value.ToString(), item.b.type); } else { Plc220.WriteToPoint(item.b.Address, "0", item.b.type); } } } } } }