using Admin.Core.IService; using Admin.Core.Model; using Aucma.Core.HwPLc; using log4net; /// /// 灌注数据采集 /// namespace Aucma.Core.Tasks { public class Job_PerfusionTask { private static readonly log4net.ILog log = LogManager.GetLogger(typeof(Job_PerfusionTask)); protected readonly IBaseOrderInfoServices _baseOrderInfoServices; protected readonly IPerfusionDeviceStatusServices _perfusionDeviceStatusServices; protected readonly IPerfusionAlarmServices _perfusionAlarmServices; protected readonly IPerfusionRecordServices _perfusionRecordServices; public Job_PerfusionTask(IPerfusionDeviceStatusServices perfusionDeviceStatusServices, IPerfusionAlarmServices perfusionAlarmServices, IPerfusionRecordServices perfusionRecordServices) { _perfusionDeviceStatusServices = perfusionDeviceStatusServices; _perfusionAlarmServices = perfusionAlarmServices; _perfusionRecordServices = perfusionRecordServices; } public async Task Execute() { await SaveDbRun(); await DeviceStatusRun(); } #region 检测设备状态 private async Task DeviceStatusRun() { var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("PerfusionPlc")); if (obj.plc.IsConnected) { var status = obj.plc.ReadInt32("DB55.46.0");//设备状态;1运行、2停机、3故障 //更新灌注设备状态 var deviceStatus = await _perfusionDeviceStatusServices.FirstAsync(); deviceStatus.PerfusionStatus = status; await _perfusionDeviceStatusServices.UpdateAsync(deviceStatus); } else { log.Error("灌注PLC连接异常!"); } } #endregion #region 保存灌注数据 public async Task SaveDbRun() { string alarmName = string.Empty; var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("PerfusionPlc")); if (obj.plc.IsConnected) { var endSignal = obj.plc.ReadInt16("DB55.44.0");//任务结束信号存盘 /* * 8:正常结束,充注成功 * 4:异常结束,充注不成功 * */ if (endSignal == 8) { try { var barCode = obj.plc.ReadString("DB55.20.0");//箱体条码 var perfusionRecord = await _perfusionRecordServices.FirstAsync(d=>d.PerfusionBoxCode.Equals(barCode)); if (perfusionRecord == null) return; var refrigerantTypeLeft = obj.plc.ReadString("DB55.58.0");//冷媒类型——左侧冷媒型号 var refrigerantTypeRight = obj.plc.ReadString("DB55.68.0");//冷媒类型——右侧冷媒型号 var setVolume = obj.plc.ReadDouble("DB55.78.0");//设定灌注量 var actualVolume = obj.plc.ReadDouble("DB55.0.0");//实际灌注量 var pressureR = obj.plc.ReadDouble("DB55.8.0");//灌注压力——灌注压力_R var pressureL = obj.plc.ReadDouble("DB55.50.0");//灌注压力——灌注压力_L var duration = obj.plc.ReadInt16("DB55.12.0");//灌注时长 var system = obj.plc.ReadInt32("DB55.82.0");//0,右系统 1,左系统 Perfusion_Record record = new Perfusion_Record(); record.PerfusionBoxCode = barCode; record.PerfusionRefrigerantTypeLeft = refrigerantTypeLeft; record.PerfusionRefrigerantTypeRight = refrigerantTypeRight; record.PerfusionSetVolume = setVolume.ToString(); record.PerfusionActualVolume = actualVolume.ToString(); record.PerfusionR = pressureR.ToString(); record.PerfusionL = pressureL.ToString(); record.PerfusionDuration = duration.ToString(); record.PerfusionSystem = system.ToString(); var r = await _perfusionRecordServices.AddAsync(record); if (r > 0) { //数据采集完成设为2 obj.plc.WriteInt32("DB55.44.0", 2);//应答字:1数据采集,2存盘成功 } else { log.Error($"存盘数据失败,箱体码[{barCode}]"); } } catch (Exception ex) { log.Error(ex.Message); } } /* *2:充注枪真空不合格 *4:充注故障 *8:充注时真空度超限定 *16:回升检测不合格 *32:工件真空不合格 *64:平衡缸接近开关异常 *128:增压超时 *256:风压不足 * */ if (endSignal == 4) { try { var barCode = obj.plc.ReadString("DB55.20.0");//箱体条码 var perfusionAlarm = await _perfusionAlarmServices.FirstAsync(d => d.PerfusionBoxcode.Equals(barCode)); if (perfusionAlarm != null) return; var alarm = obj.plc.ReadInt32("DB55.48.0"); //保存到异常任务表中,通知返修检测 switch (alarm) { case 0: alarmName = "充注枪真空不合格"; break; case 4: alarmName = "充注故障"; break; case 8: alarmName = "充注时真空度超限定"; break; case 16: alarmName = "回升检测不合格"; break; case 32: alarmName = "工件真空不合格"; break; case 64: alarmName = "平衡缸接近开关异常"; break; case 128: alarmName = "增压超时"; break; case 256: alarmName = "风压不足"; break; default: break; } Perfusion_Alarm alarm1 = new Perfusion_Alarm(); alarm1.PerfusionBoxcode = barCode; alarm1.PerfusionStatus = (short)alarm; alarm1.PerfusionAlarm = alarmName; alarm1.PerfusionCompleted = "1";//异常取消 await _perfusionAlarmServices.AddAsync(alarm1); } catch (Exception ex) { log.Error(ex.Message); } } } } #endregion } }