using AngleSharp.Common; using Khd.Core.Domain.Dto; using Khd.Core.Domain.Dto.waring; using Khd.Core.Domain.Dto.webapi; using Khd.Core.Domain.Models; using Khd.Core.EntityFramework; using Khd.Core.Library; using Khd.Core.Library.Mapper; using Khd.Core.Plc.S7; using Khd.Core.Wcs.Global; using Masuit.Tools; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Newtonsoft.Json; using Z.EntityFramework.Plus; namespace Khd.Core.Wcs.Wcs { public class SystemTimer { private readonly LoggerUtils _logger = new(); private readonly IHost host; public SystemTimer(IHost host) { this.host = host; } public void Start() { var messageSynchronousThread = new Thread(MessageSynchronousLogic) { Name = "MessageSynchronousThread", IsBackground = true }; messageSynchronousThread.Start();//陈工设备信息推送 var PlcHeartBeat30Thread = new Thread(PlcHeartBeat30Logic) { Name = "PlcHeartBeat30Thread", IsBackground = true }; PlcHeartBeat30Thread.Start();//脉冲 var PlcHeartBeat31Thread = new Thread(PlcHeartBeat31Logic) { Name = "PlcHeartBeat31Thread", IsBackground = true }; PlcHeartBeat31Thread.Start();//脉冲 var PlcHearBeat220Thread = new Thread(PlcHearBeat220Logic) { Name = "PlcHeartBeat220Thread", IsBackground = true }; PlcHearBeat220Thread.Start(); var deleteTaskThread = new Thread(DeleteTaskLogic) { Name = "DeleteTaskThread", IsBackground = true }; deleteTaskThread.Start(); var deleteLogsThread = new Thread(DeleteLogsLogic) { Name = "DeleteLogsThread", IsBackground = true }; deleteLogsThread.Start(); //var AgvAlarmThread = new Thread(AgvAlarmLogic) //{ // Name = "AgvAlarmThread", // IsBackground = true //}; //AgvAlarmThread.Start(); var locationThread = new Thread(LocationLogic) { Name = "LocationThread", IsBackground = true }; locationThread.Start(); Console.WriteLine($"{DateTime.Now}: SystemTimer started"); } private void LocationLogic() { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); List basePlcs = dbContext.BasePlc.Where(t => t.Station.Contains("库位")).ToList(); StaticData.LocationToPlcList = basePlcs.Select(t => new { t.Id, Station = t.Station.Replace("库位", ""), t.Address, locRow = t.Name.Substring(t.Name.IndexOf('[') + 1, 1), locColumn = t.Name.Substring(t.Name.IndexOf(',') + 1).Replace("]", "").Replace("五楼半成品[", ""), }).Select(t => new LocationPlcDto { Id = t.Id, Station = t.Station, Address = t.Address, locRow = t.locRow, locColumn = t.locColumn.Substring(0, t.locColumn.IndexOf(',') == -1 ? t.locColumn.Length : t.locColumn.IndexOf(',')), layerNum = t.locColumn.IndexOf(',') == -1 ? "1" : t.locColumn.Substring(t.locColumn.IndexOf(',') == -1 ? 0 : t.locColumn.IndexOf(',') + 1) }); while (true) { try { var locations = dbContext.WmsBaseLocation.OrderBy(t => t.locRow).OrderBy(t => t.locColumn).ToList(); foreach (var item in StaticData.LocationToPlcList) { WmsBaseLocation? wmsBaseLocation = locations.Where(t => t.locRow.ToString() == item.locRow) .Where(t => t.locColumn.ToString() == item.locColumn) .Where(t => t.layerNum.ToString() == item.layerNum) .Where(t => t.warehouseId.ToString() == item.Station) .FirstOrDefault(); if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode)) { if (wmsBaseLocation.warehouseId == 512) { if (wmsBaseLocation.ContainerStatus == "1") { StaticData.PlcDic[2].Write(item.Address, true); } else { StaticData.PlcDic[2].Write(item.Address, false); } } else { StaticData.PlcDic[2].Write(item.Address, true); } } else { StaticData.PlcDic[2].Write(item.Address, false); } } } catch { } Thread.Sleep(1000 * 60 * 5); } } private void AgvAlarmLogic() { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { using var transaction = dbContext.Database.BeginTransaction(); try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var dmsBaseDeviceLedgers = dbContext.DmsBaseDeviceLedger.ToList(); var wcsAgvStatuses = dbContext.WcsAgvStatus.ToList(); var agvStatus = from a in dmsBaseDeviceLedgers from b in wcsAgvStatuses where a.DeviceCode == b.RobotCode select new { a.DeviceId, b.Online, b.Status }; foreach (var item in agvStatus) { //var dmsBaseAlarmRule = StaticData.DmsBaseAlarmRuleList.Where(t => t.Status == item.Status).FirstOrDefault(); var dmsBaseAlarmRule = StaticData.DmsBaseAlarmRuleList.FirstOrDefault(); if (dmsBaseAlarmRule != null) { DmsRecordAlarmTime alarmTime = new DmsRecordAlarmTime { AlarmBeginTime = DateTime.Now, AlarmReason = dmsBaseAlarmRule.AlarmReason, HandleSuggest = dmsBaseAlarmRule.HandleSuggest, AlarmRuleId = dmsBaseAlarmRule.AlarmRuleId, ContinueTime = dmsBaseAlarmRule.ContinueTime, CreateBy = "WCS", CreateTime = DateTime.Now, DeviceId = item.DeviceId, }; var dmsRecordAlarmInfo = CoreMapper.Map(alarmTime); dmsRecordAlarmInfo.AlarmStatus = "0"; dmsRecordAlarmInfo.NoticeStatus = "0"; dbContext.Add(dmsRecordAlarmInfo); dbContext.SaveChanges(); transaction.Commit(); } else { var alarmTime = dbContext.DmsRecordAlarmTime .Where(t => t.CreateBy == "WCS") .Where(t => t.DeviceId == item.DeviceId) .FirstOrDefault(); if (alarmTime != null) { dbContext.Remove(alarmTime); dbContext.DmsRecordAlarmInfo .Where(t => t.AlarmId == alarmTime.AlarmId) .Update(t => new DmsRecordAlarmInfo { AlarmEndTime = DateTime.Now, UpdateBy = "WCS", UpdateTime = DateTime.Now }); dbContext.SaveChanges(); transaction.Commit(); } } } } catch { try { transaction.Rollback(); } catch { } } Thread.Sleep(3000); } } /// /// 定时清除日志文件 /// private void DeleteLogsLogic() { while (true) { try { //获取当前程序运行目录下的logs文件夹 string logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs"); string[] strings = Directory.GetDirectories(logPath); foreach (string s in strings) { string? dirName = Path.GetFileName(s); if (dirName != null) { if (DateTime.TryParse(dirName, out DateTime dt)) { if (dt < DateTime.Now.AddDays(-StaticData.DeleteLogDay)) { Directory.Delete(s, true); _logger.Info($"日志{dirName}已删除"); } } } } } catch { } Thread.Sleep(1000 * 60 * 60 * 23); } } /// /// 删除任务 /// private void DeleteTaskLogic() { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); while (true) { try { dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); List wcsTasks = dbContext.WcsTask.Where(t => t.IsDelete == 1).ToList(); foreach (var item in wcsTasks) { BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == item.nextPointId); if (!string.IsNullOrEmpty(item.taskCode) && !string.IsNullOrEmpty(agvEquip.serverIp)) { if (item.endPointId == 11) { dbContext.WcsTask.Remove(item); if (item.taskStatus == 6) { dbContext.SaveChanges(); } else { var cancelTask = new { reqCode = StaticData.SnowId.NextId().ToString(), taskCode = item.taskCode }; string reponse = HttpHelper.SendPostMessage(agvEquip.serverIp, agvEquip.serverPort.Value, "rcms/services/rest/hikRpcService/cancelTask", cancelTask.ToJsonString()); var result = JsonConvert.DeserializeObject(reponse); if (result != null && result.code == "0") { dbContext.SaveChanges(); _logger.Info($"任务{item.taskCode}已删除"); } else { _logger.Error($"任务{item.taskCode}删除失败,原因:{result?.message}"); } } } else { dbContext.WcsTask.Remove(item); var cancelTask = new { reqCode = StaticData.SnowId.NextId().ToString(), taskCode = item.taskCode }; string reponse = HttpHelper.SendPostMessage(agvEquip.serverIp, agvEquip.serverPort.Value, "rcms/services/rest/hikRpcService/cancelTask", cancelTask.ToJsonString()); var result = JsonConvert.DeserializeObject(reponse); if (result != null && result.code == "0") { dbContext.SaveChanges(); _logger.Info($"任务{item.taskCode}已删除"); } else { _logger.Error($"任务{item.taskCode}删除失败,原因:{result?.message}"); } } } else { dbContext.WcsTask.Remove(item); dbContext.SaveChanges(); _logger.Info($"任务{item.objid}已删除"); } } } catch { } Thread.Sleep(1000); } } /// /// 定时发送心跳包 /// private void PlcHearBeat220Logic() { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BasePlcpoint HeartBeat30 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "putTray"); int errorCount = 0; bool isOver = false; while (true) { try { if (errorCount > 3) { _logger.Error($"Plc220短线重连失败超过{errorCount}次"); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); SystemData.InsertWaringLog(dbContext, WaringType.设备Plc通讯异常, $"Plc220短线重连失败超过{errorCount}次"); //var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 15).FirstOrDefault(); //if (dmsRecordAlarmTime == null) //{ // var alarmTime = new DmsRecordAlarmTime // { // DeviceId = 15, // AlarmBeginTime = DateTime.Now, // AlarmReason = "Plc220短线重连失败", // HandleSuggest = "检查Plc220网络连接", // AlarmRuleId = 4, // ContinueTime = 10000, // CreateBy = "WCS", // CreateTime = DateTime.Now, // }; // var dmsRecordAlarmInfo = CoreMapper.Map(alarmTime); // dmsRecordAlarmInfo.AlarmStatus = "0"; // dmsRecordAlarmInfo.NoticeStatus = "0"; // dbContext.Add(dmsRecordAlarmInfo); // dbContext.SaveChanges(); //} } StaticData.PlcDic[2].Read(HeartBeat30.plcpointAddress); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); SystemData.DeleteWaringLog(dbContext, WaringType.设备Plc通讯异常); } catch { try { StaticData.PlcDic[2] = new Plc.S7.Plc(StaticData.PlcDic[2].CPU, StaticData.PlcDic[2].IP, StaticData.PlcDic[2].Port, StaticData.PlcDic[2].Rack, StaticData.PlcDic[2].Slot); StaticData.PlcDic[2].Open(); isOver = true; } catch (Exception ex2) { errorCount++; isOver = false; _logger.Error("Plc短线重连失败" + ex2.Message); } } Thread.Sleep(1000); } } /// /// 定时发送心跳包 /// private void PlcHeartBeat30Logic() { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BasePlcpoint HeartBeat30 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "HeartBeat30"); bool heartBeatCount = false; bool isOver = false; int errorCount = 0; while (true) { try { if (errorCount > 3) { _logger.Error($"Plc30短线重连失败超过{errorCount}次"); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); SystemData.InsertWaringLog(dbContext, WaringType.提升机Plc通讯异常, $"Plc30短线重连失败超过{errorCount}次"); //var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 13).FirstOrDefault(); //if (dmsRecordAlarmTime == null) //{ // var alarmTime = new DmsRecordAlarmTime // { // DeviceId = 13, // AlarmBeginTime = DateTime.Now, // AlarmReason = "Plc30短线重连失败", // HandleSuggest = "检查Plc30网络连接", // AlarmRuleId = 4, // ContinueTime = 10000, // CreateBy = "WCS", // CreateTime = DateTime.Now, // }; // var dmsRecordAlarmInfo = CoreMapper.Map(alarmTime); // dmsRecordAlarmInfo.AlarmStatus = "0"; // dmsRecordAlarmInfo.NoticeStatus = "0"; // dbContext.Add(dmsRecordAlarmTime); // dbContext.Add(dmsRecordAlarmInfo); // dbContext.SaveChanges(); //} } heartBeatCount = !heartBeatCount; StaticData.PlcDic[0].WriteToPoint(HeartBeat30.plcpointAddress, heartBeatCount, HeartBeat30.plcpointLength?.ToString()); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); SystemData.DeleteWaringLog(dbContext, WaringType.提升机Plc通讯异常); } catch { try { StaticData.PlcDic[0] = new Plc.S7.Plc(StaticData.PlcDic[0].CPU, StaticData.PlcDic[0].IP, StaticData.PlcDic[0].Port, StaticData.PlcDic[0].Rack, StaticData.PlcDic[0].Slot); StaticData.PlcDic[0].Open(); isOver = true; } catch (Exception ex2) { errorCount++; isOver = false; _logger.Error("Plc短线重连失败" + ex2.Message); } } Thread.Sleep(1000); } } /// /// 定时发送心跳包 /// private void PlcHeartBeat31Logic() { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BasePlcpoint HeartBeat31 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTUHeart"); bool heartBeatCount = false; bool isOver = false; int errorCount = 0; while (true) { try { if (errorCount > 3) { _logger.Error($"Plc31短线重连失败超过{errorCount}次"); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); SystemData.InsertWaringLog(dbContext, WaringType.U型线Plc通讯异常, $"Plc31短线重连失败超过{errorCount}次"); //var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 14).FirstOrDefault(); //if (dmsRecordAlarmTime == null) //{ // var alarmTime = new DmsRecordAlarmTime // { // DeviceId = 14, // AlarmBeginTime = DateTime.Now, // AlarmReason = "Plc31短线重连失败", // HandleSuggest = "检查Plc31网络连接", // AlarmRuleId = 4, // ContinueTime = 10000, // CreateBy = "WCS", // CreateTime = DateTime.Now, // }; // var dmsRecordAlarmInfo = CoreMapper.Map(alarmTime); // dmsRecordAlarmInfo.AlarmStatus = "0"; // dmsRecordAlarmInfo.NoticeStatus = "0"; // dbContext.Add(dmsRecordAlarmInfo); // dbContext.SaveChanges(); //} } heartBeatCount = !heartBeatCount; StaticData.PlcDic[1].WriteToPoint(HeartBeat31.plcpointAddress, heartBeatCount, HeartBeat31.plcpointLength?.ToString()); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); SystemData.DeleteWaringLog(dbContext, WaringType.U型线Plc通讯异常); } catch (Exception ex) { if (ex is PlcException) { try { StaticData.PlcDic[1] = new Plc.S7.Plc(StaticData.PlcDic[1].CPU, StaticData.PlcDic[1].IP, StaticData.PlcDic[1].Port, StaticData.PlcDic[1].Rack, StaticData.PlcDic[1].Slot); StaticData.PlcDic[1].Open(); isOver = true; } catch (Exception ex2) { errorCount++; isOver = false; _logger.Error("Plc短线重连失败" + ex2.Message); } } else { _logger.Error(ex.Message + "\n" + ex.StackTrace); } } Thread.Sleep(1000); } } /// /// 定时更新基础设备信息 /// private void BaseEquipLogic() { 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() { while (true) { FiveAgvStatusLogic(); SecondAgvLogic(); ThirdAgvLogic(); SendTrayMessage(); HositerLogic(); CtuLineLogic(); FiveAgvLogic(); FiveBearAgvLogic(); CtuCmdLogic(); UpdatePlcPointValue(); BasePlcPointUpdateLogic(); AgvWaringLogic(); Thread.Sleep(500); } } private void AgvWaringLogic() { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); try { dbContext.Database.BeginTransaction(); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var dmsBaseAlarmRules = StaticData.DmsBaseAlarmRuleList.Where(t => t.DeviceId == -1).ToList(); var wcsAgvStatuses = dbContext.WcsAgvStatus.ToList(); var robotCodes = wcsAgvStatuses.Select(t => long.Parse(t.RobotCode)).ToList(); var dmsRecordAlarmTimes = dbContext.DmsRecordAlarmTime.Where(t => robotCodes.Contains(t.DeviceId)).ToList(); foreach (var agvStatus in wcsAgvStatuses) { var dmsBaseAlarmRule = dmsBaseAlarmRules.Where(t => t.Status.ToString() == agvStatus.Status).FirstOrDefault(); var dmsRecordAlarmTime = dmsRecordAlarmTimes .Where(t => t.DeviceId == int.Parse(agvStatus.RobotCode)).FirstOrDefault(); if (dmsBaseAlarmRule != null) { if (dmsRecordAlarmTime == null) { dmsRecordAlarmTime=new DmsRecordAlarmTime { DeviceId = int.Parse(agvStatus.RobotCode), AlarmBeginTime = DateTime.Now, AlarmReason = dmsBaseAlarmRule.AlarmReason, HandleSuggest = dmsBaseAlarmRule.HandleSuggest, AlarmRuleId = dmsBaseAlarmRule.AlarmRuleId, ContinueTime = dmsBaseAlarmRule.ContinueTime, CreateBy = "WCS", CreateTime = DateTime.Now, }; var dmsRecordAlarmInfo = CoreMapper.Map(dmsRecordAlarmTime); dmsRecordAlarmInfo.NoticeStatus = "0"; dmsRecordAlarmInfo.AlarmStatus = "0"; dbContext.Add(dmsRecordAlarmInfo); dbContext.Add(dmsRecordAlarmTime); dbContext.SaveChanges(); } else { if (dmsRecordAlarmTime.AlarmReason != dmsBaseAlarmRule.AlarmReason) { dbContext.Remove(dmsRecordAlarmTime); dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId) .Update(t => new DmsRecordAlarmInfo { AlarmStatus = "2", AlarmEndTime = DateTime.Now }); var newDmsRecordAlarmTime = new DmsRecordAlarmTime { DeviceId = int.Parse(agvStatus.RobotCode), AlarmBeginTime = DateTime.Now, AlarmReason = dmsBaseAlarmRule.AlarmReason, HandleSuggest = dmsBaseAlarmRule.HandleSuggest, AlarmRuleId = dmsBaseAlarmRule.AlarmRuleId, ContinueTime = dmsBaseAlarmRule.ContinueTime, CreateBy = "WCS", CreateTime = DateTime.Now, }; var dmsRecordAlarmInfo = CoreMapper.Map(newDmsRecordAlarmTime); dmsRecordAlarmInfo.NoticeStatus = "0"; dmsRecordAlarmInfo.AlarmStatus = "0"; dbContext.Add(dmsRecordAlarmInfo); dbContext.Add(newDmsRecordAlarmTime); dbContext.SaveChanges(); } } } else { if (dmsRecordAlarmTime != null) { dbContext.Remove(dmsRecordAlarmTime); dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId) .Update(t => new DmsRecordAlarmInfo { AlarmStatus = "2", AlarmEndTime = DateTime.Now }); dbContext.SaveChanges(); } } } dbContext.Database.CommitTransaction(); } catch { dbContext.Database.RollbackTransaction(); } } /// /// 五楼AGV状态 /// private void FiveAgvStatusLogic() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); var baseEquip = StaticData.BaseEquip.First(t => t.objid == 10); 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") { var AgvCardStatus = reponse.data.First(t => t.RobotCode == "2034"); AgvCardStatus.DateNow = DateTime.Now; dbContext.Update(AgvCardStatus); var BearCardStatus = reponse.data.First(t => t.RobotCode == "6011"); BearCardStatus.DateNow = DateTime.Now; dbContext.Update(BearCardStatus); var CtuCardStatus = reponse.data.First(t => t.RobotCode == "8161"); CtuCardStatus.DateNow = DateTime.Now; dbContext.Update(CtuCardStatus); dbContext.SaveChanges(); } } catch { } } /// /// 获取Plc的值 /// private void BasePlcPointUpdateLogic() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); List plcs = StaticData.PlcDic.Values.ToList(); foreach (var item in StaticData.BasePlcpointList.Where(t => !string.IsNullOrEmpty(t.plcpointAddress))) { if (!string.IsNullOrEmpty(item.plcpointAddress)) { try { if (item.plcpointNo.Contains("RFID")) item.definefield1 = plcs.Where(t => t.IP == item.definefield3).First().ReadRFID(item.plcpointAddress)?.ToString(); else item.definefield1 = plcs.Where(t => t.IP == item.definefield1).First().Read(item.plcpointAddress)?.ToString(); } catch { } } } dbContext.UpdateRange(StaticData.BasePlcpointList.Where(t => !string.IsNullOrEmpty(t.plcpointAddress))); dbContext.SaveChanges(); } catch { } } /// /// 托盘库 /// private void SendTrayMessage() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 40); BasePlcpoint oneInPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "oneIn"); BasePlcpoint oneOutPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "oneOut"); BasePlcpoint someOutPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "someOut"); BasePlcpoint someInPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "someIn"); BasePlc basePlc = StaticData.basePlcs.First(t => t.Name == "托盘库去向"); BasePlc basePlc2 = StaticData.basePlcs.First(t => t.Name == "托盘库数量"); string? value = "0"; if (StaticData.PlcDic[0].Read(oneInPoint.plcpointAddress)?.ToString() == "1") { value = "1"; } else if (StaticData.PlcDic[0].Read(oneOutPoint.plcpointAddress)?.ToString() == "1") { value = "2"; } else if (StaticData.PlcDic[0].Read(someOutPoint.plcpointAddress)?.ToString() == "1") { value = "3"; } else if (StaticData.PlcDic[0].Read(someInPoint.plcpointAddress)?.ToString() == "1") { value = "4"; } StaticData.PlcDic[2].WriteToPoint(basePlc.Address, value, basePlc.type); StaticData.PlcDic[2].WriteToPoint(basePlc2.Address, baseEquip.emptyCount.ToString(), basePlc2.type); } catch { } } /// /// 修改Plc点位信息 /// private void UpdatePlcPointValue() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); foreach (var item in StaticData.basePlcs) { item.Value = StaticData.PlcDic[2].Read(item.Address)?.ToString(); } dbContext.UpdateRange(StaticData.basePlcs); dbContext.SaveChanges(); } catch { } } /// /// 定时更新三楼AGV信息 /// public void ThirdAgvLogic() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); 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") { var cardStatus = reponse.data.First(t => t.RobotCode == "2032"); cardStatus.DateNow = DateTime.Now; dbContext.Update(cardStatus); dbContext.SaveChanges(); var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); StaticData.PlcDic[2].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')); var status = basePlcs.First(t => t.Name.Contains("Status")); if (cardStatus.Online.ToLower() == "true") { StaticData.PlcDic[2].WriteToPoint(status.Address, cardStatus.Status, status.type); } else { StaticData.PlcDic[2].WriteToPoint(status.Address, -1, status.type); } StaticData.PlcDic[2].WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); StaticData.PlcDic[2].WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); #region 经过走廊区域报警 var Agv3FLED = StaticData.BasePlcpointList.First(t => t.id == 76); if (Agv3FLED != null) { if (int.Parse(cardStatus.PosX) >= 53040 && int.Parse(cardStatus.PosX) <= 58090 && (int.Parse(cardStatus.PosY) >= 53520 && int.Parse(cardStatus.PosY) <= 64590)) { //Console.WriteLine("=======>3F走廊区域预警"); StaticData.PlcDic[0].WriteToPoint(Agv3FLED.plcpointAddress, true, Agv3FLED.plcpointLength.ToString()); } else { //Console.WriteLine("3F走廊区域正常"); StaticData.PlcDic[0].WriteToPoint(Agv3FLED.plcpointAddress, false, Agv3FLED.plcpointLength.ToString()); } } #endregion } } catch { } } /// /// 定时更新二楼AGV信息 /// private void SecondAgvLogic() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var baseEquip = StaticData.BaseEquip.First(t => t.objid == 8); 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") { var cardStatus = reponse.data.First(t => t.RobotCode == "2033"); cardStatus.DateNow = DateTime.Now; dbContext.Update(cardStatus); dbContext.SaveChanges(); var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); StaticData.PlcDic[2].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')); var status = basePlcs.First(t => t.Name.Contains("Status")); if (cardStatus.Online.ToLower() == "true") { StaticData.PlcDic[2].WriteToPoint(status.Address, cardStatus.Status, status.type); } else { StaticData.PlcDic[2].WriteToPoint(status.Address, -1, status.type); } StaticData.PlcDic[2].WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); StaticData.PlcDic[2].WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); #region 经过走廊区域报警 var Agv2FLED = StaticData.BasePlcpointList.First(t => t.id == 75); if (Agv2FLED != null) { if (int.Parse(cardStatus.PosX) >= 119000 && int.Parse(cardStatus.PosX) <= 122800 && (int.Parse(cardStatus.PosY) >= 124100 && int.Parse(cardStatus.PosY) <= 134435)) { // Console.WriteLine("=======>2F走廊区域预警"); StaticData.PlcDic[0].WriteToPoint(Agv2FLED.plcpointAddress, true, Agv2FLED.plcpointLength.ToString()); } else { // Console.WriteLine("2F走廊区域正常"); StaticData.PlcDic[0].WriteToPoint(Agv2FLED.plcpointAddress, false, Agv2FLED.plcpointLength.ToString()); } } #endregion } } catch { } } /// /// 定时更新五楼AGV信息 /// private void FiveAgvLogic() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); var baseEquip = StaticData.BaseEquip.First(t => t.objid == 28); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼AGV").ToList(); var wcsCmds = dbContext.WcsTask.Where(t => t.nextPointId == 28).ToList(); if (wcsCmds.Count > 0) { var wcsCmd = wcsCmds.First(); var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First(); StaticData.PlcDic[2].WriteToPoint(endPlc.Address, wcsCmd.nextPointId.ToString(), endPlc.type); var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); StaticData.PlcDic[2].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.taskType).ToPlc; StaticData.PlcDic[2].WriteToPoint(cmdPlc.Address, cmdType, cmdPlc.type); } else { var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First(); StaticData.PlcDic[2].WriteToPoint(endPlc.Address, "0", endPlc.type); var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); StaticData.PlcDic[2].WriteToPoint(startPlc.Address, "0", startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); StaticData.PlcDic[2].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") { var cardStatus = reponse.data.First(t => t.RobotCode == "2034"); var quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); StaticData.PlcDic[2].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')); var status = basePlcs.First(t => t.Name.Contains("Status")); if(cardStatus.Online.ToLower()== "true") { StaticData.PlcDic[2].WriteToPoint(status.Address, cardStatus.Status, status.type); } else { StaticData.PlcDic[2].WriteToPoint(status.Address, -1, status.type); } StaticData.PlcDic[2].WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); StaticData.PlcDic[2].WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼背负式").ToList(); cardStatus = reponse.data.First(t => t.RobotCode == "6011"); quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); StaticData.PlcDic[2].WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); XPlc = basePlcs.First(t => t.Name.Contains('X')); Ylc = basePlcs.First(t => t.Name.Contains('Y')); status = basePlcs.First(t => t.Name.Contains("Status")); if (cardStatus.Online.ToLower() == "true") { StaticData.PlcDic[2].WriteToPoint(status.Address, cardStatus.Status, status.type); } else { StaticData.PlcDic[2].WriteToPoint(status.Address, -1, status.type); } StaticData.PlcDic[2].WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); StaticData.PlcDic[2].WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼CTU").ToList(); cardStatus = reponse.data.First(t => t.RobotCode == "8161"); quantityPlc = basePlcs.First(t => t.Name.Contains("电量")); StaticData.PlcDic[2].WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type); XPlc = basePlcs.First(t => t.Name.Contains("X")); Ylc = basePlcs.First(t => t.Name.Contains("Y")); status = basePlcs.First(t => t.Name.Contains("Status")); if (cardStatus.Online.ToLower() == "true") { StaticData.PlcDic[2].WriteToPoint(status.Address, cardStatus.Status, status.type); } else { StaticData.PlcDic[2].WriteToPoint(status.Address, -1, status.type); } StaticData.PlcDic[2].WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type); StaticData.PlcDic[2].WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type); } } catch { } } /// /// 定时更新五楼背负式AGV信息 /// private void FiveBearAgvLogic() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼背负式").ToList(); var wcsCmds = dbContext.WcsTask.Where(t => t.nextPointId == 10).ToList(); if (wcsCmds.Count > 0) { var wcsCmd = wcsCmds.First(); var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First(); StaticData.PlcDic[2].WriteToPoint(endPlc.Address, wcsCmd.nextPointId.ToString(), endPlc.type); var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); StaticData.PlcDic[2].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.taskType).ToPlc; StaticData.PlcDic[2].WriteToPoint(cmdPlc.Address, cmdType, cmdPlc.type); } else { var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First(); StaticData.PlcDic[2].WriteToPoint(endPlc.Address, "0", endPlc.type); var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); StaticData.PlcDic[2].WriteToPoint(startPlc.Address, "0", startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); StaticData.PlcDic[2].WriteToPoint(cmdPlc.Address, "0", cmdPlc.type); } } catch { } } /// /// 定时更新五楼CTU信息 /// private void CtuCmdLogic() { try { using var scope = host.Services.CreateScope(); using var dbContext = scope.ServiceProvider.GetRequiredService(); 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.WcsTask.Where(t => t.nextPointId == 11).ToList(); if (wcsCmds.Count > 0) { var wcsCmd = wcsCmds.First(); List startList = new List(); List endList = new List(); if (wcsCmd.taskType != 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++) { StaticData.PlcDic[2].WriteToPoint(endPlcs[i].Address, endList[i].ToString(), endPlcs[i].type); } var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); StaticData.PlcDic[2].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.taskType).ToPlc; StaticData.PlcDic[2].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++) { StaticData.PlcDic[2].WriteToPoint(endPlcs[i].Address, "0", endPlcs[i].type); } var startPlc = basePlcs.First(t => t.Name.Contains("起始点")); StaticData.PlcDic[2].WriteToPoint(startPlc.Address, "0", startPlc.type); var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号")); StaticData.PlcDic[2].WriteToPoint(cmdPlc.Address, "0", cmdPlc.type); } } catch { } } /// /// 定时更新五楼U型线信息 /// private void CtuLineLogic() { try { 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 = StaticData.PlcDic[1].ReadRFID(item.a.plcpointAddress); if (!string.IsNullOrEmpty(rfid)) { rfid = rfid[(rfid.IndexOf("C") + 1)..]; StaticData.PlcDic[2].WriteToPoint(item.b.Address, rfid, item.b.type); } else { StaticData.PlcDic[2].WriteToPoint(item.b.Address, "0", item.b.type); } } else { var value = StaticData.PlcDic[1].Read(item.a.plcpointAddress); if (value != null && !string.IsNullOrEmpty(value.ToString())) { StaticData.PlcDic[2].WriteToPoint(item.b.Address, value.ToString(), item.b.type); } else { StaticData.PlcDic[2].WriteToPoint(item.b.Address, "0", item.b.type); } } } } catch { } } /// /// 提升机和接驳位信息同步 /// private void HositerLogic() { try { 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 = StaticData.PlcDic[0].ReadRFID(item.a.plcpointAddress); if (!string.IsNullOrEmpty(rfid)) { rfid = rfid[(rfid.IndexOf("JYHB") + 4)..]; StaticData.PlcDic[2].WriteToPoint(item.b.Address, rfid, item.b.type); } else { StaticData.PlcDic[2].WriteToPoint(item.b.Address, "0", item.b.type); } } else { var value = StaticData.PlcDic[0].Read(item.a.plcpointAddress); if (value != null && !string.IsNullOrEmpty(value.ToString())) { StaticData.PlcDic[2].WriteToPoint(item.b.Address, value.ToString(), item.b.type); } else { StaticData.PlcDic[2].WriteToPoint(item.b.Address, "0", item.b.type); } } } } catch { } } } }