using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using Quartz; using SixLabors.ImageSharp; using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.StationEnum; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Communicator; using WIDESEAWCS_DTO.PDA; using WIDESEAWCS_IBasicInfoRepository; using WIDESEAWCS_IBasicInfoService; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_Tasks.TaskAcquisition; namespace WIDESEAWCS_Tasks { /// /// 任务获取 后底板1 的任务 /// /// [DisallowConcurrentExecution] public class TaskAcquisition_Back1_Job : JobBase, IJob { private readonly ITaskRepository _taskRepository; private readonly ITaskService _taskService; private readonly ISys_ConfigService _sys_ConfigService; private readonly IDt_StationManagerRepository _stationManagerRepository; private readonly IDt_MaterialInfoRepository _IDt_MaterialInfoRepository; public TaskAcquisition_Back1_Job(ITaskRepository taskRepository, ITaskService taskService, ISys_ConfigService configService, IDt_StationManagerRepository stationManagerRepository, IDt_MaterialInfoRepository IDt_MaterialInfoRepository) { _taskRepository = taskRepository; _taskService = taskService; _sys_ConfigService = configService; _stationManagerRepository = stationManagerRepository; _IDt_MaterialInfoRepository = IDt_MaterialInfoRepository; } public Task Execute(IJobExecutionContext context) { bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (flag && value != null) { OtherDevice device = (OtherDevice)value; if (!device.IsConnected) { return Task.CompletedTask; } //string ip = "127.0.0.1"; //int port = 502; //string Region = "后底板1"; //ModbusTcp modbusTcp = new ModbusTcp(ip, port, Region); //modbusTcp.Connect(); Baseconversion baseconversion = new Baseconversion(); Dictionary Signal = new Dictionary() { [10] = 2, [30] = 3, [50] = 4, [70] = 5 }; Dictionary FeedingPoint = new Dictionary() { [10] = 2001, [30] = 2002, [50] = 2003, [70] = 2004 }; // 叫料的点位 终点位置 try { for (int i = 10; i < 90; i += 20) { byte[] SignalNumber = device.Communicator.Read(Signal[i].ToString(), 1); // 信号 1:叫料 2:拉出空框 Dt_StationManager dt_StationManager = _stationManagerRepository.QueryFirst( x => x.StationLocation == FeedingPoint[i].ToString() && x.StationStatus != ((int)StationEnum.Disable).ToString()); if (dt_StationManager == null) { // 这里应该要加日志 记录找不到站台的信息 Console.WriteLine($"{DateTime.Now} 当前站台【{FeedingPoint[i].ToString()} 未配置或已禁用】"); continue; } if (SignalNumber[1] == 1) { byte[] PartNumber = device.Communicator.Read(i.ToString(), 20); // 读取零件号 string Ku1_Value = baseconversion.TenthTurn16(PartNumber); if (Ku1_Value != "" && Ku1_Value != null) { // 等功能测试完,这里要做日志记录 Console.WriteLine(Ku1_Value); // 找对应的零件号是否已经绑定(组盘) // 这里要改要加区域 加是否已生成任务 还要根据时间排序 先绑定的先发过去 Dt_MaterialInfo? dt_MaterialInfo = _IDt_MaterialInfoRepository.QueryData(x => x.MaterialName == Ku1_Value && x.Region == ((int)StationEnum.Rearbaseplate1).ToString() && (x.EndPosition == null || x.EndPosition == "")).OrderBy(x => x.CreateDate).FirstOrDefault(); if (dt_MaterialInfo != null) { Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.PalletCode == dt_MaterialInfo.ContainerCode); if (dt_Task != null) continue; //证明有当前任务 dt_Task = new Dt_Task(); dt_Task.PalletCode = dt_MaterialInfo.ContainerCode; dt_Task.SourceAddress = dt_MaterialInfo.Position; // 当前位置 dt_Task.TargetAddress = FeedingPoint[i].ToString(); // 终点位置 dt_Task.Grade = 2; dt_Task.TaskState = TaskAGVCarryStatusEnum.AGV_CarryNew.ObjToInt(); dt_Task.TaskType = TaskAGVCarryTypeEnum.Carry.ObjToInt(); dt_Task.Roadway = (Signal[i] - 1).ToString(); // 库1 叫料那就是1巷道 dt_Task.CurrentAddress = dt_MaterialInfo.Position; // 当前位置 dt_Task.NextAddress = FeedingPoint[i].ToString(); // 终点位置 dt_MaterialInfo.EndPosition = FeedingPoint[i].ToString(); // 终点位置 dt_StationManager.StationStatus = ((int)StationEnum.Thereisatask).ToString(); dt_StationManager.StationRemark = dt_MaterialInfo.ContainerCode; _stationManagerRepository.UpdateData(dt_StationManager); _taskRepository.AddData(dt_Task); _IDt_MaterialInfoRepository.UpdateData(dt_MaterialInfo); } // 如果没绑定则不生成任务 如果查找到对应的零件号绑定了 则生成一条任务数据 } } if (SignalNumber[1] == 2) // 表示拉出空框 { Dt_Task dt_Task = _taskRepository.QueryFirst(x => x.SourceAddress == FeedingPoint[i].ToString() && x.TaskType == (int)TaskAGVCarryTypeEnum.CarryEmpty); if (dt_Task != null) continue; Dt_StationManager RecyclingpointStation = _stationManagerRepository.QueryFirst(x => x.StationStatus == ((int)StationEnum.Enable).ToString() && x.StationArea == ((int)StationEnum.Rearbaseplate1).ToString() && x.Remark == "回收点"); if (RecyclingpointStation == null) { // 记录错误日志 continue; } dt_Task = new Dt_Task(); dt_Task.PalletCode = dt_StationManager.StationRemark; dt_Task.SourceAddress = FeedingPoint[i].ToString(); dt_Task.TargetAddress = RecyclingpointStation.StationLocation; dt_Task.Grade = 2; dt_Task.TaskState = TaskAGVCarryStatusEnum.AGV_CarryNew.ObjToInt(); dt_Task.TaskType = TaskAGVCarryTypeEnum.CarryEmpty.ObjToInt(); dt_Task.Roadway = (Signal[i] - 1).ToString(); // 库1 叫料那就是1巷道 dt_Task.CurrentAddress = FeedingPoint[i].ToString(); // 当前位置 dt_Task.NextAddress = RecyclingpointStation.StationLocation;// 终点位置 RecyclingpointStation.StationStatus = ((int)StationEnum.Thereisatask).ToString(); _stationManagerRepository.UpdateData(RecyclingpointStation); _taskRepository.AddData(dt_Task); } } } catch (Exception) { throw; } } // 16进制转成10进制 // 2. 16进制 → 转回十进制(你要的功能) //ulong decimalResult = Convert.ToUInt64("123", 16); //Console.WriteLine("16进制转回十进制:" + decimalResult); //// 写入 //bool flag2 = modbusTcp.Write("30", decimalResult.ToString()); //modbusTcp.Disconnect(); //Console.WriteLine("进入了TaskAcquisition_Back1_Job"); return Task.CompletedTask; } } }