using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Common; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Common.LocationEnum; using SixLabors.ImageSharp; using Autofac.Core; namespace WIDESEAWCS_Tasks { public partial class TSJJob { /// /// 海康继续执行任务 /// /// public void HKConexecutTask(OtherDevice device) { List Uptasks = new List(); //查询所有任务类型为3,4楼的入库任务类型且任务状态为AGV_WaitToExecute的任务 var taskList = _taskService.Repository.QueryData(x => x.TaskState == TaskStatusEnum.AGV_WaitToExecute.ObjToInt()); //任务的目标地址对于站台号; foreach (var task in taskList) { //先检查设备状态 if (device.GetValue(HoistEnum.EquipmentStatus, "TSJ") == 2) { if (task.ExceptionMessage == "提升机设备故障") { continue; } task.ExceptionMessage = "提升机设备故障"; Uptasks.Add(task); continue; //throw new Exception("设备故障"); } if (task.TaskType == TaskTypeEnum.RK3F.ObjToInt() || task.TaskType == TaskTypeEnum.CHUKU1.ObjToInt() || task.TaskType == TaskTypeEnum.F04.ObjToInt()) { if (task.TaskType == TaskTypeEnum.RK3F.ObjToInt()) { //判断3楼入库箱号有无 if (device.GetValue(HoistEnum.OutboundInplace, task.TargetAddress) != 2) { if (task.ExceptionMessage == "3楼入库箱号有货,请先处理") { continue; } task.ExceptionMessage = "3楼入库箱号有货,请先处理"; Uptasks.Add(task); continue; } } else { if (device.GetValue(HoistEnum.ReturnbinAvailable, task.TargetAddress) != 2) { if (task.ExceptionMessage != "4F提升机入口有货") { task.ExceptionMessage = "4F提升机入口有货"; Uptasks.Add(task); } continue; } } //然后调用输送线接口,通知输送线有料箱需要入库,任务举行执行 var result = _taskService.Hikvisiontaskscontinue(task.WMSTaskNum); if (result.Status == false) { if (task.ExceptionMessage != result.Message) { task.ExceptionMessage = result.Message; Uptasks.Add(task); } continue; } task.TaskState = (int)TaskStatusEnum.AGV_ToExecute; task.ExceptionMessage = ""; Uptasks.Add(task); //这里任务变成了CheckPalletCodeing } else if (task.TaskType == TaskTypeEnum.CK3F.ObjToInt() || task.TaskType == TaskTypeEnum.Q1TSJ4.ObjToInt() || task.TaskType == TaskTypeEnum.F03.ObjToInt()) //出库 { ////出库料箱缓存数量(这个是库区查询的时候要查一下,返给wms) //if (device.GetValue(HoistEnum.Outboundmaterialbox, "TSJ") == 0) throw new Exception("没有出库料箱缓存数量为空"); if (task.TaskType == TaskTypeEnum.CK3F.ObjToInt()) { //读取3楼出库料箱到位 if (device.GetValue(HoistEnum.SOutboundmaterialbox, task.SourceAddress) != 1) { if (task.ExceptionMessage != "3楼提升机出口光电反馈无货") { task.ExceptionMessage = "3楼提升机出口光电反馈无货"; Uptasks.Add(task); } continue; } } else { if (device.GetValue(HoistEnum.FOutboundmaterialbox, task.SourceAddress) != 1) { if (task.ExceptionMessage != "4楼提升机出口光电反馈无货") { task.ExceptionMessage = "4楼提升机出口光电反馈无货"; Uptasks.Add(task); } continue; } if (device.GetValue(HoistEnum.ROutScanningCompletionSignal, task.SourceAddress) != 1) { if (task.ExceptionMessage != "4楼提升机出口扫码完成信号没有完成") { task.ExceptionMessage = "4楼提升机出口扫码完成信号没有完成"; Uptasks.Add(task); } continue; } } //然后调用输送线接口,通知输送线有料箱需要入库,任务举行执行 var result = _taskService.Hikvisiontaskscontinue(task.WMSTaskNum); if (result.Status == false) { if (task.ExceptionMessage != result.Message) { task.ExceptionMessage = result.Message; Uptasks.Add(task); } continue; } task.TaskState = (int)TaskStatusEnum.AGV_ToExecute; task.ExceptionMessage = ""; Uptasks.Add(task); } } if (Uptasks.Count > 0) { _taskService.UpdateData(Uptasks); } } /// /// 托盘号确认中 /// /// public void PalletNumConfirmation(OtherDevice device) { #region 托盘号确认中 //查找三楼入库任务状态为CheckPalletCodeing的任务托盘号确认中 var RK3FTask = _taskService.Repository.QueryFirst(x => x.TaskType == TaskTypeEnum.RK3F.ObjToInt() && x.TaskState == (int)TaskStatusEnum.CheckPalletCodeing); if (RK3FTask != null) { if (device.GetValue(HoistEnum.RInScanningCompletionSignal, RK3FTask.TargetAddress) != 1) { RK3FTask.ExceptionMessage = "3楼扫码完成信号没有完成"; _taskService.UpdateData(RK3FTask); } else //完成就把任务状态改成托盘号确认完成 { //检查3楼入库箱号是多少,然后传给wms var BinNumber = device.GetValue(HoistEnum.Inboxnumber, RK3FTask.TargetAddress); if (!string.IsNullOrEmpty(BinNumber)) { BinNumber = BinNumber.TrimEnd('\0').Substring(2); //根据读到的箱号进行料箱检验,检验通过就触发读码器读取,如果不通过就抛出异常 var Verification = _taskService.MaterialBoxInspection(RK3FTask.WMSTaskNum, BinNumber); if (!Verification.Status) { if (RK3FTask.ExceptionMessage != Verification.Message) { RK3FTask.ExceptionMessage = Verification.Message; _taskService.UpdateData(RK3FTask); } } else { //如果质检通过就不改变RK3FTask.TargetAddress的值, if (!string.IsNullOrEmpty(Verification.Message)) { //寻找平库货位 var Location = _stationInfoService.Repository.QueryFirst(x => x.StationRegion == Verification.Message.ObjToInt() && x.StationStatus == (int)LocationStatusEnum.Free && x.FloorNumber == "CC" && x.IsOccupied == (int)LocationStatusEnum.Free); //这里要判断 if (Location == null) { RK3FTask.ExceptionMessage = "$未找到{Verification.Message}区域的货位{Location}"; } RK3FTask.CurrentAddress = RK3FTask.TargetAddress; RK3FTask.NextAddress = Location.StationCode; RK3FTask.TargetAddress = Location.StationCode; _taskService.UpdateData(RK3FTask); } else //成功 { RK3FTask.CurrentAddress = RK3FTask.TargetAddress; _taskService.UpdateData(RK3FTask); } //调用海康进行执行完成接口 var result = _taskService.Hikvisiontaskscontinue(RK3FTask.WMSTaskNum, RK3FTask.NextAddress); if (result.Status) { RK3FTask.ExceptionMessage = ""; RK3FTask.TaskState = (int)TaskStatusEnum.CheckPalletCodeFinish; _taskService.UpdateData(RK3FTask); } else { if (RK3FTask.ExceptionMessage != result.Message) { RK3FTask.ExceptionMessage = result.Message; _taskService.UpdateData(RK3FTask); } } } } } } #endregion } /// /// 4F提升机出口托盘号上报WMS /// /// public void PalletReportingToWMS(OtherDevice device) { #region 4F提升机出口托盘号上报WMS var Address = "TSJC4F"; if (device.GetValue(HoistEnum.ROutScanningCompletionSignal, Address) == 1) { var BinNumber = device.GetValue(HoistEnum.Emptycontainernumber, Address); if (!string.IsNullOrEmpty(BinNumber)) { BinNumber = BinNumber.TrimEnd('\0').Substring(2); _taskService.InboundElevatorExit(Address, BinNumber); } } #endregion } /// /// 提升机报警 /// /// public void TSJAlarm(OtherDevice device) { var alarmPoints = new Dictionary{ { HoistEnum.EquipmentStatus, "设备状态" }, { HoistEnum.R_ElectricDrumA301, "电动滚筒A301报警" }, { HoistEnum.R_ElectricDrumA302, "电动滚筒A302报警" }, { HoistEnum.R_ElectricDrumA303, "电动滚筒A303报警" }, { HoistEnum.R_ElectricDrumA304, "电动滚筒A304报警" }, { HoistEnum.R_ElectricDrumA305, "电动滚筒A305报警" }, { HoistEnum.R_ElectricDrumA306, "电动滚筒A306报警" }, { HoistEnum.R_ElectricDrumA307, "电动滚筒A307报警" }, { HoistEnum.R_ElectricDrumT001, "电动滚筒T001报警" }, { HoistEnum.R_InverterAlarm, "变频器报警" }, { HoistEnum.R_ElectricDrumA401, "电动滚筒A401报警" }, { HoistEnum.R_ElectricDrumA402, "电动滚筒A402报警" }, { HoistEnum.R_ElectricDrumA403, "电动滚筒A403报警" }, { HoistEnum.R_ElectricDrumA404, "电动滚筒A404报警" }, { HoistEnum.R_ElectricDrumA405, "电动滚筒A405报警" }, { HoistEnum.R_ElectricDrumA406, "电动滚筒A406报警" }, { HoistEnum.R_ElectricDrumA407, "电动滚筒A407报警" }, { HoistEnum.R_ElectricDrumT002, "提升机2变频器报警" }, { HoistEnum.R_UpperlimitAlarm1, "上限位报警1" }, { HoistEnum.R_LowerlimitAlarm1, "下限位报警1" }, { HoistEnum.R_UpperlimitAlarm2, "上限位报警2" }, { HoistEnum.R_LowerlimitAlarm2, "下限位报警2" }, { HoistEnum.R_ScancodeError1, "读码器3楼扫码异常" }, { HoistEnum.R_ScancodeError2, "读码器4楼扫码异常" }, { HoistEnum.R_EmergencSytop1, "急停1" }, { HoistEnum.R_EmergencSytop2, "急停2" }, { HoistEnum.R_TSJEmergencSytop1, "提升机急停1" }, { HoistEnum.R_TSJEmergencSytop2, "提升机急停2" }, { HoistEnum.R_DrumAlarmT002, "电滚筒4楼报警T002" }, { HoistEnum.R_TSJSpare1, "备用报警1" }, { HoistEnum.R_TSJSpare2, "备用报警2" } }; var Address = "TSJ"; foreach (var point in alarmPoints) { // 读取PLC值(需要根据实际API调整) bool isAlarming = device.GetValue(point.Key,Address); // 或者 device.ReadBool(point.Key); if (isAlarming) { // 有报警,发送给WMS //SendAlarmToWMS(device, point.Key, point.Value); } } } } }