|
@@ -2,6 +2,7 @@
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
+using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using TFT_DbHelper;
|
|
|
using TFT_Model.Entities;
|
|
@@ -13,11 +14,287 @@ namespace TFT_BizService
|
|
|
/// 系统实时运行 业务类
|
|
|
/// </summary>
|
|
|
[AutoInject(typeof(ISysRealTimeRunService), InjectTypeEnum.Singleton, false)]
|
|
|
- public class SysRealTimeRunService : ISysRealTimeRunService
|
|
|
+ public class SysRealTimeRunService : ISysRealTimeRunService
|
|
|
{
|
|
|
+ private readonly CancellationTokenSource tokenSource = new();
|
|
|
+ private readonly List<Task> taskList = new();
|
|
|
+ public List<BasLoc> BasLocList { get; set; }
|
|
|
+ public List<BasPlcItem> BasPlcItemList { get; set; }
|
|
|
+
|
|
|
+
|
|
|
public SysRealTimeRunService()
|
|
|
{
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ #region 上下料
|
|
|
+ public void LoadFull()
|
|
|
+ {
|
|
|
+ taskList.Add(Task.Factory.StartNew(() =>
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ //从bas_loc表中,查找站台类型为上料机的站台
|
|
|
+ List<BasLoc> basLocs = BasLocList.Where(x => x.LocType == 1).ToList();
|
|
|
+ //遍历所有上料机站台,根据bas_plc_item表中每个站台的上料信号处理是否上料。
|
|
|
+ foreach (BasLoc basLoc_ShangLiaoJi in basLocs)
|
|
|
+ {
|
|
|
+ BasPlcItem basPlcItem = BasPlcItemList.First(x => x.LocNo == basLoc_ShangLiaoJi.LocNo && x.PlcItemCode == PlcItemCode.RequestMoveIn);
|
|
|
+ BasPlcItem _basPlcItem = BasPlcItemList.First(x => x.LocNo == basLoc_ShangLiaoJi.LocNo && x.PlcItemCode == PlcItemCode.MoveInCstFulled);
|
|
|
+ //读取上料信号,basPlcItem && !_basPlcItem
|
|
|
+ bool isUnload = true;//读取PLC
|
|
|
+ //上料信号为true
|
|
|
+ if (isUnload)
|
|
|
+ {
|
|
|
+ //MES在线 条件:状态为初始,添加状态是MES,站台号是上料机站台号
|
|
|
+ MesUnloadCst unloadCst = DbHelper.Db.Queryable<MesUnloadCst>().First(x => x.Status == 0 && x.AddType == 0 && x.LocationNo == basLoc_ShangLiaoJi.LocNo);
|
|
|
+
|
|
|
+ if (unloadCst != null)
|
|
|
+ {
|
|
|
+ //更改MES上料任务状态
|
|
|
+ unloadCst.Status = 11;
|
|
|
+ DbHelper.Db.Updateable(unloadCst).ExecuteCommand();
|
|
|
+ //查找缓存架 (无工单) 有满卡 agv任务id为空 启用
|
|
|
+ BasLoc basLoc_HuanCunJia = BasLocList.First(x => x.LocType == 0
|
|
|
+ //&& string.IsNullOrEmpty(x.WorkOrder)
|
|
|
+ && x.CstType == 2
|
|
|
+ && x.AgvTaskId == null
|
|
|
+ && x.UsedFlag == 1);
|
|
|
+ if (basLoc_HuanCunJia != null)
|
|
|
+ {
|
|
|
+ //生成AGV任务,起点缓存架,终点为上料机
|
|
|
+ //插入biz_agv_task数据
|
|
|
+ BizAgvTask bizAgvTask = new()
|
|
|
+ {
|
|
|
+ TaskType = 0,
|
|
|
+ TakeLocNo = basLoc_HuanCunJia.LocNo,
|
|
|
+ PutLocNo = basLoc_ShangLiaoJi.LocNo,
|
|
|
+ CstType = 1,
|
|
|
+ Status = 0,
|
|
|
+ CreateBy = "admin",
|
|
|
+ CreateTime = DateTime.Now,
|
|
|
+ UpdateBy = "admin",
|
|
|
+ UpdateTime = DateTime.Now,
|
|
|
+ };
|
|
|
+ DbHelper.Db.Insertable(bizAgvTask).ExecuteCommand();
|
|
|
+ //更新上料任务状态
|
|
|
+ unloadCst.Status = 22;
|
|
|
+ DbHelper.Db.Updateable(unloadCst).ExecuteCommand();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }, tokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default));
|
|
|
+ }
|
|
|
+ public void UnloadFull()
|
|
|
+ {
|
|
|
+ taskList.Add(Task.Factory.StartNew(() =>
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ //从bas_loc表中,查找站台类型为下料机的站台
|
|
|
+ List<BasLoc> basLocs = BasLocList.Where(x => x.LocType == 2).ToList();
|
|
|
+ //遍历所有下料机站台,根据bas_plc_item表中每个站台的下料信号处理是否下料。
|
|
|
+ foreach (BasLoc basLoc_XiaLiaoJi in basLocs)
|
|
|
+ {
|
|
|
+ BasPlcItem basPlcItem = BasPlcItemList.First(x => x.LocNo == basLoc_XiaLiaoJi.LocNo && x.PlcItemCode == PlcItemCode.RequestMoveOut);
|
|
|
+ BasPlcItem _basPlcItem = BasPlcItemList.First(x => x.LocNo == basLoc_XiaLiaoJi.LocNo && x.PlcItemCode == PlcItemCode.MoveOutCstFulled);
|
|
|
+ //读取下料信号,basPlcItem && _basPlcItem
|
|
|
+ bool isUnload = true;//读取PLC
|
|
|
+ //下料信号为true
|
|
|
+ if (isUnload)
|
|
|
+ {
|
|
|
+ //MES在线 条件:状态为初始,添加状态是MES,站台号是basLoc站台号
|
|
|
+ MesUnloadCst unloadCst = DbHelper.Db.Queryable<MesUnloadCst>().First(x => x.Status == 0 && x.AddType == 0 && x.LocationNo == basLoc_XiaLiaoJi.LocNo);
|
|
|
+
|
|
|
+ if (unloadCst != null)
|
|
|
+ {
|
|
|
+ //更改MES下料任务状态
|
|
|
+ unloadCst.Status = 11;
|
|
|
+ DbHelper.Db.Updateable(unloadCst).ExecuteCommand();
|
|
|
+ //查找缓存架 无工单 无卡 agv任务id为空
|
|
|
+ BasLoc basLoc_HuanCunJia = BasLocList.First(x => x.LocType == 0
|
|
|
+ && string.IsNullOrEmpty(x.WorkOrder)
|
|
|
+ && x.CstType == 0
|
|
|
+ && x.AgvTaskId == null
|
|
|
+ && x.UsedFlag == 1);
|
|
|
+ if (basLoc_HuanCunJia != null)
|
|
|
+ {
|
|
|
+ //生成AGV任务,起点为下料机,终点为缓存架
|
|
|
+ //插入biz_agv_task数据
|
|
|
+ BizAgvTask bizAgvTask = new()
|
|
|
+ {
|
|
|
+ TaskType = 1,
|
|
|
+ TakeLocNo = basLoc_XiaLiaoJi.LocNo,
|
|
|
+ PutLocNo = basLoc_HuanCunJia.LocNo,
|
|
|
+ CstType = 1,
|
|
|
+ Status = 0,
|
|
|
+ CreateBy = "admin",
|
|
|
+ CreateTime = DateTime.Now,
|
|
|
+ UpdateBy = "admin",
|
|
|
+ UpdateTime = DateTime.Now,
|
|
|
+ };
|
|
|
+ DbHelper.Db.Insertable(bizAgvTask).ExecuteCommand();
|
|
|
+ //更新MES下料任务状态
|
|
|
+ unloadCst.Status = 22;
|
|
|
+ DbHelper.Db.Updateable(unloadCst).ExecuteCommand();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }, tokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default));
|
|
|
+ }
|
|
|
+ public void UnloadEmpty()
|
|
|
+ {
|
|
|
+ taskList.Add(Task.Factory.StartNew(() =>
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ //从bas_loc表中,查找站台类型为上料机的站台
|
|
|
+ List<BasLoc> basLocs = BasLocList.Where(x => x.LocType == 1).ToList();
|
|
|
+ //遍历所有上料机站台,根据bas_plc_item表中每个站台的下料信号处理是否下料。
|
|
|
+ foreach (BasLoc basLoc_ShangLiaoJi in basLocs)
|
|
|
+ {
|
|
|
+ BasPlcItem basPlcItem = BasPlcItemList.First(x => x.LocNo == basLoc_ShangLiaoJi.LocNo && x.PlcItemCode == PlcItemCode.RequestMoveOut);
|
|
|
+ BasPlcItem _basPlcItem = BasPlcItemList.First(x => x.LocNo == basLoc_ShangLiaoJi.LocNo && x.PlcItemCode == PlcItemCode.MoveOutCstFulled);
|
|
|
+ //读取下料信号,basPlcItem && _basPlcItem
|
|
|
+ bool isUnload = true;//读取PLC
|
|
|
+ //下料信号为true
|
|
|
+ if (isUnload)
|
|
|
+ {
|
|
|
+ //MES在线 条件:状态为初始,添加状态是MES,站台号是上料机站台号
|
|
|
+ MesUnloadCst unloadCst = DbHelper.Db.Queryable<MesUnloadCst>().First(x => x.Status == 0 && x.AddType == 0 && x.LocationNo == basLoc_ShangLiaoJi.LocNo);
|
|
|
+
|
|
|
+ if (unloadCst != null)
|
|
|
+ {
|
|
|
+ //更改MES下料任务状态
|
|
|
+ unloadCst.Status = 11;
|
|
|
+ DbHelper.Db.Updateable(unloadCst).ExecuteCommand();
|
|
|
+ //查找缓存架 无工单 无卡 agv任务id为空 启用
|
|
|
+ BasLoc basLoc_HuanCunJia = BasLocList.First(x => x.LocType == 0
|
|
|
+ && string.IsNullOrEmpty(x.WorkOrder)
|
|
|
+ && x.CstType == 0
|
|
|
+ && x.AgvTaskId == null
|
|
|
+ && x.UsedFlag == 1);
|
|
|
+ if (basLoc_HuanCunJia != null)
|
|
|
+ {
|
|
|
+ //生成AGV任务,起点为上料机,终点为缓存架
|
|
|
+ //插入biz_agv_task数据
|
|
|
+ BizAgvTask bizAgvTask = new()
|
|
|
+ {
|
|
|
+ TaskType = 2,
|
|
|
+ TakeLocNo = basLoc_ShangLiaoJi.LocNo,
|
|
|
+ PutLocNo = basLoc_HuanCunJia.LocNo,
|
|
|
+ CstType = 0,
|
|
|
+ Status = 0,
|
|
|
+ CreateBy = "admin",
|
|
|
+ CreateTime = DateTime.Now,
|
|
|
+ UpdateBy = "admin",
|
|
|
+ UpdateTime = DateTime.Now,
|
|
|
+ };
|
|
|
+ DbHelper.Db.Insertable(bizAgvTask).ExecuteCommand();
|
|
|
+ //更新MES下料任务状态
|
|
|
+ unloadCst.Status = 22;
|
|
|
+ DbHelper.Db.Updateable(unloadCst).ExecuteCommand();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }, tokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default));
|
|
|
+ }
|
|
|
+ public void LoadEmpty()
|
|
|
+ {
|
|
|
+ taskList.Add(Task.Factory.StartNew(() =>
|
|
|
+ {
|
|
|
+ while (true)
|
|
|
+ {
|
|
|
+ //从bas_loc表中,查找站台类型为下料机的站台
|
|
|
+ List<BasLoc> basLocs = BasLocList.Where(x => x.LocType == 2).ToList();
|
|
|
+ //遍历所有下料机站台,根据bas_plc_item表中每个站台的上料信号处理是否上料。
|
|
|
+ foreach (BasLoc basLoc_XiaLiaoJi in basLocs)
|
|
|
+ {
|
|
|
+ BasPlcItem basPlcItem = BasPlcItemList.First(x => x.LocNo == basLoc_XiaLiaoJi.LocNo && x.PlcItemCode == PlcItemCode.RequestMoveIn);
|
|
|
+ BasPlcItem _basPlcItem = BasPlcItemList.First(x => x.LocNo == basLoc_XiaLiaoJi.LocNo && x.PlcItemCode == PlcItemCode.MoveInCstFulled);
|
|
|
+ //读取信号,basPlcItem && !_basPlcItem
|
|
|
+ bool isUnload = true;//读取PLC
|
|
|
+ //信号为true
|
|
|
+ if (isUnload)
|
|
|
+ {
|
|
|
+ //MES在线 条件:状态为初始,添加状态是MES,站台号是下料机站台号
|
|
|
+ MesUnloadCst unloadCst = DbHelper.Db.Queryable<MesUnloadCst>().First(x => x.Status == 0 && x.AddType == 0 && x.LocationNo == basLoc_XiaLiaoJi.LocNo);
|
|
|
+
|
|
|
+ if (unloadCst != null)
|
|
|
+ {
|
|
|
+ //更改MES上料任务状态
|
|
|
+ unloadCst.Status = 11;
|
|
|
+ DbHelper.Db.Updateable(unloadCst).ExecuteCommand();
|
|
|
+ //查找缓存架 无工单 有空卡 agv任务id为空 启用
|
|
|
+ BasLoc basLoc_HuanCunJia = BasLocList.First(x => x.LocType == 0
|
|
|
+ && string.IsNullOrEmpty(x.WorkOrder)
|
|
|
+ && x.CstType == 1
|
|
|
+ && x.AgvTaskId == null
|
|
|
+ && x.UsedFlag == 1);
|
|
|
+ if (basLoc_HuanCunJia != null)
|
|
|
+ {
|
|
|
+ //生成AGV任务,起点为缓存架,终点为下料机
|
|
|
+ //插入biz_agv_task数据
|
|
|
+ BizAgvTask bizAgvTask = new()
|
|
|
+ {
|
|
|
+ TaskType = 3,
|
|
|
+ TakeLocNo = basLoc_HuanCunJia.LocNo,
|
|
|
+ PutLocNo = basLoc_XiaLiaoJi.LocNo,
|
|
|
+ CstType = 0,
|
|
|
+ Status = 0,
|
|
|
+ CreateBy = "admin",
|
|
|
+ CreateTime = DateTime.Now,
|
|
|
+ UpdateBy = "admin",
|
|
|
+ UpdateTime = DateTime.Now,
|
|
|
+ };
|
|
|
+ DbHelper.Db.Insertable(bizAgvTask).ExecuteCommand();
|
|
|
+ //更新上料任务状态
|
|
|
+ unloadCst.Status = 22;
|
|
|
+ DbHelper.Db.Updateable(unloadCst).ExecuteCommand();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }, tokenSource.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void TaskRun()
|
|
|
+ {
|
|
|
+ LoadFull();
|
|
|
+ UnloadFull();
|
|
|
+ UnloadEmpty();
|
|
|
+ LoadEmpty();
|
|
|
+ }
|
|
|
+
|
|
|
+ public void TaskStop()
|
|
|
+ {
|
|
|
+ if (taskList.Count > 0)
|
|
|
+ {
|
|
|
+ tokenSource?.Cancel();
|
|
|
+ foreach (Task item in taskList)
|
|
|
+ {
|
|
|
+ while (!item.IsCompleted)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ item.Dispose();
|
|
|
+ }
|
|
|
+ taskList.Clear();
|
|
|
+ tokenSource?.Dispose();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ #endregion
|
|
|
}
|
|
|
}
|