|
|
|
|
|
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 Masuit.Tools.Logging;
|
|
|
|
|
|
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()
|
|
|
|
|
|
{
|
|
|
|
|
|
var messageSynchronousThread = new Thread(MessageSynchronousLogic)
|
|
|
|
|
|
{
|
|
|
|
|
|
IsBackground = true
|
|
|
|
|
|
};
|
|
|
|
|
|
messageSynchronousThread.Start();
|
|
|
|
|
|
|
|
|
|
|
|
//var baseEquipThread = new Thread(BaseEquipLogic)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// IsBackground = true
|
|
|
|
|
|
//};
|
|
|
|
|
|
//baseEquipThread.Start();
|
|
|
|
|
|
|
|
|
|
|
|
//var PlcHeartBeat30Thread = new Thread(PlcHeartBeat30Logic)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// IsBackground = true
|
|
|
|
|
|
//};
|
|
|
|
|
|
//PlcHeartBeat30Thread.Start();
|
|
|
|
|
|
|
|
|
|
|
|
//var PlcHeartBeat31Thread = new Thread(PlcHeartBeat31Logic)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// IsBackground = true
|
|
|
|
|
|
//};
|
|
|
|
|
|
//PlcHeartBeat31Thread.Start();
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
LogManager.Error(ex);
|
|
|
|
|
|
}
|
|
|
|
|
|
Thread.Sleep(1000);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时发送心跳包
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="obj"></param>
|
|
|
|
|
|
private void PlcHeartBeat31Logic(object? obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
BasePlcpoint HeartBeat31 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "HeartBeat31");
|
|
|
|
|
|
int heartBeatCount = 0;
|
|
|
|
|
|
while (true)
|
|
|
|
|
|
{
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时更新基础设备信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="obj"></param>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时同步消息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="obj"></param>
|
|
|
|
|
|
private void MessageSynchronousLogic(object? obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
while (true)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
using var scope = host.Services.CreateScope();
|
|
|
|
|
|
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
|
|
|
|
|
|
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
|
|
|
|
|
|
HositerLogic();
|
|
|
|
|
|
//CtuLineLogic();
|
|
|
|
|
|
ThirdAgvLogic(dbContext);
|
|
|
|
|
|
FiveAgvLogic(dbContext);
|
|
|
|
|
|
FiveBearAgvLogic(dbContext);
|
|
|
|
|
|
CtuCmdLogic(dbContext);
|
|
|
|
|
|
SecondAgvLogic(dbContext);
|
|
|
|
|
|
SendTrayMessage(dbContext);
|
|
|
|
|
|
UpdatePlcPointValue(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(1000);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void SendTrayMessage(DefaultDbContext dbContext)
|
|
|
|
|
|
{
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void UpdatePlcPointValue(DefaultDbContext dbContext)
|
|
|
|
|
|
{
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var item in StaticData.basePlcs)
|
|
|
|
|
|
{
|
|
|
|
|
|
item.Value = StaticData.PlcDic[2].Read(item.Address)?.ToString();
|
|
|
|
|
|
}
|
|
|
|
|
|
dbContext.UpdateRange(StaticData.basePlcs);
|
|
|
|
|
|
dbContext.SaveChanges();
|
|
|
|
|
|
}
|
|
|
|
|
|
catch
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时更新三楼AGV信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dbContext"></param>
|
|
|
|
|
|
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<AgvStatusDto>(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("电量"));
|
|
|
|
|
|
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.PosY.ToString(), XPlc.type);
|
|
|
|
|
|
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.PosY.ToString(), Ylc.type);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时更新二楼AGV信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dbContext"></param>
|
|
|
|
|
|
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<AgvStatusDto>(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("电量"));
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时更新五楼AGV信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dbContext"></param>
|
|
|
|
|
|
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<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")
|
|
|
|
|
|
{
|
|
|
|
|
|
var cardStatus = reponse.data.First(t => t.RobotCode == "2034");
|
|
|
|
|
|
cardStatus.DateNow = DateTime.Now;
|
|
|
|
|
|
dbContext.Update(cardStatus);
|
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼背负式").ToList();
|
|
|
|
|
|
cardStatus = reponse.data.First(t => t.RobotCode == "6011");
|
|
|
|
|
|
cardStatus.DateNow = DateTime.Now;
|
|
|
|
|
|
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);
|
|
|
|
|
|
dbContext.Update(cardStatus);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼CTU").ToList();
|
|
|
|
|
|
cardStatus = reponse.data.First(t => t.RobotCode == "8161");
|
|
|
|
|
|
cardStatus.DateNow = DateTime.Now;
|
|
|
|
|
|
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);
|
|
|
|
|
|
dbContext.Update(cardStatus);
|
|
|
|
|
|
dbContext.SaveChanges();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时更新五楼背负式AGV信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dbContext"></param>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时更新五楼CTU信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="dbContext"></param>
|
|
|
|
|
|
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<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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 定时更新五楼U型线信息
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|