You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

597 lines
26 KiB
C#

2 years ago
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools;
2 years ago
using Masuit.Tools.Logging;
2 years ago
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
namespace Khd.Core.Wcs.Wcs
{
public class SystemTimer
{
private readonly IHost host;
private Plc.S7.Plc Plc30 = StaticData.PlcDic[0];
1 year ago
private Plc.S7.Plc Plc31 = StaticData.PlcDic[1];
2 years ago
private Plc.S7.Plc Plc220 = StaticData.PlcDic[2];
2 years ago
2 years ago
public SystemTimer(IHost host)
{
this.host = host;
}
public void Start()
{
2 years ago
var messageSynchronousThread = new Thread(MessageSynchronousLogic)
{
IsBackground = true
};
1 year ago
messageSynchronousThread.Start();//陈工设备信息推送
2 years ago
1 year ago
var PlcHeartBeat30Thread = new Thread(PlcHeartBeat30Logic)
{
IsBackground = true
};
PlcHeartBeat30Thread.Start();//脉冲
2 years ago
1 year ago
var PlcHeartBeat31Thread = new Thread(PlcHeartBeat31Logic)
{
IsBackground = true
};
1 year ago
PlcHeartBeat31Thread.Start();//脉冲
2 years ago
Console.WriteLine($"{DateTime.Now}: SystemTimer started");
}
/// <summary>
/// 定时发送心跳包
/// </summary>
/// <param name="obj"></param>
private void PlcHeartBeat30Logic(object? obj)
{
BasePlcpoint HeartBeat30 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "HeartBeat30");
int heartBeatCount = 0;
while (true)
{
try
{
if (heartBeatCount == 0)
{
heartBeatCount = 1;
}
else
{
heartBeatCount = 0;
}
StaticData.PlcDic[0].WriteToPoint(HeartBeat30.plcpointAddress, heartBeatCount.ToString(), HeartBeat30.plcpointType?.ToString());
}
catch (Exception ex)
{
if (ex is PlcException)
{
try
{
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
{
1 year ago
//报警
2 years ago
}
}
LogManager.Error(ex);
}
Thread.Sleep(1000);
}
}
/// <summary>
/// 定时发送心跳包
/// </summary>
/// <param name="obj"></param>
private void PlcHeartBeat31Logic(object? obj)
{
1 year ago
BasePlcpoint HeartBeat31 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTUHeart");
2 years ago
int heartBeatCount = 0;
1 year ago
while (true)
2 years ago
{
try
{
if (heartBeatCount == 0)
{
heartBeatCount = 1;
}
else
{
heartBeatCount = 0;
}
StaticData.PlcDic[1].WriteToPoint(HeartBeat31.plcpointAddress, heartBeatCount.ToString(), HeartBeat31.plcpointType?.ToString());
}
catch (Exception ex)
{
if (ex is PlcException)
{
try
{
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
{
}
}
LogManager.Error(ex);
}
Thread.Sleep(1000);
}
2 years ago
}
2 years ago
/// <summary>
/// 定时更新基础设备信息
/// </summary>
/// <param name="obj"></param>
2 years ago
private void BaseEquipLogic(object? obj)
{
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
List<BaseEquip> 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);
}
}
2 years ago
/// <summary>
/// 定时同步消息
/// </summary>
/// <param name="obj"></param>
2 years ago
private void MessageSynchronousLogic(object? obj)
{
1 year ago
2 years ago
while (true)
2 years ago
{
try
{
2 years ago
HositerLogic();
1 year ago
CtuLineLogic();
1 year ago
ThirdAgvLogic();
FiveAgvLogic();
FiveBearAgvLogic();
CtuCmdLogic();
SecondAgvLogic();
1 year ago
SendTrayMessage();
1 year ago
UpdatePlcPointValue();
2 years ago
}
catch (Exception ex)
{
try
2 years ago
{
2 years ago
if (ex is PlcException)
2 years ago
{
2 years ago
foreach (var item in StaticData.PlcDic)
2 years ago
{
2 years ago
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();
}
2 years ago
}
}
}
2 years ago
catch
{
2 years ago
2 years ago
}
2 years ago
}
1 year ago
Thread.Sleep(1000);
}
}
1 year ago
private void SendTrayMessage()
1 year ago
{
1 year ago
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
1 year ago
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";
2 years ago
}
1 year ago
StaticData.PlcDic[2].WriteToPoint(basePlc.Address, value, basePlc.type);
StaticData.PlcDic[2].WriteToPoint(basePlc2.Address, baseEquip.emptyCount.ToString(), basePlc2.type);
2 years ago
}
1 year ago
private void UpdatePlcPointValue()
1 year ago
{
try
{
1 year ago
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
1 year ago
foreach (var item in StaticData.basePlcs)
{
item.Value = StaticData.PlcDic[2].Read(item.Address)?.ToString();
}
dbContext.UpdateRange(StaticData.basePlcs);
dbContext.SaveChanges();
}
catch
{
}
}
2 years ago
/// <summary>
/// 定时更新三楼AGV信息
/// </summary>
/// <param name="dbContext"></param>
1 year ago
private void ThirdAgvLogic()
2 years ago
{
1 year ago
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
2 years ago
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<AgvStatusDto>(result);
if (reponse != null && reponse.code == "0")
{
1 year ago
var cardStatus = reponse.data.First(t => t.RobotCode == "2032");
cardStatus.DateNow = DateTime.Now;
dbContext.Update(cardStatus);
dbContext.SaveChanges();
2 years ago
var quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
1 year ago
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type);
2 years ago
var XPlc = basePlcs.First(t => t.Name.Contains('X'));
var Ylc = basePlcs.First(t => t.Name.Contains('Y'));
1 year ago
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosY.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type);
2 years ago
}
}
2 years ago
/// <summary>
/// 定时更新二楼AGV信息
/// </summary>
/// <param name="dbContext"></param>
1 year ago
private void SecondAgvLogic()
2 years ago
{
1 year ago
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
2 years ago
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<AgvStatusDto>(result);
if (reponse != null && reponse.code == "0")
{
1 year ago
var cardStatus = reponse.data.First(t => t.RobotCode == "2033");
cardStatus.DateNow = DateTime.Now;
dbContext.Update(cardStatus);
dbContext.SaveChanges();
2 years ago
var quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
1 year ago
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type);
2 years ago
var XPlc = basePlcs.First(t => t.Name.Contains('X'));
var Ylc = basePlcs.First(t => t.Name.Contains('Y'));
1 year ago
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type);
2 years ago
}
}
2 years ago
/// <summary>
/// 定时更新五楼AGV信息
/// </summary>
/// <param name="dbContext"></param>
1 year ago
private void FiveAgvLogic()
2 years ago
{
1 year ago
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
2 years ago
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<int?> type = new List<int?>() { 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<AgvStatusDto>(result);
if (reponse != null && reponse.code == "0")
{
1 year ago
var cardStatus = reponse.data.First(t => t.RobotCode == "2034");
cardStatus.DateNow = DateTime.Now;
dbContext.Update(cardStatus);
2 years ago
var quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
1 year ago
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type);
2 years ago
var XPlc = basePlcs.First(t => t.Name.Contains('X'));
var Ylc = basePlcs.First(t => t.Name.Contains('Y'));
1 year ago
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type);
2 years ago
1 year ago
basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼背负式").ToList();
1 year ago
cardStatus = reponse.data.First(t => t.RobotCode == "6011");
cardStatus.DateNow = DateTime.Now;
2 years ago
quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
1 year ago
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type);
2 years ago
XPlc = basePlcs.First(t => t.Name.Contains('X'));
Ylc = basePlcs.First(t => t.Name.Contains('Y'));
1 year ago
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type);
dbContext.Update(cardStatus);
2 years ago
1 year ago
basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼CTU").ToList();
cardStatus = reponse.data.First(t => t.RobotCode == "8161");
cardStatus.DateNow = DateTime.Now;
2 years ago
quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
1 year ago
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.Battery, quantityPlc.type);
2 years ago
XPlc = basePlcs.First(t => t.Name.Contains("X"));
Ylc = basePlcs.First(t => t.Name.Contains("Y"));
1 year ago
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.PosX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type);
dbContext.Update(cardStatus);
dbContext.SaveChanges();
2 years ago
}
}
2 years ago
/// <summary>
/// 定时更新五楼背负式AGV信息
/// </summary>
/// <param name="dbContext"></param>
1 year ago
private void FiveBearAgvLogic()
2 years ago
{
1 year ago
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
2 years ago
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);
}
}
2 years ago
/// <summary>
/// 定时更新五楼CTU信息
/// </summary>
/// <param name="dbContext"></param>
1 year ago
private void CtuCmdLogic()
2 years ago
{
1 year ago
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
2 years ago
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<long?> startList = new List<long?>();
List<long?> endList = new List<long?>();
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);
}
}
2 years ago
/// <summary>
/// 定时更新五楼U型线信息
/// </summary>
2 years ago
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);
}
}
}
}
/// <summary>
/// 提升机和接驳位信息同步
/// </summary>
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);
}
}
}
}
}
}